Vielen Dank für das Modul - ich melde mich wegen eines Problems, das oben auch schon angesprochen wurde. Auch bei mir kommt es manchmal vor, dass beim Auslesen eines Readings {} zurückgegeben wird (ich bekomme dann einen KeyError). Der Fehler tritt unsystematisch auf, so dass ich einen Programmierfehler ausschließe.
Ich kann den Fehler abfangen bzw erhöhe dann die Readingwerte in FHEM. Dennoch würde mich interessieren, wie man dem Problem auf dem Grund gehen kann? Innerhalb von FHEM gelingt mir das nicht.
Hier mein gesamter Code, nur "gas" ist wichtig:
#!/usr/bin/env python3
import time
import sys
import spidev
import RPi.GPIO as GPIO
import fhem
fh = fhem.Fhem("raspfhem.fritz.box")
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 40000
numdata = 100
# RPi.GPIO Layout verwenden (wie Pin-Nummern)
GPIO.setmode(GPIO.BCM)
# Pin 17 auf Input setzen, dort ist der keyence angeschlossen
GPIO.setup(17, GPIO.IN)
def GetADC():
Msum = 0
s = 0
while s < numdata:
adc = spi.xfer2([0, 0])
hi = (adc[0] & 0x1F);
low = (adc[1] & 0xFE); # FE for B, FC for C chip (MCP3201-B/C) Danil
data = (hi << 8) | low;
Msum += int(data)
s += 1
return int(Msum/(4*numdata))
def Gaszaehler():
try:
## Die Fassung hat das Risiko, dass mir zu viel KeyError-Fehler auftauchen, daher wird *in* FHEM erhöht#####
#gas = fh.get_device_reading("Heizungskeller", "gas") <=== ausgeblendete Version, weil problematisch
#i = int(gas["Value"])
#fh.send_cmd("setreading Heizungskeller gas " + str(i+1))
fh.send_cmd("setreading Heizungskeller gas {(ReadingsVal(\"Heizungskeller\", \"gas\", 0)+1)}") <== so mache ich das jetzt
except IOError as err:
fh.send_cmd("setreading Heizungskeller Fehler I/O error: {0} " + str(format(err)))
#except KeyError:
# fh.send_cmd("setreading Heizungskeller Fehler KeyError: Reading gas unlesbar " + str(gas)) <== dieser Fehler taucht nur selten, aber zu oft auf
except:
fh.send_cmd("setreading Heizungskeller Fehler Unbekannter Fehler: " + str(sys.exc_info()[0]))
fh.send_cmd("set TelegramBot message ‼️ Heizungskeller Unbekannter Fehler: " + str(sys.exc_info()[0]))
raise
return
zaehlerwasser = 0
WasHigh = False
try:
while True:
time.sleep(0.07)
zaehlerwasser += 1
if (zaehlerwasser == 4500):
wasser = GetADC()
wasser = 25*(wasser // 25)
fh.send_cmd("setreading Heizungskeller wasser " + str(wasser))