Hallo,
Erst ein mal zu meiner Hardware:
Ich habe eine C-Control für die Heizungsteuerung. Diese liefert seine Daten an den RP über einen USB-RS232 Adapter (das funktioniert ohne Probleme).
Eine weitere C-Control ist für die Bewässerung zuständig. Diese ist über eine Pegelwandler mit TXD0 und RXD0 des RP verbunden.
Mit dem Python-Skript heizung.py, welches automatisch startete, wurden die Daten der Heizung erfasst.
Mit dem Python-Skript statistik.py, welches ich in der Shell gestartet hatte, wurden die Daten der Bewässerung und Werte der Heizung in eine Datenbank geschrieben.
So lief das alles ca. 3 Monate ohne Probleme.
Dann wollte ich statisik.py auch automatisch starten.
Das funktioniert aber nicht, auch starten über die Shell (alter Zustand) brachte keine Besserung.
Mittlerweile habe ich den RP gewechselt, neu aufgesetzt und alle Verbindungen geprüft.
Der Fehler blieb!
Was auch komisch ist, ich benötige den Befehl ser.open() nicht mehr. Er verursacht sogar eine Fehlermeldung. Hat vorher aber funktioniert.
#!/usr/bin/python3
# heizung.py
import serial
from time import sleep
ser = serial.Serial('/dev/ttyUSB0', timeout=0.5)
ser.baudrate = 19200
ser.bytesize=serial.EIGHTBITS
ser.parity=serial.PARITY_NONE
ser.stopbits=serial.STOPBITS_ONE
BodenHformat = '''{0:s};{1:s};{2:s};{3:s};{4:s};{5:s};{6:s};{7:s};{8:s};{9:s};{10:s};{11:s};{12:s};{13:s};{14:s};{15:s};{16:s};{17:s};{18:s};{19:s};{20:s};{21:s};{22:s};{23:s};{24:s};{25:s};{26:s};{27:s};{28:s};{29:s};{30:s};{31:s};{32:s};{33:s};{34:s};{35:s};{36:s}'''
#ser.open()
flag = ser.isOpen()
ser.write(b"Nachricht von Raspberry Pi")
dl = 0
while flag:
p = ser.read(600) # RS232 lesen
sleep(0.5) # 0,5s Pause
if p[-3:] == b'xxx': # prüft der WerteString komplett ist
try:
CCWerte = p.split(b';') # Wertestring von der C_Control der Bodenheizungsteuerung splitten
tWoZ = int(CCWerte[0])/10 # Zimmertemperaturen
tGaZ = int(CCWerte[3])/10
tBaZ = int(CCWerte[6])/10
tWCZ = int(CCWerte[9])/10
tWoW = int(CCWerte[1])/10 # Wand/Bodentemperaturen
tGaB = int(CCWerte[4])/10
tBaB = int(CCWerte[7])/10
tWCB = int(CCWerte[10])/10
tWoR = int(CCWerte[2])/10 # Rcklauftemperaturen
tGaR = int(CCWerte[5])/10
tBaR = int(CCWerte[8])/10
tWCR = int(CCWerte[11])/10
tWoS = int(CCWerte[28])/10 # Solltemperaturen
tGaS = int(CCWerte[29])/10
tBaS = int(CCWerte[30])/10
tWCS = int(CCWerte[31])/10
vWo = int(CCWerte[24]) # Ventilstufe
vGa = int(CCWerte[25])
vBa = int(CCWerte[26])
vWC = int(CCWerte[27])
tAus = float(CCWerte[15])/10 # Aussentemperaur
tKess = int(CCWerte[12])/10 # Kesseltemperatur
tVorU = int(CCWerte[13])/10 # Vorlauftemperaur unten
tVorO = int(CCWerte[14])/10 # Vorlauftemperatur oben
tBoil = int(CCWerte[16])/10 # Boilertemperatur
Pumpenstufe = int(CCWerte[36])
CCStd = int(CCWerte[37][:2])
CCMin = int(CCWerte[37][3:5])
CCSek = int(CCWerte[37][6:8])
CCTag = int(CCWerte[37][9:11])
CCMon = int(CCWerte[37][12:14])
CCJah = int(CCWerte[37][15:19])
CCWt = int(CCWerte[37][20:21])
except:
print('LESEFEHLER')
try:
MischerPos = int(CCWerte[23])
except:
MischerPos = '0'
HKWo = int(CCWerte[34])
strHKWo = 'Aus'
if HKWo == 1:
strHKWo = 'Ein'
HKBa = int(CCWerte[35])
strHKBa = 'Aus'
if HKBa == 1:
strHKBa = 'Ein'
StoerNr = int(CCWerte[33])
Temperturalarm = int(CCWerte[32])
sB1 = round(int(CCWerte[17])/60,1) # aus Minuten Stunden mit Komma machen
sB2 = round(int(CCWerte[18])/60,1)
sB3 = round(int(CCWerte[19])/60,1)
sB4 = round(int(CCWerte[20])/60,1)
sB5 = round(int(CCWerte[21])/60,1)
sB6 = round(int(CCWerte[22])/60,1)
DateTime = CCWerte[37]
BodenHWerte = BodenHformat.format (str(tAus),
str(tWoZ), str(tWoS), str(tWoW), str(tWoR), str(vWo),
str(tGaZ), str(tGaS), str(tGaB), str(tGaR), str(vGa),
str(tBaZ), str(tBaS), str(tBaB), str(tBaR), str(vBa),
str(tWCZ), str(tWCS), str(tWCB), str(tWCR), str(vWC),
str(Pumpenstufe), str(tKess), str(sB1), str(tVorU), str(sB2),
str(tVorO), str(sB3), str(tBoil), str(sB4), str(MischerPos),
str(sB5), str(StoerNr), str(sB6), strHKWo, strHKBa, str(CCWerte[37])
)
f=open("/mnt/RAMDisk/BodenH_Werte.wet", "w")
f.write(BodenHWerte)
f.close()
ser.write(b"Nachricht von Raspberry Pi")
dl = dl + 1
if dl > 120:
dl = 0
ser.write(b"Nachricht von Raspberry Pi")
ser.close()
Alles anzeigen
#!/usr/bin/python3
# statistik.py
import time
from time import sleep
import sqlite3
import serial
ser = serial.Serial("/dev/ttyAMA0", timeout=0.5)
ser.baudrate = 19200
ser.bytesize=serial.EIGHTBITS
ser.parity=serial.PARITY_NONE
ser.stopbits=serial.STOPBITS_ONE
#ser.open()
connection = sqlite3.connect("MessDaten.db")
cursor = connection.cursor()
sql_command = "CREATE TABLE IF NOT EXISTS 'MessDaten' (" \
"`id` INTEGER PRIMARY KEY, " \
"`Zeit` INTRGER, " \
"`Ausst` REAL, " \
"`WoZt` REAL, " \
"`GaZt` REAL, " \
"`BaZt` REAL, " \
"`WCZt` REAL, " \
"`Kesst` REAL, " \
"`Boilt` REAL, " \
"`Regen` INTEGER, " \
"`Wind` INTEGER, " \
"`Schnee` INTEGER, " \
"`Sonne` INTEGER, " \
"`BewZeit` INTEGER, " \
"`BewZeitUD` INTEGER)"
cursor.execute(sql_command)
connection.commit()
connection.close()
vMinOld = 0
vDL = True
dl = 0
ap =''
vRegen = 0
vBewZeitRegenab = ""
vBewZeitRegenun = ""
ser.write(b"Nachricht von Raspberry Pi")
while True:
if ap[-3:]==b'xxx' and ap[:3]==b'xxx': # wenn das Schlusszeichen (xxx) des Datenstrings vorhanden ist
print(ap)
ser.write(b"Nachricht von Raspberry Pi")
aBew = ap.split(b';')
aRegenM = aBew[1:25]
vR = int(aBew[1]) #Regenmenge der letzten Stunde
vRegen = str(vR)
aTempSt = aBew[26:50]
vRegenAktiev = int(aBew[50])
vVentilEin = int(aBew[51])
vVStatus = int(aBew[52])
vR = int(aBew[53])
vBewZeitRegenab = str(vR)
vR = int(aBew[54])
vBewZeitRegenun = str(vR)
vDS18B20Temp = int(aBew[55])
vRegenTakte = int(aBew[56])
vFehler = int(aBew[57])
vXOR = 0
vPSum = 0
for x in aRegenM:
vXOR = vXOR^int(x)
vPSum = vPSum + int(x)
for x in aTempSt:
vXOR = vXOR^int(x)
vPSum = vPSum + int(x)
x= 50
while x < 58:
vXOR = vXOR^int(aBew[x])
vPSum = vPSum + int(aBew[x])
x += 1
if vXOR==int(aBew[58]) and aBew[0]==b'xxx' and vPSum==int(aBew[59]):
print(vRegenTakte)
print(vDS18B20Temp)
fx=open("/mnt/RAMDisk/Bewaess_Werte.wet", "w")
fx.write(str(ap)) # stellt die Werte der Bewässerung
fx.close() # für die Webseite zu verfügung
dl=dl+1
if dl>20:
dl=0
ser.write(b"Nachricht von Raspberry")
print("Nachricht gesendet")
vTimeDate = time.localtime()
if vMinOld!=vTimeDate[4]: # mehrere Durchläufe in der Minute 0 verhindern
vDL = True
if vTimeDate[4]==3 and vDL==True: # 1x pro Stunde
vMinOld = vTimeDate[4]
vDL = False
f=open("/mnt/RAMDisk/BodenH_Werte.wet", "r")
#f=open("A:/EigeneSonstigeDateien/Raspberry Pi/WWW/BodenH_Werte.wet", "r")
vstrf=f.read()
f.close()
aBodenHWerte = vstrf.split(';')
tAus = aBodenHWerte[0]
tWoZ = aBodenHWerte[1]
tGaZ = aBodenHWerte[6]
tBaZ = aBodenHWerte[11]
tWCZ = aBodenHWerte[16]
tKess = aBodenHWerte[22]
tBoil = aBodenHWerte[28]
vZeit = "%s%2.2i%2.2i%2.2i" % (vTimeDate[0], int(vTimeDate[1]), int(vTimeDate[2]), int(vTimeDate[3]))
print(vZeit)
connection = sqlite3.connect("MessDaten.db")
cursor = connection.cursor()
sql = "INSERT INTO `MessDaten` (`Zeit`, `Ausst`, `WoZt`, `GaZt`, `BaZt`, `WCZt`, `Kesst`, `Boilt`, `Regen`, `Wind`, `Schnee`, `Sonne`, `BewZeit`, `BewZeitUD`) VALUES (" \
"'" + vZeit + "', " \
"'" + tAus + "', " \
"'" + tWoZ + "', " \
"'" + tGaZ + "', " \
"'" + tBaZ + "', " \
"'" + tWCZ + "', " \
"'" + tKess + "', " \
"'" + tBoil + "', " \
"'" + vRegen + "', " \
"'" + "" + "', " \
"'" + "" + "', " \
"'" + "" + "', " \
"'" + vBewZeitRegenab + "', " \
"'" + vBewZeitRegenun + "')"
print(sql)
cursor.execute(sql)
connection.commit()
connection.close()
sleep(1)
ap=ser.read(300)
sleep(0.3)
Alles anzeigen
Hier ist die Shell-Ausgabe von statistik.py.
Man kann hier zwei fehlerfreie Übertragungen erkenne
und verschieden Fehlermeldung die ohne eine Änderung, nur durch mehrmaliges starten entstanden sind.
Ein Hardwareproblem kann ausgeschlossen werden.
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "/home/pi/Heizungssteuerung/statistik.py", line 131, in <module>
ap=ser.read(300)
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 453, in read
buf = os.read(self.fd, size-len(read))
BlockingIOError: [Errno 11] Resource temporarily unavailable
>>> ================================ RESTART ================================
>>>
Nachricht gesendet
Traceback (most recent call last):
File "/home/pi/Heizungssteuerung/statistik.py", line 131, in <module>
ap=ser.read(300)
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 460, in read
raise SerialException('device reports readiness to read but returned no data (device disconnected?)')
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected?)
>>> ================================ RESTART ================================
>>>
>>> ================================ RESTART ================================
>>>
Nachricht gesendet
b'xxx;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;TTT;214;245;243;253;279;267;273;250;227;207;201;192;180;152;132;123;121;125;131;
136;145;155;165;179;0;0;0;2;44;208;0;0;448;4850;21:18:00 27.05.2016 5;xxx' (die Daten sind fehlerfrei!)
0
208
Traceback (most recent call last):
File "/home/pi/Heizungssteuerung/statistik.py", line 132, in <module>
ap=ser.read(300)
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 460, in read
raise SerialException('device reports readiness to read but returned no data (device disconnected?)')
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected?)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 475, in write
n = os.write(self.fd, d)
OSError: [Errno 5] Input/output error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/pi/Heizungssteuerung/statistik.py", line 135, in <module>
ser.write(b"Nachricht von Raspberry")
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 489, in write
raise SerialException('write failed: %s' % (v,))
serial.serialutil.SerialException: write failed: [Errno 5] Input/output error
>>> ================================ RESTART ================================
>>>
Nachricht gesendet-
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 475, in write
n = os.write(self.fd, d)
OSError: [Errno 5] Input/output error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/pi/Heizungssteuerung/statistik.py", line 86, in <module>
ser.write(b"Nachricht von Raspberry")
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 489, in write
raise SerialException('write failed: %s' % (v,))
serial.serialutil.SerialException: write failed: [Errno 5] Input/output error
>>> ================================ RESTART ================================
>>>
Nachricht gesendet-
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler+
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
write-Fehler
Traceback (most recent call last):
File "/home/pi/Heizungssteuerung/statistik.py", line 143, in <module>
sleep(0.3)
KeyboardInterrupt
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "/home/pi/Heizungssteuerung/statistik.py", line 131, in <module>
ap=ser.read(300)
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 460, in read
raise SerialException('device reports readiness to read but returned no data (device disconnected?)')
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected?)
>>>
================================ RESTART ================================
>>>
Traceback (most recent call last):
File "/home/pi/Heizungssteuerung/statistik.py", line 131, in <module>
ap=ser.read(300)
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 453, in read
buf = os.read(self.fd, size-len(read))
BlockingIOError: [Errno 11] Resource temporarily unavailable
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "/home/pi/Heizungssteuerung/statistik.py", line 131, in <module>
ap=ser.read(300)
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 453, in read
buf = os.read(self.fd, size-len(read))
BlockingIOError: [Errno 11] Resource temporarily unavailable
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "/home/pi/Heizungssteuerung/statistik.py", line 131, in <module>
ap=ser.read(300)
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 460, in read
raise SerialException('device reports readiness to read but returned no data (device disconnected?)')
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected?)
>>> ================================ RESTART ================================
>>>
b'xxx;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;TTT;214;245;243;253;279;267;273;250;227;207;201;192;180;152;132;123;121;125;131;
136;145;155;165;179;0;0;0;2;44;203;0;0;475;4845;21:34:10 27.05.2016 5;xxx' (die Daten sind fehlerfrei!)
0
203
Traceback (most recent call last):
File "/home/pi/Heizungssteuerung/statistik.py", line 131, in <module>
ap=ser.read(300)
File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 460, in read
raise SerialException('device reports readiness to read but returned no data (device disconnected?)')
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected?)
>>>
Hier noch der Quellcode meiner Bewässerung, der für die Kommunikation mit statitik.py zuständig ist.
Sub UARTSub()
Static vGes As Byte
Dim vRSTeilText(80) As Char
Dim vVStatus As Byte
Dim vV, vT As Word
Dim vX, vY, vZ, vA As Integer
Dim vTemp24(24), vRegen24(24) As Integer
Dim vXOR, vPSum As Integer
Serial_Init_IRQ(UART,buffer,80,255,SR_8BIT Or SR_1STOP Or SR_NO_PAR,SR_BD19200)
vGes = False
Thread_Delay(200) '2 Sec Pause
Do While True
If vZeitSync = 1 Then 'nur Daten senden wenn die Zeit synchron ist
Str_Printf(vZeitText,"%02d:%02d:%02d %02d.%02d.20%02d %d",Clock_GetVal(2),Clock_GetVal(1),Clock_GetVal(0),Clock_GetVal(3) + 1,Clock_GetVal(4) + 1,Clock_GetVal(5),DCF_weekday)
If vGes = False Then 'erst wieder senden wenn eine Antwort vom Raspberry da ist
vRS_Buf = "xxx;"
vZ = 0 : vA = 0 : vXOR = 0 : vPSum = 0 'löschen
vX = EEPos(Clock_GetVal(5),Clock_GetVal(4), _
Clock_GetVal(3),Clock_GetVal(2)) 'Position der letzten Stunde berechnen
vY = (vX + 2) - 24 * 2 'berechnet wie gezählt wird
If vY < 0 Then 'wenn Speicherüberlauf erreicht wird
For vZ = vX To 0 Step -2 'von 0 bis zur aktuellen Speicherstelle
vV = EEPROM_ReadWord(vZ) 'Regenmenge lesen
vT = EEPROM_ReadWord(vZ + 160) 'Temperatur lesen
If vV < 0x3E8 Then 'unrealistische Werte ingorieren
vRegen24(vA) = vV 'Wert auf Array übertagen
vTemp24(vA) = vT 'Wert auf Array übertagen
vA++ 'Arrayindex +1
End If
Next
vY = 144 + vY 'vY ist negativ - vY wird kleiner 142
For vZ = 142 To vY Step -2 'den hinteren Teil des Speichers
vV = EEPROM_ReadWord(vZ) 'Regenmenge lesen
vT = EEPROM_ReadWord(vZ + 160) 'Temperatur lesen
If vV < 0x3E8 Then 'unrealistische Werte ingorieren
vRegen24(vA) = vV 'Wert auf Array übertagen
vTemp24(vA) = vT 'Wert auf Array übertagen
vA++ 'Arrayindex +1
End If
Next
Else
For vZ = vX To vY Step -2 'Speicherstellen durchzählen wenn kein Überlauf
vV = EEPROM_ReadWord(vZ) 'Regenmenge lesen
vT = EEPROM_ReadWord(vZ + 160) 'Temperatur lesen
If vV < 0x3E8 Then 'unrealistische Werte ingorieren
vRegen24(vA) = vV 'Wert auf Array übertagen
vTemp24(vA) = vT 'Wert auf Array übertagen
vA++ 'Arrayindex +1
End If
Next
End If
For vX = 0 To 23
vXOR = vXOR Xor vRegen24(vX) 'Prüfzahl
vPSum = vPSum + vRegen24(vX)
Str_WriteInt(vRegen24(vX), vRS_Buf, STR_APPEND)
Str_Copy(vRS_Buf, ";", STR_APPEND)
Next
Str_Copy(vRS_Buf, "TTT;", STR_APPEND)
For vX = 0 To 23
vXOR = vXOR Xor vTemp24(vX) 'Prüfzahl
vPSum = vPSum + vTemp24(vX)
Str_WriteInt(vTemp24(vX), vRS_Buf, STR_APPEND)
Str_Copy(vRS_Buf, ";", STR_APPEND)
Next
vX = Port_ReadBit(MVOst) 'Ventielstatus übergeben
vVStatus = vX * 1 'Status an Bit 0 übergeben
vX = Port_ReadBit(MVSued) 'Ventielstatus übergeben
vVStatus = vX * 2 + vVStatus 'Status an Bit 1 übergeben
vX = Port_ReadBit(MVWest) 'Ventielstatus übergeben
vVStatus = vX * 4 + vVStatus 'Status an Bit 2 übergeben
vX = Port_ReadBit(MVDach) 'Ventielstatus übergeben
vVStatus = vX * 8 + vVStatus 'Status an Bit 3 übergeben
vXOR = vXOR Xor vRegenAktiev 'Prüfzahl
vPSum = vPSum + vRegenAktiev
vXOR = vXOR Xor vVentielEin
vPSum = vPSum + vVentielEin
vXOR = vXOR Xor vVStatus
vPSum = vPSum + vVStatus
vXOR = vXOR Xor vBewZeitRegenab
vPSum = vPSum + vBewZeitRegenab
vXOR = vXOR Xor vBewZeitRegenun
vPSum = vPSum + vBewZeitRegenun
vXOR = vXOR Xor vDS18B20Temp
vPSum = vPSum + vDS18B20Temp
vXOR = vXOR Xor vRegenTakte
vPSum = vPSum + vRegenTakte
vXOR = vXOR Xor vFeler
vPSum = vPSum + vFeler
Str_Printf(vRSTeilText,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%s;xxx", vRegenAktiev, vVentielEin, vVStatus, vBewZeitRegenab, vBewZeitRegenun, vDS18B20Temp, vRegenTakte, vFeler, vXOR, vPSum, vZeitText)
Str_Copy(vRS_Buf,vRSTeilText,STR_APPEND)
Serial_WriteText(UART,vRS_Buf) 'sendet den Inhalt von vRS_Buf über die UART
vGes = True
Msg_WriteText(vRS_Buf)
Msg_WriteChar(13)
End If
vZ = Serial_IRQ_Info(UART,RS232_FIFO_RECV) 'zählt die Zeichen im Empfangspuffer
If vZ > 10 Then 'sind mehr als 10 Zeichen im Empfangspuffer
Thread_Lock(1)
Thread_Delay(10)
Do While True
vZ=Serial_ReadExt(UART) 'liest ein Zeichen vom Empfangspuffer
If vZ=0x100 Then 'prüft ob der Empfangspuffers leer ist
Thread_Lock(0)
Exit
End If
Msg_WriteChar(vZ)
End While
Msg_WriteChar(13)
vGes = False
End If
Thread_Delay(1000) '10s Pause
End If
End While
End Sub
Alles anzeigen
Mir ist schon klar das das hier viel ist, aber ich weiß nicht mehr weiter.
Grüße