Use EntityDescription - onewire (#55003)

This commit is contained in:
epenet 2021-08-24 10:37:59 +02:00 committed by GitHub
parent 2796f65453
commit ccaf0d5c75
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 836 additions and 721 deletions

View File

@ -1,9 +1,13 @@
"""Support for 1-Wire binary sensors.""" """Support for 1-Wire binary sensors."""
from __future__ import annotations from __future__ import annotations
from dataclasses import dataclass
import os import os
from homeassistant.components.binary_sensor import BinarySensorEntity from homeassistant.components.binary_sensor import (
BinarySensorEntity,
BinarySensorEntityDescription,
)
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ( from homeassistant.const import (
ATTR_IDENTIFIERS, ATTR_IDENTIFIERS,
@ -16,77 +20,83 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import CONF_TYPE_OWSERVER, DOMAIN, SENSOR_TYPE_SENSED from .const import CONF_TYPE_OWSERVER, DOMAIN, READ_MODE_BOOL
from .model import DeviceComponentDescription from .onewire_entities import OneWireEntityDescription, OneWireProxyEntity
from .onewire_entities import OneWireBaseEntity, OneWireProxyEntity
from .onewirehub import OneWireHub from .onewirehub import OneWireHub
DEVICE_BINARY_SENSORS: dict[str, list[DeviceComponentDescription]] = {
# Family : { path, sensor_type } @dataclass
"12": [ class OneWireBinarySensorEntityDescription(
{ OneWireEntityDescription, BinarySensorEntityDescription
"path": "sensed.A", ):
"name": "Sensed A", """Class describing OneWire binary sensor entities."""
"type": SENSOR_TYPE_SENSED,
"default_disabled": True,
}, DEVICE_BINARY_SENSORS: dict[str, tuple[OneWireBinarySensorEntityDescription, ...]] = {
{ "12": (
"path": "sensed.B", OneWireBinarySensorEntityDescription(
"name": "Sensed B", key="sensed.A",
"type": SENSOR_TYPE_SENSED, entity_registry_enabled_default=False,
"default_disabled": True, name="Sensed A",
}, read_mode=READ_MODE_BOOL,
], ),
"29": [ OneWireBinarySensorEntityDescription(
{ key="sensed.B",
"path": "sensed.0", entity_registry_enabled_default=False,
"name": "Sensed 0", name="Sensed B",
"type": SENSOR_TYPE_SENSED, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, ),
{ "29": (
"path": "sensed.1", OneWireBinarySensorEntityDescription(
"name": "Sensed 1", key="sensed.0",
"type": SENSOR_TYPE_SENSED, entity_registry_enabled_default=False,
"default_disabled": True, name="Sensed 0",
}, read_mode=READ_MODE_BOOL,
{ ),
"path": "sensed.2", OneWireBinarySensorEntityDescription(
"name": "Sensed 2", key="sensed.1",
"type": SENSOR_TYPE_SENSED, entity_registry_enabled_default=False,
"default_disabled": True, name="Sensed 1",
}, read_mode=READ_MODE_BOOL,
{ ),
"path": "sensed.3", OneWireBinarySensorEntityDescription(
"name": "Sensed 3", key="sensed.2",
"type": SENSOR_TYPE_SENSED, entity_registry_enabled_default=False,
"default_disabled": True, name="Sensed 2",
}, read_mode=READ_MODE_BOOL,
{ ),
"path": "sensed.4", OneWireBinarySensorEntityDescription(
"name": "Sensed 4", key="sensed.3",
"type": SENSOR_TYPE_SENSED, entity_registry_enabled_default=False,
"default_disabled": True, name="Sensed 3",
}, read_mode=READ_MODE_BOOL,
{ ),
"path": "sensed.5", OneWireBinarySensorEntityDescription(
"name": "Sensed 5", key="sensed.4",
"type": SENSOR_TYPE_SENSED, entity_registry_enabled_default=False,
"default_disabled": True, name="Sensed 4",
}, read_mode=READ_MODE_BOOL,
{ ),
"path": "sensed.6", OneWireBinarySensorEntityDescription(
"name": "Sensed 6", key="sensed.5",
"type": SENSOR_TYPE_SENSED, entity_registry_enabled_default=False,
"default_disabled": True, name="Sensed 5",
}, read_mode=READ_MODE_BOOL,
{ ),
"path": "sensed.7", OneWireBinarySensorEntityDescription(
"name": "Sensed 7", key="sensed.6",
"type": SENSOR_TYPE_SENSED, entity_registry_enabled_default=False,
"default_disabled": True, name="Sensed 6",
}, read_mode=READ_MODE_BOOL,
], ),
OneWireBinarySensorEntityDescription(
key="sensed.7",
entity_registry_enabled_default=False,
name="Sensed 7",
read_mode=READ_MODE_BOOL,
),
),
} }
@ -104,12 +114,12 @@ async def async_setup_entry(
async_add_entities(entities, True) async_add_entities(entities, True)
def get_entities(onewirehub: OneWireHub) -> list[OneWireBaseEntity]: def get_entities(onewirehub: OneWireHub) -> list[BinarySensorEntity]:
"""Get a list of entities.""" """Get a list of entities."""
if not onewirehub.devices: if not onewirehub.devices:
return [] return []
entities: list[OneWireBaseEntity] = [] entities: list[BinarySensorEntity] = []
for device in onewirehub.devices: for device in onewirehub.devices:
family = device["family"] family = device["family"]
@ -124,17 +134,18 @@ def get_entities(onewirehub: OneWireHub) -> list[OneWireBaseEntity]:
ATTR_MODEL: device_type, ATTR_MODEL: device_type,
ATTR_NAME: device_id, ATTR_NAME: device_id,
} }
for entity_specs in DEVICE_BINARY_SENSORS[family]: for description in DEVICE_BINARY_SENSORS[family]:
entity_path = os.path.join( device_file = os.path.join(
os.path.split(device["path"])[0], entity_specs["path"] os.path.split(device["path"])[0], description.key
) )
name = f"{device_id} {description.name}"
entities.append( entities.append(
OneWireProxyBinarySensor( OneWireProxyBinarySensor(
description=description,
device_id=device_id, device_id=device_id,
device_name=device_id, device_file=device_file,
device_info=device_info, device_info=device_info,
entity_path=entity_path, name=name,
entity_specs=entity_specs,
owproxy=onewirehub.owproxy, owproxy=onewirehub.owproxy,
) )
) )
@ -145,6 +156,8 @@ def get_entities(onewirehub: OneWireHub) -> list[OneWireBaseEntity]:
class OneWireProxyBinarySensor(OneWireProxyEntity, BinarySensorEntity): class OneWireProxyBinarySensor(OneWireProxyEntity, BinarySensorEntity):
"""Implementation of a 1-Wire binary sensor.""" """Implementation of a 1-Wire binary sensor."""
entity_description: OneWireBinarySensorEntityDescription
@property @property
def is_on(self) -> bool: def is_on(self) -> bool:
"""Return true if sensor is on.""" """Return true if sensor is on."""

View File

@ -4,20 +4,6 @@ from __future__ import annotations
from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN
from homeassistant.const import (
DEVICE_CLASS_CURRENT,
DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_ILLUMINANCE,
DEVICE_CLASS_PRESSURE,
DEVICE_CLASS_TEMPERATURE,
DEVICE_CLASS_VOLTAGE,
ELECTRIC_CURRENT_AMPERE,
ELECTRIC_POTENTIAL_VOLT,
LIGHT_LUX,
PERCENTAGE,
PRESSURE_MBAR,
TEMP_CELSIUS,
)
CONF_MOUNT_DIR = "mount_dir" CONF_MOUNT_DIR = "mount_dir"
CONF_NAMES = "names" CONF_NAMES = "names"
@ -33,34 +19,9 @@ DOMAIN = "onewire"
PRESSURE_CBAR = "cbar" PRESSURE_CBAR = "cbar"
SENSOR_TYPE_COUNT = "count" READ_MODE_BOOL = "bool"
SENSOR_TYPE_CURRENT = "current" READ_MODE_FLOAT = "float"
SENSOR_TYPE_HUMIDITY = "humidity" READ_MODE_INT = "int"
SENSOR_TYPE_ILLUMINANCE = "illuminance"
SENSOR_TYPE_MOISTURE = "moisture"
SENSOR_TYPE_PRESSURE = "pressure"
SENSOR_TYPE_SENSED = "sensed"
SENSOR_TYPE_TEMPERATURE = "temperature"
SENSOR_TYPE_VOLTAGE = "voltage"
SENSOR_TYPE_WETNESS = "wetness"
SWITCH_TYPE_LATCH = "latch"
SWITCH_TYPE_PIO = "pio"
SENSOR_TYPES: dict[str, list[str | None]] = {
# SensorType: [ Unit, DeviceClass ]
SENSOR_TYPE_TEMPERATURE: [TEMP_CELSIUS, DEVICE_CLASS_TEMPERATURE],
SENSOR_TYPE_HUMIDITY: [PERCENTAGE, DEVICE_CLASS_HUMIDITY],
SENSOR_TYPE_PRESSURE: [PRESSURE_MBAR, DEVICE_CLASS_PRESSURE],
SENSOR_TYPE_ILLUMINANCE: [LIGHT_LUX, DEVICE_CLASS_ILLUMINANCE],
SENSOR_TYPE_WETNESS: [PERCENTAGE, DEVICE_CLASS_HUMIDITY],
SENSOR_TYPE_MOISTURE: [PRESSURE_CBAR, DEVICE_CLASS_PRESSURE],
SENSOR_TYPE_COUNT: ["count", None],
SENSOR_TYPE_VOLTAGE: [ELECTRIC_POTENTIAL_VOLT, DEVICE_CLASS_VOLTAGE],
SENSOR_TYPE_CURRENT: [ELECTRIC_CURRENT_AMPERE, DEVICE_CLASS_CURRENT],
SENSOR_TYPE_SENSED: [None, None],
SWITCH_TYPE_LATCH: [None, None],
SWITCH_TYPE_PIO: [None, None],
}
PLATFORMS = [ PLATFORMS = [
BINARY_SENSOR_DOMAIN, BINARY_SENSOR_DOMAIN,

View File

@ -4,15 +4,6 @@ from __future__ import annotations
from typing import TypedDict from typing import TypedDict
class DeviceComponentDescription(TypedDict, total=False):
"""Device component description class."""
path: str
name: str
type: str
default_disabled: bool
class OWServerDeviceDescription(TypedDict): class OWServerDeviceDescription(TypedDict):
"""OWServer device description class.""" """OWServer device description class."""

View File

@ -1,22 +1,24 @@
"""Support for 1-Wire entities.""" """Support for 1-Wire entities."""
from __future__ import annotations from __future__ import annotations
from dataclasses import dataclass
import logging import logging
from typing import Any from typing import Any
from pyownet import protocol from pyownet import protocol
from homeassistant.helpers.entity import DeviceInfo, Entity from homeassistant.helpers.entity import DeviceInfo, Entity, EntityDescription
from homeassistant.helpers.typing import StateType from homeassistant.helpers.typing import StateType
from .const import ( from .const import READ_MODE_BOOL, READ_MODE_INT
SENSOR_TYPE_COUNT,
SENSOR_TYPE_SENSED,
SENSOR_TYPES, @dataclass
SWITCH_TYPE_LATCH, class OneWireEntityDescription(EntityDescription):
SWITCH_TYPE_PIO, """Class describing OneWire entities."""
)
from .model import DeviceComponentDescription read_mode: str | None = None
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -24,57 +26,32 @@ _LOGGER = logging.getLogger(__name__)
class OneWireBaseEntity(Entity): class OneWireBaseEntity(Entity):
"""Implementation of a 1-Wire entity.""" """Implementation of a 1-Wire entity."""
entity_description: OneWireEntityDescription
def __init__( def __init__(
self, self,
name: str, description: OneWireEntityDescription,
device_file: str, device_id: str,
entity_type: str,
entity_name: str,
device_info: DeviceInfo, device_info: DeviceInfo,
default_disabled: bool, device_file: str,
unique_id: str, name: str,
) -> None: ) -> None:
"""Initialize the entity.""" """Initialize the entity."""
self._name = f"{name} {entity_name or entity_type.capitalize()}" self.entity_description = description
self._attr_unique_id = f"/{device_id}/{description.key}"
self._attr_device_info = device_info
self._attr_name = name
self._device_file = device_file self._device_file = device_file
self._entity_type = entity_type
self._device_class = SENSOR_TYPES[entity_type][1]
self._unit_of_measurement = SENSOR_TYPES[entity_type][0]
self._device_info = device_info
self._state: StateType = None self._state: StateType = None
self._value_raw: float | None = None self._value_raw: float | None = None
self._default_disabled = default_disabled
self._unique_id = unique_id
@property
def name(self) -> str | None:
"""Return the name of the entity."""
return self._name
@property
def device_class(self) -> str | None:
"""Return the class of this device."""
return self._device_class
@property @property
def extra_state_attributes(self) -> dict[str, Any] | None: def extra_state_attributes(self) -> dict[str, Any] | None:
"""Return the state attributes of the entity.""" """Return the state attributes of the entity."""
return {"device_file": self._device_file, "raw_value": self._value_raw} return {
"device_file": self._device_file,
@property "raw_value": self._value_raw,
def unique_id(self) -> str | None: }
"""Return a unique ID."""
return self._unique_id
@property
def device_info(self) -> DeviceInfo | None:
"""Return device specific attributes."""
return self._device_info
@property
def entity_registry_enabled_default(self) -> bool:
"""Return if the entity should be enabled when first added to the entity registry."""
return not self._default_disabled
class OneWireProxyEntity(OneWireBaseEntity): class OneWireProxyEntity(OneWireBaseEntity):
@ -82,22 +59,20 @@ class OneWireProxyEntity(OneWireBaseEntity):
def __init__( def __init__(
self, self,
description: OneWireEntityDescription,
device_id: str, device_id: str,
device_name: str,
device_info: DeviceInfo, device_info: DeviceInfo,
entity_path: str, device_file: str,
entity_specs: DeviceComponentDescription, name: str,
owproxy: protocol._Proxy, owproxy: protocol._Proxy,
) -> None: ) -> None:
"""Initialize the sensor.""" """Initialize the sensor."""
super().__init__( super().__init__(
name=device_name, description=description,
device_file=entity_path, device_id=device_id,
entity_type=entity_specs["type"],
entity_name=entity_specs["name"],
device_info=device_info, device_info=device_info,
default_disabled=entity_specs.get("default_disabled", False), device_file=device_file,
unique_id=f"/{device_id}/{entity_specs['path']}", name=name,
) )
self._owproxy = owproxy self._owproxy = owproxy
@ -118,13 +93,9 @@ class OneWireProxyEntity(OneWireBaseEntity):
_LOGGER.error("Owserver failure in read(), got: %s", exc) _LOGGER.error("Owserver failure in read(), got: %s", exc)
self._state = None self._state = None
else: else:
if self._entity_type == SENSOR_TYPE_COUNT: if self.entity_description.read_mode == READ_MODE_INT:
self._state = int(self._value_raw) self._state = int(self._value_raw)
elif self._entity_type in [ elif self.entity_description.read_mode == READ_MODE_BOOL:
SENSOR_TYPE_SENSED,
SWITCH_TYPE_LATCH,
SWITCH_TYPE_PIO,
]:
self._state = int(self._value_raw) == 1 self._state = int(self._value_raw) == 1
else: else:
self._state = round(self._value_raw, 1) self._state = round(self._value_raw, 1)

View File

@ -2,6 +2,8 @@
from __future__ import annotations from __future__ import annotations
import asyncio import asyncio
import copy
from dataclasses import dataclass
import logging import logging
import os import os
from types import MappingProxyType from types import MappingProxyType
@ -9,7 +11,12 @@ from typing import Any
from pi1wire import InvalidCRCException, OneWireInterface, UnsupportResponseException from pi1wire import InvalidCRCException, OneWireInterface, UnsupportResponseException
from homeassistant.components.sensor import SensorEntity from homeassistant.components.sensor import (
STATE_CLASS_MEASUREMENT,
STATE_CLASS_TOTAL_INCREASING,
SensorEntity,
SensorEntityDescription,
)
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ( from homeassistant.const import (
ATTR_IDENTIFIERS, ATTR_IDENTIFIERS,
@ -17,6 +24,18 @@ from homeassistant.const import (
ATTR_MODEL, ATTR_MODEL,
ATTR_NAME, ATTR_NAME,
CONF_TYPE, CONF_TYPE,
DEVICE_CLASS_CURRENT,
DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_ILLUMINANCE,
DEVICE_CLASS_PRESSURE,
DEVICE_CLASS_TEMPERATURE,
DEVICE_CLASS_VOLTAGE,
ELECTRIC_CURRENT_AMPERE,
ELECTRIC_POTENTIAL_VOLT,
LIGHT_LUX,
PERCENTAGE,
PRESSURE_MBAR,
TEMP_CELSIUS,
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
@ -29,122 +48,172 @@ from .const import (
CONF_TYPE_OWSERVER, CONF_TYPE_OWSERVER,
CONF_TYPE_SYSBUS, CONF_TYPE_SYSBUS,
DOMAIN, DOMAIN,
SENSOR_TYPE_COUNT, PRESSURE_CBAR,
SENSOR_TYPE_CURRENT, READ_MODE_FLOAT,
SENSOR_TYPE_HUMIDITY, READ_MODE_INT,
SENSOR_TYPE_ILLUMINANCE, )
SENSOR_TYPE_MOISTURE, from .onewire_entities import (
SENSOR_TYPE_PRESSURE, OneWireBaseEntity,
SENSOR_TYPE_TEMPERATURE, OneWireEntityDescription,
SENSOR_TYPE_VOLTAGE, OneWireProxyEntity,
SENSOR_TYPE_WETNESS,
) )
from .model import DeviceComponentDescription
from .onewire_entities import OneWireBaseEntity, OneWireProxyEntity
from .onewirehub import OneWireHub from .onewirehub import OneWireHub
@dataclass
class OneWireSensorEntityDescription(OneWireEntityDescription, SensorEntityDescription):
"""Class describing OneWire sensor entities."""
SIMPLE_TEMPERATURE_SENSOR_DESCRIPTION = OneWireSensorEntityDescription(
key="temperature",
device_class=DEVICE_CLASS_TEMPERATURE,
name="Temperature",
native_unit_of_measurement=TEMP_CELSIUS,
read_mode=READ_MODE_FLOAT,
state_class=STATE_CLASS_MEASUREMENT,
)
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
DEVICE_SENSORS: dict[str, list[DeviceComponentDescription]] = {
# Family : { SensorType: owfs path } DEVICE_SENSORS: dict[str, tuple[OneWireSensorEntityDescription, ...]] = {
"10": [ "10": (SIMPLE_TEMPERATURE_SENSOR_DESCRIPTION,),
{"path": "temperature", "name": "Temperature", "type": SENSOR_TYPE_TEMPERATURE} "12": (
], OneWireSensorEntityDescription(
"12": [ key="TAI8570/temperature",
{ device_class=DEVICE_CLASS_TEMPERATURE,
"path": "TAI8570/temperature", entity_registry_enabled_default=False,
"name": "Temperature", name="Temperature",
"type": SENSOR_TYPE_TEMPERATURE, native_unit_of_measurement=TEMP_CELSIUS,
"default_disabled": True, read_mode=READ_MODE_FLOAT,
}, state_class=STATE_CLASS_MEASUREMENT,
{ ),
"path": "TAI8570/pressure", OneWireSensorEntityDescription(
"name": "Pressure", key="TAI8570/pressure",
"type": SENSOR_TYPE_PRESSURE, device_class=DEVICE_CLASS_PRESSURE,
"default_disabled": True, entity_registry_enabled_default=False,
}, name="Pressure",
], native_unit_of_measurement=PRESSURE_MBAR,
"22": [ read_mode=READ_MODE_FLOAT,
{"path": "temperature", "name": "Temperature", "type": SENSOR_TYPE_TEMPERATURE} state_class=STATE_CLASS_MEASUREMENT,
], ),
"26": [ ),
{"path": "temperature", "name": "Temperature", "type": SENSOR_TYPE_TEMPERATURE}, "22": (SIMPLE_TEMPERATURE_SENSOR_DESCRIPTION,),
{ "26": (
"path": "humidity", SIMPLE_TEMPERATURE_SENSOR_DESCRIPTION,
"name": "Humidity", OneWireSensorEntityDescription(
"type": SENSOR_TYPE_HUMIDITY, key="humidity",
"default_disabled": True, device_class=DEVICE_CLASS_HUMIDITY,
}, entity_registry_enabled_default=False,
{ name="Humidity",
"path": "HIH3600/humidity", native_unit_of_measurement=PERCENTAGE,
"name": "Humidity HIH3600", read_mode=READ_MODE_FLOAT,
"type": SENSOR_TYPE_HUMIDITY, state_class=STATE_CLASS_MEASUREMENT,
"default_disabled": True, ),
}, OneWireSensorEntityDescription(
{ key="HIH3600/humidity",
"path": "HIH4000/humidity", device_class=DEVICE_CLASS_HUMIDITY,
"name": "Humidity HIH4000", entity_registry_enabled_default=False,
"type": SENSOR_TYPE_HUMIDITY, name="Humidity HIH3600",
"default_disabled": True, native_unit_of_measurement=PERCENTAGE,
}, read_mode=READ_MODE_FLOAT,
{ state_class=STATE_CLASS_MEASUREMENT,
"path": "HIH5030/humidity", ),
"name": "Humidity HIH5030", OneWireSensorEntityDescription(
"type": SENSOR_TYPE_HUMIDITY, key="HIH4000/humidity",
"default_disabled": True, device_class=DEVICE_CLASS_HUMIDITY,
}, entity_registry_enabled_default=False,
{ name="Humidity HIH4000",
"path": "HTM1735/humidity", native_unit_of_measurement=PERCENTAGE,
"name": "Humidity HTM1735", read_mode=READ_MODE_FLOAT,
"type": SENSOR_TYPE_HUMIDITY, state_class=STATE_CLASS_MEASUREMENT,
"default_disabled": True, ),
}, OneWireSensorEntityDescription(
{ key="HIH5030/humidity",
"path": "B1-R1-A/pressure", device_class=DEVICE_CLASS_HUMIDITY,
"name": "Pressure", entity_registry_enabled_default=False,
"type": SENSOR_TYPE_PRESSURE, name="Humidity HIH5030",
"default_disabled": True, native_unit_of_measurement=PERCENTAGE,
}, read_mode=READ_MODE_FLOAT,
{ state_class=STATE_CLASS_MEASUREMENT,
"path": "S3-R1-A/illuminance", ),
"name": "Illuminance", OneWireSensorEntityDescription(
"type": SENSOR_TYPE_ILLUMINANCE, key="HTM1735/humidity",
"default_disabled": True, device_class=DEVICE_CLASS_HUMIDITY,
}, entity_registry_enabled_default=False,
{ name="Humidity HTM1735",
"path": "VAD", native_unit_of_measurement=PERCENTAGE,
"name": "Voltage VAD", read_mode=READ_MODE_FLOAT,
"type": SENSOR_TYPE_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT,
"default_disabled": True, ),
}, OneWireSensorEntityDescription(
{ key="B1-R1-A/pressure",
"path": "VDD", device_class=DEVICE_CLASS_PRESSURE,
"name": "Voltage VDD", entity_registry_enabled_default=False,
"type": SENSOR_TYPE_VOLTAGE, name="Pressure",
"default_disabled": True, native_unit_of_measurement=PRESSURE_MBAR,
}, read_mode=READ_MODE_FLOAT,
{ state_class=STATE_CLASS_MEASUREMENT,
"path": "IAD", ),
"name": "Current", OneWireSensorEntityDescription(
"type": SENSOR_TYPE_CURRENT, key="S3-R1-A/illuminance",
"default_disabled": True, device_class=DEVICE_CLASS_ILLUMINANCE,
}, entity_registry_enabled_default=False,
], name="Illuminance",
"28": [ native_unit_of_measurement=LIGHT_LUX,
{"path": "temperature", "name": "Temperature", "type": SENSOR_TYPE_TEMPERATURE} read_mode=READ_MODE_FLOAT,
], state_class=STATE_CLASS_MEASUREMENT,
"3B": [ ),
{"path": "temperature", "name": "Temperature", "type": SENSOR_TYPE_TEMPERATURE} OneWireSensorEntityDescription(
], key="VAD",
"42": [ device_class=DEVICE_CLASS_VOLTAGE,
{"path": "temperature", "name": "Temperature", "type": SENSOR_TYPE_TEMPERATURE} entity_registry_enabled_default=False,
], name="Voltage VAD",
"1D": [ native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT,
{"path": "counter.A", "name": "Counter A", "type": SENSOR_TYPE_COUNT}, read_mode=READ_MODE_FLOAT,
{"path": "counter.B", "name": "Counter B", "type": SENSOR_TYPE_COUNT}, state_class=STATE_CLASS_MEASUREMENT,
], ),
"EF": [], # "HobbyBoard": special OneWireSensorEntityDescription(
"7E": [], # "EDS": special key="VDD",
device_class=DEVICE_CLASS_VOLTAGE,
entity_registry_enabled_default=False,
name="Voltage VDD",
native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT,
read_mode=READ_MODE_FLOAT,
state_class=STATE_CLASS_MEASUREMENT,
),
OneWireSensorEntityDescription(
key="IAD",
device_class=DEVICE_CLASS_CURRENT,
entity_registry_enabled_default=False,
name="Current",
native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE,
read_mode=READ_MODE_FLOAT,
state_class=STATE_CLASS_MEASUREMENT,
),
),
"28": (SIMPLE_TEMPERATURE_SENSOR_DESCRIPTION,),
"3B": (SIMPLE_TEMPERATURE_SENSOR_DESCRIPTION,),
"42": (SIMPLE_TEMPERATURE_SENSOR_DESCRIPTION,),
"1D": (
OneWireSensorEntityDescription(
key="counter.A",
name="Counter A",
native_unit_of_measurement="count",
read_mode=READ_MODE_INT,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
OneWireSensorEntityDescription(
key="counter.B",
name="Counter B",
native_unit_of_measurement="count",
read_mode=READ_MODE_INT,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
),
"EF": (), # "HobbyBoard": special
"7E": (), # "EDS": special
} }
DEVICE_SUPPORT_SYSBUS = ["10", "22", "28", "3B", "42"] DEVICE_SUPPORT_SYSBUS = ["10", "22", "28", "3B", "42"]
@ -153,85 +222,124 @@ DEVICE_SUPPORT_SYSBUS = ["10", "22", "28", "3B", "42"]
# These can only be read by OWFS. Currently this driver only supports them # These can only be read by OWFS. Currently this driver only supports them
# via owserver (network protocol) # via owserver (network protocol)
HOBBYBOARD_EF: dict[str, list[DeviceComponentDescription]] = { HOBBYBOARD_EF: dict[str, tuple[OneWireSensorEntityDescription, ...]] = {
"HobbyBoards_EF": [ "HobbyBoards_EF": (
{ OneWireSensorEntityDescription(
"path": "humidity/humidity_corrected", key="humidity/humidity_corrected",
"name": "Humidity", device_class=DEVICE_CLASS_HUMIDITY,
"type": SENSOR_TYPE_HUMIDITY, name="Humidity",
}, native_unit_of_measurement=PERCENTAGE,
{ read_mode=READ_MODE_FLOAT,
"path": "humidity/humidity_raw", state_class=STATE_CLASS_MEASUREMENT,
"name": "Humidity Raw", ),
"type": SENSOR_TYPE_HUMIDITY, OneWireSensorEntityDescription(
}, key="humidity/humidity_raw",
{ device_class=DEVICE_CLASS_HUMIDITY,
"path": "humidity/temperature", name="Humidity Raw",
"name": "Temperature", native_unit_of_measurement=PERCENTAGE,
"type": SENSOR_TYPE_TEMPERATURE, read_mode=READ_MODE_FLOAT,
}, state_class=STATE_CLASS_MEASUREMENT,
], ),
"HB_MOISTURE_METER": [ OneWireSensorEntityDescription(
{ key="humidity/temperature",
"path": "moisture/sensor.0", device_class=DEVICE_CLASS_TEMPERATURE,
"name": "Moisture 0", name="Temperature",
"type": SENSOR_TYPE_MOISTURE, native_unit_of_measurement=TEMP_CELSIUS,
}, read_mode=READ_MODE_FLOAT,
{ state_class=STATE_CLASS_MEASUREMENT,
"path": "moisture/sensor.1", ),
"name": "Moisture 1", ),
"type": SENSOR_TYPE_MOISTURE, "HB_MOISTURE_METER": (
}, OneWireSensorEntityDescription(
{ key="moisture/sensor.0",
"path": "moisture/sensor.2", device_class=DEVICE_CLASS_PRESSURE,
"name": "Moisture 2", name="Moisture 0",
"type": SENSOR_TYPE_MOISTURE, native_unit_of_measurement=PRESSURE_CBAR,
}, read_mode=READ_MODE_FLOAT,
{ state_class=STATE_CLASS_MEASUREMENT,
"path": "moisture/sensor.3", ),
"name": "Moisture 3", OneWireSensorEntityDescription(
"type": SENSOR_TYPE_MOISTURE, key="moisture/sensor.1",
}, device_class=DEVICE_CLASS_PRESSURE,
], name="Moisture 1",
native_unit_of_measurement=PRESSURE_CBAR,
read_mode=READ_MODE_FLOAT,
state_class=STATE_CLASS_MEASUREMENT,
),
OneWireSensorEntityDescription(
key="moisture/sensor.2",
device_class=DEVICE_CLASS_PRESSURE,
name="Moisture 2",
native_unit_of_measurement=PRESSURE_CBAR,
read_mode=READ_MODE_FLOAT,
state_class=STATE_CLASS_MEASUREMENT,
),
OneWireSensorEntityDescription(
key="moisture/sensor.3",
device_class=DEVICE_CLASS_PRESSURE,
name="Moisture 3",
native_unit_of_measurement=PRESSURE_CBAR,
read_mode=READ_MODE_FLOAT,
state_class=STATE_CLASS_MEASUREMENT,
),
),
} }
# 7E sensors are special sensors by Embedded Data Systems # 7E sensors are special sensors by Embedded Data Systems
EDS_SENSORS: dict[str, list[DeviceComponentDescription]] = { EDS_SENSORS: dict[str, tuple[OneWireSensorEntityDescription, ...]] = {
"EDS0066": [ "EDS0066": (
{ OneWireSensorEntityDescription(
"path": "EDS0066/temperature", key="EDS0066/temperature",
"name": "Temperature", device_class=DEVICE_CLASS_TEMPERATURE,
"type": SENSOR_TYPE_TEMPERATURE, name="Temperature",
}, native_unit_of_measurement=TEMP_CELSIUS,
{ read_mode=READ_MODE_FLOAT,
"path": "EDS0066/pressure", state_class=STATE_CLASS_MEASUREMENT,
"name": "Pressure", ),
"type": SENSOR_TYPE_PRESSURE, OneWireSensorEntityDescription(
}, key="EDS0066/pressure",
], device_class=DEVICE_CLASS_PRESSURE,
"EDS0068": [ name="Pressure",
{ native_unit_of_measurement=PRESSURE_MBAR,
"path": "EDS0068/temperature", read_mode=READ_MODE_FLOAT,
"name": "Temperature", state_class=STATE_CLASS_MEASUREMENT,
"type": SENSOR_TYPE_TEMPERATURE, ),
}, ),
{ "EDS0068": (
"path": "EDS0068/pressure", OneWireSensorEntityDescription(
"name": "Pressure", key="EDS0068/temperature",
"type": SENSOR_TYPE_PRESSURE, device_class=DEVICE_CLASS_TEMPERATURE,
}, name="Temperature",
{ native_unit_of_measurement=TEMP_CELSIUS,
"path": "EDS0068/light", read_mode=READ_MODE_FLOAT,
"name": "Illuminance", state_class=STATE_CLASS_MEASUREMENT,
"type": SENSOR_TYPE_ILLUMINANCE, ),
}, OneWireSensorEntityDescription(
{ key="EDS0068/pressure",
"path": "EDS0068/humidity", device_class=DEVICE_CLASS_PRESSURE,
"name": "Humidity", name="Pressure",
"type": SENSOR_TYPE_HUMIDITY, native_unit_of_measurement=PRESSURE_MBAR,
}, read_mode=READ_MODE_FLOAT,
], state_class=STATE_CLASS_MEASUREMENT,
),
OneWireSensorEntityDescription(
key="EDS0068/light",
device_class=DEVICE_CLASS_ILLUMINANCE,
name="Illuminance",
native_unit_of_measurement=LIGHT_LUX,
read_mode=READ_MODE_FLOAT,
state_class=STATE_CLASS_MEASUREMENT,
),
OneWireSensorEntityDescription(
key="EDS0068/humidity",
device_class=DEVICE_CLASS_HUMIDITY,
name="Humidity",
native_unit_of_measurement=PERCENTAGE,
read_mode=READ_MODE_FLOAT,
state_class=STATE_CLASS_MEASUREMENT,
),
),
} }
@ -259,12 +367,12 @@ async def async_setup_entry(
def get_entities( def get_entities(
onewirehub: OneWireHub, config: MappingProxyType[str, Any] onewirehub: OneWireHub, config: MappingProxyType[str, Any]
) -> list[OneWireBaseEntity]: ) -> list[SensorEntity]:
"""Get a list of entities.""" """Get a list of entities."""
if not onewirehub.devices: if not onewirehub.devices:
return [] return []
entities: list[OneWireBaseEntity] = [] entities: list[SensorEntity] = []
device_names = {} device_names = {}
if CONF_NAMES in config and isinstance(config[CONF_NAMES], dict): if CONF_NAMES in config and isinstance(config[CONF_NAMES], dict):
device_names = config[CONF_NAMES] device_names = config[CONF_NAMES]
@ -299,27 +407,30 @@ def get_entities(
ATTR_MODEL: device_type, ATTR_MODEL: device_type,
ATTR_NAME: device_id, ATTR_NAME: device_id,
} }
for entity_specs in get_sensor_types(device_sub_type)[family]: for description in get_sensor_types(device_sub_type)[family]:
if entity_specs["type"] == SENSOR_TYPE_MOISTURE: if description.key.startswith("moisture/"):
s_id = entity_specs["path"].split(".")[1] s_id = description.key.split(".")[1]
is_leaf = int( is_leaf = int(
onewirehub.owproxy.read( onewirehub.owproxy.read(
f"{device_path}moisture/is_leaf.{s_id}" f"{device_path}moisture/is_leaf.{s_id}"
).decode() ).decode()
) )
if is_leaf: if is_leaf:
entity_specs["type"] = SENSOR_TYPE_WETNESS description = copy.deepcopy(description)
entity_specs["name"] = f"Wetness {s_id}" description.device_class = DEVICE_CLASS_HUMIDITY
entity_path = os.path.join( description.native_unit_of_measurement = PERCENTAGE
os.path.split(device_path)[0], entity_specs["path"] description.name = f"Wetness {s_id}"
device_file = os.path.join(
os.path.split(device["path"])[0], description.key
) )
name = f"{device_names.get(device_id, device_id)} {description.name}"
entities.append( entities.append(
OneWireProxySensor( OneWireProxySensor(
description=description,
device_id=device_id, device_id=device_id,
device_name=device_names.get(device_id, device_id), device_file=device_file,
device_info=device_info, device_info=device_info,
entity_path=entity_path, name=name,
entity_specs=entity_specs,
owproxy=onewirehub.owproxy, owproxy=onewirehub.owproxy,
) )
) )
@ -330,28 +441,32 @@ def get_entities(
_LOGGER.debug("Initializing using SysBus %s", base_dir) _LOGGER.debug("Initializing using SysBus %s", base_dir)
for p1sensor in onewirehub.devices: for p1sensor in onewirehub.devices:
family = p1sensor.mac_address[:2] family = p1sensor.mac_address[:2]
sensor_id = f"{family}-{p1sensor.mac_address[2:]}" device_id = f"{family}-{p1sensor.mac_address[2:]}"
if family not in DEVICE_SUPPORT_SYSBUS: if family not in DEVICE_SUPPORT_SYSBUS:
_LOGGER.warning( _LOGGER.warning(
"Ignoring unknown family (%s) of sensor found for device: %s", "Ignoring unknown family (%s) of sensor found for device: %s",
family, family,
sensor_id, device_id,
) )
continue continue
device_info = { device_info = {
ATTR_IDENTIFIERS: {(DOMAIN, sensor_id)}, ATTR_IDENTIFIERS: {(DOMAIN, device_id)},
ATTR_MANUFACTURER: "Maxim Integrated", ATTR_MANUFACTURER: "Maxim Integrated",
ATTR_MODEL: family, ATTR_MODEL: family,
ATTR_NAME: sensor_id, ATTR_NAME: device_id,
} }
device_file = f"/sys/bus/w1/devices/{sensor_id}/w1_slave" description = SIMPLE_TEMPERATURE_SENSOR_DESCRIPTION
device_file = f"/sys/bus/w1/devices/{device_id}/w1_slave"
name = f"{device_names.get(device_id, device_id)} {description.name}"
entities.append( entities.append(
OneWireDirectSensor( OneWireDirectSensor(
device_names.get(sensor_id, sensor_id), description=description,
device_file, device_id=device_id,
device_info, device_file=device_file,
p1sensor, device_info=device_info,
name=name,
owsensor=p1sensor,
) )
) )
if not entities: if not entities:
@ -367,15 +482,14 @@ def get_entities(
class OneWireSensor(OneWireBaseEntity, SensorEntity): class OneWireSensor(OneWireBaseEntity, SensorEntity):
"""Mixin for sensor specific attributes.""" """Mixin for sensor specific attributes."""
@property entity_description: OneWireSensorEntityDescription
def native_unit_of_measurement(self) -> str | None:
"""Return the unit the value is expressed in."""
return self._unit_of_measurement
class OneWireProxySensor(OneWireProxyEntity, OneWireSensor): class OneWireProxySensor(OneWireProxyEntity, OneWireSensor):
"""Implementation of a 1-Wire sensor connected through owserver.""" """Implementation of a 1-Wire sensor connected through owserver."""
entity_description: OneWireSensorEntityDescription
@property @property
def native_value(self) -> StateType: def native_value(self) -> StateType:
"""Return the state of the entity.""" """Return the state of the entity."""
@ -387,21 +501,22 @@ class OneWireDirectSensor(OneWireSensor):
def __init__( def __init__(
self, self,
name: str, description: OneWireSensorEntityDescription,
device_file: str, device_id: str,
device_info: DeviceInfo, device_info: DeviceInfo,
device_file: str,
name: str,
owsensor: OneWireInterface, owsensor: OneWireInterface,
) -> None: ) -> None:
"""Initialize the sensor.""" """Initialize the sensor."""
super().__init__( super().__init__(
name, description=description,
device_file, device_id=device_id,
"temperature", device_info=device_info,
"Temperature", device_file=device_file,
device_info, name=name,
False,
device_file,
) )
self._attr_unique_id = device_file
self._owsensor = owsensor self._owsensor = owsensor
@property @property
@ -439,5 +554,9 @@ class OneWireDirectSensor(OneWireSensor):
InvalidCRCException, InvalidCRCException,
UnsupportResponseException, UnsupportResponseException,
) as ex: ) as ex:
_LOGGER.warning("Cannot read from sensor %s: %s", self._device_file, ex) _LOGGER.warning(
"Cannot read from sensor %s: %s",
self._device_file,
ex,
)
self._state = None self._state = None

View File

@ -1,11 +1,12 @@
"""Support for 1-Wire environment switches.""" """Support for 1-Wire environment switches."""
from __future__ import annotations from __future__ import annotations
from dataclasses import dataclass
import logging import logging
import os import os
from typing import Any from typing import Any
from homeassistant.components.switch import SwitchEntity from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ( from homeassistant.const import (
ATTR_IDENTIFIERS, ATTR_IDENTIFIERS,
@ -18,145 +19,149 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import CONF_TYPE_OWSERVER, DOMAIN, SWITCH_TYPE_LATCH, SWITCH_TYPE_PIO from .const import CONF_TYPE_OWSERVER, DOMAIN, READ_MODE_BOOL
from .model import DeviceComponentDescription from .onewire_entities import OneWireEntityDescription, OneWireProxyEntity
from .onewire_entities import OneWireBaseEntity, OneWireProxyEntity
from .onewirehub import OneWireHub from .onewirehub import OneWireHub
DEVICE_SWITCHES: dict[str, list[DeviceComponentDescription]] = {
# Family : { owfs path } @dataclass
"05": [ class OneWireSwitchEntityDescription(OneWireEntityDescription, SwitchEntityDescription):
{ """Class describing OneWire switch entities."""
"path": "PIO",
"name": "PIO",
"type": SWITCH_TYPE_PIO, DEVICE_SWITCHES: dict[str, tuple[OneWireEntityDescription, ...]] = {
"default_disabled": True, "05": (
}, OneWireSwitchEntityDescription(
], key="PIO",
"12": [ entity_registry_enabled_default=False,
{ name="PIO",
"path": "PIO.A", read_mode=READ_MODE_BOOL,
"name": "PIO A", ),
"type": SWITCH_TYPE_PIO, ),
"default_disabled": True, "12": (
}, OneWireSwitchEntityDescription(
{ key="PIO.A",
"path": "PIO.B", entity_registry_enabled_default=False,
"name": "PIO B", name="PIO A",
"type": SWITCH_TYPE_PIO, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="PIO.B",
"path": "latch.A", entity_registry_enabled_default=False,
"name": "Latch A", name="PIO B",
"type": SWITCH_TYPE_LATCH, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="latch.A",
"path": "latch.B", entity_registry_enabled_default=False,
"name": "Latch B", name="Latch A",
"type": SWITCH_TYPE_LATCH, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
], key="latch.B",
"29": [ entity_registry_enabled_default=False,
{ name="Latch B",
"path": "PIO.0", read_mode=READ_MODE_BOOL,
"name": "PIO 0", ),
"type": SWITCH_TYPE_PIO, ),
"default_disabled": True, "29": (
}, OneWireSwitchEntityDescription(
{ key="PIO.0",
"path": "PIO.1", entity_registry_enabled_default=False,
"name": "PIO 1", name="PIO 0",
"type": SWITCH_TYPE_PIO, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="PIO.1",
"path": "PIO.2", entity_registry_enabled_default=False,
"name": "PIO 2", name="PIO 1",
"type": SWITCH_TYPE_PIO, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="PIO.2",
"path": "PIO.3", entity_registry_enabled_default=False,
"name": "PIO 3", name="PIO 2",
"type": SWITCH_TYPE_PIO, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="PIO.3",
"path": "PIO.4", entity_registry_enabled_default=False,
"name": "PIO 4", name="PIO 3",
"type": SWITCH_TYPE_PIO, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="PIO.4",
"path": "PIO.5", entity_registry_enabled_default=False,
"name": "PIO 5", name="PIO 4",
"type": SWITCH_TYPE_PIO, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="PIO.5",
"path": "PIO.6", entity_registry_enabled_default=False,
"name": "PIO 6", name="PIO 5",
"type": SWITCH_TYPE_PIO, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="PIO.6",
"path": "PIO.7", entity_registry_enabled_default=False,
"name": "PIO 7", name="PIO 6",
"type": SWITCH_TYPE_PIO, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="PIO.7",
"path": "latch.0", entity_registry_enabled_default=False,
"name": "Latch 0", name="PIO 7",
"type": SWITCH_TYPE_LATCH, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="latch.0",
"path": "latch.1", entity_registry_enabled_default=False,
"name": "Latch 1", name="Latch 0",
"type": SWITCH_TYPE_LATCH, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="latch.1",
"path": "latch.2", entity_registry_enabled_default=False,
"name": "Latch 2", name="Latch 1",
"type": SWITCH_TYPE_LATCH, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="latch.2",
"path": "latch.3", entity_registry_enabled_default=False,
"name": "Latch 3", name="Latch 2",
"type": SWITCH_TYPE_LATCH, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="latch.3",
"path": "latch.4", entity_registry_enabled_default=False,
"name": "Latch 4", name="Latch 3",
"type": SWITCH_TYPE_LATCH, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="latch.4",
"path": "latch.5", entity_registry_enabled_default=False,
"name": "Latch 5", name="Latch 4",
"type": SWITCH_TYPE_LATCH, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="latch.5",
"path": "latch.6", entity_registry_enabled_default=False,
"name": "Latch 6", name="Latch 5",
"type": SWITCH_TYPE_LATCH, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
{ key="latch.6",
"path": "latch.7", entity_registry_enabled_default=False,
"name": "Latch 7", name="Latch 6",
"type": SWITCH_TYPE_LATCH, read_mode=READ_MODE_BOOL,
"default_disabled": True, ),
}, OneWireSwitchEntityDescription(
], key="latch.7",
entity_registry_enabled_default=False,
name="Latch 7",
read_mode=READ_MODE_BOOL,
),
),
} }
LOGGER = logging.getLogger(__name__) LOGGER = logging.getLogger(__name__)
@ -176,12 +181,12 @@ async def async_setup_entry(
async_add_entities(entities, True) async_add_entities(entities, True)
def get_entities(onewirehub: OneWireHub) -> list[OneWireBaseEntity]: def get_entities(onewirehub: OneWireHub) -> list[SwitchEntity]:
"""Get a list of entities.""" """Get a list of entities."""
if not onewirehub.devices: if not onewirehub.devices:
return [] return []
entities: list[OneWireBaseEntity] = [] entities: list[SwitchEntity] = []
for device in onewirehub.devices: for device in onewirehub.devices:
family = device["family"] family = device["family"]
@ -197,17 +202,18 @@ def get_entities(onewirehub: OneWireHub) -> list[OneWireBaseEntity]:
ATTR_MODEL: device_type, ATTR_MODEL: device_type,
ATTR_NAME: device_id, ATTR_NAME: device_id,
} }
for entity_specs in DEVICE_SWITCHES[family]: for description in DEVICE_SWITCHES[family]:
entity_path = os.path.join( device_file = os.path.join(
os.path.split(device["path"])[0], entity_specs["path"] os.path.split(device["path"])[0], description.key
) )
name = f"{device_id} {description.name}"
entities.append( entities.append(
OneWireProxySwitch( OneWireProxySwitch(
description=description,
device_id=device_id, device_id=device_id,
device_name=device_id, device_file=device_file,
device_info=device_info, device_info=device_info,
entity_path=entity_path, name=name,
entity_specs=entity_specs,
owproxy=onewirehub.owproxy, owproxy=onewirehub.owproxy,
) )
) )
@ -218,6 +224,8 @@ def get_entities(onewirehub: OneWireHub) -> list[OneWireBaseEntity]:
class OneWireProxySwitch(OneWireProxyEntity, SwitchEntity): class OneWireProxySwitch(OneWireProxyEntity, SwitchEntity):
"""Implementation of a 1-Wire switch.""" """Implementation of a 1-Wire switch."""
entity_description: OneWireSwitchEntityDescription
@property @property
def is_on(self) -> bool: def is_on(self) -> bool:
"""Return true if sensor is on.""" """Return true if sensor is on."""

View File

@ -5,13 +5,20 @@ from pyownet.protocol import Error as ProtocolError
from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN
from homeassistant.components.onewire.const import DOMAIN, PRESSURE_CBAR from homeassistant.components.onewire.const import DOMAIN, PRESSURE_CBAR
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.components.sensor import (
ATTR_STATE_CLASS,
DOMAIN as SENSOR_DOMAIN,
STATE_CLASS_MEASUREMENT,
STATE_CLASS_TOTAL_INCREASING,
)
from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN
from homeassistant.const import ( from homeassistant.const import (
ATTR_DEVICE_CLASS,
ATTR_IDENTIFIERS, ATTR_IDENTIFIERS,
ATTR_MANUFACTURER, ATTR_MANUFACTURER,
ATTR_MODEL, ATTR_MODEL,
ATTR_NAME, ATTR_NAME,
ATTR_UNIT_OF_MEASUREMENT,
DEVICE_CLASS_CURRENT, DEVICE_CLASS_CURRENT,
DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_ILLUMINANCE, DEVICE_CLASS_ILLUMINANCE,
@ -53,8 +60,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/05.111111111111/PIO", "unique_id": "/05.111111111111/PIO",
"injected_value": b" 1", "injected_value": b" 1",
"result": STATE_ON, "result": STATE_ON,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
], ],
@ -75,8 +82,9 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/10.111111111111/temperature", "unique_id": "/10.111111111111/temperature",
"injected_value": b" 25.123", "injected_value": b" 25.123",
"result": "25.1", "result": "25.1",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -96,8 +104,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/12.111111111111/sensed.A", "unique_id": "/12.111111111111/sensed.A",
"injected_value": b" 1", "injected_value": b" 1",
"result": STATE_ON, "result": STATE_ON,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -105,8 +113,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/12.111111111111/sensed.B", "unique_id": "/12.111111111111/sensed.B",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
], ],
@ -116,18 +124,20 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/12.111111111111/TAI8570/temperature", "unique_id": "/12.111111111111/TAI8570/temperature",
"injected_value": b" 25.123", "injected_value": b" 25.123",
"result": "25.1", "result": "25.1",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
"disabled": True, "disabled": True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.12_111111111111_pressure", "entity_id": "sensor.12_111111111111_pressure",
"unique_id": "/12.111111111111/TAI8570/pressure", "unique_id": "/12.111111111111/TAI8570/pressure",
"injected_value": b" 1025.123", "injected_value": b" 1025.123",
"result": "1025.1", "result": "1025.1",
"unit": PRESSURE_MBAR, ATTR_UNIT_OF_MEASUREMENT: PRESSURE_MBAR,
"class": DEVICE_CLASS_PRESSURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_PRESSURE,
"disabled": True, "disabled": True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
SWITCH_DOMAIN: [ SWITCH_DOMAIN: [
@ -136,8 +146,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/12.111111111111/PIO.A", "unique_id": "/12.111111111111/PIO.A",
"injected_value": b" 1", "injected_value": b" 1",
"result": STATE_ON, "result": STATE_ON,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -145,8 +155,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/12.111111111111/PIO.B", "unique_id": "/12.111111111111/PIO.B",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -154,8 +164,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/12.111111111111/latch.A", "unique_id": "/12.111111111111/latch.A",
"injected_value": b" 1", "injected_value": b" 1",
"result": STATE_ON, "result": STATE_ON,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -163,8 +173,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/12.111111111111/latch.B", "unique_id": "/12.111111111111/latch.B",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
], ],
@ -185,16 +195,18 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/1D.111111111111/counter.A", "unique_id": "/1D.111111111111/counter.A",
"injected_value": b" 251123", "injected_value": b" 251123",
"result": "251123", "result": "251123",
"unit": "count", ATTR_UNIT_OF_MEASUREMENT: "count",
"class": None, ATTR_DEVICE_CLASS: None,
ATTR_STATE_CLASS: STATE_CLASS_TOTAL_INCREASING,
}, },
{ {
"entity_id": "sensor.1d_111111111111_counter_b", "entity_id": "sensor.1d_111111111111_counter_b",
"unique_id": "/1D.111111111111/counter.B", "unique_id": "/1D.111111111111/counter.B",
"injected_value": b" 248125", "injected_value": b" 248125",
"result": "248125", "result": "248125",
"unit": "count", ATTR_UNIT_OF_MEASUREMENT: "count",
"class": None, ATTR_DEVICE_CLASS: None,
ATTR_STATE_CLASS: STATE_CLASS_TOTAL_INCREASING,
}, },
], ],
}, },
@ -228,8 +240,9 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/1D.111111111111/counter.A", "unique_id": "/1D.111111111111/counter.A",
"injected_value": b" 251123", "injected_value": b" 251123",
"result": "251123", "result": "251123",
"unit": "count", ATTR_UNIT_OF_MEASUREMENT: "count",
"class": None, ATTR_DEVICE_CLASS: None,
ATTR_STATE_CLASS: STATE_CLASS_TOTAL_INCREASING,
}, },
{ {
"entity_id": "sensor.1d_111111111111_counter_b", "entity_id": "sensor.1d_111111111111_counter_b",
@ -237,8 +250,9 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/1D.111111111111/counter.B", "unique_id": "/1D.111111111111/counter.B",
"injected_value": b" 248125", "injected_value": b" 248125",
"result": "248125", "result": "248125",
"unit": "count", ATTR_UNIT_OF_MEASUREMENT: "count",
"class": None, ATTR_DEVICE_CLASS: None,
ATTR_STATE_CLASS: STATE_CLASS_TOTAL_INCREASING,
}, },
], ],
}, },
@ -261,8 +275,9 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/22.111111111111/temperature", "unique_id": "/22.111111111111/temperature",
"injected_value": ProtocolError, "injected_value": ProtocolError,
"result": "unknown", "result": "unknown",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -282,98 +297,109 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/26.111111111111/temperature", "unique_id": "/26.111111111111/temperature",
"injected_value": b" 25.123", "injected_value": b" 25.123",
"result": "25.1", "result": "25.1",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.26_111111111111_humidity", "entity_id": "sensor.26_111111111111_humidity",
"unique_id": "/26.111111111111/humidity", "unique_id": "/26.111111111111/humidity",
"injected_value": b" 72.7563", "injected_value": b" 72.7563",
"result": "72.8", "result": "72.8",
"unit": PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
"class": DEVICE_CLASS_HUMIDITY, ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
"disabled": True, "disabled": True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.26_111111111111_humidity_hih3600", "entity_id": "sensor.26_111111111111_humidity_hih3600",
"unique_id": "/26.111111111111/HIH3600/humidity", "unique_id": "/26.111111111111/HIH3600/humidity",
"injected_value": b" 73.7563", "injected_value": b" 73.7563",
"result": "73.8", "result": "73.8",
"unit": PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
"class": DEVICE_CLASS_HUMIDITY, ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
"disabled": True, "disabled": True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.26_111111111111_humidity_hih4000", "entity_id": "sensor.26_111111111111_humidity_hih4000",
"unique_id": "/26.111111111111/HIH4000/humidity", "unique_id": "/26.111111111111/HIH4000/humidity",
"injected_value": b" 74.7563", "injected_value": b" 74.7563",
"result": "74.8", "result": "74.8",
"unit": PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
"class": DEVICE_CLASS_HUMIDITY, ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
"disabled": True, "disabled": True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.26_111111111111_humidity_hih5030", "entity_id": "sensor.26_111111111111_humidity_hih5030",
"unique_id": "/26.111111111111/HIH5030/humidity", "unique_id": "/26.111111111111/HIH5030/humidity",
"injected_value": b" 75.7563", "injected_value": b" 75.7563",
"result": "75.8", "result": "75.8",
"unit": PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
"class": DEVICE_CLASS_HUMIDITY, ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
"disabled": True, "disabled": True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.26_111111111111_humidity_htm1735", "entity_id": "sensor.26_111111111111_humidity_htm1735",
"unique_id": "/26.111111111111/HTM1735/humidity", "unique_id": "/26.111111111111/HTM1735/humidity",
"injected_value": ProtocolError, "injected_value": ProtocolError,
"result": "unknown", "result": "unknown",
"unit": PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
"class": DEVICE_CLASS_HUMIDITY, ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
"disabled": True, "disabled": True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.26_111111111111_pressure", "entity_id": "sensor.26_111111111111_pressure",
"unique_id": "/26.111111111111/B1-R1-A/pressure", "unique_id": "/26.111111111111/B1-R1-A/pressure",
"injected_value": b" 969.265", "injected_value": b" 969.265",
"result": "969.3", "result": "969.3",
"unit": PRESSURE_MBAR, ATTR_UNIT_OF_MEASUREMENT: PRESSURE_MBAR,
"class": DEVICE_CLASS_PRESSURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_PRESSURE,
"disabled": True, "disabled": True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.26_111111111111_illuminance", "entity_id": "sensor.26_111111111111_illuminance",
"unique_id": "/26.111111111111/S3-R1-A/illuminance", "unique_id": "/26.111111111111/S3-R1-A/illuminance",
"injected_value": b" 65.8839", "injected_value": b" 65.8839",
"result": "65.9", "result": "65.9",
"unit": LIGHT_LUX, ATTR_UNIT_OF_MEASUREMENT: LIGHT_LUX,
"class": DEVICE_CLASS_ILLUMINANCE, ATTR_DEVICE_CLASS: DEVICE_CLASS_ILLUMINANCE,
"disabled": True, "disabled": True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.26_111111111111_voltage_vad", "entity_id": "sensor.26_111111111111_voltage_vad",
"unique_id": "/26.111111111111/VAD", "unique_id": "/26.111111111111/VAD",
"injected_value": b" 2.97", "injected_value": b" 2.97",
"result": "3.0", "result": "3.0",
"unit": ELECTRIC_POTENTIAL_VOLT, ATTR_UNIT_OF_MEASUREMENT: ELECTRIC_POTENTIAL_VOLT,
"class": DEVICE_CLASS_VOLTAGE, ATTR_DEVICE_CLASS: DEVICE_CLASS_VOLTAGE,
"disabled": True, "disabled": True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.26_111111111111_voltage_vdd", "entity_id": "sensor.26_111111111111_voltage_vdd",
"unique_id": "/26.111111111111/VDD", "unique_id": "/26.111111111111/VDD",
"injected_value": b" 4.74", "injected_value": b" 4.74",
"result": "4.7", "result": "4.7",
"unit": ELECTRIC_POTENTIAL_VOLT, ATTR_UNIT_OF_MEASUREMENT: ELECTRIC_POTENTIAL_VOLT,
"class": DEVICE_CLASS_VOLTAGE, ATTR_DEVICE_CLASS: DEVICE_CLASS_VOLTAGE,
"disabled": True, "disabled": True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.26_111111111111_current", "entity_id": "sensor.26_111111111111_current",
"unique_id": "/26.111111111111/IAD", "unique_id": "/26.111111111111/IAD",
"injected_value": b" 1", "injected_value": b" 1",
"result": "1.0", "result": "1.0",
"unit": ELECTRIC_CURRENT_AMPERE, ATTR_UNIT_OF_MEASUREMENT: ELECTRIC_CURRENT_AMPERE,
"class": DEVICE_CLASS_CURRENT, ATTR_DEVICE_CLASS: DEVICE_CLASS_CURRENT,
"disabled": True, "disabled": True,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -393,8 +419,9 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/28.111111111111/temperature", "unique_id": "/28.111111111111/temperature",
"injected_value": b" 26.984", "injected_value": b" 26.984",
"result": "27.0", "result": "27.0",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -414,8 +441,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/sensed.0", "unique_id": "/29.111111111111/sensed.0",
"injected_value": b" 1", "injected_value": b" 1",
"result": STATE_ON, "result": STATE_ON,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -423,8 +450,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/sensed.1", "unique_id": "/29.111111111111/sensed.1",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -432,8 +459,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/sensed.2", "unique_id": "/29.111111111111/sensed.2",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -441,8 +468,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/sensed.3", "unique_id": "/29.111111111111/sensed.3",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -450,8 +477,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/sensed.4", "unique_id": "/29.111111111111/sensed.4",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -459,8 +486,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/sensed.5", "unique_id": "/29.111111111111/sensed.5",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -468,8 +495,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/sensed.6", "unique_id": "/29.111111111111/sensed.6",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -477,8 +504,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/sensed.7", "unique_id": "/29.111111111111/sensed.7",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
], ],
@ -488,8 +515,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/PIO.0", "unique_id": "/29.111111111111/PIO.0",
"injected_value": b" 1", "injected_value": b" 1",
"result": STATE_ON, "result": STATE_ON,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -497,8 +524,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/PIO.1", "unique_id": "/29.111111111111/PIO.1",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -506,8 +533,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/PIO.2", "unique_id": "/29.111111111111/PIO.2",
"injected_value": b" 1", "injected_value": b" 1",
"result": STATE_ON, "result": STATE_ON,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -515,8 +542,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/PIO.3", "unique_id": "/29.111111111111/PIO.3",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -524,8 +551,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/PIO.4", "unique_id": "/29.111111111111/PIO.4",
"injected_value": b" 1", "injected_value": b" 1",
"result": STATE_ON, "result": STATE_ON,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -533,8 +560,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/PIO.5", "unique_id": "/29.111111111111/PIO.5",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -542,8 +569,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/PIO.6", "unique_id": "/29.111111111111/PIO.6",
"injected_value": b" 1", "injected_value": b" 1",
"result": STATE_ON, "result": STATE_ON,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -551,8 +578,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/PIO.7", "unique_id": "/29.111111111111/PIO.7",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -560,8 +587,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/latch.0", "unique_id": "/29.111111111111/latch.0",
"injected_value": b" 1", "injected_value": b" 1",
"result": STATE_ON, "result": STATE_ON,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -569,8 +596,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/latch.1", "unique_id": "/29.111111111111/latch.1",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -578,8 +605,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/latch.2", "unique_id": "/29.111111111111/latch.2",
"injected_value": b" 1", "injected_value": b" 1",
"result": STATE_ON, "result": STATE_ON,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -587,8 +614,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/latch.3", "unique_id": "/29.111111111111/latch.3",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -596,8 +623,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/latch.4", "unique_id": "/29.111111111111/latch.4",
"injected_value": b" 1", "injected_value": b" 1",
"result": STATE_ON, "result": STATE_ON,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -605,8 +632,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/latch.5", "unique_id": "/29.111111111111/latch.5",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -614,8 +641,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/latch.6", "unique_id": "/29.111111111111/latch.6",
"injected_value": b" 1", "injected_value": b" 1",
"result": STATE_ON, "result": STATE_ON,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
{ {
@ -623,8 +650,8 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/29.111111111111/latch.7", "unique_id": "/29.111111111111/latch.7",
"injected_value": b" 0", "injected_value": b" 0",
"result": STATE_OFF, "result": STATE_OFF,
"unit": None, ATTR_UNIT_OF_MEASUREMENT: None,
"class": None, ATTR_DEVICE_CLASS: None,
"disabled": True, "disabled": True,
}, },
], ],
@ -645,8 +672,9 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/3B.111111111111/temperature", "unique_id": "/3B.111111111111/temperature",
"injected_value": b" 28.243", "injected_value": b" 28.243",
"result": "28.2", "result": "28.2",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -666,8 +694,9 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/42.111111111111/temperature", "unique_id": "/42.111111111111/temperature",
"injected_value": b" 29.123", "injected_value": b" 29.123",
"result": "29.1", "result": "29.1",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -687,24 +716,27 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/EF.111111111111/humidity/humidity_corrected", "unique_id": "/EF.111111111111/humidity/humidity_corrected",
"injected_value": b" 67.745", "injected_value": b" 67.745",
"result": "67.7", "result": "67.7",
"unit": PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
"class": DEVICE_CLASS_HUMIDITY, ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.ef_111111111111_humidity_raw", "entity_id": "sensor.ef_111111111111_humidity_raw",
"unique_id": "/EF.111111111111/humidity/humidity_raw", "unique_id": "/EF.111111111111/humidity/humidity_raw",
"injected_value": b" 65.541", "injected_value": b" 65.541",
"result": "65.5", "result": "65.5",
"unit": PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
"class": DEVICE_CLASS_HUMIDITY, ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.ef_111111111111_temperature", "entity_id": "sensor.ef_111111111111_temperature",
"unique_id": "/EF.111111111111/humidity/temperature", "unique_id": "/EF.111111111111/humidity/temperature",
"injected_value": b" 25.123", "injected_value": b" 25.123",
"result": "25.1", "result": "25.1",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -728,32 +760,36 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/EF.111111111112/moisture/sensor.0", "unique_id": "/EF.111111111112/moisture/sensor.0",
"injected_value": b" 41.745", "injected_value": b" 41.745",
"result": "41.7", "result": "41.7",
"unit": PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
"class": DEVICE_CLASS_HUMIDITY, ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.ef_111111111112_wetness_1", "entity_id": "sensor.ef_111111111112_wetness_1",
"unique_id": "/EF.111111111112/moisture/sensor.1", "unique_id": "/EF.111111111112/moisture/sensor.1",
"injected_value": b" 42.541", "injected_value": b" 42.541",
"result": "42.5", "result": "42.5",
"unit": PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
"class": DEVICE_CLASS_HUMIDITY, ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.ef_111111111112_moisture_2", "entity_id": "sensor.ef_111111111112_moisture_2",
"unique_id": "/EF.111111111112/moisture/sensor.2", "unique_id": "/EF.111111111112/moisture/sensor.2",
"injected_value": b" 43.123", "injected_value": b" 43.123",
"result": "43.1", "result": "43.1",
"unit": PRESSURE_CBAR, ATTR_UNIT_OF_MEASUREMENT: PRESSURE_CBAR,
"class": DEVICE_CLASS_PRESSURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_PRESSURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.ef_111111111112_moisture_3", "entity_id": "sensor.ef_111111111112_moisture_3",
"unique_id": "/EF.111111111112/moisture/sensor.3", "unique_id": "/EF.111111111112/moisture/sensor.3",
"injected_value": b" 44.123", "injected_value": b" 44.123",
"result": "44.1", "result": "44.1",
"unit": PRESSURE_CBAR, ATTR_UNIT_OF_MEASUREMENT: PRESSURE_CBAR,
"class": DEVICE_CLASS_PRESSURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_PRESSURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -774,32 +810,36 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/7E.111111111111/EDS0068/temperature", "unique_id": "/7E.111111111111/EDS0068/temperature",
"injected_value": b" 13.9375", "injected_value": b" 13.9375",
"result": "13.9", "result": "13.9",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.7e_111111111111_pressure", "entity_id": "sensor.7e_111111111111_pressure",
"unique_id": "/7E.111111111111/EDS0068/pressure", "unique_id": "/7E.111111111111/EDS0068/pressure",
"injected_value": b" 1012.21", "injected_value": b" 1012.21",
"result": "1012.2", "result": "1012.2",
"unit": PRESSURE_MBAR, ATTR_UNIT_OF_MEASUREMENT: PRESSURE_MBAR,
"class": DEVICE_CLASS_PRESSURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_PRESSURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.7e_111111111111_illuminance", "entity_id": "sensor.7e_111111111111_illuminance",
"unique_id": "/7E.111111111111/EDS0068/light", "unique_id": "/7E.111111111111/EDS0068/light",
"injected_value": b" 65.8839", "injected_value": b" 65.8839",
"result": "65.9", "result": "65.9",
"unit": LIGHT_LUX, ATTR_UNIT_OF_MEASUREMENT: LIGHT_LUX,
"class": DEVICE_CLASS_ILLUMINANCE, ATTR_DEVICE_CLASS: DEVICE_CLASS_ILLUMINANCE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.7e_111111111111_humidity", "entity_id": "sensor.7e_111111111111_humidity",
"unique_id": "/7E.111111111111/EDS0068/humidity", "unique_id": "/7E.111111111111/EDS0068/humidity",
"injected_value": b" 41.375", "injected_value": b" 41.375",
"result": "41.4", "result": "41.4",
"unit": PERCENTAGE, ATTR_UNIT_OF_MEASUREMENT: PERCENTAGE,
"class": DEVICE_CLASS_HUMIDITY, ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -820,16 +860,18 @@ MOCK_OWPROXY_DEVICES = {
"unique_id": "/7E.222222222222/EDS0066/temperature", "unique_id": "/7E.222222222222/EDS0066/temperature",
"injected_value": b" 13.9375", "injected_value": b" 13.9375",
"result": "13.9", "result": "13.9",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
{ {
"entity_id": "sensor.7e_222222222222_pressure", "entity_id": "sensor.7e_222222222222_pressure",
"unique_id": "/7E.222222222222/EDS0066/pressure", "unique_id": "/7E.222222222222/EDS0066/pressure",
"injected_value": b" 1012.21", "injected_value": b" 1012.21",
"result": "1012.2", "result": "1012.2",
"unit": PRESSURE_MBAR, ATTR_UNIT_OF_MEASUREMENT: PRESSURE_MBAR,
"class": DEVICE_CLASS_PRESSURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_PRESSURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -850,8 +892,9 @@ MOCK_SYSBUS_DEVICES = {
"unique_id": "/sys/bus/w1/devices/10-111111111111/w1_slave", "unique_id": "/sys/bus/w1/devices/10-111111111111/w1_slave",
"injected_value": 25.123, "injected_value": 25.123,
"result": "25.1", "result": "25.1",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -870,8 +913,9 @@ MOCK_SYSBUS_DEVICES = {
"unique_id": "/sys/bus/w1/devices/22-111111111111/w1_slave", "unique_id": "/sys/bus/w1/devices/22-111111111111/w1_slave",
"injected_value": FileNotFoundError, "injected_value": FileNotFoundError,
"result": "unknown", "result": "unknown",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -889,8 +933,9 @@ MOCK_SYSBUS_DEVICES = {
"unique_id": "/sys/bus/w1/devices/28-111111111111/w1_slave", "unique_id": "/sys/bus/w1/devices/28-111111111111/w1_slave",
"injected_value": InvalidCRCException, "injected_value": InvalidCRCException,
"result": "unknown", "result": "unknown",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -908,8 +953,9 @@ MOCK_SYSBUS_DEVICES = {
"unique_id": "/sys/bus/w1/devices/3B-111111111111/w1_slave", "unique_id": "/sys/bus/w1/devices/3B-111111111111/w1_slave",
"injected_value": 29.993, "injected_value": 29.993,
"result": "30.0", "result": "30.0",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -926,8 +972,9 @@ MOCK_SYSBUS_DEVICES = {
"unique_id": "/sys/bus/w1/devices/42-111111111111/w1_slave", "unique_id": "/sys/bus/w1/devices/42-111111111111/w1_slave",
"injected_value": UnsupportResponseException, "injected_value": UnsupportResponseException,
"result": "unknown", "result": "unknown",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -944,8 +991,9 @@ MOCK_SYSBUS_DEVICES = {
"unique_id": "/sys/bus/w1/devices/42-111111111112/w1_slave", "unique_id": "/sys/bus/w1/devices/42-111111111112/w1_slave",
"injected_value": [UnsupportResponseException] * 9 + [27.993], "injected_value": [UnsupportResponseException] * 9 + [27.993],
"result": "28.0", "result": "28.0",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },
@ -962,8 +1010,9 @@ MOCK_SYSBUS_DEVICES = {
"unique_id": "/sys/bus/w1/devices/42-111111111113/w1_slave", "unique_id": "/sys/bus/w1/devices/42-111111111113/w1_slave",
"injected_value": [UnsupportResponseException] * 10 + [27.993], "injected_value": [UnsupportResponseException] * 10 + [27.993],
"result": "unknown", "result": "unknown",
"unit": TEMP_CELSIUS, ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS,
"class": DEVICE_CLASS_TEMPERATURE, ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
}, },
], ],
}, },

View File

@ -38,7 +38,7 @@ async def test_owserver_binary_sensor(owproxy, hass, device_id):
# Force enable binary sensors # Force enable binary sensors
patch_device_binary_sensors = copy.deepcopy(DEVICE_BINARY_SENSORS) patch_device_binary_sensors = copy.deepcopy(DEVICE_BINARY_SENSORS)
for item in patch_device_binary_sensors[device_id[0:2]]: for item in patch_device_binary_sensors[device_id[0:2]]:
item["default_disabled"] = False item.entity_registry_enabled_default = True
with patch( with patch(
"homeassistant.components.onewire.PLATFORMS", [BINARY_SENSOR_DOMAIN] "homeassistant.components.onewire.PLATFORMS", [BINARY_SENSOR_DOMAIN]

View File

@ -9,8 +9,14 @@ from homeassistant.components.onewire.const import (
DOMAIN, DOMAIN,
PLATFORMS, PLATFORMS,
) )
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.components.sensor import ATTR_STATE_CLASS, DOMAIN as SENSOR_DOMAIN
from homeassistant.const import ATTR_MANUFACTURER, ATTR_MODEL, ATTR_NAME from homeassistant.const import (
ATTR_DEVICE_CLASS,
ATTR_MANUFACTURER,
ATTR_MODEL,
ATTR_NAME,
ATTR_UNIT_OF_MEASUREMENT,
)
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from . import ( from . import (
@ -116,14 +122,11 @@ async def test_sensors_on_owserver_coupler(owproxy, hass, device_id):
registry_entry = entity_registry.entities.get(entity_id) registry_entry = entity_registry.entities.get(entity_id)
assert registry_entry is not None assert registry_entry is not None
assert registry_entry.unique_id == expected_sensor["unique_id"] assert registry_entry.unique_id == expected_sensor["unique_id"]
assert registry_entry.unit_of_measurement == expected_sensor["unit"]
assert registry_entry.device_class == expected_sensor["class"]
assert registry_entry.disabled == expected_sensor.get("disabled", False) assert registry_entry.disabled == expected_sensor.get("disabled", False)
state = hass.states.get(entity_id) state = hass.states.get(entity_id)
if registry_entry.disabled:
assert state is None
else:
assert state.state == expected_sensor["result"] assert state.state == expected_sensor["result"]
for attr in (ATTR_DEVICE_CLASS, ATTR_STATE_CLASS, ATTR_UNIT_OF_MEASUREMENT):
assert state.attributes.get(attr) == expected_sensor[attr]
assert state.attributes["device_file"] == expected_sensor["device_file"] assert state.attributes["device_file"] == expected_sensor["device_file"]
@ -165,14 +168,14 @@ async def test_owserver_setup_valid_device(owproxy, hass, device_id, platform):
registry_entry = entity_registry.entities.get(entity_id) registry_entry = entity_registry.entities.get(entity_id)
assert registry_entry is not None assert registry_entry is not None
assert registry_entry.unique_id == expected_entity["unique_id"] assert registry_entry.unique_id == expected_entity["unique_id"]
assert registry_entry.unit_of_measurement == expected_entity["unit"]
assert registry_entry.device_class == expected_entity["class"]
assert registry_entry.disabled == expected_entity.get("disabled", False) assert registry_entry.disabled == expected_entity.get("disabled", False)
state = hass.states.get(entity_id) state = hass.states.get(entity_id)
if registry_entry.disabled: if registry_entry.disabled:
assert state is None assert state is None
else: else:
assert state.state == expected_entity["result"] assert state.state == expected_entity["result"]
for attr in (ATTR_DEVICE_CLASS, ATTR_STATE_CLASS, ATTR_UNIT_OF_MEASUREMENT):
assert state.attributes.get(attr) == expected_entity[attr]
assert state.attributes["device_file"] == expected_entity.get( assert state.attributes["device_file"] == expected_entity.get(
"device_file", registry_entry.unique_id "device_file", registry_entry.unique_id
) )
@ -216,7 +219,7 @@ async def test_onewiredirect_setup_valid_device(hass, device_id):
registry_entry = entity_registry.entities.get(entity_id) registry_entry = entity_registry.entities.get(entity_id)
assert registry_entry is not None assert registry_entry is not None
assert registry_entry.unique_id == expected_sensor["unique_id"] assert registry_entry.unique_id == expected_sensor["unique_id"]
assert registry_entry.unit_of_measurement == expected_sensor["unit"]
assert registry_entry.device_class == expected_sensor["class"]
state = hass.states.get(entity_id) state = hass.states.get(entity_id)
assert state.state == expected_sensor["result"] assert state.state == expected_sensor["result"]
for attr in (ATTR_DEVICE_CLASS, ATTR_STATE_CLASS, ATTR_UNIT_OF_MEASUREMENT):
assert state.attributes.get(attr) == expected_sensor[attr]

View File

@ -39,7 +39,7 @@ async def test_owserver_switch(owproxy, hass, device_id):
# Force enable switches # Force enable switches
patch_device_switches = copy.deepcopy(DEVICE_SWITCHES) patch_device_switches = copy.deepcopy(DEVICE_SWITCHES)
for item in patch_device_switches[device_id[0:2]]: for item in patch_device_switches[device_id[0:2]]:
item["default_disabled"] = False item.entity_registry_enabled_default = True
with patch( with patch(
"homeassistant.components.onewire.PLATFORMS", [SWITCH_DOMAIN] "homeassistant.components.onewire.PLATFORMS", [SWITCH_DOMAIN]