Start

© 2020 Detlef Schmegel
Template by Andreas Viklund

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")