如何用手機控制空調 ——簡單實用的智能家居教程

【首發少數派:如何用手機控制空調 ——簡單實用的智能家居教程】

我家有三個單體空調,型號比較老,每次要在各自的控制面板上調節開關和溫度,也沒有定時控溫功能。如果想實現遠程操控(比如在手機上),最簡單的方案就是 Nest Thermostat。然而摳門如我一看每個售價$169,三個要五百多美元,便萌生自己改裝的念頭。

可行嗎?根據電路常識推測,空調各部分工作應該是由相應 IO(Input / Output)的高低電位觸發,那麼只要找到控制面板所連結的 IO,就可以取而代之。換個角度,即使空調結構是黑盒子,既然 Nest Thermostat 能用於大部分空調型號,這說明:1,空調的 API(操控界面)是高度統一的;2,只要能模擬 Nest 的行為,就可以實現從空調 API 到 Nest API 的轉換;3,網上一定有許多通用的 DIY 開源項目。

在這個課題上,我花了一半時間找合適的開源項目。你需要綜合評價:對方解決的問題是否和你一致,交互界面你是否喜歡,配件是否經濟實惠,軟硬體系統是否強健,是否有後續開放性,可否融合到更廣的智能家居平台等等。由於是第一次改裝家電,後兩個因素暫時不考慮。因為我手頭有多餘的樹莓派 Zero,在定製的 Linux 系統下可以輕鬆安裝 Web App,通過 ssh 編程也極為簡便,於是就以 thermostat + raspberry pi + web 為關鍵詞搜索,最終選中了這個方案:PyStat。

PyStat 的用戶界面是一個網頁:

用戶界面非常直觀:第一行顯示室溫和目標溫度。第二行的三個圓圈表明相應部件是否工作。比如,在制熱時,制熱和風扇同時工作,所以第1、3個圓圈是亮的,中間代表製冷的不亮。第三行的三個方塊是用戶選擇的工作模塊,最多可選一個。注意無論選製冷還是制熱,風扇始終是工作的。第四行是溫度選擇。選好模式和溫度後點擊 Submit Changes 即可傳送指令。最下方是由 Weather API 提供的天氣預報。

因為是 Web App ,就可以在家裡任何瀏覽器上操作,比如手機和 Tablet 上:

(打折時淘的 Fire Tablet 重獲生機,可以嵌到牆裡)

因為是內網頁面,你只能在聯入家裡 Wifi 的設備上操控,即不能在回家路上事先打開空調——這是這個方案的缺點之一。我會在以後的系統智能家居方案中探索這個需求。

如果你喜歡這個界面,就可以下載代碼庫,擼起袖子幹了:

購買配件

樹莓派 Zero W $10 + shipping

Micro SD 卡(至少8G) $8

4 Channel Relay $7

DS18B20溫度探頭 $6

一個4.7k~10k歐姆的電阻

導線若干、Micro USB 充電線一根

總價:$31+。除了樹莓派以外的配件在 AliExpress 上買便宜得多,只是要等2-3周。

此外,你可能還需要用於測試的 LED 燈若干、麵包版、電焊工具、micro HDMI 線、micro USB hub、USB 滑鼠鍵盤等輔助配件,以上都不算在耗材里。

預備樹莓派

1,在樹莓派上安裝 Rasbian 系統,參考這裡。建議安裝這個帶圖形桌面的版本。

2,通過 Micro HDMI 連顯示器,在圖形界面里連上家裡的 Wifi。

3,如果選擇 ssh 聯入,記得在 raspi-config 設置里 enable ssh。

4,下載代碼:github.com/zhaozhichen/

設置溫度探頭

我先扯開一點,講一下空調是怎麼控制溫度的。

糾正一個許多人都有的錯誤印象:(以制熱為例)溫度調得越高,空調功率越大,室溫升溫越快。事實上,對大部分普通空調,制熱製冷功率是恆定的,和所調溫度無關。比如室溫是10度,制熱目標溫度設為20度,在制熱過程中室溫逐漸升高,當到達目標溫度加容錯值(比如2度),也就是22度時,空調停止工作。此後,室溫逐漸回落,當落到目標溫度減去容錯值,也就是18度時,制熱再次開啟,如此往複保證室溫在設定溫度周圍(18~22度)震蕩。所以,設定溫度高低只能決定最終穩定的室溫,而不能改變初始升溫的速度。

說這個原理,是因為我們要在程序里復現以上邏輯,也就是說除了控制制熱/製冷/風扇的輸出信號,我們還需要測量室溫的輸入信號。

溫度是模擬量。不同於 Arduino,樹莓派只支持數字輸入,於是需要 DS18B20 這樣的 1-Wire 設備將模擬信號轉換為脈衝數字信號,然後解碼為模擬量,保存在 /sys/bus/w1/devices 中。請參考這個 教程,並將你的溫度探頭序列號複製到這裡。注意:我們用4號介面。

安裝 Web App

