このラズベリーパイサーモスタットチュートリアルであなたの気候を制御する

公開: 2022-03-11

多くの家庭のエアコンには、中央自動化、プログラム可能なサーモスタット、複数のセンサー、Wi-Fi制御などの最新の機能が欠けています。 しかし、古い空調技術はまだ信頼できるので、多くの場合、すぐにアップグレードされる可能性は低いです。

ただし、これには、エアコンをオンまたはオフにするために、ユーザーが頻繁に作業を中断したり、睡眠をとったりする必要があります。 これは、私のようなタイトなレイアウトの家に特に当てはまります。

中央右側の上部に空調ユニットがある間取り図。その出力は、左下の寝室を含むほとんどの部屋に到達するために2つの角を丸める必要があります。
私の非正統的な間取り図では、単一の窓内空調ユニットによる冷却が困難になっています。 寝室からのリモートコントロールのための直接の視線はなく、すべての部屋に到達するための冷気の直接の経路もありません。

米国の住宅は一般的にセントラルエアコンを備えていますが、これは世界的には当てはまりません。 セントラルACがないため、自動化オプションが制限され、家全体で同じ温度を達成することがより困難になります。 特に、対処するために手動の介入を必要とする可能性のある温度変動を回避することは困難です。

エンジニアおよびモノのインターネット(IoT)の愛好家として、私はいくつかの便利なことを一度に行う機会を見ました。

  • スタンドアロンのエアコンユニットの効率を改善して、エネルギーを節約するのに役立ちます
  • 自動化とGoogleHomeの統合により、自宅をより快適に
  • 市販のオプションに限定されるのではなく、ソリューションを希望どおりにカスタマイズします
  • 試行錯誤されたハードウェアを使用して、私の専門的なスキルのいくつかをブラッシュアップします

私のエアコンは、シンプルな赤外線リモコンを備えた基本的なデバイスです。 私は、SensiboやTadoなどのスマートホームシステムでエアコンユニットを使用できるようにするデバイスを知っていました。 代わりに、DIYアプローチを採用し、Raspberry Piサーモスタットを作成しました。これにより、さまざまな部屋からのセンサー入力に基づいて、より高度な制御が可能になります。

RaspberryPiサーモスタットハードウェア

私はすでにいくつかのRaspberryPiZero WをDHT22センサーモジュールと組み合わせて使用​​して、さまざまな部屋の温度と湿度を監視していました。 間取り図が細分化されているため、家のさまざまな場所の暖かさを監視するセンサーを設置しました。

また、WSL2を搭載したWindows10 PCに家庭用監視システム(このプロジェクトには必要ありません)があります。ビデオフィードのテキストオーバーレイとして、センサーの読み取り値を監視ビデオに統合したいと思いました。

センサーの配線

センサーは配線が簡単で、接続は3つだけでした。

最初の接続は「センサーからPIN1-3v3へのVCC」、2番目は「センサーからPIN7-GPIO4へのDATA」、3番目は「センサーからPIN9-GNDへのGND」です。
DHT22モジュールの配線図。RaspberryPiに接続するために使用されるピンを示しています。

Raspberry Pi OS Liteを使用し、Python3とPiPおよびPython用のAdafruit_DHTライブラリをインストールしてセンサーデータを読み取りました。 技術的には非推奨ですが、インストールと使用が簡単です。 さらに、ユースケースに必要なリソースが少なくて済みます。

また、すべての読み取り値のログが必要だったため、サードパーティのサーバーであるThingSpeakを使用してデータをホストし、API呼び出しを介してデータを提供しました。 比較的簡単で、リアルタイムの読み取りが必要なかったため、5分ごとにデータを送信することにしました。

 import requests import time import random import Adafruit_DHT KEY = 'api key' def pushData(temp:float, hum:float): '''Takes temp and humidity and pushes to ThingsSpeak''' url = 'https://api.thingspeak.com/update' params = {'api_key': KEY, 'field5': temp, 'field6': hum} res = requests.get(url, params=params) def getData(sensor:int, pin:int): ''' Input DHT sensor type and RPi GPIO pin to collect a sample of data Parameters: sensor: Either 11 or 22, depending on sensor used (DHT11 or DHT22) pin: GPIO pin used (eg 4) ''' try: humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) return humidity, temperature except: Exception("Error reading sensor data") return False if __name__ == "__main__": sensor = 22 # Change to 11 if using DHT11 pin = 4 # I used GPIO pin 4 while True: h, t = getData(sensor, pin) pushData(t, h) time.sleep(300)

