mirror of
https://github.com/XiaoMi/ha_xiaomi_home.git
synced 2025-11-29 18:19:06 +08:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d5c5e387c2 | ||
|
|
e6750bb746 | ||
|
|
1b87381f43 | ||
|
|
33ee65cf75 | ||
|
|
f95c71c2ad |
@@ -1,4 +1,12 @@
|
||||
# CHANGELOG
|
||||
## v0.4.5
|
||||
### Changed
|
||||
- Ignore mdns REMOVED package. [#1296](https://github.com/XiaoMi/ha_xiaomi_home/pull/1296)
|
||||
- Format value type first, then evaluate by expression, and set precision at last. [#1516](https://github.com/XiaoMi/ha_xiaomi_home/pull/1516)
|
||||
### Fixed
|
||||
- Fix xiaomi.derh.lite temperature precision. [#1505](https://github.com/XiaoMi/ha_xiaomi_home/pull/1505)
|
||||
- Fix xiaomi.waterpuri.s1200g filter property unit, lxzn.valve.02 electricity property unit, xiaomi.aircondition.c24 power consumption device class, and cuco.plug.cp7pd power consumption and power value precision. [#1517](https://github.com/XiaoMi/ha_xiaomi_home/pull/1517)
|
||||
|
||||
## v0.4.4
|
||||
### Added
|
||||
- Add Turkish language support. [#1468](https://github.com/XiaoMi/ha_xiaomi_home/pull/1468)
|
||||
|
||||
@@ -384,6 +384,7 @@ Example:
|
||||
- Contribution Guidelines: [English](./CONTRIBUTING.md) | [简体中文](./doc/CONTRIBUTING_zh.md)
|
||||
- [ChangeLog](./CHANGELOG.md)
|
||||
- Development Documents: https://developers.home-assistant.io/docs/creating_component_index
|
||||
- [FAQ](https://github.com/XiaoMi/ha_xiaomi_home/wiki)
|
||||
|
||||
## Directory Structure
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
"cryptography",
|
||||
"psutil"
|
||||
],
|
||||
"version": "v0.4.4",
|
||||
"version": "v0.4.5",
|
||||
"zeroconf": [
|
||||
"_miot-central._tcp.local."
|
||||
]
|
||||
|
||||
@@ -1048,11 +1048,11 @@ class MIoTClient:
|
||||
|
||||
mips = self._mips_local.get(group_id, None)
|
||||
if mips:
|
||||
if state == MipsServiceState.REMOVED:
|
||||
mips.disconnect()
|
||||
self._mips_local.pop(group_id, None)
|
||||
return
|
||||
if (
|
||||
# if state == MipsServiceState.REMOVED:
|
||||
# mips.disconnect()
|
||||
# self._mips_local.pop(group_id, None)
|
||||
# return
|
||||
if ( # ADDED or UPDATED
|
||||
mips.client_id == self._entry_data['virtual_did']
|
||||
and mips.host == data['addresses'][0]
|
||||
and mips.port == data['port']
|
||||
|
||||
@@ -748,6 +748,7 @@ class MIoTDevice:
|
||||
'w': UnitOfPower.WATT,
|
||||
'W': UnitOfPower.WATT,
|
||||
'kW': UnitOfPower.KILO_WATT,
|
||||
'Wh': UnitOfEnergy.WATT_HOUR,
|
||||
'kWh': UnitOfEnergy.KILO_WATT_HOUR,
|
||||
'A': UnitOfElectricCurrent.AMPERE,
|
||||
'mA': UnitOfElectricCurrent.MILLIAMPERE,
|
||||
@@ -1040,6 +1041,7 @@ class MIoTServiceEntity(Entity):
|
||||
f'set property failed, property is None, '
|
||||
f'{self.entity_id}, {self.name}')
|
||||
value = prop.value_format(value)
|
||||
value = prop.value_precision(value)
|
||||
if prop not in self.entity_data.props:
|
||||
raise RuntimeError(
|
||||
f'set property failed, unknown property, '
|
||||
@@ -1077,9 +1079,11 @@ class MIoTServiceEntity(Entity):
|
||||
'get property failed, not readable, %s, %s, %s',
|
||||
self.entity_id, self.name, prop.name)
|
||||
return None
|
||||
result = prop.value_format(
|
||||
value: Any = prop.value_format(
|
||||
await self.miot_device.miot_client.get_prop_async(
|
||||
did=self.miot_device.did, siid=prop.service.iid, piid=prop.iid))
|
||||
value = prop.eval_expr(value)
|
||||
result = prop.value_precision(value)
|
||||
if result != self._prop_value_map[prop]:
|
||||
self._prop_value_map[prop] = result
|
||||
self.async_write_ha_state()
|
||||
@@ -1110,7 +1114,7 @@ class MIoTServiceEntity(Entity):
|
||||
continue
|
||||
value: Any = prop.value_format(params['value'])
|
||||
value = prop.eval_expr(value)
|
||||
value = prop.value_format(value)
|
||||
value = prop.value_precision(value)
|
||||
self._prop_value_map[prop] = value
|
||||
if prop in self._prop_changed_subs:
|
||||
self._prop_changed_subs[prop](prop, value)
|
||||
@@ -1258,6 +1262,7 @@ class MIoTPropertyEntity(Entity):
|
||||
f'set property failed, not writable, '
|
||||
f'{self.entity_id}, {self.name}')
|
||||
value = self.spec.value_format(value)
|
||||
value = self.spec.value_precision(value)
|
||||
try:
|
||||
await self.miot_device.miot_client.set_prop_async(
|
||||
did=self.miot_device.did, siid=self.spec.service.iid,
|
||||
@@ -1275,16 +1280,19 @@ class MIoTPropertyEntity(Entity):
|
||||
'get property failed, not readable, %s, %s',
|
||||
self.entity_id, self.name)
|
||||
return None
|
||||
return self.spec.value_format(
|
||||
value: Any = self.spec.value_format(
|
||||
await self.miot_device.miot_client.get_prop_async(
|
||||
did=self.miot_device.did, siid=self.spec.service.iid,
|
||||
piid=self.spec.iid))
|
||||
value = self.spec.eval_expr(value)
|
||||
result = self.spec.value_precision(value)
|
||||
return result
|
||||
|
||||
def __on_value_changed(self, params: dict, ctx: Any) -> None:
|
||||
_LOGGER.debug('property changed, %s', params)
|
||||
value: Any = self.spec.value_format(params['value'])
|
||||
value = self.spec.eval_expr(value)
|
||||
self._value = self.spec.value_format(value)
|
||||
self._value = self.spec.value_precision(value)
|
||||
if not self._pending_write_ha_state_timer:
|
||||
self.async_write_ha_state()
|
||||
|
||||
|
||||
@@ -232,9 +232,10 @@ class MipsService:
|
||||
for item in list(self._services.values()):
|
||||
if item['name'] != name:
|
||||
continue
|
||||
service_data = self._services.pop(item['group_id'], {})
|
||||
self.__call_service_change(
|
||||
state=MipsServiceState.REMOVED, data=service_data)
|
||||
# Ignore mdns REMOVED package. Let the connection close by itself.
|
||||
# service_data = self._services.pop(item['group_id'], {})
|
||||
# self.__call_service_change(
|
||||
# state=MipsServiceState.REMOVED, data=service_data)
|
||||
return
|
||||
self._main_loop.create_task(
|
||||
self.__request_service_info_async(zeroconf, service_type, name))
|
||||
|
||||
@@ -599,15 +599,25 @@ class MIoTSpecProperty(_MIoTSpecBase):
|
||||
def value_format(self, value: Any) -> Any:
|
||||
if value is None:
|
||||
return None
|
||||
if isinstance(value, str):
|
||||
if self.format_ == int:
|
||||
value = int(float(value))
|
||||
elif self.format_ == float:
|
||||
value = float(value)
|
||||
if self.format_ == bool:
|
||||
return bool(value in [True, 1, 'True', 'true', '1'])
|
||||
return value
|
||||
|
||||
def value_precision(self, value: Any) -> Any:
|
||||
if value is None:
|
||||
return None
|
||||
if self.format_ == float:
|
||||
return round(value, self.precision)
|
||||
if self.format_ == int:
|
||||
if self.value_range is None:
|
||||
return int(round(value))
|
||||
return int(
|
||||
round(value / self.value_range.step) * self.value_range.step)
|
||||
if self.format_ == float:
|
||||
return round(value, self.precision)
|
||||
if self.format_ == bool:
|
||||
return bool(value in [True, 1, 'True', 'true', '1'])
|
||||
return value
|
||||
|
||||
def dump(self) -> dict:
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
"service:003:property:001:valuelist:001": "Dry"
|
||||
}
|
||||
},
|
||||
"urn:miot-spec-v2:device:electronic-valve:0000A0A7:lxzn-02": {
|
||||
"zh-Hans": {
|
||||
"service:004:property:001": "功率过高-阈值设置"
|
||||
}
|
||||
},
|
||||
"urn:miot-spec-v2:device:electronic-valve:0000A0A7:ykcn-cbcs": {
|
||||
"zh-Hans": {
|
||||
"service:004:property:001": "功率过高-阈值设置",
|
||||
|
||||
@@ -26,6 +26,7 @@ urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-c20:1:
|
||||
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-c20:2: urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-c20:1
|
||||
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-c24:1:
|
||||
prop.8.6:
|
||||
name: power-consumption
|
||||
unit: kWh
|
||||
prop.10.6:
|
||||
unit: none
|
||||
@@ -138,6 +139,31 @@ urn:miot-spec-v2:device:bath-heater:0000A028:xiaomi-s1:1:
|
||||
urn:miot-spec-v2:device:curtain:0000A00C:bjkcz-kczble:1:0000D031:
|
||||
prop.2.2:
|
||||
name: status-a
|
||||
urn:miot-spec-v2:device:dehumidifier:0000A02D:xiaomi-lite:1:
|
||||
prop.3.2:
|
||||
value-range:
|
||||
- -30
|
||||
- 100
|
||||
- 0.1
|
||||
urn:miot-spec-v2:device:electronic-valve:0000A0A7:lxzn-02:1:0000C833:
|
||||
prop.3.1:
|
||||
format: float
|
||||
value-range:
|
||||
- 0
|
||||
- 999999
|
||||
- 0.01
|
||||
expr: (src_value/100)
|
||||
prop.3.2:
|
||||
unit: mA
|
||||
prop.3.3:
|
||||
format: float
|
||||
value-range:
|
||||
- 0
|
||||
- 65535
|
||||
- 0.1
|
||||
expr: (src_value/10)
|
||||
prop.4.1:
|
||||
unit: kW
|
||||
urn:miot-spec-v2:device:electronic-valve:0000A0A7:sanmei-s1:1:
|
||||
prop.3.1:
|
||||
format: float
|
||||
@@ -364,6 +390,19 @@ urn:miot-spec-v2:device:outlet:0000A002:cuco-cp2:2:
|
||||
urn:miot-spec-v2:device:outlet:0000A002:cuco-cp2d:1:
|
||||
prop.3.2:
|
||||
unit: mA
|
||||
urn:miot-spec-v2:device:outlet:0000A002:cuco-cp7pd:1:
|
||||
prop.11.1:
|
||||
unit: Wh
|
||||
value-range:
|
||||
- 0
|
||||
- 65535
|
||||
- 0.001
|
||||
expr: (src_value*1000)
|
||||
prop.11.4:
|
||||
value-range:
|
||||
- 0
|
||||
- 10000
|
||||
- 0.01
|
||||
urn:miot-spec-v2:device:outlet:0000A002:cuco-v3:1:
|
||||
prop.11.1:
|
||||
format: float
|
||||
@@ -484,6 +523,24 @@ urn:miot-spec-v2:device:water-purifier:0000A013:roswan-lte01:1:0000D05A:
|
||||
unit: ppm
|
||||
prop.4.2:
|
||||
unit: ppm
|
||||
urn:miot-spec-v2:device:water-purifier:0000A013:xiaomi-s1200g:1:0000D05A:
|
||||
prop.3.2:
|
||||
unit: days
|
||||
prop.3.3:
|
||||
unit: days
|
||||
prop.3.4:
|
||||
unit: L
|
||||
prop.3.5:
|
||||
unit: L
|
||||
prop.5.2:
|
||||
unit: days
|
||||
prop.5.3:
|
||||
unit: days
|
||||
prop.5.4:
|
||||
unit: L
|
||||
prop.5.5:
|
||||
unit: L
|
||||
urn:miot-spec-v2:device:water-purifier:0000A013:xiaomi-s1200g:2:0000D05A: urn:miot-spec-v2:device:water-purifier:0000A013:xiaomi-s1200g:1:0000D05A
|
||||
urn:miot-spec-v2:device:water-purifier:0000A013:yunmi-s20:1:
|
||||
prop.4.1:
|
||||
unit: ppm
|
||||
|
||||
@@ -110,7 +110,7 @@ class Sensor(MIoTPropertyEntity, SensorEntity):
|
||||
self._attr_native_unit_of_measurement = list(
|
||||
unit_sets)[0] if unit_sets else None
|
||||
# Set suggested precision
|
||||
if spec.format_ in {int, float} and spec.expr is None:
|
||||
if spec.format_ == float:
|
||||
self._attr_suggested_display_precision = spec.precision
|
||||
# Set state_class
|
||||
if spec.state_class:
|
||||
|
||||
@@ -386,6 +386,7 @@ siid、piid、eiid、aiid、value 均为十进制三位整数。
|
||||
- 贡献指南: [English](../CONTRIBUTING.md) | [简体中文](./CONTRIBUTING_zh.md)
|
||||
- [更新日志](../CHANGELOG.md)
|
||||
- 开发文档: https://developers.home-assistant.io/docs/creating_component_index
|
||||
- [常见问题](https://github.com/XiaoMi/ha_xiaomi_home/wiki)
|
||||
|
||||
## 目录结构
|
||||
|
||||
|
||||
Reference in New Issue
Block a user