智能家居是未來的一個朝陽方向,歡迎感興趣的小伙伴聯系我一起燥起來,兵不再多,貴在精。人數夠的話想弄一個小工作室。歡迎一些python大牛,懂嵌入式開發或者對對軟硬件都非常懂的小伙伴聯系我。
從軟件到硬件了解一個系統,再從硬件到軟件改良一個系統,為了方便了解HomeAssistant是如何添加一個服務模塊或者一個實體進入自己的控制系統,我們今天從ESPHome說起。
ESPHome 是一套工具,由 ESPHomelib 和 ESPHomeyaml 組成。前者安裝在 ESP8266 或 ESP32 上,后者為其編譯固件。ESPHomelib 主要通過MQTT 與 Home Assistant 通訊,可以說專為 Home Assistant 而設計。簡單易用且支持硬件多,可以通過簡單而強大的配置控制ESP8266/ESP32,還可以通過接入家庭自動化系統實現遠程被控。
ESP8266是一個開發版(屏蔽了我們對電路知識的了解)
下面通過一個簡單的流程讓大家了解一下ESPhome如何搭配mqtt和homeAssistant來使用(不涉及具體實現,具體實現可以從參考的文章里面去看,本文僅做一個介紹)
ESPhome項目頁面
前面的8266里面配置了一個mqtt的服務地址(可以使用docker自己起一個mqtt服務),訂閱node2這個設備可以看到網絡連接的情況,信號強度,和傳感器詳細信息。
在homeAssistant里面也配置好同一個mqtt服務器,它會自動發現設備,就可以把上面的信息可視化了。
通過上面的流程大家肯定發現了,homeAssistant在某些方面和prometheus有點類似,定時收集數據然后用圖表的形式展示出來(一段固定時間長度的數據折線圖等),並不會去做耦合,自身還是一個集成系統。那么如何接入一些其他的外部服務呢?比如SMTP(Simple Mail Transfer Protocol)
添加SMTP服務,實現homeAssistant可以向目標郵箱發送郵件提醒,只需要在homeAssistant的 configuration.yaml 中添加以下配置即可
具體是利用163郵箱提供的smtp服務作為中轉站將郵件轉發出去(這個服務需要自己在163郵箱開啟,免費),能夠直接添加進去的原因是smtp服務的模塊已經被添加到homeAssistant的支持服務中了。對於一些還沒有被支持,想自己接入的服務是怎么封裝給homeAssistant來調用的呢?
這里我們以一個外部模塊 和風天氣 來舉例子,具體操作過程可見 源碼
這里我再對源碼進行一些分析,方便大家了解整個調用的脈絡
如圖上面是和風天氣插件,接入到homeAssistant中重點只需要manifest.json和sensor.py這兩個文件,manifest.json是一個描述文件、一個清單列表,記錄了插件的名稱、域、文檔地址等,sensor.py文件是一個具體的實現,做的事情就是適配homeAssistant的集成系統,把自己收集的數據以homeAssistant的規范傳給它。
我們來看一下是如何適配的:
首先從參數開始,和風天氣插件(下稱插件)擴展了原來的基本參數,擴展的參數是如下幾個
可以看到對於options是有限制的,限定在了OPTIONS里面,這個是 和風天氣 能夠收集到的所有關於天氣的參數,OPTIONS里面的內容可以在插件源碼里面看到
對應配置里面的如下:
platform這個參數是原來基礎參數
然后我們來看重點的一個函數和兩個對象,分別是setup_platform,HeWeatherSensor(Entity),WeatherData(object),第一個函數是homeAssistant每當需要獲取天氣相關展示數據的時候就會調用一次,而setup_platform里面創建了第二個和第三個類的實例,第二個實例繼承了homeAssistant的原生Entity這個類,這個是homeassistant中的實體對象,包含了一個實體里面所有的參數,這個類主要是對Entity獲取參數的填充(擴展的參數里面的參數無法直接獲取,需要通過類似於key,value的形式傳過去,使用的字段是_type和_state),最后一個類是插件能夠獲取到的全量數據的一個實體類,里面包含了一個定時函數,每隔30分鍾自動更新全量數據,保證第二個類里面獲取到的數據的實時性。
如果我們自己需要把自己的插件接入到homeAssistant,可以按照和風天氣這樣的方式封裝成一個模塊接入到homeAssistant。
最后給一個簡單插件應用的畫面(公司5Gwifi無法接入設備)
參考:
1.https://zhuanlan.zhihu.com/p/122208151
2.https://esphome.io/index.html
和風天氣源碼:https://github.com/morestart/HeWeather
homeAssistant源碼:https://github.com/home-assistant/core