FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Mellowback am 09 August 2020, 16:43:24

Titel: Wenn Temperatur erreicht dann schalten
Beitrag von: Mellowback am 09 August 2020, 16:43:24
Hallo zusammen,

ich möchte das bei zwei Temperaturen geschalten wird, leider funktioniert es nicht.
Was ist falsch ?


define  SolarHeizungssteuerung DOIF ([04:00-20:00] and [TemperatursensorSolar_T1:temperature] > 71.5) (set Solarheizung on;; sleep 5400;; set Solarheizung off) DOELSEIF ([TemperatursensorSolar_T1:temperature] < 48) (set Solarheizung off)


Vorab Danke für die Hilfe
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Otto123 am 09 August 2020, 16:56:28
Hi,

Du solltest dazu besser ein list SolarHeizungssteuerung  liefern, da sieht man mehr.

Den waittimer sollest Du entweder mit on-for-timer machen, oder wenn das Gerät das nicht unterstützt mit dem wait attribute, in etwa so:
define  SolarHeizungssteuerung DOIF ([04:00-20:00] and [TemperatursensorSolar_T1:temperature] > 71.5) (set Solarheizung on)(set Solarheizung off) DOELSEIF ([TemperatursensorSolar_T1:temperature] < 48) (set Solarheizung off)
attr SolarHeizungssteuerung wait 0,5400:0


Gruß Otto
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Mellowback am 09 August 2020, 18:25:21
Hallo Otto,

hier das Ergebnis aus dem List:



Internals:
   DEF        ([04:00-20:00] and [TemperatursensorSolar_T1:temperature] > 71.5) (set Solarheizung on; sleep 5400; set Solarheizung off) DOELSEIF ([TemperatursensorSolar_T1:temperature] < 48) (set Solarheizung off)
   FUUID      5ec13e64-f33f-2b59-0b95-a7fe451e5817b7f8
   MODEL      FHEM
   NAME       SolarHeizungssteuerung
   NOTIFYDEV  global,TemperatursensorSolar_T1
   NR         571
   NTFY_ORDER 50-SolarHeizungssteuerung
   STATE      cmd_1
   TYPE       DOIF
   VERSION    22195 2020-06-18 16:38:55
   READINGS:
     2020-08-09 18:21:26   Device          TemperatursensorSolar_T1
     2020-08-08 15:52:56   cmd             1
     2020-08-08 15:52:56   cmd_event       TemperatursensorSolar_T1
     2020-08-08 15:52:56   cmd_nr          1
     2020-08-09 18:21:26   e_TemperatursensorSolar_T1_temperature 71.4
     2020-08-08 15:48:50   mode            enabled
     2020-08-08 15:52:56   state           cmd_1
     2020-08-09 03:01:40   timer_01_c01    09.08.2020 04:00:00
     2020-08-09 03:01:40   timer_02_c01    09.08.2020 20:00:00
   Regex:
     accu:
     cond:
       TemperatursensorSolar_T1:
         0:
           temperature ^TemperatursensorSolar_T1$:^temperature:
         1:
           temperature ^TemperatursensorSolar_T1$:^temperature:
   attr:
     waitdel:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'TemperatursensorSolar_T1','temperature') > 71.5
     1          ::ReadingValDoIf($hash,'TemperatursensorSolar_T1','temperature') < 48
   days:
   do:
     0:
       0          set Solarheizung on; sleep 5400; set Solarheizung off
     1:
       0          set Solarheizung off
     2:
   helper:
     DEVFILTER  ^global$|^TemperatursensorSolar_T1$
     NOTIFYDEV  global|TemperatursensorSolar_T1
     event      T: 71.4,temperature: 71.4
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   TemperatursensorSolar_T1
     timerevent T: 71.7,temperature: 71.7
     triggerDev TemperatursensorSolar_T1
     timerevents:
       T: 71.7
       temperature: 71.7
     timereventsState:
       state: T: 71.7
       temperature: 71.7
     triggerEvents:
       T: 71.4
       temperature: 71.4
     triggerEventsState:
       state: T: 71.4
       temperature: 71.4
   internals:
   interval:
     0          -1
     1          0
   intervalfunc:
   intervaltimer:
   localtime:
     0          1596938400
     1          1596996000
   perlblock:
   readings:
     all         TemperatursensorSolar_T1:temperature
   realtime:
     0          04:00:00
     1          20:00:00
   time:
     0          04:00:00
     1          20:00:00
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   trigger:
   triggertime:
     1596996000:
       localtime  1596996000
       hash:
   uiTable:

Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: amenomade am 09 August 2020, 20:03:18
Mit
(set Solarheizung on, sleep 5400; set Solarheizung off)
sollte es funktionieren
Aber die Lösung von Otto ist besser
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Mellowback am 09 August 2020, 21:15:04
Hatte das Ganze auch ohne sleep probiert, also nur set Solarheizung on, hat auch nur bedingt funktioniert.
Was komisch ist, wenn ich def ändere also beispielsweise eine andere Temperatur hinterlege, funktioniert es.
Am nächsten Tag funktioniert es nicht mehr.
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: amenomade am 09 August 2020, 21:29:33
Dir fehlt wahrscheinlich ein attr do always.
Ich vermute dein Ding geht im Moment nur wenn inzwischen die Temperatur unter 48 kommt, weil das eine Statusänderung verursacht.

