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:
tm 2016-10-10 19:46:05
pm 100 1 6.1 72 181 5.9 6.2 200.0 200.0 0.0 0.0 61 200 63 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 41 140 140 140.0 140.0 0.0 0.0 140 140 140 14 100 100 100 100 100 100 75 57 14 0.3 0.3 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 1 0 0 0 0 4 43 60 0 0 0 1 6 200 305 9001 0 df1 0 ffff 4 0
tm 2016-10-10 19:46:06
pm 100 1 6.1 72 181 5.9 6.2 200.0 200.0 0.0 0.0 61 200 63 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 41 140 140 140.0 140.0 0.0 0.0 140 140 140 14 100 100 100 100 100 100 75 57 14 0.8 0.8 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 1 0 0 0 0 4 43 60 0 0 0 1 6 200 305 9001 0 df1 0 ffff 4 0
z 19:46:07 Boiler 2 Laden
tm 2016-10-10 19:46:07
pm 100 1 6.1 72 181 5.9 6.2 200.0 200.0 0.0 0.0 61 200 63 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 41 140 140 140.0 140.0 0.0 0.0 140 140 140 14 100 100 100 100 100 100 75 57 14 0.8 0.9 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 1 0 0 0 0 4 43 60 0 0 0 1 6 200 305 9001 0 df1 0 ffff 4 0
tm 2016-10-10 19:46:08
pm 100 1 5.1 72 181 5.9 6.2 200.0 200.0 0.0 0.0 61 200 0 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 41 140 140 140.0 140.0 0.0 0.0 140 140 140 14 100 100 100 100 100 100 75 57 14 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 1 0 0 0 0 4 43 60 0 0 0 1 6 200 300 9001 0 df1 0 ffff 4 0
tm 2016-10-10 19:46:10
pm 100 1 5.1 72 181 5.9 6.2 200.0 200.0 0.0 0.0 61 200 0 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 41 140 140 140.0 140.0 0.0 0.0 140 140 140 14 100 100 100 100 100 100 75 57 14 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 1 0 0 0 0 4 43 60 0 0 0 1 6 200 300 9001 0 df1 0 ffff 4 0
tm 2016-10-10 19:46:11
pm 100 1 5.1 72 181 5.9 6.2 200.0 200.0 0.0 0.0 61 200 0 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 41 140 140 140.0 140.0 0.0 0.0 140 140 140 14 100 100 100 100 100 100 75 57 14 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 1 0 0 0 0 4 43 60 0 0 0 1 6 200 300 9001 0 df1 0 ffff 4 0
tm 2016-10-10 19:46:12
pm 100 1 5.1 72 181 5.9 6.2 200.0 200.0 0.0 0.0 61 200 0 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 41 140 140 140.0 140.0 0.0 0.0 140 140 140 14 100 100 100 100 100 100 75 57 14 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 1 0 0 0 0 4 43 60 0 0 0 1 6 200 300 9001 0 df1 0 ffff 4 0
tm 2016-10-10 19:46:13
pm 100 1 5.1 72 181 5.9 6.2 200.0 200.0 0.0 0.0 61 200 0 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 41 140 140 140.0 140.0 0.0 0.0 140 140 140 14 100 100 100 100 100 100 75 57 14 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 1 0 0 0 0 4 43 60 0 0 0 1 6 200 300 9001 0 df1 0 ffff 4 0
tm 2016-10-10 19:46:15
pm 100 1 5.1 72 181 5.9 6.2 200.0 200.0 0.0 0.0 61 200 0 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 41 140 140 140.0 140.0 0.0 0.0 140 140 140 14 100 100 100 100 100 100 75 57 14 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 1 0 0 0 0 4 43 60 0 0 0 1 6 200 300 9001 0 df1 0 ffff 4 0
z 19:46:15 Lambda-Stop Ende
tm 2016-10-10 19:46:16
pm 100 1 5.1 72 181 5.9 6.2 200.0 200.0 0.0 0.0 61 200 0 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 41 140 140 140.0 140.0 0.0 0.0 140 140 140 14 100 100 100 100 100 100 75 57 14 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 1 0 0 0 0 4 43 60 0 0 0 1 6 200 305 9001 0 df1 0 ffff 4 0
tm 2016-10-10 19:46:17
pm 100 1 5.6 72 182 5.9 6.2 200.0 200.0 0.0 0.0 61 200 62 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 41 140 140 140.0 140.0 0.0 0.0 140 140 140 14 100 100 100 100 100 100 75 57 14 0.2 0.3 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 1 0 0 0 0 4 43 60 0 0 0 1 6 200 305 9001 0 df1 0 ffff 4 0
tm 2016-10-10 19:46:18
pm 100 1 5.6 72 182 5.9 6.2 200.0 200.0 0.0 0.0 61 200 62 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 41 140 140 140.0 140.0 0.0 0.0 140 140 140 14 100 100 100 100 100 100 75 57 14 0.8 0.8 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 1 0 0 0 0 4 43 60 0 0 0 1 6 200 305 9001 0 df1 0 ffff 4 0
tm 2016-10-10 19:46:19
pm 100 1 5.6 72 182 5.9 6.2 200.0 200.0 0.0 0.0 61 200 62 80 0.0 0.0 -10929140000.0 0 140.0 140.0 0.0 0.0 41 140 140 140.0 140.0 0.0 0.0 140 140 140 14 100 100 100 100 100 100 75 57 14 0.8 0.9 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 1 0 0 0 0 4 43 60 0 0 0 1 6 200 305 9001 0 df1 0 ffff 4 0
Display More
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):
#!/bin/bash
#
#
#Script wird alle 5 min mit crontab aufgerufen
#
Check1="xx" #Bedingung 1 fuer Schleife
Check2="xx" #Bedingung 2 fuer Schleife
count=0
while [ "$Check1" != "tm" ] || [ "$Check2" != "ffff" ]
do
count=$((count+1))
hdat="`head -n2 /dev/ttyUSB0`" #2 Zeilen auslesen
echo $hdat >> /home/pi/scripts/hdat.txt #Ausgabe zum Kontrollieren
Check1=`echo cat $hdat | awk '{ print $2 }'` #Lese erste Spalte für Bedingung 1
Check2=`echo cat $hdat | awk '{ print $91 }'` #Lese drittletzte Spalte für Bedingung 2
done
#Zwischenspeichern der gewünschten Datenblöcke:
Datum=`echo cat $hdat | awk '{ print $3 }'`
Zeit=`echo cat $hdat | awk '{ print $4 }'`
TempKessel=`echo cat $hdat | awk '{ print $9 }'`
TempAussen=`echo cat $hdat | awk '{ print $11 }'`
TempPufferOben=`echo cat $hdat | awk '{ print $46 }'`
TempPufferUnten=`echo cat $hdat | awk '{ print $47 }'`
TempBoilerStall=`echo cat $hdat | awk '{ print $29 }'`
TempRuecklauf=`echo cat $hdat | awk '{ print $17 }'`
TempRauch=`echo cat $hdat | awk '{ print $10 }'`
#echo "Datum: "$Datum
#echo "Zeit: "$Zeit
#echo "Kessel: "$TempKessel
#echo "Aussen: "$TempAussen
#echo "Puffer oben: "$TempPufferOben
#echo "Puffer unten: "$TempPufferUnten
#echo "Boiler: "$TempBoilerStall
#echo "Rücklauf: "$TempRuecklauf
#echo $count" mal Ausgelesen"
#############################
#Daten in Datenbank schreiben
Time=$(date +%s)
DBfile=/home/pi/sbfdata/SBFspot.db
sqlite3 $DBfile "CREATE TABLE IF NOT EXISTS Heizung (TimeStamp datetime PRIMARY KEY,TempKessel int,TempAussen float,TempPufferOben int,TempPufferUnten int,TempBoilerStall int,TempRuecklauf int,TempRauch int);"
sqlite3 $DBfile "INSERT INTO Heizung (TimeStamp,TempKessel,TempAussen,TempPufferOben,TempPufferUnten,TempBoilerStall,TempRuecklauf,TempRauch) VALUES (\"$Time\",\"$TempKessel\",\"$TempAussen\",\"$TempPufferOben\",\"$TempPufferUnten\",\"$TempBoilerStall\",\"$TempRuecklauf\",\"$TempRauch\");"
Display More
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:
#!/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