Steuern Sie Ihr Klima mit diesem Raspberry Pi-Thermostat-Tutorial

Veröffentlicht: 2022-03-11

Der Klimaanlage in vielen Häusern fehlen moderne Feinheiten wie zentrale Automatisierung, programmierbare Thermostate, mehrere Sensoren oder Wi-Fi-Steuerung. Aber ältere Klimaanlagen sind immer noch zuverlässig, daher ist es in vielen Fällen unwahrscheinlich, dass sie bald aufgerüstet werden.

Dies erfordert jedoch, dass Benutzer häufig die Arbeit oder den Schlaf unterbrechen, um eine Klimaanlage ein- oder auszuschalten. Dies gilt insbesondere für Häuser mit engen Grundrissen wie meinem:

Ein Grundriss mit einer Klimaanlage oben rechts von der Mitte. Seine Ausgabe muss zwei Ecken abrunden, um die meisten Räume zu erreichen, einschließlich des Schlafzimmers unten links.
Mein unorthodoxer Grundriss macht das Kühlen mit einer einzelnen Klimaanlage im Fenster zu einer Herausforderung. Es gibt keine direkte Sichtverbindung für die Fernbedienung vom Schlafzimmer aus und keinen direkten Weg für kühle Luft, um alle Räume zu erreichen.

US-Häuser haben üblicherweise eine zentrale Klimaanlage, aber das ist weltweit nicht der Fall. Das Fehlen einer zentralen Klimaanlage schränkt die Automatisierungsmöglichkeiten ein, was es schwieriger macht, im ganzen Haus die gleiche Temperatur zu erreichen. Insbesondere ist es schwierig, Temperaturschwankungen zu vermeiden, die möglicherweise einen manuellen Eingriff erfordern.

Als Ingenieur und Enthusiast des Internet of Things (IoT) sah ich eine Gelegenheit, ein paar nützliche Dinge auf einmal zu tun:

  • Helfen Sie mit, Energie zu sparen, indem Sie die Effizienz meiner Stand-alone-Klimaanlage verbessern
  • Machen Sie mein Zuhause durch Automatisierung und Google Home-Integration komfortabler
  • Passen Sie meine Lösung genau so an, wie ich es wollte, anstatt auf im Handel erhältliche Optionen beschränkt zu sein
  • Frischen Sie einige meiner beruflichen Fähigkeiten auf, indem Sie erprobte Hardware verwenden

Meine Klimaanlage ist ein Basisgerät mit einer einfachen Infrarot-Fernbedienung. Mir waren Geräte bekannt, die es ermöglichen, Klimaanlagen mit Smart-Home-Systemen zu nutzen, wie Sensibo oder Tado. Stattdessen habe ich einen DIY-Ansatz gewählt und einen Raspberry Pi-Thermostat entwickelt, der eine ausgefeiltere Steuerung basierend auf Sensoreingaben aus verschiedenen Räumen ermöglicht.

Raspberry Pi Thermostat-Hardware

Ich habe bereits mehrere Raspberry Pi Zero Ws, gekoppelt mit DHT22-Sensormodulen, verwendet, um die Temperatur und Luftfeuchtigkeit in verschiedenen Räumen zu überwachen. Aufgrund des segmentierten Grundrisses installierte ich die Sensoren, um zu überwachen, wie warm es in verschiedenen Teilen meines Hauses war.

Ich habe auch ein Heimüberwachungssystem (für dieses Projekt nicht erforderlich) auf einem Windows 10-PC mit WSL 2. Ich wollte die Sensormesswerte in die Überwachungsvideos integrieren, als Textüberlagerung im Video-Feed.

Verdrahtung des Sensors

Die Sensoren waren einfach zu verdrahten und hatten nur drei Anschlüsse:

Die erste Verbindung ist „VCC vom Sensor zu PIN1 – 3v3“, die zweite ist „DATA vom Sensor zu PIN7 – GPIO4“ und die dritte ist „GND vom Sensor zu PIN9 – GND“.
Ein Schaltplan für das DHT22-Modul, das die Pins zeigt, die verwendet werden, um es mit dem Raspberry Pi zu verbinden.