Du hast leider das Attributes Teil vom "list" gekürzt
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Deckoffizier am 09 August 2020, 21:29:55
Hallo,

eventuell attr do always ?

Mfg

Hans-Jürgen
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Mellowback am 09 August 2020, 21:41:20
Was meint ihr mit do always ?
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: amenomade am 09 August 2020, 21:59:20
Entweder Attribut do always (siehe CommandRef)
Oder ein leeres DOELSE (siehe auch CommandRef).

Das 2. wäre sogar mMn hier besser.

https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Damian am 09 August 2020, 22:03:29
do always ist bei zyklisch sendenden Sensoren hier TemperatursensorSolar_T1:temperature "verboten"
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Mellowback am 09 August 2020, 22:05:13
Was empfiehlst du Damian ?
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: amenomade am 09 August 2020, 22:17:02
Bin nicht Damian, aber:
bei zyklisch sendenden Sensoren wie Temperatursensoren führt ein do always dazu, dass bei jeder Temperaturänderung wiederum ein Befehl, hier "set Solarheizung on", geschickt wird. Das ist in meisten Fällen nicht gewünscht, deswegen sagt er "verboten".


Ich empfehle:

1 - CommandRef lesen, um zu verstehen wie ein DOIF funktioniert. Mindestens den von mir verlinkten Absatz, wo die Thematik "do always und DOELSE" erklärt wird.

2 - leeres DOELSE
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Mellowback am 22 August 2020, 17:13:14
Habe nochmal verschiedene Dinge probiert allerdings ohne Erfolg.
Kann es sein das ich genau das EVENT mit 71.5 benötige damit geschalten wird ?

Evntuell gibt es auch ein anderen Lösungsansatz für das was ich hier umsetzen möchte.
Würde mich freuen wenn Ihr mir etwas postet.

Danke
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: amenomade am 22 August 2020, 18:09:53
Zitat von: Mellowback am 22 August 2020, 17:13:14
Kann es sein das ich genau das EVENT mit 71.5 benötige damit geschalten wird ?
Nein, du brauchst nur ein leeres DOELSE.
Wenn das nicht geht, bitte erklären was nicht geht, und "list" vom DOIF im "falschen" Zustand posten
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Mellowback am 23 August 2020, 14:20:52
Ab 71.5 grad soll die Pumpe eingeschaltet werden. Leider schaltet er nicht obwohl schon 75 grad und mehr.



Internals:
   DEF        ([04:00-20:00] and [TemperatursensorSolar_T1:Temperature] > 71) (set Solarheizung on) DOELSEIF ([TemperatursensorSolar_T1:Temperature] < 48) (set Solarheizung off)
   FUUID      5ec13e64-f33f-2b59-0b95-a7fe451e5817b7f8
   MODEL      FHEM
   NAME       SolarHeizungssteuerung
   NOTIFYDEV  TemperatursensorSolar_T1,global
   NR         570
   NTFY_ORDER 50-SolarHeizungssteuerung
   STATE      initialized
   TYPE       DOIF
   VERSION    22588 2020-08-12 19:25:15
   READINGS:
     2020-08-22 17:39:49   cmd             0
     2020-08-22 17:39:49   mode            enabled
     2020-08-22 17:39:49   state           initialized
     2020-08-23 03:01:17   timer_01_c01    23.08.2020 04:00:00
     2020-08-23 03:01:17   timer_02_c01    23.08.2020 20:00:00
     2020-08-23 04:00:00   warning         condition c01: Argument "" isn't numeric in numeric gt (>)

   Regex:
     accu:
     cond:
       TemperatursensorSolar_T1:
         0:
           Temperature ^TemperatursensorSolar_T1$:^Temperature:
         1:
           Temperature ^TemperatursensorSolar_T1$:^Temperature:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'TemperatursensorSolar_T1','Temperature') > 71
     1          ::ReadingValDoIf($hash,'TemperatursensorSolar_T1','Temperature') < 48
   days:
   do:
     0:
       0          set Solarheizung on
     1:
       0          set Solarheizung off
     2:
   helper:
     DEVFILTER  ^global$|^TemperatursensorSolar_T1$
     NOTIFYDEV  global|TemperatursensorSolar_T1
     event      timer_1
     globalinit 1
     last_timer 2
     sleeptimer -1
     triggerDev
     triggerEvents:
       timer_1
     triggerEventsState:
       timer_1
   interval:
     0          -1
     1          0
   intervalfunc:
   intervaltimer:
   localtime:
     0          1598148000
     1          1598205600
   perlblock:
   readings:
     all         TemperatursensorSolar_T1:Temperature
   realtime:
     0          04:00:00
     1          20:00:00
   time:
     0          04:00:00
     1          20:00:00
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   triggertime:
     1598205600:
       localtime  1598205600
       hash:
   uiTable:
