MQTT協(xié)議
mqtt協(xié)議是物聯(lián)網(wǎng)常用的一個協(xié)議,具體的可以查查資料,簡單說下我的理解。
他是基于TCP協(xié)議的,有一個服務(wù)器和若干個客戶端,服務(wù)器叫broker。
客戶端第一步要連接服務(wù)器,需要指定用戶名或者key。連接后設(shè)備就在線了可以雙向通信。具體的通信是可以往一個指定的topic發(fā)送一段內(nèi)容,比如json或者普通文本。也可以訂閱一個topic,這樣其他設(shè)備往這個topic發(fā)送數(shù)據(jù)的時候就會收到相應(yīng)的內(nèi)容。
安裝MQTT broker
我裝的EMQX,主要是他會有一個webUI,配置起來比較方便。而且是國內(nèi)的所以漢化的也好點(diǎn)。。。
在配置》》加載項》》加載項商店 找到EMQX安裝就行。

裝好后啟動然后打開側(cè)邊欄的選項就能在側(cè)邊欄看到了

點(diǎn)進(jìn)去默認(rèn)用戶名和密碼是admin和public
然后要在客戶端認(rèn)證里面創(chuàng)建用戶以便HA和傳感器連接。
MQTT集成
在設(shè)備與服務(wù)》》添加集成 里面添加mqtt集成

因為emqx安裝在本機(jī),所以設(shè)置里面ip地址填127.0.0.1就行

configuration.yaml
為了編輯文件,可以先裝一個file editor,或者一個vs code的插件

然后找到Homeassistant/下面的configuration.yaml
這里我主要參考的兩個文章https://www.home-assistant.io/integrations/binary_sensor.mqtt/
和https://blog.csdn.net/qq_31400983/article/details/128967768。后面這個是當(dāng)HA里面的內(nèi)容發(fā)生變化時推送給EMQX,前面這個是傳感器發(fā)生變化時同步給HA。
HA接收傳感器消息
在configuration.yaml里面輸入下面的內(nèi)容
# Example configuration.yaml entry
mqtt:
- binary_sensor:
name: "Window Contact Sensor"
state_topic: "home-assistant/window/contact"
payload_on: "ON"
availability:
- topic: "home-assistant/window/availability"
payload_available: "online"
payload_not_available: "offline"
qos: 0
device_class: opening
value_template: "{{ value_json.state }}"
重啟HA后會在面板看到這個東西

然后在emqx看到HA已經(jīng)訂閱了這幾個topic

在MQTTX里面可以控制設(shè)備上線、狀態(tài)開關(guān)


HA推送信息給MQTT
在configuration.yaml里面添加下面內(nèi)容后重啟HA
# add light
mqtt:
light:
# Device name
- name: "Bookcase_Light"
# State topic
state_topic: "LED_Switch"
# Command topic
command_topic: "LED_Switch"
# Command type
payload_on: "1"
payload_off: "0"
# unique_ID
unique_id: "LED1"
# optimistic set
optimistic: false
看到界面顯示

EMQX顯示

在MQTTX里面訂閱LED_Switch這個topic,在界面切換狀態(tài)時MQTTX就能收到相關(guān)的推送了

mqtt light的其他可以配置的內(nèi)容
可以通過配置,讓light變成rgb或者亮度可調(diào)的燈,并且每一個都有state傳入和command下發(fā)兩個topic
# Example configuration.yaml entry
mqtt:
- light:
name: "Office Light RGB"
state_topic: "office/rgb1/light/status"
command_topic: "office/rgb1/light/switch"
brightness_state_topic: "office/rgb1/brightness/status"
brightness_command_topic: "office/rgb1/brightness/set"
rgb_state_topic: "office/rgb1/rgb/status"
rgb_command_topic: "office/rgb1/rgb/set"
state_value_template: "{{ value_json.state }}"
brightness_value_template: "{{ value_json.brightness }}"
rgb_value_template: "{{ value_json.rgb | join(',') }}"
qos: 0
payload_on: "ON"
payload_off: "OFF"
optimistic: false
注意,類似下面這種寫法已經(jīng)不被支持了
light:
- platform: mqtt
name: "Office light"
state_topic: "status"
command_topic: "switch"
brightness_state_topic: 'brightness'
brightness_command_topic: 'brightness/set'
qos: 0
payload_on: "ON"
payload_off: "OFF"
optimistic: false