Pool Solarheizung Steuerung - komme nicht weiter

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Frank2020
User
Beiträge: 2
Registriert: Donnerstag 15. Mai 2025, 15:43

Erstmal ein Hallo an alle hier im Forum.

Ich habe mich als kompletter Einsteiger daran begeben eine Steuerung für die Poolheizung von unserem kleinen Pool zu entwerfen. Aber ich glaube ich habe mir etwas viel vorgenommen, ich komme leider nicht weiter vielleicht kann mir ja jemand helfen.

Es gibt eine Pumpe am Pool die das Wasser auf das Dach transportiert in die Solarmatten. Wenn die Sonne scheint erwärmt sich das Wasser und kommt in einer anderen Leitung zurück.

Diese beiden Leitungen möchte ich mit Sensoren messen.

Die Pumpe soll z.B zwischen 10 Uhr morgens und 18 Uhr alle 15 Minuten für 3 Minuten anlaufen und dann wird gemessen. Wenn das Wasser das vom Dach zurückkommt wärmer ist als das Wasser das reingeht in die Pumpe, dann soll die Pumpe weiterlaufen. Danach soll sie z.B alle 2 Minuten die beiden Werte vergleichen. Falls irgendwann das Wasser das in die Pumpe reingeht die gleiche oder niedrigere Temperatur hat wie das Wasser das zurückkommt, dann soll die Pumpe wieder abschalten. Und dann wieder alle 15 Minuten für 3 Minuten anlaufen und prüfen wie die Themperatur dann ist. Also wieder von vorne.

Ich habe auch vier Sensoren an meinen Raspberry Pi angeschlossen und nicht nur zwei, später kann das ganze also noch verfeinert werden durch einen Sensor auf dem Dach damit das womöglich weniger oft anläuft , aber jetzt soll es erstmal so gelöst sein.

Ich habe nach dieser Anleitung die Sensoren installiert und der Server scheint auch zu laufen und ich kann auch die Werte abrufen.
Ich habe ein ds9490r mit 4 DS18B20 Sensoren.
https://meintechblog.de/2018/07/27/ds94 ... ment-12871

Außerdem habe ich mir diese Relais Platine gekauft und installiert.
GeeekPi Raspberry Pi-Erweiterungskarte 4-Kanal-Relaismodul Leistungsrelaismodul für Raspberry
https://www.amazon.de/dp/B07Q2P9D7K?ref ... asin_title

Hier ist die Anleitung zu der Platine:
https://wiki.52pi.com/index.php?title=EP-0099

Hier in der Anleitung das enthaltene Python Script funktioniert. Also die Relais schalten durch bis ich es mit der Tastatur unterbreche:

Code: Alles auswählen



import time as t
import smbus
import sys

DEVICE_BUS = 1
DEVICE_ADDR = 0x10
bus = smbus.SMBus(DEVICE_BUS)

while True:
    try:
        for i in range(1,5):
            bus.write_byte_data(DEVICE_ADDR, i, 0xFF)
            t.sleep(1)
            bus.write_byte_data(DEVICE_ADDR, i, 0x00)
            t.sleep(1) 
    except KeyboardInterrupt as e:
        print("Quit the Loop")
        sys.exit()


Die eigentliche Schaltung des Stroms ist jetzt hier nicht so die Frage, ich bin Elektriker und werde das später über ein Schütz schalten. Um den Strom für die Pumpe von der Relaiskarte komplett zu trennen.
Es geht jetzt hier um die Steuerung an sich bei der ich gerade überhaupt nicht weiß wie ich das angehen soll.

Es hat schon eine ganze Zeit gedauert bis ich mir das alles angelesen hatte wie das geht, überhaupt den Raspberry Pi zu installieren. Aber soweit läuft die Hardware erstmal. Nur leider finde ich jetzt keinen Ansatz wie ich weitermachen könnte. Wäre klasse wenn ihr mir ein paar Tipps geben könntet. Vielen Dank.

Viele Grüße
Frank
Benutzeravatar
__blackjack__
User
Beiträge: 13969
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Frank2020: Ganz grundsätzlich ist das Vorgehen in der Regel das Gesamtproblem in Teilprobleme zu zerlegen, die Teilprobleme wieder in kleinere Teilprobleme, solange bis man Teilprobleme mit Funktionen mit wenigen Zeilen lösen kann. Dann testet man die Teillösungen, und setzt daraus grössere Teillösungen zusammen, die man auch testet. So gelangt man irgendwann zur Gesamtlösung.

