基于esphome的智能开关

github项目地址
自制的多控开关,最高支持八路开关(普通or回弹),esphome直接接入HA
github内有简单的使用说明,占个坑先,后续更新图文版本

本项目只是为了满足自家装修需求,放出来仅供大家参考


4.3日更新:

简单焊了块板子。。5w的usb电烙铁走锡线不是人干的事:sob: :sob:

用的是esp01s + arduino pro mini
刚来论坛不让贴超过一张图。。。只能放视频链接了
具体操作效果见视频:百度云链接 提取码:cvwk


项目背景

新家打算搞点智能家居玩,也一直在折腾home assistant。考虑到家里的面板开关较多,若全部换成目前市场上的智能开关,一个是成本过高(sonoff/绿米aqra…),一个是全部采用较为便宜的wifi接入的话家里的ap怕承受不住。因此就打算自制一个多路智能开关模块,这样使用普通的灯和普通的面板开关也能接入HA实现智能控制,并且缩减wifi终端数量,并且实现集中管理。

基本特性

  • 支持普通开关或自回弹开关
  • 多控的功能与固件无关,只需要开关支持多控接法即可
  • HA崩溃了一样不影响按键控制
  • 开关状态实时同步
  • 最高支持8路继电器,即8路开关

基本原理及使用方法

硬件接线

以四路为例,简单接线如图


下位机arduino的输入引脚连接开关,开关跨接到GND与输入引脚之间,开关闭合时,arduino输入引脚就是低电平,此时arduino判断对应开关被按下,此时对应的输出引脚输出高电平。

下位机arduino输出引脚连接5v继电器模块的控制端,控制火线的通断。当某个输出引脚为高电平的时候,对应的继电器吸合,电路导通。

图中从左到右四个开关对应控制下方从左到右的四个继电器
开关分别连接到arduino的6,7,8,9引脚
继电器分别连接10,11,12,13引脚

上位机(图中开发板型号为WeMos D1 Mini,node mcu等其他开发板同理,只要任意两个空闲的GPIO口即可)
这里选择D5口(对应esp8266GPIO14)当作tx,D6口(对应esp8266GPIO12)当作rx,分别连接到下位机arduino的rx口和tx口。


软件部分

首先是下位机,只讲需要注意和修改的部分:
我们用的是普通开关,因此这一行保持注释

//#define SELF_RECOVERY  //uncomment this if you are using a self recovery switch 如果你使用的是自回弹的开关,把这行代码取消注释  

下一步,我们使用的是四路开关,PIN_COUNT 如下填入4,波特率不用修改

#define PIN_COUNT 4     //define the quantity of pins that used for IO 定义开关数量,数字1-8
#define BAUD 9600 //baud rate 串口波特率,一般不用改

下一步,填写输入输出引脚,首先注释掉所有预定义的引脚

//定义用到的io口,inputPinList定义用于输入的引脚,outputPinList定义用于输出的引脚,引脚之间是一一对应关系,即数组中相同位置的输入引脚控制相同位置的输出引脚,数量必须与之前定义的开关数量相同
//以下为arduino uno/nano/pro mini/mini的预定义引脚

//uint8_t inputPinList[] = {2, 3, 4, 5, 6, 7, 8, 9};    //maximum pin using in arduino uno/nano/pro mini/mini
//uint8_t outputPinList[] = {10,11,12,13,14,15,16,17};  //maximum pin using in arduino uno/nano/pro mini/mini

//以下为esp8266 nodemcu的预定义引脚
//const uint8_t inputPinList[] = {0, 4, 5,10}; //maximum pin using in esp8266-12e nodemcu
//const uint8_t outputPinList[] = {15, 13, 12, 14};//maximum pin using in esp8266-12e nodemcu

之后添加引脚定义:
inputPinList[] 中填入前面开关连接的引脚:6,7,8,9
outputPinList[] 填入 对应 的继电器控制引脚:10,11,12,13

//...其他代码
const uint8_t inputPinList[] = {6, 7, 8, 9}; 
const uint8_t outputPinList[] = {10, 11, 12, 13};
//...其他代码

到此下位机的配置已经完成,直接下载代码到arduino即可。


接下来配置上位机,也就是esphome节点。首先按照 官网教程 安装esphome环境,并创建一个yaml配置文件。
之后复制github中 esphome config file 文件夹下 customSwitches.h 文件到你的yaml配置文件的相同目录。

