Der Pool-Controller (2/4)

Im vorangegangenen Artikel haben wir einen Überblick über das Projekt des smart gesteuerten Pools gegeben. In diesem zweiten Teil werden wir auf das Herzstück, den Controller, eingehen. Dieser basiert auf einem ESP32, könnte aber mit wenigen Modifikationen auch mit einem ESP8266 umgesetzt werden.

Aufgabe des Pool-Controllers

Der Controller wird die zentrale Steuerung übernehmen. Er misst zyklisch die Temperaturen des Poolwassers und des Wärmespeichers der Solaranlage. Zudem wird er die Pumpen (Filter und Heizung) schalten. Der ESP ist also sowohl Sensor als auch Aktor. Der Datenaustausch erfolgt über WLAN mittels MQTT.

Pool Controller

 

Temperaturen messen

Das Messen der Temperatur ist meist der Einstieg in die Programmierung von IoT-Sensoren. Es gibt diverse Projektbeispiele dazu. Dabei kommen oft die Temperatursensoren DHT11 oder der genauere DHT22 zum Einsatz. Da die Temperatursensoren im Projekt jedoch verteilt extern platziert werden müssen, verwenden wir den wasserdichten Sensor DS18B20. Einen der beiden Sensoren zur Messung der Temperatur des Poolwassers, der andere zur Messung der Temperatur im Pufferspeicher.

 

Temperaturmessung MQTT

Die gemessenen Temperaturen werden mittels Timer alle 60 Sekunden ausgelesen und per MQTT als Nachricht veröffentlicht. Der Intervall ist ein Kompromiss zwischen der Trägheit der Erwärmung des Wassers und dem Debugging des Programms. Vermutlich würden auch Werte alle 5 Minuten ausreichen, doch auch die Integration in OpenHAB macht der minütliche Takt später wesentlich einfacher. Dazu später mehr.

Funksteckdosen steuern

Da wir in dem Projekt nicht direkt mit 230 Volt Wechselspannung hantieren möchten, schalten wir die Pumpen über Funksteckdosen. Bei den Funksteckdosen gibt es einige, die man über ESPs mit einem 433 MHz Funksender steuern kann. Eine Liste der kompatiblen Funksteckdosen findet sich im Wiki der verwendeten Bibliothek.

Aufbau der Schaltung

Die Schaltung sieht auf dem Steckboard wie folgt aus:

Bei den Temperaturfühlern kommen noch Pull-Up Widerstände mit 4.7kΩ zwischen Datenleitung und der Spannungsversorgung +3V VCC.

Die Datenpins am ESP32 sind wie folgt belegt:

#define PIN_DS_SOLAR 16 // Temp-Sensor Solar
#define PIN_DS_POOL 17  // Temp-Sensor Pool
#define PIN_RSSWITCH 18 // für 433MHz Sender

Quellcode des Projektes

Für das Projekt verwenden wir die Entwicklungsumgebung Platform.io IDE. Damit legen wir ein Projekt für das Board ‘esp32dev’ an. Kürzlich wurde zu Platform.io auch ein super Artikel veröffentlicht.

Der komplette Quellcode des Projektes ist im GitHub-Repository des Autors zu finden: https://github.com/stritti/smart-swimming-pool.

Verwendete Bibliotheken

In diesem Projekt ist es uns wichtig auf bewährte Softwarekomponenten zurückzugreifen und möglichst viel über vorhandene Bibliotheken zu lösen. Aus diesem Grund kommen folgende Libs zum Einsatz:

  • rc-switch: Steuerung der Funksteckdosen
  • OneWire: Unterstützung für I2C-Sensoren
  • DallasTemperature: Auslesen der Temperatur der Sensoren
  • PubSubClient: MQTT-Nachrichten empfangen und versenden
  • RemoteDebug: Debugging über Telnet
  • ESPBASE: Template für IoT-Projekte

Diese Bibliotheken sind in der Konfiguration von Platform.io (platformio.ini)  hinterlegt und werden beim Kompilieren automatisch aus dem Internet geladen und eingebunden.

Das Programm für den Pool-Controller basiert auf ESPBASE, das wie im vorangegangenen Artikel geschrieben einige Setup-Funktionen bereitstellt. Am Anfang des Codes werden dazu einige Variablen angelegt und die Defines für die Pinbelegung definiert.

Neben den beiden Funktionen setup() und loop() sind einige weiteren Funktionen implementiert. Im Wesentlichen geht es hierbei um das Empfangen und Senden von MQTT-Nachrichten und das entsprechende umsetzen der Nachrichten. Zudem ist ein Timer implementiert, der zyklisch die Temperatursensoren ausliest und per MQTT-Nachrichten publiziert.

