Raspberry - Anleitungen und Tips
RTL433 - Signale mit Python verarbeiten
Das Python- Skript
In diesem Abschnitt sollen mittels Python3 die ankommenden csv- Datensätze so
auseinandergepflückt werden, daß alle relevanten Daten, wie Datum, Uhrzeit, Temperatur,
Luftfeuchtigkeit usw. auswertbar abgespeichert werden.
Beim eigenen Sensor "Prologue-TH" erfolgt die Sendung der Daten ca. alle 30s.
Das ist bei der Messung der Lufttemperatur ziemlich übertrieben. Andererseits wollten die
Systementwickler bei schlechter Funkverbindung wohl sicherstellen, daß wenigstens einige
Werte übertragen werden, auch wenn das auf Kosten der Batterielebensdauer geht.
1200 Datensätze in zehn Stunden - bei gutem Empfang - müssen nicht sein.
Aus diesem Grund bekommt jeder empfangene Datensatz am Ende eine Nummer, die sich
immer um "eins" erhöht. Ist der festgelegte "Pickwert" erreicht, wird der Datensatz
in eine separate Datei geschrieben. In diesem Beispiel ist der "Pickwert" "40",
dh. nach 20 Minuten wird der herausgepickte Datensatz in die separaze Datei geschrieben
und der Zähler wieder auf "Null" gesetzt.
Wenn man das Prinzip verstanden hat, kann man alles nach Herzenslust ändern oder
Teile weglassen. Manches läßt sich aber sicher auch bei anderen Projekten verwenden.
Was Pfade und andere Eigenheiten angeht, muß man das Programm natürlich auf die
eigenen Gegebenheiten zuschneiden.
Jetzt geht es los. Zunächst wird in /home/pi/ eine neue leere Datei angelegt, die später unser 433-Skript wird.
sudo nano 433.py
Diese leere Datei wird nun mit den folgenden Einträgen gefüllt.
Dies geschieht bequemerweise über Putty vom Arbeitsrechner aus über
die Zwischenablage.
Die #Kommentare, die als eine Art Überschrift dienen, sollten ruhig
mit eingefügt werden.
#Import der benötigten Module
#!/usr/bin/python3
import time
import subprocess
import io
import shlex
# /media/nas2gast einhängen
cmd1 = "sudo mount -t nfs 192.168.2.3:/volume1/gast /media/nas2gast"
args1 = shlex.split(cmd1)
subprocess.call(args1)
print ("nas2gast ist eingehängt")
# Startwert Variablen
# Nach wieviel Datensätzen erfolgt eine separate Aufzeichnung
# Dient der Ausdünnung der halbminütlichen Wertspeicherung
Pickwert = 40 # Der Wert "20" entspricht ca. 10 min. - bei gutem Empfang!
Logdatei = "Log344.txt" #Alle Daten
Logdatei_p = "Log344p.txt" #Herausgepickte Daten
ID = "0"
Z = 0
print ("Pickwert: ",Pickwert)
time.sleep(1)
print ("Logdatei: ",Logdatei)
time.sleep(1)
print ("Logdatei_p: ",Logdatei_p)
time.sleep(1)
print ("START")
time.sleep(1)
# Befehl mit csv + Filter 3
# Eigener Sensor: Prologue-TH, Typ 3, ID = 186
# Shellbefehl via subprocess einbinden - Eine Zeile !!
proc = subprocess.Popen(['rtl_433','-F' 'csv','-R' '3'], stdout=subprocess.PIPE, universal_newlines=True)
try:
#Beginn der zyklische Bearbeitung - vier Zeichen einrücken !!!
while True:
#Datum und Zeit (zerpflückt)zur freien Verwendung - acht Zeichen einrücken !!!
DatZei = (time.strftime("%d.%m.-%H:%M"))
Dat = (time.strftime("%d.%m.%y"))
Datl = (time.strftime("%d.%m.%Y"))
Zei = (time.strftime("%H:%M:%S"))
Ze = (time.strftime("%H:%M"))
ZeiS = (time.strftime("%))
ZeiM = (time.strftime("%M"))
# Einbindung der empfangenen 433 MJz - Daten
line = proc.stdout.readline()
# Wichtige Daten aus Zeichenkette extrahieren - Eine Zeile !!
Messg1 = ("Fuehler 1 "+" ; "+line[0:10]+" ; "+line[11:19]+" ; "+line[36:39]+" ; "+line[45:49]+";"+"°C")
# id ist notwendig, da noch andere Typ 3- Sensoren in der Umgebung existieren
# Grad ist notwendig um Punkt durch Komma zu ersetzen
id = line[36:39]
Grad = line[45:49]
#Bei Temperatur - "Dezimalpunkt" durch Komma zu ersetzen.
#Werte mit Dezimalpunkt sind in Excel Texte.
Grad_k = Grad.replace(".",",")
if id == "186":
ID = "1"
Z = Z + 1
else:
ID = "0"
# Ausgabe der behandelten Zeichenkette in Datei auf nas2
if ID == "1": # Reduziert - ohne "id"
Messg2 = ("Fuehler 1 "+" ; "+line[0:10]+" ; "+line[11:19]+" ; "+Grad_k+";"+"°C "+str(Z))
print (Messg2) # nur Kontrolle
# Schreiben in Datei auf NAS:
with io.open('/media/nas2gast/'+Logdatei, 'a', encoding='utf8') as log_file1:
log_file1.write("\n"+Messg2)
# "Ausdünnen" der Werte wenn "Pickwert" erreicht
# Ausgabe der herausgepickten Werte in separater Datei auf nas2 - Eine Zeile !!
if Z == Pickwert:
Z = 0
with io.open('/media/nas2gast/'+Logdatei_p, 'a', encoding='utf8') as log_file2:
log_file2.write("\n"+Messg2)
except KeyboardInterrupt:
print ("KeyboardInterrupt")
# /media/nas2gast aushängen
cmd2 = "sudo umount -t nfs 192.168.2.3:/volume1/gast /media/nas2gast"
args2 = shlex.split(cmd2)
subprocess.call(args2)
print ("nas2gast getrennt")