Hallo. Ich habe einen Temperatursensor bei meinem Kaminofen. Wenn der Ofen an ist liegen die Werte am Sensor so zwischen 25°C und 40°C. Nun würde ich gern ein DOIF erstellen, dass, wenn der Sensor mindestens 25° misst, auslöst wenn die Temperatur wieder um 2° fällt. Somit weiß ich dann dass ich wieder auflegen muss. Da das unterschiedlich maximale Temperaturen sein können, kann ich ja nicht mit festen Werten rechnen. Mir fehlt nur ein Anreiz wie ich anfangen kann. Wäre für einen Tipp dankbar :)
defmod di_kaminofen DOIF {\
if ([temp]>25) {\
if (defined $_temp) {\
if ($_temp-[?temp] > 2) {\
fhem_set"bla on";;\
$_temp=[temp];; \
} elsif ([?temp] > $_temp) {\
$_temp=[temp];;\
}\
} else {\
$_temp=[temp];;\
}\
}\
}
ok :o der perl Modus vom DOIF ist mir noch nicht ganz verständlich...
ich versuch mal auf mich anzupassen. Kannst du mir die Zeilen mit dem ? nochmal erklären?
{
if ([Temp_EG_Ofen:temperature]>25) {
if (defined $_temp) { ---------?
if ($_temp-[?Temp_EG_Ofen:temperature] > 2) {
fhem_set"bla on";
$_temp=[Temp_EG_Ofen:temperature];
} elsif ([?Temp_EG_Ofen:temperature] > $_temp) {
$_temp=[Temp_EG_Ofen:temperature];
}
} else {
$_temp=[Temp_EG_Ofen:temperature]; ------?
}
}
}
Danke
P.S Wenn es nicht zuviel Mühe macht, wie sähe denn der FHEM Modus aus?
Zitatif (defined $_temp)
ist in der Commandref (Perl-Modus) beschrieben. Damit kann man überprüfen, ob die Instanzvariable $_temp schon belegt wurde.
$_temp=[Temp_EG_Ofen:temperature];
hier wird der aktuelle Temperaturwert in der Variablen $_temp gespeichert. Ist wesentlich effizienter als mit setreading auf der FHEM-Ebene zu hantieren.
Im FHEM-Modus gibt es keine Instanzvariablen, dafür müsste man mit Readings arbeiten. Ich halte es nicht für sinnvoll eine effizient funktionierende Lösung, die beliebt ausbaubar ist, in eine weniger effiziente umzuschreiben.
Oder im DOIF-Modus:
([Kamin:Temp] < 25 or [Kamin:Temp] > 40)
DOELSEIF ([Kamin:Temp] > [?$SELF:Temp]) (setreading $SELF Temp $EVENT)
DOELSEIF ([Kamin:Temp] < ([?$SELF:Temp] - 2)) (say blablabla,setreading $SELF Temp $EVENT)
Zitat von: Damian am 28 November 2018, 10:39:11
ist in der Commandref (Perl-Modus) beschrieben. Damit kann man überprüfen, ob die Instanzvariable $_temp schon belegt wurde.
$_temp=[Temp_EG_Ofen:temperature];
hier wird der aktuelle Temperaturwert in der Variablen $_temp gespeichert. Ist wesentlich effizienter als mit setreading auf der FHEM-Ebene zu hantieren.
Im FHEM-Modus gibt es keine Instanzvariablen, dafür müsste man mit Readings arbeiten. Ich halte es nicht für sinnvoll eine effizient funktionierende Lösung, die beliebt ausbaubar ist, in eine weniger effiziente umzuschreiben.
Danke. Funktionieren tut es schonmal, denke ich. Effizient ist zwar gut aber wenn ich selber sie nicht allein dann ausbauen kann, weil ich nicht weis wie, dann würde ich doch lieber die andere Variante nehmen, wobei ich diese auch noch nicht ganz verstanden hab, eventuell etwas mehr 8)
Zitat von: Per am 28 November 2018, 12:36:38
Oder im DOIF-Modus:
([Kamin:Temp] < 25 or [Kamin:Temp] > 40)
DOELSEIF ([Kamin:Temp] > [?$SELF:Temp]) (setreading $SELF Temp $EVENT)
DOELSEIF ([Kamin:Temp] < ([?$SELF:Temp] - 2)) (say blablabla,setreading $SELF Temp $EVENT)
bei der Variante habe ich noch ein warning und error wenn ich checkall drücke, hier mal ein list
Internals:
CFGFN
DEF ([Temp_EG_Ofen:temperature] < 25 or [Temp_EG_Ofen:temperature] > 40)
DOELSEIF
([Temp_EG_Ofen:temperature] > [?$SELF:temperature]) (setreading $SELF temperature $EVENT)
DOELSEIF
([Temp_EG_Ofen:temperature] < ([?$SELF:temperature] - 1)) (set Telegram msg Holz nachlegen!,setreading $SELF temperature $EVENT)
MODEL FHEM
NAME di_Kaminofen
NR 6796
NTFY_ORDER 50-di_Kaminofen
STATE cmd_2
TYPE DOIF
Helper:
DBLOG:
cmd:
DBLogging:
TIME 1543430043.18181
VALUE 0
mode:
DBLogging:
TIME 1543430043.18181
VALUE enabled
state:
DBLogging:
TIME 1543430043.18181
VALUE initialized
READINGS:
2018-11-28 21:19:36 cmd 2
2018-11-28 21:19:36 cmd_event di_Kaminofen
2018-11-28 21:19:36 cmd_nr 2
2018-11-28 21:19:36 error setreading di_Kaminofen temperature : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.
2018-11-28 21:19:32 mode enabled
2018-11-28 21:19:36 state cmd_2
2018-11-28 20:57:02 temperature temperature: 31.75
2018-11-28 21:19:36 warning condition c02: Argument "temperature: 31.75" isn't numeric in numeric gt (>)
Regex:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'Temp_EG_Ofen','temperature') < 25 or ::ReadingValDoIf($hash,'Temp_EG_Ofen','temperature') > 40
1 ::ReadingValDoIf($hash,'Temp_EG_Ofen','temperature') > ::ReadingValDoIf($hash,'di_Kaminofen','temperature')
2 ::ReadingValDoIf($hash,'Temp_EG_Ofen','temperature') < (::ReadingValDoIf($hash,'di_Kaminofen','temperature') - 1)
devices:
0 Temp_EG_Ofen
1 Temp_EG_Ofen
2 Temp_EG_Ofen
all Temp_EG_Ofen
do:
0:
0
1:
0 setreading di_Kaminofen temperature $EVENT
2:
0 set Telegram msg Holz nachlegen!,setreading di_Kaminofen temperature $EVENT
3:
helper:
globalinit 1
last_timer 0
sleeptimer -1
timerdev
timerevent
timerevents
timereventsState
triggerDev
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: di_Kaminofen
error: setreading di_Kaminofen temperature : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.
state: cmd_2
internals:
itimer:
readings:
0 Temp_EG_Ofen:temperature
1 Temp_EG_Ofen:temperature
2 Temp_EG_Ofen:temperature
all Temp_EG_Ofen:temperature
uiState:
uiTable:
Attributes:
DbLogExclude .*
room DOIF
Hi. Also irgendwie funktionieren beide Versionen nicht. Ich habe zum Auslösen mal auf -1° Unterschied gestellt. Der Sensor feuert Events jedes 0,5°C. Um 19:05 hat er die Maximaltemperatur erreicht und hätten somit um 19:43 die DOIFs auslösen sollen.
"2018-11-29 20:00:21" "Temp_EG_Ofen" "MQTT2_DEVICE" "temperature: 35.35" "temperature" "35.35" "°C"
"2018-11-29 19:51:19" "Temp_EG_Ofen" "MQTT2_DEVICE" "temperature: 35.86" "temperature" "35.86" "°C"
"2018-11-29 19:43:37" "Temp_EG_Ofen" "MQTT2_DEVICE" "temperature: 36.56" "temperature" "36.56" "°C"
"2018-11-29 19:33:45" "Temp_EG_Ofen" "MQTT2_DEVICE" "temperature: 37.09" "temperature" "37.09" "°C"
"2018-11-29 19:05:59" "Temp_EG_Ofen" "MQTT2_DEVICE" "temperature: 37.64" "temperature" "37.64" "°C"
"2018-11-29 18:44:15" "Temp_EG_Ofen" "MQTT2_DEVICE" "temperature: 36.94" "temperature" "36.94" "°C"
"2018-11-29 18:35:02" "Temp_EG_Ofen" "MQTT2_DEVICE" "temperature: 36.42" "temperature" "36.42" "°C"
"2018-11-29 18:22:50" "Temp_EG_Ofen" "MQTT2_DEVICE" "temperature: 35.91" "temperature" "35.91" "°C"
"2018-11-29 18:16:39" "Temp_EG_Ofen" "MQTT2_DEVICE" "temperature: 35.37" "temperature" "35.37" "°C"
"2018-11-29 18:10:48" "Temp_EG_Ofen" "MQTT2_DEVICE" "temperature: 34.87" "temperature" "34.87" "°C"
"2018-11-29 18:06:37" "Temp_EG_Ofen" "MQTT2_DEVICE" "temperature: 34.31" "temperature" "34.31" "°C"
"2018-11-29 18:03:36" "Temp_EG_Ofen" "MQTT2_DEVICE" "temperature: 33.8" "temperature" "33.8" "°C"
"2018-11-29 18:00:55" "Temp_EG_Ofen" "MQTT2_DEVICE" "temperature: 33.29" "temperature" "33.29" "°C"
Ich würde es gern so haben, wenn die maximale Temperatur erreicht wurde und dann abfällt, das DOIF auslöst, die Max Temp resettet wird und wieder von vorn losgeht. Geht das?
Wie würde ich denn aus dem error von den post vorher nur die Zahl erhalten ohne "temperature" davor?
Edit: Habe mich jetzt für das normale DOIF entschieden. Ist für mich leichter zu verstehen. Auch um die Zahl zu filtern habe ich eine Lösung gefunden. Kann jemand dazu bitte nochmal einen link schicken, wo diese ganzen d's und der Rest erklärt werden. Würde das auch gern noch nachvollziehen können. Danke
Hier mal mein DOIF
([Temp_EG_Ofen:temperature] < 25)
DOELSEIF
([Temp_EG_Ofen:temperature] > [?$SELF:maxTemp])
(setreading $SELF maxTemp {("$EVENT" =~ /[^\:]*: (-?\d+(\.\d+)?)/;$1)})
DOELSEIF
([Temp_EG_Ofen:temperature] < ([?$SELF:maxTemp] - 1))
(set Telegram msg Holz nachlegen!,set TYPE=SONOSPLAYER:FILTER=presence=appeared
Speak 50 de Bitte Holz nachlegen nich dass das Feuer ausgeht,
setreading $SELF maxTemp {("$EVENT" =~ /[^\:]*: (-?\d+(\.\d+)?)/;$1)})
Hallo. Das doif funktioniert super. Das einzige was mich noch etwas stört ist das wenn die Temperatur unter 25° war und dann drüber geht, der Sonos schon einmal spricht, obwohl der Ofen in der Anheizphase ist und ständig neue max Temperaturen bekommt. Hatte da schon ein paar Varianten probiert, die aber nicht erfolgreich waren. Hat da jemand noch eine Idee? Danke
Du könntest die Steigung der Temperarurkurve als weiteres Kriterium einführen und wenn dT/dt > 0 ist die Ansage verhindern.
Ich habe es nun so gelöst, klappt auch gut :)
([Temp_EG_Ofen:temperature] < 25) (setreading $SELF:FILTER=maxTemp!=15 maxTemp 15)
Danke trotzdem
So nun ist es glaube entgültig gelöst 8)
EDIT: Erledigt
Moin. Ich hatte vor 4 Jahren mal dieses DOIF erstellt. Nachdem damals mein Sensor defekt war, habe ich das DOIF deaktiviert. Nun habe ich endlich einen neuen Sensor und wollte es wieder aktivieren aber nun kommen error und warnings. Kann eventuell jemand den Fehler erkennen? Habe davon leider nicht wirklich die Ahnung. Danke
Internals:
DEF ([zigbee.0.00158d0002321450.temperature] < 25) (setreading $SELF:FILTER=maxTemp!=15 maxTemp 15)
DOELSEIF
([zigbee.0.00158d0002321450.temperature] > [?$SELF:maxTemp])
(setreading $SELF maxTemp {("$EVENT" =~ /[^\:]*: (-?\d+(\.\d+)?)/;$1)})
DOELSEIF
([?08:00-22:45] and ([zigbee.0.00158d0002321450.temperature] < ([?$SELF:maxTemp] - 1)))
(set Telegram msg Holz nachlegen!,set TYPE=SONOSPLAYER:FILTER=presence=appeared
Speak 50 de Bitte Holz nachlegen nich dass das Feuer ausgeht,
setreading $SELF maxTemp {("$EVENT" =~ /[^\:]*: (-?\d+(\.\d+)?)/;$1)})
FUUID 5c430258-f33f-77cb-27da-50231e64d1b6030e
MODEL FHEM
NAME di_Kaminofen
NOTIFYDEV global,zigbee.0.00158d0002321450.temperature
NR 199
NTFY_ORDER 50-di_Kaminofen
STATE cmd_2
TYPE DOIF
VERSION 26182 2022-06-29 18:57:26
eventCount 32
READINGS:
2022-09-25 15:06:23 Device zigbee.0.00158d0002321450.temperature
2022-09-25 15:06:23 cmd 2
2022-09-25 15:06:23 cmd_event zigbee.0.00158d0002321450.temperature
2022-09-25 15:06:23 cmd_nr 2
2022-09-25 15:06:23 e_zigbee.0.00158d0002321450.temperature_STATE 28.03
2022-09-25 15:06:23 error setreading di_Kaminofen maxTemp "28.03" =~ /[^\:]*: (-?\d+(\.\d+)?)/;$1: Unknown command $1, try help.
2022-09-25 15:06:23 maxTemp "28.03" =~ /[^\:]*: (-?\d+(\.\d+)?)/
2022-09-25 11:37:44 mode enabled
2022-09-25 15:06:23 state cmd_2
2022-09-25 11:37:44 timer_01_c03 26.09.2022 08:00:00
2022-09-25 11:37:44 timer_02_c03 25.09.2022 22:45:00
2022-09-25 15:06:23 warning condition c02: Argument ""27.5" =~ /[^\\:]*: (-?\\d+(\\.\\d+)?)/" isn't numeric in numeric gt (>)
Regex:
accu:
collect:
cond:
zigbee.0.00158d0002321450.temperature:
0:
&STATE ^zigbee.0.00158d0002321450.temperature$
1:
&STATE ^zigbee.0.00158d0002321450.temperature$
2:
&STATE ^zigbee.0.00158d0002321450.temperature$
attr:
cmdState:
wait:
waitdel:
condition:
0 ::InternalDoIf($hash,'zigbee.0.00158d0002321450.temperature','STATE') < 25
1 ::InternalDoIf($hash,'zigbee.0.00158d0002321450.temperature','STATE') > ::ReadingValDoIf($hash,'di_Kaminofen','maxTemp')
2 ::DOIF_time($hash,0,1,$wday,$hms) and (::InternalDoIf($hash,'zigbee.0.00158d0002321450.temperature','STATE') < (::ReadingValDoIf($hash,'di_Kaminofen','maxTemp') - 1))
days:
do:
0:
0 setreading di_Kaminofen:FILTER=maxTemp!=15 maxTemp 15
1:
0 setreading di_Kaminofen maxTemp {("$EVENT" =~ /[^\:]*: (-?\d+(\.\d+)?)/;$1)}
2:
0 set Telegram msg Holz nachlegen!,set TYPE=SONOSPLAYER:FILTER=presence=appeared Speak 50 de Bitte Holz nachlegen nich dass das Feuer ausgeht, setreading di_Kaminofen maxTemp {("$EVENT" =~ /[^\:]*: (-?\d+(\.\d+)?)/;$1)}
3:
helper:
NOTIFYDEV global,zigbee.0.00158d0002321450.temperature
event 28.03
globalinit 1
last_timer 2
sleeptimer -1
timerdev zigbee.0.00158d0002321450.temperature
timerevent 28.03
triggerDev zigbee.0.00158d0002321450.temperature
DOIF_eventa:
cmd_nr: 2
cmd: 2
cmd_event: zigbee.0.00158d0002321450.temperature
error: setreading di_Kaminofen maxTemp "28.03" =~ /[^\:]*: (-?\d+(\.\d+)?)/;$1: Unknown command $1, try help.
cmd_2
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: zigbee.0.00158d0002321450.temperature
error: setreading di_Kaminofen maxTemp "28.03" =~ /[^\:]*: (-?\d+(\.\d+)?)/;$1: Unknown command $1, try help.
state: cmd_2
timerevents:
28.03
timereventsState:
state: 28.03
triggerEvents:
28.03
triggerEventsState:
state: 28.03
internals:
all zigbee.0.00158d0002321450.temperature:STATE
interval:
0 -1
1 0
intervalfunc:
localtime:
0 1664172000
1 1664138700
readings:
realtime:
0 08:00:00
1 22:45:00
time:
0 08:00:00
1 22:45:00
timeCond:
0 2
1 2
timer:
0 0
1 0
trigger:
triggertime:
1664138700:
localtime 1664138700
hash:
1664172000:
localtime 1664172000
hash:
uiState:
uiTable:
Attributes:
DbLogExclude .*
do always
room DOIF