Hallo Zusammen,
bei mir läuft ein Arduino Nano, der einige Sachen zur
Hausautomatisierung macht. Unter anderem erfasst er auch die
Temperaturen von ca. 20 Stellen und schreibt sie mit folgendem Code
(Ausschnitt) jede Minute an die serielle Schnittstelle:
1 | for (int i=0; i<PT1000_ANZAHL; i++) {
|
2 | Serial.print(istTemperatur[i]);
|
3 | // Serial.print(i);
|
4 | Serial.print(RS232_TRENNZ); // Trennzeichen
|
5 | }
|
Der Arduino Nano ist über den USB-Anschluss mit einem Raspberry Pi
verbunden. Mit dem möchte ich die Temperaturdaten abholen und dann in
eine Datei sowie eine InfluxDB schreiben.
Derzeit macht das ein Python-Script, hier die Funktion:
1 | def readData():
|
2 | with serial.Serial(com_port, baud_rate, timeout=70) as s:
|
3 | serialmessage = s.readline()
|
4 | now = datetime.now()
|
5 | dtString = now.strftime("%Y-%m-%d-%H-%M-%S")
|
6 | kw = now.strftime("%W")
|
7 | year = now.strftime("%Y")
|
8 | dateiname = year + "-" + kw + "KW_Logfile.csv"
|
9 | datei = open(dateiname, "a")
|
10 | datei.write(dtString + "\t" + serialmessage)
|
11 | datei.close()
|
12 | writeInfluxDB(serialmessage)
|
Diese Funktion wird von der folgenden Main-Funktion aufgerufen. Falls
ein Fehler auftritt, wird der COM-Port gewechselt:
1 | while True:
|
2 | try:
|
3 | readData()
|
4 |
|
5 | except SerialException:
|
6 | time.sleep(3) # Waiting for 3 seconds
|
7 | print "Neuer Versuch, wechsle COM-Port"
|
8 | if com_port == '/dev/ttyUSB0':
|
9 | com_port = "/dev/ttyUSB1"
|
10 | else:
|
11 | com_port = "/dev/ttyUSB0"
|
Der Raspberry wird headless betrieben, ich greife also über die Konsole
mit Putty darauf zu.
Das funktioniert soweit auch alles. Damit das Python-Script auch nach
dem Beenden der Konsolensitzung weiterläuft, wird es mit nohup
aufgerufen.
Grundsätzlich läuft das alles so. Manchmal beendet sich aber leider das
Skript. Wenn ich das dann merke, starte ich es wieder neu.
Manch andere regelmäßig auszuführende Skripte habe ich in die crontab
geschrieben. Hier habe ich aber Angst, dass es sich mit dem Timeout
beisst.
Gibt es andere Möglichkeiten, zuverlässig die Daten vom Arduino zu
holen, auch nach einem Neustart des Raspberrys?