Falls noch nicht geschehen würde ich empfehlen das Tutorial in der Python-Dokumentation mal durchzuarbeiten. Inklusive Objektorientierung, damit man für ein Relais beispielsweise nur einen zusammengefassten Wert hat, und nicht Bus, Geräteadresse, und Relaisnummer als drei Werte herum reichen muss, und dass man die konkreten Schritte hinter allgemeineren Aktionen verstecken kann, die unabhängig davon sind wie die Relais angesteuert werden. Gleiches gilt für die Sensoren.

Das `datetime`-Modul ist zum rechnen mit Zeiten. Nach der Beschreibung könnte man das Programm morgens per Crontab oder systemd Timer-Unit starten und es so schreiben, dass es sich abends dann selbst beendet.

Anmerkungen zu dem gezeigten Relais-Programm: Namen sollten keine kryptischen Abkürzungen enthalten, oder gar nur daraus bestehen. Quelltext wird öfter gelesen als geschrieben, also sollte man auf Lesbarkeit optimieren und nicht auf wenig tippen. Einbuchstabige Namen sind eigentlich immer zu kurz. Gängige Ausnahmen sind `i`, `j`, und `k` für ganze Zahlen die als Index oder Laufvariable verwendet werden, oder `x`, `y`, und `z` für Koordinaten. Also beispielsweise entweder `sleep` aus `time` explizit importieren, oder `time` nicht einfach mit `t` abkürzen. Das `e` für die Ausnahme wird nirgends verwendet, kann also einfach ganz weg fallen. Und `i` ist eine ganzzahlige Laufvariable, wäre also okay, aber `relay_number` würde dem Leser besser verraten was dieser Wert bedeutet.

Die Ausnahmebehandlung setzt an einer falschen Stelle an. Statt in der Schleife, wo man dann explizit die Schleife verlassen muss (das Programm sollte man an der Stelle nicht beenden), wäre das sinnvoller um den gesamten Inhalt der Hauptfunktion gelegt. Dann entsteht nicht bei jedem Schleifendurchlauf ein kleines Zeitfenster bei dem das dann doch nicht greift.

Man sollte externe Ressourcen sauber wieder freigeben, also hier auf dem `SMBus`-Objekt die `close()`-Methode aufrufen. Dazu bietet sich die ``with``-Anweisung und `contextlib.closing()` an.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from contextlib import closing
from time import sleep

from smbus import SMBus

DEVICE_BUS = 1
DEVICE_ADDR = 0x10


def main():
    try:
        with closing(SMBus(DEVICE_BUS)) as bus:
            while True:
                for relay_number in range(1, 5):
                    bus.write_byte_data(DEVICE_ADDR, relay_number, 0xFF)
                    sleep(1)
                    bus.write_byte_data(DEVICE_ADDR, relay_number, 0x00)
                    sleep(1)

    except KeyboardInterrupt:
        print("Quit the Loop")


if __name__ == "__main__":
    main()
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Sirius3
User
Beiträge: 18245
Registriert: Sonntag 21. Oktober 2012, 17:20

@Frank2020: schönes Hobby, wenn sowas ernsthaft als Steuerung eingesetzt werden soll, ist aber ein Microcontroller besser geeignet als ein Raspberry Pi, z.B. ein ESP32.
Wenn Du eh neu auf dem Gebiet bist, sind die Hürden vielleicht andere, aber nicht wirklich höher. Entsprechende Boards kann man dann mit Micropython programmieren.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1214
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Man könnte es auch mit einer LOGO 8.4 machen: https://www.siemens.com/de/de/produkte/ ... odule.html

Was auf jeden Fall nicht geht, ist das Auslesen der Temperatursensoren DS18B20.
Aber die Logo unterstützt Modbus und MQTT. Du könntest mit einem Mikrocontroller oder dem RPi die Daten der Sensoren auslesen und dann via Modbus an die Logo senden. Kalenderfunktionen und eine astronomische Uhr sind bei der Logo integriert.

