Heizungssteuerung über RS232 auslesen

  • Hallo zusammen,

    ich versuche mich gerade als Neuling mit dürftigen Programmierkenntnissen aus der Schulzeit an der Aufzeichnung der über eine RS232-Schnittstelle ausgegebenen Informationen unserer Heizungssteuerung (Hargassner Lambda-Tronic).

    Der Anfang ist bereits geschafft, der Raspberry ist mittels USB-Adapter mit der Steuerung verbunden.

    Es werden zyklisch folgende Daten gesendet:

    Alle 1 Sekunde wird ein Zeitstempel und ein Datensatz gesendet (jeweils beginnend mit tm bzw. pm).
    Dazwischen werden willkürlich Statusmeldungen gesendet (beginnend mit z).

    Ich möchte aus diesem Datenstrom nun zwei Dinge abspeichern:
    1) Alle 5 min bestimmte Werte aus dem periodischen Datensatz herausfiltern und in eine SQLite3 Datenbank speichern
    2) Alle willkürlich auftretenden Statusmeldungen mitloggen

    Zu 1) Alle 5 min bestimmte Werte aus dem periodischen Datensatz herausfiltern und in eine SQLite3 Datenbank speichern:

    Hier bin ich mit folgendem Script bereits so gut wie am Ziel (alle 5 min per cronjob aufgerufen):

    In der Kontrolldatei /home/pi/scripts/hdat.txt werden dabei folgende Einträge gespeichert (ohne CODE dargestellt, damit farblich markierbar):
    -----------------
    tm 2016-10-10 16:34:35 pm 0 0 2.1 58 63 8.5 7.6 200.0 200.0 0.0 0.0 59 200 0 0 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 52 140 140 140.0 140.0 0.0 0.0 140 140 140 15 100 100 100 100 100 100 68 46 0 0.0 0.0 0.0 8.0 0.00 0.00 0.0 0.00 33 49 65 81 31 47 63 79 0 0 0 0 0 0 0 0 0 0 0 0 2 41 0 0 0 0 1 6 200 0 0 0 8f1 0 ffff 2 0
    tm 2016-10-10 16:39:34 pm 0 0 2.1 58 63 8.5 7.6 200.0 200.0 0.0 0.0 58 200 0 0 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 52 140 140 140.0 140.0 0.0 0.0 140 140 140 15 100 100 100 100 100 100 68 45 0 0.0 0.0 0.0 8.0 0.00 0.00 0.0 0.00 33 49 65 81 31 47 63tm 2016-10-10 16:39:35
    tm 2016-10-10 16:39:36 pm 0 0 2.1 58 63 8.5 7.6 200.0 200.0 0.0 0.0 58 200 0 0 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 52 140 140 140.0 140.0 0.0 0.0 140 140 140 15 100 100 100 100 100 100 68 45 0 0.0 0.0 0.0 8.0 0.00 0.00 0.0 0.00 33 49 65 81 31 47 63 79 0 0 0 0 0 0 0 0 0 0 0 0 2 41 60 0 0 0 1 6 200 0 0 0 8f1 0 ffff 2 0
    R tm 2016-10-10 16:44:35
    tm 2016-10-10 16:44:36 pm 0 0 2.1 58 63 8.5 7.6 200.0 200.0 0.0 0.0 58 200 0 0 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 52 140 140 140.0 140.0 0.0 0.0 140 140 140 15 100 100 100 100 100 100 66 42 0 0.0 0.0 0.0 8.0 0.00 0.00 0.0 0.00 33 49 65 81 31 47 63 79 0 0 0 0 0 0 0 0 0 0 0 0 2 41 60 0 0 0 1 6 200 0 0 0 8f1 0 ffff 2 0
    tm 2016-10-10 16:49:35 pm 100 0 8.4 58 63 8.5 7.6 200.0 200.0 0.0 0.0 58 200 0 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 52 140 140 140.0 140.0 0.0 0.0 140 140 140 15 100 100 100 100 100 100 62 44 6 0.0 0.0 0.0 8.0 0.00 0.00 0.0 0.00 33 49 65 81 31 47 63 79 0 0 0 0 0 0 0 0 0 0 0 0 0 41 60 0 0 0 1 6 200 300 1 0 cf1 0 ffff 0 0
    tm 2016-10-10 16:54:33 pm 100 0 21.0 58 67 8.5 7.6 200.0 200.0 0.0 0.0 58 200 0 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 52 140 140 140.0 140.0 0.0 0.0 140 140 140 15 100 100 100 100 100 100 60 45 9 0.0 0.0 0.0 8.0 0.00 0.00 0.0 0.00 33 49 65 81 31 47 63 79 0 0 0 0 0 0 0 0 0 0 0 0 0 41 60 0 0 0 1 6 200 300 7 0 df1 0 ffff 0 0
    ---------------------

    Grün markiert alle "gültigen" Datensätze (erfüllen beide Bedingungen im Script).
    Dazwischen sind immer mal wieder unvollständige Datensätze enthalten. Aufgrund der Schleife wird dann das Auslesen aber wiederholt, sodass dann meist beim zweiten Durchlauf ein gültiger Datensatz ausgelesen wird.

    Das Ganze ist zwar nicht schön, funktioniert aber grundsätzlich.

    Meine Frage dazu:
    Könnte man das eleganter Lösen, bzw. wie?


    Zu 2) Alle willkürlich auftretenden Statusmeldungen mitloggen:

    Etwas mehr Sorgen bereitet mir, die unregelmäßig gesendeten Statusmeldungen herauszufiltern.
    Die einzige Lösung, die ich bis jetzt zumindest halbwegs zum Laufen gebracht habe, war ein Script mit folgender Dauerschleife per cronjob zu starten:

    Bash
    #!/bin/bash
    #
    while [ true ]
    do
    
    
    grep --line-buffered z /dev/ttyUSB0 >> /home/pi/scripts/Heizung_Status.txt
    
    
    done

    Dies funktioniert zwar grundsätzlich auch.
    Ich bin mir allerdings nicht sicher, ob tatsächlich alle Statusmeldungen in die Datei geschrieben werden.

    Zudem häufen sich die fehlerhaften Ausleseversuche im ersten Script erheblich. Vermutlich durch parallelen Zugriff von zwei Scripts auf die serielle Schnittstelle?!?

    Daher meine Hauptfrage:
    Welche Lösung würdet ihr vorschlagen, um die unregelmäßig gesendeten Statusmeldungen herauszufiltern?
    Möglicherweise gibt es ja eine elegante Möglichkeit, kombiniert sowohl diese Statusmeldungen als auch zusätzlich alle 5 min einen Datensatz in die Datenbank zu speichern?

    Falls zur Hilfestellung noch weitere Infos notwendig sind, bitte um Nachfrage...


    Vielen Dank im Voraus für Eure Hilfe!

    Mfg
    Stefan

  • Hallo Stefan,

    herzlich Willkommen in unserem Forum!


    Welche Lösung würdet ihr vorschlagen, um die unregelmäßig gesendeten Statusmeldungen herauszufiltern?
    Möglicherweise gibt es ja eine elegante Möglichkeit, kombiniert sowohl diese Statusmeldungen als auch zusätzlich alle 5 min einen Datensatz in die Datenbank zu speichern?

    Du vermutest es schon richtig: Es ist generell keine sonderlich gute Idee, zwei unabhängig voneinder lauffähige Programme zeitgliech oder parallel auf dem gleichen Datenbestand herumackern zu lassen.

    Ich würde das zunächst mal ohne Cron-Jobs erledigen. Meine Lösung würde so aussehen, dass die Anwendung die Meldungen der Heizung in Echtzeit ausliest und nach Deinen beiden Kriterien bewertet. Die Statusmeldungen werden gleich in die eine Datei geschrieben. Die anderen Daten würde ich in eine Datenstruktur eintragen und damit die Auswertungen tätigen, die Du alle 5 Minuten in der Datenbank abzulegen gedenkst.

    Wenn die 5 Minuten vergangen sind, erfolgen dann die Einträge in die Datenbank. Da die Daten in einer Datenstruktur eingetragen sind, ist es dann auch recht einfach die Dich interessierenden Felder durch alle Datensäzte durchlaufen zu lassen.

    Auf diese Weise ist Dein geschildertes Problem gelöst.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • [...] Meine Lösung würde so aussehen, dass die Anwendung die Meldungen der Heizung in Echtzeit ausliest und nach Deinen beiden Kriterien bewertet. [...]

    Welcher Befehl wäre zum Auslesen in Echtzeit am Besten geeignet?
    Mit head -n2 /dev/ttyUSB0 habe ich ja das Problem, dass manchmal der Zeilenanfang abgeschnitten ist. Da habe ich dann die Sorge, dass ich vereinzelte Statusmeldungen übersehen könnte.

    Sorry für die Anfängerfrage, aber meine Linux-Kenntnisse sind leider dürftig, und Google scheine ich hier mangels brauchbaren Suchergebnissen wohl mit den falschen Stichworten gefüttert zu haben :s

    Nochmals besten Dank und einen schönen Abend!

  • Hallo Stefan,

    Welcher Befehl wäre zum Auslesen in Echtzeit am Besten geeignet?
    Mit head -n2 /dev/ttyUSB0 habe ich ja das Problem, dass manchmal der Zeilenanfang abgeschnitten ist. Da habe ich dann die Sorge, dass ich vereinzelte Statusmeldungen übersehen könnte.

    Die Frage, die sich mir stellt, ist, ob BASH für Deine Aufgabe überhaupt den passenden Ansatz darstellt. In BASH sind einige Befehle integriert, aber viele werden dann extern aufgerufen. Echtzeit ist dann was anderes. Zum anderen hat die Schnittstelle nur einen recht begrenzten Puffer für eingehende Daten. Wenn weitere Daten geliefert werden, dann sind die alten Daten weg. Vielleicht ist das auch ein Problem für die verstümmelten Einträge.

    Ich würde die Anwendung in C / C++ oder Icon programmieren.

    Hast Du diese verstümmelten Datensätze eigentlich auch, wenn Du

    Code
    cat /dev/ttyUSB0


    für längere Zeit laufen lässt?

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo Andreas,

    nein, mit cat /dev/ttyUSB0 ist alles sauber, gerade eben aufgenommen, zufällig gerade was mit einer Statusmeldung dazwischen erwischt:


  • Hallo Stefan,


    Hallo Andreas,

    nein, mit cat /dev/ttyUSB0 ist alles sauber, gerade eben aufgenommen, zufällig gerade was mit einer Statusmeldung dazwischen erwischt:

    Na, dann spricht das eindeutig, dass BASH nicht die passende Programmierpsrache darstellt. Begründung habe ich in der vorigen Antwort bereits gebracht.

    Also hast Du jetzt die Wahl zwischen C / C++ / Icon, um Deine Aufgabe zu realisieren.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo Andreas,

    Danke, auch wenn ich das jetzt nicht hören wollte.

    Mit C/C++ hatte ich nun bestimmt 15 Jahre nichts zu tun, Icon überhaupt noch nie gehört (aber gerade deine Tutorials dazu gefunden!)

    Werde mich da mal reinlesen, und bei Fragen nochmal melden.

    Danke,
    Stefan

    Edited once, last by sLindi (October 11, 2016 at 10:25 PM).

  • Hallo Stefan,


    Hallo Andreas,

    Danke, auch wenn ich das jetzt nicht hören wollte.

    So ist das mit den Ehrlichen... Sie bringen unangenehme - aber wahre - Mitteilungen.


    Mit C/C++ hatte ich nun bestimmt 15 Jahre nichts zu tun, Icon überhaupt noch nie gehört (aber gerade deine Tutorials dazu gefunden!)


    Wie gesagt, eigentlich musst Du nur die Zeilen
    - einlesen,
    - feststellen ob Statusmeldung oder nicht
    - Statusmeldungen in eine eigene Datei schreiben
    - die anderen Meldungen analysieren und die einzelnen Einträge in eine Struktur (= Datensatz) überführen
    - die einzelnen Datensätze in eine (indizierte oder verkettete) Liste überführen
    - mit den Datensätzen Deine gewünschten - und bislang nicht näher spezifizierten - Auswertungen durchführen
    - und in die Datenbank schreiben


    Werde mich da mal reinlesen, und bei Fragen nochmal melden.


    Tu das...

    Soll das Programm noch eine graphische Benutzeroberfläche bekommen, irgendwelche Kurvenverläufe anzeigen, irgendwas Hochdramatisch-Erkennbares signalisieren oder irgendwas schalten?
    Ich frage deswegen,. weil ich gerade was Ähnliches entwickle. Über die serielle Schnittstelle kommen Daten herein, die analysiert und in (mehrere verschiedene) Datenstrukturen geschrieben werden. Einzelne Daten werden zu weiteren Auswertungen herangezogen. Alles wird in einer GUI dargestellt, und die graphische Anzeige der Daten kann vom Anwender noch beeinflusst werden.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited once, last by Andreas (October 11, 2016 at 10:40 PM).

  • Soll das Programm noch eine graphische Benutzeroberfläche bekommen, irgendwelche Kurvenverläufe anzeigen, irgendwas Hochdramatisch-Erkennbares signalisieren oder irgendwas schalten?
    Ich frage deswegen,. weil ich gerade was Ähnliches entwickle. Über die serielle Schnittstelle kommen Daten herein, die analysiert und in (mehrere verschiedene) Datenstrukturen geschrieben werden. Einzelne Daten werden zu weiteren Auswertungen herangezogen. Alles wird in einer GUI dargestellt, und die graphische Anzeige der Daten kann vom Anwender noch beeinflusst werden.

    Ich möchte einfach Kurvenverläufe verschiedener Parameter der Heizung darstellen, so ähnlich wie hier: (irgendein Beispielbild aus dem Netz)
    48h_uebersicht.png

    Werde das dann vermutlich mit RRD-Tool erstellen, aber wie genau ist noch offen.
    Speichere die Daten derzeit mal in einer sqlite3 Datenbank ab, da diese für eine bereits laufenden Auswertung einer Photovoltaikanlage verfügbar ist.

    Das mitloggen der Statusmeldungen wäre eine nette Draufgabe.
    Eventuell könnten durch Analyse dieser Daten Optimierungen der Hackgutheizung erkannt werden (Abstimmung Temperaturen von Puffer, Kessel, Boiler,...)


    Hintergrund des Ganzen ist aber in erster Linie doch mein Spieltrieb :D


    Deine Entwicklung hört sich aber ganz ähnlich und daher sehr interessant an....

  • Hallo Stefan,

    mal so ganz nebenbei: Wenn Du die Anwendung in C / C++ / / Icon programmierst, dann brauchst Du eigentlich weder eine Datenbank, um die Daten abzulegen, noch rrd, um die Sachen graphisch anzuzeigen. Das kannst Du mit wenigen Zeilen in der Anwendung programmieren.

    Dabei ist dann auch ein irrer Lerneffekt garantiert!


    Deine Entwicklung hört sich aber ganz ähnlich und daher sehr interessant an....

    Und eigentlich auch schon fertig. Ich feile gerade die GUI auf hübscher.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Wie waere es denn mit folgender Scriptsprace:


    In dem File meinedaten.dat wuerde dann bestimmte daten einfach mitgeschrieben. In statusmeldungen.log werden die Statusmeldungen mitgeloggt. Mit gnuplot kann man dann davon die angesprochenen Grafiken mit dem Varlauf machen. So wuerde ich das jedenfalls machen.

    Das gnuplotfile sähe einfach so aus: (plotme.gnu)

    Code
    plot "meinedaten.dat" u 3 w st
      pause -1

    und aufgerufen würde es mit

    Code
    > gnuplot plotme.gnu


    aus dem Terminal oder von einem Shell-Script. Man kann auch statt mit Gnuplot ein Fenster mit dem Plot zu öffnen, auch ein .png File davon machen lassen, um es dann (automatisch) in eine Web-Seite einzufügen oder sowas. Das wuerde sich ja anbieten, wenn der Raspi die Daten der Heizung sammelt. und dann per WEB-Server grafisch aufbereitet anbieten wuerde.

    Eine Datenbank braucht man gar nicht, (einfache Files wie meinedaten.dat oder so) tun es eigentlich auch. Das BASIC script oben macht schon fast alles.

    Waere diese Programmierung sympatischer? Für mich schon, da BASIC wie früher ist. Und das ganze ziemlich schnell und einfach zu programmieren waere und schneller als bash.

    Ist nur nen Vorschlag.
    Automatisch zusammengefügt:
    BTW. Dein Projekt bringt mich auf eine Idee, denn ich würde auch gerne die Parameter meiner Heizung auslesen und anzeigen lassen. Ich habe eine Brötje Heizung, und die kann man auch per RS232 anschliessen. Muss ich mal versuchen.....

    Edited once, last by wend (October 27, 2016 at 2:24 PM).

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!