hassbian的三木大做了斐讯DC1固件,于是乎买了两个来玩玩,开始接触了ESPHome,折腾下来有了一些心得,写点东西总结总结吧。由于接触时间有限,理解不一定准确,仅供参考。
1. 快速理解
1.1 刷固件三件套
以刷斐讯DC1固件为例,涉及三个项目。
- esphome
- 项目地址:https://github.com/Samuel-0-0/esphome
- 作用:基于python的ESPHome管理工具,负责编译、烧录固件。
Tips
安装该项目会同时安装platformio依赖,platformio是一个8266开发板的开发环境。
- esphome-core
- 项目地址:https://github.com/Samuel-0-0/esphome-core
- 作用:ESPHome的C++源文件,编译后成为.bin固件,在8266开发板上运行。
- platform-espressif8266
- 项目地址:https://github.com/Samuel-0-0/platform-espressif8266
- 作用:platformio开发环境的配置。
1.2 编译固件的步骤
- 建立配置文件
- esphome根据配置文件生成C++工程的配置文件
- esphome调用platformio的接口编译C++工程文件,生成.bin固件
1.3 烧录固件的姿势
- 线刷:接串口线烧录;可以用
esphome run/upload
命令(参数指定串口–device=/dev/ttyUSB0),也可以用esphome-flasher软件。 - OTA:使用TCP或者UDP通信刷机;可以用
esphome run/upload
命令,也可以用设备的web服务(配置文件启用web_server组件),也可以用Home Assistant的ESPHome集成服务。Tips
如果配置文件中没有给设备指定IP地址(静态IP或设置use_address属性),命令行OTA会尝试解析{NodeName}.local的IP地址。
如果客户机没有mDNS服务是找不到IP的,要么安装mDNS服务(配合设备的mDNS服务工作);要么在hosts文件手动添加解析记录;如果电脑用的是路由器DNS服务,也可以在路由器上添加解析记录。
1.4 设备工作模式
ESPHome提供三种工作模式对设备进行控制.
模式 | 接入Home Assistant | 所需编译配置 | 通信协议 |
---|---|---|---|
ESPHome集成服务 | Home Assistant 配置-集成-ESPHome,连接到设备后自动生成 | api组件 | ESPHome自有通信协议 |
MQTT | Home Assistant启用mqtt的discovery自动发现、生成 | mqtt组件 | MQTT |
RESTful API | 自行开发 | web_server组件 | HTTP |
注意
api组件不能和mqtt组件一起使用。
2. esphome cli
介绍一下esphome命令行。
编译
1
2# 编译生成固件文件
esphome dc1.yaml compile成功编译后固件位于{CONFIG_DIR}/{NODE_NAME}/.pioenvs/{NODE_NAME}/firmware.bin
固件路径例子
/esphome/dc1.yaml里面设置的NODE_NAME(设备名称)是phicomm_dc1,则编译后固件位于/esphome/phicomm_dc1/.pioenvs/phicomm_dc1/firmware.bin
刷机
1
2# 如果带参数--device=/dev/ttyUSB0,则线刷;如果不带参数,则OTA:根据配置文件的静态IP或解析{NODE_NAME}.local的IP进行刷机
esphome dc1.yaml upload编译+刷机
1
2# 就是编译+刷机,参数和刷机命令一样
esphome dc1.yaml run补充
会同时进入日志输出界面。
3. 配置文件
和Home Assistant的配置文件类似,可以搭积木地自由启用组件,挑一些出来分析。
- esphome组件
1 | # 核心配置 |
Tips
$device_name是使用了substitutions设定的变量。
编译后生成固件路径{build_path}/.pioenvs/{NODE_NAME}/firmware.bin
- wifi组件
1 | # wifi连接 |
- ota组件
1 | ota: |
- web_server组件
1 | # web端,可以查看排查信息以及进行控制,另外新版可以OTA。 |
Tips
会同时启用HTTP RESTful API。
- api组件
1 | # 本地api服务(esphome自己通信协议) |
使用建议
不使用Home Assistant的集成服务管理设备的话不要启用改配置,否则会导致不断定期重启。
1 | # 日志组件 |
Tips
启用mqtt后,通过订阅{topic_prefix}/debug
也可以获取日志。
4.mqtt模式
ESPHome中大部分组件都能叠加mqtt功能直接使用,只需要相应的配置即可。
4.1配置项说明
1 | # mqtt功能 |
mqtt组件不能和api组件一起使用。
1 | # 组件的mqtt配置 |
1 | # 启用MQTT组件后,其它的大部分组件都拥有以下可选属性 |
Tips
如果设置internal: True属性隐藏,则不会通过mqtt上报。
一些不可控组件例如text_sensor,是没有command_topic的。
4.2实际使用样例
只需增加mqtt,其它保持默认即可。
1 | # api: # 需要取消api组件 |
假设设备名称{NodeName}为phicomm_dc1,则LOGO灯的topic如下,其它槽位开关的topic不在赘述。
1 | # state_topic |
更换topic
如果自定义了新topic,需要执行esphome dc1.yaml clean-mqtt命令清除mqtt服务器的信息。
最后Home Assistant中启用mqtt服务。
1 | # 注意这个是Home Assistant的configuration.yaml |
5.小结
- 为更深入了解ESPHome,想自行搭建了环境再编译固件,结果发现教程里esphome项目放错了链接,折腾了好久,找官方的docker研究了才知道原来有个esphome工具。
- 因为本人是更偏向与用mqtt接入的,原固件没有相关教程,本来想研究下代码直接把mqtt功能给加上去的,不过发现有点难看懂C++,硬件编程经验太少。后来查看官方文档,发现其实只要简单配置下就能用了。
- 配置调试mqtt期间,发现增加属性后编译报错,查看相关源码发现esphome cli有对配置文件解析成cpp文件的过程,才对整体的流程以及相关工具的分工更加明晰了。