FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Larusso am 21 November 2018, 15:51:26

Titel: DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Larusso am 21 November 2018, 15:51:26
Hallo zusammen,

ich stehe ein bisschen auf dem Schlauch. Ich habe einen Temp-Fühler in meiner Gartensauna, über TTS wird mir mitgeteilt wann die Sauna eine bestimmte Temperatur erreicht hat und ich weis wann ich Saunieren kann, dies funktioniert mit einem DOIF auch prima (ja ich weis ein notify hätte es auch getan). Nun habe ich aber mehrere DOIF angelegt damit mir mein TTS Modul bei bestimmten Temperaturen eine Info gibt. Um das ganze ein bisschen aufgeräumter zu gestallten würde ich gerne alle DOIF´s in einen packen und hier stehe ich irgendwie auf dem Schlauch. Anbei die def wie ich sie mir zusammengestellt habe.

([ESPEasy_Sauna_Klima:Temperature] = 60) (set MyTTS volume 90, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius)
DOELSEIF([ESPEasy_Sauna_Klima:Temperature] = 70) (set MyTTS volume 90, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius)
DOELSEIF([ESPEasy_Sauna_Klima:Temperature] = 80) (set MyTTS volume 90, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius)
DOELSEIF([ESPEasy_Sauna_Klima:Temperature] = 90) (set MyTTS volume 90, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius)


Wenn ich DOELSEIF richtig verstehe prüft er damit jedes einzelne DOELSEIF,
das heist ....
wenn 60Grad erreicht sage es
"oder"
wenn 70Grad erreicht sage es
"oder"
wenn 80Grad erreicht sage es
"oder"
wenn 90Grad erreicht sage es

muss die Definition noch irgendwie abgeschlossen werden, oder sollte das genau das erfüllen was ich benötige? Ich möchte beim erreichen jeder Temperatur eine Ausgabe haben, nicht nur wenn 70 erreicht ist, sonder auch wenn sie als Bsp. wieder auf 60 fällt.
Titel: Antw:DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Frank_Huber am 21 November 2018, 15:56:47
zum einen solltest Du >= nehmen sonst muss es GENAU 60 / 70 ... sein

Dann in den DOELSEIF Pfaden einen Bereich >60 bis <=70 u.s.w.
sonst bleibt das DOIF ewig in cmd1 weil es ja immer über 60 ist.
Titel: Antw:DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Larusso am 21 November 2018, 16:00:29
danke für die schnelle Antwort Frank_Huber

wie würde dann die syntax für den Befehl bis aussehen?
Titel: Antw:DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Frank_Huber am 21 November 2018, 16:01:47
Hier ein Beispiel:
defmod Asche_ETA DOIF ([ETA_Kessel_4_Asche:Kessel_4_Asche] > 600 and [ETA_Kessel_4_Asche:Kessel_4_Asche] <= 699) (set PushOver msg 'Demnächst Aschebox leeren. Inhalt von [ETA_Kessel_4_Asche:Kessel_4_Asche] Kg Pellets!')\
DOELSEIF ([ETA_Kessel_4_Asche:Kessel_4_Asche] > 700 and [ETA_Kessel_4_Asche:Kessel_4_Asche] <= 799) (set PushOver msg 'Demnächst Aschebox leeren. Inhalt von [ETA_Kessel_4_Asche:Kessel_4_Asche] Kg Pellets!')\
DOELSEIF ([ETA_Kessel_4_Asche:Kessel_4_Asche] > 800 and [ETA_Kessel_4_Asche:Kessel_4_Asche] <= 899) (set PushOver msg 'Demnächst Aschebox leeren. Inhalt von [ETA_Kessel_4_Asche:Kessel_4_Asche] Kg Pellets!')\
DOELSEIF ([ETA_Kessel_4_Asche:Kessel_4_Asche] > 900 and [ETA_Kessel_4_Asche:Kessel_4_Asche] <= 949) (set PushOver msg 'Aschebox leeren! Inhalt von [ETA_Kessel_4_Asche:Kessel_4_Asche] Kg Pellets!')\
DOELSEIF ([ETA_Kessel_4_Asche:Kessel_4_Asche] > 950) (set PushOver msg 'Dringend Aschebox leeren. Inhalt von [ETA_Kessel_4_Asche:Kessel_4_Asche] Kg Pellets!')\
DOELSEIF ([ETA_Kessel_4_Asche:Kessel_4_Asche] == 0) (set PushOver msg 'Aschebox leer.')
attr Asche_ETA DbLogExclude .*
attr Asche_ETA group Benachrichtigung
attr Asche_ETA room Kommunikation
attr Asche_ETA verbose 0
Titel: Antw:DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Larusso am 21 November 2018, 16:11:42
super habe ich mal so übernommen.

