core/homeassistant/components/mysensors/gateway.py

353 lines
11 KiB
Python
Raw Normal View History

"""Handle MySensors gateways."""
2021-03-18 12:07:04 +00:00
from __future__ import annotations
import asyncio
from collections import defaultdict
from collections.abc import Coroutine
import logging
import socket
import sys
from typing import Any, Callable
import async_timeout
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
from mysensors import BaseAsyncGateway, Message, Sensor, mysensors
import voluptuous as vol
from homeassistant.components.mqtt import DOMAIN as MQTT_DOMAIN
2021-06-07 14:04:04 +00:00
from homeassistant.components.mqtt.models import (
Message as MQTTMessage,
PublishPayloadType,
)
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EVENT_HOMEASSISTANT_STOP
from homeassistant.core import Event, HomeAssistant, callback
import homeassistant.helpers.config_validation as cv
from .const import (
2019-07-31 19:25:30 +00:00
CONF_BAUD_RATE,
CONF_DEVICE,
CONF_GATEWAY_TYPE,
CONF_GATEWAY_TYPE_MQTT,
CONF_GATEWAY_TYPE_SERIAL,
2019-07-31 19:25:30 +00:00
CONF_PERSISTENCE_FILE,
CONF_RETAIN,
CONF_TCP_PORT,
CONF_TOPIC_IN_PREFIX,
CONF_TOPIC_OUT_PREFIX,
CONF_VERSION,
DOMAIN,
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
MYSENSORS_GATEWAY_START_TASK,
2019-07-31 19:25:30 +00:00
MYSENSORS_GATEWAYS,
ConfGatewayType,
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
GatewayId,
2019-07-31 19:25:30 +00:00
)
from .handler import HANDLERS
2021-03-07 13:20:21 +00:00
from .helpers import (
discover_mysensors_platform,
on_unload,
validate_child,
validate_node,
)
_LOGGER = logging.getLogger(__name__)
GATEWAY_READY_TIMEOUT = 20.0
2019-07-31 19:25:30 +00:00
MQTT_COMPONENT = "mqtt"
2021-06-07 14:04:04 +00:00
def is_serial_port(value: str) -> str:
"""Validate that value is a windows serial port or a unix device."""
2019-07-31 19:25:30 +00:00
if sys.platform.startswith("win"):
ports = (f"COM{idx + 1}" for idx in range(256))
if value in ports:
return value
raise vol.Invalid(f"{value} is not a serial port")
return cv.isdevice(value)
2021-06-07 14:04:04 +00:00
def is_socket_address(value: str) -> str:
"""Validate that value is a valid address."""
try:
socket.getaddrinfo(value, None)
return value
except OSError as err:
raise vol.Invalid("Device is not a valid domain name or ip address") from err
async def try_connect(
hass: HomeAssistant, gateway_type: ConfGatewayType, user_input: dict[str, Any]
) -> bool:
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
"""Try to connect to a gateway and report if it worked."""
if gateway_type == "MQTT":
return True # Do not validate MQTT, as that does not use connection made.
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
try:
gateway_ready = asyncio.Event()
def on_conn_made(_: BaseAsyncGateway) -> None:
gateway_ready.set()
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
2021-03-18 12:07:04 +00:00
gateway: BaseAsyncGateway | None = await _get_gateway(
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
hass,
gateway_type,
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
device=user_input[CONF_DEVICE],
version=user_input[CONF_VERSION],
event_callback=lambda _: None,
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
persistence_file=None,
baud_rate=user_input.get(CONF_BAUD_RATE),
tcp_port=user_input.get(CONF_TCP_PORT),
topic_in_prefix=None,
topic_out_prefix=None,
retain=False,
persistence=False,
)
if gateway is None:
return False
gateway.on_conn_made = on_conn_made
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
connect_task = None
try:
connect_task = asyncio.create_task(gateway.start())
with async_timeout.timeout(GATEWAY_READY_TIMEOUT):
await gateway_ready.wait()
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
return True
except asyncio.TimeoutError:
_LOGGER.info("Try gateway connect failed with timeout")
return False
finally:
if connect_task is not None and not connect_task.done():
connect_task.cancel()
asyncio.create_task(gateway.stop())
except OSError as err:
_LOGGER.info("Try gateway connect failed with exception", exc_info=err)
return False
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
def get_mysensors_gateway(
hass: HomeAssistant, gateway_id: GatewayId
2021-03-18 12:07:04 +00:00
) -> BaseAsyncGateway | None:
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
"""Return the Gateway for a given GatewayId."""
if MYSENSORS_GATEWAYS not in hass.data[DOMAIN]:
hass.data[DOMAIN][MYSENSORS_GATEWAYS] = {}
gateways = hass.data[DOMAIN].get(MYSENSORS_GATEWAYS)
return gateways.get(gateway_id)
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
async def setup_gateway(
hass: HomeAssistant, entry: ConfigEntry
2021-03-18 12:07:04 +00:00
) -> BaseAsyncGateway | None:
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
"""Set up the Gateway for the given ConfigEntry."""
ready_gateway = await _get_gateway(
hass,
gateway_type=entry.data[CONF_GATEWAY_TYPE],
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
device=entry.data[CONF_DEVICE],
version=entry.data[CONF_VERSION],
event_callback=_gw_callback_factory(hass, entry.entry_id),
persistence_file=entry.data.get(
CONF_PERSISTENCE_FILE, f"mysensors_{entry.entry_id}.json"
),
baud_rate=entry.data.get(CONF_BAUD_RATE),
tcp_port=entry.data.get(CONF_TCP_PORT),
topic_in_prefix=entry.data.get(CONF_TOPIC_IN_PREFIX),
topic_out_prefix=entry.data.get(CONF_TOPIC_OUT_PREFIX),
retain=entry.data.get(CONF_RETAIN, False),
)
return ready_gateway
async def _get_gateway(
hass: HomeAssistant,
gateway_type: ConfGatewayType,
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
device: str,
version: str,
event_callback: Callable[[Message], None],
2021-03-18 12:07:04 +00:00
persistence_file: str | None = None,
baud_rate: int | None = None,
tcp_port: int | None = None,
topic_in_prefix: str | None = None,
topic_out_prefix: str | None = None,
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
retain: bool = False,
persistence: bool = True,
2021-03-18 12:07:04 +00:00
) -> BaseAsyncGateway | None:
"""Return gateway after setup of the gateway."""
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
if persistence_file is not None:
# Interpret relative paths to be in hass config folder.
# Absolute paths will be left as they are.
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
persistence_file = hass.config.path(persistence_file)
if gateway_type == CONF_GATEWAY_TYPE_MQTT:
# Make sure the mqtt integration is set up.
# Naive check that doesn't consider config entry state.
if MQTT_DOMAIN not in hass.config.components:
return None
mqtt = hass.components.mqtt
2021-06-07 14:04:04 +00:00
def pub_callback(topic: str, payload: str, qos: int, retain: bool) -> None:
"""Call MQTT publish function."""
mqtt.async_publish(topic, payload, qos, retain)
2021-06-07 14:04:04 +00:00
def sub_callback(
topic: str, sub_cb: Callable[[str, PublishPayloadType, int], None], qos: int
) -> None:
"""Call MQTT subscribe function."""
2019-07-31 19:25:30 +00:00
@callback
2021-06-07 14:04:04 +00:00
def internal_callback(msg: MQTTMessage) -> None:
"""Call callback."""
sub_cb(msg.topic, msg.payload, msg.qos)
2019-07-31 19:25:30 +00:00
hass.async_create_task(mqtt.async_subscribe(topic, internal_callback, qos))
gateway = mysensors.AsyncMQTTGateway(
2019-07-31 19:25:30 +00:00
pub_callback,
sub_callback,
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
in_prefix=topic_in_prefix,
out_prefix=topic_out_prefix,
2019-07-31 19:25:30 +00:00
retain=retain,
loop=hass.loop,
event_callback=None,
persistence=persistence,
persistence_file=persistence_file,
2019-07-31 19:25:30 +00:00
protocol_version=version,
)
elif gateway_type == CONF_GATEWAY_TYPE_SERIAL:
gateway = mysensors.AsyncSerialGateway(
device,
baud=baud_rate,
loop=hass.loop,
event_callback=None,
persistence=persistence,
persistence_file=persistence_file,
protocol_version=version,
)
else:
gateway = mysensors.AsyncTCPGateway(
device,
port=tcp_port,
loop=hass.loop,
event_callback=None,
persistence=persistence,
persistence_file=persistence_file,
protocol_version=version,
)
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
gateway.event_callback = event_callback
if persistence:
await gateway.start_persistence()
return gateway
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
async def finish_setup(
hass: HomeAssistant, entry: ConfigEntry, gateway: BaseAsyncGateway
2021-06-07 14:04:04 +00:00
) -> None:
"""Load any persistent devices and platforms and start gateway."""
discover_tasks = []
start_tasks = []
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
discover_tasks.append(_discover_persistent_devices(hass, entry, gateway))
start_tasks.append(_gw_start(hass, entry, gateway))
if discover_tasks:
# Make sure all devices and platforms are loaded before gateway start.
await asyncio.wait(discover_tasks)
if start_tasks:
await asyncio.wait(start_tasks)
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
async def _discover_persistent_devices(
hass: HomeAssistant, entry: ConfigEntry, gateway: BaseAsyncGateway
2021-06-07 14:04:04 +00:00
) -> None:
"""Discover platforms for devices loaded via persistence file."""
new_devices = defaultdict(list)
for node_id in gateway.sensors:
if not validate_node(gateway, node_id):
continue
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
node: Sensor = gateway.sensors[node_id]
for child in node.children.values(): # child is of type ChildSensor
validated = validate_child(entry.entry_id, gateway, node_id, child)
for platform, dev_ids in validated.items():
new_devices[platform].extend(dev_ids)
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
_LOGGER.debug("discovering persistent devices: %s", new_devices)
for platform, dev_ids in new_devices.items():
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
discover_mysensors_platform(hass, entry.entry_id, platform, dev_ids)
2021-06-07 14:04:04 +00:00
async def gw_stop(
hass: HomeAssistant, entry: ConfigEntry, gateway: BaseAsyncGateway
) -> None:
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
"""Stop the gateway."""
2021-03-07 13:20:21 +00:00
connect_task = hass.data[DOMAIN].pop(
MYSENSORS_GATEWAY_START_TASK.format(entry.entry_id), None
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
)
if connect_task is not None and not connect_task.done():
connect_task.cancel()
await gateway.stop()
2021-06-07 14:04:04 +00:00
async def _gw_start(
hass: HomeAssistant, entry: ConfigEntry, gateway: BaseAsyncGateway
) -> None:
"""Start the gateway."""
gateway_ready = asyncio.Event()
2021-06-07 14:04:04 +00:00
def gateway_connected(_: BaseAsyncGateway) -> None:
"""Handle gateway connected."""
gateway_ready.set()
gateway.on_conn_made = gateway_connected
# Don't use hass.async_create_task to avoid holding up setup indefinitely.
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
hass.data[DOMAIN][
MYSENSORS_GATEWAY_START_TASK.format(entry.entry_id)
] = asyncio.create_task(
gateway.start()
) # store the connect task so it can be cancelled in gw_stop
2021-06-07 14:04:04 +00:00
async def stop_this_gw(_: Event) -> None:
"""Stop the gateway."""
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
await gw_stop(hass, entry, gateway)
on_unload(
2021-03-07 13:20:21 +00:00
hass,
entry.entry_id,
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_this_gw),
)
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
if entry.data[CONF_DEVICE] == MQTT_COMPONENT:
# Gatways connected via mqtt doesn't send gateway ready message.
return
try:
with async_timeout.timeout(GATEWAY_READY_TIMEOUT):
await gateway_ready.wait()
except asyncio.TimeoutError:
_LOGGER.warning(
"Gateway %s not connected after %s secs so continuing with setup",
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
entry.data[CONF_DEVICE],
2019-07-31 19:25:30 +00:00
GATEWAY_READY_TIMEOUT,
)
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
def _gw_callback_factory(
hass: HomeAssistant, gateway_id: GatewayId
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
) -> Callable[[Message], None]:
"""Return a new callback for the gateway."""
2019-07-31 19:25:30 +00:00
@callback
2021-06-07 14:04:04 +00:00
def mysensors_callback(msg: Message) -> None:
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
"""Handle messages from a MySensors gateway.
All MySenors messages are received here.
The messages are passed to handler functions depending on their type.
"""
2019-07-31 19:25:30 +00:00
_LOGGER.debug("Node update: node %s child %s", msg.node_id, msg.child_id)
msg_type = msg.gateway.const.MessageType(msg.type)
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
msg_handler: Callable[
[HomeAssistant, GatewayId, Message], Coroutine[Any, Any, None]
] | None = HANDLERS.get(msg_type.name)
if msg_handler is None:
return
MySensors config flow (#45421) * MySensors: Add type annotations Adds a bunch of type annotations that were created while understanding the code. * MySensors: Change GatewayId to string In preparation for config flow. The GatewayId used to be id(gateway). With config flows, every gateway will have its own ConfigEntry. Every ConfigEntry has a unique id. Thus we would have two separate but one-to-one related ID systems. This commit removes this unneeded duplication by using the id of the ConfigEntry as GatewayId. * MySensors: Add unique_id to all entities This allows entities to work well with the frontend. * MySensors: Add device_info to all entities Entities belonging to the same node_id will now by grouped as a device. * MySensors: clean up device.py a bit * MySensors: Add config flow support With this change the MySensors can be fully configured from the GUI. Legacy configuration.yaml configs will be migrated by reading them once. Note that custom node names are not migrated. Users will have to re-enter the names in the front-end. Since there is no straight-forward way to configure global settings, all previously global settings are now per-gateway. These settings include: - MQTT retain - optimistic - persistence enable - MySensors version When a MySensors integration is loaded, it works as follows: 1. __init__.async_setup_entry is called 2. for every platform, async_forward_entry_setup is called 3. the platform's async_setup_entry is called 4. __init__.setup_mysensors_platform is called 5. the entity's constructor (e.g. MySensorsCover) is called 6. the created entity is stored in a dict in the hass object * MySensors: Fix linter errors * MySensors: Remove unused import * MySensors: Feedback from @MartinHjelmare * MySensors: Multi-step config flow * MySensors: More feedback * MySensors: Move all storage in hass object under DOMAIN The integration now stores everything under hass.data["mysensors"] instead of using several top level keys. * MySensors: await shutdown of gateway instead of creating a task * MySensors: Rename Ethernet to TCP * MySensors: Absolute imports and cosmetic changes * MySensors: fix gw_stop * MySensors: Allow user to specify persistence file * MySensors: Nicer log message * MySensors: Add lots of unit tests * MySensors: Fix legacy import of persistence file name Turns out tests help to find bugs :D * MySensors: Improve test coverage * MySensors: Use json persistence files by default * MySensors: Code style improvements * MySensors: Stop adding attributes to existing objects This commit removes the extra attributes that were being added to the gateway objects from pymysensors. Most attributes were easy to remove, except for the gateway id. The MySensorsDevice class needs the gateway id as it is part of its DevId as well as the unique_id and device_info. Most MySensorsDevices actually end up being Entities. Entities have access to their ConfigEntry via self.platform.config_entry. However, the device_tracker platform does not become an Entity. For this reason, the gateway id is not fetched from self.plaform but given as an argument. Additionally, MySensorsDevices expose the address of the gateway (CONF_DEVICE). Entities can easily fetch this information via self.platform, but the device_tracker cannot. This commit chooses to remove the gateway address from device_tracker. While this could in theory break some automations, the simplicity of this solution was deemed worth it. The alternative of adding the entire ConfigEntry as an argument to MySensorsDevices is not viable, because device_tracker is initialized by the async_setup_scanner function that isn't supplied a ConfigEntry. It only gets discovery_info. Adding the entire ConfigEntry doesn't seem appropriate for this edge case. * MySensors: Fix gw_stop and the translations * MySensors: Fix incorrect function calls * MySensors: Fewer comments in const.py * MySensors: Remove union from _get_gateway and remove id from try_connect * MySensors: Deprecate nodes option in configuration.yaml * MySensors: Use version parser from packaging * MySensors: Remove prefix from unique_id and change some private property names * MySensors: Change _get_gateway function signature * MySensors: add packaging==20.8 for the version parser * MySensors: Rename some stuff * MySensors: use pytest.mark.parametrize * MySensors: Clean up test cases * MySensors: Remove unneeded parameter from devices * Revert "MySensors: add packaging==20.8 for the version parser" This reverts commit 6b200ee01a3c0eee98176380bdd0b73e5a25b2dd. * MySensors: Use core interface for testing configuration.yaml import * MySensors: Fix test_init * MySensors: Rename a few variables * MySensors: cosmetic changes * MySensors: Update strings.json * MySensors: Still more feedback from @MartinHjelmare * MySensors: Remove unused strings Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * MySensors: Fix typo and remove another unused string * MySensors: More strings.json * MySensors: Fix gateway ready handler * MySensors: Add duplicate detection to config flows * MySensors: Deal with non-existing topics and ports. Includes unit tests for these cases. * MySensors: Use awesomeversion instead of packaging * Add string already_configured * MySensors: Abort config flow when config is found to be invalid while importing * MySensors: Copy all error messages to also be abort messages All error strings may now also be used as an abort reason, so the strings should be defined * Use string references Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-05 21:13:57 +00:00
hass.async_create_task(msg_handler(hass, gateway_id, msg))
return mysensors_callback