Attributes:

Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: amenomade am 23 August 2020, 18:05:24
Zitat     2020-08-23 04:00:00   warning         condition c01: Argument "" isn't numeric in numeric gt (>)

[TemperatursensorSolar_T1:Temperature] liefert keinen Wert. Schreibfehler? Klein/gross Buchstaben Problem? Wenn ich mit deinem ersten "list" vergleiche, war temperature klein geschrieben, jetzt gross.

Ich sehe immer noch kein leeres DOELSE
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Mellowback am 23 August 2020, 18:19:29
Ok habe wieder temperature klein geschrieben.
Ergebnis:



Internals:
   DEF        ([04:00-20:00] and [TemperatursensorSolar_T1:temperature] > 71) (set Solarheizung on) DOELSEIF ([TemperatursensorSolar_T1:temperature] < 48) (set Solarheizung off)
   FUUID      5ec13e64-f33f-2b59-0b95-a7fe451e5817b7f8
   MODEL      FHEM
   NAME       SolarHeizungssteuerung
   NOTIFYDEV  TemperatursensorSolar_T1,global
   NR         570
   NTFY_ORDER 50-SolarHeizungssteuerung
   STATE      initialized
   TYPE       DOIF
   VERSION    22588 2020-08-12 19:25:15
   READINGS:
     2020-08-23 18:15:08   cmd             0
     2020-08-23 18:15:08   mode            enabled
     2020-08-23 18:15:08   state           initialized
     2020-08-23 18:15:08   timer_01_c01    24.08.2020 04:00:00
     2020-08-23 18:15:08   timer_02_c01    23.08.2020 20:00:00
   Regex:
     accu:
     cond:
       TemperatursensorSolar_T1:
         0:
           temperature ^TemperatursensorSolar_T1$:^temperature:
         1:
           temperature ^TemperatursensorSolar_T1$:^temperature:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'TemperatursensorSolar_T1','temperature') > 71
     1          ::ReadingValDoIf($hash,'TemperatursensorSolar_T1','temperature') < 48
   days:
   do:
     0:
       0          set Solarheizung on
     1:
       0          set Solarheizung off
     2:
   helper:
     DEVFILTER  ^global$|^TemperatursensorSolar_T1$
     NOTIFYDEV  global|TemperatursensorSolar_T1
     globalinit 1
     last_timer 2
     sleeptimer -1
   interval:
     0          -1
     1          0
   intervalfunc:
   localtime:
     0          1598234400
     1          1598205600
   readings:
     all         TemperatursensorSolar_T1:temperature
   realtime:
     0          04:00:00
     1          20:00:00
   time:
     0          04:00:00
     1          20:00:00
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   triggertime:
     1598205600:
       localtime  1598205600
       hash:
     1598234400:
       localtime  1598234400
       hash:
   uiTable:
Attributes:
   room       Technikraum



Meinst du ich soll aus dem DOELSEIF ein DOELSE machen ?
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: amenomade am 23 August 2020, 18:53:44
Nein, ich meine Du schreibst noch ein DOELSE danach am Ende.
Aber er sollte zumindest das erste Mal schalten. Zeig mal bitte ein "list TemperatursensorSolar_T1"
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Mellowback am 23 August 2020, 19:10:09
List schaut wie folgt aus:



Internals:
   DEF        6C27E501
   FUUID      5eb7ae51-f33f-2b59-6429-12cd166abc9566ee
   NAME       TemperatursensorSolar_T1
   NOTIFYDEV  global
   NR         564
   NTFY_ORDER 50-TemperatursensorSolar_T1
   STATE      Temperatur: 52.8 °C
   TYPE       CUL_HM
   chanNo     01
   device     TemperatursensorSolar
   READINGS:
     2020-08-23 19:06:21   state           T: 52.8
     2020-08-23 19:06:21   temperature     52.8
   helper:
     peerFriend
     peerOpt    p:THSensor
     regLst     
     cmds:
       TmplKey    :no:1598144476.02832
       TmplTs     1598144476.02832
       cmdKey     1:0:0::TemperatursensorSolar:00A8:01:
       cmdLst:
         burstXmit  noArg
         clear      [(readings|trigger|register|oldRegs|rssi|msgEvents|{msgErrors}|attack|all)]
         getConfig  noArg
         getRegRaw  (List0|List1|List2|List3|List4|List5|List6) [-peerChn-]
         peerBulk   -peer1,peer2,..- [({set}|unset)]
         peerChan   0 -actChn- [({single})] [({set}|unset)] [actor|remote|both]
         regBulk    -list-.-peerChn- -addr1:data1- -addr2:data2-...
         regSet     [(prep|{exec})] -regName- -value- [-peerChn-]
         tplDel     -tplDel-
       lst:
         condition  slider,0,1,255
         peer       
         peerOpt   
         tplDel     
       rtrvLst:
         cmdList    [({short}|long)]
         deviceInfo [({short}|long)]
         param      -param-
         reg        -addr- -list- [-peerChn-]
         regList    noArg
         regTable   noArg
         regVal     -addr- -list- [-peerChn-]
         saveConfig [-filename-]
         tplInfo    noArg
     expert:
       def        1
       det        0
       raw        1
       tpl        0
     role:
       chn        1
     tmpl:
Attributes:
   model      HM-WDS30-OT2-SM
   peerIDs    00000000,
   room       Homekit,Technikraum
   stateFormat Temperatur: temperature °C



Wie würde der Code mit dem DOELSE dann ausschauen ?
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Otto123 am 23 August 2020, 19:24:14
Für heute wird doch die Zeit nicht mehr wahr?
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: amenomade am 23 August 2020, 19:57:42
Wie gesagt, einfach DOELSE am Ende

Vorher:
([04:00-20:00] and [TemperatursensorSolar_T1:temperature] > 71) (set Solarheizung on) DOELSEIF ([TemperatursensorSolar_T1:temperature] < 48) (set Solarheizung off)


Nachher:
([04:00-20:00] and [TemperatursensorSolar_T1:temperature] > 71) (set Solarheizung on) DOELSEIF ([TemperatursensorSolar_T1:temperature] < 48) (set Solarheizung off) DOELSE


Zitat von: Otto123 am 23 August 2020, 19:24:14
Für heute wird doch die Zeit nicht mehr wahr?
Klar, timer01_c01 liegt in der Zukunft. Das ist aber nur der nächste Trigger, und er sollte trotzdem schalten, wenn temperatur sich meldet.
Temperatur ist aber im Moment zwischen 71 und 48. Dann ist nichts wahr, und ohne DOELSE geht er nicht in cmd_3
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Otto123 am 23 August 2020, 20:04:38
Zitat von: amenomade am 23 August 2020, 19:57:42
er sollte trotzdem schalten, wenn temperatur sich meldet.
Das wundert mich auch, ich sehe keinen Temperaturtriggerevent e_TemperatursensorSolar_T1_temperature!
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Mellowback am 23 August 2020, 20:27:03
Also haben wir doch kein Event ?
Ich werde morgen den Wert auf 61 setzen und Euch Feedback ob morgen geschalten wurde.

Danke
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Otto123 am 23 August 2020, 20:29:33
Der Sensor meldet per default ca. alle  2,5 min. Also Eventmonitor auf und Du weißt in 2,5 min Bescheid!  :o
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Mellowback am 23 August 2020, 20:45:25
Scheint zu passen, siehe Bild.
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: amenomade am 23 August 2020, 21:43:16
Jepp, alles ok jetzt. (ein "list" ist immer besser als ein Bild)
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Damian am 23 August 2020, 23:30:27
Die aktuelle Definition ist nicht 100% sauber. Mit DOELSE wird bei 71 und 48 Grad ggf. zwischen zwei Zuständen getoggelt. Wann soll genau Off-Befehl außerhalb der Zeitspanne kommen?
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Mellowback am 23 August 2020, 23:31:49
Außerhalb der Zeit soll garnicht geschalten werden.
Titel: Antw:Wenn Temperatur erreicht dann schalten
Beitrag von: Damian am 23 August 2020, 23:38:26
Zitat von: Mellowback am 23 August 2020, 23:31:49
Außerhalb der Zeit soll garnicht geschalten werden.
Wird aber unter 48 Grad.