([ESPEasy_Sauna_Klima:Temperature] > 60 and [ESPEasy_Sauna_Klima:Temperature] <= 69) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit)
DOELSEIF([ESPEasy_Sauna_Klima:Temperature] > 70 and [ESPEasy_Sauna_Klima:Temperature] <= 79) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit)
DOELSEIF([ESPEasy_Sauna_Klima:Temperature] > 80 and [ESPEasy_Sauna_Klima:Temperature] <= 89) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit)
DOELSEIF([ESPEasy_Sauna_Klima:Temperature] > 90 and [ESPEasy_Sauna_Klima:Temperature] <= 99) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit)


Eine Frage zum Verständnis habe ich aber noch. Wie verhält sich das DOIF nun, wenn mal angenommen die Temperatur über Stunden im gleichen Bereich bei 61 Grad liegt? Ich habe keine weiteren Attribute gesetzt, dann sollte auch nur einmal die TTS Ausgabe erfolgen, richtig?
Titel: Antw:DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Frank_Huber am 21 November 2018, 16:28:37
Ja, nur einmal.
Wenn Du es mehrfach möchtest kannst Du es über Atribute machen.
Titel: Antw:DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Larusso am 21 November 2018, 16:36:39
Perfekt und vielen lieben dank für die schnelle Hilfe, habe in dem Zug mal einen ganzen Schwung DOIF Definitionen zusammen fassen können. Thema ganz klar gelöst. Daumen hoch ;D
Titel: Antw:[gelösst]DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Per am 22 November 2018, 13:01:35
Da DOIF der Reihe abgearbeitet wird, kannst du, bei entsprechender Sortierung, eine Grenze weglassen.
x > 60 und x < 69, damit sind die schon mal raus.
x > 70 könnte dann wegbleiben, wenn man die < 60 vorab wegfiltert.
ABER: nachdem du am Anfang nur auf die 10er Werte geprüft hast, hast du diese jetzt ganz ignoriert.
Mein Vorschlag:
DOIF ([Temp] >= 90) (say)
DOELSEIF ([Temp] >= 80) (say)
DOELSEIF ([Temp] >= 70) (say)
DOELSEIF ([Temp] >= 60) (say)


Im Ausführungsteil kannst du mit $DEVICE und $EVENT arbeiten.
Ganz tricky wäre ein
attr xxx DOIF_Readings doing:(set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [$EVEND] Grad Celsius bei [$DEVICE:Humidity] Prozent Luftfeuchtigkeit)
mit ([$SELF:doing]) im Ausführungsteil (wobei ich gerade nicht prüfen kann, ob in den DOIF_Readings $DEVICE und $EVENT funktionieren, zur Not kann man ja auf [ESPEasy_Sauna_Klima:Temperature] und [ESPEasy_Sauna_Klima:Humidity] zurückgehen).

@Damian: gehen die ? für Abfragen auch bei den DOIF_Readings?
Titel: Antw:[gelösst]DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Frank_Huber am 22 November 2018, 13:08:55
Danke Per,