Die Details

  1. In der loop-Funktion wird die WLAN-Verbindung immer wieder geprüft und gegebenenfalls wieder hergestellt. Das war ein tückisches Problem: der ESP hat immer mal wieder die WLAN-Verbindung verloren und ohne den Reconnect konnte er keine Daten mehr versenden.
  2. Die Funktion publish dient zum Versenden der MQTT-Nachrichten. So werden die Daten von einem Neustart und von den Temperaturmessung als JSON-Nachrichten publiziert.
  3. Der Timer für das Versenden der Temperaturen ist aufgeteilt. Grund ist, dass die eigentlichen Timer-Methoden möglichst kurz sein müssen. In der Implementierung ruft der Timer die Funktion onTimer auf, welche nur den volatilen interruptCounter inkrementiert. In der loop-Funktion wird diese überprüft und die eigentliche onTemperature-Funktion ausgelöst. In dieser Methode wird auch die interne Temperatur des ESP ausgelesen und publiziert.
  4. Die Funktion onMQTTCallback wird aufgerufen, wenn eine Nachricht an ein Topic, das mit ‘/pool/switch/’ beginnt, gesendet wurde. Die Nachricht enthält die Information der Funksteckdose ob diese ein- bzw. ausgeschaltet werden soll. Das Topic wird dabei weiter unterteilt in die Gruppe und die Gerätekodierung. Das heißt die Kodierung der DIP-schalter der Steckdose transformiert in 0 und 1. Dadurch ist diese Lösung flexibel auch an anderer Stelle nutzbar.

Der Quellcode des Pool-Controller findet man direkt komplett in folgender Datei: https://github.com/stritti/smart-swimming-pool/blob/master/Pool-Controller/src/pool-control.ino

 

Testing

 

Testing

Ist die Schaltung aufgebaut und das Projekt auf den ESP geladen, können wir bereits testen. Der ESP wird ein WLAN als Access Point öffnen, da standardmäßig kein WLAN eingerichtet ist. Wenn man sich mit dem Pool-Controller mit dem Smartphone verbindet, kann man das richtige WLAN einrichten. Danach startet der Microcontroller automatisch neu und versucht sich mit dem angegebenen WLAN zu verbinden.

Ist alles richtig eingerichtet, so sollte bereits beim Start des ESP eine Statusnachricht via MQTT publiziert werden. Man kann dazu mit folgendem Kommando auf dem Raspberry alle Nachrichten tracken:

 mosquitto_sub -h localhost -v -t /#

Eventuell muss im Quellcode die IP-Adresse des MQTT-Servers angepasst werden.

Danach sollten im Minutenzyklus die Temperaturen auf dem Raspberry ausgegeben werden.

In die andere Richtung können wir die Funksteckdosen schalten, indem wir eine passende Nachricht versenden. Dabei setzt sich das Topic aus "/pool/switch/<group>/<device>” zusammen. Group und Device sind die Dip-Schalter der Steckdose als 0 und 1. Als Nachricht wird “ON” bzw. “OFF” gesendet.

Steckdosen

 

Wie geht es weiter?

Damit sind die Grundlagen geschaffen: wir können die Temperaturen auslesen und wir können Steckdosen schalten.

Im folgenden Artikel verbinden wir den Pool-Controller mit der Smart Home Lösung openHAB und machen den Pool durch Regeln richtig smart.

 

 Weiter zu: Swimmingpool und OpenHAB (3/4)

 

Esp-32Projekte für fortgeschritteneRaspberry piSensorenSmart home

8 Kommentare

Lars

Lars

Hallo Matthias,

als günstiges Poolthermometer würde ich persönlich, einfach einen NTC Widerstand in Schrumpffolie (mit Innenkleber) einschweißen. Diesen dann mit 3.3V oder 5V versorgen und diesen einfach mit einem ADC einlesen. Obere Schwelle ca. 3-5% unter dem max vom ADC Stufen setzen und dann die Kennlinie (Temperatur über Spannung oder Stufen) aufnehmen. Ist mit einem „Mini“ Controller sogar erweiterbar auf weitere Temp.Sensoren oder andere Sensoren.
Bei der Lösung ist auch der Umfang der Libs auf 1 oder 2 beschränkt und diese gehören sogar zum Standard. Sollten also keine Probleme machen.

Hoffe hilft ggf. weiter. Persönlich würde ich von fertigen Modulen bei so etwas abraten, weil zu teuer, S-Code unnötig aufgepustet wegen Funktionen in den Libs die du gar nicht nutzt und meist Probleme die Lib-Version mit dem Modul zu aktivieren.
Manchmal ist weniger mehr :-)

Lars

Lars

Hallo Leon,

