mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 21:27:38 +00:00
Add support for toothbrushes to xiaomi-ble (#97276)
* Add support for toothbrushes to xiaomi-ble * use str for string
This commit is contained in:
parent
e4d9daf746
commit
0caeac1a82
@ -72,6 +72,9 @@ BINARY_SENSOR_DESCRIPTIONS = {
|
|||||||
key=ExtendedBinarySensorDeviceClass.PRY_THE_DOOR,
|
key=ExtendedBinarySensorDeviceClass.PRY_THE_DOOR,
|
||||||
device_class=BinarySensorDeviceClass.TAMPER,
|
device_class=BinarySensorDeviceClass.TAMPER,
|
||||||
),
|
),
|
||||||
|
ExtendedBinarySensorDeviceClass.TOOTHBRUSH: BinarySensorEntityDescription(
|
||||||
|
key=ExtendedBinarySensorDeviceClass.TOOTHBRUSH,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,5 +24,5 @@
|
|||||||
"dependencies": ["bluetooth_adapters"],
|
"dependencies": ["bluetooth_adapters"],
|
||||||
"documentation": "https://www.home-assistant.io/integrations/xiaomi_ble",
|
"documentation": "https://www.home-assistant.io/integrations/xiaomi_ble",
|
||||||
"iot_class": "local_push",
|
"iot_class": "local_push",
|
||||||
"requirements": ["xiaomi-ble==0.20.0"]
|
"requirements": ["xiaomi-ble==0.21.1"]
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from xiaomi_ble import DeviceClass, SensorUpdate, Units
|
from xiaomi_ble import DeviceClass, SensorUpdate, Units
|
||||||
|
from xiaomi_ble.parser import ExtendedSensorDeviceClass
|
||||||
|
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
from homeassistant.components.bluetooth.passive_update_processor import (
|
from homeassistant.components.bluetooth.passive_update_processor import (
|
||||||
@ -25,6 +26,7 @@ from homeassistant.const import (
|
|||||||
UnitOfMass,
|
UnitOfMass,
|
||||||
UnitOfPressure,
|
UnitOfPressure,
|
||||||
UnitOfTemperature,
|
UnitOfTemperature,
|
||||||
|
UnitOfTime,
|
||||||
)
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
@ -129,13 +131,23 @@ SENSOR_DESCRIPTIONS = {
|
|||||||
state_class=SensorStateClass.MEASUREMENT,
|
state_class=SensorStateClass.MEASUREMENT,
|
||||||
entity_category=EntityCategory.DIAGNOSTIC,
|
entity_category=EntityCategory.DIAGNOSTIC,
|
||||||
),
|
),
|
||||||
# Used for e.g. consumable sensor on WX08ZM
|
# Used for e.g. consumable sensor on WX08ZM and M1S-T500
|
||||||
(None, Units.PERCENTAGE): SensorEntityDescription(
|
(ExtendedSensorDeviceClass.CONSUMABLE, Units.PERCENTAGE): SensorEntityDescription(
|
||||||
key=str(Units.PERCENTAGE),
|
key=str(ExtendedSensorDeviceClass.CONSUMABLE),
|
||||||
device_class=None,
|
|
||||||
native_unit_of_measurement=PERCENTAGE,
|
native_unit_of_measurement=PERCENTAGE,
|
||||||
state_class=SensorStateClass.MEASUREMENT,
|
state_class=SensorStateClass.MEASUREMENT,
|
||||||
),
|
),
|
||||||
|
# Used for score after brushing with a toothbrush
|
||||||
|
(ExtendedSensorDeviceClass.SCORE, None): SensorEntityDescription(
|
||||||
|
key=str(ExtendedSensorDeviceClass.SCORE),
|
||||||
|
state_class=SensorStateClass.MEASUREMENT,
|
||||||
|
),
|
||||||
|
# Used for counting during brushing
|
||||||
|
(ExtendedSensorDeviceClass.COUNTER, Units.TIME_SECONDS): SensorEntityDescription(
|
||||||
|
key=str(ExtendedSensorDeviceClass.COUNTER),
|
||||||
|
native_unit_of_measurement=UnitOfTime.SECONDS,
|
||||||
|
state_class=SensorStateClass.MEASUREMENT,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -153,7 +165,7 @@ def sensor_update_to_bluetooth_data_update(
|
|||||||
(description.device_class, description.native_unit_of_measurement)
|
(description.device_class, description.native_unit_of_measurement)
|
||||||
]
|
]
|
||||||
for device_key, description in sensor_update.entity_descriptions.items()
|
for device_key, description in sensor_update.entity_descriptions.items()
|
||||||
if description.native_unit_of_measurement
|
if description.device_class
|
||||||
},
|
},
|
||||||
entity_data={
|
entity_data={
|
||||||
device_key_to_bluetooth_entity_key(device_key): sensor_values.native_value
|
device_key_to_bluetooth_entity_key(device_key): sensor_values.native_value
|
||||||
|
@ -2698,7 +2698,7 @@ wyoming==1.1.0
|
|||||||
xbox-webapi==2.0.11
|
xbox-webapi==2.0.11
|
||||||
|
|
||||||
# homeassistant.components.xiaomi_ble
|
# homeassistant.components.xiaomi_ble
|
||||||
xiaomi-ble==0.20.0
|
xiaomi-ble==0.21.1
|
||||||
|
|
||||||
# homeassistant.components.knx
|
# homeassistant.components.knx
|
||||||
xknx==2.11.2
|
xknx==2.11.2
|
||||||
|
@ -1983,7 +1983,7 @@ wyoming==1.1.0
|
|||||||
xbox-webapi==2.0.11
|
xbox-webapi==2.0.11
|
||||||
|
|
||||||
# homeassistant.components.xiaomi_ble
|
# homeassistant.components.xiaomi_ble
|
||||||
xiaomi-ble==0.20.0
|
xiaomi-ble==0.21.1
|
||||||
|
|
||||||
# homeassistant.components.knx
|
# homeassistant.components.knx
|
||||||
xknx==2.11.2
|
xknx==2.11.2
|
||||||
|
@ -132,6 +132,40 @@ async def test_xiaomi_consumable(hass: HomeAssistant) -> None:
|
|||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
|
||||||
|
async def test_xiaomi_score(hass: HomeAssistant) -> None:
|
||||||
|
"""Make sure that score sensors are correctly mapped."""
|
||||||
|
entry = MockConfigEntry(
|
||||||
|
domain=DOMAIN,
|
||||||
|
unique_id="ED:DE:34:3F:48:0C",
|
||||||
|
data={"bindkey": "1330b99cded13258acc391627e9771f7"},
|
||||||
|
)
|
||||||
|
entry.add_to_hass(hass)
|
||||||
|
|
||||||
|
assert await hass.config_entries.async_setup(entry.entry_id)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert len(hass.states.async_all()) == 0
|
||||||
|
inject_bluetooth_service_info_bleak(
|
||||||
|
hass,
|
||||||
|
make_advertisement(
|
||||||
|
"ED:DE:34:3F:48:0C",
|
||||||
|
b"\x48\x58\x06\x08\xc9H\x0e\xf1\x12\x81\x07\x973\xfc\x14\x00\x00VD\xdbA",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert len(hass.states.async_all()) == 2
|
||||||
|
|
||||||
|
sensor = hass.states.get("sensor.smart_toothbrush_480c_score")
|
||||||
|
|
||||||
|
sensor_attr = sensor.attributes
|
||||||
|
assert sensor.state == "83"
|
||||||
|
assert sensor_attr[ATTR_FRIENDLY_NAME] == "Smart Toothbrush 480C Score"
|
||||||
|
assert sensor_attr[ATTR_STATE_CLASS] == "measurement"
|
||||||
|
|
||||||
|
assert await hass.config_entries.async_unload(entry.entry_id)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
|
||||||
async def test_xiaomi_battery_voltage(hass: HomeAssistant) -> None:
|
async def test_xiaomi_battery_voltage(hass: HomeAssistant) -> None:
|
||||||
"""Make sure that battery voltage sensors are correctly mapped."""
|
"""Make sure that battery voltage sensors are correctly mapped."""
|
||||||
entry = MockConfigEntry(
|
entry = MockConfigEntry(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user