1 """Support for zestimate data from zillow.com."""
3 from __future__
import annotations
5 from datetime
import timedelta
9 import voluptuous
as vol
13 PLATFORM_SCHEMA
as SENSOR_PLATFORM_SCHEMA,
22 _LOGGER = logging.getLogger(__name__)
23 _RESOURCE =
"http://www.zillow.com/webservice/GetZestimate.htm"
27 DEFAULT_NAME =
"Zestimate"
29 ZESTIMATE = f
"{DEFAULT_NAME}:{NAME}"
32 ATTR_AMOUNT =
"amount"
33 ATTR_CHANGE =
"amount_change_30_days"
34 ATTR_CURRENCY =
"amount_currency"
35 ATTR_LAST_UPDATED =
"amount_last_updated"
36 ATTR_VAL_HI =
"valuation_range_high"
37 ATTR_VAL_LOW =
"valuation_range_low"
39 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
41 vol.Required(CONF_API_KEY): cv.string,
42 vol.Required(CONF_ZPID): vol.All(cv.ensure_list, [cv.string]),
43 vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
54 add_entities: AddEntitiesCallback,
55 discovery_info: DiscoveryInfoType |
None =
None,
57 """Set up the Zestimate sensor."""
58 name = config.get(CONF_NAME)
59 properties = config[CONF_ZPID]
62 for zpid
in properties:
63 params = {
"zws-id": config[CONF_API_KEY]}
70 """Implementation of a Zestimate sensor."""
72 _attr_attribution =
"Data provided by Zillow.com"
73 _attr_icon =
"mdi:home-variant"
76 """Initialize the sensor."""
85 """Return the ZPID."""
86 return self.
paramsparams[
"zpid"]
90 """Return the name of the sensor."""
91 return f
"{self._name} {self.address}"
95 """Return the state of the sensor."""
103 """Return the state attributes."""
105 if self.
datadata
is not None:
106 attributes = self.
datadata
107 attributes[
"address"] = self.
addressaddress
111 """Get the latest data and update the states."""
114 response = requests.get(_RESOURCE, params=self.
paramsparams, timeout=5)
115 data = response.content.decode(
"utf-8")
116 data_dict = xmltodict.parse(data).
get(ZESTIMATE)
117 error_code =
int(data_dict[
"message"][
"code"])
119 _LOGGER.error(
"The API returned: %s", data_dict[
"message"][
"text"])
121 except requests.exceptions.ConnectionError:
122 _LOGGER.error(
"Unable to retrieve data from %s", _RESOURCE)
124 data = data_dict[
"response"][NAME]
126 if "amount" in data
and data[
"amount"]
is not None:
127 details[ATTR_AMOUNT] = data[
"amount"][
"#text"]
128 details[ATTR_CURRENCY] = data[
"amount"][
"@currency"]
129 if "last-updated" in data
and data[
"last-updated"]
is not None:
130 details[ATTR_LAST_UPDATED] = data[
"last-updated"]
131 if "valueChange" in data
and data[
"valueChange"]
is not None:
132 details[ATTR_CHANGE] =
int(data[
"valueChange"][
"#text"])
133 if "valuationRange" in data
and data[
"valuationRange"]
is not None:
134 details[ATTR_VAL_HI] =
int(data[
"valuationRange"][
"high"][
"#text"])
135 details[ATTR_VAL_LOW] =
int(data[
"valuationRange"][
"low"][
"#text"])
136 self.
addressaddress = data_dict[
"response"][
"address"][
"street"]
137 self.
datadata = details
138 if self.
datadata
is not None:
139 self.
_state_state = self.
datadata[ATTR_AMOUNT]
142 _LOGGER.error(
"Unable to parase Zestimate data from response")
def extra_state_attributes(self)
def __init__(self, name, params)
web.Response get(self, web.Request request, str config_key)
def add_entities(account, async_add_entities, tracked)
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)