Hi,
Ich wage momentan meine ersten Schritte mit FHEM (ich habe bisher - und werde auch weitere parallel - ein Rademacher DuoFern System über den Homepiloten im Einsatz) und habe da eine Frage die ich nicht wirklich klären konnte:
Ich habe mir u.A. die Seiten zum If durchgelesen und auch auf der wiki seite vom notifiy steht ein Beispiel mit sleep für das zeitverzögerte schalten.
Ich möchte aber, dass wenn ein bestimmtes Reading (in dem Fall der Feuchtigkeitssensor) für mehr als 5 Minuten überschritten ist einen Aktor schalten. Das wäre mit dem sleep soweit mit einem Notify auch machbar. Was ich aber nicht rausfinden konnte (und da mein Jeelink auch noch nicht da ist noch nicht testen konnte) ist, was passiert wenn in den 5 Minuten der Wert wieder unterschritten wird? Für mein Verständniss wird dann doch trotzdem geschaltet, oder?
Das wird im Umkehrschluss nämlich interessanter - ausschalten wenn der Wert für 10 Minuten dauerhaft unter dem Schwellwert bleibt, aber falls der Wert doch wieder überschritten wird doch nicht ausschalten.
Bei der bisherigen Lösung habe ich starre Zeiten die aber teilweise sinnlos sind (daher die Temp/Feuchte Sensoren und FHEM) und gerade in dem "dynamischen" Schalten sehe ich den Vorteil.
Das ganze auf bestimmte Uhrzeiten zu beschränken ist ja kein Problem mit dem if. Aber da stehe ich etwas auf dem Schlauch. Vielleicht kann mir jemand auf die Sprünge helfen?
Viele Grüße
Ich weiß nicht genau was du wann schalten willst ... schau dir mal watchdog + treshold Module an.
https://wiki.fhem.de/wiki/Watchdog (https://wiki.fhem.de/wiki/Watchdog)
Vielen Dank! Das sieht genau nach dem aus was ich suche - auf Watchdog wäre ich da nicht gekommen.
Edit:
Was mir beim rumprobieren mit dem Homepiloten aufgefallen ist: der Watchdog funktioniert nur, wenn der Status über FHEM gesetzt worden ist scheinbar. Ich konnte wie folgt ein "nicht funktionieren" des Watchdogs erzeugen:
FHEM stop
Steckdose anschalten (was es ist sollte ja letztendlich egal sein)
FHEM starten
Deive Status ändert sich korrekt auf on (war vorher off)
ein Watchdog funktioniert jetzt nicht - setze ich off von hand, warte kurz, und dann wieder on von hand dann funktioniert der Watchdog
nimm einfach if und watchdog in einem:
my_threshold DOIF ([mein_sensor]>[mein_schwellenwert])(set bla on)
attr my_threshold wait 600
SORRY wenn ich das hier kaper aber das ist genau mein Unverständnis :(
@Damian
in deinem Beispiel wird der Timer gestartet wenn der schwellenwert drüber ist, ist der drunter wird der Timer wieder gelöscht ?
Das funktioniert doch aber nur wenn nur EINE Bedingung im DOIF existiert ?
Sobald ich das um Bedingung- en erweitere wird der Timer NICHT gelöscht oder ?
In solchem Falle mit DOELSE abfangen ?
my_threshold DOIF ([mein_sensor]>[mein_schwellenwert])(set bla on)
DOELSEIF ([mein_zweiter_sensor]>[mein_schwellenwert])(set blup on)
DOELSE
attr my_threshold wait 600:600
LG
Tom
So ganz bin ich auch noch nicht dahinter gestiegen, teste das gerade mit Rollo/Licht
define di_TEST_Rollo1 DOIF ([Rollo1] < 21 and ![?00:00-08:45])(set Licht1:FILTER=STATE!=off off)
attr di_TEST_Rollo1 wait 10
bewirkt aber nicht, dass das Licht ausgeschaltet wird, falls es an ist. Ich habe auch schon die einfachere Variante probiert:
define di_TEST_Rollo1 DOIF ([Rollo1] < 21)(set Licht1 off)
attr di_TEST_Rollo1 wait 10
Ich hab auch schon mit den diversen Wiki Einträgen zum DOIF rumgespielt, aber ich finde einfach keinen Grund warum nix passiert?! Gestern hatte ich es einmal, allerdings ist das DOIF nur einmal ausgeführt worden und dann verschwunden...
Edit:
Ich habe es zumindest teilweise hinbekommen - ich habe gedacht, dass das DOIF mit dem Uhrzeit-Teil and ![?00:00-08:45] ausgeführt wird wenn es NACH 08:45 ist und Rollo1 dann kleiner 21 ist (ohne, dass sich nach 08:45 etwas am state ändert) - das ist aber nicht der Fall. Das DOIF funktioniert auch nur wenn eine Änderung da ist...
Hintergrund:
Ich hatte bisher ein selbstgeschriebenes Script laufen, dass die Werte regelmäßig geprüft hat und dann wenn es nach 08:45 war und der Schwellwert unterschritten war die Aktion ausgelöst hat. Das habe ich bisher mit dem DOIF nicht abgeblidet bekommen weil es nur bei einem state-change aktiv wird bei mir
Moin JMC
Na verschwunden wird es nicht sein, ausser Du hast nicht save gedrueckt und neu gestartet. Wenn Du allerdings keinen Raum angegeben hast, dann wuerde ich mal bei everything oder unsorted nachsehen, da findest du dann so alles! Und eventuell auch den Grund warum es nicht geht, da mehrmals etwas Aehnliches angelegt wurde!?
Gruss Christoph
Hi Christoph,
Danke für deinen Hinweis - ich hatte eigentlich nicht neugestartet, bekomme es aber auch nicht reproduziert. Siehe mein edit gerade eben - ich bin da auch etwas einem "Denkfehler" aufgesessen bzgl. DOIF und werde mir jetzt mal at anschauen das ich wohl parallel benutzen muss um das was mein altes Bash script bisher gemacht hat komplett abbilden zu können.
Viele Grüße
Hallo JMC
Ich denke, dass DOIF alles kann!Momentan wuerde ich sagen, hast du das Problem, dass Du eventuell falsch denkst. Das DOIF von Dir kommt ja nur in den anderen State, wenn Rollo1 >=21 ist. Die Uhrzeit muss nur erfuellt sein, triggert aber nicht. (BTW: ![?00:00-08:45] ist doch gleich [?08:46-23:59] oder?) Und dementsprechend wird Dein set auch nur bei einem Wechsel von Rollo1 ausgefuehrt. Wenn Du Licht1 auch noch brauchst, dann musst du das mit abfragen!
Gruss Christoph
Hi Christoph,
klingt interessant - da habe ich dann wohl tatsächlich einen Denkfehler drin. Vielleicht probiere ich es mal weiter aufzudröseln:
Licht1 soll abhängig von Rollo1 geschaltet werden. Wenn Rollo1 unter 20% ist und es nach 08:45 ist dann soll Licht1 ausgeschaltet werden, ansonsten soll Licht1 eingeschaltet werden.
Passiert das ganze NACH 08:45 ist das auch kein problem, der state change von Rollo1 triggert das DOIF.
Jetzt gibt es aber den Fall, dass Rollo1 vor 08:45 auf 0 gefahren wird (Licht1 ist seit dem Vortag an da es beim runterfahren des Rollo1 eingeschaltet worden ist), dann passiert um 08:45 nichts weil das DOIF nicht getriggert wird. Ergo bleibt Licht1 eingeschaltet obwohl Rollo1 bei 0% ist und es z.B. 08:50 ist.
An welcher Stelle müsste ich denn da Licht1 mit abfragen? Mein (bis auf die oben geschriebene Problematik) funktionierende Variante sieht so aus:
define di_TEST_Rollo1 DOIF ([Rollo1] <= 20 and ![?00:00-08:45])(set Licht1:FILTER=STATE!=off off) DOELSEIF ([Rollo1] > 20)(set Licht1:FILTER=STATE!=on on)
attr di_TEST_Rollo1 wait 65:65
Viele Grüße
Peter
Hallo Peter
Momentan sehe ich das so, dass Du eigentlich die Unterdrueckung des Uhrzeittriggers wegnehmen koenntest. Dann wuerde eine Aenderung der Uhrzeit das Schalten bewirken, sofern Rollo1 kleiner 20 ist. Interessant finde ich , dass du das Licht immer an machst, sobald das Rollo groesser 20 ist!
Gruss Christoph
Hallo Christoph,
Das liegt daran, dass es kein Licht im eigentlichen Sinne ist. An dem Aktor ist ein Licht angeschlossen das auf Helligkeit reagiert - das soll es aber erst ausserhalb der Zeiten machen.
Wenn ich die Unterdrückung der Uhrzeit rausnehme dann würde ja auch eine Änderung z.B. um 07:30 ja bewirken, dass sofort das Licht ausgeschaltet wird. Das soll ja nicht passieren, sondern frühstens um 08:45?
Viele Grüße
Peter
Hallo Peter
Nein, durch das Fragezeichen schaltest du den Trigger aus. Die Bedingung bleibt, so oder so!
Gruss Christoph
DOIF ([Rollo1] <= 20 and ![00:00-08:45])(set Licht1:FILTER=STATE!=off off)
DOELSEIF ([Rollo1] > 20)(set Licht1:FILTER=STATE!=on on)
Hi Christoph,
Schande über mein Haupt...
[?<Auslöserangabe>] Auslöser, die mit Fragezeichen beginnen lösen nicht aus, sie werden nur abgefragt
Ich habe das ? rausgenommen - aber geschaltet wird trotzdem nicht anhand der Uhrzeit ohne dass das Rollo bewegt wird.
Viele Grüße
Peter
Hallo Peter
Wie lange hast du denn gewartet? Und wo war dein DOIF gerade? Mach doch mal ein LIST!
Gruss Christoph
Hi,
Das ist jetzt mein DOIF
define di_TEST_Rollo1 DOIF ([Rollo1] <= 20 and [08:46-23:59])(set Licht1:FILTER=STATE!=off off) DOELSEIF ([Rollo1] > 20)(set Licht1:FILTER=STATE!=on on)
(ich habe die negierung des Zeitraums schon geändert weil ich gedacht habe, dass es daran vielleicht liegt)
Und das ein LIST
Internals:
DEF ([Rollo1] <= 20 and [08:46-23:59])(set Licht1:FILTER=STATE!=off off) DOELSEIF ([Rollo1] > 20)(set Licht1:FILTER=STATE!=on on)
NAME di_TEST_Rollo1
NR 58
NTFY_ORDER 50-di_TEST_Rollo1
STATE cmd_1
TYPE DOIF
READINGS:
2017-07-12 14:06:31 Device Rollo1
2017-07-12 12:07:26 cmd 1
2017-07-12 12:07:26 cmd_event Rollo1
2017-07-12 12:07:26 cmd_nr 1
2017-07-12 14:06:31 e_Rollo1_STATE 0
2017-07-12 12:07:26 state cmd_1
2017-07-12 14:15:46 timer_01_c01 13.07.2017 08:46:00
2017-07-12 14:15:46 timer_02_c01 12.07.2017 23:59:00
2017-07-12 14:15:46 wait_timer no timer
condition:
0 InternalDoIf($hash,'Rollo1','STATE') <= 20 and DOIF_time($hash,0,1,$wday,$hms)
1 InternalDoIf($hash,'Rollo1','STATE') > 20
days:
devices:
0 Rollo1
1 Rollo1
all Rollo1
do:
0:
0 set Licht1:FILTER=STATE!=off off
1:
0 set Licht1:FILTER=STATE!=on on
2:
helper:
globalinit 1
last_timer 2
sleeptimer -1
internals:
0 Rollo1:STATE
1 Rollo1:STATE
all Rollo1:STATE
interval:
0 -1
1 0
itimer:
localtime:
0 1499928360
1 1499896740
realtime:
0 08:46:00
1 23:59:00
regexp:
all:
state:
STATE:
time:
0 08:46:00
1 23:59:00
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
triggertime:
1499896740:
localtime 1499896740
hash:
1499928360:
localtime 1499928360
hash:
Attributes:
room 1
wait 65:65
Ok
Fuer meine Begriffe bist du im cmd1, also "off"! Du kannst das doch jetzt gar nicht testen! Wenn Du das Rollo (>20) bewegst, geht es in on, und wenn es wieder kleiner wird triggert es auch wieder! ausser du stellst jetzt ein Fragezeichen vor das erste Rollo1, zum Test!
Gruss Christoph
Die Lampe1 ist aber "on" - und soll jetzt auf "off" geschaltet werden. Es ist zwischen 08:46 und 23:59 und das Roll1 ist bei 0 - warum schaltet das DOIF denn dann nicht? Klar würde es schalten wenn ich das Rollo1 bewege, aber es geht ja explizit um den Fall, dass es nicht bewegt wird und nur die Uhrzeit das cmd_1 auslösen soll
????
Wenn Du im cmd1-State bist, dann kommt er da nicht noch einmal hin!
Kannst du bei Deinem DOIF mal set cmd2 machen? Und dann warten!
Gruss Christoph
Selbst wenn ich ihn auf cmd2 setze passiert nix - ich hab jetzt über 5 Minuten gewartet. Passieren tut aber ohne ein fahren des Rollos nix :(
Hallo Peter
Ich habe es gerade auch mal ausprobiert. Anscheinend triggert eine Zeitspanne nicht! In der commendref finde ich das leider auch nicht richtig beschrieben! Da Damian schon mal hier war wird er sich bestimmt noch mal melden!
Seltsam ist, dass ich das bei mir zu Hause definitiv per Fragezeichen ausgeschaltet habe, da mir das Probleme bereitet hat!
Gruss Christoph
Hallo
So jetzt habe ich es doch gefunden. Es wird nur zum Beginn und zum Ende getriggert! Aber auch das wuerde ja bei Deinem Fall funktionieren! Rollo kleiner 20, und dann wird um 8:45 ausgeschaltet! Wenn Du das fragezeichen weglaesst!
Gruss Christoph
Hi Christoph,
vielen Dank für dein testen! Damit hätte ich in der Tat eine Lösung die dann um 08:45 schalten würde. Wenn ich dann später hingehe und noch dran schalte passiert dann wieder nix. Daher habe ich mir jetzt mit at was gebastelt das nicht nur fest um 08:45 triggert sondern auch jederzeit danach wenn ich den Status geändert habe.
Viele Grüße
Aber wenn Du dran schaltest, dann greift doch der Rollo1-trigger!?
Nur wenn ich über FHEM schalte, nicht wenn ich über den Taster am Aktor selber schalte - dann bekommt FHEM den neuen Wert zwar mit, löst aber kein DOIF aus. Wenn ich den Zustand über FHEM ändere wird auch das DOIF sofort mit ausgelöst.
Was nicht heißen soll, dass der Fehler im DOIF ist, der sitzt mit Sicherheit vor dem Bildschirm und bekommt es nur nicht richtig hin.
define di_TEST_Rollo1 DOIF ([Rollo1] <= 20 and [Licht1] eq "on" and ![00:00-08:45])(set Licht1:FILTER=STATE=on off) DOELSEIF ([Rollo1] > 20)(set Licht1:FILTER=STATE=off on)
Ich hatte jetzt schon Licht1 mit in die IF Bedingung genommen, darum funktioniert es vermutlich auch wenn es vom FHEM aus geschaltet wird. Aber es gibt da halt auch Taster ausserhalb die auch funktionieren sollten.
Zitat von: Damian am 11 Juli 2017, 19:41:23
nimm einfach if und watchdog in einem:
my_threshold DOIF ([mein_sensor]>[mein_schwellenwert])(set bla on)
attr my_threshold wait 600
Hi,
was bei mir aber nicht klappt ist das wenn sich der Wert in den 600 ändert (also wieder unter den Schwellwert geht) der Befehl NICHT ausgeführt wird:
([Steckdose2:merker] eq "1" and [Thermo2:humidity] >= 55 and [Steckdose2] eq "off")(set Steckdose2 on) DOELSEIF ([Steckdose2:merker] eq "1" and [Thermo2:humidity] <= 48 and [Steckdose2] eq "on")(set Steckdose2 off) DOELSEIF ([Steckdose2:merker] eq "0" and [?Steckdose2] eq "on")(set Steckdose2 off)
Als wait habe ich 300:600:600
Den merker setze ich morgens spätestens zu einer gewissen Uhrzeit (oder beim ersten anschalten über den Taster am Aktor) und abends nehme ich ihn je nach Tag zu bestimmten Zeiten weg - das ist auch kein Problem.
Ich hatte eben für humidity einen Wert von 49, habe dann per setreading "manuell" zum testen ein reading von 56 gesetzt. Daraufhin hat das von mir definierte wait angefangen (300 Sekunden) - während der 300 Sekunden kam aber der "echte" humidity Wert von 49 zurück und so wie ich das DOIF verstanden hatte sollte ja dann die Ausführung des Befehls (bzw der wait timer) abgebrochen werden, oder? Oder habe ich da mal wieder nur was verpeilt?
Viele Grüße