Die Abfragen hinten anzufangen ist eine gute Idee.
geht dann aber auch nur solange nur die ansteigende Richtung interessant ist.
Werd ich bei mir mal so umbauen und auch den Fehler mit den 0er Werten korriguieren.
Titel: Antw:[gelösst]DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Per am 22 November 2018, 13:30:57
Zitat von: Frank_Huber am 22 November 2018, 13:08:55
geht dann aber auch nur solange nur die ansteigende Richtung interessant ist.
Nö, geht auch beim Abkühlen. BTW: ich würde noch eine Abfrage einstellen, ob die Heizung überhaupt an ist. Sonst labert es dich nach der Sauna weiter voll und der Erholungseffekt ist dahin ;)
Titel: Antw:[gelösst]DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Larusso am 22 November 2018, 15:53:42
aber was genau ändert sich bei der DOELSEIF Ausgabe wenn ich die Eingrenzung von bis wegnehme? Interessant wäre auch noch Auszuschliesen das die Temperatur beim Abkühlen erneut das doif auslöst.

Am schönsten wäre es wenn ich die DOIF Definition von der syntax so hin bekommen könnte das mir die Temperaturen nur einmalig beim erreichen von 60,70,80 und 90°C angesagt werden und dann erst wider wenn die Temperatur einmal unter eine festgelegte Gradzahl "als Bsp.: 30°C" fällt von vorne beginnt. Das würde genau das verhindern was du Per gemeint hast......nach dem Saunieren fällt die Temperatur unter 80 und mein RPi labert mich voll obwohl ich fertig bin.

jemand eine Idee wie ich das noch einbinden kann?


hab das ganze jetzt erst mal so übernommen:

([ESPEasy_Sauna_Klima:Temperature] >= 90) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit)
DOELSEIF ([ESPEasy_Sauna_Klima:Temperature] >= 80) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit)
DOELSEIF ([ESPEasy_Sauna_Klima:Temperature] >= 70) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit)
DOELSEIF ([ESPEasy_Sauna_Klima:Temperature] >= 60) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit)


ich muss den Beitrag noch mal auf nicht gelösst setzen. Bei der Syntax die ich in diesem Beitrag gepostet habe löst mein DOIF ständig aus, das sollte gerade nicht passieren, aus dem Grund habe ich das ">" rausgenommen was zu einem Syntax Fehler führte. Lag an dem perl im DOIF ich musste zwei "==" setzen. Des weiteren ist das kleine Problem bei Temperaturabfall auch noch nicht abgestellt. Der RPI erzählt mir nämlich auch nach dem ich die Sauna aus habe und sie abkühlt das die Temperaturen erreicht sind.......vielleicht weis da auch noch jemand abhilfe, danke schon mal an alle für die schnelle Unterstützung zu dem Thema  ;)
Titel: Antw:[gelösst]DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Per am 26 November 2018, 12:29:43
([$SELF:Temperature] >= 90 ) (say ...,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 80) (say ...,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 70) (say ...,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 60) (say ...,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] < 40) (setreading $SELF max say [$EVENT])
attr xxx DOIF_Readings Temperarure:([ESPEasy_Sauna_Klima:Temperature] > [$SELF:max] ? [ESPEasy_Sauna_Klima:Temperature] : 40)

Bisschen tricky, spart aber viel Schreibarbeit.


Da du kein List gepostet hast: verwendest du attr do always?
Titel: Antw:DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Larusso am 26 November 2018, 13:18:26
Hallo Per,

kannst du dir mal den Fehler anschauen. Er gibt mir in Zeile 5 diesen Fehler aus:
condition c05: Argument "" isn't numeric in numeric lt (<)

hier die List vom Device was ich angelegt habe:

