Hallo,
für die Auswertung von 5 Temperatursensoren habe ich ein kleines Script geschrieben.
Das Script funktioniert bei 19 von 20 Durchläufen fehlerfrei.
Das Script wird via Cronjob gestartet. Im Fehlerfall lasse ich mir den Fehler in eine Datei schreiben.
Der Fehler lautet:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/dist-packages/mysql/connector/network.py", line 550, in open_connection
socket.SOL_TCP)
File "/usr/lib/python3.7/socket.py", line 748, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -3] Temporary failure in name resolution
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/pi/sensor.py", line 47, in <module>
connection = mysql.connector.connect(host='xxxxxxxxxx',database='xxxxxxxx',user='xxxxxxx',password='xxxxxxxxxxxxxx')
File "/usr/local/lib/python3.7/dist-packages/mysql/connector/__init__.py", line 273, in connect
return MySQLConnection(*args, **kwargs)
File "/usr/local/lib/python3.7/dist-packages/mysql/connector/connection.py", line 114, in __init__
self.connect(**kwargs)
File "/usr/local/lib/python3.7/dist-packages/mysql/connector/abstracts.py", line 1009, in connect
self._open_connection()
File "/usr/local/lib/python3.7/dist-packages/mysql/connector/connection.py", line 418, in _open_connection
self._socket.open_connection()
File "/usr/local/lib/python3.7/dist-packages/mysql/connector/network.py", line 566, in open_connection
errno=2003, values=(self.get_address(), _strioerror(err)))
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '%-.100s:%u' (%s) (Warning: %u format: a number is required, not str)
Alles anzeigen
Zwei weitere baugleiche Raspberrys laufen im gleichen Netz fehlerfrei.
Das Script sieht wie folgt aus:
#! /usr/bin/python3
import csv
import time
import mysql
import mysql.connector
class sensor:
def __init__(self, id, name):
self.device = "/sys/devices/w1_bus_master1/" + id + "/w1_slave"
self.name = name
def read_temp(self):
temp = -125.00 # Error Wert
try:
with open(self.device, 'r') as f:
data = f.read()
if "YES" in data:
partitioned = data.partition(' t=')
temp = float(partitioned[2]) / 1000.0
except Exception:
pass
return temp
def print_temp(self):
return '%s%.2f' % (self.name, self.read_temp())
sensors = [
sensor("28-012111429ba0", ""),
sensor("28-0121113503d2", ""),
sensor("28-012112af13a2", ""),
sensor("28-01212f8c4db3", ""),
sensor("28-01212fabffcd", "")
]
sensorwert0 = sensors[0].print_temp().replace('.',',')
sensorwert1 = sensors[1].print_temp().replace('.',',')
sensorwert2 = sensors[2].print_temp().replace('.',',')
sensorwert3 = sensors[3].print_temp().replace('.',',')
sensorwert4 = sensors[4].print_temp().replace('.',',')
with open(time.strftime('%Y-%m-%d') + '.csv', 'a', newline='') as csvfile:
writer = csv.writer(csvfile, delimiter =';')
writer.writerow([time.strftime("%d.%m.%Y"),time.strftime("%H:%M"),sensorwert0,sensorwert1,sensorwert2,sensorwert3,sensorwert4])
connection = mysql.connector.connect(host='xxx',database='xxx',user='xxx',password='xxx')
cursor = connection.cursor()
cursor.execute("INSERT INTO raum_3 (date3, time3, sensor_9, sensor_10, sensor_11) VALUES (%s, %s, %s, %s, %s)",(time.strftime("%d.%m.%Y"),time.strftime("%H:%M"),sensorwert0,sensorwert1,sensorwert2))
cursor.close()
connection.commit()
connection.close()
Alles anzeigen
Ein vielleicht wichtiger Hinweis noch: Das Script wird IMMER alle 15 Minuten ausgeführt. Wenn ein Fehler vorkommt, dann ist es immer bei 45 Minuten. Also z.B. 19:45, 22:45, 01:45
An den Sensoren liegt es nicht, die Werte werden sauber in die CSV Datei geschrieben. In die Datenbank werden "nur" 3 der 5 Sensoren geschrieben.
Mir gehen langsam die Ideen aus. Hat von euch jemand eine Idee?
Danke & Grüße
MSP