Merge branch 'XiaoMi:main' into main

This commit is contained in:
ted 2025-03-16 10:46:15 +08:00 committed by GitHub
commit 02963a7f06
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 84 additions and 45 deletions

View File

@ -1,13 +1,25 @@
# CHANGELOG
## v0.2.2
This version has modified the conversion rules of the climate entity, which will have effect on the devices with the ptc-bath-heater, the air-conditioner and the air-fresh service. After updating, you need to restart Home Assistant and check `xiaomi_home > CONFIGURE >
Update entity conversion rules > NEXT` to reload the integration.
这个版本修改了浴霸、空调、新风机的实体转换规则,更新之后需要重启 Home Assistant并且勾选 `xiaomi_home > 配置 > 更新实体转换规则 > 下一步` 重新加载集成。
### Added
- Add conversion rules for the air-conditioner service and the air-fresh service. [#879](https://github.com/XiaoMi/ha_xiaomi_home/pull/879)
### Changed
- Convert the mode of the ptc bath heater to the preset mode of the climate entity. [#874](https://github.com/XiaoMi/ha_xiaomi_home/pull/874)
- Use Home Assistant default icon when device_class is set. [#855](https://github.com/XiaoMi/ha_xiaomi_home/pull/855)
### Fixed
- Fix xiaomi.aircondition.m9 humidity-range unit. [#878](https://github.com/XiaoMi/ha_xiaomi_home/pull/878)
- Fix MIoT-Spec-V2 conflicts of xiaomi.fan.p5 and mike.bhf_light.2. [#866](https://github.com/XiaoMi/ha_xiaomi_home/pull/866)
## v0.2.1
### Added
- Add the preset mode for the thermostat. [#833](https://github.com/XiaoMi/ha_xiaomi_home/pull/833)
### Changed
- Change paho-mqtt version to adapt Home Assistant 2025.03. [#839](https://github.com/XiaoMi/ha_xiaomi_home/pull/839)
- Revert to use multi_lang.json. [#834](https://github.com/XiaoMi/ha_xiaomi_home/pull/834)
### Fixed
- Fix the opening and the closing status of linp.wopener.wd1lb. [#826](https://github.com/XiaoMi/ha_xiaomi_home/pull/826)
- Fix the format type of the wind-reverse property. [#810](https://github.com/XiaoMi/ha_xiaomi_home/pull/810)

View File

@ -605,7 +605,7 @@ class AirConditioner(FeatureOnOff, FeatureTargetTemperature,
class PtcBathHeater(FeatureTargetTemperature, FeatureTemperature,
FeatureFanMode, FeatureSwingMode):
FeatureFanMode, FeatureSwingMode, FeaturePresetMode):
"""Ptc bath heater"""
_prop_mode: Optional[MIoTSpecProperty]
_hvac_mode_map: Optional[dict[int, HVACMode]]
@ -626,26 +626,20 @@ class PtcBathHeater(FeatureTargetTemperature, FeatureTemperature,
continue
self._hvac_mode_map = {}
for item in prop.value_list.items:
if item.name in {'off', 'idle'
} and (HVACMode.OFF not in list(
self._hvac_mode_map.values())):
self._hvac_mode_map[item.value] = HVACMode.OFF
elif item.name in {'auto'}:
if item.name in {'off', 'idle'}:
if (HVACMode.OFF
not in list(self._hvac_mode_map.values())):
self._hvac_mode_map[item.value] = HVACMode.OFF
elif (HVACMode.AUTO
not in list(self._hvac_mode_map.values())):
self._hvac_mode_map[item.value] = HVACMode.AUTO
elif item.name in {'ventilate'}:
self._hvac_mode_map[item.value] = HVACMode.COOL
elif item.name in {'heat', 'quick_heat'
} and (HVACMode.HEAT not in list(
self._hvac_mode_map.values())):
self._hvac_mode_map[item.value] = HVACMode.HEAT
elif item.name in {'defog'}:
self._hvac_mode_map[item.value] = HVACMode.HEAT_COOL
elif item.name in {'dry'}:
self._hvac_mode_map[item.value] = HVACMode.DRY
elif item.name in {'fan'}:
self._hvac_mode_map[item.value] = HVACMode.FAN_ONLY
self._attr_hvac_modes = list(self._hvac_mode_map.values())
self._prop_mode = prop
if HVACMode.OFF in self._attr_hvac_modes:
self._prop_mode = prop
else:
_LOGGER.error('no idle mode, %s', self.entity_id)
# preset modes
self._init_preset_modes('ptc-bath-heater', 'mode')
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
"""Set the target hvac mode."""
@ -655,15 +649,20 @@ class PtcBathHeater(FeatureTargetTemperature, FeatureTemperature,
if mode_value is None or not await self.set_property_async(
prop=self._prop_mode, value=mode_value):
raise RuntimeError(
f'set climate prop.mode failed, {hvac_mode}, {self.entity_id}')
f'set ptc-bath-heater {hvac_mode} failed, {self.entity_id}')
@property
def hvac_mode(self) -> Optional[HVACMode]:
"""The current hvac mode."""
return (self.get_map_value(map_=self._hvac_mode_map,
key=self.get_prop_value(
prop=self._prop_mode))
if self._prop_mode else None)
if self._prop_mode is None:
return None
mode_value = self.get_map_value(
map_=self._hvac_mode_map,
key=self.get_prop_value(prop=self._prop_mode))
if mode_value == HVACMode.OFF or mode_value is None:
return mode_value
return HVACMode.AUTO if (HVACMode.AUTO
in self._attr_hvac_modes) else None
class Thermostat(FeatureOnOff, FeatureTargetTemperature, FeatureTemperature,

View File

@ -25,7 +25,7 @@
"cryptography",
"psutil"
],
"version": "v0.2.1",
"version": "v0.2.2",
"zeroconf": [
"_miot-central._tcp.local."
]

View File

@ -68,3 +68,11 @@ urn:miot-spec-v2:device:bath-heater:0000A028:mike-2:1:
urn:miot-spec-v2:device:fan:0000A005:xiaomi-p51:1:
prop.2.2:
name: fan-level-a
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-m9:6:
prop.10.6:
unit: none
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-m9:1: urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-m9:6
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-m9:2: urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-m9:6
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-m9:3: urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-m9:6
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-m9:4: urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-m9:6
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-m9:5: urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-m9:6

View File

@ -138,7 +138,7 @@ SPEC_DEVICE_TRANS_MAP: dict = {
'optional': {
'properties': {'mode', 'target-humidity'}
}
},
}
},
'optional': {
'environment': {
@ -164,8 +164,7 @@ SPEC_DEVICE_TRANS_MAP: dict = {
'continue-sweep',
'stop-and-gocharge'
}
},
}
}
},
'optional': {
@ -178,9 +177,9 @@ SPEC_DEVICE_TRANS_MAP: dict = {
'required': {
'properties': {
'battery-level': {'read'}
},
}
}
},
}
},
'entity': 'vacuum'
},
@ -196,7 +195,7 @@ SPEC_DEVICE_TRANS_MAP: dict = {
},
'optional': {
'properties': {'target-humidity'}
},
}
}
},
'optional': {
@ -237,7 +236,7 @@ SPEC_DEVICE_TRANS_MAP: dict = {
'properties': {
'target-temperature', 'mode', 'fan-level',
'temperature'}
},
}
}
},
'optional': {
@ -246,7 +245,7 @@ SPEC_DEVICE_TRANS_MAP: dict = {
'optional': {
'properties': {'temperature', 'relative-humidity'}
}
},
}
},
'entity': 'thermostat'
},
@ -260,7 +259,7 @@ SPEC_DEVICE_TRANS_MAP: dict = {
},
'optional': {
'properties': {'target-temperature', 'heat-level'}
},
}
}
},
'optional': {
@ -269,20 +268,21 @@ SPEC_DEVICE_TRANS_MAP: dict = {
'optional': {
'properties': {'temperature', 'relative-humidity'}
}
},
}
},
'entity': 'heater'
},
'bath-heater': {
'required': {
'ptc-bath-heater': {
'required': {},
'optional': {
'required': {
'properties': {
'target-temperature', 'heat-level',
'temperature', 'mode'
'mode':{'read', 'write'}
}
},
'optional': {
'properties': {'target-temperature', 'temperature'}
}
}
},
'optional': {
@ -292,7 +292,13 @@ SPEC_DEVICE_TRANS_MAP: dict = {
'properties': {
'on', 'fan-level', 'horizontal-swing', 'vertical-swing'
}
},
}
},
'environment': {
'required': {},
'optional': {
'properties': {'temperature'}
}
}
},
'entity': 'bath-heater',
@ -308,7 +314,7 @@ SPEC_DEVICE_TRANS_MAP: dict = {
},
'optional': {
'properties': {'mode', 'temperature'}
},
}
}
},
'optional': {},
@ -381,6 +387,7 @@ SPEC_SERVICE_TRANS_MAP: dict = {
},
'fan-control': 'fan',
'ceiling-fan': 'fan',
'air-fresh': 'fan',
'water-heater': {
'required': {
'properties': {
@ -400,14 +407,27 @@ SPEC_SERVICE_TRANS_MAP: dict = {
},
'optional': {
'properties': {
'motor-control', 'status', 'current-position', 'target-position'
'status', 'current-position', 'target-position'
}
},
'entity': 'cover'
},
'window-opener': 'curtain',
'motor-controller': 'curtain',
'airer': 'curtain'
'airer': 'curtain',
'air-conditioner': {
'required': {
'properties': {
'on': {'read', 'write'},
'mode': {'read', 'write'},
'target-temperature': {'read', 'write'}
}
},
'optional': {
'properties': {'target-humidity'}
},
'entity': 'air-conditioner'
}
}
"""SPEC_PROP_TRANS_MAP