mirror of
https://github.com/home-assistant/core.git
synced 2025-07-25 22:27:07 +00:00
ZHA support for additional entities on ElectricalMeasurement ZCL cluster (#56909)
* Add electrical measurement type state attribute. * Add active_power_max attribute * Skip unsupported attributes on entity update * Fix tests * Create sensor only if the main attribute is supported * Refactor ElectricalMeasurement sensor to use attr specific divisor and multiplier * Multiple entities for electrical measurement cluster * Update discovery tests * Sensor clean up * update tests * Pylint
This commit is contained in:
parent
7e5a991de5
commit
d0827a9129
@ -1,12 +1,15 @@
|
|||||||
"""Home automation channels module for Zigbee Home Automation."""
|
"""Home automation channels module for Zigbee Home Automation."""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import enum
|
||||||
|
|
||||||
from zigpy.zcl.clusters import homeautomation
|
from zigpy.zcl.clusters import homeautomation
|
||||||
|
|
||||||
from .. import registries
|
from .. import registries
|
||||||
from ..const import (
|
from ..const import (
|
||||||
CHANNEL_ELECTRICAL_MEASUREMENT,
|
CHANNEL_ELECTRICAL_MEASUREMENT,
|
||||||
REPORT_CONFIG_DEFAULT,
|
REPORT_CONFIG_DEFAULT,
|
||||||
|
REPORT_CONFIG_OP,
|
||||||
SIGNAL_ATTR_UPDATED,
|
SIGNAL_ATTR_UPDATED,
|
||||||
)
|
)
|
||||||
from .base import ZigbeeChannel
|
from .base import ZigbeeChannel
|
||||||
@ -46,11 +49,36 @@ class ElectricalMeasurementChannel(ZigbeeChannel):
|
|||||||
|
|
||||||
CHANNEL_NAME = CHANNEL_ELECTRICAL_MEASUREMENT
|
CHANNEL_NAME = CHANNEL_ELECTRICAL_MEASUREMENT
|
||||||
|
|
||||||
REPORT_CONFIG = ({"attr": "active_power", "config": REPORT_CONFIG_DEFAULT},)
|
class MeasurementType(enum.IntFlag):
|
||||||
|
"""Measurement types."""
|
||||||
|
|
||||||
|
ACTIVE_MEASUREMENT = 1
|
||||||
|
REACTIVE_MEASUREMENT = 2
|
||||||
|
APPARENT_MEASUREMENT = 4
|
||||||
|
PHASE_A_MEASUREMENT = 8
|
||||||
|
PHASE_B_MEASUREMENT = 16
|
||||||
|
PHASE_C_MEASUREMENT = 32
|
||||||
|
DC_MEASUREMENT = 64
|
||||||
|
HARMONICS_MEASUREMENT = 128
|
||||||
|
POWER_QUALITY_MEASUREMENT = 256
|
||||||
|
|
||||||
|
REPORT_CONFIG = (
|
||||||
|
{"attr": "active_power", "config": REPORT_CONFIG_OP},
|
||||||
|
{"attr": "active_power_max", "config": REPORT_CONFIG_DEFAULT},
|
||||||
|
{"attr": "rms_current", "config": REPORT_CONFIG_OP},
|
||||||
|
{"attr": "rms_current_max", "config": REPORT_CONFIG_DEFAULT},
|
||||||
|
{"attr": "rms_voltage", "config": REPORT_CONFIG_OP},
|
||||||
|
{"attr": "rms_voltage_max", "config": REPORT_CONFIG_DEFAULT},
|
||||||
|
)
|
||||||
ZCL_INIT_ATTRS = {
|
ZCL_INIT_ATTRS = {
|
||||||
|
"ac_current_divisor": True,
|
||||||
|
"ac_current_multiplier": True,
|
||||||
"ac_power_divisor": True,
|
"ac_power_divisor": True,
|
||||||
"power_divisor": True,
|
|
||||||
"ac_power_multiplier": True,
|
"ac_power_multiplier": True,
|
||||||
|
"ac_voltage_divisor": True,
|
||||||
|
"ac_voltage_multiplier": True,
|
||||||
|
"measurement_type": True,
|
||||||
|
"power_divisor": True,
|
||||||
"power_multiplier": True,
|
"power_multiplier": True,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,29 +87,65 @@ class ElectricalMeasurementChannel(ZigbeeChannel):
|
|||||||
self.debug("async_update")
|
self.debug("async_update")
|
||||||
|
|
||||||
# This is a polling channel. Don't allow cache.
|
# This is a polling channel. Don't allow cache.
|
||||||
result = await self.get_attribute_value("active_power", from_cache=False)
|
attrs = [
|
||||||
if result is not None:
|
a["attr"]
|
||||||
|
for a in self.REPORT_CONFIG
|
||||||
|
if a["attr"] not in self.cluster.unsupported_attributes
|
||||||
|
]
|
||||||
|
result = await self.get_attributes(attrs, from_cache=False)
|
||||||
|
if result:
|
||||||
|
for attr, value in result.items():
|
||||||
self.async_send_signal(
|
self.async_send_signal(
|
||||||
f"{self.unique_id}_{SIGNAL_ATTR_UPDATED}",
|
f"{self.unique_id}_{SIGNAL_ATTR_UPDATED}",
|
||||||
0x050B,
|
self.cluster.attridx.get(attr, attr),
|
||||||
"active_power",
|
attr,
|
||||||
result,
|
value,
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def divisor(self) -> int | None:
|
def ac_current_divisor(self) -> int:
|
||||||
|
"""Return ac current divisor."""
|
||||||
|
return self.cluster.get("ac_current_divisor") or 1
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ac_current_multiplier(self) -> int:
|
||||||
|
"""Return ac current multiplier."""
|
||||||
|
return self.cluster.get("ac_current_multiplier") or 1
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ac_voltage_divisor(self) -> int:
|
||||||
|
"""Return ac voltage divisor."""
|
||||||
|
return self.cluster.get("ac_voltage_divisor") or 1
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ac_voltage_multiplier(self) -> int:
|
||||||
|
"""Return ac voltage multiplier."""
|
||||||
|
return self.cluster.get("ac_voltage_multiplier") or 1
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ac_power_divisor(self) -> int:
|
||||||
"""Return active power divisor."""
|
"""Return active power divisor."""
|
||||||
return self.cluster.get(
|
return self.cluster.get(
|
||||||
"ac_power_divisor", self.cluster.get("power_divisor", 1)
|
"ac_power_divisor", self.cluster.get("power_divisor") or 1
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def multiplier(self) -> int | None:
|
def ac_power_multiplier(self) -> int:
|
||||||
"""Return active power divisor."""
|
"""Return active power divisor."""
|
||||||
return self.cluster.get(
|
return self.cluster.get(
|
||||||
"ac_power_multiplier", self.cluster.get("power_multiplier", 1)
|
"ac_power_multiplier", self.cluster.get("power_multiplier") or 1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def measurement_type(self) -> str | None:
|
||||||
|
"""Return Measurement type."""
|
||||||
|
meas_type = self.cluster.get("measurement_type")
|
||||||
|
if meas_type is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
meas_type = self.MeasurementType(meas_type)
|
||||||
|
return ", ".join(m.name for m in self.MeasurementType if m in meas_type)
|
||||||
|
|
||||||
|
|
||||||
@registries.ZIGBEE_CHANNEL_REGISTRY.register(
|
@registries.ZIGBEE_CHANNEL_REGISTRY.register(
|
||||||
homeautomation.MeterIdentification.cluster_id
|
homeautomation.MeterIdentification.cluster_id
|
||||||
|
@ -73,7 +73,6 @@ SINGLE_INPUT_CLUSTER_DEVICE_CLASS = {
|
|||||||
zcl.clusters.general.MultistateInput.cluster_id: SENSOR,
|
zcl.clusters.general.MultistateInput.cluster_id: SENSOR,
|
||||||
zcl.clusters.general.OnOff.cluster_id: SWITCH,
|
zcl.clusters.general.OnOff.cluster_id: SWITCH,
|
||||||
zcl.clusters.general.PowerConfiguration.cluster_id: SENSOR,
|
zcl.clusters.general.PowerConfiguration.cluster_id: SENSOR,
|
||||||
zcl.clusters.homeautomation.ElectricalMeasurement.cluster_id: SENSOR,
|
|
||||||
zcl.clusters.hvac.Fan.cluster_id: FAN,
|
zcl.clusters.hvac.Fan.cluster_id: FAN,
|
||||||
zcl.clusters.measurement.CarbonDioxideConcentration.cluster_id: SENSOR,
|
zcl.clusters.measurement.CarbonDioxideConcentration.cluster_id: SENSOR,
|
||||||
zcl.clusters.measurement.CarbonMonoxideConcentration.cluster_id: SENSOR,
|
zcl.clusters.measurement.CarbonMonoxideConcentration.cluster_id: SENSOR,
|
||||||
|
@ -9,6 +9,7 @@ from homeassistant.components.sensor import (
|
|||||||
DEVICE_CLASS_BATTERY,
|
DEVICE_CLASS_BATTERY,
|
||||||
DEVICE_CLASS_CO,
|
DEVICE_CLASS_CO,
|
||||||
DEVICE_CLASS_CO2,
|
DEVICE_CLASS_CO2,
|
||||||
|
DEVICE_CLASS_CURRENT,
|
||||||
DEVICE_CLASS_HUMIDITY,
|
DEVICE_CLASS_HUMIDITY,
|
||||||
DEVICE_CLASS_ILLUMINANCE,
|
DEVICE_CLASS_ILLUMINANCE,
|
||||||
DEVICE_CLASS_POWER,
|
DEVICE_CLASS_POWER,
|
||||||
@ -24,6 +25,8 @@ from homeassistant.const import (
|
|||||||
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
|
||||||
CONCENTRATION_PARTS_PER_MILLION,
|
CONCENTRATION_PARTS_PER_MILLION,
|
||||||
DEVICE_CLASS_ENERGY,
|
DEVICE_CLASS_ENERGY,
|
||||||
|
ELECTRIC_CURRENT_AMPERE,
|
||||||
|
ELECTRIC_POTENTIAL_VOLT,
|
||||||
ENERGY_KILO_WATT_HOUR,
|
ENERGY_KILO_WATT_HOUR,
|
||||||
LIGHT_LUX,
|
LIGHT_LUX,
|
||||||
PERCENTAGE,
|
PERCENTAGE,
|
||||||
@ -129,6 +132,24 @@ class Sensor(ZhaEntity, SensorEntity):
|
|||||||
super().__init__(unique_id, zha_device, channels, **kwargs)
|
super().__init__(unique_id, zha_device, channels, **kwargs)
|
||||||
self._channel: ChannelType = channels[0]
|
self._channel: ChannelType = channels[0]
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create_entity(
|
||||||
|
cls,
|
||||||
|
unique_id: str,
|
||||||
|
zha_device: ZhaDeviceType,
|
||||||
|
channels: list[ChannelType],
|
||||||
|
**kwargs,
|
||||||
|
) -> ZhaEntity | None:
|
||||||
|
"""Entity Factory.
|
||||||
|
|
||||||
|
Return entity if it is a supported configuration, otherwise return None
|
||||||
|
"""
|
||||||
|
channel = channels[0]
|
||||||
|
if cls.SENSOR_ATTR in channel.cluster.unsupported_attributes:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return cls(unique_id, zha_device, channels, **kwargs)
|
||||||
|
|
||||||
async def async_added_to_hass(self) -> None:
|
async def async_added_to_hass(self) -> None:
|
||||||
"""Run when about to be added to hass."""
|
"""Run when about to be added to hass."""
|
||||||
await super().async_added_to_hass()
|
await super().async_added_to_hass()
|
||||||
@ -220,7 +241,7 @@ class Battery(Sensor):
|
|||||||
return state_attrs
|
return state_attrs
|
||||||
|
|
||||||
|
|
||||||
@STRICT_MATCH(channel_names=CHANNEL_ELECTRICAL_MEASUREMENT)
|
@MULTI_MATCH(channel_names=CHANNEL_ELECTRICAL_MEASUREMENT)
|
||||||
class ElectricalMeasurement(Sensor):
|
class ElectricalMeasurement(Sensor):
|
||||||
"""Active power measurement."""
|
"""Active power measurement."""
|
||||||
|
|
||||||
@ -228,16 +249,32 @@ class ElectricalMeasurement(Sensor):
|
|||||||
_device_class = DEVICE_CLASS_POWER
|
_device_class = DEVICE_CLASS_POWER
|
||||||
_state_class = STATE_CLASS_MEASUREMENT
|
_state_class = STATE_CLASS_MEASUREMENT
|
||||||
_unit = POWER_WATT
|
_unit = POWER_WATT
|
||||||
|
_div_mul_prefix = "ac_power"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def should_poll(self) -> bool:
|
def should_poll(self) -> bool:
|
||||||
"""Return True if HA needs to poll for state changes."""
|
"""Return True if HA needs to poll for state changes."""
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def extra_state_attributes(self) -> dict[str, Any]:
|
||||||
|
"""Return device state attrs for sensor."""
|
||||||
|
attrs = {}
|
||||||
|
if self._channel.measurement_type is not None:
|
||||||
|
attrs["measurement_type"] = self._channel.measurement_type
|
||||||
|
|
||||||
|
max_attr_name = f"{self.SENSOR_ATTR}_max"
|
||||||
|
if (max_v := self._channel.cluster.get(max_attr_name)) is not None:
|
||||||
|
attrs[max_attr_name] = str(self.formatter(max_v))
|
||||||
|
|
||||||
|
return attrs
|
||||||
|
|
||||||
def formatter(self, value: int) -> int | float:
|
def formatter(self, value: int) -> int | float:
|
||||||
"""Return 'normalized' value."""
|
"""Return 'normalized' value."""
|
||||||
value = value * self._channel.multiplier / self._channel.divisor
|
multiplier = getattr(self._channel, f"{self._div_mul_prefix}_multiplier")
|
||||||
if value < 100 and self._channel.divisor > 1:
|
divisor = getattr(self._channel, f"{self._div_mul_prefix}_divisor")
|
||||||
|
value = float(value * multiplier) / divisor
|
||||||
|
if value < 100 and divisor > 1:
|
||||||
return round(value, self._decimals)
|
return round(value, self._decimals)
|
||||||
return round(value)
|
return round(value)
|
||||||
|
|
||||||
@ -248,6 +285,36 @@ class ElectricalMeasurement(Sensor):
|
|||||||
await super().async_update()
|
await super().async_update()
|
||||||
|
|
||||||
|
|
||||||
|
@MULTI_MATCH(channel_names=CHANNEL_ELECTRICAL_MEASUREMENT)
|
||||||
|
class ElectricalMeasurementRMSCurrent(ElectricalMeasurement, id_suffix="rms_current"):
|
||||||
|
"""RMS current measurement."""
|
||||||
|
|
||||||
|
SENSOR_ATTR = "rms_current"
|
||||||
|
_device_class = DEVICE_CLASS_CURRENT
|
||||||
|
_unit = ELECTRIC_CURRENT_AMPERE
|
||||||
|
_div_mul_prefix = "ac_current"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def should_poll(self) -> bool:
|
||||||
|
"""Poll indirectly by ElectricalMeasurementSensor."""
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
@MULTI_MATCH(channel_names=CHANNEL_ELECTRICAL_MEASUREMENT)
|
||||||
|
class ElectricalMeasurementRMSVoltage(ElectricalMeasurement, id_suffix="rms_voltage"):
|
||||||
|
"""RMS Voltage measurement."""
|
||||||
|
|
||||||
|
SENSOR_ATTR = "rms_voltage"
|
||||||
|
_device_class = DEVICE_CLASS_CURRENT
|
||||||
|
_unit = ELECTRIC_POTENTIAL_VOLT
|
||||||
|
_div_mul_prefix = "ac_voltage"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def should_poll(self) -> bool:
|
||||||
|
"""Poll indirectly by ElectricalMeasurementSensor."""
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
@STRICT_MATCH(generic_ids=CHANNEL_ST_HUMIDITY_CLUSTER)
|
@STRICT_MATCH(generic_ids=CHANNEL_ST_HUMIDITY_CLUSTER)
|
||||||
@STRICT_MATCH(channel_names=CHANNEL_HUMIDITY)
|
@STRICT_MATCH(channel_names=CHANNEL_HUMIDITY)
|
||||||
class Humidity(Sensor):
|
class Humidity(Sensor):
|
||||||
@ -298,24 +365,6 @@ class SmartEnergyMetering(Sensor):
|
|||||||
0x0C: f"MJ/{TIME_SECONDS}",
|
0x0C: f"MJ/{TIME_SECONDS}",
|
||||||
}
|
}
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def create_entity(
|
|
||||||
cls,
|
|
||||||
unique_id: str,
|
|
||||||
zha_device: ZhaDeviceType,
|
|
||||||
channels: list[ChannelType],
|
|
||||||
**kwargs,
|
|
||||||
) -> ZhaEntity | None:
|
|
||||||
"""Entity Factory.
|
|
||||||
|
|
||||||
Return entity if it is a supported configuration, otherwise return None
|
|
||||||
"""
|
|
||||||
se_channel = channels[0]
|
|
||||||
if cls.SENSOR_ATTR in se_channel.cluster.unsupported_attributes:
|
|
||||||
return None
|
|
||||||
|
|
||||||
return cls(unique_id, zha_device, channels, **kwargs)
|
|
||||||
|
|
||||||
def formatter(self, value: int) -> int | float:
|
def formatter(self, value: int) -> int | float:
|
||||||
"""Pass through channel formatter."""
|
"""Pass through channel formatter."""
|
||||||
return self._channel.demand_formatter(value)
|
return self._channel.demand_formatter(value)
|
||||||
|
@ -152,7 +152,18 @@ async def poll_control_device(zha_device_restored, zigpy_device_mock):
|
|||||||
(0x0405, 1, {"measured_value"}),
|
(0x0405, 1, {"measured_value"}),
|
||||||
(0x0406, 1, {"occupancy"}),
|
(0x0406, 1, {"occupancy"}),
|
||||||
(0x0702, 1, {"instantaneous_demand"}),
|
(0x0702, 1, {"instantaneous_demand"}),
|
||||||
(0x0B04, 1, {"active_power"}),
|
(
|
||||||
|
0x0B04,
|
||||||
|
1,
|
||||||
|
{
|
||||||
|
"active_power",
|
||||||
|
"active_power_max",
|
||||||
|
"rms_current",
|
||||||
|
"rms_current_max",
|
||||||
|
"rms_voltage",
|
||||||
|
"rms_voltage_max",
|
||||||
|
},
|
||||||
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
async def test_in_channel_config(
|
async def test_in_channel_config(
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
"""Test zha sensor."""
|
"""Test zha sensor."""
|
||||||
from unittest import mock
|
import math
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
import zigpy.profiles.zha
|
import zigpy.profiles.zha
|
||||||
@ -9,6 +9,7 @@ import zigpy.zcl.clusters.measurement as measurement
|
|||||||
import zigpy.zcl.clusters.smartenergy as smartenergy
|
import zigpy.zcl.clusters.smartenergy as smartenergy
|
||||||
|
|
||||||
from homeassistant.components.sensor import DOMAIN
|
from homeassistant.components.sensor import DOMAIN
|
||||||
|
from homeassistant.components.zha.core.const import ZHA_CHANNEL_READS_PER_REQ
|
||||||
import homeassistant.config as config_util
|
import homeassistant.config as config_util
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_DEVICE_CLASS,
|
ATTR_DEVICE_CLASS,
|
||||||
@ -17,6 +18,8 @@ from homeassistant.const import (
|
|||||||
CONF_UNIT_SYSTEM_IMPERIAL,
|
CONF_UNIT_SYSTEM_IMPERIAL,
|
||||||
CONF_UNIT_SYSTEM_METRIC,
|
CONF_UNIT_SYSTEM_METRIC,
|
||||||
DEVICE_CLASS_ENERGY,
|
DEVICE_CLASS_ENERGY,
|
||||||
|
ELECTRIC_CURRENT_AMPERE,
|
||||||
|
ELECTRIC_POTENTIAL_VOLT,
|
||||||
ENERGY_KILO_WATT_HOUR,
|
ENERGY_KILO_WATT_HOUR,
|
||||||
LIGHT_LUX,
|
LIGHT_LUX,
|
||||||
PERCENTAGE,
|
PERCENTAGE,
|
||||||
@ -30,6 +33,7 @@ from homeassistant.const import (
|
|||||||
VOLUME_CUBIC_METERS,
|
VOLUME_CUBIC_METERS,
|
||||||
)
|
)
|
||||||
from homeassistant.helpers import restore_state
|
from homeassistant.helpers import restore_state
|
||||||
|
from homeassistant.helpers.entity_component import async_update_entity
|
||||||
from homeassistant.util import dt as dt_util
|
from homeassistant.util import dt as dt_util
|
||||||
|
|
||||||
from .common import (
|
from .common import (
|
||||||
@ -40,11 +44,52 @@ from .common import (
|
|||||||
send_attribute_report,
|
send_attribute_report,
|
||||||
send_attributes_report,
|
send_attributes_report,
|
||||||
)
|
)
|
||||||
from .conftest import SIG_EP_INPUT, SIG_EP_OUTPUT, SIG_EP_TYPE
|
from .conftest import SIG_EP_INPUT, SIG_EP_OUTPUT, SIG_EP_PROFILE, SIG_EP_TYPE
|
||||||
|
|
||||||
ENTITY_ID_PREFIX = "sensor.fakemanufacturer_fakemodel_e769900a_{}"
|
ENTITY_ID_PREFIX = "sensor.fakemanufacturer_fakemodel_e769900a_{}"
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
async def elec_measurement_zigpy_dev(hass, zigpy_device_mock):
|
||||||
|
"""Electric Measurement zigpy device."""
|
||||||
|
|
||||||
|
zigpy_device = zigpy_device_mock(
|
||||||
|
{
|
||||||
|
1: {
|
||||||
|
SIG_EP_INPUT: [
|
||||||
|
general.Basic.cluster_id,
|
||||||
|
homeautomation.ElectricalMeasurement.cluster_id,
|
||||||
|
],
|
||||||
|
SIG_EP_OUTPUT: [],
|
||||||
|
SIG_EP_TYPE: zigpy.profiles.zha.DeviceType.SIMPLE_SENSOR,
|
||||||
|
SIG_EP_PROFILE: zigpy.profiles.zha.PROFILE_ID,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
zigpy_device.node_desc.mac_capability_flags |= 0b_0000_0100
|
||||||
|
zigpy_device.endpoints[1].electrical_measurement.PLUGGED_ATTR_READS = {
|
||||||
|
"ac_current_divisor": 10,
|
||||||
|
"ac_current_multiplier": 1,
|
||||||
|
"ac_power_divisor": 10,
|
||||||
|
"ac_power_multiplier": 1,
|
||||||
|
"ac_voltage_divisor": 10,
|
||||||
|
"ac_voltage_multiplier": 1,
|
||||||
|
"measurement_type": 8,
|
||||||
|
"power_divisor": 10,
|
||||||
|
"power_multiplier": 1,
|
||||||
|
}
|
||||||
|
return zigpy_device
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
async def elec_measurement_zha_dev(elec_measurement_zigpy_dev, zha_device_joined):
|
||||||
|
"""Electric Measurement ZHA device."""
|
||||||
|
|
||||||
|
zha_dev = await zha_device_joined(elec_measurement_zigpy_dev)
|
||||||
|
zha_dev.available = True
|
||||||
|
return zha_dev
|
||||||
|
|
||||||
|
|
||||||
async def async_test_humidity(hass, cluster, entity_id):
|
async def async_test_humidity(hass, cluster, entity_id):
|
||||||
"""Test humidity sensor."""
|
"""Test humidity sensor."""
|
||||||
await send_attributes_report(hass, cluster, {1: 1, 0: 1000, 2: 100})
|
await send_attributes_report(hass, cluster, {1: 1, 0: 1000, 2: 100})
|
||||||
@ -109,27 +154,61 @@ async def async_test_smart_energy_summation(hass, cluster, entity_id):
|
|||||||
|
|
||||||
async def async_test_electrical_measurement(hass, cluster, entity_id):
|
async def async_test_electrical_measurement(hass, cluster, entity_id):
|
||||||
"""Test electrical measurement sensor."""
|
"""Test electrical measurement sensor."""
|
||||||
with mock.patch(
|
# update divisor cached value
|
||||||
(
|
await send_attributes_report(hass, cluster, {"ac_power_divisor": 1})
|
||||||
"homeassistant.components.zha.core.channels.homeautomation"
|
|
||||||
".ElectricalMeasurementChannel.divisor"
|
|
||||||
),
|
|
||||||
new_callable=mock.PropertyMock,
|
|
||||||
) as divisor_mock:
|
|
||||||
divisor_mock.return_value = 1
|
|
||||||
await send_attributes_report(hass, cluster, {0: 1, 1291: 100, 10: 1000})
|
await send_attributes_report(hass, cluster, {0: 1, 1291: 100, 10: 1000})
|
||||||
assert_state(hass, entity_id, "100", POWER_WATT)
|
assert_state(hass, entity_id, "100", POWER_WATT)
|
||||||
|
|
||||||
await send_attributes_report(hass, cluster, {0: 1, 1291: 99, 10: 1000})
|
await send_attributes_report(hass, cluster, {0: 1, 1291: 99, 10: 1000})
|
||||||
assert_state(hass, entity_id, "99", POWER_WATT)
|
assert_state(hass, entity_id, "99", POWER_WATT)
|
||||||
|
|
||||||
divisor_mock.return_value = 10
|
await send_attributes_report(hass, cluster, {"ac_power_divisor": 10})
|
||||||
await send_attributes_report(hass, cluster, {0: 1, 1291: 1000, 10: 5000})
|
await send_attributes_report(hass, cluster, {0: 1, 1291: 1000, 10: 5000})
|
||||||
assert_state(hass, entity_id, "100", POWER_WATT)
|
assert_state(hass, entity_id, "100", POWER_WATT)
|
||||||
|
|
||||||
await send_attributes_report(hass, cluster, {0: 1, 1291: 99, 10: 5000})
|
await send_attributes_report(hass, cluster, {0: 1, 1291: 99, 10: 5000})
|
||||||
assert_state(hass, entity_id, "9.9", POWER_WATT)
|
assert_state(hass, entity_id, "9.9", POWER_WATT)
|
||||||
|
|
||||||
|
assert "active_power_max" not in hass.states.get(entity_id).attributes
|
||||||
|
await send_attributes_report(hass, cluster, {0: 1, 0x050D: 88, 10: 5000})
|
||||||
|
assert hass.states.get(entity_id).attributes["active_power_max"] == "8.8"
|
||||||
|
|
||||||
|
|
||||||
|
async def async_test_em_rms_current(hass, cluster, entity_id):
|
||||||
|
"""Test electrical measurement RMS Current sensor."""
|
||||||
|
|
||||||
|
await send_attributes_report(hass, cluster, {0: 1, 0x0508: 1234, 10: 1000})
|
||||||
|
assert_state(hass, entity_id, "1.2", ELECTRIC_CURRENT_AMPERE)
|
||||||
|
|
||||||
|
await send_attributes_report(hass, cluster, {"ac_current_divisor": 10})
|
||||||
|
await send_attributes_report(hass, cluster, {0: 1, 0x0508: 236, 10: 1000})
|
||||||
|
assert_state(hass, entity_id, "23.6", ELECTRIC_CURRENT_AMPERE)
|
||||||
|
|
||||||
|
await send_attributes_report(hass, cluster, {0: 1, 0x0508: 1236, 10: 1000})
|
||||||
|
assert_state(hass, entity_id, "124", ELECTRIC_CURRENT_AMPERE)
|
||||||
|
|
||||||
|
assert "rms_current_max" not in hass.states.get(entity_id).attributes
|
||||||
|
await send_attributes_report(hass, cluster, {0: 1, 0x050A: 88, 10: 5000})
|
||||||
|
assert hass.states.get(entity_id).attributes["rms_current_max"] == "8.8"
|
||||||
|
|
||||||
|
|
||||||
|
async def async_test_em_rms_voltage(hass, cluster, entity_id):
|
||||||
|
"""Test electrical measurement RMS Voltage sensor."""
|
||||||
|
|
||||||
|
await send_attributes_report(hass, cluster, {0: 1, 0x0505: 1234, 10: 1000})
|
||||||
|
assert_state(hass, entity_id, "123", ELECTRIC_POTENTIAL_VOLT)
|
||||||
|
|
||||||
|
await send_attributes_report(hass, cluster, {0: 1, 0x0505: 234, 10: 1000})
|
||||||
|
assert_state(hass, entity_id, "23.4", ELECTRIC_POTENTIAL_VOLT)
|
||||||
|
|
||||||
|
await send_attributes_report(hass, cluster, {"ac_voltage_divisor": 100})
|
||||||
|
await send_attributes_report(hass, cluster, {0: 1, 0x0505: 2236, 10: 1000})
|
||||||
|
assert_state(hass, entity_id, "22.4", ELECTRIC_POTENTIAL_VOLT)
|
||||||
|
|
||||||
|
assert "rms_voltage_max" not in hass.states.get(entity_id).attributes
|
||||||
|
await send_attributes_report(hass, cluster, {0: 1, 0x0507: 888, 10: 5000})
|
||||||
|
assert hass.states.get(entity_id).attributes["rms_voltage_max"] == "8.9"
|
||||||
|
|
||||||
|
|
||||||
async def async_test_powerconfiguration(hass, cluster, entity_id):
|
async def async_test_powerconfiguration(hass, cluster, entity_id):
|
||||||
"""Test powerconfiguration/battery sensor."""
|
"""Test powerconfiguration/battery sensor."""
|
||||||
@ -211,9 +290,25 @@ async def async_test_powerconfiguration(hass, cluster, entity_id):
|
|||||||
homeautomation.ElectricalMeasurement.cluster_id,
|
homeautomation.ElectricalMeasurement.cluster_id,
|
||||||
"electrical_measurement",
|
"electrical_measurement",
|
||||||
async_test_electrical_measurement,
|
async_test_electrical_measurement,
|
||||||
1,
|
6,
|
||||||
None,
|
{"ac_power_divisor": 1000, "ac_power_multiplier": 1},
|
||||||
None,
|
{"rms_current", "rms_voltage"},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
homeautomation.ElectricalMeasurement.cluster_id,
|
||||||
|
"electrical_measurement_rms_current",
|
||||||
|
async_test_em_rms_current,
|
||||||
|
6,
|
||||||
|
{"ac_current_divisor": 1000, "ac_current_multiplier": 1},
|
||||||
|
{"active_power", "rms_voltage"},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
homeautomation.ElectricalMeasurement.cluster_id,
|
||||||
|
"electrical_measurement_rms_voltage",
|
||||||
|
async_test_em_rms_voltage,
|
||||||
|
6,
|
||||||
|
{"ac_voltage_divisor": 10, "ac_voltage_multiplier": 1},
|
||||||
|
{"active_power", "rms_current"},
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
general.PowerConfiguration.cluster_id,
|
general.PowerConfiguration.cluster_id,
|
||||||
@ -255,7 +350,10 @@ async def test_sensor(
|
|||||||
if unsupported_attrs:
|
if unsupported_attrs:
|
||||||
for attr in unsupported_attrs:
|
for attr in unsupported_attrs:
|
||||||
cluster.add_unsupported_attribute(attr)
|
cluster.add_unsupported_attribute(attr)
|
||||||
if cluster_id == smartenergy.Metering.cluster_id:
|
if cluster_id in (
|
||||||
|
smartenergy.Metering.cluster_id,
|
||||||
|
homeautomation.ElectricalMeasurement.cluster_id,
|
||||||
|
):
|
||||||
# this one is mains powered
|
# this one is mains powered
|
||||||
zigpy_device.node_desc.mac_capability_flags |= 0b_0000_0100
|
zigpy_device.node_desc.mac_capability_flags |= 0b_0000_0100
|
||||||
cluster.PLUGGED_ATTR_READS = read_plug
|
cluster.PLUGGED_ATTR_READS = read_plug
|
||||||
@ -432,35 +530,60 @@ async def test_electrical_measurement_init(
|
|||||||
assert int(hass.states.get(entity_id).state) == 100
|
assert int(hass.states.get(entity_id).state) == 100
|
||||||
|
|
||||||
channel = zha_device.channels.pools[0].all_channels["1:0x0b04"]
|
channel = zha_device.channels.pools[0].all_channels["1:0x0b04"]
|
||||||
assert channel.divisor == 1
|
assert channel.ac_power_divisor == 1
|
||||||
assert channel.multiplier == 1
|
assert channel.ac_power_multiplier == 1
|
||||||
|
|
||||||
# update power divisor
|
# update power divisor
|
||||||
await send_attributes_report(hass, cluster, {0: 1, 1291: 20, 0x0403: 5, 10: 1000})
|
await send_attributes_report(hass, cluster, {0: 1, 1291: 20, 0x0403: 5, 10: 1000})
|
||||||
assert channel.divisor == 5
|
assert channel.ac_power_divisor == 5
|
||||||
assert channel.multiplier == 1
|
assert channel.ac_power_multiplier == 1
|
||||||
assert hass.states.get(entity_id).state == "4.0"
|
assert hass.states.get(entity_id).state == "4.0"
|
||||||
|
|
||||||
await send_attributes_report(hass, cluster, {0: 1, 1291: 30, 0x0605: 10, 10: 1000})
|
await send_attributes_report(hass, cluster, {0: 1, 1291: 30, 0x0605: 10, 10: 1000})
|
||||||
assert channel.divisor == 10
|
assert channel.ac_power_divisor == 10
|
||||||
assert channel.multiplier == 1
|
assert channel.ac_power_multiplier == 1
|
||||||
assert hass.states.get(entity_id).state == "3.0"
|
assert hass.states.get(entity_id).state == "3.0"
|
||||||
|
|
||||||
# update power multiplier
|
# update power multiplier
|
||||||
await send_attributes_report(hass, cluster, {0: 1, 1291: 20, 0x0402: 6, 10: 1000})
|
await send_attributes_report(hass, cluster, {0: 1, 1291: 20, 0x0402: 6, 10: 1000})
|
||||||
assert channel.divisor == 10
|
assert channel.ac_power_divisor == 10
|
||||||
assert channel.multiplier == 6
|
assert channel.ac_power_multiplier == 6
|
||||||
assert hass.states.get(entity_id).state == "12.0"
|
assert hass.states.get(entity_id).state == "12.0"
|
||||||
|
|
||||||
await send_attributes_report(hass, cluster, {0: 1, 1291: 30, 0x0604: 20, 10: 1000})
|
await send_attributes_report(hass, cluster, {0: 1, 1291: 30, 0x0604: 20, 10: 1000})
|
||||||
assert channel.divisor == 10
|
assert channel.ac_power_divisor == 10
|
||||||
assert channel.multiplier == 20
|
assert channel.ac_power_multiplier == 20
|
||||||
assert hass.states.get(entity_id).state == "60.0"
|
assert hass.states.get(entity_id).state == "60.0"
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"cluster_id, unsupported_attributes, entity_ids, missing_entity_ids",
|
"cluster_id, unsupported_attributes, entity_ids, missing_entity_ids",
|
||||||
(
|
(
|
||||||
|
(
|
||||||
|
homeautomation.ElectricalMeasurement.cluster_id,
|
||||||
|
{"rms_voltage", "rms_current"},
|
||||||
|
{"electrical_measurement"},
|
||||||
|
{
|
||||||
|
"electrical_measurement_rms_voltage",
|
||||||
|
"electrical_measurement_rms_current",
|
||||||
|
},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
homeautomation.ElectricalMeasurement.cluster_id,
|
||||||
|
{"rms_current"},
|
||||||
|
{"electrical_measurement_rms_voltage", "electrical_measurement"},
|
||||||
|
{"electrical_measurement_rms_current"},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
homeautomation.ElectricalMeasurement.cluster_id,
|
||||||
|
set(),
|
||||||
|
{
|
||||||
|
"electrical_measurement_rms_voltage",
|
||||||
|
"electrical_measurement",
|
||||||
|
"electrical_measurement_rms_current",
|
||||||
|
},
|
||||||
|
set(),
|
||||||
|
),
|
||||||
(
|
(
|
||||||
smartenergy.Metering.cluster_id,
|
smartenergy.Metering.cluster_id,
|
||||||
{
|
{
|
||||||
@ -650,3 +773,101 @@ async def test_se_summation_uom(
|
|||||||
await zha_device_joined(zigpy_device)
|
await zha_device_joined(zigpy_device)
|
||||||
|
|
||||||
assert_state(hass, entity_id, expected_state, expected_uom)
|
assert_state(hass, entity_id, expected_state, expected_uom)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"raw_measurement_type, expected_type",
|
||||||
|
(
|
||||||
|
(1, "ACTIVE_MEASUREMENT"),
|
||||||
|
(8, "PHASE_A_MEASUREMENT"),
|
||||||
|
(9, "ACTIVE_MEASUREMENT, PHASE_A_MEASUREMENT"),
|
||||||
|
(
|
||||||
|
15,
|
||||||
|
"ACTIVE_MEASUREMENT, REACTIVE_MEASUREMENT, APPARENT_MEASUREMENT, PHASE_A_MEASUREMENT",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_elec_measurement_sensor_type(
|
||||||
|
hass,
|
||||||
|
elec_measurement_zigpy_dev,
|
||||||
|
raw_measurement_type,
|
||||||
|
expected_type,
|
||||||
|
zha_device_joined,
|
||||||
|
):
|
||||||
|
"""Test zha electrical measurement sensor type."""
|
||||||
|
|
||||||
|
entity_id = ENTITY_ID_PREFIX.format("electrical_measurement")
|
||||||
|
zigpy_dev = elec_measurement_zigpy_dev
|
||||||
|
zigpy_dev.endpoints[1].electrical_measurement.PLUGGED_ATTR_READS[
|
||||||
|
"measurement_type"
|
||||||
|
] = raw_measurement_type
|
||||||
|
|
||||||
|
await zha_device_joined(zigpy_dev)
|
||||||
|
|
||||||
|
state = hass.states.get(entity_id)
|
||||||
|
assert state is not None
|
||||||
|
assert state.attributes["measurement_type"] == expected_type
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"supported_attributes",
|
||||||
|
(
|
||||||
|
set(),
|
||||||
|
{
|
||||||
|
"active_power",
|
||||||
|
"active_power_max",
|
||||||
|
"rms_current",
|
||||||
|
"rms_current_max",
|
||||||
|
"rms_voltage",
|
||||||
|
"rms_voltage_max",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"active_power",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"active_power",
|
||||||
|
"active_power_max",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"rms_current",
|
||||||
|
"rms_current_max",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"rms_voltage",
|
||||||
|
"rms_voltage_max",
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def test_elec_measurement_skip_unsupported_attribute(
|
||||||
|
hass,
|
||||||
|
elec_measurement_zha_dev,
|
||||||
|
supported_attributes,
|
||||||
|
):
|
||||||
|
"""Test zha electrical measurement skipping update of unsupported attributes."""
|
||||||
|
|
||||||
|
entity_id = ENTITY_ID_PREFIX.format("electrical_measurement")
|
||||||
|
zha_dev = elec_measurement_zha_dev
|
||||||
|
|
||||||
|
cluster = zha_dev.device.endpoints[1].electrical_measurement
|
||||||
|
|
||||||
|
all_attrs = {
|
||||||
|
"active_power",
|
||||||
|
"active_power_max",
|
||||||
|
"rms_current",
|
||||||
|
"rms_current_max",
|
||||||
|
"rms_voltage",
|
||||||
|
"rms_voltage_max",
|
||||||
|
}
|
||||||
|
for attr in all_attrs - supported_attributes:
|
||||||
|
cluster.add_unsupported_attribute(attr)
|
||||||
|
cluster.read_attributes.reset_mock()
|
||||||
|
|
||||||
|
await async_update_entity(hass, entity_id)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert cluster.read_attributes.call_count == math.ceil(
|
||||||
|
len(supported_attributes) / ZHA_CHANNEL_READS_PER_REQ
|
||||||
|
)
|
||||||
|
read_attrs = {
|
||||||
|
a for call in cluster.read_attributes.call_args_list for a in call[0][0]
|
||||||
|
}
|
||||||
|
assert read_attrs == supported_attributes
|
||||||
|
@ -117,6 +117,8 @@ DEVICES = [
|
|||||||
},
|
},
|
||||||
DEV_SIG_ENTITIES: [
|
DEV_SIG_ENTITIES: [
|
||||||
"sensor.centralite_3210_l_77665544_electrical_measurement",
|
"sensor.centralite_3210_l_77665544_electrical_measurement",
|
||||||
|
"sensor.centralite_3210_l_77665544_electrical_measurement_rms_current",
|
||||||
|
"sensor.centralite_3210_l_77665544_electrical_measurement_rms_voltage",
|
||||||
"sensor.centralite_3210_l_77665544_smartenergy_metering",
|
"sensor.centralite_3210_l_77665544_smartenergy_metering",
|
||||||
"sensor.centralite_3210_l_77665544_smartenergy_metering_summation_delivered",
|
"sensor.centralite_3210_l_77665544_smartenergy_metering_summation_delivered",
|
||||||
"switch.centralite_3210_l_77665544_on_off",
|
"switch.centralite_3210_l_77665544_on_off",
|
||||||
@ -142,6 +144,16 @@ DEVICES = [
|
|||||||
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
||||||
DEV_SIG_ENT_MAP_ID: "sensor.centralite_3210_l_77665544_electrical_measurement",
|
DEV_SIG_ENT_MAP_ID: "sensor.centralite_3210_l_77665544_electrical_measurement",
|
||||||
},
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_current"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSCurrent",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.centralite_3210_l_77665544_electrical_measurement_rms_current",
|
||||||
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_voltage"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSVoltage",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.centralite_3210_l_77665544_electrical_measurement_rms_voltage",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
DEV_SIG_EVT_CHANNELS: ["1:0x0019"],
|
DEV_SIG_EVT_CHANNELS: ["1:0x0019"],
|
||||||
SIG_MANUFACTURER: "CentraLite",
|
SIG_MANUFACTURER: "CentraLite",
|
||||||
@ -1436,6 +1448,8 @@ DEVICES = [
|
|||||||
"sensor.lumi_lumi_plug_maus01_77665544_analog_input",
|
"sensor.lumi_lumi_plug_maus01_77665544_analog_input",
|
||||||
"sensor.lumi_lumi_plug_maus01_77665544_analog_input_2",
|
"sensor.lumi_lumi_plug_maus01_77665544_analog_input_2",
|
||||||
"sensor.lumi_lumi_plug_maus01_77665544_electrical_measurement",
|
"sensor.lumi_lumi_plug_maus01_77665544_electrical_measurement",
|
||||||
|
"sensor.lumi_lumi_plug_maus01_77665544_electrical_measurement_rms_current",
|
||||||
|
"sensor.lumi_lumi_plug_maus01_77665544_electrical_measurement_rms_voltage",
|
||||||
"switch.lumi_lumi_plug_maus01_77665544_on_off",
|
"switch.lumi_lumi_plug_maus01_77665544_on_off",
|
||||||
],
|
],
|
||||||
DEV_SIG_ENT_MAP: {
|
DEV_SIG_ENT_MAP: {
|
||||||
@ -1459,6 +1473,16 @@ DEVICES = [
|
|||||||
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
||||||
DEV_SIG_ENT_MAP_ID: "sensor.lumi_lumi_plug_maus01_77665544_electrical_measurement",
|
DEV_SIG_ENT_MAP_ID: "sensor.lumi_lumi_plug_maus01_77665544_electrical_measurement",
|
||||||
},
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_current"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSCurrent",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.lumi_lumi_plug_maus01_77665544_electrical_measurement_rms_current",
|
||||||
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_voltage"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSVoltage",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.lumi_lumi_plug_maus01_77665544_electrical_measurement_rms_voltage",
|
||||||
|
},
|
||||||
("binary_sensor", "00:11:22:33:44:55:66:77-100-15"): {
|
("binary_sensor", "00:11:22:33:44:55:66:77-100-15"): {
|
||||||
DEV_SIG_CHANNELS: ["binary_input"],
|
DEV_SIG_CHANNELS: ["binary_input"],
|
||||||
DEV_SIG_ENT_MAP_CLASS: "BinaryInput",
|
DEV_SIG_ENT_MAP_CLASS: "BinaryInput",
|
||||||
@ -1493,6 +1517,8 @@ DEVICES = [
|
|||||||
"light.lumi_lumi_relay_c2acn01_77665544_on_off",
|
"light.lumi_lumi_relay_c2acn01_77665544_on_off",
|
||||||
"light.lumi_lumi_relay_c2acn01_77665544_on_off_2",
|
"light.lumi_lumi_relay_c2acn01_77665544_on_off_2",
|
||||||
"sensor.lumi_lumi_relay_c2acn01_77665544_electrical_measurement",
|
"sensor.lumi_lumi_relay_c2acn01_77665544_electrical_measurement",
|
||||||
|
"sensor.lumi_lumi_relay_c2acn01_77665544_electrical_measurement_rms_current",
|
||||||
|
"sensor.lumi_lumi_relay_c2acn01_77665544_electrical_measurement_rms_voltage",
|
||||||
],
|
],
|
||||||
DEV_SIG_ENT_MAP: {
|
DEV_SIG_ENT_MAP: {
|
||||||
("light", "00:11:22:33:44:55:66:77-1"): {
|
("light", "00:11:22:33:44:55:66:77-1"): {
|
||||||
@ -1505,6 +1531,16 @@ DEVICES = [
|
|||||||
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
||||||
DEV_SIG_ENT_MAP_ID: "sensor.lumi_lumi_relay_c2acn01_77665544_electrical_measurement",
|
DEV_SIG_ENT_MAP_ID: "sensor.lumi_lumi_relay_c2acn01_77665544_electrical_measurement",
|
||||||
},
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_current"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSCurrent",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.lumi_lumi_relay_c2acn01_77665544_electrical_measurement_rms_current",
|
||||||
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_voltage"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSVoltage",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.lumi_lumi_relay_c2acn01_77665544_electrical_measurement_rms_voltage",
|
||||||
|
},
|
||||||
("light", "00:11:22:33:44:55:66:77-2"): {
|
("light", "00:11:22:33:44:55:66:77-2"): {
|
||||||
DEV_SIG_CHANNELS: ["on_off"],
|
DEV_SIG_CHANNELS: ["on_off"],
|
||||||
DEV_SIG_ENT_MAP_CLASS: "Light",
|
DEV_SIG_ENT_MAP_CLASS: "Light",
|
||||||
@ -2566,6 +2602,8 @@ DEVICES = [
|
|||||||
DEV_SIG_ENTITIES: [
|
DEV_SIG_ENTITIES: [
|
||||||
"light.osram_lightify_rt_tunable_white_77665544_level_light_color_on_off",
|
"light.osram_lightify_rt_tunable_white_77665544_level_light_color_on_off",
|
||||||
"sensor.osram_lightify_rt_tunable_white_77665544_electrical_measurement",
|
"sensor.osram_lightify_rt_tunable_white_77665544_electrical_measurement",
|
||||||
|
"sensor.osram_lightify_rt_tunable_white_77665544_electrical_measurement_rms_current",
|
||||||
|
"sensor.osram_lightify_rt_tunable_white_77665544_electrical_measurement_rms_voltage",
|
||||||
],
|
],
|
||||||
DEV_SIG_ENT_MAP: {
|
DEV_SIG_ENT_MAP: {
|
||||||
("light", "00:11:22:33:44:55:66:77-3"): {
|
("light", "00:11:22:33:44:55:66:77-3"): {
|
||||||
@ -2578,6 +2616,16 @@ DEVICES = [
|
|||||||
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
||||||
DEV_SIG_ENT_MAP_ID: "sensor.osram_lightify_rt_tunable_white_77665544_electrical_measurement",
|
DEV_SIG_ENT_MAP_ID: "sensor.osram_lightify_rt_tunable_white_77665544_electrical_measurement",
|
||||||
},
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-3-2820-rms_current"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSCurrent",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.osram_lightify_rt_tunable_white_77665544_electrical_measurement_rms_current",
|
||||||
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-3-2820-rms_voltage"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSVoltage",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.osram_lightify_rt_tunable_white_77665544_electrical_measurement_rms_voltage",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
DEV_SIG_EVT_CHANNELS: ["3:0x0019"],
|
DEV_SIG_EVT_CHANNELS: ["3:0x0019"],
|
||||||
SIG_MANUFACTURER: "OSRAM",
|
SIG_MANUFACTURER: "OSRAM",
|
||||||
@ -2598,6 +2646,8 @@ DEVICES = [
|
|||||||
},
|
},
|
||||||
DEV_SIG_ENTITIES: [
|
DEV_SIG_ENTITIES: [
|
||||||
"sensor.osram_plug_01_77665544_electrical_measurement",
|
"sensor.osram_plug_01_77665544_electrical_measurement",
|
||||||
|
"sensor.osram_plug_01_77665544_electrical_measurement_rms_current",
|
||||||
|
"sensor.osram_plug_01_77665544_electrical_measurement_rms_voltage",
|
||||||
"switch.osram_plug_01_77665544_on_off",
|
"switch.osram_plug_01_77665544_on_off",
|
||||||
],
|
],
|
||||||
DEV_SIG_ENT_MAP: {
|
DEV_SIG_ENT_MAP: {
|
||||||
@ -2611,6 +2661,16 @@ DEVICES = [
|
|||||||
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
||||||
DEV_SIG_ENT_MAP_ID: "sensor.osram_plug_01_77665544_electrical_measurement",
|
DEV_SIG_ENT_MAP_ID: "sensor.osram_plug_01_77665544_electrical_measurement",
|
||||||
},
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-3-2820-rms_current"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSCurrent",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.osram_plug_01_77665544_electrical_measurement_rms_current",
|
||||||
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-3-2820-rms_voltage"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSVoltage",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.osram_plug_01_77665544_electrical_measurement_rms_voltage",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
DEV_SIG_EVT_CHANNELS: ["3:0x0019"],
|
DEV_SIG_EVT_CHANNELS: ["3:0x0019"],
|
||||||
SIG_MANUFACTURER: "OSRAM",
|
SIG_MANUFACTURER: "OSRAM",
|
||||||
@ -2870,6 +2930,8 @@ DEVICES = [
|
|||||||
},
|
},
|
||||||
DEV_SIG_ENTITIES: [
|
DEV_SIG_ENTITIES: [
|
||||||
"sensor.securifi_ltd_unk_model_77665544_electrical_measurement",
|
"sensor.securifi_ltd_unk_model_77665544_electrical_measurement",
|
||||||
|
"sensor.securifi_ltd_unk_model_77665544_electrical_measurement_rms_current",
|
||||||
|
"sensor.securifi_ltd_unk_model_77665544_electrical_measurement_rms_voltage",
|
||||||
"switch.securifi_ltd_unk_model_77665544_on_off",
|
"switch.securifi_ltd_unk_model_77665544_on_off",
|
||||||
],
|
],
|
||||||
DEV_SIG_ENT_MAP: {
|
DEV_SIG_ENT_MAP: {
|
||||||
@ -2883,6 +2945,16 @@ DEVICES = [
|
|||||||
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
||||||
DEV_SIG_ENT_MAP_ID: "sensor.securifi_ltd_unk_model_77665544_electrical_measurement",
|
DEV_SIG_ENT_MAP_ID: "sensor.securifi_ltd_unk_model_77665544_electrical_measurement",
|
||||||
},
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_current"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSCurrent",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.securifi_ltd_unk_model_77665544_electrical_measurement_rms_current",
|
||||||
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_voltage"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSVoltage",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.securifi_ltd_unk_model_77665544_electrical_measurement_rms_voltage",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
DEV_SIG_EVT_CHANNELS: ["1:0x0005", "1:0x0006", "1:0x0019"],
|
DEV_SIG_EVT_CHANNELS: ["1:0x0005", "1:0x0006", "1:0x0019"],
|
||||||
SIG_MANUFACTURER: "Securifi Ltd.",
|
SIG_MANUFACTURER: "Securifi Ltd.",
|
||||||
@ -2948,6 +3020,8 @@ DEVICES = [
|
|||||||
DEV_SIG_ENTITIES: [
|
DEV_SIG_ENTITIES: [
|
||||||
"light.sercomm_corp_sz_esw01_77665544_on_off",
|
"light.sercomm_corp_sz_esw01_77665544_on_off",
|
||||||
"sensor.sercomm_corp_sz_esw01_77665544_electrical_measurement",
|
"sensor.sercomm_corp_sz_esw01_77665544_electrical_measurement",
|
||||||
|
"sensor.sercomm_corp_sz_esw01_77665544_electrical_measurement_rms_current",
|
||||||
|
"sensor.sercomm_corp_sz_esw01_77665544_electrical_measurement_rms_voltage",
|
||||||
"sensor.sercomm_corp_sz_esw01_77665544_smartenergy_metering",
|
"sensor.sercomm_corp_sz_esw01_77665544_smartenergy_metering",
|
||||||
"sensor.sercomm_corp_sz_esw01_77665544_smartenergy_metering_summation_delivered",
|
"sensor.sercomm_corp_sz_esw01_77665544_smartenergy_metering_summation_delivered",
|
||||||
],
|
],
|
||||||
@ -2972,6 +3046,16 @@ DEVICES = [
|
|||||||
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
||||||
DEV_SIG_ENT_MAP_ID: "sensor.sercomm_corp_sz_esw01_77665544_electrical_measurement",
|
DEV_SIG_ENT_MAP_ID: "sensor.sercomm_corp_sz_esw01_77665544_electrical_measurement",
|
||||||
},
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_current"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSCurrent",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.sercomm_corp_sz_esw01_77665544_electrical_measurement_rms_current",
|
||||||
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_voltage"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSVoltage",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.sercomm_corp_sz_esw01_77665544_electrical_measurement_rms_voltage",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
DEV_SIG_EVT_CHANNELS: ["1:0x0019", "2:0x0006"],
|
DEV_SIG_EVT_CHANNELS: ["1:0x0019", "2:0x0006"],
|
||||||
SIG_MANUFACTURER: "Sercomm Corp.",
|
SIG_MANUFACTURER: "Sercomm Corp.",
|
||||||
@ -3035,6 +3119,8 @@ DEVICES = [
|
|||||||
},
|
},
|
||||||
DEV_SIG_ENTITIES: [
|
DEV_SIG_ENTITIES: [
|
||||||
"sensor.sinope_technologies_rm3250zb_77665544_electrical_measurement",
|
"sensor.sinope_technologies_rm3250zb_77665544_electrical_measurement",
|
||||||
|
"sensor.sinope_technologies_rm3250zb_77665544_electrical_measurement_rms_current",
|
||||||
|
"sensor.sinope_technologies_rm3250zb_77665544_electrical_measurement_rms_voltage",
|
||||||
"switch.sinope_technologies_rm3250zb_77665544_on_off",
|
"switch.sinope_technologies_rm3250zb_77665544_on_off",
|
||||||
],
|
],
|
||||||
DEV_SIG_ENT_MAP: {
|
DEV_SIG_ENT_MAP: {
|
||||||
@ -3048,6 +3134,16 @@ DEVICES = [
|
|||||||
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
||||||
DEV_SIG_ENT_MAP_ID: "sensor.sinope_technologies_rm3250zb_77665544_electrical_measurement",
|
DEV_SIG_ENT_MAP_ID: "sensor.sinope_technologies_rm3250zb_77665544_electrical_measurement",
|
||||||
},
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_current"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSCurrent",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.sinope_technologies_rm3250zb_77665544_electrical_measurement_rms_current",
|
||||||
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_voltage"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSVoltage",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.sinope_technologies_rm3250zb_77665544_electrical_measurement_rms_voltage",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
DEV_SIG_EVT_CHANNELS: ["1:0x0019"],
|
DEV_SIG_EVT_CHANNELS: ["1:0x0019"],
|
||||||
SIG_MANUFACTURER: "Sinope Technologies",
|
SIG_MANUFACTURER: "Sinope Technologies",
|
||||||
@ -3075,6 +3171,8 @@ DEVICES = [
|
|||||||
DEV_SIG_ENTITIES: [
|
DEV_SIG_ENTITIES: [
|
||||||
"climate.sinope_technologies_th1123zb_77665544_thermostat",
|
"climate.sinope_technologies_th1123zb_77665544_thermostat",
|
||||||
"sensor.sinope_technologies_th1123zb_77665544_electrical_measurement",
|
"sensor.sinope_technologies_th1123zb_77665544_electrical_measurement",
|
||||||
|
"sensor.sinope_technologies_th1123zb_77665544_electrical_measurement_rms_current",
|
||||||
|
"sensor.sinope_technologies_th1123zb_77665544_electrical_measurement_rms_voltage",
|
||||||
"sensor.sinope_technologies_th1123zb_77665544_temperature",
|
"sensor.sinope_technologies_th1123zb_77665544_temperature",
|
||||||
],
|
],
|
||||||
DEV_SIG_ENT_MAP: {
|
DEV_SIG_ENT_MAP: {
|
||||||
@ -3093,6 +3191,16 @@ DEVICES = [
|
|||||||
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
||||||
DEV_SIG_ENT_MAP_ID: "sensor.sinope_technologies_th1123zb_77665544_electrical_measurement",
|
DEV_SIG_ENT_MAP_ID: "sensor.sinope_technologies_th1123zb_77665544_electrical_measurement",
|
||||||
},
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_current"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSCurrent",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.sinope_technologies_th1123zb_77665544_electrical_measurement_rms_current",
|
||||||
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_voltage"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSVoltage",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.sinope_technologies_th1123zb_77665544_electrical_measurement_rms_voltage",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
DEV_SIG_EVT_CHANNELS: ["1:0x0019"],
|
DEV_SIG_EVT_CHANNELS: ["1:0x0019"],
|
||||||
SIG_MANUFACTURER: "Sinope Technologies",
|
SIG_MANUFACTURER: "Sinope Technologies",
|
||||||
@ -3120,6 +3228,8 @@ DEVICES = [
|
|||||||
},
|
},
|
||||||
DEV_SIG_ENTITIES: [
|
DEV_SIG_ENTITIES: [
|
||||||
"sensor.sinope_technologies_th1124zb_77665544_electrical_measurement",
|
"sensor.sinope_technologies_th1124zb_77665544_electrical_measurement",
|
||||||
|
"sensor.sinope_technologies_th1124zb_77665544_electrical_measurement_rms_current",
|
||||||
|
"sensor.sinope_technologies_th1124zb_77665544_electrical_measurement_rms_voltage",
|
||||||
"sensor.sinope_technologies_th1124zb_77665544_temperature",
|
"sensor.sinope_technologies_th1124zb_77665544_temperature",
|
||||||
"climate.sinope_technologies_th1124zb_77665544_thermostat",
|
"climate.sinope_technologies_th1124zb_77665544_thermostat",
|
||||||
],
|
],
|
||||||
@ -3139,6 +3249,16 @@ DEVICES = [
|
|||||||
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
||||||
DEV_SIG_ENT_MAP_ID: "sensor.sinope_technologies_th1124zb_77665544_electrical_measurement",
|
DEV_SIG_ENT_MAP_ID: "sensor.sinope_technologies_th1124zb_77665544_electrical_measurement",
|
||||||
},
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_current"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSCurrent",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.sinope_technologies_th1124zb_77665544_electrical_measurement_rms_current",
|
||||||
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_voltage"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSVoltage",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.sinope_technologies_th1124zb_77665544_electrical_measurement_rms_voltage",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
DEV_SIG_EVT_CHANNELS: ["1:0x0019"],
|
DEV_SIG_EVT_CHANNELS: ["1:0x0019"],
|
||||||
SIG_MANUFACTURER: "Sinope Technologies",
|
SIG_MANUFACTURER: "Sinope Technologies",
|
||||||
@ -3159,6 +3279,8 @@ DEVICES = [
|
|||||||
},
|
},
|
||||||
DEV_SIG_ENTITIES: [
|
DEV_SIG_ENTITIES: [
|
||||||
"sensor.smartthings_outletv4_77665544_electrical_measurement",
|
"sensor.smartthings_outletv4_77665544_electrical_measurement",
|
||||||
|
"sensor.smartthings_outletv4_77665544_electrical_measurement_rms_current",
|
||||||
|
"sensor.smartthings_outletv4_77665544_electrical_measurement_rms_voltage",
|
||||||
"switch.smartthings_outletv4_77665544_on_off",
|
"switch.smartthings_outletv4_77665544_on_off",
|
||||||
],
|
],
|
||||||
DEV_SIG_ENT_MAP: {
|
DEV_SIG_ENT_MAP: {
|
||||||
@ -3172,6 +3294,16 @@ DEVICES = [
|
|||||||
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurement",
|
||||||
DEV_SIG_ENT_MAP_ID: "sensor.smartthings_outletv4_77665544_electrical_measurement",
|
DEV_SIG_ENT_MAP_ID: "sensor.smartthings_outletv4_77665544_electrical_measurement",
|
||||||
},
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_current"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSCurrent",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.smartthings_outletv4_77665544_electrical_measurement_rms_current",
|
||||||
|
},
|
||||||
|
("sensor", "00:11:22:33:44:55:66:77-1-2820-rms_voltage"): {
|
||||||
|
DEV_SIG_CHANNELS: ["electrical_measurement"],
|
||||||
|
DEV_SIG_ENT_MAP_CLASS: "ElectricalMeasurementRMSVoltage",
|
||||||
|
DEV_SIG_ENT_MAP_ID: "sensor.smartthings_outletv4_77665544_electrical_measurement_rms_voltage",
|
||||||
|
},
|
||||||
("binary_sensor", "00:11:22:33:44:55:66:77-1-15"): {
|
("binary_sensor", "00:11:22:33:44:55:66:77-1-15"): {
|
||||||
DEV_SIG_CHANNELS: ["binary_input"],
|
DEV_SIG_CHANNELS: ["binary_input"],
|
||||||
DEV_SIG_ENT_MAP_CLASS: "BinaryInput",
|
DEV_SIG_ENT_MAP_CLASS: "BinaryInput",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user