Clean mysensors update callbacks (#84629)
This commit is contained in:
parent
eae8154753
commit
6c32337c8e
9 changed files with 65 additions and 47 deletions
|
@ -181,5 +181,5 @@ def setup_mysensors_platform(
|
|||
if new_devices:
|
||||
_LOGGER.info("Adding new devices: %s", new_devices)
|
||||
if async_add_entities is not None:
|
||||
async_add_entities(new_devices, True)
|
||||
async_add_entities(new_devices)
|
||||
return new_devices
|
||||
|
|
|
@ -12,7 +12,7 @@ from homeassistant.components.climate import (
|
|||
)
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.const import ATTR_TEMPERATURE, Platform, UnitOfTemperature
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||
from homeassistant.util.unit_system import METRIC_SYSTEM
|
||||
|
@ -213,7 +213,8 @@ class MySensorsHVAC(mysensors.device.MySensorsEntity, ClimateEntity):
|
|||
self._values[self.value_type] = hvac_mode
|
||||
self.async_write_ha_state()
|
||||
|
||||
async def async_update(self) -> None:
|
||||
@callback
|
||||
def _async_update(self) -> None:
|
||||
"""Update the controller with the latest value from a sensor."""
|
||||
await super().async_update()
|
||||
super()._async_update()
|
||||
self._values[self.value_type] = DICT_MYS_TO_HA[self._values[self.value_type]]
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
"""Handle MySensors devices."""
|
||||
from __future__ import annotations
|
||||
|
||||
from functools import partial
|
||||
from abc import ABC, abstractmethod
|
||||
import logging
|
||||
from typing import Any
|
||||
|
||||
|
@ -34,7 +34,7 @@ ATTR_HEARTBEAT = "heartbeat"
|
|||
MYSENSORS_PLATFORM_DEVICES = "mysensors_devices_{}"
|
||||
|
||||
|
||||
class MySensorsDevice:
|
||||
class MySensorsDevice(ABC):
|
||||
"""Representation of a MySensors device."""
|
||||
|
||||
hass: HomeAssistant
|
||||
|
@ -151,7 +151,8 @@ class MySensorsDevice:
|
|||
|
||||
return attr
|
||||
|
||||
async def async_update(self) -> None:
|
||||
@callback
|
||||
def _async_update(self) -> None:
|
||||
"""Update the controller with the latest value from a sensor."""
|
||||
node = self.gateway.sensors[self.node_id]
|
||||
child = node.children[self.child_id]
|
||||
|
@ -178,9 +179,10 @@ class MySensorsDevice:
|
|||
else:
|
||||
self._values[value_type] = value
|
||||
|
||||
async def _async_update_callback(self) -> None:
|
||||
@callback
|
||||
@abstractmethod
|
||||
def _async_update_callback(self) -> None:
|
||||
"""Update the device."""
|
||||
raise NotImplementedError
|
||||
|
||||
@callback
|
||||
def async_update_callback(self) -> None:
|
||||
|
@ -188,18 +190,18 @@ class MySensorsDevice:
|
|||
if self._update_scheduled:
|
||||
return
|
||||
|
||||
async def update() -> None:
|
||||
@callback
|
||||
def async_update() -> None:
|
||||
"""Perform update."""
|
||||
try:
|
||||
await self._async_update_callback()
|
||||
self._async_update_callback()
|
||||
except Exception: # pylint: disable=broad-except
|
||||
_LOGGER.exception("Error updating %s", self.name)
|
||||
finally:
|
||||
self._update_scheduled = False
|
||||
|
||||
self._update_scheduled = True
|
||||
delayed_update = partial(self.hass.async_create_task, update())
|
||||
self.hass.loop.call_later(UPDATE_DELAY, delayed_update)
|
||||
self.hass.loop.call_later(UPDATE_DELAY, async_update)
|
||||
|
||||
|
||||
def get_mysensors_devices(
|
||||
|
@ -235,9 +237,11 @@ class MySensorsEntity(MySensorsDevice, Entity):
|
|||
|
||||
return attr
|
||||
|
||||
async def _async_update_callback(self) -> None:
|
||||
@callback
|
||||
def _async_update_callback(self) -> None:
|
||||
"""Update the entity."""
|
||||
await self.async_update_ha_state(True)
|
||||
self._async_update()
|
||||
self.async_write_ha_state()
|
||||
|
||||
async def async_added_to_hass(self) -> None:
|
||||
"""Register update callback."""
|
||||
|
@ -255,3 +259,4 @@ class MySensorsEntity(MySensorsDevice, Entity):
|
|||
self.async_update_callback,
|
||||
)
|
||||
)
|
||||
self._async_update()
|
||||
|
|
|
@ -5,7 +5,7 @@ from typing import Any, cast
|
|||
|
||||
from homeassistant.components.device_tracker import AsyncSeeCallback
|
||||
from homeassistant.const import Platform
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
|
||||
from homeassistant.util import slugify
|
||||
|
@ -74,18 +74,21 @@ class MySensorsDeviceScanner(mysensors.device.MySensorsDevice):
|
|||
self.async_see = async_see
|
||||
self.hass = hass
|
||||
|
||||
async def _async_update_callback(self) -> None:
|
||||
@callback
|
||||
def _async_update_callback(self) -> None:
|
||||
"""Update the device."""
|
||||
await self.async_update()
|
||||
self._async_update()
|
||||
node = self.gateway.sensors[self.node_id]
|
||||
child = node.children[self.child_id]
|
||||
position = child.values[self.value_type]
|
||||
latitude, longitude, _ = position.split(",")
|
||||
|
||||
await self.async_see(
|
||||
dev_id=slugify(self.name),
|
||||
host_name=self.name,
|
||||
gps=(latitude, longitude),
|
||||
battery=node.battery_level,
|
||||
attributes=self._extra_attributes,
|
||||
self.hass.async_create_task(
|
||||
self.async_see(
|
||||
dev_id=slugify(self.name),
|
||||
host_name=self.name,
|
||||
gps=(latitude, longitude),
|
||||
battery=node.battery_level,
|
||||
attributes=self._extra_attributes,
|
||||
)
|
||||
)
|
||||
|
|
|
@ -329,6 +329,6 @@ def _gw_callback_factory(
|
|||
if msg_handler is None:
|
||||
return
|
||||
|
||||
hass.async_create_task(msg_handler(hass, gateway_id, msg))
|
||||
msg_handler(hass, gateway_id, msg)
|
||||
|
||||
return mysensors_callback
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
"""Handle MySensors messages."""
|
||||
from __future__ import annotations
|
||||
|
||||
from collections.abc import Callable, Coroutine
|
||||
from typing import Any
|
||||
from collections.abc import Callable
|
||||
|
||||
from mysensors import Message
|
||||
|
||||
|
@ -16,30 +15,31 @@ from .device import get_mysensors_devices
|
|||
from .helpers import discover_mysensors_platform, validate_set_msg
|
||||
|
||||
HANDLERS: decorator.Registry[
|
||||
str, Callable[[HomeAssistant, GatewayId, Message], Coroutine[Any, Any, None]]
|
||||
str, Callable[[HomeAssistant, GatewayId, Message], None]
|
||||
] = decorator.Registry()
|
||||
|
||||
|
||||
@HANDLERS.register("set")
|
||||
async def handle_set(hass: HomeAssistant, gateway_id: GatewayId, msg: Message) -> None:
|
||||
@callback
|
||||
def handle_set(hass: HomeAssistant, gateway_id: GatewayId, msg: Message) -> None:
|
||||
"""Handle a mysensors set message."""
|
||||
validated = validate_set_msg(gateway_id, msg)
|
||||
_handle_child_update(hass, gateway_id, validated)
|
||||
|
||||
|
||||
@HANDLERS.register("internal")
|
||||
async def handle_internal(
|
||||
hass: HomeAssistant, gateway_id: GatewayId, msg: Message
|
||||
) -> None:
|
||||
@callback
|
||||
def handle_internal(hass: HomeAssistant, gateway_id: GatewayId, msg: Message) -> None:
|
||||
"""Handle a mysensors internal message."""
|
||||
internal = msg.gateway.const.Internal(msg.sub_type)
|
||||
if (handler := HANDLERS.get(internal.name)) is None:
|
||||
return
|
||||
await handler(hass, gateway_id, msg)
|
||||
handler(hass, gateway_id, msg)
|
||||
|
||||
|
||||
@HANDLERS.register("I_BATTERY_LEVEL")
|
||||
async def handle_battery_level(
|
||||
@callback
|
||||
def handle_battery_level(
|
||||
hass: HomeAssistant, gateway_id: GatewayId, msg: Message
|
||||
) -> None:
|
||||
"""Handle an internal battery level message."""
|
||||
|
@ -47,15 +47,15 @@ async def handle_battery_level(
|
|||
|
||||
|
||||
@HANDLERS.register("I_HEARTBEAT_RESPONSE")
|
||||
async def handle_heartbeat(
|
||||
hass: HomeAssistant, gateway_id: GatewayId, msg: Message
|
||||
) -> None:
|
||||
@callback
|
||||
def handle_heartbeat(hass: HomeAssistant, gateway_id: GatewayId, msg: Message) -> None:
|
||||
"""Handle an heartbeat."""
|
||||
_handle_node_update(hass, gateway_id, msg)
|
||||
|
||||
|
||||
@HANDLERS.register("I_SKETCH_NAME")
|
||||
async def handle_sketch_name(
|
||||
@callback
|
||||
def handle_sketch_name(
|
||||
hass: HomeAssistant, gateway_id: GatewayId, msg: Message
|
||||
) -> None:
|
||||
"""Handle an internal sketch name message."""
|
||||
|
@ -63,7 +63,8 @@ async def handle_sketch_name(
|
|||
|
||||
|
||||
@HANDLERS.register("I_SKETCH_VERSION")
|
||||
async def handle_sketch_version(
|
||||
@callback
|
||||
def handle_sketch_version(
|
||||
hass: HomeAssistant, gateway_id: GatewayId, msg: Message
|
||||
) -> None:
|
||||
"""Handle an internal sketch version message."""
|
||||
|
|
|
@ -144,9 +144,10 @@ class MySensorsLightDimmer(MySensorsLight):
|
|||
if self.assumed_state:
|
||||
self.async_write_ha_state()
|
||||
|
||||
async def async_update(self) -> None:
|
||||
@callback
|
||||
def _async_update(self) -> None:
|
||||
"""Update the controller with the latest value from a sensor."""
|
||||
await super().async_update()
|
||||
super()._async_update()
|
||||
self._async_update_light()
|
||||
self._async_update_dimmer()
|
||||
|
||||
|
@ -181,9 +182,10 @@ class MySensorsLightRGB(MySensorsLight):
|
|||
self._attr_rgb_color = new_rgb
|
||||
self._values[self.value_type] = hex_color
|
||||
|
||||
async def async_update(self) -> None:
|
||||
@callback
|
||||
def _async_update(self) -> None:
|
||||
"""Update the controller with the latest value from a sensor."""
|
||||
await super().async_update()
|
||||
super()._async_update()
|
||||
self._async_update_light()
|
||||
self._async_update_dimmer()
|
||||
self._async_update_rgb_or_w()
|
||||
|
|
|
@ -5,7 +5,7 @@ from typing import Any, cast
|
|||
|
||||
from homeassistant.components.notify import ATTR_TARGET, BaseNotificationService
|
||||
from homeassistant.const import Platform
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
|
||||
|
||||
from .. import mysensors
|
||||
|
@ -35,6 +35,11 @@ async def async_get_service(
|
|||
class MySensorsNotificationDevice(mysensors.device.MySensorsDevice):
|
||||
"""Represent a MySensors Notification device."""
|
||||
|
||||
@callback
|
||||
def _async_update_callback(self) -> None:
|
||||
"""Update the device."""
|
||||
self._async_update()
|
||||
|
||||
def send_msg(self, msg: str) -> None:
|
||||
"""Send a message."""
|
||||
for sub_msg in [msg[i : i + 25] for i in range(0, len(msg), 25)]:
|
||||
|
|
|
@ -8,7 +8,7 @@ import voluptuous as vol
|
|||
from homeassistant.components.switch import SwitchEntity
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_ON, Platform
|
||||
from homeassistant.core import HomeAssistant, ServiceCall
|
||||
from homeassistant.core import HomeAssistant, ServiceCall, callback
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||
|
@ -178,7 +178,8 @@ class MySensorsIRSwitch(MySensorsSwitch):
|
|||
self._values[set_req.V_LIGHT] = STATE_OFF
|
||||
self.async_write_ha_state()
|
||||
|
||||
async def async_update(self) -> None:
|
||||
@callback
|
||||
def _async_update(self) -> None:
|
||||
"""Update the controller with the latest value from a sensor."""
|
||||
await super().async_update()
|
||||
super()._async_update()
|
||||
self._ir_code = self._values.get(self.value_type)
|
||||
|
|
Loading…
Add table
Reference in a new issue