本帖最后由 jesusya 于 2024-7-12 00:55 编辑  
 
 
 
使用场景: 
 
家中老的Haier中央空调,温控红外面板在墙上,开启空调制冷,空调面板在门口和人体所处位置还是有差距,温控总滞后,冷风不停吹,睡觉就更怕冷风吹过了头。 
 
找了歪果仁的一个项目:https://github.com/DavidIlie/tuya-smart-ir-ac, 插件依赖的 tuya api 接口:tuya-connector-python :https://github.com/tuya/tuya-connector-python 
 
基本上搭建好了一个框架,调用tuya API 模式控制空调,他代码中只有单个命令,比如 模式 、温度、风速转换,我空调在制冷、制热才可以单命令发送,在自动、送风、抽湿都是组合命令发送。所以改了他的写bug,重点把空调按下Auto模式劫持了,用制冷和送风2个模式实现自动模式。我不会python,我描述控制逻辑,查特GPT帮助下一起完成了自己的控制逻辑和设备支持。 
 
 
 
HA和Homekit的效果如下:附上我对作者几处bug修改的地方,我自行改的“自动化”模式的代码,太复制了,就不上传献丑了。我的插件放在:/homeassistant/custom_components/class_tuya_ir_ac 包含作者代码后,替换我的代码。configuration.yaml  加入: 
climate: 
  - platform: class_tuya_ir_ac 
    name: "主卧Haier空调" 
    sensor: sensor.temperature_humidity_sensor_主卧_temperature #主卧传感器 
    access_id: "xxx" 
    access_secret: "xxx" 
    remote_id: "设备红外设备" 
    ac_id: "设备下定义的空调遥控器,一个设备可以定义多少家电的遥控" 
 
http://iot.tuya.com 可以云开发里可以找到这4个代码 
 
附件了,PC 测试空调和API接口的代码:python3 test-tuya.py 在pc 上先测试API指令和你空调的控制,pc or mac 先安装pip3 install tuya-connector-python 
我的是: 
        {             "name": "打开空调-制冷-26度-中速风",             "command": {"power": 1, "mode": 0, "temp": 26, "wind": 2}         },         {             "name": "关闭空调",             "command": {"power": 0}         },         {             "name": "打开空调-制冷-26度-自动风",             "command": {"power": 1, "mode": 0, "temp": 26, "wind": 0}         },         {             "name": "设置仅风模式",             "command": {"power": 1, "mode": 3, "temp": 25, "wind": 0}         } Power:1 设备开 0 关 Mode:0 - 4 VALID_MODES = { 
    "0": HVACMode.COOL, #制冷 
    "1": HVACMode.HEAT, #制热 
    "2": HVACMode.AUTO, #自动  
    "3": HVACMode.FAN_ONLY,  #仅送风 
    "4": HVACMode.DRY, #除湿 
} 
Temp:整数温度 
Wind:风速, 0 自动风,1 低速 2中速 3高速 
 
我海尔空调,自动、仅送风 除湿 三个模式,temp 都是25,风 0 
 
 
大家看懂这个编码格式,用python3 test-tuya.py,在PC 测试好你空调的控制,在HA 改插件代码不难了,我已经做好了一个可以自动模式 围绕目标温度制冷+送风的 版本。稍后发源码出来。 
 
 
 查特。GPT写的介绍 
这个 Home Assistant 插件用于通过 Tuya API 控制空调设备。它通过定义和管理 ClimateEntity 实体来实现与 Tuya 平台的交互,支持设置温度、风速和操作模式等功能。 
主要功能模块1. 配置模式和平台设置插件使用 voluptuous 进行配置验证,确保用户提供的配置信息符合预期格式。配置模式包括: 
- access_id: Tuya API 的访问 ID。
 - access_secret: Tuya API 的访问密钥。
 - remote_id: 遥控器 ID。
 - ac_id: 空调 ID。
 - name: 设备名称。
 - sensor: 关联的传感器名称。
 
  2. 平台设置函数setup_platform 函数是插件的入口点,负责从配置中读取必要信息,并使用这些信息初始化 TuyaClassThermostat 实体。这个函数在 Home Assistant 启动时调用,将配置传递给实体并将其添加到 Home Assistant 的实体列表中。 
 
TuyaClassThermostat 类TuyaClassThermostat 类继承自 ClimateEntity,是插件的核心组件。它负责与 Tuya API 进行交互,并提供各种属性和方法来管理空调设备的状态和行为。 
主要属性和方法初始化方法在初始化时,使用配置中的信息来设置 Tuya API、传感器名称、设备名称等属性。初始化后,通过 _api 对象与 Tuya API 进行交互。 
 
属性方法这些方法用于获取和设置空调的各种属性,如名称、唯一 ID、温度单位、支持的功能、当前温度、目标温度、HVAC 模式和风速模式。 
- 名称属性:返回设备的名称,用于在 Home Assistant UI 中显示。
 - 唯一 ID 属性:返回设备的唯一标识符,确保每个设备在系统中都是唯一的。
 - 温度单位属性:定义设备使用的温度单位(摄氏度)。
 - 支持的功能属性:定义设备支持的功能,如目标温度和风速模式。
 - 最小和最大温度属性:定义设备支持的温度范围。
 - 当前温度属性:通过传感器或 API 获取当前温度。
 - 目标温度属性:通过 API 获取或设置目标温度。
 - HVAC 模式属性:获取和设置当前的 HVAC 模式,包括制冷、制热、自动、仅风扇和干燥模式。
 - 风速模式属性:获取和设置当前的风速模式,包括低速、中速、高速和自动风。
 
  更新方法async_update 方法定期调用 Tuya API 获取设备的最新状态,并更新 Home Assistant 中的实体状态。 
python复制代码, 我测试 HA 每一分钟调用一次async_update我把我的自动化空调温控代码放在这里调用,改到了空调本身的自动模式。 
 
async def async_update(self):    await self._api.async_update()    self.async_write_ha_state() 
 
设置温度方法async_set_temperature 方法通过 API 设置目标温度。如果当前模式是自动、仅风扇或干燥模式,则温度固定为 25℃,否则根据用户输入设置温度。 
 
设置风速模式方法async_set_fan_mode 方法通过 API 设置风速模式。如果当前模式是自动、仅风扇或干燥模式,风速固定为自动风,否则根据用户选择设置风速。 
 
 
设置 HVAC 模式方法async_set_hvac_mode 方法通过 API 设置 HVAC 模式。如果模式为关闭,则调用 async_turn_off 方法关闭空调。否则,根据选择的模式设置相应的参数。 
 
 
 
与 Home Assistant UI 交互插件与 Home Assistant UI 的交互通过实体的属性和方法实现。当用户在 UI 中更改温度、风速或模式时,Home Assistant 会调用相应的实体方法来更新状态。实体通过调用 Tuya API 与实际设备通信,并在状态更新后调用 async_write_ha_state 方法将最新状态写入 Home Assistant。 
后台状态更新机制插件使用 async_update 方法定期从 Tuya API 获取设备的最新状态。这个方法通过异步方式调用 API,并将获取到的状态更新到 Home Assistant 中。这样可以确保 Home Assistant 中显示的状态始终与实际设备的状态同步。 
Tuya API 调用机制插件通过 TuyaAPI 类与 Tuya 平台进行通信。TuyaAPI 负责发送控制命令和接收设备状态。每次用户在 Home Assistant 中更改空调设置时,插件会调用相应的 Tuya API 来更新设备状态。 
关机函数async_set_hvac_mode 方法中的关机部分实现了空调的关机功能。当用户选择关闭 HVAC 模式时,插件会调用 async_turn_off 方法通过 Tuya API 关闭空调。 
变量使用说明- self._api: TuyaAPI 实例,用于与 Tuya 平台进行通信。
 - self._sensor_name: 传感器名称,用于获取当前温度。
 - self._name: 设备名称。
 - self._hvac_mode: 当前 HVAC 模式。
 - self._fan_mode: 当前风速模式。
 - self._target_temperature: 目标温度。
 
  总结这个插件通过定义 TuyaClassThermostat 实体并与 Tuya API 进行交互,实现了 Home Assistant 对空调设备的控制。用户可以通过 Home Assistant UI 设置温度、风速和模式,插件会将这些设置发送给 Tuya 平台并更新设备状态。同时,插件会定期从 Tuya 平台获取最新状态,确保 Home Assistant 中显示的状态与实际设备状态同步。 
 
在 Home Assistant 的 UI 中,用户可以通过界面来控制空调的温度、风速和模式。这些交互会触发插件中的相应函数,具体如下: 
1. 调整温度当用户在 UI 中调整温度时,Home Assistant 会调用 async_set_temperature 方法。 
 
 
2. 调整风速当用户在 UI 中调整风速时,Home Assistant 会调用 async_set_fan_mode 方法。 
 
 
3. 调整模式当用户在 UI 中调整空调模式时,Home Assistant 会调用 async_set_hvac_mode 方法。 
 
 
4. 获取状态更新当 Home Assistant 需要更新 UI 中的状态显示时,会调用 async_update 方法。这通常在界面刷新或定期状态更新时触发。 
 
 
交互总结- 调整温度: 调用 async_set_temperature
 - 调整风速: 调用 async_set_fan_mode
 - 调整模式: 调用 async_set_hvac_mode
 - 状态更新: 调用 async_update
 
  这些方法负责处理用户通过 Home Assistant UI 发起的操作,并通过调用 Tuya API 来实际控制空调设备。通过 async_write_ha_state 方法,插件会确保 Home Assistant 中显示的状态与设备的实际状态保持同步。 
 |