背景
入冬后室温经常低于 15 ℃,开空调时发现控制器过于老旧,温控也很不准确,于是打算直接换个智能型的并接入 Home Assistant。

将温控器拆下来研究后发现是旋钮的轴老化了,连着的双金属片盘有点松动导致温控失灵。
根据内侧贴着的原理图,接线十分简单粗暴:一条火线输入,三条输出分别对应制热、制冷、风扇。

用万用表确认之后给线都贴上标签,顺便量一下墙上的螺丝孔间距约 60 mm,符合 86 型开关盒标准。

在 Home Assistant 论坛和 reddit 调研后发现大部分支持接入 Home Assistant 的空调控制器都只是红外遥控器,而这种硬接线的只能继续使用温控器(thermostat)了。而大部分温控器都是用于控制暖气的热水阀,支持制热+制冷的挺少。逛了一圈找到一个基于 Tuya ESP、有 Tasmota 支持的 BAC-002 系列,从 AliExpress 以 €31.29 包邮购入。
背面接线口:

该温控适用于控制两线水阀(2-wire auto return ball valve),冷热水阀分别有“open”和“close”两条线,对我的空调来说只需要控制通断“open”线即可控制运作;风扇控制支持三档风速,任选一档接通即可。
由于智能温控器自身运行需要供电,而原本的温控器并不需要所以没有接零线。但墙里还有两条之前没有用到的线:一条黄绿色的地线接了地,和另一条黑色的线,可惜量了一下发现它并没有接入总零线。于是打开空调内机所在的吊顶隔板,找到这条黑线的另一头把它接上零线即可。
外面这一大块神秘电路板没有任何连接,或许是没用到的电源?

接好线后测试了一下这款温控器可以正常控制空调制冷制热,就准备给它刷上 Tasmota 固件进行去云化了。
硬件
拆开后直接给显眼的 Wi-Fi 模块连上需要的线,通过 web installer 开始刷 Tasmota,可是一直提示无法找到设备,用 esptool.py 也无法读到芯片信息。一番折腾最后在一个 GitHub issue 中发现 Tuya 从 2020 年开始大规模推广新的产品线——物理规格和引脚与 ESP 相同但内部是基于 Beken BK7231 系列 ARM SoC 的模块。搜索这个模块上印着的型号 “WB3S” 后可以确认它也是 ↗。

而这类不使用 ESP 的模块也就无法刷 Tasmota 等第三方固件,由于缺乏文档,针对 BK7231 系列的研究也进展缓慢,目前最成功的 ↗也只实现了部分 MQTT 功能,而且开发流程看着挺麻烦。
Beken 官方开源的 SDK ↗ 支持 AliOS Things,似乎环境稍微好些(但我也不想去碰
既然不是 ESP,那就只好把它变成 ESP。由于模块的物理规格和引脚与 ESP12 系列完全一致,可以把它拆下来然后换上真的。
解焊时还是得用热风枪,烙铁+刀片撬的后果就是不小心把几个焊盘扯下来了:
拆掉 Wi-Fi 模块后开始研究电路,控制器 PCB 背面全貌:

右上角最大的 IC “YL1621” 是显示屏 LCD 驱动,右下角 “SC05B” 是触摸按钮驱动。
温控器的主要功能由中间的 “ME32S003K6T6” (ARM) MCU 实现,和 Wi-Fi 模块间通过 UART 通讯。
右下方有一颗 “ACE1117H” 稳压器,给温控器连上电源后量一下可以发现与排线有连接的 Vin 脚上有 +12 V,可以将此处作为调试时的电源输入。
另外由于掉了几个焊盘,需要找一下合适的焊接位置准备飞线。

软件
期间发现了 ESPHome 这个十分优雅的东西,试用后一瞬抛弃了 Tasmota。
根据 klausahrenberg/WThermostatBeca ↗,Wi-Fi 模块与主控间通过串口进行某种协议的通讯,这类主控在 ESPHome 中被称为 Tuya MCU ↗。
焊上需要的线后,准备一片 ESP-12F,刷上 ESPHome 固件之后与控制器连接(由于 Vcc 焊盘也略受损比较脆弱,模块暂时使用独立供电),开始测试。

根据 klausahrenberg/WThermostatBeca 提供的参数 ↗,这款温控器的 datapoint 映射为:
| datapoint | 类型 | 数据 |
|---|---|---|
| 1 | switch | 电源状态 |
| 2 | int | 设定温度 |
| 3 | int | 实际温度 |
| 4 | enum | 定时模式 |
| 5 | switch | 节能模式 |
| 6 | switch | 锁定状态 |
| 102 | enum | 空调模式(0:制冷,1:制热,2:通风) |
| 103 | enum | 风扇模式(0:自动,1:高,2:中,3:低) |
| 104 | raw | 定时参数(ESPHome 暂不支持) |
据此设置 ESPHome Tuya Climate 组件所需的参数 switch_datapoint、target_temperature_datapoint、current_temperature_datapoint;另外根据温度数据系数为 2.0(Tuya MCU 通讯协议只支持整数类型,如 51 实际表示 25.5 ℃),将 temperature_multiplier 设为 0.5。配置示例:
substitutions:
device_name: '空调温控器'
esphome:
name: thermostat
comment: '空调温控器'
esp8266:
board: esp12e
restore_from_flash: false
preferences:
flash_write_interval: 24h
logger:
level: WARN
baud_rate: 0 # 禁用默认 UART 端口日志,以避免占用
wifi:
fast_connect: true
networks:
- ssid: !secret wifi_ssid
bssid: !secret wifi_bssid
password: !secret wifi_password
domain: !secret domain_name
api:
ota:
password: !secret ota_password
button:
# 硬重启
- platform: restart
id: restart_button
name: '重启 ${device_name}'
entity_category: diagnostic
# 从 HASS 获取时间
time:
- platform: homeassistant
id: hass_time
timezone: Europe/Madrid # 修改时区
# 用 UART0 与 tuya MCU 通信
uart:
tx_pin: 1
rx_pin: 3
baud_rate: 9600
# 启用 tuya MCU 组件
tuya:
time_id: hass_time # 使用 HASS 的时间
climate:
- platform: tuya
id: hvac
name: '空调'
supports_heat: true
supports_cool: true
switch_datapoint: 1
target_temperature_datapoint: 2
current_temperature_datapoint: 3
temperature_multiplier: 0.5
eco_datapoint: 5
visual:
min_temperature: 5.0
max_temperature: 35.0
temperature_step: 0.5yaml给控制器通电后可以看到 ESPHome 日志成功输出 Tuya MCU 通讯信息:

Home Assistant 随后会提示已自动发现新的 ESPHome 设备,绑定后可以直接添加一个温控器卡片到 lovelace:

测试各项功能正常后给另一片 ESP-12F 刷上固件后焊到控制器上,然后给位于受损焊盘的几个引脚飞线,GPIO15 为了省事直接在模块上焊一个下拉电阻省去飞线。最后完成效果如图:

