[GELÖST]Max Temp und Temperturabfall

Begonnen von Tabularasa, 27 November 2018, 19:58:57

Vorheriges Thema - Nächstes Thema

Tabularasa

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 :)

Damian

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];;\
  }\
}\
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tabularasa

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?

Damian

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.


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

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)


Tabularasa

#5
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

Tabularasa

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?

Tabularasa

#7
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)})

Tabularasa

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

Ellert

Du könntest die Steigung der Temperarurkurve als weiteres Kriterium einführen und wenn dT/dt > 0 ist die Ansage verhindern.

Tabularasa

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)

Tabularasa

#11
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