al-one / hass-xiaomi-miot

Automatic integrate all Xiaomi devices to HomeAssistant via miot-spec, support Wi-Fi, BLE, ZigBee devices. 小米米家智能家居设备接入Hass集成
https://miot-spec.com
Apache License 2.0
4.58k stars 650 forks source link

小米空调伴侣2(lumi.acpartner.mcn02)通过homekit自动化开关不正常 #908

Closed mentalfl0w closed 1 year ago

mentalfl0w commented 1 year ago

使用Siri或者手动在家庭app中开关都很正常,但涉及自动化或者场景的时候就不正常,会发出多个指令,比如关闭的时候会先发出关闭指令,后又莫名其妙开启,中间间隔2秒,日志如下:

image
al-one commented 1 year ago

自动化怎么写的?是HA自动化还是HomeKit自动化?

mentalfl0w commented 1 year ago

自动化怎么写的?是HA自动化还是HomeKit自动化?

是HomeKit里面的自动化,大致是到晚上11点后就关闭空调这样子的

jiangyiqi99 commented 1 year ago

我遇到了相同的情况,只要是场景或者自动化的关空调就不行。别的可以,如果有必要的话可以找我提供日志。

jiangyiqi99 commented 1 year ago

我查看了一下日志,如果手动开关,是把Mode设置为关没问题。但是自动化开关会发送一个Mode=off来关闭,再发送一个Fan=0。但是Fan不能为0,自动改成了设了一个Fan=low,然后调整Fan默认自动打开空调,所以开了。你这边把conponents改成在空调关闭状态下不执行Fan变更操作,或者Fan变更不自动打开空调就行了。

al-one commented 1 year ago

请提供下调试日志:

# configuration.yaml
logger:
  default: warning
  logs:
    custom_components.xiaomi_miot.climate: debug
jiangyiqi99 commented 1 year ago

我上传了日志:我使用homekit场景关闭空调,但空调反复横跳几次并未关闭。 最后我手动打开了空调。 home-assistant.log

al-one commented 1 year ago

我精简了你的日志,如下:

# 初始状态 空调已打开
2022-12-06 22:35:40.039 Got new state: {'air_conditioner.on': True, 'air_conditioner.mode': 3, 'target_temperature-2-3': 23.0, 'electric_power-5-1': 539.0, 'fan_control.fan_level': 1, 'fan_control.vertical_swing': False, 'state_updater': 'lan'}

# 发送了两次关闭,并且设置目标温度,正常情况下设置温度是不会导致空调重新打开的
2022-12-06 22:35:43.490 Set miot property air_conditioner.on(False), result: {'code': 0, 'siid': 2, 'piid': 1, 'result': ['ok']}
2022-12-06 22:35:43.502 Set miot property air_conditioner.on(False), result: {'code': 0, 'siid': 2, 'piid': 1, 'result': ['ok']}
2022-12-06 22:35:43.542 Set miot property target_temperature-2-3(23), result: {'code': 0, 'siid': 2, 'piid': 3, 'result': ['ok']}

# 更新空调状态,取到的状态仍为已打开
2022-12-06 22:35:44.740 Got new state: {'air_conditioner.on': True, 'air_conditioner.mode': 3, 'target_temperature-2-3': 23.0, 'electric_power-5-1': 587.0, 'fan_control.fan_level': 1, 'fan_control.vertical_swing': False, 'state_updater': 'lan'}

# 再次关闭,并且设置目标温度
2022-12-06 22:36:08.022 Set miot property air_conditioner.on(False), result: {'code': 0, 'siid': 2, 'piid': 1, 'result': ['ok']}
2022-12-06 22:36:08.030 Set miot property air_conditioner.on(False), result: {'code': 0, 'siid': 2, 'piid': 1, 'result': ['ok']}
2022-12-06 22:36:08.059 Set miot property target_temperature-2-3(23), result: {'code': 0, 'siid': 2, 'piid': 3, 'result': ['ok']}

# 更新空调状态,已关闭
2022-12-06 22:36:09.296 Got new state: {'air_conditioner.on': False, 'air_conditioner.mode': 3, 'target_temperature-2-3': 23.0, 'electric_power-5-1': 717.0, 'fan_control.fan_level': 1, 'fan_control.vertical_swing': False, 'state_updater': 'lan'}

# 发送打开命令,并设置模式为 1(制冷)
# 这条打开命令我不确定是你手动打开,还是HK场景发送的。从时间上看,与上次命令相差20秒,不像是HK场景发送的
2022-12-06 22:36:28.942 Set miot property air_conditioner.on(True), result: {'code': 0, 'siid': 2, 'piid': 1, 'result': ['ok']}
2022-12-06 22:36:28.984 Set miot property air_conditioner.mode(1), result: {'code': 0, 'siid': 2, 'piid': 2, 'result': ['ok']}

# 更新空调状态,已打开
2022-12-06 22:36:30.295 Got new state: {'air_conditioner.on': True, 'air_conditioner.mode': 1, 'target_temperature-2-3': 23.0, 'electric_power-5-1': 101.0, 'fan_control.fan_level': 1, 'fan_control.vertical_swing': False, 'state_updater': 'lan'}

# 设置风速为 2(中档)
2022-12-06 22:36:31.106 Set miot property fan_control.fan_level(2), result: {'code': 0, 'siid': 3, 'piid': 1, 'result': ['ok']}

