30元改造传统风扇接入HomeKit

近期花了不到30元成本将传统风扇改造成智能风扇,记录一下改造过程。

需求分析

改造的目的是将传统风扇智能化,最简单的方案就是加个智能插座,就能通过手机控制风扇的开关了,这种方案本质上是通过控制智能插座是否通电来控制风扇的开关,但如果你想要调整风扇的档位,那对不起你还是得通过风扇的物理按钮来调节;其次,如果你通过手机把智能插座断电关了风扇,那你下次再想开风扇时就必须先掏出手机来把插座的电打开,而无法直接通过物理开关打开风扇,这显然算不上智能,只能算智障。

我理解的智能风扇应该具备这些基本的功能:

1、可以使用手机控制风扇开关,支持调节风扇档位

2、保留传统的物理开关功能,脱离手机仍然能控制

3、物理开关操作后能实时反馈到手机上,状态一致

4、可以接入苹果HomeKit家庭,通过Siri控制风扇

需求梳理清楚后该考虑如何实现了,首先把风扇底座拆了看一下原来物理开关是如何控制风扇的开关已经档位的。

风扇拆机图

从图里可以看到,插座的火线进来也先接到物理开关,物理开关有另外三根线连到风扇的电机,这三根线代表风扇的低、中、高档转速,风扇的电机的零线和插座的零线接在一起。这个物理开关的作用就是把插座进来的火线和连接电机三根线中的某一根搭在一起形成闭合状态,和零线形成回路。比如你把风扇开关旋钮拧到低档,火线就和电机低档的线连起来,风扇通电就开始低速转动,中、高档同理。把开关拧到关闭,火线和三根线任意一根不相连,风扇就不通电就是关闭状态。简单原理图如下:

风扇原理图

原理搞懂了,来看一下解决方案,通过一个三路继电器分别接到风扇低中高三个档位电路,然后通过ESP8266芯片的三个GPIO针脚来控制三路继电器对应的每一个开关,基本上就能实现需求一:通过手机控制风扇的开关和档位了。需求二物理开关的控制,也可以通过ESP8266的四个GPIO针脚配合ESPHOME的Binary Sensor来控制。需求三需求四ESPHOME有原生的API可以和HomeAssistant对接,HomeAssistant又可以桥接到苹果的HomeKit,基本能实现预期的功能了。

材料准备

需要到的材料主要有带光耦隔离功能的三路继电器、ESP8266芯片(鉴于要用到9个针脚,所以选择了NodeMCU v3的集成开发板),继电器和NodeMCU开发板都是5V供电的,因此还需要一个220V转5V的降压模块来供电,这个模块一定要买5V/1A以上的版本,如果家里有闲置的手机充电头,也可以利旧,毕竟以前大部分手机充电头基本都是5V/1A的传家宝。

这些材料淘宝都可以买到:

1、三路继电器一个,¥8.5

2、ESP8266芯片,¥12.5

3、220V转5V降压模块,¥5

材料图片

开始搞事

首先画一下简单的电路连接图,220V进来通过5V减压模块给NodeMCU和继电器供电,NodeMCU的D0、D1、D2分别接继电器的三路控制信号,G、D5、D6、D7接风扇的开关做Binary Sensor自动化来控制三路继电器的开关

电路图

220V强电危险,接强电前先通过面包板和LED灯珠来验证一下效果是否如预期,按照线路图接好后,先给NodeMCU刷一下ESPHOME系统,配置代码如下:

esphome:

name: 8266fan

platform: ESP8266

board: nodemcuv2

wifi:

networks:

- ssid: "yourssid"

password: "yourpassword"

# Enable fallback hotspot (captive portal) in case wifi connection fails

ap:

ssid: "8266Fan Fallback Hotspot"

password: "IKsdfwerqer"

captive_portal:

# Enable logging

logger:

# Enable Home Assistant API

api:

password: "yourpassword"

ota:

password: "yourpassword"

switch:

