esphome文件MQTT配置


轉載於https://bbs.hassbian.com/thread-6822-1-1.html

本帖最后由 cnk700i 於 2019-4-24 08:12 編輯

備注
排版不整了,如有問題可以去博客看。
本來想做伸手黨等三木大的MQTT配置,結果還是管不住折騰的沖動,最后發現原來ESPHome已經自帶,配置下就能用了,有點意外。。。
提醒回復用
並沒有隱藏內容,如果覺得有用回復下幫忙頂貼。

本帖隱藏的內容

正文
三木大做了斐訊DC1固件,於是乎買了兩個來玩玩,開始接觸了ESPHome,折騰下來有了一些心得,寫點東西總結總結吧。由於接觸時間有限,理解不一定准確,僅供參考。

  1. 快速理解
    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組件一起使用。

  1. 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:會同時進入日志輸出界面。

  1. 配置文件
    和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: GPIO14

    LOGO燈

    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文件的過程,才對整體的流程以及相關工具的分工更加明晰了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM