『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 22498|回复: 37

OpenMQTTGateway 串起射頻/紅外/MQTT與HASS之間的橋樑

[复制链接]

30

主题

493

帖子

4795

积分

论坛元老

佑桑

Rank: 8Rank: 8

积分
4795
金钱
4287
HASS币
156

教程狂人

发表于 2018-4-4 17:04:22 | 显示全部楼层 |阅读模式
本帖最后由 chinyaolin 于 2018-4-4 17:04 编辑

OpenMQTTGateway
是一個開源專案 https://github.com/1technophile/OpenMQTTGateway
評估了許久, 這個開源專案應該能解決我一直以來的問題
  • RF 射頻開關雖然能透過 Broadlink RM 接入 HASS 但沒有狀態反饋
  • Sonoff RF 有狀態反饋 可學習射頻 但卻只能學習一組
  • 家裡的 120 型暗盒空間不足 沒辦法把論壇裡的定製版裝入
  • 電燈開關統統只有單火線 沒有零線
我自己的主要需求有以下幾個
  • 保留牆壁上的開關,並且維持原有的操作習慣
  • 在家中的網路出了問題的時候,保證每一個燈至少還有一個開關可以控制
以目前使用的材料,可以實現的功能有
  • 接收任何 RF 射頻訊號,轉碼後送至 MQTT Broker
  • 從 MQTT Broker 接到編碼,轉碼後以 RF 射頻發出
  • 額外接了 DHT12,接入溫度及濕度數值

以上都是開場白,以下正文開始

準備的材料及軟體如下
  • NodeMCU + NodeMCU 底板
    21647522108581_143_m.jpg 21715854445747_127_m.jpg
  • DHT12 溫濕度感測器 (DHT11/DHT22 也可以用)
    21647522069745_598_m[1].jpg
  • 433M 超再生模塊
    21647522064841_708_m[1].jpg
  • 杜邦端子接線數條 (公-公 & 公-母 & 母-母) + 麵包板
    21547105967928_581_m[1].jpg
  • 電腦上安裝 Arduino IDE