So hättest du jedenfalls eine klare Trennung zwischen Schutzkleinspannung und Netzspannung. Die Logo bekommt man auch mit Relais-Ausgängen, die dann 3A induktiv und 10A ohmsche Last schalten können. Auch das Netzteil kann man sich sparen, wenn man eine Logo kauft, die mit 230V versorgt werden kann.

Wenn man einen ESP32 oder RP Pico W nutzt, hat man schon WLAN integriert. Das würde ich aber nicht nutzen und stattdessen ein W5500 Ethernet Netzwerk Modul nutzen. Das wird via SPI angebunden und kommt mit jedem Mikrocontroller zurecht. Oder halt weiterhin den Raspberry Pi nutzen, der ja einen LAN-Port hat.

Die Mikrocontroller kannst du mit Micropython programmieren: https://randomnerdtutorials.com/micropy ... 2-esp8266/
Das Beispiel ist für ein ESP8266, kann aber genauso gut mit einem ESP32 umgesetzt werden.

Für Micropython gibt es auch Module für Modbus z.B. das hier: https://github.com/brainelectronics/micropython-modbus
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Frank2020
User
Beiträge: 2
Registriert: Donnerstag 15. Mai 2025, 15:43

Hallo, danke für die Antworten.

Zu dem Raspberry Pi und den Alternativen die es gibt.... ich habe die Sachen ja jetzt hier und die Relais funktionieren und die Temperatursensoren funktionieren, ich brauche ja "nur" noch das Skript. Das jetzt alles wieder umzustellen ist doch etwas aufwendig glaube ich. Noch mal alles neu kaufen und das alte jetzt hier zurückschicken. Wenn das überhaupt geht. Auch wenn die anderen Möglichkeiten vielleicht etwas professioneller oder besser oder vielleicht noch mal stabiler wären, es ist ja keine sicherheitskritische Anwendung und wenn es nicht läuft, dann ist der Pool halt nicht warm. Und es kommt ja auch nur für zwei oder drei Monate im Jahr zum Einsatz im Sommer. Ich lasse es erstmal bei dem Raspberry Pi.

Ich habe mir auch jetzt den Anfang von dieser Python Dokumentation durchgelesen.

Ich habe jetzt auch noch eine Zeit lang darüber nachgedacht, nachdem ich mir das alles noch mal genau angeschaut habe, ich glaube es ist der falsche Weg zu versuchen diese Programmiersprache zu lernen für dieses eine Skript das ich brauche. Ich möchte damit ja später nichts mehr machen, ich meine damit ich möchte ja selber nicht programmieren lernen. Ich denke ich werde mich mal im Freundeskreis umschauen oder sonst irgendwo umschauen ob es jemanden gibt der mir das Schreiben kann. Es ist nicht so, dass ich zu faul bin mir etwas anzulesen oder zu googeln oder was auszuprobieren, aber jetzt wirklich das alles zu lernen für dieses eine Skript, ich glaube das geht etwas zu weit und am Ende weiß ich gar nicht, ob ich es tatsächlich hinbekomme. Ich hatte das etwas unterschätzt.

Deswegen werde ich versuchen irgendwie einen anderen Weg zu gehen. Ich werde aber hier berichten wie es weiter gegangen ist.

Aber danke für eure Nachrichten, hat auf jeden Fall weitergeholfen.



Viele Grüße
Frank
Benutzeravatar
__blackjack__
User
Beiträge: 13969
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Frank2020: Es fehlt ja eigentlich nur noch eine Programmiersprache zu lernen. Ist das tatsächlich eine so hohe Hürde? Warum ist das so überraschend? Ich meine irgendwie muss man dem Rechner ja sagen was er tun soll. Als Alternative könnte man es auch ”grafisch” versuchen, beispielsweise mit Node-Red. Die Einfachheit dort kann es am Ende auch schwieriger machen, weil es nicht so flexibel ist wenn man sich auf so einen Bausteinkasten ohne Programmiersprache einschränkt. Wobei die Einschränkung ”künstlich” wäre, denn bei Node-Red kann man letztendlich auch Knoten frei programmieren — dann müsste man JavaScript als Programmiersprache lernen. Es käme also darauf an ob es bei Node-Red schon ausreichend fertige Bausteine gibt um Dein Projekt leicht umzusetzen.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten