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:"
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
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..... :)
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:
Ich denke es ist ok?
Mit der Abfrage ? sieht man die Werte so nicht im DOIF, hatte ich nicht dran gedacht.
Geht jetzt so?
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
wenn du alle 20 Minuten eine Wiederholung haben willst, dann wirst du noch das do always Attribut setzen müssen.
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.
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
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 :)
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.
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
Zitat von: Otto123 am 09 November 2019, 19:23:54
Edit: Ich habe wieder zuviel geschrieben ::)
Ja,... aber auf besserem Deutsch ;)
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 :)
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.
Genau das war mein Wunsch, einfach im zeitlichen Raster prüfen.
Das Beispiel der CommandRef hatte ich nur dafür herangezogen, wie die korrekte Syntax bei der Abfrage der Readings ist.
Für DOIF könnte man echt 2-tägige Schulungen anbieten :D
Zitat von: Gast45 am 09 November 2019, 19:57:10
Für DOIF könnte man echt 2-tägige Schulungen anbieten :D
Ob, das mal reicht? :)