上傳軟體及組裝就簡單帶過
  • 下載 ZIP 包之後在 Arduino IDE 中開啟 (https://github.com/1technophile/OpenMQTTGateway/releases
  • RF/DHT 依照網站上的說明完成連接
    OpenMQTTgateway_ESP8266_Addon_DHT[1].png OpenMQTTgateway_ESP8266_Addon_RF[1].png
  • 組裝完成
    2018-04-04 09.37.59.jpg
  • 修改一下 User_config.h 設定
    原則上,設定好無線網路及 MQTT 相關的地方即可,NodeMCU 會透過 DHCP 取得 IP位址
    
    /*-------------DEFINE YOUR NETWORK PARAMETERS BELOW----------------*/
    //MQTT Parameters definition
    //#define mqtt_server_name "www.mqtt_broker.com" // instead of defining the server by its IP you can define it by its name, uncomment this line and set the correct MQTT server host name
    #define mqtt_server "xxx.xxx.xxx.xxx" // 這裡填寫 MQTT Broker 主機 IP
    #define mqtt_user "homeassistant" // 這裡填 MQTT 連線帳號, 若是 HASS 內建的話就使用 homeassistant
    #define mqtt_password "12345678" // 這裡填 MQTT 連線密碼
    #define mqtt_port 1883
    #define Gateway_Name "OpenMQTTGateway" // 名字自取
    #define version_Topic "home/" Gateway_Name "/version"
    #define will_Topic "home/" Gateway_Name "/LWT"
    #define will_QoS 2 // 原來的值是 0 我改成了 2
    #define will_Retain true
    #define will_Message "Offline"
    #define Gateway_AnnouncementMsg "Online"
    //#define MDNS_SD //comment if you don't want to use mdns for discovering automatically your ip server, please note that MDNS with ESP32 can cause the BLE to not work
    
    /*-------------DEFINE YOUR NETWORK PARAMETERS BELOW----------------*/
    // Update these with values suitable for your network.
    #if defined(ESP8266) || defined(ESP32) // for nodemcu, weemos and esp8266
      #define wifi_ssid "這裡是無線網路SSID的名字"
      #define wifi_password "無線網路密碼"
    #else // for arduino + W5100
      const byte mac[] = {  0xDE, 0xED, 0xBA, 0xFE, 0x54, 0x95 }; //W5100 ethernet shield mac adress
    #endif
    

  • 試著編譯看看,若有問題話應該是缺少程式庫的關係,一個一個補上就行了
    1. 可以透過 Arduino IDE 程式庫管理員來搜尋
    2. 這個專案作者也有提供載點 https://github.com/1technophile/ ... ee/master/libraries
    3. 確認正常了,就可以上傳至 NodeMCU
  • 接著在 Ardiuno IDE 中啟用「序列埠監控視窗」,隨便找一個 RF 發射後應該可以看到一些資料
    OpenMQTTGateway mac: 
    xx:xx:xx:xx:xx:xx // 這個是 NodeMCU 開發版上 ESP8266 的 MAC
    .
    OpenMQTTGateway ip: 
    xxx.xxx.xxx.xxx // 這是開發板透過 DHCP 取得的位址
    WiFi ok
    Connecting to MQTT by IP adress
    xxx.xxx.xxx.xxx // 準備連到這個位址的 MQTT Broker
    RF_EMITTER_PIN 
    3
    RF_RECEIVER_PIN 
    0
    ZgatewayRF setup done 
    MQTT connection...
    Connected to broker // 連線成功
    Subscription OK to the subjects // 註冊成功
    Sending Hum to MQTT // 送出濕度的數值
    35.00
    Sending Temp to MQTT // 送出溫度的數值
    29.00
    Rcv. RF // 開發板收到 RF 訊號
    Adv data RFtoMQTT
    Sending RFtoMQTT // 轉成 MQTT Public 數值送出
    15724020
    RFtoMQTT OK
    Hey I got a callback 
    

  • 確認程式沒有問題之後,接著看看 MQTT Broker 有沒有收到資料
    這裡選擇最多人使用的 mosquitto,從這裡可以確認資料有正確進來了
    # mosquitto_sub -h xxx.xxx.xxx.xxx(MQTT Broker) -p 1883 -u homeassistant -P 12345678(密碼) -v -V mqttv311 -t "home/#"
    home/OpenMQTTGateway/version 0.6.2
    home/OpenMQTTGateway/LWT Online
    home/433toMQTT/protocol 1
    home/433toMQTT/bits 24
    home/433toMQTT/length 411
    home/433toMQTT 15724020
    home/DHTtoMQTT/dht1/hum 35.00
    home/DHTtoMQTT/dht1/temp 30.00
    

休息一下,下一節課繼續看看怎麼樣整合到 HASS 中

评分

参与人数 3金钱 +40 收起 理由
windgo + 10 膜拜大神!
+ 20 膜拜大神!
neroxps + 10 膜拜大神!

查看全部评分

回复

使用道具 举报

30

主题

493

帖子

4795

积分

论坛元老

佑桑

Rank: 8Rank: 8

积分
4795
金钱
4287
HASS币
156

教程狂人

 楼主| 发表于 2018-4-4 17:04:47 | 显示全部楼层
本帖最后由 chinyaolin 于 2018-4-9 15:36 编辑

軟硬體建置完成後, 我們已經可以在 MQTT Broker 得到資料了, 接著逐步看看怎麼整合到 HASS 中
(以下將OpenMQTTGateway 簡稱為 OMG)

取得 RF 射頻碼
  • 這裡需要用到 mosquitto_sub 這個最常用的 MQTT Subscribe 程式來訂閱特定主題
  • OMG 接收到任何 RF 射頻訊號後, 都會送出 "home/433toMQTT" 的主題到 MQTT Broker
  • 因此訂閱 home/433toMQTT 就可以得到 RF 射頻碼
  • 指令完成後, 隨意按下一個 RF 射頻開關的按鈕試試看

# mosquitto_sub -h XXX.XXX.XXX.XXX -p 1883 -u USERNAME -P PASSWORD -v -V mqttv311 -t "home/433toMQTT#"

其中
  • XXX.XXX.XXX.XXX 是 MQTT Broker 的 IP 位址, 通常就是 HASS 的位址
  • USERNAME 是連線到 MQTT Broker 的用戶名, 若用 HASS 內嵌的話, 用戶名就是 homeassistant
  • PASSWORD 是連線 MQTT Broker 的密碼, 若用 HASS 內嵌的話, 密碼則與用戶名就是 api_password 設定的相同
  • mqttv311 代表 MQTT Broker 所支援的版本, 若用 HASS 內嵌的話, 需要使用 3.1.1
  • home/433toMQTT# 是你所要訂閱的 MQTT topic, 井號是萬用字元, 這裡代表我想要顯示出所有 home/433toMQTT 開頭的訊息
接著, 大概會看到類似以下的訊息
home/433toMQTT/protocol 1
home/433toMQTT/bits 24
home/433toMQTT/length 411
home/433toMQTT 15724020

這一行, 就是我們必需要知道的 RF 鍵編碼
home/433toMQTT 15724020

PS.
10樓有一個範例,
可以達到按下15724020這顆 RF 按鈕後,觸發 Sonoff 執行開關動作

回复

使用道具 举报

2

主题

711

帖子

5045

积分

论坛元老

Rank: 8Rank: 8

积分
5045
金钱
4334
HASS币
85
发表于 2018-4-4 17:32:41 | 显示全部楼层
沙发沙发~等待下堂课
回复

使用道具 举报

17

主题

800

帖子

5738

积分

论坛元老

Rank: 8Rank: 8

积分
5738
金钱
4933
HASS币
0
发表于 2018-4-4 19:49:28 来自手机 | 显示全部楼层
话说直接在灯那里把sonoff串联进去不就可以让
回复

使用道具 举报

17

主题

800

帖子

5738

积分

论坛元老

Rank: 8Rank: 8

积分
5738
金钱
4933
HASS币
0
发表于 2018-4-4 19:50:34 来自手机 | 显示全部楼层
sirakawa 发表于 2018-4-4 19:49
话说直接在灯那里把sonoff串联进去不就可以让

或者灯里没地方?我是直接磁铁吸道灯的背板上了
回复

使用道具 举报

30

主题

493

帖子

4795

积分

论坛元老

佑桑

Rank: 8Rank: 8

积分
4795
金钱
4287
HASS币
156

教程狂人

 楼主| 发表于 2018-4-4 20:43:44 | 显示全部楼层
sirakawa 发表于 2018-4-4 19:49
话说直接在灯那里把sonoff串联进去不就可以让

無線網路出問題時就沒辦法對應了
回复

使用道具 举报

9

主题

787

帖子

3858

积分

论坛元老

Rank: 8Rank: 8

积分
3858
金钱
3071
HASS币
87
发表于 2018-4-5 00:17:37 | 显示全部楼层
好酷炫,期待教程,跟着试试.
回复

使用道具 举报

17

主题

800

帖子

5738

积分

论坛元老

Rank: 8Rank: 8

积分
5738
金钱
4933
HASS币
0
发表于 2018-4-5 00:25:17 来自手机 | 显示全部楼层
chinyaolin 发表于 2018-4-4 20:43
無線網路出問題時就沒辦法對應了

sonoff设置成断电再通电默认开灯就好。哪怕网络出问题了,关了物理开关再打开灯就亮了。缺点就是物理开关平时一直要开着
回复

使用道具 举报

8

主题

270

帖子

1337

积分

金牌会员

Rank: 6Rank: 6

积分
1337
金钱
1067
HASS币
0
发表于 2018-4-5 01:07:03 | 显示全部楼层
666我已经发过一次这个项目的红外和433 or 315的帖子了,不过后来一直没有更新。感谢分享
回复

使用道具 举报

30

主题

493

帖子

4795

积分

论坛元老

佑桑

Rank: 8Rank: 8

积分
4795
金钱
4287
HASS币
156

教程狂人

 楼主| 发表于 2018-4-5 09:59:49 | 显示全部楼层
671792320 发表于 2018-4-5 01:07
666我已经发过一次这个项目的红外和433 or 315的帖子了,不过后来一直没有更新。感谢分享 ...

看過您的文章,一開始以為只是一個取代 Broadlink RM 的方案
後來仔細理解之後才知道其實可以達到的功能更多,我目前想做的是

任意RF發射器 -> OpenMQTTGateway -> MQTT Broker -> HASS 自動化 -> Sonoff 開關

## OpenMQTTGateway 接收 RF 訊號連動 sonoff 開關測試
- alias: OpenMqttGateway 433toMQTT 15724020
  trigger:
  - payload: '15724020'
    platform: mqtt
    topic: home/433toMQTT
  action:
  - data:
      entity_id: switch.espurna_04cd42
    service: switch.toggle
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-25 20:19 , Processed in 0.339142 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表