轉載於https://bbs.hassbian.com/thread-6822-1-1.html
本帖最后由 cnk700i 於 2019-4-24 08:12 編輯
備注
排版不整了,如有問題可以去博客看。
本來想做伸手黨等三木大的MQTT配置,結果還是管不住折騰的沖動,最后發現原來ESPHome已經自帶,配置下就能用了,有點意外。。。
提醒回復用
並沒有隱藏內容,如果覺得有用回復下幫忙頂貼。
本帖隱藏的內容
正文
三木大做了斐訊DC1固件,於是乎買了兩個來玩玩,開始接觸了ESPHome,折騰下來有了一些心得,寫點東西總結總結吧。由於接觸時間有限,理解不一定准確,僅供參考。
- 快速理解
1.1 刷固件三件套
以刷斐訊DC1固件為例,涉及三個項目。
esphome
項目地址:https://github.com/Samuel-0-0/esphome
作用:基於python的ESPHome管理工具,負責編譯、燒錄固件。
INFO:安裝該項目會同時安裝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集成服務。
INFO:如果配置文件中沒有給設備指定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
WARN:api組件不能和mqtt組件一起使用。
- esphome cli
介紹一下esphome命令行。
編譯
編譯生成固件文件
esphome dc1.yaml compile
成功編譯后會固件{CONFIG_DIR}/{NODE_NAME}/.pioenvs/{NODE_NAME}/firmware.bin
INFO:舉個例子,有一個/esphome/dc1.yaml,里面設置的NODE_NAME(設備名稱)是phicomm_dc1,則編譯后固件路徑在/esphome/phicomm_dc1/.pioenvs/phicomm_dc1/firmware.bin
刷機
如果帶參數--device=/dev/ttyUSB0,則線刷;如果不帶參數,則OTA:根據配置文件的靜態IP或解析{NODE_NAME}.local的IP進行刷機
esphome dc1.yaml upload
編譯+刷機
就是編譯+刷機,參數和刷機命令一樣
esphome dc1.yaml run
INFO:會同時進入日志輸出界面。
- 配置文件
和Home Assistant的配置文件類似,可以搭積木地自由啟用組件,挑一些出來分析。
esphome組件
核心配置
esphome:
name: $device_name # 設備名稱,不能和其它設備重復
platform: ESP8266
board: $board_model
esphome_core_version: #指定esphome_core來源,如果只用latest、dev,則會從官方的項目下載。
#local: path/to/esphome-core #指定本地來源
repository: https://github.com/Samuel-0-0/esphome-core.git #指定外部來源,項目作用上面有介紹過
branch: dc1
build_path: build/$device_name # 編譯路徑,默認是{CONFIG_DIR}/{NODE_NAME}
esp8266_restore_from_flash: yes
arduino_version: 2.5.0
platformio_options:
platform: https://github.com/Samuel-0-0/platform-espressif8266.git#dc1 # 項目作用上面有介紹過
INFO:$device_name是使用了substitutions設定的變量。
INFO:編譯后生成固件路徑{build_path}/.pioenvs/{NODE_NAME}/firmware.bin
wifi組件
wifi連接
wifi:
ssid: $wifi_ssid # wifi名稱
password: $wifi_password # wifi密碼
use_address: 192.168.178.230 # 指定燒錄固件時候目標設備IP,優先級高於靜態IP
設置靜態地址,建議設置,根據自己網絡配置
manual_ip:
static_ip: 192.168.178.230
gateway: 192.168.178.1
subnet: 255.255.255.0
dns1: 1.1.1.1
dns2: 1.2.2.1
domain: .local # 組合后設備主機名為{NodeName}.local,不設置默認就這個
reboot_timeout: $wifi_reboot_timeout # 無wifi連接自動重啟時間,默認5min
power_save_mode: none # 節能模式,啟用的話不會一直連接wifi
fast_connect: $wifi_fast_connect # 快速連接,不執行完整的wifi掃描,當存在多個相同wifi可能會直接連接到最弱的信號
ota組件
ota:
safe_mode: true # 連續10次啟動失敗,進入安全模式,只加載Serial Logging+WiFi+OTA組件
password: $ota_password
web_server組件
web端,可以查看排查信息以及進行控制,另外新版可以OTA。
web_server:
port: 80 # web端口
css_url: https://esphome.io/_static/webserver-v1.min.css # css樣式,不設置默認就這個,后續官方更新才用上。
js_url: https://esphome.io/_static/webserver-v1.min.js # js文件,不設置默認就這個,后續官方更新才用上。
INFO:會同時啟用HTTP RESTful API。
api組件
本地api服務(esphome自己通信協議)
api:
reboot_timeout: $api_reboot_timeout # 無客戶端訪問設備API自動重啟,默認5min
WARN:不使用Home Assistant的集成服務管理設備的話不要啟用改配置,否則會導致不斷定期重啟。
日志組件
logger:
hardware_uart: UART1 # 串口調式,不懂
level: info # 日志等級,默認DEBUG,平常用設置INFO
INFO:啟用mqtt后,通過訂閱{topic_prefix}/debug也可以獲取日志。
4.mqtt模式
ESPHome中大部分組件都能疊加mqtt功能直接使用,只需要相應的配置即可。
4.1配置項說明
mqtt功能
mqtt:
broker: 192.168.0.1 # mqtt服務器ip/域名
username: mosquitto # 賬號
password: 123 # 密碼
-------------------------------#
birth_message: # 連接通知,設備發起
topic: phicomm_dc1/state # 默認{TOPIC_PREFIX}/status
payload: online # 默認通知online狀態
will_message: # 離線通知,由mqtt服務器發起
topic: phicomm_dc1/state # 默認{TOPIC_PREFIX}/status
payload: offline # 默認通知offline狀態
如果不設置,默認就是如上配置;如果birth_message、will_message的topic為空或不一樣,則不生效。
-------------------------------#
topic_prefix: phicomm_dc1 # 不設置默認{NodeName}
discovery: True # 發現標記設置(全局)
discovery_prefix: homeassistant # 配置數據topic,默認homeassistant,要與Home Assistant的mqtt組件設置保持一直(默認也是homeassistant)
WARN:mqtt組件不能和api組件一起使用。
組件的mqtt配置
switch: # 組件類型,對應topic中的{COMPONENT_TYPE}
- platform: gpio
pin: GPIO14LOGO燈
name: "${device_name} LOGO_light" # 組件名稱對應topic中的{COMPONENT_NAME}
id: LOGO_light
internal: false
inverted: true
啟用MQTT組件后,其它的大部分組件都擁有以下可選屬性
retain: True # state_topic消息保持,默認True
discovery: True # 如果不設置,取mqtt組件的discovery屬性
availability: # 不設置取mqtt組件的birth_message、will_message屬性
topic: livingroom/status
payload_available: online
payload_not_available: offline
state_topic: livingroom/custom_state_topic # 不設置默認{TOPIC_PREFIX}/{COMPONENT_TYPE}/{COMPONENT_NAME}/state
command_topic: livingroom/custom_command_topic # 不設置默認{TOPIC_PREFIX}/{COMPONENT_TYPE}/{COMPONENT_NAME}/command
INFO:如果設置internal: True屬性隱藏,則不會通過mqtt上報。
INFO:一些不可控組件例如text_sensor,是沒有command_topic的。
4.2實際使用樣例
只需增加mqtt,其它保持默認即可。
api: # 需要取消api組件
mqtt:
broker: 192.168.0.1 # mqtt服務器ip/域名
username: mosquitto # 賬號
password: 123 # 密碼
假設設備名稱{NodeName}為phicomm_dc1,則LOGO燈的topic如下,其它槽位開關的topic不在贅述。
state_topic
phicomm_dc1/switch/phicomm_dc1_logo_light/state
command_tpoic,payload設置ON/OFF進行打開/關閉操作
phicomm_dc1/switch/phicomm_dc1_logo_light/command
INFO:如果自定義了新topic,需要執行esphome dc1.yaml clean-mqtt命令清除mqtt服務器的信息。
最后Home Assistant中啟用mqtt服務。
注意這個是Home Assistant的configuration.yaml
mqtt:
broker: 192.168.0.1
username: mosquitto
password: 123
discovery: True # 啟用主動發現
discovery_prefix: homeassistant # 不設置默認就這個,要和ESPHome的一致
5.小結
為更深入了解ESPHome,想自行搭建了環境再編譯固件,結果發現教程里esphome項目放錯了鏈接,折騰了好久,找官方的docker研究了才知道原來有個esphome工具。
因為本人是更偏向與用mqtt接入的,原固件沒有相關教程,本來想研究下代碼直接把mqtt功能給加上去的,不過發現有點難看懂C++,硬件編程經驗太少。后來查看官方文檔,發現其實只要簡單配置下就能用了。
配置調試mqtt期間,發現增加屬性后編譯報錯,查看相關源碼發現esphome cli有對配置文件解析成cpp文件的過程,才對整體的流程以及相關工具的分工更加明晰了。