* Fix webhook registration * Only load camera platform with valid scope * Add initial data handler and netatmo base class * Update camera to use data handler * Update init * Parallelize API calls * Remove cruft * Minor tweaks * Refactor data handler * Update climate to use data handler * Fix pylint error * Fix climate update not getting fresh data * Update climate data * update to pyatmo 4.0.0 * Refactor for pyatmo 4.0.0 * Exclude from coverage until tests are written * Fix typo * Reduce parallel calls * Add heating request attr * Async get_entities * Undo parallel updates * Fix camera issue * Introduce individual scan interval per device class * Some cleanup * Add basic webhook support for climate to improve responsiveness * Replace ClimateDevice by ClimateEntity * Add support for turning camera on/off * Update camera state upon webhook events * Guard data class registration with lock * Capture errors * Add light platform * Add dis-/connect handling * Fix set schedule service * Remove extra calls * Add service to set person(s) home/away * Add service descriptions * Improve service descriptions * Use LightEntity instead of Light * Add guard if no data is retrieved * Make services entity based * Only raise platform not ready if there is a NOC * Register webhook even during runtime * Fix turning off event * Fix linter error * Fix linter error * Exclude light platform from coverage * Change log level * Refactor public weather sensor to use data handler * Prevent too short coordinates * Ignore modules without _id * Code cleanup * Fix test * Exit early if no home data is retrieved * Prevent discovery if already active * Add services to (un-)register webhook * Fix tests * Not actually a coroutine * Move methods to base class * Address pylint comment * Address pylint complaints * Address comments * Address more comments * Add docstring * Use single instance allowed * Extract method * Remove cruft * Write state directly * Fix test * Add file to coverage * Move nested function * Move nested function * Update docstring * Clean up code * Fix webhook bug * Clean up listeners * Use deque * Clean up prints * Update homeassistant/components/netatmo/sensor.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netatmo/sensor.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netatmo/sensor.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netatmo/sensor.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netatmo/sensor.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netatmo/sensor.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netatmo/camera.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netatmo/camera.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netatmo/camera.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netatmo/camera.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netatmo/camera.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update homeassistant/components/netatmo/camera.py Co-authored-by: J. Nick Koston <nick@koston.org> * Rename data_class variable * Break when match * Extract method * Extract methods * Rename variable * Improve comment * Some refinements * Extra * Extract method * Simplify code * Improve reability * Code simplification * Simplify code * Simplify code * Code cleanup * Fix import * Clean up * Clean up magic strings * Replace data_class_name with CAMERA_DATA_CLASS_NAME * Replace data_class_name with CAMERA_DATA_CLASS_NAME * Replace data_class_name with HOMEDATA_DATA_CLASS_NAME * Replace data_class_name in public weather sensor * Clean up * Remove deprecated config options * Schedule immediate update on camera reconnect * Use UUID to clearly identify public weather areas * Use subscription mode * Move clean up of temporary data classes * Delay data class removal * Fix linter complaints * Adjust test * Only setup lights if webhook are registered * Prevent crash with old config entries * Don't cache home ids * Remove stale code * Fix coordinates if entered mixed up by the user * Move nested function * Add test case for swapped coordinates * Only wait for discovery entries * Only use what I need * Bring stuff closer to where it's used * Auto clean up setup data classes * Code cleanup * Remove unneccessary lock * Update homeassistant/components/netatmo/sensor.py Co-authored-by: J. Nick Koston <nick@koston.org> * Update tests/components/netatmo/test_config_flow.py Co-authored-by: J. Nick Koston <nick@koston.org> * Clean up dead code * Fix formating * Extend coverage * Extend coverage Co-authored-by: J. Nick Koston <nick@koston.org>
73 lines
2 KiB
Python
73 lines
2 KiB
Python
"""The Netatmo integration."""
|
|
import logging
|
|
|
|
from homeassistant.core import callback
|
|
|
|
from .const import (
|
|
ATTR_EVENT_TYPE,
|
|
ATTR_FACE_URL,
|
|
ATTR_ID,
|
|
ATTR_IS_KNOWN,
|
|
ATTR_NAME,
|
|
ATTR_PERSONS,
|
|
DATA_PERSONS,
|
|
DEFAULT_PERSON,
|
|
DOMAIN,
|
|
NETATMO_EVENT,
|
|
)
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
EVENT_TYPE_MAP = {
|
|
"outdoor": "",
|
|
"therm_mode": "",
|
|
}
|
|
|
|
|
|
async def handle_webhook(hass, webhook_id, request):
|
|
"""Handle webhook callback."""
|
|
try:
|
|
data = await request.json()
|
|
except ValueError as err:
|
|
_LOGGER.error("Error in data: %s", err)
|
|
return None
|
|
|
|
_LOGGER.debug("Got webhook data: %s", data)
|
|
|
|
event_type = data.get(ATTR_EVENT_TYPE)
|
|
|
|
if event_type in ["outdoor", "therm_mode"]:
|
|
hass.bus.async_fire(
|
|
event_type=NETATMO_EVENT, event_data={"type": event_type, "data": data}
|
|
)
|
|
for event_data in data.get(EVENT_TYPE_MAP[event_type], []):
|
|
async_evaluate_event(hass, event_data)
|
|
|
|
else:
|
|
async_evaluate_event(hass, data)
|
|
|
|
|
|
@callback
|
|
def async_evaluate_event(hass, event_data):
|
|
"""Evaluate events from webhook."""
|
|
event_type = event_data.get(ATTR_EVENT_TYPE)
|
|
|
|
if event_type == "person":
|
|
for person in event_data.get(ATTR_PERSONS):
|
|
person_event_data = dict(event_data)
|
|
person_event_data[ATTR_ID] = person.get(ATTR_ID)
|
|
person_event_data[ATTR_NAME] = hass.data[DOMAIN][DATA_PERSONS].get(
|
|
person_event_data[ATTR_ID], DEFAULT_PERSON
|
|
)
|
|
person_event_data[ATTR_IS_KNOWN] = person.get(ATTR_IS_KNOWN)
|
|
person_event_data[ATTR_FACE_URL] = person.get(ATTR_FACE_URL)
|
|
hass.bus.async_fire(
|
|
event_type=NETATMO_EVENT,
|
|
event_data={"type": event_type, "data": person_event_data},
|
|
)
|
|
else:
|
|
_LOGGER.debug("%s: %s", event_type, event_data)
|
|
hass.bus.async_fire(
|
|
event_type=NETATMO_EVENT,
|
|
event_data={"type": event_type, "data": event_data},
|
|
)
|