Internals:
   CFGFN     
   DEF        ([$SELF:Temperature] >= 90 ) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 80) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 70) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 60) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] < 40) (setreading $SELF max say [$EVENT])
   MODEL      FHEM
   NAME       Sauna_Temperatur_TTS_test
   NR         2235
   NTFY_ORDER 50-Sauna_Temperatur_TTS_test
   STATE      cmd_5
   TYPE       DOIF
   .attraggr:
   .attrminint:
   DOIF_Readings:
     Temperarure (::ReadingValDoIf($hash,'ESPEasy_Sauna_Klima','Temperature') > ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','max') ? ::ReadingValDoIf($hash,'ESPEasy_Sauna_Klima','Temperature') : 40)
   READINGS:
     2018-11-26 13:16:00   Device          Sauna_Temperatur_TTS_test
     2018-11-26 13:08:47   Temperarure     6
     2018-11-26 13:15:59   cmd             5
     2018-11-26 13:15:59   cmd_event       Sauna_Temperatur_TTS_test
     2018-11-26 13:15:59   cmd_nr          5
     2018-11-26 13:15:59   max             say
     2018-11-26 13:15:58   mode            enabled
     2018-11-26 13:15:59   state           cmd_5
     2018-11-26 13:15:59   warning         condition c05: Argument "" isn't numeric in numeric lt (<)

   Regex:
     DOIF_Readings:
       ESPEasy_Sauna_Klima:
         Temperarure:
           Temperature ^ESPEasy_Sauna_Klima$:^Temperature:
       Sauna_Temperatur_TTS_test:
         Temperarure:
           max        ^Sauna_Temperatur_TTS_test$:^max:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') >= 90
     1          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') >= 80
     2          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') >= 70
     3          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') >= 60
     4          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') < 40
   devices:
     0           Sauna_Temperatur_TTS_test
     1           Sauna_Temperatur_TTS_test
     2           Sauna_Temperatur_TTS_test
     3           Sauna_Temperatur_TTS_test
     4           Sauna_Temperatur_TTS_test
     all         Sauna_Temperatur_TTS_test
   do:
     0:
       0          set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading Sauna_Temperatur_TTS_test max say [$EVENT]
     1:
       0          set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading Sauna_Temperatur_TTS_test max say [$EVENT]
     2:
       0          set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading Sauna_Temperatur_TTS_test max say [$EVENT]
     3:
       0          set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading Sauna_Temperatur_TTS_test max say [$EVENT]
     4:
       0          setreading Sauna_Temperatur_TTS_test max say [$EVENT]
     5:
   helper:
     event      cmd_nr: 5,cmd: 5,cmd_event: Sauna_Temperatur_TTS_test,cmd_5
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   
     timerevent
     timerevents
     timereventsState
     triggerDev Sauna_Temperatur_TTS_test
     DOIF_eventas:
       cmd_nr: 5
       cmd: 5
       cmd_event: Sauna_Temperatur_TTS_test
       state: cmd_5
     triggerEvents:
       cmd_nr: 5
       cmd: 5
       cmd_event: Sauna_Temperatur_TTS_test
       cmd_5
       Device: Sauna_Temperatur_TTS_test
     triggerEventsState:
       cmd_nr: 5
       cmd: 5
       cmd_event: Sauna_Temperatur_TTS_test
       state: cmd_5
   internals:
   itimer:
   readings:
     0           Sauna_Temperatur_TTS_test:Temperature
     1           Sauna_Temperatur_TTS_test:Temperature
     2           Sauna_Temperatur_TTS_test:Temperature
     3           Sauna_Temperatur_TTS_test:Temperature
     4           Sauna_Temperatur_TTS_test:Temperature
     all         Sauna_Temperatur_TTS_test:Temperature
   trigger:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings Temperarure:([ESPEasy_Sauna_Klima:Temperature] > [$SELF:max] ? [ESPEasy_Sauna_Klima:Temperature] : 40)
   alias      tts Sauna Temperatur Test
   do         always



und ja ich habe auch bei dem anderen Device attr do always an.
Titel: Antw:DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Per am 26 November 2018, 14:34:53
do always brauchst du nicht.
Und am Anfang ist max noch nicht gesetzt.

DOELSEIF ([$SELF:Temperature] < 40) (setreading $SELF max say [$EVENT])
ist falsch, muss
DOELSEIF ([$SELF:Temperature] < 40) (setreading $SELF max [$EVENT])
heissen. Copy & paste  >:(
Titel: Antw:DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Larusso am 26 November 2018, 15:51:23
wo muss ich max setzen? Im DOIF_readings oder in der def?


def:
([$SELF:Temperature] >= 90 ) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 80) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 70) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 60) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] < 40) (setreading $SELF max [$EVENT])