WSL 2を実行している専用の監視PCで、ThingSpeakからデータをフェッチしてフォーマットし、単純な.txtファイルに書き込むPHPスクリプトを設定しました。 この.txtファイルは、監視ソフトウェアがビデオストリームの上にオーバーレイするために必要です。

私はすでに家の中でスマート電球やGoogleHomeのいくつかのルーチンを含むいくつかの自動化を行っていたので、センサーデータをGoogleHomeのスマートサーモスタットとして使用することになりました。 私の計画は、ユーザーの入力を必要とせずに、室温に基づいてエアコンを自動的にオンまたはオフにするGoogleHomeルーチンを作成することでした。

黒いパック型のデバイスの写真。
PNI SafeHomePT11IRWi-Fiスマートリモコンユニット。

SensiboやTadoのような高価なオールインワンソリューションは、技術的なセットアップが少なくて済みますが、わずかなコストで、PNI SafeHome PT11IRを使用して、電話を使用して範囲内の任意の数の赤外線デバイスを制御できました。 コントロールアプリのTuyaはGoogleHomeと統合されています。

Googleホーム統合の問題の克服

スマート対応のエアコンとセンサーデータを利用して、ラズベリーをGoogle Homeでサーモスタットとして認識させようとしましたが、役に立ちませんでした。 センサーデータをGoogleIoTCloudとそのPub/Subサービスに送信することはできましたが、そのデータに基づいてルーチンを作成するためにGoogleHomeに送信する方法はありませんでした。

これを数日間考えた後、私は新しいアプローチを考えました。 データをGoogleホームに送信する必要がなかった場合はどうなりますか? データをローカルで確認し、エアコンをオンまたはオフにするコマンドをGoogle Homeに送信できたらどうなりますか? 私は音声コマンドをテストして成功したので、このアプローチは有望であるように思われました。

クイック検索により、ユーザーがGoogleアシスタントにコマンドを送信できるようにするNode.jsを利用したシステムであるアシスタントリレーが見つかりました。ユーザーは、受け取った入力をどう処理するかを知っている限り、Googleアシスタントに何でも結び付けることができます。

さらに良いことに、アシスタントリレーを使用すると、Node.jsサーバーを実行しているデバイス(この場合はRaspberry Pi Zero W)にいくつかの必要なパラメーターを指定してPOSTリクエストを送信するだけで、Googleアシスタントへのコマンドを終了できます。 それでおしまい。 スクリプトは十分に文書化されているため、ここでは詳しく説明しません。

センサーデータはすでに監視PCで読み取られていたので、要求をPHPスクリプトに統合して、物事を1か所にまとめることができると思いました。

.txtファイルの要件がない可能性が高いため、センサーデータを直接読み取り、そのデータに基づいてアシスタントリレーを介してGoogleアシスタントサービスにコマンドを発行することで、プロセスを簡素化できます。 これらはすべて、追加のハードウェアを必要とせずに、単一のRaspberryPiデバイスから実行できます。 しかし、私はすでに半分の作業を完了しているので、私が持っていたものを使用することは理にかなっています。 この記事の両方のスクリプトは、単一のマシンで使用できます。 さらに、必要に応じて、PHPスクリプトをPythonで書き直すことができます。

条件の設定と操作の自動化

自動電源サイクルを夜間にのみ実行したかったので、操作を自動化する時間(午後10時から午前7時)を定義し、希望の温度を設定しました。 正しい温度間隔を特定すること—頻繁に電源を入れ直すことによって空調ユニットの寿命を縮めることなく快適な範囲を達成するために—それを正しくするために数回の試行が必要でした。