Solche Fragen bekomme ich auch beruflich oft gestellt. Damit es logisch wird und Sinn ergibt muss ich jedoch ein wenig ausholen.
1. Was willst du messen? Ist der Zufluss zur Pumpe wesentlich anders als der Rückfluss zum Pool oder das Poolwasser?
Sollte der Unterschied größer als 2 Grad sein hast du irgendwo ein anderes Problem :-). Meist liegt der Unterschied, IM BETRIEB, zwischen 0,3 und 0,7 Grad. Das reicht meiner Meinung als Toleranz aus und könnte funktionieren. ABER ….
2) Der Offline Betrieb: – Läuft die Pumpe nicht, wird das Wasser in Zu- und Rücklauf nicht bewegt. Bei schwarzen Rohren in der Sonne sind diese nach 3 Stunden schon teilweise unangenehm warm. (28 – 35 Grad C ) Der Pool wird je nach Größe ungefähr 22-26Grad haben. Und genau das wird dein Problem werden wenn du den physikalischen Wandler zu weit von dem Ort wo er eigentlich messen sollte einsetzt.
Hier wäre eine einfache Wetterstation(zweckentfremdet) mit BT Übertragung eine Lösung. Den anderen Sensor an der Pumpe kann man ja als Referenzwert dennoch weiterhin nutzen.
Bei einem Wandler (ob NTC als Sensor, IR- Messung oder Wärmebild ist alles möglich) musst du auf langen Strecken den Spannungsfall (gerade bei Komponenten unter 12 V) sowie den Leitungsquerschnitt über die Länge berücksichtigen (wird sehr schlimm wenn viel Strom benötigt wird). Um Verluste zu verhindern und die Messungen genau zu halten solltest du immer so nah wie möglich am zu messenden Objekt sein.
Ich würde ein 2 teiliges Projekt vorschlagen. Sensor Station am Pool und Steuereinheit innerhalb 80-160m BT-Reichweite. Also wo du willst. Solang guter BT Empfang.
Dein „nicht sichtbar sein“ würde passen. Verlust und Spannungsfall und noch viele weitere Kleinigkeiten entfallen. Die Sensoreinheit ist je nach dem was du später machen willst aufrüstbar. Somit hast du Max Flexibilität und Energieeffizienz (mit Minisolarpanel ggf. gar kein Akku oder Batterietausch notwendig.

Die Fragen am Anfang sollte man sich immer stellen. Was messen? Welche Modi gibt es? Welche Unterschiede in den Modi? Welche replizierbaren Fehler ergeben sich daraus? Welcher Einfluss haben Modi und Fehler auf dein Ergebnis?

Die Fragen kann man auf alle Messungen anwenden. Ich hoffe damit kannst du die für dich beste Entscheidung treffen.
Als E-Ing. FR: Nachrichtentechnik, habe ich dir meine Meinung ja oben bereits geschrieben.

Viele Grüße
Lars

Matthias

Matthias

Hi,

ich wollte mir noch ein günstiges Thermometer für den Pool basteln, scheine hier aber ein wenig Probleme zu bekommen bei der Vorbereitung meines ESP8266 Boards. Bei PlatformIO bekomme ich recht viele Meldungen, dass die Bibliotheken outdated sind.

Was wäre denn die aktuelle Möglichkeit um das zu bewerkstelligen? Die gefundenen Anleitungen sind leider sehr rudimentär und hier komme ich nicht ganz weiter. Hat jemand einen Tipp mit ggf. Schritt für Schritt Tutorial?

Danke

Andreas Wolter

Andreas Wolter

auf den ersten Bildern ist eine Prototyping Platine zu sehen.
Das Breadboard auf den späteren Bildern ist das MB-102:
https://www.az-delivery.de/products/breadboard?ls=de
Eine kurze Info dazu gibt es im ersten Teil dieser Reihe.

Grüße,
Andreas Wolter

Tom

Tom

Tolle Idee.
Welches Breadboard wurde denn hier verwendet?
Danke für die Info vorab.

Andreas Wolter

Andreas Wolter

@Lothar: Zigbees sind natürlich auch eine weitere Lösung, solch ein Projekt umzusetzen. Wie in allen Beiträgen gilt aber auch hier, dass wir nicht die beste Lösung zeigen möchten. Denn jeder entscheidet für sich, was für ihn die beste Lösung ist. Diejenigen, die das gerne mit diesen Komponenten bauen möchten, für die könnte dieser Beitrag nützlich sein.
Frei nach dem Motto: Warum machen wir das so? Weil es geht.

Grüße,
Andreas Wolter

Lothar

Lothar

Wäre es nicht besser Zigbee Steckdosen (z.B. Lidl) als Aktuatoren der Pumpen zu verwenden????

Leon

Leon

Wo kann man den Sensor für die Wassertemperatur am besten unterbringen wenn das Pool haus weit vom Pool entfernt ist und der Sensor nicht sichtbar sein soll?

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert