Hallo zusammen,
ich mach jetzt schon den zweiten Abend an meinem DOIF rum:
Bei 60°C soll ein Reading in meinem Temperatursensor gesetzt werden.
Zwischen 58°C und 60°C soll ein Hinweis, zwischen 55°C und 58°C eine Warnung gesendet werden
Unter 50°C soll das Reading im Temperatursensor umgeschrieben werden, damit beim Heizen keine Warnungen kommen.
Das DOIF sieht wie folgt aus:
([7:00 - 22:00] and [tmpkofen:status] eq "heat" and [tmpkofen:temperature] < 58 and [tmpkofen:temperature] > 55) (set Telegram msg Achtung, das Feuer geht aus!)
DOELSEIF
([7:00 - 22:00] and [tmpkofen:status] eq "heat" and [tmpkofen:temperature] < 60 and [tmpkofen:temperature] > 58) (set Telegram msg Bitte nach dem Feuer schauen)
DOELSEIF
([tmpkofen:temperature] > 60) (setreading tmpkofen status heat)
DOELSEIF
([tmpkofen:temperature] < 55) (setreading tmpkofen status cool)
Folgende Attribute habe ich gesetzt:
cmdpause 300:300:0:0
repeatcmd 2:2:0:0
Was mach ich falsch?
Vielen Dank für eure Hilfe
Dan
Bitte ein "list" vom DOIF, wenn er im "falschen" Status ist, und genaue Beschreibung, was erwartet wäre und was nicht funktioniert.
Erste Anmerkung: bei genau 55 oder 58 oder 60 ist keine Bedingung wahr.
Hier die Ausgabe von list:
Internals:
DEF ([tmpkofen:temperature] < 55)
(setreading tmpkofen status cool)
DOELSEIF
(
[7:00 - 22:00]
and [tmpkofen:status] eq "heat"
and [tmpkofen:temperature] < 58
)
(set Telegram msg Achtung, das Feuer geht aus!)
DOELSEIF
(
[7:00 - 22:00]
and [tmpkofen:status] eq "heat"
and [tmpkofen:temperature] < 60
)
(set Telegram msg Bitte nach dem Feuer schauen)
DOELSEIF
([tmpkofen:temperature] >= 60)
(setreading tmpkofen status heat)
FUUID 5cafac22-f33f-5d70-1ea0-50f9a3fbbab8110c
MODEL FHEM
NAME difskmsg
NOTIFYDEV tmpkofen,global
NR 294
NTFY_ORDER 50-difskmsg
STATE cmd_3
TYPE DOIF
VERSION 22913 2020-10-04 21:46:02
OLDREADINGS:
READINGS:
2020-10-18 17:15:39 Device tmpkofen
2020-10-18 17:13:01 cmd 3
2020-10-18 17:13:01 cmd_event difskmsg
2020-10-18 17:13:01 cmd_nr 3
2020-10-18 17:15:39 e_tmpkofen_temperature 59.687
2020-10-18 17:12:59 mode enabled
2020-10-18 17:13:01 state cmd_3
2020-10-18 17:12:59 timer_01_c02 19.10.2020 07:00:00
2020-10-18 17:12:59 timer_02_c02 18.10.2020 22:00:00
2020-10-18 17:12:59 timer_03_c03 19.10.2020 07:00:00
2020-10-18 17:12:59 timer_04_c03 18.10.2020 22:00:00
Regex:
accu:
cond:
tmpkofen:
0:
temperature ^tmpkofen$:^temperature:
1:
status ^tmpkofen$:^status:
temperature ^tmpkofen$:^temperature:
2:
status ^tmpkofen$:^status:
temperature ^tmpkofen$:^temperature:
3:
temperature ^tmpkofen$:^temperature:
attr:
cmdState:
cmdpause:
0
300
300
0
repeatcmd:
0
2
2
0
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'tmpkofen','temperature') < 55
1 ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'tmpkofen','status') eq "heat" and ::ReadingValDoIf($hash,'tmpkofen','temperature') < 58
2 ::DOIF_time($hash,2,3,$wday,$hms) and ::ReadingValDoIf($hash,'tmpkofen','status') eq "heat" and ::ReadingValDoIf($hash,'tmpkofen','temperature') < 60
3 ::ReadingValDoIf($hash,'tmpkofen','temperature') >= 60
days:
do:
0:
0 setreading tmpkofen status cool
1:
0 set Telegram msg Achtung, das Feuer geht aus!
2:
0 set Telegram msg Bitte nach dem Feuer schauen
3:
0 setreading tmpkofen status heat
4:
helper:
DEVFILTER ^global$|^tmpkofen$
NOTIFYDEV global|tmpkofen
event T: 59.687,temperature: 59.687
globalinit 1
last_timer 4
sleeptimer -1
timerdev tmpkofen
timerevent T: 59.687,temperature: 59.687
triggerDev tmpkofen
timerevents:
T: 59.687
temperature: 59.687
timereventsState:
state: T: 59.687
temperature: 59.687
triggerEvents:
T: 59.687
temperature: 59.687
triggerEventsState:
state: T: 59.687
temperature: 59.687
internals:
interval:
0 -1
1 0
2 -1
3 2
intervalfunc:
localtime:
0 1603083600
1 1603051200
2 1603083600
3 1603051200
readings:
all tmpkofen:temperature tmpkofen:status
realtime:
0 07:00:00
1 22:00:00
2 07:00:00
3 22:00:00
time:
0 7:00
1 22:00:00
2 7:00
3 22:00:00
timeCond:
0 1
1 1
2 2
3 2
timer:
0 0
1 0
2 0
3 0
timers:
1 0 1
2 2 3
trigger:
triggertime:
1603051200:
localtime 1603051200
hash:
1603083600:
localtime 1603083600
hash:
uiState:
uiTable:
Attributes:
cmdpause 0:300:300:0
repeatcmd 0:2:2:0
Sieht schon etwas anders aus, da ich natürlich weiter auch selbst versuche den Fehler zu finden. Daher nochmal meine aktuelle Definition:
([tmpkofen:temperature] < 55)
(setreading tmpkofen status cool)
DOELSEIF
(
[7:00 - 22:00]
and [tmpkofen:status] eq "heat"
and [tmpkofen:temperature] < 58
)
(set Telegram msg Achtung, das Feuer geht aus!)
DOELSEIF
(
[7:00 - 22:00]
and [tmpkofen:status] eq "heat"
and [tmpkofen:temperature] < 60
)
(set Telegram msg Bitte nach dem Feuer schauen)
DOELSEIF
([tmpkofen:temperature] >= 60)
(setreading tmpkofen status heat)
Die drei nicht definierten Werte waren mir bewusst. Trotzdem Danke dafür.
Also... seit 17:13 ist er auf cmd_3
Zitat2020-10-18 17:13:01 state cmd_3
Letzter Trigger war tmpkofen_temperature 59.687, immer noch < 60. Er ist dann bei cmd3 geblieben.
Was ist falsch, bzw was hättest Du statt dessen erwartet?
Sorry, meine Erwartungen habe ich nicht gepostet:
Um das Nachlegen von Holz nicht zu vergessen, soll mir das DOIF per Telegram melden, wenn die Ofentemperatur unter 60°C fällt bzw. warnen, wenn sie sogar unter 58°C fällt.
Damit ich nicht benachrichtigt werde wenn der Ofen beim Aufheizen die Temperaturzonen durchläuft, soll unter 55°C und über 60°C ein Reading gesetzt werden, das für die Benachrichtigung geprüft wird.
Ist noch nicht ganz ausgereift, da ich mein Reading nicht umstelle, wenn ich bei der ersten Meldung bereits Holz nachlege. Aber wenn ich noch nicht einmal das hinbekomme... :(
Also, um 17:13 hast Du eine Nachricht bekommen, oder?
Ja, die habe ich bekommen. Seither aber nicht mehr, was aber auch an meiner Ofentemperatur liegen kann.
Sieht mein ,,neues" DOIF aus, als könnte es funktionieren?
Ich habe nun auch die Reihenfolge der Bedingungen geändert. Verstehe ich die Logik richtig, dass mein DOIF so dann früher mit ,,false" die Prüfung der Bedingung abbricht? Bisher waren ja i.d.R. die Zeitspanne und der Status ,,true" und erst die Temperatur hat die gesamte Bedingung auf ,,false" gesetzt?!
Hier mein aktueller Code:
(
[tmpkofen:temperature] < 55)
(setreading tmpkofen status cool)
DOELSEIF
(
[tmpkofen:temperature] < 58
and [tmpkofen:status] eq "heat"
and [7:00 - 22:00]
)
(set Telegram msg Achtung, das Feuer geht aus!)
DOELSEIF
(
[tmpkofen:temperature] < 60
and [tmpkofen:status] eq "heat"
and [7:00 - 22:00]
)
(set Telegram msg Bitte nach dem Feuer schauen)
DOELSEIF
([tmpkofen:temperature] >= 60)
(setreading tmpkofen status heat)
Ja, könnte funktionieren.
Ok. Setze den Beitrag dann mal auf gelöst.
Vielen Dank!