接下来开始编辑你刚刚创建好的yaml配置文件,项目文件夹中有一个example.yaml的配置文件样例,与你的配置文件对照着填写即可,这里仅做简单解释。

首先是esphome字段,需要添加include file,如下所示:

esphome:

  name: example
  platform: ESP8266
  board: esp12e
  # 把需要包含的头文件放到与yaml配置文件同一目录下,在此填入文件名
  includes: 
    - customSwitches.h

之后添加logging配置:

# Enable logging
# 用到了自定义日志,同样填写即可
logger:
  level: DEBUG
  esp8266_store_log_strings_in_flash: False

之后添加uart字段,tx填写前面选择的D5口,rx填写前面选择的D6口,根据在创建配置的时候板子不一样,这里能填的口也不一样。意思就是D5和D6实际上是对GPIO口进行的映射,在先前的配置文件中board: esp12e就是定义了开发板型号,esphome会自动把D5和D6转换成对应的GPIO口编号(也就是前面的14和12)。但我这边的例子中填写的是esp12e,是原生的esp8266芯片,无法识别D5,D6这样的编号,因此我在这里只能填写对应的GPIO编号。这一点按照你们使用的esp开发板不同酌情修改。

# 上面的其他代码...
# uart字段,选择用于通信的引脚,波特率过高,软串口性能不佳可能出现传输错误
uart:
  id: uart_bus
  tx_pin: 14
  rx_pin: 12
  baud_rate: 9600

下面就是最重要的配置开关的部分,先贴上样例

# switch字段,实际配置开关

# lambda语句解释:
# auto my_custom = new MyCustomComponent(8,id(uart_bus)); new一个自定义开关的实例,第一个参数是开关的数量,最大支持8个。第二个参数是之前定义的uart实例的id,同样填写即可。
# App.register_component(my_custom); 注册组件,同样填写即可
# return {&my_custom->switches[0]} 这里是返回列表,返回一串开关实例的指针,中间以逗号分隔,下标从零开始,总数与第一行中‘new MyCustomComponent(8,id(uart_bus));’填写的开关数量相同。
switch:
  - platform: custom
    lambda: |-
      auto my_custom = new MyCustomComponent(8,id(uart_bus));
      App.register_component(my_custom);
      return {&my_custom->switches[0],&my_custom->switches[1],&my_custom->switches[2],&my_custom->switches[3],&my_custom->switches[4],&my_custom->switches[5],&my_custom->switches[6],&my_custom->switches[7]};
# 下面是各个开关的属性,参照官方文档中的属性,注意个数必须和前面‘new MyCustomComponent(8,id(uart_bus));’中传入的开关数量一致
    switches:
      - name: "My Custom Switches1"
      - name: "My Custom Switches2"
      - name: "My Custom Switches3"
      - name: "My Custom Switches4"
      - name: "My Custom Switches5"
      - name: "My Custom Switches6"
      - name: "My Custom Switches7"
      - name: "My Custom Switches8"

我们这里用到的是4个开关,因此
auto my_custom = new MyCustomComponent(8,id(uart_bus));中的8改为4

return语句同样进行修改,4个开关,因此只能返回四个元素,下标从零开始,如下修改:

return{&my_custom->switches[0],&my_custom->switches[1],&my_custom->switches[2],&my_custom->switches[3]};

下面的switches字段同样修改成四项,这里只定义了开关的名字,官网上对于开关还有其他属性可以填写,可以参照添加:

switches:
      - name: "My Custom Switches1"
      - name: "My Custom Switches2"
      - name: "My Custom Switches3"
      - name: "My Custom Switches4"

该部分的完整配置样例:

switch:
  - platform: custom
    lambda: |-
      auto my_custom = new MyCustomComponent(4,id(uart_bus));
      App.register_component(my_custom);
      return {&my_custom->switches[0],&my_custom->switches[1],&my_custom->switches[2],&my_custom->switches[3]};

    switches:
      - name: "My Custom Switches1"
      - name: "My Custom Switches2"
      - name: "My Custom Switches3"
      - name: "My Custom Switches4"

至此上位机的配置文件也修改完成,直接按照官网教程刷入esp8266开发板即可。


实际效果

手抖把原先的板子烧了(哭
等待新的arduino板子到货之后更新实拍图。。。

4.3日更新:
简单焊了块板子。。5w的usb电烙铁走锡线不是人干的事:sob: :sob:

用的是esp01s + arduino pro mini

具体操作效果见视频:百度云链接 提取码:cvwk

使用场景是? :face_with_monocle:

看不懂,坐等大神更新。