# 发送了两次关闭,并且设置目标温度
2022-12-06 22:36:34.532 Set miot property air_conditioner.on(False), result: {'code': 0, 'siid': 2, 'piid': 1, 'result': ['ok']}
2022-12-06 22:36:34.546 Set miot property air_conditioner.on(False), result: {'code': 0, 'siid': 2, 'piid': 1, 'result': ['ok']}
2022-12-06 22:36:34.585 Set miot property target_temperature-2-3(23), result: {'code': 0, 'siid': 2, 'piid': 3, 'result': ['ok']}

# 更新空调状态,取到的状态仍为已打开
2022-12-06 22:36:35.779 Got new state: {'air_conditioner.on': True, 'air_conditioner.mode': 1, 'target_temperature-2-3': 23.0, 'electric_power-5-1': 104.0, 'fan_control.fan_level': 2, 'fan_control.vertical_swing': False, 'state_updater': 'lan'}

# 再次关闭,并且设置目标温度
2022-12-06 22:36:39.739 Set miot property air_conditioner.on(False), result: {'code': 0, 'siid': 2, 'piid': 1, 'result': ['ok']}
2022-12-06 22:36:39.754 Set miot property air_conditioner.on(False), result: {'code': 0, 'siid': 2, 'piid': 1, 'result': ['ok']}
2022-12-06 22:36:39.787 Set miot property target_temperature-2-3(23), result: {'code': 0, 'siid': 2, 'piid': 3, 'result': ['ok']}

# 更新空调状态,取到的状态仍为已打开
2022-12-06 22:36:39.974 Got new state: {'air_conditioner.on': True, 'air_conditioner.mode': 1, 'target_temperature-2-3': 23.0, 'electric_power-5-1': 104.0, 'fan_control.fan_level': 2, 'fan_control.vertical_swing': False, 'state_updater': 'lan'}

# 发送打开命令,并设置模式为 1(制热)
# 这条打开命令我不确定是你手动打开,还是HK场景发送的
2022-12-06 22:37:00.071 Set miot property air_conditioner.on(True), result: {'code': 0, 'siid': 2, 'piid': 1, 'result': ['ok']}
2022-12-06 22:37:00.150 Set miot property air_conditioner.mode(3), result: {'code': 0, 'siid': 2, 'piid': 2, 'result': ['ok']}

# 更新空调状态,已打开
2022-12-06 22:37:01.454 Got new state: {'air_conditioner.on': True, 'air_conditioner.mode': 3, 'target_temperature-2-3': 23.0, 'electric_power-5-1': 86.0, 'fan_control.fan_level': 2, 'fan_control.vertical_swing': False, 'state_updater': 'lan'}

日志中每次发送关闭命令后会再发送一个设置目标温度的命令,正常情况下设置目标温度是不会导致已关闭的空调重新打开的,但是由于我没有mcn02这款设备,需要你在HA开发者工具中测试下面的服务命令

service: xiaomi_miot.set_property
data:
  entity_id: climate.lumi_mcn02_xxxx
  field: target_temperature-2-3
  value: 23

需要在空调关闭的状态下执行,执行后查看空调是否会变成已开启状态。

jiangyiqi99 commented 1 year ago

很高兴能看到你的回复。我想说,你所有的猜想都是完全正确的。那两次你怀疑我手动操作的开关的确是我手动操作,而且空调的打开确实也是由于设定了温度或风量。 我已经将我手动操作的日志发送给了您,为了减少您的工作量,我已经进行了简要分析。为了您的完整理解,我 home-assistant.log 并没有进行精简。您这边可以看一下。

al-one commented 1 year ago

请尝试在空调关闭状态下执行下面的服务,然后观察空调是否被打开:

service: xiaomi_miot.send_command
data:
  entity_id: climate.lumi_mcn02_xxxx
  method: set_tar_temp
  params: [23]
jiangyiqi99 commented 1 year ago

空调依然被打开了,日志如下。 home-assistant.log

al-one commented 1 year ago
2022-12-08 20:38:15.310 Got new state: {'air_conditioner.on': False, 'air_conditioner.mode': 3, 'target_temperature-2-3': 24.0, 'electric_power-5-1': 6.0, 'fan_control.fan_level': 2, 'fan_control.vertical_swing': False, 'state_updater': 'lan'}
2022-12-08 20:38:19.590 Send miio command: set_tar_temp([23])
2022-12-08 20:38:19.860 Got new state: {'air_conditioner.on': True, 'air_conditioner.mode': 3, 'target_temperature-2-3': 23.0, 'electric_power-5-1': 6.0, 'fan_control.fan_level': 2, 'fan_control.vertical_swing': False, 'state_updater': 'lan'}

该设备是通过miio2miot机制适配的本地接入,设置目标温度时发送给设备的原始命令就是set_tar_temp,不幸的是该设备收到这个命令后会重新打开空调。因此只能通过其他方式去解决该问题:

  1. 为该设备生成一个开关switch实体
    # configuration.yaml
    xiaomi_miot:
      device_customizes:
        lumi.acpartner.mcn02:
          switch_properties: air_conditioner.on
  2. 将开关实体接入HomeKit
  3. 在HomeKit自动化/场景中使用开关实体关闭空调
jiangyiqi99 commented 1 year ago

能否设置成在空调关闭的时候不再接受任何除打开空调之外的命令?你可以在插件流程中劫持忽略。

jiangyiqi99 commented 1 year ago

如果可以,那么可以设置为只有在修改模式或打开空调命令的时候才会将其打开,因为homekit打开空调只会发送修改模式命令。

al-one commented 1 year ago

本插件是一个通用插件,一般不会为单个型号的设备改变通用的逻辑,我不能断定所有设备在关闭时都无法设置目标温度。

mentalfl0w commented 1 year ago

感谢!使用开关实体已经满足我的使用需求了