Seit mehreren Wochen funktioniert bei mir ein DOIF nicht mehr richtig. Es wird eine Raumtemperatur gemessen und deren Wert soll im DOIF zu definierten Öffnungsständen von Fenstern führen. Das hat seit April funktioniert, jetzt nicht mehr. Verwendet wird:
Internals:
DEF ([MQTT2_GWH:tempOben] gt [$SELF:sollwert] and [MQTT2_GWH:tempOben] lt ([$SELF:sollwert]+1))
(set doif_GWH_FenstVerstOben oeffnung 25)
DOELSEIF([MQTT2_GWH:tempOben] ge ([$SELF:sollwert]+1) and [MQTT2_GWH:tempOben] lt ([$SELF:sollwert]+2))
(set doif_GWH_FenstVerstOben oeffnung 50)
DOELSEIF([MQTT2_GWH:tempOben] ge ([$SELF:sollwert]+2) and [MQTT2_GWH:tempOben] lt ([$SELF:sollwert]+3))
(set doif_GWH_FenstVerstOben oeffnung 75)
DOELSEIF([MQTT2_GWH:tempOben] ge ([$SELF:sollwert]+3))
(set doif_GWH_FenstVerstOben oeffnung 100)
DOELSEIF([MQTT2_GWH:tempOben] le [$SELF:sollwert])
(set doif_GWH_FenstVerstOben oeffnung 0)
FUUID 5dcbb378-f33f-b67a-8606-a1af5fa721ed5136
FVERSION 98_DOIF.pm:0.205000/2019-11-12
MODEL FHEM
NAME doif_GWH_FensterOben
NOTIFYDEV MQTT2_GWH,doif_GWH_FensterOben,global
NR 263
NTFY_ORDER 50-doif_GWH_FensterOben
STATE 5.75°C Fenster 100% offen enabled
TYPE DOIF
VERSION 20500 2019-11-12 17:54:48
READINGS:
2019-11-14 06:01:32 cmd 4
2019-11-14 06:01:32 cmd_event doif_GWH_FensterOben
2019-11-14 06:01:32 cmd_nr 4
2019-11-14 06:01:32 e_doif_GWH_FensterOben_sollwert 11
2019-11-14 06:01:15 mode enabled
2019-11-14 06:01:32 sollwert 11
2019-11-14 06:01:32 state cmd_4
Regex:
accu:
cond:
MQTT2_GWH:
0:
tempOben ^MQTT2_GWH$:^tempOben:
1:
tempOben ^MQTT2_GWH$:^tempOben:
2:
tempOben ^MQTT2_GWH$:^tempOben:
3:
tempOben ^MQTT2_GWH$:^tempOben:
4:
tempOben ^MQTT2_GWH$:^tempOben:
doif_GWH_FensterOben:
0:
sollwert ^doif_GWH_FensterOben$:^sollwert:
1:
sollwert ^doif_GWH_FensterOben$:^sollwert:
2:
sollwert ^doif_GWH_FensterOben$:^sollwert:
3:
sollwert ^doif_GWH_FensterOben$:^sollwert:
4:
sollwert ^doif_GWH_FensterOben$:^sollwert:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') gt ::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert') and ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') lt (::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert')+1)
1 ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') ge (::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert')+1) and ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') lt (::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert')+2)
2 ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') ge (::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert')+2) and ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') lt (::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert')+3)
3 ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') ge (::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert')+3)
4 ::ReadingValDoIf($hash,'MQTT2_GWH','tempOben') le ::ReadingValDoIf($hash,'doif_GWH_FensterOben','sollwert')
do:
0:
0 set doif_GWH_FenstVerstOben oeffnung 25
1:
0 set doif_GWH_FenstVerstOben oeffnung 50
2:
0 set doif_GWH_FenstVerstOben oeffnung 75
3:
0 set doif_GWH_FenstVerstOben oeffnung 100
4:
0 set doif_GWH_FenstVerstOben oeffnung 0
5:
helper:
DEVFILTER ^global$|^doif_GWH_FensterOben$|^MQTT2_GWH$
NOTIFYDEV global|doif_GWH_FensterOben|MQTT2_GWH
event sollwert: 11
globalinit 1
last_timer 0
sleeptimer -1
timerdev doif_GWH_FensterOben
timerevent sollwert: 11
triggerDev doif_GWH_FensterOben
timerevents:
sollwert: 11
e_doif_GWH_FensterOben_sollwert: 11
timereventsState:
sollwert: 11
e_doif_GWH_FensterOben_sollwert: 11
triggerEvents:
sollwert: 11
e_doif_GWH_FensterOben_sollwert: 11
triggerEventsState:
sollwert: 11
e_doif_GWH_FensterOben_sollwert: 11
internals:
readings:
all MQTT2_GWH:tempOben doif_GWH_FensterOben:sollwert
trigger:
uiState:
uiTable:
Attributes:
DbLogExclude .*
do always
event-on-change-reading .*
group Gewaechshaus
icon fts_window_2w_open_lr
readingList sollwert
room GWH
setList sollwert:slider,0,1,50
stateFormat [MQTT2_GWH:tempOben]°C Fenster [doif_GWH_FenstVerstOben:oeffnung]% offen [doif_GWH_FensterOben:mode]
webCmd sollwert
Bei Temperaturwerten kleiner als der Sollwert wird nicht auf oeffnung 0 gestellt. Bei Temperaturen größer dem Sollwert wird die oeffnung richtig gesteuert. Ich habe gestern das selbe DOIF auf einem Testsystem eingerichtet. Dort hat es zunächst richtig funktioniert, wie auf dem Produktivsystem. Nach einigen Stunden Laufzeit, in der Nacht, trat der Fehler in beiden Systemen auf.
Auf dem Testsystem habe ich im Zuge der Fehlersuche das DOIF mehrmals verändert, was dort dazu geführt hat, dass es zzt. funktioniert. Denselben Effekt hatte ich in den vergangenen Tagen auch auf dem Produktivsystem. Momentan kann ich den Fehler aber nicht beheben. Weder Neustart von fhem oder des Raspberry, noch ein Löschen des Moduls und Neuanlage konnte den Fehler beheben.
Aufgefallen ist mir, dass in den Readings die Temperatur, sie wird aus einem anderen Gerät (MQTT2) gelesen, nicht angezeigt wird. Manchmal -nicht reproduzierbar- wird das e-Reading aber auch angezeigt. Einen Einfluss auf den Fehler habe ich nicht bemerkt.
FHEM ist auf dem aktuellen Stand.
Ich kenne mich in fhem noch nicht so gut aus und wäre für jeden Hinweis dankbar.
Danke im Voraus, Eberhard
Kann schon sein, dass es funktioniert hat wie du dachtest, dass es sollte...
ABER:
lt, gt, ... ist ein "Zeichenkettenvergleich"
Bei numerischen Werten: <, >, ==, ...
Gruß, Joachim
Joachim, danke für die schnelle Antwort.
Verwende ich die für numerische Vergleiche vorgesehenen Operatoren, tauchen im log andauernd PERL Fehlermeldungen auf. Die Temperaturwerte kommen über MQTT (Mosquitto) herein. Ich ändere es aber trotzdem mal komplett ab und melde mich.
Gruß Eberhard
Ich habs umgestellt und es hat funktioniert. Aber zur Vorgeschichte: Ich hatte alles im April auf numerische Vergleichsoperatoren und ständig die PERL Fehlermeldungen. Dann umgestellt auf nicht numerischen Vergleich. Die Fehlermeldungen waren weg und es hat, wie gesagt bis vor wenigen Wochen funktioniert.
Ich lass es mal so und schau mal, ob der Fehler behoben ist. Das Problem war ja, dass z.B. gestern nach vergeblicher Fehlersuche das DOIF plötzlich wieder funktioniert hat.
Nochmals Danke,
Eberhard
schau dir mal die werte von den readings an. eventuell ist manchmal ein wert nicht numerisch.
Also
1) Du hast zwischendurch nicht numerische Werte drin, das solltest du mit dem Filteroperator eliminieren, z. B. [MQTT2_GWH:tempOben:d]
2) lt, gt usw. funktionieren bei Zahlen nur, wenn sie die gleiche Stelligkeit haben: 03 lt 10 ist wahr, aber 3 lt 10 ist falsch, daher Zahlen immer mit <,> vergleichen
Besten Dank für die Hinweise. Die Werte habe ich schon geprüft (mit MQTT.fx) , das sind definitiv Zahlen. Sollte ich weiter Probleme haben, baue ich den Filter <:d> noch ein.
Ich warte noch bis nächsten Morgen, dann werde ich sehen was los ist. Ich denke aber, dass mit der Umstellung auf numerische Operatoren alles im Lot ist. Ich finde auch keine Warnmeldungen.
Danke an alle,
mein Fehler ist beseitig, DOIF läuft jetzt wieder durch. Der Paramter <:d> war nicht notwendig.