我自己不會做網站,尤其不懂前端,對 LAMP 結構的 web server 敬而遠之。直到發現基於 python 的 flask,三行代碼寫 Hello World,真是找到了救命稻草,一見鍾情。Flask 的 web server 教程請參考這裡

這個系統的主代碼是 ThermostatMain.py,初次運行時開啟三個線程,分別是 :

  • ThermostatService
    • 從 current.set 讀取指令(模式:制熱/製冷/風扇,目標溫度);
    • 通過溫度探頭讀取室溫;
    • 通過 GPIO 輸出制熱/製冷/風扇的開關。
  • ThermostatWeb
    • web server,通過溫度探頭讀取室溫顯示在網頁上;
    • (可選)從指定的天氣信息服務商 API 讀取所在地氣候、天氣預報等信息。推薦 Weather 提供的 API;
    • 將用戶在網頁上做的指令保存於 current.set。
  • ThermostatScheduler
    • 定時開關,這個沒有用戶界面,我也沒有用上。

然後循環運行以下任務:

  • 記錄室溫、指令、天氣情況等信息,通過 sqlite3 保存到資料庫中;
  • 檢測各進程,及時報錯。

運行主程序:

$ Python3 ThermostatMain.py

然後在其他設備上訪問:192.168.X.X:5000(填寫樹莓派的 IP 地址),應該可以看到用戶界面。

這是 web app 的單元測試(unit test)。

樹莓派電路

如果你沒有在樹莓派上用過 python 的 GPIO 庫,可以參考這個教程。我們用的樹莓派的 GPIO 針腳排布在這裡,此外可以在這裡看到更詳細的參數。我們用到了4個介面,除了用於前文提到的用於溫度探頭的4號口,其他三個輸出口分別是:

  • 制熱開關:17
  • 製冷開關:27
  • 風扇開關:22

除此之外,還需要用到3.3伏電位和地線(ground)。所以,焊接後的電路如下(溫度探頭的焊接方式在前文提到的教程里):

(由於我用的是樹莓派 Zero,不帶 Wifi 功能,所以需要外接 USB Wifi 模塊。如果你買的是我推薦的樹莓派 Zero W,就可以忽略這個模塊。)

在接空調之前,建議用 LED 燈模擬空調,檢測制熱/製冷/風扇在網頁提供的指令下是否工作正常。比如,在17口和地線之間串聯進一個 LED 燈加一個大於1k的電阻(防止 LED 燈電流過載而燒毀),如果空調應該處於制熱模式,燈應該亮。

這是樹莓派的單元測試。

注意:由於我們用到的 Relay 的開關和樹莓派 GPIO 的輸出是相反的,所以你在用 LED 燈測試時需要在這裡將輸出指令掉轉過來。)

空調電路

盡量獲得空調的手冊(至少是比較接近的型號),了解遙控模式的使用方式。比如,這個是和我家空調型號比較接近的控制板布局(摘自手冊):

注意 C、E、F 區。E 區中的 Remote 必須調至 ON,這意味著你將通過 C 區針腳操控空調,同時也意味著你放棄了控制面板的操作權。C 區的針腳布局如下:

每個空調的布局不盡相同,但一般都至少含有 R、G、W、Y、C 五個介面。含義如下:

  • R:24伏高電位
  • C:地線 Ground
  • G:風扇
  • W:制熱
  • Y:製冷

當 W 和 R 相連,W 就獲得了高電位,制熱模式開啟。風扇和製冷同理。

這種通用介面稱為 Thermostats C Wire,可以參考這篇介紹

在連入空調前,建議你先測試遙控模式下針腳是否工作正常。拿一根導線,將 R 和 G 連上,應該可以觸發風扇工作。如果不行,將空調電源拔掉再接上試試。

這是空調遙控模塊的單元測試。

注意,我們在樹莓派上也連出五根線,分別對應以上五個介面。但是,樹莓派的電位是3.3伏,而空調面板使用24伏,不能直接對接,需要用轉換電壓的 Relay,電路示意圖如下(摘自這裡):

(空調地線不用接,因為它們最終連到同一個 Ground:地面——字面意思,非冷笑話。)

實物圖(我用的是8通道 Relay,其實只用了其中三個通道):

最後,連入空調電路:

最後運行主程序,進行端到端成品測試(End to end test)。

祝你成功!

後續

1,設置靜態IP:

sudo vi /etc/dhcpcd.conf

加上(第二行自選IP):

interface wlan0static ip_address=192.168.X.X/24static routers=192.168.0.1static domain_name_servers=192.168.0.1

2,開機啟動程序:

sudo crontab -e

加上:

@reboot sh /home/pi/PyStat/launch.sh >/home/pi/logs/cronlog 2>&1

3,我在做這個的過程中發現一個很棒的全棧方案,是下一個探索方向:

  • NodeMcu:客戶端硬體;
  • MQTT:通訊協議;
  • Home Assistant:服務端控制平台。

推薦閱讀:

燈燈,你聽我說(大結局)
除了知道誰是這個世界上最漂亮的人外,這個魔鏡還能控制你家裡的電器

TAG:树莓派RaspberryPi | 智能家居 |