diff --git a/homeassistant/components/zha/core/channels/measurement.py b/homeassistant/components/zha/core/channels/measurement.py index 19ecc8a633562b..093c04245c46f1 100644 --- a/homeassistant/components/zha/core/channels/measurement.py +++ b/homeassistant/components/zha/core/channels/measurement.py @@ -62,6 +62,30 @@ class RelativeHumidity(ZigbeeChannel): ] +@registries.ZIGBEE_CHANNEL_REGISTRY.register(measurement.SoilMoisture.cluster_id) +class SoilMoisture(ZigbeeChannel): + """Soil Moisture measurement channel.""" + + REPORT_CONFIG = [ + { + "attr": "measured_value", + "config": (REPORT_CONFIG_MIN_INT, REPORT_CONFIG_MAX_INT, 100), + } + ] + + +@registries.ZIGBEE_CHANNEL_REGISTRY.register(measurement.LeafWetness.cluster_id) +class LeafWetness(ZigbeeChannel): + """Leaf Wetness measurement channel.""" + + REPORT_CONFIG = [ + { + "attr": "measured_value", + "config": (REPORT_CONFIG_MIN_INT, REPORT_CONFIG_MAX_INT, 100), + } + ] + + @registries.ZIGBEE_CHANNEL_REGISTRY.register( measurement.TemperatureMeasurement.cluster_id ) diff --git a/homeassistant/components/zha/core/const.py b/homeassistant/components/zha/core/const.py index dd6832e0d6b9ce..de29ac0f9f642a 100644 --- a/homeassistant/components/zha/core/const.py +++ b/homeassistant/components/zha/core/const.py @@ -84,6 +84,8 @@ CHANNEL_EVENT_RELAY = "event_relay" CHANNEL_FAN = "fan" CHANNEL_HUMIDITY = "humidity" +CHANNEL_SOIL_MOISTURE = "soil_moisture" +CHANNEL_LEAF_WETNESS = "leaf_wetness" CHANNEL_IAS_ACE = "ias_ace" CHANNEL_IAS_WD = "ias_wd" CHANNEL_IDENTIFY = "identify" diff --git a/homeassistant/components/zha/core/registries.py b/homeassistant/components/zha/core/registries.py index 8b2c4d11fbfec8..eeee0c5c629567 100644 --- a/homeassistant/components/zha/core/registries.py +++ b/homeassistant/components/zha/core/registries.py @@ -82,6 +82,8 @@ zcl.clusters.measurement.OccupancySensing.cluster_id: BINARY_SENSOR, zcl.clusters.measurement.PressureMeasurement.cluster_id: SENSOR, zcl.clusters.measurement.RelativeHumidity.cluster_id: SENSOR, + zcl.clusters.measurement.SoilMoisture.cluster_id: SENSOR, + zcl.clusters.measurement.LeafWetness.cluster_id: SENSOR, zcl.clusters.measurement.TemperatureMeasurement.cluster_id: SENSOR, zcl.clusters.security.IasZone.cluster_id: BINARY_SENSOR, } diff --git a/homeassistant/components/zha/sensor.py b/homeassistant/components/zha/sensor.py index 2281d5295bca07..365a7d8084fad3 100644 --- a/homeassistant/components/zha/sensor.py +++ b/homeassistant/components/zha/sensor.py @@ -61,9 +61,11 @@ CHANNEL_ELECTRICAL_MEASUREMENT, CHANNEL_HUMIDITY, CHANNEL_ILLUMINANCE, + CHANNEL_LEAF_WETNESS, CHANNEL_POWER_CONFIGURATION, CHANNEL_PRESSURE, CHANNEL_SMARTENERGY_METERING, + CHANNEL_SOIL_MOISTURE, CHANNEL_TEMPERATURE, CHANNEL_THERMOSTAT, DATA_ZHA, @@ -353,6 +355,28 @@ class Humidity(Sensor): _unit = PERCENTAGE +@STRICT_MATCH(channel_names=CHANNEL_SOIL_MOISTURE) +class SoilMoisture(Sensor): + """Soil Moisture sensor.""" + + SENSOR_ATTR = "measured_value" + _device_class = DEVICE_CLASS_HUMIDITY + _divisor = 100 + _state_class = STATE_CLASS_MEASUREMENT + _unit = PERCENTAGE + + +@STRICT_MATCH(channel_names=CHANNEL_LEAF_WETNESS) +class LeafWetness(Sensor): + """Leaf Wetness sensor.""" + + SENSOR_ATTR = "measured_value" + _device_class = DEVICE_CLASS_HUMIDITY + _divisor = 100 + _state_class = STATE_CLASS_MEASUREMENT + _unit = PERCENTAGE + + @STRICT_MATCH(channel_names=CHANNEL_ILLUMINANCE) class Illuminance(Sensor): """Illuminance Sensor.""" diff --git a/tests/components/zha/zha_devices_list.py b/tests/components/zha/zha_devices_list.py index e85f4c270d5766..2ef2e578dce0ad 100644 --- a/tests/components/zha/zha_devices_list.py +++ b/tests/components/zha/zha_devices_list.py @@ -3985,4 +3985,42 @@ SIG_MODEL: "XBee3", SIG_NODE_DESC: b"\x01@\x8e\x1e\x10R\xff\x00\x00,\xff\x00\x00", }, + { + DEV_SIG_DEV_NO: 99, + SIG_ENDPOINTS: { + 1: { + SIG_EP_TYPE: 0x000C, + DEV_SIG_EP_ID: 1, + SIG_EP_INPUT: [0x0000, 0x0001, 0x0402, 0x0408], + SIG_EP_OUTPUT: [], + SIG_EP_PROFILE: 260, + } + }, + DEV_SIG_ENTITIES: [ + "sensor.efektalab_ru_efekta_pws_77665544_power", + "sensor.efektalab_ru_efekta_pws_77665544_temperature", + "sensor.efektalab_ru_efekta_pws_77665544_soil_moisture", + ], + DEV_SIG_ENT_MAP: { + ("sensor", "00:11:22:33:44:55:66:77-1-1"): { + DEV_SIG_CHANNELS: ["power"], + DEV_SIG_ENT_MAP_CLASS: "Battery", + DEV_SIG_ENT_MAP_ID: "sensor.efektalab_ru_efekta_pws_77665544_power", + }, + ("sensor", "00:11:22:33:44:55:66:77-1-1026"): { + DEV_SIG_CHANNELS: ["temperature"], + DEV_SIG_ENT_MAP_CLASS: "Temperature", + DEV_SIG_ENT_MAP_ID: "sensor.efektalab_ru_efekta_pws_77665544_temperature", + }, + ("sensor", "00:11:22:33:44:55:66:77-1-1032"): { + DEV_SIG_CHANNELS: ["soil_moisture"], + DEV_SIG_ENT_MAP_CLASS: "SoilMoisture", + DEV_SIG_ENT_MAP_ID: "sensor.efektalab_ru_efekta_pws_77665544_soil_moisture", + }, + }, + DEV_SIG_EVT_CHANNELS: [], + SIG_MANUFACTURER: "efektalab.ru", + SIG_MODEL: "EFEKTA_PWS", + SIG_NODE_DESC: b"\x02@\x80\x00\x00P\xa0\x00\x00\x00\xa0\x00\x00", + }, ]