MQTT協(xié)議
mqtt協(xié)議是物聯(lián)網(wǎng)常用的一個(gè)協(xié)議胆筒,具體的可以查查資料,簡單說下我的理解酱酬。
他是基于TCP協(xié)議的壶谒,有一個(gè)服務(wù)器和若干個(gè)客戶端,服務(wù)器叫broker膳沽。
客戶端第一步要連接服務(wù)器汗菜,需要指定用戶名或者key让禀。連接后設(shè)備就在線了可以雙向通信。具體的通信是可以往一個(gè)指定的topic發(fā)送一段內(nèi)容陨界,比如json或者普通文本巡揍。也可以訂閱一個(gè)topic,這樣其他設(shè)備往這個(gè)topic發(fā)送數(shù)據(jù)的時(shí)候就會(huì)收到相應(yīng)的內(nèi)容菌瘪。
安裝MQTT broker
我裝的EMQX腮敌,主要是他會(huì)有一個(gè)webUI,配置起來比較方便俏扩。而且是國內(nèi)的所以漢化的也好點(diǎn)糜工。。录淡。
在配置》》加載項(xiàng)》》加載項(xiàng)商店 找到EMQX安裝就行捌木。
裝好后啟動(dòng)然后打開側(cè)邊欄的選項(xiàng)就能在側(cè)邊欄看到了
點(diǎn)進(jìn)去默認(rèn)用戶名和密碼是admin和public
然后要在客戶端認(rèn)證里面創(chuàng)建用戶以便HA和傳感器連接。
MQTT集成
在設(shè)備與服務(wù)》》添加集成 里面添加mqtt集成
因?yàn)閑mqx安裝在本機(jī)赁咙,所以設(shè)置里面ip地址填127.0.0.1就行
configuration.yaml
為了編輯文件钮莲,可以先裝一個(gè)file editor,或者一個(gè)vs code的插件
然后找到Homeassistant/下面的configuration.yaml
這里我主要參考的兩個(gè)文章https://www.home-assistant.io/integrations/binary_sensor.mqtt/
和https://blog.csdn.net/qq_31400983/article/details/128967768彼水。后面這個(gè)是當(dāng)HA里面的內(nèi)容發(fā)生變化時(shí)推送給EMQX,前面這個(gè)是傳感器發(fā)生變化時(shí)同步給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后會(huì)在面板看到這個(gè)東西
然后在emqx看到HA已經(jīng)訂閱了這幾個(gè)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這個(gè)topic,在界面切換狀態(tài)時(shí)MQTTX就能收到相關(guān)的推送了
mqtt light的其他可以配置的內(nèi)容
可以通過配置拆魏,讓light變成rgb或者亮度可調(diào)的燈盯桦,并且每一個(gè)都有state傳入和command下發(fā)兩個(gè)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