list:
Internals:
   CFGFN     
   DEF        ([$SELF:Temperature] >= 90 ) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 80) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 70) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 60) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] < 40) (setreading $SELF max [$EVENT])
   MODEL      FHEM
   NAME       Sauna_Temperatur_TTS_test
   NR         2235
   NTFY_ORDER 50-Sauna_Temperatur_TTS_test
   STATE      cmd_5
   TYPE       DOIF
   .attraggr:
   .attrminint:
   DOIF_Readings:
     Temperarure (::ReadingValDoIf($hash,'ESPEasy_Sauna_Klima','Temperature') > ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','max') ? ::ReadingValDoIf($hash,'ESPEasy_Sauna_Klima','Temperature') : 40)
   READINGS:
     2018-11-26 15:49:52   Device          Sauna_Temperatur_TTS_test
     2018-11-26 14:53:52   Temperarure     6
     2018-11-26 15:49:52   cmd             5
     2018-11-26 15:49:52   cmd_event       Sauna_Temperatur_TTS_test
     2018-11-26 15:49:52   cmd_nr          5
     2018-11-26 15:49:52   error           setreading Sauna_Temperatur_TTS_test max : 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-26 13:15:59   max             say
     2018-11-26 15:49:51   mode            enabled
     2018-11-26 15:49:52   state           cmd_5
     2018-11-26 15:49:52   warning         condition c05: Argument "" isn't numeric in numeric lt (<)

   Regex:
     DOIF_Readings:
       ESPEasy_Sauna_Klima:
         Temperarure:
           Temperature ^ESPEasy_Sauna_Klima$:^Temperature:
       Sauna_Temperatur_TTS_test:
         Temperarure:
           max        ^Sauna_Temperatur_TTS_test$:^max:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') >= 90
     1          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') >= 80
     2          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') >= 70
     3          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') >= 60
     4          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') < 40
   devices:
     0           Sauna_Temperatur_TTS_test
     1           Sauna_Temperatur_TTS_test
     2           Sauna_Temperatur_TTS_test
     3           Sauna_Temperatur_TTS_test
     4           Sauna_Temperatur_TTS_test
     all         Sauna_Temperatur_TTS_test
   do:
     0:
       0          set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading Sauna_Temperatur_TTS_test max say [$EVENT]
     1:
       0          set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading Sauna_Temperatur_TTS_test max say [$EVENT]
     2:
       0          set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading Sauna_Temperatur_TTS_test max say [$EVENT]
     3:
       0          set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading Sauna_Temperatur_TTS_test max say [$EVENT]
     4:
       0          setreading Sauna_Temperatur_TTS_test max [$EVENT]
     5:
   helper:
     event      cmd_nr: 5,cmd: 5,cmd_event: Sauna_Temperatur_TTS_test,error: setreading Sauna_Temperatur_TTS_test max : 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.
,cmd_5
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   
     timerevent
     timerevents
     timereventsState
     triggerDev Sauna_Temperatur_TTS_test
     DOIF_eventas:
       cmd_nr: 5
       cmd: 5
       cmd_event: Sauna_Temperatur_TTS_test
       error: setreading Sauna_Temperatur_TTS_test max : 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_5
     triggerEvents:
       cmd_nr: 5
       cmd: 5
       cmd_event: Sauna_Temperatur_TTS_test
       error: setreading Sauna_Temperatur_TTS_test max : 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.

       cmd_5
       Device: Sauna_Temperatur_TTS_test
     triggerEventsState:
       cmd_nr: 5
       cmd: 5
       cmd_event: Sauna_Temperatur_TTS_test
       error: setreading Sauna_Temperatur_TTS_test max : 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_5
   internals:
   itimer:
   readings:
     0           Sauna_Temperatur_TTS_test:Temperature
     1           Sauna_Temperatur_TTS_test:Temperature
     2           Sauna_Temperatur_TTS_test:Temperature
     3           Sauna_Temperatur_TTS_test:Temperature
     4           Sauna_Temperatur_TTS_test:Temperature
     all         Sauna_Temperatur_TTS_test:Temperature
   trigger:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings Temperarure:([ESPEasy_Sauna_Klima:Temperature] > [$SELF:max] ? [ESPEasy_Sauna_Klima:Temperature] : 40)
   alias      tts Sauna Temperatur Test
Titel: Antw:DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Per am 27 November 2018, 13:10:41
Einfach einmalig in der Befehlszeile
setreading Sauna_Temperatur_TTS_test max 31
eingeben. Die genaue Zahl ist relativ unkritisch, sollte aber am besten ca. der aktuellen Temperatur entsprechen.
Titel: Antw:DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Larusso am 27 November 2018, 14:50:45
Hallo Per,

leider brachte das setreading nicht gewünschten Erfolg und der Fehler wird weiter angezeigt. ich mache nochmal eine list vielleicht fällt dir ja noch was dazu ein.

Internals:
   CFGFN     
   DEF        ([$SELF:Temperature] >= 90 ) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 80) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 70) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] >= 60) (set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading $SELF max say [$EVENT])