センサーデータオーバーレイを作成したPHPスクリプトは、cronジョブを介して5分ごとに実行されるように設定されていたため、追加したのは条件とPOSTリクエストだけでした。

ただし、これにより問題が発生しました。 条件が満たされている場合、エアコンがすでにオンになっている場合でも、スクリプトは5分ごとに「ターンオン」コマンドを送信します。 これにより、「電源を切る」コマンドを実行しても、ユニットは迷惑なビープ音を鳴らしていました。 これを修正するには、ユニットの現在のステータスを読み取る方法が必要でした。

エレガンスは優先事項ではなかったので、配列を含むJSONファイルを作成しました。 「ターンオン」または「ターンオフ」コマンドが正常に完了すると、スクリプトはこの配列に最後のステータスを追加します。 これにより冗長性が解決されました。 ただし、特に暑い日や冬の間の過度の暖房は、条件が再び満たされる原因となる可能性があります。 このような状況では、手動オーバーライドで十分であると判断しました。 読者のための演習として、この目的のためにスイッチスニペットの前にリターンを追加することは残しておきます。

 <?php switch(true) { case $temperature > 27: turnAc('on'); break; case $temperature < 24: turnAc('off'); break; } function turnAc($status) { $command = 'turn on hallway ac'; // hallway ac is the Google Home device name for my AC if ($status == 'off') { $command = 'turn off hallway ac'; } if ($status == 'on' && checkAc() == 'on') { return; } if ($status == 'off' && checkAc() == 'off') { return; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'local assistant server ip', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS =>'{ "command": '.$command.', "converse": false, "user": "designated user" }', CURLOPT_HTTPHEADER => array( 'Content-Type: application/json' ), )); $response = curl_exec($curl); curl_close($curl); $obj = null; try { $obj = json_decode($response); } catch (Exception $e) { } if (!$obj || $obj->success != true) { markAc($status == 'on' ? 'off' : 'on'); // if error, mark it as opposite status return; } markAc($status); } function markAc($status) { $file = __DIR__ . "/markAc.json"; $json = json_decode(file_get_contents($file), true); $json[] = array(date('F j, YH:i:s'), $status); $handler = fopen($file, "w") or die("Unable to open file!"); $txt = json_encode($json); fwrite($handler, $txt); fclose($handler); } function checkAc() { $file = __DIR__ . "/markAc.json"; $json = json_decode(file_get_contents($file), true); $end = array_pop($json); return $end[1]; }

これは機能しましたが、最初の試みでは機能しませんでした。 私は途中で物事を理解し、必要に応じてそれらを微調整する必要がありました。 うまくいけば、私の経験の恩恵を受けて、あなたはそれを最初に正しくするためにそれほど多くのことをする必要がないでしょう。

RaspberryPiサーモスタットコントローラーの価値

私の家の型破りなレイアウトは時々部屋ごとに大きく異なる温度をもたらしたので、私はエアコンを自動化することに動機付けられました。 しかし、冷暖房の自動化は、この特定の問題に直面していない人にとってもメリットがあります。

世界中の人々はさまざまな気候に住んでおり、エネルギーに対してさまざまな価格(および1日のさまざまな時間帯でさまざまな料金)を支払うため、エネルギー効率のわずかな改善でさえ、特定の地域で自動化を価値のあるものにすることができます。

さらに、ますます多くの家庭が自動化されるにつれて、エアコン、電気ヒーター、給湯器などの古い電力を大量に消費するデバイスやアプライアンスを自動化する可能性を探る理由があります。 これらのデバイスは通常、かさばり、インストールが難しく、アップグレードに費用がかかるため、多くの人が今後何年もデバイスを使い続けることになります。 これらの「ダム」デバイスを少しスマートにすることで、快適性とエネルギー効率を向上させるだけでなく、寿命を延ばすことができます。


Toptal Engineeringブログでさらに読む:

  • 開発用のRaspberryPiサーバーを構築する方法
  • 古いスマートフォンをリモコンとして再利用する方法