DOIF ..... Ich brauch ein zweites Paar Augen :)

Begonnen von Gast45, 09 November 2019, 15:18:22

Vorheriges Thema - Nächstes Thema

Gast45

Hallo zusammen,

ich habe ein DOIF gebastelt. Zwischen 8 und 22 Uhr soll von Oktober bis April alle 20 Minuten, wenn ich zuhause bin für 5 Minuten eine Steckdose eingeschaltet werden, wenn entweder Temperatur unter 19 Grad oder Luftfeuchte über 50%.

([08:00-22:00,+:20] and ( $month <= 4 || $month >= 10) and [?HomeStatus]==1 and ([?Sensor:temperature] < 19 or [?Sensor:humidity] > 50))
(set Steckdose on-for-timer 300)


Leider scheint es mir so, als schaltet dieses DOIF pauschal alle 20 Minuten. Kann bitte mal jemand drüber schauen, ob da ein Syntax-Patzer drin ist. Ich finde nichts. :(

Eine Abfrage in der Eingabezeile
{[Sensor:temperature]}
liefert mir nur unerklärlich
syntax error at (eval 3903) line 1, near "Sensor:"
Meist liegt der Fehler vor der Tastatur

Otto123

Hi,

mach doch mal bitte ein list vom device.

Deine Abfrage geht nicht weil der set magic Code nur im DOIF und im set geht.  Du musst in der Kommandzeile {Readingsval("Sensor","temperature","")}nehmen. Aber die Werte siehst Du auch im DOIF

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Gast45

Ich hatte mich an ein Beispiel in der CommandRef angelehnt:

define di_heating DOIF ([sens:temperature] < 20) (set heating on)

Aber ich glaube ich habe vielleicht doch mehr Funktion, als gedacht. Habe mich mit den Vergleichswerten selbst veräppelt. Zumindest hat es 40 Minuten gedauert, bis geschaltet wurde, also ein Zyklus ausgesetzt. List mache ich aber gleich mal..... :)
Meist liegt der Fehler vor der Tastatur

Gast45

Internals:
   CFGFN     
   DEF       
([08:00-22:00,+:20] and ( $month <= 4 || $month >= 10) and [?HomeStatus]==1 and ([?Sensor:temperature] < 19 or [?Sensor:humidity] > 60))
(set Steckdose on-for-timer 300)
   FUUID      5dc6b7bf-f33f-8257-5820-5595cd94896491e2
   MODEL      FHEM
   NAME       di_test
   NOTIFYDEV  global
   NR         182
   NTFY_ORDER 50-di_test
   STATE      initialized
   TYPE       DOIF
   VERSION    20423 2019-10-29 18:50:08
   READINGS:
     2019-11-09 15:41:08   cmd             0
     2019-11-09 15:41:08   mode            enabled
     2019-11-09 15:41:08   state           initialized
     2019-11-09 15:41:08   timer_01_c01    10.11.2019 08:00:00
     2019-11-09 15:41:08   timer_02_c01    09.11.2019 22:00:00
     2019-11-09 15:41:08   timer_03_c01    09.11.2019 16:00:00
   Regex:
     accu:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and ( $month <= 4 || $month >= 10) and ::InternalDoIf($hash,'HomeStatus','STATE')==1 and (::ReadingValDoIf($hash,'Sensor','temperature') < 19 or ::ReadingValDoIf($hash,'Sensor','humidity') > 60)
   days:
   do:
     0:
       0          set Steckdose on-for-timer 300
     1:
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     globalinit 1
     last_timer 3
     sleeptimer -1
   internals:
     all         HomeStatus:STATE
   interval:
     0          -1
     1          0
   intervalfunc:
     2          ::DOIF_time($hash,0,1,$wday,$hms)
   intervaltimer:
     0          2
     1          2
   localtime:
     0          1573369200
     1          1573333200
     2          1573311600
   realtime:
     0          08:00:00
     1          22:00:00
     2          16:00:00
   time:
     0          08:00:00
     1          22:00:00
     2          +:20
   timeCond:
     0          0
     1          0
     2          0
   timer:
     0          0
     1          0
     2          0
   timers:
     0           0  1  2
   triggertime:
     1573311600:
       localtime  1573311600
       hash:
     1573333200:
       localtime  1573333200
       hash:
     1573369200:
       localtime  1573369200
       hash:
   uiState:
   uiTable:
Attributes:
Meist liegt der Fehler vor der Tastatur

Otto123

Ich denke es ist ok?
Mit der Abfrage ? sieht man die Werte so nicht im DOIF, hatte ich nicht dran gedacht.
Geht jetzt so?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Gast45