Ich habe Raspberry Pi OS Lite verwendet und Python 3 mit PiP und die Adafruit_DHT-Bibliothek für Python installiert, um die Sensordaten zu lesen. Es ist technisch veraltet, aber einfacher zu installieren und zu verwenden. Außerdem erfordert es weniger Ressourcen für unseren Anwendungsfall.

Ich wollte auch ein Protokoll aller Messwerte haben, also habe ich einen Drittanbieter-Server, ThingSpeak, verwendet, um meine Daten zu hosten und sie über API-Aufrufe bereitzustellen. Es ist relativ einfach, und da ich keine Echtzeit-Messwerte benötigte, entschied ich mich dafür, alle fünf Minuten Daten zu senden.

 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)

Auf meinem dedizierten Überwachungs-PC, auf dem WSL 2 ausgeführt wird, richte ich ein PHP-Skript ein, das die Daten von ThingSpeak abruft, formatiert und in eine einfache .txt -Datei schreibt. Diese .txt -Datei wird für meine Überwachungssoftware benötigt, um sie über den Videostream zu legen.

Da ich bereits einige Automatisierungen im Haus hatte, darunter intelligente Glühbirnen und mehrere Routinen in Google Home, folgte daraus, dass ich die Sensordaten als intelligentes Thermostat in Google Home verwenden würde. Mein Plan war es, eine Google Home-Routine zu erstellen, die die Klimaanlage basierend auf der Raumtemperatur automatisch ein- oder ausschaltet, ohne dass eine Benutzereingabe erforderlich ist.

Ein Foto eines schwarzen puckförmigen Geräts.
Die intelligente Wi-Fi-Fernbedienung PNI SafeHome PT11IR.

Teurere All-in-One-Lösungen wie die von Sensibo und Tado erfordern weniger technische Einrichtung, aber für einen Bruchteil der Kosten ermöglichte mir das PNI SafeHome PT11IR, mein Telefon zu verwenden, um eine beliebige Anzahl von Infrarotgeräten in seiner Reichweite zu steuern. Die Steuerungs-App Tuya lässt sich in Google Home integrieren.

Überwindung von Problemen mit der Google Home-Integration

Mit einer intelligenten Klimaanlage und verfügbaren Sensordaten habe ich versucht, den Raspberry als Thermostat in Google Home zu erkennen, aber ohne Erfolg. Ich konnte die Sensordaten an Google IoT Cloud und seinen Pub/Sub-Dienst senden, aber es gab keine Möglichkeit, sie an Google Home zu senden, um auf der Grundlage dieser Daten eine Routine zu erstellen.

Nachdem ich einige Tage darüber nachgedacht hatte, dachte ich an einen neuen Ansatz. Was wäre, wenn ich die Daten nicht an Google Home senden müsste? Was wäre, wenn ich die Daten lokal überprüfen und einen Befehl an Google Home senden könnte, um die Klimaanlage ein- oder auszuschalten? Ich habe Sprachbefehle erfolgreich getestet, daher schien dieser Ansatz vielversprechend zu sein.

Eine schnelle Suche ergab Assistant Relay, ein Node.js-basiertes System, das es einem Benutzer ermöglicht, Befehle an Google Assistant zu senden, sodass der Benutzer alles mit Google Assistant verknüpfen kann, solange er weiß, was mit den empfangenen Eingaben zu tun ist.

Noch besser, mit Assistant Relay könnte ich Befehle an meinen Google Assistant beenden, indem ich einfach POST-Anforderungen mit einigen erforderlichen Parametern an das Gerät sende, auf dem der Node.js-Server ausgeführt wird (in diesem Fall mein Raspberry Pi Zero W). Das ist es. Das Skript ist gut dokumentiert, daher werde ich hier nicht zu sehr ins Detail gehen.

Da die Sensordaten bereits auf dem Überwachungs-PC ausgelesen wurden, dachte ich, ich könnte die Anfrage in das PHP-Skript integrieren, um die Dinge an einem Ort zu halten.

Da Sie wahrscheinlich nicht über die .txt -Dateianforderung verfügen, können Sie den Prozess vereinfachen, indem Sie die Sensordaten direkt lesen und Befehle basierend auf diesen Daten über Assistant Relay an den Google Assistant-Dienst senden. All dies kann von einem einzigen Raspberry Pi-Gerät aus erledigt werden, ohne dass zusätzliche Hardware erforderlich ist. Da ich jedoch bereits die Hälfte der Arbeit erledigt hatte, war es sinnvoll, das zu verwenden, was ich hatte. Beide Skripte in diesem Artikel können auf einem einzelnen Computer verwendet werden; Darüber hinaus kann das PHP-Skript bei Bedarf in Python umgeschrieben werden.

Bedingungen einstellen und Betrieb automatisieren

Ich wollte, dass das automatische Aus- und Einschalten nur nachts stattfindet, also habe ich die Stunden definiert, für die ich den Betrieb automatisieren wollte – 22:00 bis 7:00 Uhr – und die bevorzugte Temperatur eingestellt. Die Ermittlung der richtigen Temperaturintervalle – um einen angenehmen Bereich zu erreichen, ohne die Lebensdauer der Klimaanlage durch zu häufiges Ein- und Ausschalten zu verkürzen – erforderte einige Versuche, um es richtig hinzubekommen.

Das PHP-Skript, das das Sensordaten-Overlay erstellt hat, wurde so eingerichtet, dass es alle fünf Minuten über einen Cron-Job ausgeführt wird, also habe ich nur die Bedingungen und die POST-Anfrage hinzugefügt.

Dies führte jedoch zu einem Problem. Wenn die Bedingungen erfüllt waren, würde das Skript alle fünf Minuten einen „Anschalten“-Befehl senden, auch wenn die Klimaanlage bereits an war. Dies führte dazu, dass das Gerät nervtötend piepste, sogar beim „Ausschalten“-Befehl. Um dies zu beheben, brauchte ich eine Möglichkeit, den aktuellen Status der Einheit zu lesen.

Eleganz hatte keine Priorität, also habe ich eine JSON-Datei mit einem Array erstellt. Immer wenn die Befehle „Einschalten“ oder „Ausschalten“ erfolgreich abgeschlossen wurden, fügte das Skript den letzten Status an dieses Array an. Dies löste Redundanz; Besonders heiße Tage oder übermäßige Erwärmung im Winter könnten jedoch dazu führen, dass die Bedingungen wieder erfüllt werden. Ich entschied, dass eine manuelle Übersteuerung in diesen Situationen ausreichen würde. Ich überlasse es dem Leser, zu diesem Zweck vor dem Switch-Snippet einen Zeilenumbruch hinzuzufügen:

 <?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]; }

Das funktionierte aber nicht beim ersten Versuch. Ich musste Dinge auf dem Weg herausfinden und sie nach Bedarf optimieren. Hoffentlich müssen Sie dank meiner Erfahrung nicht so viel tun, um es beim ersten Mal richtig zu machen.

Der Wert eines Raspberry Pi Thermostat Controllers

Ich war motiviert, meine Klimaanlage zu automatisieren, weil der unkonventionelle Grundriss meines Hauses manchmal zu sehr unterschiedlichen Temperaturen in verschiedenen Räumen führte. Aber die Automatisierung von Heizen und Kühlen hat auch Vorteile für diejenigen, die mit diesem speziellen Problem nicht konfrontiert sind.

Menschen auf der ganzen Welt leben in unterschiedlichen Klimazonen und zahlen unterschiedliche Preise für Energie (und unterschiedliche Tarife zu unterschiedlichen Tageszeiten), sodass selbst geringfügige Verbesserungen der Energieeffizienz die Automatisierung in bestimmten Regionen lohnenswert machen können.

Da immer mehr Haushalte automatisiert werden, gibt es außerdem Grund, das Potenzial der Automatisierung älterer stromhungriger Geräte und Geräte wie Klimaanlagen, Elektroheizungen und Warmwasserbereiter zu untersuchen. Da diese Geräte in der Regel sperrig, schwierig zu installieren und teuer in der Aufrüstung sind, werden viele Menschen jahrelang an ihnen festhalten. Diese „dummen“ Geräte etwas intelligenter zu machen, kann nicht nur den Komfort und die Energieeffizienz verbessern, sondern auch ihre Lebensdauer verlängern.


Weiterführende Literatur im Toptal Engineering Blog:

  • So erstellen Sie einen Raspberry Pi-Server für die Entwicklung
  • So verwandeln Sie Ihr altes Smartphone in eine Fernbedienung