Fix mysensors notify platform (#47517)

This commit is contained in:
Martin Hjelmare 2021-03-06 18:33:55 +01:00 committed by GitHub
parent e9052233a6
commit 1600207f5c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 42 additions and 15 deletions

View file

@ -1,5 +1,6 @@
"""Connect to a MySensors gateway via pymysensors API.""" """Connect to a MySensors gateway via pymysensors API."""
import asyncio import asyncio
from functools import partial
import logging import logging
from typing import Callable, Dict, List, Optional, Tuple, Type, Union from typing import Callable, Dict, List, Optional, Tuple, Type, Union
@ -8,10 +9,13 @@ import voluptuous as vol
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components.mqtt import valid_publish_topic, valid_subscribe_topic from homeassistant.components.mqtt import valid_publish_topic, valid_subscribe_topic
from homeassistant.components.notify import DOMAIN as NOTIFY_DOMAIN
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_OPTIMISTIC from homeassistant.const import CONF_OPTIMISTIC
from homeassistant.core import callback from homeassistant.core import HomeAssistant, callback
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.discovery import async_load_platform
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.typing import ConfigType, HomeAssistantType from homeassistant.helpers.typing import ConfigType, HomeAssistantType
from .const import ( from .const import (
@ -28,6 +32,7 @@ from .const import (
CONF_TOPIC_OUT_PREFIX, CONF_TOPIC_OUT_PREFIX,
CONF_VERSION, CONF_VERSION,
DOMAIN, DOMAIN,
MYSENSORS_DISCOVERY,
MYSENSORS_GATEWAYS, MYSENSORS_GATEWAYS,
MYSENSORS_ON_UNLOAD, MYSENSORS_ON_UNLOAD,
PLATFORMS_WITH_ENTRY_SUPPORT, PLATFORMS_WITH_ENTRY_SUPPORT,
@ -43,6 +48,8 @@ _LOGGER = logging.getLogger(__name__)
CONF_DEBUG = "debug" CONF_DEBUG = "debug"
CONF_NODE_NAME = "name" CONF_NODE_NAME = "name"
DATA_HASS_CONFIG = "hass_config"
DEFAULT_BAUD_RATE = 115200 DEFAULT_BAUD_RATE = 115200
DEFAULT_TCP_PORT = 5003 DEFAULT_TCP_PORT = 5003
DEFAULT_VERSION = "1.4" DEFAULT_VERSION = "1.4"
@ -134,6 +141,8 @@ CONFIG_SCHEMA = vol.Schema(
async def async_setup(hass: HomeAssistantType, config: ConfigType) -> bool: async def async_setup(hass: HomeAssistantType, config: ConfigType) -> bool:
"""Set up the MySensors component.""" """Set up the MySensors component."""
hass.data[DOMAIN] = {DATA_HASS_CONFIG: config}
if DOMAIN not in config or bool(hass.config_entries.async_entries(DOMAIN)): if DOMAIN not in config or bool(hass.config_entries.async_entries(DOMAIN)):
return True return True
@ -181,14 +190,31 @@ async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry) -> bool
_LOGGER.error("Gateway setup failed for %s", entry.data) _LOGGER.error("Gateway setup failed for %s", entry.data)
return False return False
if DOMAIN not in hass.data:
hass.data[DOMAIN] = {}
if MYSENSORS_GATEWAYS not in hass.data[DOMAIN]: if MYSENSORS_GATEWAYS not in hass.data[DOMAIN]:
hass.data[DOMAIN][MYSENSORS_GATEWAYS] = {} hass.data[DOMAIN][MYSENSORS_GATEWAYS] = {}
hass.data[DOMAIN][MYSENSORS_GATEWAYS][entry.entry_id] = gateway hass.data[DOMAIN][MYSENSORS_GATEWAYS][entry.entry_id] = gateway
async def finish(): # Connect notify discovery as that integration doesn't support entry forwarding.
load_notify_platform = partial(
async_load_platform,
hass,
NOTIFY_DOMAIN,
DOMAIN,
hass_config=hass.data[DOMAIN][DATA_HASS_CONFIG],
)
await on_unload(
hass,
entry.entry_id,
async_dispatcher_connect(
hass,
MYSENSORS_DISCOVERY.format(entry.entry_id, NOTIFY_DOMAIN),
load_notify_platform,
),
)
async def finish() -> None:
await asyncio.gather( await asyncio.gather(
*[ *[
hass.config_entries.async_forward_entry_setup(entry, platform) hass.config_entries.async_forward_entry_setup(entry, platform)
@ -248,14 +274,14 @@ async def on_unload(
@callback @callback
def setup_mysensors_platform( def setup_mysensors_platform(
hass, hass: HomeAssistant,
domain: str, # hass platform name domain: str, # hass platform name
discovery_info: Optional[Dict[str, List[DevId]]], discovery_info: Dict[str, List[DevId]],
device_class: Union[Type[MySensorsDevice], Dict[SensorType, Type[MySensorsEntity]]], device_class: Union[Type[MySensorsDevice], Dict[SensorType, Type[MySensorsEntity]]],
device_args: Optional[ device_args: Optional[
Tuple Tuple
] = None, # extra arguments that will be given to the entity constructor ] = None, # extra arguments that will be given to the entity constructor
async_add_entities: Callable = None, async_add_entities: Optional[Callable] = None,
) -> Optional[List[MySensorsDevice]]: ) -> Optional[List[MySensorsDevice]]:
"""Set up a MySensors platform. """Set up a MySensors platform.
@ -264,11 +290,6 @@ def setup_mysensors_platform(
The function is also given a class. The function is also given a class.
A new instance of the class is created for every device id, and the device id is given to the constructor of the class A new instance of the class is created for every device id, and the device id is given to the constructor of the class
""" """
# Only act if called via MySensors by discovery event.
# Otherwise gateway is not set up.
if not discovery_info:
_LOGGER.debug("Skipping setup due to no discovery info")
return None
if device_args is None: if device_args is None:
device_args = () device_args = ()
new_devices: List[MySensorsDevice] = [] new_devices: List[MySensorsDevice] = []

View file

@ -12,6 +12,9 @@ async def async_setup_scanner(
hass: HomeAssistantType, config, async_see, discovery_info=None hass: HomeAssistantType, config, async_see, discovery_info=None
): ):
"""Set up the MySensors device scanner.""" """Set up the MySensors device scanner."""
if not discovery_info:
return False
new_devices = mysensors.setup_mysensors_platform( new_devices = mysensors.setup_mysensors_platform(
hass, hass,
DOMAIN, DOMAIN,

View file

@ -9,7 +9,7 @@ from mysensors.sensor import ChildSensor
import voluptuous as vol import voluptuous as vol
from homeassistant.const import CONF_NAME from homeassistant.const import CONF_NAME
from homeassistant.core import callback from homeassistant.core import HomeAssistant, callback
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.dispatcher import async_dispatcher_send
from homeassistant.util.decorator import Registry from homeassistant.util.decorator import Registry
@ -33,7 +33,7 @@ SCHEMAS = Registry()
@callback @callback
def discover_mysensors_platform( def discover_mysensors_platform(
hass, gateway_id: GatewayId, platform: str, new_devices: List[DevId] hass: HomeAssistant, gateway_id: GatewayId, platform: str, new_devices: List[DevId]
) -> None: ) -> None:
"""Discover a MySensors platform.""" """Discover a MySensors platform."""
_LOGGER.debug("Discovering platform %s with devIds: %s", platform, new_devices) _LOGGER.debug("Discovering platform %s with devIds: %s", platform, new_devices)

View file

@ -5,6 +5,9 @@ from homeassistant.components.notify import ATTR_TARGET, DOMAIN, BaseNotificatio
async def async_get_service(hass, config, discovery_info=None): async def async_get_service(hass, config, discovery_info=None):
"""Get the MySensors notification service.""" """Get the MySensors notification service."""
if not discovery_info:
return None
new_devices = mysensors.setup_mysensors_platform( new_devices = mysensors.setup_mysensors_platform(
hass, DOMAIN, discovery_info, MySensorsNotificationDevice hass, DOMAIN, discovery_info, MySensorsNotificationDevice
) )