Ja, danke trotzdem.
Ich habe jetzt mal ein paar Zyklen genauer verfolgt. Passt soweit alles. Das vermeintliche Problem war das Essen auf dem Herd, wodurch die Luftfeuchte schneller hoch ging. Hätte ich ja mal dran denken können :D
Meist liegt der Fehler vor der Tastatur

Damian

wenn du alle 20 Minuten eine Wiederholung haben willst, dann wirst du noch das do always Attribut setzen müssen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Gast45

Das "do always" (und natürlich "do resetwait" und gar keine Auswahl)  habe ich in der Tat noch nicht verstanden.
Auch hier habe ich mich an der COmmandRef orientiert:
ZitatBei der Angabe von zyklisch sendenden Sensoren (Temperatur, Feuchtigkeit, Helligkeit usw.) wie z. B.:

define di_heating DOIF ([sens:temperature] < 20) (set heating on)

ist die Nutzung des Attributes do always nicht sinnvoll, da das entsprechende Kommando hier: "set heating on" jedes mal ausgeführt wird, wenn der Temperatursensor in regelmäßigen Abständen eine Temperatur unter 20 Grad sendet. Ohne do always wird hier dagegen erst wieder "set heating on" ausgeführt, wenn der Zustand des Moduls auf "cmd_2" gewechselt hat, also die Temperatur zwischendurch größer oder gleich 20 Grad war.


Meist liegt der Fehler vor der Tastatur

amenomade

Da Du aber ein Fragezeichen vor den anderen Bedingungen hast, wird es nur geprüft, aber nicht getriggert. Der einzige Trigger wird die Zeitbedingung sein. Die willst Du aber doch regelmässig wiederholen
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Gast45

ZitatDa Du aber ein Fragezeichen vor den anderen Bedingungen hast, wird es nur geprüft, aber nicht getriggert. Der einzige Trigger wird die Zeitbedingung sein. Die willst Du aber doch regelmässig wiederholen

Also ich möchte, dass alle 20 Minuten bei Anwesenheit und ("zu kalt" oder "zu feucht") zeitweise eine Einschaltung erfolgt. Der Code macht es eigentlich genau wie ich will. Deshalb habe ich ja so Probleme "do always" und "do resetwait" und "kein do" zu verstehen :)
Meist liegt der Fehler vor der Tastatur

amenomade

Das wird aber meiner Meinung nach ohne do always nicht funktionieren, wenn die 5 Minuten Einschalten nicht reichen, um die Temperatur und die Feuchtigkeit wieder auf den gewünschten Werte zu bringen.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

Ich versuch es mal:
Der Beispielcode schaltet mit do always jedesmal wieder die Heizung ein wenn es immer noch unter 20 Grad ist, egal ob sie schon an ist oder nicht. Das ist nicht sinnvoll.

Du willst doch alle 20 min den Lüfter anmachen, auch wenn es beim ersten mal nichts gebracht hat? Also Die Luftfeuchte war über 50%, sie ist nach dem on-for-timer 300 immer noch über 50% also ändert sich nichts und Du willst nach 20 min wieder für 300 sec lüften.

Wenn Dein Lüften immer erfolgreich ist (Bedingung kippt) dann läuft Dein Code ohne do always.
Wenn nicht geht der Lüfter nie wieder an.

Edit: Ich habe wieder zuviel geschrieben  ::)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Gast45

ZitatDer Beispielcode schaltet mit do always jedesmal wieder die Heizung ein wenn es immer noch unter 20 Grad ist, egal ob sie schon an ist oder nicht. Das ist nicht sinnvoll.
Mit "jedesmal wieder" meinst du nach den nächsten 20 Minuten? Weil die Zeit ist ja mein einziger Trigger des DOIF.

ZitatDu willst doch alle 20 min den Lüfter anmachen, auch wenn es beim ersten mal nichts gebracht hat? Also Die Luftfeuchte war über 50%, sie ist nach dem on-for-timer 300 immer noch über 50% also ändert sich nichts und Du willst nach 20 min wieder für 300 sec lüften.
Ja, so soll es im Prinzip sein: alle 20 Minuten prüfen und wenn die Bedingungen erfüllt sind, dann schalten.

ZitatWenn Dein Lüften immer erfolgreich ist (Bedingung kippt) dann läuft Dein Code ohne do always. Wenn nicht geht der Lüfter nie wieder an.
Ahhh -- ja, bei mir ist es in der momentanen Konstellation definitiv immer erfolgreich :)
Meist liegt der Fehler vor der Tastatur

Otto123

Zitat von: Gast45 am 09 November 2019, 19:41:23
Mit "jedesmal wieder" meinst du nach den nächsten 20 Minuten? Weil die Zeit ist ja mein einziger Trigger des DOIF.
Naja in dem Commandref Beispiel ist es der Sensor, der alle xx minuten/sec sendet. Bei Dir ist es die Zeit, richtig.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz