Web-Anzeige von Solardaten

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Mit dem RasPi wurde folgendes realisiert:
    Graphische Web-Anzeige von Temperaturen und Zuständen von Pumpen und Ventilen einer Solaranlage mit Heizungsunterstützung.
    Ich habe lange im Internet alle Infos zusammen gesucht und möchte nun damit etwas zurück geben.
    Hier mal eine Beispielansicht:

    Das ist übrigens der 1. Entwurf, der funktioniert, also habe ich noch einiges zu verbessern.

    Kurze Zusammenfassung:
    Die Solarsteuerung auf Basis einer C-Control von Conrad (ca. 17 Jahre alt) gibt über die serielle Schnittstelle alle 2 Sekunden 8 Temperaturen, den Zustand von 2 Pumpen, 2 3-Wege-Ventilen und die Uhrzeit sowie einen Parameter, Wartezeit genannt, aus.
    Der Raspi verfügt über einen RS232-USB-Adapter zum Anschluss an die serielle Schnittstelle der C-Control. Ein Python-Programm liest die RS232 aus, formatiert die Daten und gibt diese in Form einer txt-Datei aus.
    Die Webpage zeigt ein thermisches Schaltbild der Heizungs- und Solaranlage mit den wichtigsten Elementen. Ein PHP-Programm liest die txt-Datei der Solaranlage aus, formatiert die Daten und blendet die Daten in das Schaltbild an den entsprechenden Stellen ein. Das Bild wird alle 4 Sekunden aktualisiert.

    Nun alles etwas detailierter:

    Vorbereitung des RasPi:
    Ich habe es mir etwas einfach gemacht und einfach XBMC installiert. Dazu muss man nur eine Datei aus dem Internet auf die SD-Karte laden und der Rest läuft vollautomatisch ab.
    Das erschien mir als Neuling in Sachen Raspi am Einfachsten.
    Zusätzlich hat dies noch einige Vorteile: Mit XBMC werden ein Samba-Server, ein SSH-Zugriff und die Programmsprache Python installiert (dazu später mehr). Zudem ist über die Oberfläche eine WLAN-Verbindung sehr einfach einzurichten. Ist alles leicht im Internet zu finden, deshalb spare ich mir hier die Beschreibungen.
    Nur zur Abrundung: Ich benutze WinSCP und Putty als Zugriff vom PC zum RasPi.
    Zusätzlich wird die Bibliothek pyserial-2.7 für die RS232 benötigt:
    Datei pyserial-2.7.tar.gz von https://pypi.python.org/pypi/pyserial herunter laden
    mit WinSCP in das Verzeichnis /home/pi auf dem RPi kopieren
    mit dem Befehl tar xfz pyserial-2.7.tar.gz entpacken
    mit dem Befehl cd pyserial-2.7 in das neue Verzeichnis wechseln
    installieren mit dem Befehl: sudo python setup.py install

    Für die Webpage benötigen wir noch einen Webserver. Ich habe mich für Lighttpd entschieden. Hier bekommt ihr es, inkl. einer Anleitung:
    http://developer-blog.net/hardware/raspb…ttpd-webserver/
    Dort findet ihr auch die Anleitung zur Installation von PHP (ist mir wenigen Zeilen Programmcode erledigt).

    Adapter Seriell-RS232 auf USB:
    Ich benutze eine billigen China-Adapter aus meiner Bastellkiste. Glücklicher Weise verfügt er über einen FTDI-Chip, der vom RasPi automatisch erkannt wird.
    Dies kann mit dem Befehl lsusb überprüft werden.

    Das Python-Programm zum Auslesen der RS232 und der Daten-Ausgabe in die solardaten.txt-Datei solardaten.txt:
    Bitte zuerst die Datei solardaten.txt mit WinSCP als Benutzer pi auf den RasPi in das Verzeichnis /var/www/ laden. Dann Rechtsklick darauf – Eigenschaften – Rechte auf 0777 setzen, oder über den Befehl Chmod unter Linux.
    Datei solaranzeige3.py solaranzeige3.py
    Diese Datei habe ich mit WinSCP ins Verzeichnis /home/pi geladen. Das Programm kann mit "python solaranzeige3.py" von der Konsole aus gestartet werden (Konsole wird mit Putty geöffnet).
    Das hat allerdings den Nachteil, dass das Programm beendet wird, wenn man die Konsole schließt und z.B. auch nicht nach einem Netzausfall neu startet.
    Den Autostart kann man wie hier beschrieben sehr einfach implementieren:
    https://www.forum-raspberrypi.de/Thread-tutoria…s-python-script
    Nicht vergessen, den Start des Programms mit ps -ef | grep python zu überprüfen[font="Tahoma"].[/font]
    [font="Tahoma"] [/font]
    [font="Tahoma"]Nun zum Teil mit der Webanzeige:[/font]
    Die Hauptdatei heißt index.php index.php. Sie liest die Daten aus der Datei [solardaten.txtattachment=2683] zeilenweise aus und formatiert sie für die spätere Anzeige.
    Zunächst wird das thermische Schaltbild angezeigt. Bitte beachten, dass es auf 800 x 552 px formatiert wurde.
    Die Datei formate.css formate.css definiert das Aussehen der Datenfelder.
    Danach werden die einzelnen Datenfelder eingeblendet.
    Diese Dateien habe ich mit WinSCP als Benutzer root in das Verzeichnis /var/www geladen.

    Wenn im Browser die IP des RasPi in die Adresszeile eingegeben wird, startet automatisch die Datei index.php.

    Da ich mir das Programmieren selbst beigebracht habe, werden Profis über meinen "Holzhacker-Stil" nur müde lächeln. Aber es funktioniert. Trotzdem bin ich für Vorschläge, wie es eleganter geht, immer dankbar.

    Einmal editiert, zuletzt von Tombir (16. März 2014 um 11:05)

  • Hallo, ich finde das Projekt sehr interessant. Z.Zt. habe ich 4 CControl die ich über ein VB6 Programm auslese. Das ganze möchte ich auf Raspberry umstellen und in Python programmieren. Ich sende einen Buchstabe an die CControl und die entsprechende antwortet mit einem Wert, den ich in ein entsprechendes Feld schreibe. Die Maske habe ich in Python3 fertig nur mit der seriellen Schnittstelle habe ich ein Problem. Wenn ich dein Programm " solaranzeige3py " starte bekomme ich eine Fehlermeldung. "invalid syntax" bei ser.name. Wo liegt mein Fehler?
    Gruß
    Alfred


  • Hallo, ich finde das Projekt sehr interessant. Z.Zt. habe ich 4 CControl die ich über ein VB6 Programm auslese. Das ganze möchte ich auf Raspberry umstellen und in Python programmieren. Ich sende einen Buchstabe an die CControl und die entsprechende antwortet mit einem Wert, den ich in ein entsprechendes Feld schreibe. Die Maske habe ich in Python3 fertig nur mit der seriellen Schnittstelle habe ich ein Problem. Wenn ich dein Programm " solaranzeige3py " starte bekomme ich eine Fehlermeldung. "invalid syntax" bei ser.name. Wo liegt mein Fehler?
    Gruß
    Alfred

    Ich vermute, dass du pyserial nicht richtig installiert hast.
    Evtl. passen die Versionen von Python und von pyserial nicht zusammen.
    Ich verwende die Version 2.7 von Python und habe die dazu passende pyserial installiert.
    Evtl verwendest du eine neuere Version von Python oder pyserial.
    Gruß Tom

  • Hallo Tom,
    ich habe mein Programm zur Anzeige der CControl inzwischen am laufen. Allerdings habe ich noch ein kleines Problem. ich bekomme die Daten so nach 5 Min. angezeigt, wenn alle Daten gesammelt sind. Wenn ich allerdings Veränderungen angezeigt haben will muß ich das Programm neu starten. Die Daten sollen aber alle 5 min neu ausgelesen und angezeigt werden. Wo ist mein Fehler? Kann ich dir das Listing evtl. mal zusenden?
    Gruß
    Alfred

  • Ohne dein aktuellen Code zu kennen kann man da denk ich nicht viel zu sagen. Evtl. musst du deine *.txt automatisiert via zB crontab auslesen lassen?
    Ich halte es aber für suboptimal einen Umweg über eine *.txt zu gehen

    Es wäre denk ich einfacher das auslesen der Seriellen Schnittstelle direkt in PHP umzusetzen da gibt es auch eine Class für.. Allerdings geht das dann auch nur aktuell beim Ausführen der index.php nicht permanent im Hintergrund. Oder du speicherst die Zeilen in eine mini-Datenbank wie SQLite, denn wenn die Textdatei geöffnet ist ist sie quasi Locked.

    Oder aber das gesamte Konstrukt auf Python umzustellen also ohne apache2: FAQ => Nützliche Links / Linksammlung => [Python] Webserver, Websocket und ein bisschen AJAX
    Damit kannst du dann sowohl die Serielle Schnittstelle parallel auslesen und die Daten quasi in Echtzeit an die Webseite übermitteln. Mit meinem RoPi Projekt nutze ich zB auch eine permanente Abfrage der Seriellen Schnittstelle und es wird sofort verarbeitet bzw im Web-Interface angezeigt

  • Leider sind die Einrückungen in deiner eingefügten Datei defekt - so lässt sich das nicht wirklich entziffern was wozu gehört. Spontan sehe ich da aber jede Menge Optimierungsmöglichkeiten da du sehr viel Code ständig wiederholst der sich aber nur minimal voneinander unterscheidet....
    Und wo kommt da die solardata.txt aus Beitrag#1 zum Einsatz? :s

    Pack die Datei einfach als Zip oder nutze codepad.org

  • Hm ne da passen die Einrückungen entweder immer noch nicht, oder du hast das generell falsch, oder du hast absolutes Chaos weil die Zeilen unter der choose_* Funktionen nicht Zu der Funktion gehört. :s

    Beispiel:
    [code=php]
    def choose_0_0(): label_0_0.config() # Uhrzeit
    label_0_0 = Label(master=window,font=("Arial",12),text="Zeit",bg="white") # asctime(), bg="white")
    label_0_0.place(x=100, y = 10, width=800, height=25)
    [/php]

    Genau so sehe ich das in deinem Script. Aber das einzige was INNERHALB der Funktion steht wäre label_0_0.config()
    Bei den anderen beiden Zeilen fehlt die Einrückung -> Abstand von links. Python kann also nicht wissen welche Zeilen noch zur Funktion gehört bzw was zusammengehört.

    Auch die Auskommentierung in der 2.Zeile zerstört diese:
    [code=php]
    label_0_0 = Label(master=window,font=("Arial",12),text="Zeit",bg="white") # asctime(), bg="white")
    [/php]

    Dadurch wird die Syntax zerstört und die gesamte Zeile ungültig: #
    Warum? Weil zum einen eine ) fehlt sofern das nach # wirklich nur ein Kommentar sein soll, zum anderen kann da aber nicht einfach so eine # stehen das macht kein Sinn, und ist auch kein gültiges Parameter für den Label() Funktionsaufruf.


    Und wie gesagt sehe ich nirgends die Verarbeitung der aus Beitrag#1 genannten solardaten.txt

  • Die solardaten.txt waren für mich nur ein Bespiel wie es später aussehen soll. Ich habe das Programm unter VB6 programmiert und hatte da keine Probleme mit einrücken. Leider habe ich mit Python noch wenig Erfahrung und werde das Projekt vielleicht noch mal von vorne aufbauen. In den angehängten Bildern ist in Bild_1 die Ausgabe zu sehen wie sie mit der Version Haussteuerung_test ist und bei Bild_2 mit der Version Haussteuerung_test_1. Da dort die Daten komplett fehlen habe ich anscheinend was falsch verstanden. Ich möchte dir aber erst mal für die Hilfe danken und werde warscheinlich noch mal von vorne anfangen. Zuerst sollte die Maske stehen und danach sollten alle 5 Minuten die Daten neu angezeigt werden.
    Python_Haus.zip

  • Da sehen die Einrückungen teilweise besser aus - dennoch finde ich das etwas unübersichtlich wegen der tonnenweise Funktionen die sich wie gesagt kaum voneinander unterscheiden...

    Diese choose_0_0 bis choose_16_3 könnte man in einer Funktion vereinen - allerdings erkenne ich da noch keinerlei Aktionen außer den Text zu verändern :s Ein label jedes mal komplett neu initialisieren und konfigurieren tut man eigentlich auch nicht. Diese Durchnummerierung 0_0 bis 16_3 ist auch extrem unübersichtlich. Das ganze setzen der "Überschrift Labels" ist aber denk ich auch eher überflüssig, du willst ja nur die Werte ändern nicht die Beschriftung, oder?


    Benutz mal folgendes als Basis deines Vorhabens => http://codepad.org/sK6ARGcz

    Damit wird schon mal die erste Spalte komplett gebildet und sofern die Serielle Verbindung soweit korrekt ist (sofern ich das richtig interpretiert habe) werden die Werte auch automatisch alle 5 Sekunden aktualisiert.
    Du kannst das auch testen indem du den Code in die interaktive python3 Konsole copy&pastest , aber nur bis Zeile 119 und dann einfach zum testen folgendes eingibst:

    Code
    Speicher1Temp.set("26.32")
    Speicher1Temp.set("22.942")

    ...und du siehst, wie sich plötzlich wie von Geisterhand die Anzeige ändert :cool:

    Die Ein/Aus Buttons bewirken noch nichts das musst du noch nachrüsten - aber der Text ändert sich sobald man drauf drückt ;)

  • Vielen Dank, das sieht ganz gut aus und ich bekomme auch Werte angezeigt. Ich habe zwar noch eine kleine Fehlermeldung, aber darauf kann ich aufbauen und komme weiter. Ich melde mich noch mal wenn ich es geschafft habe, aber dass kann ein wenig dauern.
    Gruß
    Alfred

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!