本帖最后由 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 先安装[backcolor=rgba(110, 118, 129, 0.4)]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 中显示的状态与设备的实际状态保持同步。
|