Skip to content

Commit 1512cd5

Browse files
authored
Add Matter battery replacement description (#132974)
1 parent 73e3e91 commit 1512cd5

File tree

5 files changed

+316
-0
lines changed

5 files changed

+316
-0
lines changed

homeassistant/components/matter/icons.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@
4343
"air_quality": {
4444
"default": "mdi:air-filter"
4545
},
46+
"bat_replacement_description": {
47+
"default": "mdi:battery-sync"
48+
},
4649
"hepa_filter_condition": {
4750
"default": "mdi:filter-check"
4851
},

homeassistant/components/matter/sensor.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,20 @@ def _update_from_device(self) -> None:
231231
entity_class=MatterSensor,
232232
required_attributes=(clusters.PowerSource.Attributes.BatVoltage,),
233233
),
234+
MatterDiscoverySchema(
235+
platform=Platform.SENSOR,
236+
entity_description=MatterSensorEntityDescription(
237+
key="PowerSourceBatReplacementDescription",
238+
translation_key="battery_replacement_description",
239+
native_unit_of_measurement=None,
240+
device_class=None,
241+
entity_category=EntityCategory.DIAGNOSTIC,
242+
),
243+
entity_class=MatterSensor,
244+
required_attributes=(
245+
clusters.PowerSource.Attributes.BatReplacementDescription,
246+
),
247+
),
234248
MatterDiscoverySchema(
235249
platform=Platform.SENSOR,
236250
entity_description=MatterSensorEntityDescription(

homeassistant/components/matter/strings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,9 @@
245245
},
246246
"valve_position": {
247247
"name": "Valve position"
248+
},
249+
"battery_replacement_description": {
250+
"name": "Battery type"
248251
}
249252
},
250253
"switch": {

tests/components/matter/snapshots/test_sensor.ambr

Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,6 +1145,98 @@
11451145
'state': '189.0',
11461146
})
11471147
# ---
1148+
# name: test_sensors[door_lock][sensor.mock_door_lock_battery_type-entry]
1149+
EntityRegistryEntrySnapshot({
1150+
'aliases': set({
1151+
}),
1152+
'area_id': None,
1153+
'capabilities': None,
1154+
'config_entry_id': <ANY>,
1155+
'device_class': None,
1156+
'device_id': <ANY>,
1157+
'disabled_by': None,
1158+
'domain': 'sensor',
1159+
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
1160+
'entity_id': 'sensor.mock_door_lock_battery_type',
1161+
'has_entity_name': True,
1162+
'hidden_by': None,
1163+
'icon': None,
1164+
'id': <ANY>,
1165+
'labels': set({
1166+
}),
1167+
'name': None,
1168+
'options': dict({
1169+
}),
1170+
'original_device_class': None,
1171+
'original_icon': None,
1172+
'original_name': 'Battery type',
1173+
'platform': 'matter',
1174+
'previous_unique_id': None,
1175+
'supported_features': 0,
1176+
'translation_key': 'battery_replacement_description',
1177+
'unique_id': '00000000000004D2-0000000000000001-MatterNodeDevice-1-PowerSourceBatReplacementDescription-47-19',
1178+
'unit_of_measurement': None,
1179+
})
1180+
# ---
1181+
# name: test_sensors[door_lock][sensor.mock_door_lock_battery_type-state]
1182+
StateSnapshot({
1183+
'attributes': ReadOnlyDict({
1184+
'friendly_name': 'Mock Door Lock Battery type',
1185+
}),
1186+
'context': <ANY>,
1187+
'entity_id': 'sensor.mock_door_lock_battery_type',
1188+
'last_changed': <ANY>,
1189+
'last_reported': <ANY>,
1190+
'last_updated': <ANY>,
1191+
'state': '',
1192+
})
1193+
# ---
1194+
# name: test_sensors[door_lock_with_unbolt][sensor.mock_door_lock_battery_type-entry]
1195+
EntityRegistryEntrySnapshot({
1196+
'aliases': set({
1197+
}),
1198+
'area_id': None,
1199+
'capabilities': None,
1200+
'config_entry_id': <ANY>,
1201+
'device_class': None,
1202+
'device_id': <ANY>,
1203+
'disabled_by': None,
1204+
'domain': 'sensor',
1205+
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
1206+
'entity_id': 'sensor.mock_door_lock_battery_type',
1207+
'has_entity_name': True,
1208+
'hidden_by': None,
1209+
'icon': None,
1210+
'id': <ANY>,
1211+
'labels': set({
1212+
}),
1213+
'name': None,
1214+
'options': dict({
1215+
}),
1216+
'original_device_class': None,
1217+
'original_icon': None,
1218+
'original_name': 'Battery type',
1219+
'platform': 'matter',
1220+
'previous_unique_id': None,
1221+
'supported_features': 0,
1222+
'translation_key': 'battery_replacement_description',
1223+
'unique_id': '00000000000004D2-0000000000000001-MatterNodeDevice-1-PowerSourceBatReplacementDescription-47-19',
1224+
'unit_of_measurement': None,
1225+
})
1226+
# ---
1227+
# name: test_sensors[door_lock_with_unbolt][sensor.mock_door_lock_battery_type-state]
1228+
StateSnapshot({
1229+
'attributes': ReadOnlyDict({
1230+
'friendly_name': 'Mock Door Lock Battery type',
1231+
}),
1232+
'context': <ANY>,
1233+
'entity_id': 'sensor.mock_door_lock_battery_type',
1234+
'last_changed': <ANY>,
1235+
'last_reported': <ANY>,
1236+
'last_updated': <ANY>,
1237+
'state': '',
1238+
})
1239+
# ---
11481240
# name: test_sensors[eve_contact_sensor][sensor.eve_door_battery-entry]
11491241
EntityRegistryEntrySnapshot({
11501242
'aliases': set({
@@ -1196,6 +1288,52 @@
11961288
'state': '100',
11971289
})
11981290
# ---
1291+
# name: test_sensors[eve_contact_sensor][sensor.eve_door_battery_type-entry]
1292+
EntityRegistryEntrySnapshot({
1293+
'aliases': set({
1294+
}),
1295+
'area_id': None,
1296+
'capabilities': None,
1297+
'config_entry_id': <ANY>,
1298+
'device_class': None,
1299+
'device_id': <ANY>,
1300+
'disabled_by': None,
1301+
'domain': 'sensor',
1302+
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
1303+
'entity_id': 'sensor.eve_door_battery_type',
1304+
'has_entity_name': True,
1305+
'hidden_by': None,
1306+
'icon': None,
1307+
'id': <ANY>,
1308+
'labels': set({
1309+
}),
1310+
'name': None,
1311+
'options': dict({
1312+
}),
1313+
'original_device_class': None,
1314+
'original_icon': None,
1315+
'original_name': 'Battery type',
1316+
'platform': 'matter',
1317+
'previous_unique_id': None,
1318+
'supported_features': 0,
1319+
'translation_key': 'battery_replacement_description',
1320+
'unique_id': '00000000000004D2-0000000000000001-MatterNodeDevice-1-PowerSourceBatReplacementDescription-47-19',
1321+
'unit_of_measurement': None,
1322+
})
1323+
# ---
1324+
# name: test_sensors[eve_contact_sensor][sensor.eve_door_battery_type-state]
1325+
StateSnapshot({
1326+
'attributes': ReadOnlyDict({
1327+
'friendly_name': 'Eve Door Battery type',
1328+
}),
1329+
'context': <ANY>,
1330+
'entity_id': 'sensor.eve_door_battery_type',
1331+
'last_changed': <ANY>,
1332+
'last_reported': <ANY>,
1333+
'last_updated': <ANY>,
1334+
'state': '',
1335+
})
1336+
# ---
11991337
# name: test_sensors[eve_contact_sensor][sensor.eve_door_voltage-entry]
12001338
EntityRegistryEntrySnapshot({
12011339
'aliases': set({
@@ -1733,6 +1871,52 @@
17331871
'state': '100',
17341872
})
17351873
# ---
1874+
# name: test_sensors[eve_thermo][sensor.eve_thermo_battery_type-entry]
1875+
EntityRegistryEntrySnapshot({
1876+
'aliases': set({
1877+
}),
1878+
'area_id': None,
1879+
'capabilities': None,
1880+
'config_entry_id': <ANY>,
1881+
'device_class': None,
1882+
'device_id': <ANY>,
1883+
'disabled_by': None,
1884+
'domain': 'sensor',
1885+
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
1886+
'entity_id': 'sensor.eve_thermo_battery_type',
1887+
'has_entity_name': True,
1888+
'hidden_by': None,
1889+
'icon': None,
1890+
'id': <ANY>,
1891+
'labels': set({
1892+
}),
1893+
'name': None,
1894+
'options': dict({
1895+
}),
1896+
'original_device_class': None,
1897+
'original_icon': None,
1898+
'original_name': 'Battery type',
1899+
'platform': 'matter',
1900+
'previous_unique_id': None,
1901+
'supported_features': 0,
1902+
'translation_key': 'battery_replacement_description',
1903+
'unique_id': '00000000000004D2-0000000000000021-MatterNodeDevice-0-PowerSourceBatReplacementDescription-47-19',
1904+
'unit_of_measurement': None,
1905+
})
1906+
# ---
1907+
# name: test_sensors[eve_thermo][sensor.eve_thermo_battery_type-state]
1908+
StateSnapshot({
1909+
'attributes': ReadOnlyDict({
1910+
'friendly_name': 'Eve Thermo Battery type',
1911+
}),
1912+
'context': <ANY>,
1913+
'entity_id': 'sensor.eve_thermo_battery_type',
1914+
'last_changed': <ANY>,
1915+
'last_reported': <ANY>,
1916+
'last_updated': <ANY>,
1917+
'state': '',
1918+
})
1919+
# ---
17361920
# name: test_sensors[eve_thermo][sensor.eve_thermo_valve_position-entry]
17371921
EntityRegistryEntrySnapshot({
17381922
'aliases': set({
@@ -1882,6 +2066,52 @@
18822066
'state': '100',
18832067
})
18842068
# ---
2069+
# name: test_sensors[eve_weather_sensor][sensor.eve_weather_battery_type-entry]
2070+
EntityRegistryEntrySnapshot({
2071+
'aliases': set({
2072+
}),
2073+
'area_id': None,
2074+
'capabilities': None,
2075+
'config_entry_id': <ANY>,
2076+
'device_class': None,
2077+
'device_id': <ANY>,
2078+
'disabled_by': None,
2079+
'domain': 'sensor',
2080+
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
2081+
'entity_id': 'sensor.eve_weather_battery_type',
2082+
'has_entity_name': True,
2083+
'hidden_by': None,
2084+
'icon': None,
2085+
'id': <ANY>,
2086+
'labels': set({
2087+
}),
2088+
'name': None,
2089+
'options': dict({
2090+
}),
2091+
'original_device_class': None,
2092+
'original_icon': None,
2093+
'original_name': 'Battery type',
2094+
'platform': 'matter',
2095+
'previous_unique_id': None,
2096+
'supported_features': 0,
2097+
'translation_key': 'battery_replacement_description',
2098+
'unique_id': '00000000000004D2-000000000000001D-MatterNodeDevice-0-PowerSourceBatReplacementDescription-47-19',
2099+
'unit_of_measurement': None,
2100+
})
2101+
# ---
2102+
# name: test_sensors[eve_weather_sensor][sensor.eve_weather_battery_type-state]
2103+
StateSnapshot({
2104+
'attributes': ReadOnlyDict({
2105+
'friendly_name': 'Eve Weather Battery type',
2106+
}),
2107+
'context': <ANY>,
2108+
'entity_id': 'sensor.eve_weather_battery_type',
2109+
'last_changed': <ANY>,
2110+
'last_reported': <ANY>,
2111+
'last_updated': <ANY>,
2112+
'state': '',
2113+
})
2114+
# ---
18852115
# name: test_sensors[eve_weather_sensor][sensor.eve_weather_humidity-entry]
18862116
EntityRegistryEntrySnapshot({
18872117
'aliases': set({
@@ -2735,6 +2965,52 @@
27352965
'state': '94',
27362966
})
27372967
# ---
2968+
# name: test_sensors[smoke_detector][sensor.smoke_sensor_battery_type-entry]
2969+
EntityRegistryEntrySnapshot({
2970+
'aliases': set({
2971+
}),
2972+
'area_id': None,
2973+
'capabilities': None,
2974+
'config_entry_id': <ANY>,
2975+
'device_class': None,
2976+
'device_id': <ANY>,
2977+
'disabled_by': None,
2978+
'domain': 'sensor',
2979+
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
2980+
'entity_id': 'sensor.smoke_sensor_battery_type',
2981+
'has_entity_name': True,
2982+
'hidden_by': None,
2983+
'icon': None,
2984+
'id': <ANY>,
2985+
'labels': set({
2986+
}),
2987+
'name': None,
2988+
'options': dict({
2989+
}),
2990+
'original_device_class': None,
2991+
'original_icon': None,
2992+
'original_name': 'Battery type',
2993+
'platform': 'matter',
2994+
'previous_unique_id': None,
2995+
'supported_features': 0,
2996+
'translation_key': 'battery_replacement_description',
2997+
'unique_id': '00000000000004D2-0000000000000001-MatterNodeDevice-1-PowerSourceBatReplacementDescription-47-19',
2998+
'unit_of_measurement': None,
2999+
})
3000+
# ---
3001+
# name: test_sensors[smoke_detector][sensor.smoke_sensor_battery_type-state]
3002+
StateSnapshot({
3003+
'attributes': ReadOnlyDict({
3004+
'friendly_name': 'Smoke sensor Battery type',
3005+
}),
3006+
'context': <ANY>,
3007+
'entity_id': 'sensor.smoke_sensor_battery_type',
3008+
'last_changed': <ANY>,
3009+
'last_reported': <ANY>,
3010+
'last_updated': <ANY>,
3011+
'state': 'CR123A',
3012+
})
3013+
# ---
27383014
# name: test_sensors[smoke_detector][sensor.smoke_sensor_voltage-entry]
27393015
EntityRegistryEntrySnapshot({
27403016
'aliases': set({

tests/components/matter/test_sensor.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,26 @@ async def test_battery_sensor_voltage(
174174
assert entry.entity_category == EntityCategory.DIAGNOSTIC
175175

176176

177+
@pytest.mark.parametrize("node_fixture", ["smoke_detector"])
178+
async def test_battery_sensor_description(
179+
hass: HomeAssistant,
180+
entity_registry: er.EntityRegistry,
181+
matter_client: MagicMock,
182+
matter_node: MatterNode,
183+
) -> None:
184+
"""Test battery replacement description sensor."""
185+
state = hass.states.get("sensor.smoke_sensor_battery_type")
186+
assert state
187+
assert state.state == "CR123A"
188+
189+
set_node_attribute(matter_node, 1, 47, 19, "CR2032")
190+
await trigger_subscription_callback(hass, matter_client)
191+
192+
state = hass.states.get("sensor.smoke_sensor_battery_type")
193+
assert state
194+
assert state.state == "CR2032"
195+
196+
177197
@pytest.mark.parametrize("node_fixture", ["eve_thermo"])
178198
async def test_eve_thermo_sensor(
179199
hass: HomeAssistant,

0 commit comments

Comments
 (0)