1 """Weather data coordinator for the HKO API."""
3 from asyncio
import timeout
4 from datetime
import timedelta
8 from aiohttp
import ClientSession
9 from hko
import HKO, HKOError
12 ATTR_CONDITION_CLOUDY,
15 ATTR_CONDITION_LIGHTNING_RAINY,
16 ATTR_CONDITION_PARTLYCLOUDY,
17 ATTR_CONDITION_POURING,
20 ATTR_CONDITION_SNOWY_RAINY,
23 ATTR_CONDITION_WINDY_VARIANT,
24 ATTR_FORECAST_CONDITION,
26 ATTR_FORECAST_TEMP_LOW,
38 API_FORECAST_MAX_TEMP,
39 API_FORECAST_MIN_TEMP,
48 WEATHER_INFO_AT_TIMES_AT_FIRST,
53 WEATHER_INFO_INTERVAL,
54 WEATHER_INFO_ISOLATED,
56 WEATHER_INFO_OVERCAST,
62 WEATHER_INFO_THUNDERSTORM,
66 _LOGGER = logging.getLogger(__name__)
70 """HKO Update Coordinator."""
73 self, hass: HomeAssistant, session: ClientSession, district: str, location: str
75 """Update data via library."""
78 self.
hkohko = HKO(session)
88 """Update data via HKO library."""
90 async
with timeout(60):
91 rhrread = await self.
hkohko.weather(
"rhrread")
92 fnd = await self.
hkohko.weather(
"fnd")
93 except HKOError
as error:
98 self.
_convert_forecast_convert_forecast(item)
for item
in fnd[API_WEATHER_FORECAST]
103 """Return temperature and humidity in the appropriate format."""
105 API_HUMIDITY: data[API_HUMIDITY][API_DATA][0][API_VALUE],
106 API_TEMPERATURE: next(
109 for item
in data[API_TEMPERATURE][API_DATA]
110 if item[API_PLACE] == self.
locationlocation
117 """Return daily forecast in the appropriate format."""
118 date = data[API_FORECAST_DATE]
121 data[API_FORECAST_ICON], data[API_FORECAST_WEATHER]
123 ATTR_FORECAST_TEMP: data[API_FORECAST_MAX_TEMP][API_VALUE],
124 ATTR_FORECAST_TEMP_LOW: data[API_FORECAST_MIN_TEMP][API_VALUE],
125 ATTR_FORECAST_TIME: f
"{date[0:4]}-{date[4:6]}-{date[6:8]}T00:00:00+08:00",
129 """Return the condition corresponding to an icon code."""
130 for condition, codes
in ICON_CONDITION_MAP.items():
131 if icon_code
in codes:
136 """Return the condition corresponding to the weather info."""
138 if WEATHER_INFO_RAIN
in info:
139 return ATTR_CONDITION_HAIL
140 if WEATHER_INFO_SNOW
in info
and WEATHER_INFO_RAIN
in info:
141 return ATTR_CONDITION_SNOWY_RAINY
142 if WEATHER_INFO_SNOW
in info:
143 return ATTR_CONDITION_SNOWY
144 if WEATHER_INFO_FOG
in info
or WEATHER_INFO_MIST
in info:
145 return ATTR_CONDITION_FOG
146 if WEATHER_INFO_WIND
in info
and WEATHER_INFO_CLOUD
in info:
147 return ATTR_CONDITION_WINDY_VARIANT
148 if WEATHER_INFO_WIND
in info:
149 return ATTR_CONDITION_WINDY
150 if WEATHER_INFO_THUNDERSTORM
in info
and WEATHER_INFO_ISOLATED
not in info:
151 return ATTR_CONDITION_LIGHTNING_RAINY
154 WEATHER_INFO_RAIN
in info
155 or WEATHER_INFO_SHOWER
in info
156 or WEATHER_INFO_THUNDERSTORM
in info
158 and WEATHER_INFO_HEAVY
in info
159 and WEATHER_INFO_SUNNY
not in info
160 and WEATHER_INFO_FINE
not in info
161 and WEATHER_INFO_AT_TIMES_AT_FIRST
not in info
163 return ATTR_CONDITION_POURING
166 WEATHER_INFO_RAIN
in info
167 or WEATHER_INFO_SHOWER
in info
168 or WEATHER_INFO_THUNDERSTORM
in info
170 and WEATHER_INFO_SUNNY
not in info
171 and WEATHER_INFO_FINE
not in info
173 return ATTR_CONDITION_RAINY
174 if (WEATHER_INFO_CLOUD
in info
or WEATHER_INFO_OVERCAST
in info)
and not (
175 WEATHER_INFO_INTERVAL
in info
or WEATHER_INFO_PERIOD
in info
177 return ATTR_CONDITION_CLOUDY
178 if (WEATHER_INFO_SUNNY
in info)
and (
179 WEATHER_INFO_INTERVAL
in info
or WEATHER_INFO_PERIOD
in info
181 return ATTR_CONDITION_PARTLYCLOUDY
183 WEATHER_INFO_SUNNY
in info
or WEATHER_INFO_FINE
in info
184 )
and WEATHER_INFO_SHOWER
not in info:
185 return ATTR_CONDITION_SUNNY
186 return ATTR_CONDITION_PARTLYCLOUDY
dict[str, Any] _async_update_data(self)
str _convert_info_condition(self, str info)
str _convert_icon_condition(self, int icon_code, str info)
dict[str, Any] _convert_forecast(self, dict[str, Any] data)
None __init__(self, HomeAssistant hass, ClientSession session, str district, str location)
dict[str, Any] _convert_current(self, dict[str, Any] data)