- platform: gpio

name: "slow"

pin: D0

id: slow

interlock: [mid, fast]

- platform: gpio

name: "mid"

pin: D1

id: mid

interlock: [slow, fast]

- platform: gpio

name: "fast"

pin: D2

id: fast

interlock: [slow, mid]

binary_sensor:

- platform: gpio

name: "sw1"

pin:

number: D5

mode: INPUT_PULLUP

inverted: "True"

on_press:

then:

- switch.turn_on: slow

on_release:

then:

- switch.turn_off: slow

- switch.turn_off: mid

- switch.turn_off: fast

- platform: gpio

name: "sw2"

pin:

number: D6

mode: INPUT_PULLUP

inverted: "True"

on_press:

then:

- switch.turn_on: mid

on_release:

then:

- switch.turn_off: mid

- platform: gpio

name: "sw3"

pin:

number: D7

mode: INPUT_PULLUP

inverted: "True"

on_press:

then:

- switch.turn_on: fast

on_release:

then:

- switch.turn_off: slow

- switch.turn_off: mid

- switch.turn_off: fast

刷完后HomeAssistant会自动发现ESPHOME,识别到三个开关和三个传感器,在WEB页面测试通过三个开关是否控制三个继电器;通过杜邦线把G、D5、D6、D7接通模拟物理开关是否能够控制继电器

面包板上测试及其顺利,效果完美如预期,开始接风扇上强电测试,发现了好几个坑:

1、买的5V降压模块是700MA的,模块给NodeMCU供电,NodeMCU再通过3.3V给继电器供电,发现通过手机控制风扇经常有延迟或者直接失效,开始以为是Wi-Fi网络问题,最后查出来是电源模块功率不够导致NodeMCU一直重启,最后是拆了同事的5V/1A手机充电器的芯片模块来用的。所以5V降压模块一定要用5V/1A以上的。

2、换了5V/1A的电源装到风扇后发现继电器的第一路偶尔会失效,风扇表现为调到一档后没反应,二档三档则没问题。最初以为是线路接触问题,但神奇的是失效的时候把风扇倒立拆开底盖发现就好了,只要装回来又失效,最终发现风扇立着不正常,倒立就正常;立着的时候负责低档的继电器灯已经亮了说明控制程序和线路是没问题的,但继电器没有吸合,把风扇倒过来后可以正常吸合,但是吸合的滴答声比较小,怀疑还是电源功率不够,因为买的是5V供电兼容3.3V的继电器,通过NodeMCU的3.3V给继电器供电的。最后改了一下线路图,继电器不从NodeMCU取电,而是直接通过5V降压模块取电,问题完美解决。

强电测试完没有问题,拿热熔枪把NodeMCU模块、继电器、5V降压电源模块固定到风扇底座,物理改造完工。

风扇改造图

HomeKit接入

通过前面的ESPHOME代码,HomeAssistant有了三个开关分别控制风扇低中高档,也能正常桥接给HomeKit,但在HomeKit显示为三个开关,完美的方案应该显示为一个风扇而不是三个独立开关。查了一下HomeAssistant的文档,发现可以通过Template Fan把开关模拟成一个虚拟风扇,代码如下:

改完重启HomeAssistant后发现新增了一个风扇,可以控制风扇开关、档位。回到HomeKit这边,风扇也出来了,但是档位是按百分比来显示的,1% - 33%为低档位,34% - 66%为中档位,67% - 100%为高档位。

HomeKit风扇图

最终成品,HomeKit牌风扇正式上线,可以通过HomeKit、Siri、HomeAssistant、物理开关控制。风扇物理开关调到关闭时,可以通过手机打开风扇调到任意档位,然后可以通过物理开关调整档位或者关闭风扇,风扇状态会完美反馈到手机端。

成品图

参考资料

1. 小风扇改造

2. DIY之你想要的普通风扇改智能风扇

3. ESPHOME

4. HomeAssistant Template Fan