DOELSEIF ([$SELF:Temperature] < 40) (setreading $SELF max [$EVENT])
   MODEL      FHEM
   NAME       Sauna_Temperatur_TTS_test
   NR         2235
   NTFY_ORDER 50-Sauna_Temperatur_TTS_test
   STATE      initialize
   TYPE       DOIF
   .attraggr:
   .attrminint:
   DOIF_Readings:
     Temperature (::ReadingValDoIf($hash,'ESPEasy_Sauna_Klima','Temperature') > ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','max') ? ::ReadingValDoIf($hash,'ESPEasy_Sauna_Klima','Temperature') : 40)
   READINGS:
     2018-11-27 14:47:29   Device          Sauna_Temperatur_TTS_test
     2018-11-27 07:12:31   Temperarure     4
     2018-11-27 14:47:16   Temperature     40
     2018-11-27 14:47:23   e_Sauna_Temperatur_TTS_test_Temperature 40
     2018-11-27 07:21:09   error           setreading Sauna_Temperatur_TTS_test max : 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-27 14:47:16   max             10
     2018-11-27 14:46:52   mode            enabled
     2018-11-27 14:46:52   state           initialize
   Regex:
     DOIF_Readings:
       ESPEasy_Sauna_Klima:
         Temperature:
           Temperature ^ESPEasy_Sauna_Klima$:^Temperature:
       Sauna_Temperatur_TTS_test:
         Temperature:
           max        ^Sauna_Temperatur_TTS_test$:^max:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') >= 90
     1          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') >= 80
     2          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') >= 70
     3          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') >= 60
     4          ::ReadingValDoIf($hash,'Sauna_Temperatur_TTS_test','Temperature') < 40
   devices:
     0           Sauna_Temperatur_TTS_test
     1           Sauna_Temperatur_TTS_test
     2           Sauna_Temperatur_TTS_test
     3           Sauna_Temperatur_TTS_test
     4           Sauna_Temperatur_TTS_test
     all         Sauna_Temperatur_TTS_test
   do:
     0:
       0          set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading Sauna_Temperatur_TTS_test max say [$EVENT]
     1:
       0          set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading Sauna_Temperatur_TTS_test max say [$EVENT]
     2:
       0          set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading Sauna_Temperatur_TTS_test max say [$EVENT]
     3:
       0          set MyTTS volume 60, set MyTTS tts die Temperatur in der Sauna beträgt aktuell [ESPEasy_Sauna_Klima:Temperature] Grad Celsius bei [ESPEasy_Sauna_Klima:Humidity] Prozent Luftfeuchtigkeit,setreading Sauna_Temperatur_TTS_test max say [$EVENT]
     4:
       0          setreading Sauna_Temperatur_TTS_test max [$EVENT]
     5:
   helper:
     DOIF_Readings_events
     event      checkall
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   
     timerevent cmd_nr: 5,cmd: 5,cmd_event: set_cmd_5,error: setreading Sauna_Temperatur_TTS_test max : 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.
,cmd_5
     triggerDev Sauna_Temperatur_TTS_test
     DOIF_eventas:
       cmd_nr: 5
       cmd: 5
       cmd_event: set_cmd_5
       error: setreading Sauna_Temperatur_TTS_test max : 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_5
     timerevents:
       cmd_nr: 5
       cmd: 5
       cmd_event: set_cmd_5
       error: setreading Sauna_Temperatur_TTS_test max : 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.

       cmd_5
       Device: Sauna_Temperatur_TTS_test
     timereventsState:
       cmd_nr: 5
       cmd: 5
       cmd_event: set_cmd_5
       error: setreading Sauna_Temperatur_TTS_test max : 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_5
     triggerEvents:
       checkall
       Device: Sauna_Temperatur_TTS_test
     triggerEventsState:
       checkall
       Device: Sauna_Temperatur_TTS_test
   internals:
   itimer:
   readings:
     0           Sauna_Temperatur_TTS_test:Temperature
     1           Sauna_Temperatur_TTS_test:Temperature
     2           Sauna_Temperatur_TTS_test:Temperature
     3           Sauna_Temperatur_TTS_test:Temperature
     4           Sauna_Temperatur_TTS_test:Temperature
     all         Sauna_Temperatur_TTS_test:Temperature
   trigger:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings Temperature:([ESPEasy_Sauna_Klima:Temperature] > [$SELF:max] ? [ESPEasy_Sauna_Klima:Temperature] : 40)
   alias      tts Sauna Temperatur Test
   room       00 Schneider
   verbose    3
Titel: Antw:DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Damian am 27 November 2018, 20:17:47
Ich würde einen anderen Ansatz wählen:

defmod di_sauna DOIF init {$_grenze=90;;$_erreicht=0}\
{\
if ($_erreicht and [ESPEasy_Sauna_Klima:Temperature] < $_grenze){\
  $_grenze-=10;;\
  if ($_grenze==30){$_grenze=90};;\
  $_erreicht=0;;\
}\
if (!$_erreicht and [ESPEasy_Sauna_Klima:Temperature] > $_grenze) {\
  fhem_set"MyTTS volume 60";;\
  fhem_set"MyTTS tts die Temperatur in der Sauna beträgt aktuell".[?ESPEasy_Sauna_Klima:Temperature]."Grad Celsius bei". [?ESPEasy_Sauna_Klima:Humidity]."Prozent Luftfeuchtigkeit";;\
  $_erreicht=1;;\
}\
}


ohne Attribute.
Titel: Antw:DOIF bei erreichen von mehreren Temperaturen
Beitrag von: Per am 28 November 2018, 12:38:54
statt
setreading Sauna_Temperatur_TTS_test max [$EVENT]
setreading Sauna_Temperatur_TTS_test max $EVENT
:-[