Zitat von: hexenmeister am 21 Mai 2014, 20:53:31Ja, plus Zeitsteuerung und watchdog-Funktionalität.
Ist wohl das, wofür ich zuerst dein IF Modul gehalten habe. Klingt interessant.
Zitat von: hexenmeister am 21 Mai 2014, 22:45:19
Wird IMHO sehr nürzlich sein.
Interessant ist natürlich, wie hoch der Ressourcenverbrauch sein wird.
Gutes Gelingen!
Grüße,
Alexander
ZitatDen wirst du nicht messen könnenDas ist gut! 8)
Zitat von: Invers am 24 Mai 2014, 10:30:06
Ist mindestens so revolutionär wie Dashboard. Das wird unheimlich viele Dinge vereinfachen.
Ich erinnere mich noch an die Diskussion zum IF-Modul. Spätestens jetzt, durch die daraus entstandene Weiterentwicklung, ist der Nutzen (den ich nie angezweifelt habe) bewiesen.
Ist natürlich nur meine persönliche Meinung als Laie. Aber ich bin trotzdem begeistert und freue mich drauf.
ZitatSo ist das oft im Leben: gäbe es IF nicht, würde es DOIF auch nicht geben, denn den ganzen Parsermechanismus kann ich weitgehend übernehmen und dieser ist nicht trivial zu programmieren.Warum lagerst Du den Code, der in beiden Module gebraucht wird nicht in ein eigenes Modul aus?
Zitat von: Bennemannc am 26 Mai 2014, 19:30:19
Hallo Damian,
Warum lagerst Du den Code, der in beiden Module gebraucht wird nicht in ein eigenes Modul aus?
Das würde die Sache strukturierter machen und das ausgelagerte Modul könnte auch von anderen Programmierern genutzt werden.
Gruß Christoph
define DI_Rollo_Licht DOIF ([06:25] and !$we and [Helligkeit] eq "off")
(set Lampeflur on, set Lampekueche on)
DOELSEIF((([Helligkeit] eq "on" and $hms gt "06:25") or [08:00]) and !$we)
((set R_W_S,R_W_W[1-3] on), sleep 900, set Wandleuchten_W off, sleep 1,set Lampekueche off, set Lampeflur off)
DOELSEIF ([Helligkeit] eq "off")
((set Lampekueche,Lampeflur on), sleep 1800, (set R_W_S,R_W_W[1-3] off))
DOELSEIF ([23:00])
(set Lampekueche off)
DOELSEIF ([23:30])
(set Lampeflur off)
define DI_Kuehlschrank DOIF ([TMP_Kuehl:temperature] >= 7.5) (set Kuehlschrank on) DOELSEIF ([TMP_Kuehl:temperature] <= 6.5) (set Kuehlschrank off)
Zitat von: kkoeniger am 25 Juni 2014, 12:38:11
Hatte ich auf der Befehlszeile eingegeben bzw dann bei den Internals weitergearbeitet.
In der config sieht es wie folgt aus, wobei nach dem DOIF anstelle der wetterstation stehen sollte [netatmo_M02:00:00:01:38:78:temperature] :
define DI_markise DOIF ([wetterstation:temperature] > 20 and ($hms gt "11:15" and $hms lt "18:35" and !$we)) (set markiese 70) DOELSEIF\
([wetterstation:rain] > 0 or [wetterstation:windSpeed] > 10) (set markiese off) DOELSE\
(set markiese off)
Zitat von: Invers am 25 Juni 2014, 10:20:52
DI_Kuehlschrank cmd_3, was ist das?
Wäre es nicht übersichtlicher, die Schaltbedingung anzuzeigen?
Also statt DI_Kuehlschrank cmd_1 - Anzeige = 7.5
DI_Kuehlschrank cmd_2 - Anzeige = 6.5
Oder ist da jetzt von mir was falsch interpretiert worden?
Zitatcmd_3 ist bei dir der imaginäre DOELSE-Fall (dritter Fall bei dir), den du nicht definiert hast, dieser wird auch angezeigt - steht so in der Doku.
Zitat von: Invers am 25 Juni 2014, 15:50:16
Meinst du mit Doku den Post 1? oder hab ich was verschlafen?
Ansonsten verstanden, danke.
Zitat von: kkoeniger am 25 Juni 2014, 16:26:55
Sorry - wieder der Lästige ;)
Jedesmal wenn ich händische Änderungen an der fhem.cfg (natürlich an anderer Stelle) vornehme, sind die DOIF-Defines in Fehm verschwunden. Fehlermeldung zB nach einem rereadcfg:
"0
DI_qion DOIF: unknown reading: strommess:energy
Please define DI_qion first
Please define DI_qion first
Please define DI_qion first
Please define DI_qion first
Please define DI_qion first
Please define DI_qion first
Please define DI_qion first
DI_markise DOIF: unknown reading: netatmo_ter:temperature
Please define DI_markise first
Please define DI_markise first
Please define DI_markise first
Please define DI_markise first
Please define DI_markise first
Please define DI_markise first
Please define DI_markise first "
Auch nach einem shutdown+restart oder einem reboot meines Raspi sind die Defines verschwunden.
Zitat von: kkoeniger am 25 Juni 2014, 16:50:28Wenn du in deiner fhem.cfg dein DOIF Modul an der falschen Stelle einfügst, nämlich bevor die Devices definiert werden, dann wirst du das Problem immer haben.
Scheint aber nicht unbedingt etwas damit zu tun haben, wenn die Fehler auch nach einem Reboot auftauchen.
Zitat von: kkoeniger am 26 Juni 2014, 08:58:38
Auch nach einem neuerlichen Eingeben des define (im room unsorted zu sehen) mit anschließendem Save config in der fhem-Befehlszeile ist das Modul DOIF nicht aufgelistet:
Gleiches übrigens nach einem reload 98_DOIF.pm (und ja, fhem ist owner des Moduls).
Konklusio für mich: auch wenn ich die fhem.cfg nicht berühre, erhalte ich Fehlermeldungen und das define verschwindet.
### 25.06.2014 ##############
define DI_qion DOIF ([kkathome] eq "zu Hause" and [strommess:energy] > 300)(set WZLeiste_Socket_3 on) DOELSEIF ([kkathome] eq "ausser Haus")(set WZLeiste_Socket_3 off) DOELSEIF ([strommess:energy] <= 300)(set WZLeiste_Socket_3 off) DOELSE (set WZLeiste_Socket_3 off)
attr DI_qion alias Qi-Lader auto
attr DI_qion cmdState zu Hause -> ein|weg -> aus|wenig PV -> aus|off (warum?)
attr DI_qion do always
attr DI_qion group Stecker
attr DI_qion icon audio_repeat
attr DI_qion room WZ
attr DI_qion wait 60:60:60:60
Zitat von: kkoeniger am 26 Juni 2014, 12:48:48
nach shutdown restart:
Error messages while initializing FHEM:
configfile: 0
DI_qion DOIF: unknown reading: strommess:energy
Please define DI_qion first
Please define DI_qion first
Please define DI_qion first
Please define DI_qion first
Please define DI_qion first
Please define DI_qion first
Please define DI_qion first"
So wie ich das jetzt interpretiere, findet FHEM das Modul 98_DOIF.pm einfach nicht, obwohl fhem der owner ist und das Oktal 666. Das Modul selbst hatte ich schon wiederholt ins directory kopiert.
Ich überlege jetzt weiter, wie ich das beheben kann.
attr strommess userReadings energy {ReadingsVal("Solar","AC.Power.Fast",0) - ReadingsVal("pvliefer","electricityPower",0) + ReadingsVal("strombezug","electricityPower",0);;;;}, energyToday {ReadingsVal("Solar","Daily.Energy",0) - ReadingsVal("pvliefer","electricityConsumedToday_kWh",0) + ReadingsVal("strombezug","electricityConsumedToday_kWh",0);;;;}
ZitatIch kenne nicht die programmierten FHEM-Abläufe bei der Auswertung der fhem.cfg...
define DI_Rolladen DOIF ([Sensor:temperature] > 26 and $hms gt "11:00" and $hms lt sunset_abs()) (set Rollo runter) DOELSE (set Rollo hoch)
attr DI_Rolladen wait 900:900
Zitat von: rudolfkoenig am 27 Juni 2014, 08:47:16
Oder man verwendet die FILTER (http://fhem.de/commandref.html#devspec) Funktion der devspec :)
2014.06.27 09:52:20.666 1: define DI_Kuehlschrank DI_Kuehlschrank DOIF ([TMP_Kuehl:temperature] >= 7.5) (set Kuehlschrank on) DOELSEIF ([TMP_Kuehl:temperature] <= 6.5) (set Kuehlschrank off): DI_Kuehlschrank DOIF: unknown reading: TMP_Kuehl:temperature
2014.06.27 09:52:20.700 1: define DI_Links_Auto_AnAus DI_Links_Auto_AnAus DOIF ([BM_Aussen:brightness] <170 and [BinIchDa] eq "present")(set Links on) DOELSEIF ([BM_Aussen:brightness] >169 and [BinIchDa] eq "present")(set Links off): DI_Links_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
2014.06.27 09:52:20.735 1: define DI_Lampe_Korridor_Auto_AnAus DI_Lampe_Korridor_Auto_AnAus DOIF ([BM_Aussen:brightness] <165 and [BinIchDa] eq "present")(set Lampe_Korridor on) DOELSEIF ([BM_Aussen:brightness] >164 and [BinIchDa] eq "present")(set Lampe_Korridor off): DI_Lampe_Korridor_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
2014.06.27 09:52:20.769 1: define DI_TVLICHT_hinten_Auto_AnAus DI_TVLICHT_hinten_Auto_AnAus DOIF ([BM_Aussen:brightness] <133 and [BinIchDa] eq "present")(set TVLICHT_hinten on) DOELSEIF ([BM_Aussen:brightness] >132 and [BinIchDa] eq "present")(set TVLICHT_hinten off): DI_TVLICHT_hinten_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
2014.06.27 09:52:20.805 1: define DI_TVLICHT_vorne_Auto_AnAus DI_TVLICHT_vorne_Auto_AnAus DOIF ([BM_Aussen:brightness] <124 and [BinIchDa] eq "present")(set TVLICHT_vorne on) DOELSEIF ([BM_Aussen:brightness] >123 and [BinIchDa] eq "present")(set TVLICHT_vorne off): DI_TVLICHT_vorne_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
2014.06.27 09:52:20.836 1: Including ./log/fhem.save
2014.06.27 09:52:21.883 1: configfile: DI_Kuehlschrank DOIF: unknown reading: TMP_Kuehl:temperature
Please define DI_Kuehlschrank first
Please define DI_Kuehlschrank first
DI_Links_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
Please define DI_Links_Auto_AnAus first
Please define DI_Links_Auto_AnAus first
DI_Lampe_Korridor_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
Please define DI_Lampe_Korridor_Auto_AnAus first
Please define DI_Lampe_Korridor_Auto_AnAus first
DI_TVLICHT_hinten_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
Please define DI_TVLICHT_hinten_Auto_AnAus first
Please define DI_TVLICHT_hinten_Auto_AnAus first
DI_TVLICHT_vorne_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
Please define DI_TVLICHT_vorne_Auto_AnAus first
Please define DI_TVLICHT_vorne_Auto_AnAus first
2014.06.27 09:52:22.034 0: Server started with 179 defined entities (version $Id: fhem.pl 6080 2014-06-07 16:12:09Z rudolfkoenig $, os linux, user root, pid 1744)
2014.06.27 09:52:22.285 1: HMLAN_Parse: HMLAN new condition ok
define DI_qion DOIF ([kkathome] eq "zu Hause" and [Solar:AC.Power] > 300) (set WZLeiste_Socket_3 on) DOELSEIF ([kkathome] eq "ausser Haus")(set WZLeiste_Socket_3 off) DOELSEIF ([Solar:AC.Power] <= 300) (set WZLeiste_Socket_3 off) DOELSE (set WZLeiste_Socket_3 off)
Zitat von: kkoeniger am 27 Juni 2014, 10:57:08
Beim nachstehenden defineCode Auswählendefine DI_qion DOIF ([kkathome] eq "zu Hause" and [Solar:AC.Power] > 300) (set WZLeiste_Socket_3 on) DOELSEIF ([kkathome] eq "ausser Haus")(set WZLeiste_Socket_3 off) DOELSEIF ([Solar:AC.Power] <= 300) (set WZLeiste_Socket_3 off) DOELSE (set WZLeiste_Socket_3 off)
erhalte ich schon bei der Definition Fehler:
"ERROR:
0 DI_qion DOIF: unknown reading: Solar:AC.Power Please define DI_qion first Please define DI_qion first Please define DI_qion first Please define DI_qion first Please define DI_qion first Please define DI_qion first Please define DI_qion first"
Kann es sein, dass der "." im reading "AC.Power" die Ursache ist? Das reading ist vom device, kann es daher nicht ändern.
Zitat von: Invers am 27 Juni 2014, 09:56:16
Bisher lief alles mehrere Tage einwandfrei, auch nach diversen Neustarts der Box und auch von fhem.
Habe seit heutigem fhem-Update folgende Fehlermeldungen beim shutdown/restart :Code Auswählen2014.06.27 09:52:20.666 1: define DI_Kuehlschrank DI_Kuehlschrank DOIF ([TMP_Kuehl:temperature] >= 7.5) (set Kuehlschrank on) DOELSEIF ([TMP_Kuehl:temperature] <= 6.5) (set Kuehlschrank off): DI_Kuehlschrank DOIF: unknown reading: TMP_Kuehl:temperature
2014.06.27 09:52:20.700 1: define DI_Links_Auto_AnAus DI_Links_Auto_AnAus DOIF ([BM_Aussen:brightness] <170 and [BinIchDa] eq "present")(set Links on) DOELSEIF ([BM_Aussen:brightness] >169 and [BinIchDa] eq "present")(set Links off): DI_Links_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
2014.06.27 09:52:20.735 1: define DI_Lampe_Korridor_Auto_AnAus DI_Lampe_Korridor_Auto_AnAus DOIF ([BM_Aussen:brightness] <165 and [BinIchDa] eq "present")(set Lampe_Korridor on) DOELSEIF ([BM_Aussen:brightness] >164 and [BinIchDa] eq "present")(set Lampe_Korridor off): DI_Lampe_Korridor_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
2014.06.27 09:52:20.769 1: define DI_TVLICHT_hinten_Auto_AnAus DI_TVLICHT_hinten_Auto_AnAus DOIF ([BM_Aussen:brightness] <133 and [BinIchDa] eq "present")(set TVLICHT_hinten on) DOELSEIF ([BM_Aussen:brightness] >132 and [BinIchDa] eq "present")(set TVLICHT_hinten off): DI_TVLICHT_hinten_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
2014.06.27 09:52:20.805 1: define DI_TVLICHT_vorne_Auto_AnAus DI_TVLICHT_vorne_Auto_AnAus DOIF ([BM_Aussen:brightness] <124 and [BinIchDa] eq "present")(set TVLICHT_vorne on) DOELSEIF ([BM_Aussen:brightness] >123 and [BinIchDa] eq "present")(set TVLICHT_vorne off): DI_TVLICHT_vorne_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
2014.06.27 09:52:20.836 1: Including ./log/fhem.save
2014.06.27 09:52:21.883 1: configfile: DI_Kuehlschrank DOIF: unknown reading: TMP_Kuehl:temperature
Please define DI_Kuehlschrank first
Please define DI_Kuehlschrank first
DI_Links_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
Please define DI_Links_Auto_AnAus first
Please define DI_Links_Auto_AnAus first
DI_Lampe_Korridor_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
Please define DI_Lampe_Korridor_Auto_AnAus first
Please define DI_Lampe_Korridor_Auto_AnAus first
DI_TVLICHT_hinten_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
Please define DI_TVLICHT_hinten_Auto_AnAus first
Please define DI_TVLICHT_hinten_Auto_AnAus first
DI_TVLICHT_vorne_Auto_AnAus DOIF: unknown reading: BM_Aussen:brightness
Please define DI_TVLICHT_vorne_Auto_AnAus first
Please define DI_TVLICHT_vorne_Auto_AnAus first
2014.06.27 09:52:22.034 0: Server started with 179 defined entities (version $Id: fhem.pl 6080 2014-06-07 16:12:09Z rudolfkoenig $, os linux, user root, pid 1744)
2014.06.27 09:52:22.285 1: HMLAN_Parse: HMLAN new condition ok
Was kann ich tun?
Zitat von: rudolfkoenig am 27 Juni 2014, 08:47:16
Oder man verwendet die FILTER (http://fhem.de/commandref.html#devspec) Funktion der devspec :)
Zitat von: Klaus Rubik am 27 Juni 2014, 13:58:22
Hallo Damian,
ab wann planst du das Modul mittels update zur Verfügung zu stellen?
Viele Grüße
klaus
Zitat von: cwagner am 27 Juni 2014, 15:03:44
Hallo Damian,
danke - sen-sa-tio-nell!!
Einziger Nachteil: Ich fürchte, ein zwei Thresholds entfallen, die ich gebaut hatte, um andere Thresholds ereignisgesteuert zu verändern und dadurch hole ich Dich dann doch nicht in der Threshold-Nutzung ein. Und bei DOIF bin ich ja erst bei einem... :-)
Wirklich großartig, was Du zu FHEM beiträgst.
Christian
Zitat von: Damian am 27 Juni 2014, 15:10:33
Und es sollte natürlich ein allgemeines Interesse für ein Modul da sein, bevor man es eincheckt.
define DI_sz_Jalousie DOIF ([MeinWetter:temp_c] > 20 and [myTwilight:compasspoint] =~ m/south/i and ([MeinWetter:condition] eq "sonnig" or [MeinWetter:condition] eq "heiter" or [MeinWetter:condition] =~ m/klar or [MeinWetter:condition] eq "teilweise wolkig")) (set sz_Jalousie 20) DOELSEIF ([myTwilight:compasspoint] eq "west") (set sz_Jalousie on)
Zitat von: Bombjack am 28 Juni 2014, 21:32:09
Das Modul ist klasse, aber ich bekomm´s nicht hin :-\ Ziel ist eine automatische Beschattung auf der Südseite, das Rollo soll bei Temperaturen > 20, lt. Twilight Compasspoint Sonne im Süden und einigen Wetter Conditions auf 20% herunterfahren, dann wieder hoch wenn die Sonne im Westen steht.
Mit folgendem Code ist die Jalousie vorhin auf 20% runtergefahren:Code Auswählendefine DI_sz_Jalousie DOIF ([MeinWetter:temp_c] > 20 and [myTwilight:compasspoint] =~ m/south/i and ([MeinWetter:condition] eq "sonnig" or [MeinWetter:condition] eq "heiter" or [MeinWetter:condition] =~ m/klar or [MeinWetter:condition] eq "teilweise wolkig")) (set sz_Jalousie 20) DOELSEIF ([myTwilight:compasspoint] eq "west") (set sz_Jalousie on)
Jetzt haben wir allerdings nach 21 Uhr und folgende Readings sind aktuell: temp_c = 15, compasspoint = west-northwest, condition = Nieselregen. Warum um alles in der Welt löst die Bedingung aus?
Zitat von: Bombjack am 28 Juni 2014, 22:08:59
Nein, das ist ja das seltsame. Das Rollo ist einige Minuten nach dem define (vermutlich als Yahoo Wetter aktualisiert wurde) auf 20% gefahren, Status war cmd_1.
Zitat von: Bombjack am 28 Juni 2014, 22:26:45
Da es sich um unser Schlafzimmmer Rollo handelt, habe ich das DOIF jetzt erstmal wieder rausnehmen müssen. Sonst gibt´s gleich Ärger mit meiner Frau ;) Ich probier das morgen nochmal und gebe dann Feedback.
Ich fange ja gerade erst an mit FHEM und PERL, ist der DOIF Ausdruck für das beschriebene Ziel denn grundsätzlich in Ordnung? Das die zweite Bedingung nur bei einem Twilight Event auslöst, ist schon okay denke ich. Das Rollo soll ja einfach nur wieder hoch wenn die Sonne im Westen steht und nicht unten stehen bleiben.
ZitatDas sollte für die Problemstellung kein Problem sein. Nach deiner Definition kann der Rolladen nicht unten sein, weil nach deiner Aussage z. Zt. compasspoint gleich "west-northwest" und nicht gleich "west" ist und für den DOELSE-Fall hast du nichts definiert.
2014.06.28 21:10:58 3: CUL_HM set sz_Jalousie 20
ZitatTesten kannst du übrigens immer zuerst an Aktoren (Dummys oder Lampen), die mit deiner Frau nicht kollidieren :)
Zitat von: Bombjack am 28 Juni 2014, 23:04:39
Kann ich das DOIF Modul irgendwie dazu bewegen einige Statusmeldungen auszugeben, insbesondere welche Readings verarbeitet werden wenn ein Event feuert?
Zitatkommt beim nächsten größeren Update :)
Internals
CFGFN
DEF
([MeinWetter:temp_c] > 20 and [myTwilight:compasspoint] =~ m/south/i and ([MeinWetter:condition] eq "sonnig" or [MeinWetter:condition] eq "heiter" or [MeinWetter:condition] =~ m/klar or [MeinWetter:condition] eq "teilweise wolkig")) (set DI_dummy 20) DOELSEIF ([myTwilight:compasspoint] eq "west") (set DI_dummy on)
NAME
DI_set_dummy
NR
99
NTFY_ORDER
50-DI_set_dummy
STATE
cmd_1
TYPE
DOIF
Readings
state
cmd_1
2014-06-28 23:18:47
Zitat von: Bombjack am 28 Juni 2014, 23:26:09
Klingt gut :)
Also, das mit dem Dummy habe ich hinbekommen. Gleiches Problem wie vorher: Nach dem ersten Twilight Event ist der DOIF Status cmd_1, wie kann denn das sein bei den Bedingungen?Code AuswählenInternals
CFGFN
DEF
([MeinWetter:temp_c] > 20 and [myTwilight:compasspoint] =~ m/south/i and ([MeinWetter:condition] eq "sonnig" or [MeinWetter:condition] eq "heiter" or [MeinWetter:condition] =~ m/klar or [MeinWetter:condition] eq "teilweise wolkig")) (set DI_dummy 20) DOELSEIF ([myTwilight:compasspoint] eq "west") (set DI_dummy on)
NAME
DI_set_dummy
NR
99
NTFY_ORDER
50-DI_set_dummy
STATE
cmd_1
TYPE
DOIF
Readings
state
cmd_1
2014-06-28 23:18:47
ZitatDu kannst die erste Bedingung bis auf eine oder zwei Abfragen reduzieren und testen und dann immer weiter ausbauen, bis du ein Fehlverhalten feststellst, dann hast du die Fehlerquelle lokalisiert.
Zitat von: Bombjack am 29 Juni 2014, 01:57:07
Und warum wird dadurch der gesamte cmd_1 Block wahr?
Zitat2014.06.28 23:28:22 1: Including fhem.cfg
2014.06.28 23:28:22 3: telnetPort: port 7072 opened
2014.06.28 23:28:25 3: WEB: port 8083 opened
2014.06.28 23:28:25 3: WEBphone: port 8084 opened
2014.06.28 23:28:25 3: WEBtablet: port 8085 opened
2014.06.28 23:28:25 2: eventTypes: loaded 199 events from ./log/eventTypes.txt
2014.06.28 23:28:26 3: Opening CUL_0 device /dev/ttyACM0
2014.06.28 23:28:27 3: Setting CUL_0 baudrate to 38400
2014.06.28 23:28:27 3: CUL_0 device opened
2014.06.28 23:28:27 3: CUL_0: Possible commands: BCFiAZEGMKURTVWXefmltux
2014.06.28 23:28:27 2: Switched CUL_0 rfmode to HomeMatic
2014.06.28 23:28:35 1: define SonnenschutzAuto SonnenschutzAuto DOIF ([Aussen_Temp:temperature]> 25 and $hms gt "12:00" and $hms lt "17:45") (set WZ_RL_West_links 14%, set WZ_RL_West_mitte 15%,set WZ_RL_West_rechts 15%) DOELSEIF (([Aussen_Temp:temperature]< 24 and $hms gt "12:00" and $hms lt "17:45") or ($hms lt "12:00" or $hms gt "17:45")) (set WZ_RL_West_links on, set WZ_RL_West_mitte on,set WZ_RL_West_rechts on): SonnenschutzAuto DOIF: unknown reading: Aussen_Temp:temperature
2014.06.28 23:28:35 3: Please define SonnenschutzAuto first
2014.06.28 23:28:35 1: Including ./log/fhem.save
2014.06.28 23:28:36 1: configfile: SonnenschutzAuto DOIF: unknown reading: Aussen_Temp:temperature
Please define SonnenschutzAuto first
statefile: Please define SonnenschutzAuto first
Please define SonnenschutzAuto first
2014.06.28 23:28:36 1: usb create starting
2014.06.28 23:28:37 1: usb create end
2014.06.28 23:28:37 2: Error messages while initializing FHEM: configfile: SonnenschutzAuto DOIF: unknown reading: Aussen_Temp:temperature Please define SonnenschutzAuto first statefile: Please define SonnenschutzAuto first Please define SonnenschutzAuto first
2014.06.28 23:28:37 0: Server started with 97 defined entities (version $Id: fhem.pl 6080 2014-06-07 16:12:09Z rudolfkoenig $, os linux, user fhem, pid 2039)
2014.06.28 23:28:39 3: Device Aussen_Temp added to ActionDetector with 000:10 time
Zitat von: AndyOne am 29 Juni 2014, 08:46:00
Hallo Damien,
ich habe auch ein Problem die DOIF Schaltung Rebootsicher zu bekommen. Ich sehe den Eintrag für meinen SonnenschutzAuto in der fhem.cfg wenn ich "Save Config" mache, aber beim Laden gibt es dann doch Fehler und es wird nicht geladen. Gestern hatten wir einen Stromausfall, ich poste mal das Logfile nach dem wir wieder Strom hatten. Den DOIF Befehl musste ich heute aus einer externen Sicherung wieder in die Befehlszeile schreiben.
VG Andy
Zitat von: Bombjack am 29 Juni 2014, 01:57:07regex lernen ! ;)
Ich wollte damit "klar" und "überwiegend klar" abfangen,
=~/.*klar.*/
=~/.*\bklar\b.*/
=~/.*klar$/
ZitatUnd warum wird dadurch der gesamte cmd_1 Block wahr?keene Ahnung, aber ich denke: "input kaputt" (Bedingungen) -> Ergebnis kaputt 8)
Zitatregex lernen ! ;)
( http://www.myregextester.com/ )
([Pac:state] > 1700 and [HZ_Schlafzimmer_Weather:state] > 19.5) (set Klima_SZ off) DOELSE (set Klima_SZ on)
([Klima_WZ:state] eq "on") and ([Pac:state] > 1500 and [HZ_Schlafzimmer_Weather:state] > 19.5) (set Klima_SZ off) DOELSEIF ([Pac:state] > 1700 and [HZ_Schlafzimmer_Weather:state] > 19.5) (set Klima_SZ off) DOELSE (set Klima_SZ on)
([Klima_WZ] eq "on" and [Pac] > 1500 and [HZ_Schlafzimmer_Weather] > 19.5) (set Klima_SZ off) DOELSEIF ([Pac] > 1700 and [HZ_Schlafzimmer_Weather] > 19.5) (set Klima_SZ off) DOELSE (set Klima_SZ on)
2014.06.30 16:52:02.289 1: readingsUpdate(DI_RolloBuero,last_error,no error) missed to call readingsBeginUpdate first.
2014.06.30 16:52:02.288 1: readingsUpdate(DI_RolloBuero,last_cmd_event,RolloBueroT) missed to call readingsBeginUpdate first.
2014.06.30 16:52:02.287 1: readingsUpdate(DI_RolloBuero,last_cmd,2) missed to call readingsBeginUpdate first.
2014.06.30 16:52:02.286 1: readingsUpdate(DI_RolloBuero,state,Sun2) missed to call readingsBeginUpdate first.
Zitat von: Groby am 30 Juni 2014, 17:08:55
Hallo Damian,
ich bekomme mit v1.1 folgende Fehlermeldungen:Code Auswählen
2014.06.30 16:52:02.289 1: readingsUpdate(DI_RolloBuero,last_error,no error) missed to call readingsBeginUpdate first.
2014.06.30 16:52:02.288 1: readingsUpdate(DI_RolloBuero,last_cmd_event,RolloBueroT) missed to call readingsBeginUpdate first.
2014.06.30 16:52:02.287 1: readingsUpdate(DI_RolloBuero,last_cmd,2) missed to call readingsBeginUpdate first.
2014.06.30 16:52:02.286 1: readingsUpdate(DI_RolloBuero,state,Sun2) missed to call readingsBeginUpdate first.
Dabei fällt mir auf, dass "DI_RolloBuero,state,Sun2" eigentlich "DI_RolloBuero,state,sun2" heissen müsste...
MfGroby
$hms ge [Slider_RolloBuero_sun] and $hms le [Slider_RolloBuero_sunset] and [RolloBueroT] eq"on" and [WetterStation:brightness]>=[LX_RolloBuero:lx] and [Buegeln] eq"off") (set RolloBueroT sun,{Log 1, "Triggering DI_RolloSun: sun ".ReadingsVal("WetterStation","brightness","")."(90/72)"}) DOELSEIF
($hms ge [Slider_RolloBuero_sun2] and $hms le [Slider_RolloBuero_sunset] and [RolloBueroT] eq"sun" and [Buegeln] eq"off") (set RolloBueroT sun2,{Log 1, "Triggering DI_RolloSun: sun2 ".ReadingsVal("WetterStation","brightness","")."(90/72)"}) DOELSEIF
($hms ge [Slider_RolloBuero_sun] and $hms le [Slider_RolloBuero_sunset] and [RolloBueroT] ne"on" and [WetterStation:brightness]<=[LX_RolloBuero:lx]/10*8 and [Buegeln] eq"off") (set RolloBueroT on,{Log 1, "Triggering DI_RolloSun: on ".ReadingsVal("WetterStation","brightness","")."(90/72)"}) DOELSEIF
(($hms gt [Slider_RolloBuero_sunset] or [Buegeln] eq"on") and [RolloBueroT] ne"on") (set RolloBueroT on,{Log 1, "Triggering DI_RolloSun: on ".ReadingsVal("WetterStation","brightness","")."(90/72)"}) DOELSE
({Log 1, "Triggering DI_RolloSun: ".ReadingsVal("WetterStation","brightness","")."(90/72)"})
Zitat von: Groby am 30 Juni 2014, 17:08:55
Hallo Damian,
ich bekomme mit v1.1 folgende Fehlermeldungen:Code Auswählen
2014.06.30 16:52:02.289 1: readingsUpdate(DI_RolloBuero,last_error,no error) missed to call readingsBeginUpdate first.
2014.06.30 16:52:02.288 1: readingsUpdate(DI_RolloBuero,last_cmd_event,RolloBueroT) missed to call readingsBeginUpdate first.
2014.06.30 16:52:02.287 1: readingsUpdate(DI_RolloBuero,last_cmd,2) missed to call readingsBeginUpdate first.
2014.06.30 16:52:02.286 1: readingsUpdate(DI_RolloBuero,state,Sun2) missed to call readingsBeginUpdate first.
define eingang_auto DOIF ([00:30] and [keymatic_eingangstuer] eq "unlocked" and &we) (set keymatic_eingangstuer lock)
Zitat von: sentinel1 am 01 Juli 2014, 02:22:34
Hallo Damian,
ich habe eine Frage zu einer def.Code Auswählendefine eingang_auto DOIF ([00:30] and [keymatic_eingangstuer] eq "unlocked" and &we) (set keymatic_eingangstuer lock)
warum steht bei next_timer=02.07.2014 00:30:00 ,ich möchte die Tür am Wochenende um 00:30 abschließen?
Gruß
Claudiu
($hms ge "06:00" and $hms le "08:15" and [Message] eq"0") (set Message 1) DOELSEIF
($hms ge "07:15" and $hms le "08:15" and [Message] eq"1") (set Message 2) DOELSEIF
($hms gt "08:15" and [Message] eq"2") (set Message 0)
Zitatich habe folgendes DI definiert:
Code: [Auswählen]
($hms ge "06:00" and $hms le "08:15" and [Message] eq"0") (set Message 1) DOELSEIF
($hms ge "07:15" and $hms le "08:15" and [Message] eq"1") (set Message 2) DOELSEIF
($hms gt "08:15" and [Message] eq"2") (set Message 0)
Zitat von: Jens_B am 01 Juli 2014, 08:40:38
Du solltest zwischen eq und den Anführungszeichen ein Leerzeichen machen. So wie es auch in den Beispielen gezeigt ist....
attr DI do always
Zitat von: Jens_B am 01 Juli 2014, 09:12:10
na dann ... vielleicht muß dann noch dasCode Auswählenattr DI do always
hinzugefügt werden? Damit auch immer getriggert wird?
Zitat von: Jens_B am 01 Juli 2014, 10:27:35
Hm, die Katze will sich anscheinend nicht selbst in den Schwanz beißen;)
Gesendet von meinem iPhone mit Tapatalk
Zitat von: Groby am 01 Juli 2014, 11:46:02
Nicht ganz, da die einzelnen Bedingungen unterschiedlich sind...
Da [Message] aber Bestandteil aller Bedingungen ist, sollten m.E. die anderen Bedingungen aus diesem DI erneut geprüft werden. Entweder im gleichen Durchgang oder erneut triggern...
define DI DOIF ([t_dummy]==0) (set t_dummy 1) DOELSE (set t_dummy 0)
define no notify t_dummy set t_dummy 1
Zitat von: Damian am 01 Juli 2014, 07:35:57
Zeitangaben werden immer täglich ausgeführt. Diese sind dann aber in Kombination mit anderen Bedingungen (z. B. $we) wahr oder eben nicht.
Es muss aber heißen $we und nicht &we - es ist eine Variable, genauso wie $hms für Zeitabfragen.
Gruß
Damian
Zitat von: Damian am 01 Juli 2014, 12:49:14
Edit: Funktioniert übrigens beim notify genauso, denn bei:Code Auswählendefine no notify t_dummy set t_dummy 1
wird t_dummy nur einmal auf 1 gesetzt, auch hier hättest du sonst schnell einen Endlos-Loop.
define no notify Message:(a) set Message b
Zitat von: Groby am 01 Juli 2014, 13:34:47
ohne entsprechende Filter ja, aber bei:Code Auswählen
define no notify Message:(a) set Message b
Erzeugt ein set Message a über den notify ein set Message b inklusive der beiden Events...
MfGroby
Zitat von: Damian am 01 Juli 2014, 13:39:31
ja, genauso wie beim DOIF wird man Event a und b im Event-Monitor sehen, das selbst erzeugte Event set Message b wird aber nicht mehr beim notify ankommen.
Zitat von: Groby am 01 Juli 2014, 13:50:46
stimmt.
Wirklich schade, denn es wäre das letzte Puzzle für die Rollo Steuerung "All-in-one" gewesen...
2014.06.30 16:52:02.289 1: readingsUpdate(DI_RolloBuero,last_error,no error) missed to call readingsBeginUpdate first.
Zitat von: Damian am 30 Juni 2014, 19:34:10
Sollte nicht mehr kommen: Version 1.2 im ersten Post.
Zitat von: Damian am 01 Juli 2014, 13:52:50
Das sind aber Mechanismen von FHEM, ich glaube nicht, dass sich Rudi auf Rekursionen einlässt. Dann dürfte die Hälfte der FHEM-Installationen loopen.
($hms ge"07:00" and $hms le"16:00" and [Message]eq"0")
(set Message 1,{if(Value("M1")ne""){fhem("delete MI")}},define MI at +00:00:01 trigger Message *) DOELSEIF
($hms ge"12:30" and $hms le"16:00" and [Message]eq"1")
(set Message 2,{if(Value("MI")ne""){fhem("delete MI")}},define MI at +00:00:01 trigger Message *) DOELSEIF
($hms gt"16:00" and [Message]ne"0")
(set Message 0,{if(Value("MI")ne""){fhem("delete MI")}},define MI at +00:00:01 trigger Message *)
2014.07.01 15:28:13.827 4: dummy set Message 0 -> set per cmd line
2014.07.01 15:28:13.915 4: dummy set Message 1 -> set per DOIF
2014.07.01 15:28:14.977 4: dummy set Message 2 -> set per DOIF
Zitat von: Groby am 01 Juli 2014, 15:36:31
Hallo Damian,
ich konnte es nicht lassen. Nicht schön, aber so geht's:Code Auswählen
($hms ge"07:00" and $hms le"16:00" and [Message]eq"0")
(set Message 1,{if(Value("M1")ne""){fhem("delete MI")}},define MI at +00:00:01 trigger Message *) DOELSEIF
(set Message 1,IF ([M1] ne "") (delete MI), define MI at +00:00:01 trigger Message *)
Zitat von: Damian am 01 Juli 2014, 12:49:14
Das selbst verursachte Event kommt beim Modul nicht an.
Womöglich wird so etwas von FHEM unterbunden (muss ich mir noch genau anschauen), ansonsten könnte man schnell Loops bauen derart:
Zitat von: satprofi am 01 Juli 2014, 15:59:34
Wie verhält sich DOIF wenn man statt "and" "or" verwendet?
Könnte man dann DOELSIF weglassen?
Zitat von: Damian am 01 Juli 2014, 15:45:21
Wenn du jetzt die Syntax von DOIF im Schlaf beherrschst, dann kannst du elegant auch den IF-Befehl nutzen :)Code Auswählen(set Message 1,IF ([M1] ne "") (delete MI), define MI at +00:00:01 trigger Message *)
DI_RolloBuero DOIF: unknown Device: M1
2014.07.01 15:10:56.254 3: Garage_timer: unknown attribute Message. Type 'attr Garage_timer ?' for a detailed list. -> hat nichts damit zu tun!!!!
2014.07.01 15:10:16.124 3: M1: unknown attribute Message. Type 'attr MI ?' for a detailed list. -> x.ter DOIF Versuch
Zitat von: satprofi am 01 Juli 2014, 16:59:41
kurze nachfrage bzgl. attr wait 300:300
bedeutet das nach eintreffen eines triggers fix 300sec gewartet wird oder dazwischen trotzdem noch geprüft wird.
beispiel: ein event fällt unter einen wert, jetzt kommt trigger, innerhalb der wartezeit steigt wert aber wieder an, und bedingung wäre weiterhin erfüllt. bleibt dann alles beim alten oder wird trotzdem geschalten?
Zitat von: Groby am 01 Juli 2014, 17:04:45
Damian,
theoretisch ja -> praktisch leider nein:Code Auswählen
DI_RolloBuero DOIF: unknown Device: M1
Außerdem habe ich beim Rumspielen mit "define" ein Problem beim Parsen von DOIF gefunden, sodass ich sogar "shutdown restart" machen musste. Also irgendetwas mit "{}" "()" ";;" usw. muss das ausgelöst haben:Code Auswählen
2014.07.01 15:10:56.254 3: Garage_timer: unknown attribute Message. Type 'attr Garage_timer ?' for a detailed list. -> hat nichts damit zu tun!!!!
2014.07.01 15:10:16.124 3: M1: unknown attribute Message. Type 'attr MI ?' for a detailed list. -> x.ter DOIF Versuch
MfGroby
Zitat von: Damian am 01 Juli 2014, 17:28:03
Wenn die Bedingung für cmd1 wahr wird, dann wird der timer auf 300 Sekunden gesetzt (erste Angabe bei wait), wenn vor dem Ablauf durch einen Trigger wieder cmd1 wahr wird, dann wird timer nicht verlängert. Wenn vor dem Ablauf Bedingung für cmd2 wahr wird, dann wird der Timer für cmd1 gelöscht und der Timer für cmd2 gestartet (zweite Angabe bei wait), falls definiert, wie bei dir, usw. Auf diese Weise lässt das erreichen, was man sonst über watchdog machen würde.
Gruß
Damian
([Heizungsmode] eq "off" and [Pac] > 1500 and [HZ_Wohnzimmer_Weather] > 20 and [Terassentuer] eq "Closed" and $hms gt "10:00" and $hms lt "18:00") (set Klima_WZ off) DOELSEIF ([Heizungsmode] eq "auto" and [Pac] > 1500 and [HZ_Wohnzimmer_Weather] < 24.5 and [Terassentuer] eq "Closed") (set Klima_WZ off) DOELSE (set Klima_WZ on)
Zitat von: Damian am 01 Juli 2014, 17:35:37
Wenn der Parser-Fehler nachvollziehbar ist, dann kann ich erst etwas unternehmen.
Zitat von: satprofi am 01 Juli 2014, 17:43:27
aber es wartet nicht mal die 5 min ab, last_cmd_event Pac 2014-07-01 17:38:37 , und um 17:40 wurde geschalten.
Zitatich habe seit Gestern Abend folgende Fehlermeldung in der FHEM.log
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE $/ at fhem.pl line 3556.
Das einzige was ich Gestern neu gemacht habe war deine Version 1.2. Oder gibt es eine Idee was das sein könnte.
Zitat von: kkoeniger am 02 Juli 2014, 11:06:34
Wenn ich "attr disable 1" setze, so bleibt das letzte State unverändert entsprechend dem last_cmd stehen. Ware es nicht sinnvoller "disabled" anzuzeigen?
Zitat von: Jens_B am 02 Juli 2014, 08:38:30
Das liegt möglicherweise daran, das Du irgendwo in einer oder mehreren Deiner Definitionen für einen regex Ausdruck nur "*" statt ".*" gesetzt hast.
Hat mit dem DOIF Modul zunächst erstmal nicht direkt was zu tun, möchte ich meinen.
Gruß
Jens
([Ueberschuss] > 2000 and $hms gt "08:00" and $hms lt "22:00") (set LED_02 led green) DOELSEIF ([Ueberschuss] < 2000 and $hms gt "08:00" and $hms lt "22:00") (set LED_02 led orange) DOELSEIF ([Ueberschuss] < 100 and $hms gt "08:00" and $hms lt "22:00") (set LED_02 led red) DOELSE (set LED_02 led off)
Zitat von: Damian am 02 Juli 2014, 11:08:51
ja, kommt auf die todo-Liste für´s nächste Release :)
...
Zitat von: satprofi am 02 Juli 2014, 14:44:40
hallo.
wie wird eigentlich eine negative zahl ausgewertet?
habe hier eine < 100 , aber der zustand wird nicht angezeigt, tatsächlicher wert -200 .
ich denke da ist etwas grösseres im argen, weil letzter cmd war < 2000.Code Auswählen
([Ueberschuss] > 2000 and $hms gt "08:00" and $hms lt "22:00") (set LED_02 led green) DOELSEIF ([Ueberschuss] < 2000 and $hms gt "08:00" and $hms lt "22:00") (set LED_02 led orange) DOELSEIF ([Ueberschuss] < 100 and $hms gt "08:00" and $hms lt "22:00") (set LED_02 led red) DOELSE (set LED_02 led off)
[edit]
hallo.
ich habe das ganze mit IF gelöst, DOIF dürfte nicht für solche Probleme optimal sein.
gruss
define Light_ctrl DOIF (LICHT_STATUS eq "Daemmerung" and $hms gt "17:00" and HAUS_STATUS eq "Anwesend")
(set Licht on) DOELSE (set Licht off)
2014.07.02 20:40:50 3: CUL_HM LICHT_TERRASSE_KUECHE repeat, level C8 instead of 00
2014.07.02 20:40:50 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:42:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:42:34 3: CUL_HM set LICHT_TERRASSE_KUECHE on
2014.07.02 20:42:34 3: CUL_HM LICHT_TERRASSE_KUECHE repeat, level C8 instead of 00
2014.07.02 20:42:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:47:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:47:34 3: CUL_HM set LICHT_TERRASSE_KUECHE on
2014.07.02 20:47:34 3: CUL_HM LICHT_TERRASSE_KUECHE repeat, level C8 instead of 00
2014.07.02 20:47:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:52:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:52:34 3: CUL_HM set LICHT_TERRASSE_KUECHE on
2014.07.02 20:52:34 3: CUL_HM LICHT_TERRASSE_KUECHE repeat, level C8 instead of 00
2014.07.02 20:52:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:57:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:57:34 3: CUL_HM set LICHT_TERRASSE_KUECHE on
2014.07.02 20:57:34 3: CUL_HM LICHT_TERRASSE_KUECHE repeat, level C8 instead of 00
2014.07.02 20:57:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 21:02:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 21:02:34 3: CUL_HM set LICHT_TERRASSE_KUECHE on
2014.07.02 21:02:34 3: CUL_HM LICHT_TERRASSE_KUECHE repeat, level C8 instead of 00
2014.07.02 21:02:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 21:07:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 21:07:34 3: CUL_HM set LICHT_TERRASSE_KUECHE on
2014.07.02 21:07:34 3: CUL_HM LICHT_TERRASSE_KUECHE repeat, level C8 instead of 00
2014.07.02 21:07:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
([ROLLLADEN_KUECHE] eq "zu" and [ROLLLADEN_WZ_4] eq "zu") (set LICHT_TERRASSE_KUECHE aus) DOELSEIF ([mytwilight:aktEvent] eq "ss_weather" and $hour > 15) (set LICHT_TERRASSE_KUECHE an) DOELSEIF ([LICHT_TERRASSE_KUECHE] ne "aus") (set LICHT_TERRASSE_KUECHE aus)
Zitat von: Brockmann am 03 Juli 2014, 09:30:33
Ich habe eine grundsätzliche Verständnisfrage zum DOIF.
Ich möchte bei eintretender Dämmerung, aber nicht vor 17:00 Uhr, eine Lampe einschalten, wenn jemand zu Hause ist. Das würde ich nach meinem Verständnis von DOIF so umsetzen:Code Auswählendefine Light_ctrl DOIF (LICHT_STATUS eq "Daemmerung" and $hms gt "17:00" and HAUS_STATUS eq "Anwesend")
(set Licht on) DOELSE (set Licht off)
Was passiert, wenn die Dämmerung schon um 16:30 Uhr eintritt? Die Bedingung $hms gt "17:00" ist da noch nicht erfüllt, also würde korrekterweise nicht geschaltet.
Aber wird dann intern ein Timer gesetzt, der um 17:00:01 Uhr erneut prüft, ob nun alle Bedingungen (noch) erfüllt sind? Oder macht das DOIF in diesem Fall einfach nichts mehr, bis es erneut extern angestossen wird, beispielsweise durch eine Änderung bei HAUS_STATUS?
Oder anders gefragt: Wird die Lampe im 17:00:01 Uhr eingeschaltet, wenn schon vorher Dämmerung eingetreten ist oder bleibt sie aus?
Ich würde eigentlich die erste Variante erwarten. Wenn nicht, wie könnte ich das DOIF in einem solchen Fall anders gestalten, um die gewünschte Funktionalität zu erreichen?
Aus den Beispielen im ersten Post konnte ich das so nicht ableiten.
define Light_ctrl DOIF (([LICHT_STATUS] eq "Daemmerung" or [17:01]) and $hms gt "17:00" and [HAUS_STATUS] eq "Anwesend")
(set Licht on) DOELSE (set Licht off)
Zitat von: Jens_B am 03 Juli 2014, 10:17:53
Ich habe jetzt auch mal eine Frage zu DOIF:
Ich würde gern meine Terrassenbeleuchtung einschalten, wenn twilight im aktevent "ss_weather" hat, und die Beleuchtung soll wieder ausgeschaltet werden, wenn 2 bestimmte Rollladen abends geschlossen werden. Leider funktioniert das nicht so wirklich, weil natürlich das Akt_event sich danach noch wieder ändert...
Wie mache ich es mit DOIF richtig, damit das so funktioniert wie ich es mir vorstelle?
Achja, der Schalter draußen ist ein Homematic.
Gruß
Jens
([mytwilight:aktEvent] eq "ss_weather" and $hms gt "15:00" and [ROLLLADEN_KUECHE] eq "zu" and [ROLLLADEN_WZ_4] eq "zu") (set LICHT_TERRASSE_KUECHE off) DOELSEIF ([mytwilight:aktEvent] eq "ss_weather" and $hms gt "15:00" and [ROLLLADEN_KUECHE] eq "auf" or [ROLLLADEN_WZ_4] eq "auf") (set LICHT_TERRASSE_KUECHE on) DOELSE (set LICHT_TERRASSE_KUECHE off)
Zitat von: Jens_B am 03 Juli 2014, 10:17:53
Ich habe jetzt auch mal eine Frage zu DOIF:
Ich würde gern meine Terrassenbeleuchtung einschalten, wenn twilight im aktevent "ss_weather" hat, und die Beleuchtung soll wieder ausgeschaltet werden, wenn 2 bestimmte Rollladen abends geschlossen werden. Leider funktioniert das nicht so wirklich, weil natürlich das Akt_event sich danach noch wieder ändert... Hm. Im Logfile habe ich zudem dann ziemlich viele Schaltversuche in Bezug auf meine Beleuchtung:
mein Code sieht folgendermaßen aus:Code Auswählen([ROLLLADEN_KUECHE] eq "zu" and [ROLLLADEN_WZ_4] eq "zu") (set LICHT_TERRASSE_KUECHE aus) DOELSEIF ([mytwilight:aktEvent] eq "ss_weather" and $hour > 15) (set LICHT_TERRASSE_KUECHE an) DOELSEIF ([LICHT_TERRASSE_KUECHE] ne "aus") (set LICHT_TERRASSE_KUECHE aus)
Wie mache ich es mit DOIF richtig, damit das so funktioniert wie ich es mir vorstelle?
([mytwilight:aktEvent] eq "ss_weather" and ($hour > 15 or [16:01])) (set LICHT_TERRASSE_KUECHE an) DOELSEIF ([ROLLLADEN_KUECHE] eq "zu" and [ROLLLADEN_WZ_4] eq "zu" and $hour > 15) (set LICHT_TERRASSE_KUECHE aus)
ZitatIch kenne nicht alle Bedingungen, die bei dir in der Realität vorkommen können, daher mal Folgendes unter Vorbehalt:
Code: [Auswählen]
([mytwilight:aktEvent] eq "ss_weather" and ($hour > 15 or [16:01])) (set LICHT_TERRASSE_KUECHE an) DOELSEIF ([ROLLLADEN_KUECHE] eq "zu" and [ROLLLADEN_WZ_4] eq "zu" and $hour > 15) (set LICHT_TERRASSE_KUECHE aus)
Wenn die Rollläden vor 16:00 Uhr schon unten waren, dann passiert hier allerdings nichts.
Du kannst auch im DOELSEIF-Fall noch eine Zeitangabe zum Triggern angeben, wenn du zum Ausschalten des Lichtes auf Nummer sicher gehen willst.
Gruß
Damian
Zitat von: Damian am 03 Juli 2014, 11:11:09
Die Abfrage bei dir wird also ausgewertet, wenn LICHT_STATUS oder HAUS_STATUS ein Event sendet. Das bedeutet, wenn Dämmerung und vor 17:00 stattgefunden hat und HAUS_STATUS vorher schon anwesend war, dann wird nach 17:00 nichts passieren. Wenn du sicherstellen willst, dass auch nach 17:00 geprüft wird, dann musst du das mit Hilfe einer Zeitangabe berücksichtigen. z. B.Code Auswählendefine Light_ctrl DOIF (([LICHT_STATUS] eq "Daemmerung" or [17:01]) and $hms gt "17:00" and [HAUS_STATUS] eq "Anwesend")
(set Licht on) DOELSE (set Licht off)
Zitat von: Brockmann am 03 Juli 2014, 14:18:56
Aber wenn durch das [17:01] um 17:01 Uhr getriggert wird, ist dieser Teil der OR-Klammer doch wahr, oder?
Würde so nicht einfach um 17:01 Uhr geschaltet werden, selbst wenn noch gar keine Dämmerung ist?
define Light_ctrl DOIF (([LICHT_STATUS] eq "Daemmerung") and ($hms gt "17:00" or [17:01]) and [HAUS_STATUS] eq "Anwesend")
(set Licht on) DOELSE (set Licht off)
Zitat von: Damian am 03 Juli 2014, 14:25:17Ja, so sollte es gehen. Zwar nicht ganz so elegant wie erhofft. Aber Deine Bedenken bzgl. Schleifen durch Selbsttriggern kann ich nachvollziehen.
Du hast Recht, mein Fehler. Es muss viel mehr heißen:Code Auswählendefine Light_ctrl DOIF (([LICHT_STATUS] eq "Daemmerung") and ($hms gt "17:00" or [17:01]) and [HAUS_STATUS] eq "Anwesend")
(set Licht on) DOELSE (set Licht off)
IF ([Klima_SZ] eq "off" and $hms gt "08:00 and lt "22:00") (set LED_04 led green) ELSE (set LED_04 led off)
([Klima_SZ] eq "off" and $hms gt "08:00 and lt "22:00") (set LED_04 led green) DOELSE (set LED_04 led off)
Zitat von: satprofi am 03 Juli 2014, 16:04:26Was soll das DOIF denn bewirken?
mit DOIF leider nichtCode Auswählen
([Klima_SZ] eq "off" and $hms gt "08:00 and lt "22:00") (set LED_04 led green) DOELSE (set LED_04 led off)
Zitat von: Brockmann am 03 Juli 2014, 15:10:34
Ja, so sollte es gehen. Zwar nicht ganz so elegant wie erhofft. Aber Deine Bedenken bzgl. Schleifen durch Selbsttriggern kann ich nachvollziehen.
Danke für die Hinweise.
Zitat von: Brockmann am 03 Juli 2014, 16:22:29
Was soll das DOIF denn bewirken?
Wenn zwischen 08:00 Uhr und 22:00 Uhr der Status von KLIMA_SZ auf "off" wechselt, wird die LED angeschaltet.
Wenn zwischen 08:00 Uhr und 22:00 Uhr der Status von KLIMA_SZ auf irgendwas anderes wechselt, wird die LED ausgeschaltet.
Nicht mehr, nicht weniger.
In jedem Fall tut das DOIF nur etwas, wenn sich am Status von Klima_SZ etwas ändert.
Es tut nichts um 08:00 Uhr und nichts um 22:00 Uhr, falls Du das erwartest.
Zitat von: satprofi am 03 Juli 2014, 17:13:54DOIF macht nur etwas, wenn sich sein Zustand verändert. Wenn zuletzt zwischen 08:00 Uhr und 22:00 Uhr set Klima_SZ off kam und erst am nächsten Tag kommt nun wieder set Klima_SZ off, dann wird nichts geschaltet, weil sich der Status aus Sicht von DOIF nicht verändert hat. Das DOIF kann ja nicht wissen, ob Du die LED zwischenzeitlich manuell ausgeschaltet hast oder nicht.
mehr habe ich auch nicht erwartet, aber leider schaltet die Led nur wenn ich sie manuell schalte.
DOIF leider nicht.
Oder wird die led nur einmal ausgeschaltet, danach erst wieder am nächsten tag nach 8:00h ?
Kann es auch sein, das DOIF zwischenzeitlich manuell getätigte commandos nicht erkennt und nur seinen letzten last_cmd_event auswertet?
Zitat von: Damian am 03 Juli 2014, 17:01:52Vielleicht denkst Du über das Thema Intervalle auch etwas grundlegender nach. Sowohl bei DOIF als auch IF wäre es toll, wenn man Intervalle direkt angeben könnte, etwa
ja, vielleicht lasse ich mir noch etwas für Zeitintervalle einfallen.
Zitat von: satprofi am 03 Juli 2014, 18:21:06Was hat das mit einem Neustart zu tun? Irgendwie reden wir aneinander vorbei, fürchte ich.
Heisst das, das während eines neustartes von fhem ein zwischenzeitliches event nicht von DOIF erkannt wird? wie kann man eine abfrage der verschiedenen state´s regelmässig erwirken?
Zitat von: satprofi am 03 Juli 2014, 18:41:14
Sorry fürs unverständnis.
Ich habe einige readings die einen actor über DOIF schalten. Wenn jetzt eine bedingung wahr ist wird geschalten, ok. aber was passiert wenn zwischenzeitlich ein anderes reading den state wechselt? egal ob autom. od. manuell? erkennt DOIF dies?
ebenso wenn fhem eine "pause" einlegt, in der zwischenzeit ein state umswitcht?
mein vorhaben ist, eine klima autom. schalten zu lassen, aber vielleicht zwischenzeitlich manuell einzugreifen, per fhem.
aber zur zeit wird nach dem manuellen eingriff von DOIF nichts mehr unternommen, und wenn es nur die Abfrage der raumtemperatur ist, die eigentlich die klima über DOIF schaltet.
Zitat von: Brockmann am 03 Juli 2014, 18:32:07
Vielleicht denkst Du über das Thema Intervalle auch etwas grundlegender nach. Sowohl bei DOIF als auch IF wäre es toll, wenn man Intervalle direkt angeben könnte, etwa
(40 < [Bad:humidity] < 70) oder vielleicht auch in einer anderen Syntax, wenn das einfacher handbar ist. Das macht den Code intuitiver und besser lesbar, finde ich.
(Mir ist klar, dass das durch Verwenden von Perl-Ausdrücken schon jetzt möglich ist, aber das macht es eben nicht intuitiver und lesbarer.)
Die Idee, beim Definieren von statischen Uhrzeit diese bei Erreichen jeweils einmal zu triggern, finde ich gut. Allerdings macht das einen kleinen, aber feinen Unterschied.
Jetzt-Zustand: Wenn im Zeitraum Z Bedingung B eintritt, führe Aktion A aus.
Dann-Zustand: Wenn Bedingung B gegeben ist, führen im Zeitraum Z Aktion A aus.
Ich bin mir nicht sicher, aber ich denke, es gibt für beide Varianten sinnvolle Anwendungsszenarien.
Zitat von: Damian am 03 Juli 2014, 22:06:25
Ich werde mich hüten selbst logische Abfragen auszuwerten, dass habe ich bereits beim THRESHOLD-Modul versucht. Über eine AND bzw. OR-Verknüpfung bin ich nicht gekommen. Die Besonderheit des DOIF-Moduls wie auch beim IF ist, dass ich die Eigenschaften eines Interpreters (hier Perl) ausnutze. Und genau diese Eigenschaft macht die Sache recht flexibel.
Zitat von: Brockmann am 03 Juli 2014, 22:46:30
Es ginge ja nicht so sehr darum, selbst logische Abfragen auszuwerten, sondern dem Benutzer das Definieren von Intervallen möglichst einfach zu machen.
(40 < [Bad:humidity] < 70) müssten ja nur intern in ([Bad:humidity] > 40 and [Bad:humidity] < 70) umgesetzt und so an den Interpreter weitergereicht werden.
Aber mag sein, dass ich da zu simpel denke und sich das nicht so ohne weiteres umsetzen lässt.
Zitat von: Damian am 03 Juli 2014, 13:01:51
Ich kenne nicht alle Bedingungen, die bei dir in der Realität vorkommen können, daher mal Folgendes unter Vorbehalt:Code Auswählen([mytwilight:aktEvent] eq "ss_weather" and ($hour > 15 or [16:01])) (set LICHT_TERRASSE_KUECHE an) DOELSEIF ([ROLLLADEN_KUECHE] eq "zu" and [ROLLLADEN_WZ_4] eq "zu" and $hour > 15) (set LICHT_TERRASSE_KUECHE aus)
Wenn die Rollläden vor 16:00 Uhr schon unten waren, dann passiert hier allerdings nichts.
Du kannst auch im DOELSEIF-Fall noch eine Zeitangabe zum Triggern angeben, wenn du zum Ausschalten des Lichtes auf Nummer sicher gehen willst.
Gruß
Damian
Zitat von: Jens_B am 04 Juli 2014, 09:05:43Das [16:01] sorgt dafür, dass das DOIF um 16:01 einmal getriggert wird.
Muss ich in der Definition das mit der Uhrzeit [16:01] drin haben?
Oder würde es reichen einfach nur abzufragen ob $hour > 15 ist?
Zitat von: Damian am 03 Juli 2014, 22:50:39Danke für die Erklärung.
Parser ist eine Wissenschaft für sich.
Ich kümmere mich z. Zt. nur um "eckige Klammern" und schaue, ob zu jeder Klammer auf eine Klammer zu existiert, und kümmer mich in der Abfrage sonst um nichts :)
Zitat von: Brockmann am 04 Juli 2014, 10:02:53
Das [16:01] sorgt dafür, dass das DOIF um 16:01 einmal getriggert wird.
Das deckt den Fall ab, dass ss_weather vor 16:00 Uhr erfolgt. Dann würde das DOIF sonst nämlich gar nicht schalten.
([Licht_Flur] eq "schalten") (set PIFACE 0 1,sleep 0.01,set PIFACE 0 0)
DOELSEIF
([Licht_Kammer] eq "schalten") (set PIFACE 1 1,sleep 0.01,set PIFACE 1 0)
DOELSEIF
([Licht_Kueche] eq "schalten") (set PIFACE 2 1,sleep 0.01,set PIFACE 2 0)
DOELSEIF
([Licht_Bad] eq "schalten") (set PIFACE 3 1,sleep 0.01,set PIFACE 3 0)
DOELSEIF
([Licht_Katzenzimmer] eq "schalten") (set PIFACE 4 1,sleep 0.01,set PIFACE 4 0)
DOELSEIF
([Licht_Schlafzimmer] eq "schalten") (set PIFACE 5 1,sleep 0.01,set PIFACE 5 0)
Zitat von: MaJu am 04 Juli 2014, 13:59:47Kann es sein, dass Du bei Deinem bisherigen notify-Konstrukt das Perl-sleep verwendet hast? Das unterscheidet sich, weil es FHEM für den gewählten Zeitraum komplett anhält und dann weiterlaufen lässt.
Warum kommen hier so lange Pausen rein bzw. wie bekomme ich die raus?
Zitat von: RoBra81 am 04 Juli 2014, 15:16:47
Hallo,
ich habe mein Treppenhauslicht mit notifies gebaut und wollte das nun testweise mit DOIF umbauen. Dabei bin ich auf folgendes Problem gestoßen: Sobald der Bewegungsmelder eine Bewegung erkennt, wird das Licht eingeschaltet und ein at für das Ausschalten definiert, sofern dieses noch nicht existiert anderenfalls wird es modifiziert. Und hier liegt mein Problem: zur Definition des DOIF exisitiert das notify natürlich noch nicht, was bei der Definition von DOIF einen Fehler generiert und kein DOIF definiert.
Gibt es hierfür eine Lösung?
Ronny
Zitat von: MaJu am 04 Juli 2014, 13:59:47
Das Problem: Das Relais wird mehr als nur 0,01 Sekunden gehalten, sondern etwa 5 Sekunden. Vorher hatte ich für jede Lampe ein eigenes Notify, da hatte es halbwegs funktioniert (es war nie mehr als 1 Sekunde).
Und: Wenn ich den alle Lampen schalte und deshalb für alle Lampen der Schaltbefehl kommt, dann werden nacheinander erst alle Relais angezogen, kurz gewartet, und danach nacheinander wieder losgelassen. Die Relais sind damit ca. 10 Sekunden unter Strom. Die Stromstoßschalter quittieren das mit einem kräftigen Brummton, der nicht gesund klingt.
Warum kommen hier so lange Pausen rein bzw. wie bekomme ich die raus?
IF (1) (set PIFACE 0 1,sleep 0.01,set PIFACE 0 0)
define OG.hf.BM.Treppe.not.inaktiv notify OG.hf.BM.Treppe.*51200.* IF (!$defs{'OG.hf.LI.Treppe.at.off'})
(
define OG.hf.LI.Treppe.at.off at +00:00:05 set OG.hf.LI.Treppe off,
attr OG.hf.LI.Treppe.at.off room Hausflur
)
ELSE
(
IF ([OG.hf.LI.Treppe.at.off:&TRIGGERTIME] - time < 5)
(
modify OG.hf.LI.Treppe.at.off +00:00:05
)
)
;
IF (!$defs{'OG.hf.LI.Schuhschrank.at.off'})
(
define OG.hf.LI.Schuhschrank.at.off at +00:00:10 set OG.hf.LI.Schuhschrank off,
attr OG.hf.LI.Schuhschrank.at.off room Hausflur
)
ELSE
(
IF ([OG.hf.LI.Schuhschrank.at.off:&TRIGGERTIME] - time < 10)
(
modify OG.hf.LI.Schuhschrank.at.off +00:00:10
)
)
define OG.hf.LI.Xxx.DI DOIF ([OG.hf.BM.Treppe:sensor] eq "51200")
(
IF (!$defs{'OG.hf.LI.Treppe.at.off'})
(
define OG.hf.LI.Treppe.at.off at +00:00:05 set OG.hf.LI.Treppe off,
attr OG.hf.LI.Treppe.at.off room Hausflur
)
ELSE
(
IF ([OG.hf.LI.Treppe.at.off:&TRIGGERTIME] - time < 5)
(
modify OG.hf.LI.Treppe.at.off +00:00:05
)
)
,
IF (!$defs{'OG.hf.LI.Schuhschrank.at.off'})
(
define OG.hf.LI.Schuhschrank.at.off at +00:00:10 set OG.hf.LI.Schuhschrank off,
attr OG.hf.LI.Schuhschrank.at.off room Hausflur
)
ELSE
(
IF ([OG.hf.LI.Schuhschrank.at.off:&TRIGGERTIME] - time < 10)
(
modify OG.hf.LI.Schuhschrank.at.off +00:00:10
)
)
)
DOELSEIF ([OG.hf.BM.Treppe:sensor] eq "0")
(
set Test an
)
Zitat von: RoBra81 am 04 Juli 2014, 15:44:36
Hier mein notify:Code Auswählen
define OG.hf.BM.Treppe.not.inaktiv notify OG.hf.BM.Treppe.*51200.* IF (!$defs{'OG.hf.LI.Treppe.at.off'})
(
define OG.hf.LI.Treppe.at.off at +00:00:05 set OG.hf.LI.Treppe off,
attr OG.hf.LI.Treppe.at.off room Hausflur
)
ELSE
(
IF ([OG.hf.LI.Treppe.at.off:&TRIGGERTIME] - time < 5)
(
modify OG.hf.LI.Treppe.at.off +00:00:05
)
)
;
IF (!$defs{'OG.hf.LI.Schuhschrank.at.off'})
(
define OG.hf.LI.Schuhschrank.at.off at +00:00:10 set OG.hf.LI.Schuhschrank off,
attr OG.hf.LI.Schuhschrank.at.off room Hausflur
)
ELSE
(
IF ([OG.hf.LI.Schuhschrank.at.off:&TRIGGERTIME] - time < 10)
(
modify OG.hf.LI.Schuhschrank.at.off +00:00:10
)
)
... und folgendes DOIF wollte ich daraus machen:Code Auswählen
define OG.hf.LI.Xxx.DI DOIF ([OG.hf.BM.Treppe:sensor] eq "51200")
(
IF (!$defs{'OG.hf.LI.Treppe.at.off'})
(
define OG.hf.LI.Treppe.at.off at +00:00:05 set OG.hf.LI.Treppe off,
attr OG.hf.LI.Treppe.at.off room Hausflur
)
ELSE
(
IF ([OG.hf.LI.Treppe.at.off:&TRIGGERTIME] - time < 5)
(
modify OG.hf.LI.Treppe.at.off +00:00:05
)
)
,
IF (!$defs{'OG.hf.LI.Schuhschrank.at.off'})
(
define OG.hf.LI.Schuhschrank.at.off at +00:00:10 set OG.hf.LI.Schuhschrank off,
attr OG.hf.LI.Schuhschrank.at.off room Hausflur
)
ELSE
(
IF ([OG.hf.LI.Schuhschrank.at.off:&TRIGGERTIME] - time < 10)
(
modify OG.hf.LI.Schuhschrank.at.off +00:00:10
)
)
)
DOELSEIF ([OG.hf.BM.Treppe:sensor] eq "0")
(
set Test an
)
Zitat von: RoBra81 am 04 Juli 2014, 15:44:36Wenn ich das Szenario richtig verstehe, sind die Schalter direkt mit dem Bewegungsmelder gepeered, werden also unabhängig von FHEM direkt geschaltet, wenn der Bewegungsmelder anspringt?
Hier mein notify:
set OG.hf.LI.Treppe on-for-timer 300
hinterschicken. Dann kümmert sich FHEM selbst um das AT, was nach fünf Minuten ohne weitere Ereignisse abschaltet. Das wäre dann die ganz simple Lösung - unabhängig von Notify oder DOIF.
define DI_sz_Jalousie DOIF ([MeinWetter:temp_c] > 20 and [myTwilight:compasspoint] =~ m/south/i and [sz_Jalousie] eq "on" and ([MeinWetter:condition] eq "sonnig" or [MeinWetter:condition] eq "heiter" or [MeinWetter:condition] eq "teilweise wolkig")) (set sz_Jalousie 30) DOELSEIF ([myTwilight:compasspoint] eq "west" and [sz_Jalousie] eq "30") (set sz_Jalousie on)
2014.07.03 10:45:27 3: CUL_HM set sz_Jalousie 30
2014.07.03 10:45:27 3: CUL_HM set sz_Jalousie 30
2014.07.03 18:21:04 3: CUL_HM set sz_Jalousie on
2014.07.03 18:21:04 3: CUL_HM set sz_Jalousie on
2014.07.03 21:43:56 3: CUL_HM set sz_Jalousie off
2014.07.04 05:45:00 3: CUL_HM set sz_Jalousie on
2014.07.04 10:36:14 3: CUL_HM set sz_Jalousie 30
2014.07.04 10:36:14 3: CUL_HM set sz_Jalousie 30
ZitatAllerdings tauchen die Events immer doppelt im Log auf, jemand eine Idee warum?Nein, nicht immer.
Zitat([MeinWetter:temp_c] > 20 and [myTwilight:compasspoint] =~ m/south/i and [sz_Jalousie] eq "on" and ([MeinWetter:condition] eq "sonnig" or [MeinWetter:condition] eq "heiter" or [MeinWetter:condition] eq "teilweise wolkig"))Ich vermute das wäre in einem normalen notify das regexp auf das das notify triggern soll.
and [sz_Jalousie] eq "on"
Zitat von: Damian am 04 Juli 2014, 16:20:07
Ist schon lustig zu sehen, was ihr da so alles programmiert. So hast du mit DOIF kaum einen Vorteil gegenüber einem notify. Wann liefert bei dir der Sensor 51200 und wann 0? So etwas sollte man eigentlich als Zweizeiler hinbekommen.
Gruß
Damian
ZitatNein, nicht immer.
ZitatDas passiert aber wenn von den Bedingungen mehr als eine triggert (und das ist zwangsläufig der Fall) und dann auch noch wahr ist.
Zitat von: Damian am 04 Juli 2014, 15:41:02
Schau zunächst wie lange die Pausen sind, wenn du in der Kommandozeile Folgendes eingibst:Code AuswählenIF (1) (set PIFACE 0 1,sleep 0.01,set PIFACE 0 0)
Zitat von: RoBra81 am 04 Juli 2014, 17:56:14
Hat mich auch eine Menge Gehirnschmalz gekostet :)
Ich kann ja mal das ganze Szenario posten, damit es verständlicher wird: Ich habe im Flur zwei Lampen, einen Bewegungsmelder und zwei Taster. Wenn der Bewegungsmelder eine Bewegung erkennt (Sensor 0) wird über ein Notify (das habe ich hier nicht gepostet) das Licht in Abhängigkeit von der Dämmerung angemacht und gegebenenfalls vorhandene Timer (at) die das Licht ausschalten würden gelöscht, wenn diese eine Restzeit kleiner 10 bzw. 5 Sekunden haben (beide Lampen haben einen eigenen Ausschalttimer, da ich diese unterschiedlich lange anlassen möchte). Erkennt der Bewegungsmelder keine Bewegung mehr wird mit dem gezeigten notify ein Timer (at) definiert, um die Lichter auszuschalten. Dies passiert aber ebenfalls nur, wenn noch kein Timer definiert ist oder dieser eine Restzeit kleiner 10 bzw. 5 Sekunden hat. Hintergrund ist, dass ich über die Taster ebenfalls das Licht anschalten und Timer zum abschalten definiere, die für 1 bzw. 30 Minuten laufen (kurzer oder langer Tastendruck).
Der Grund, dass ich hierfür diese ausgefallenen ("lustigen") notifies nutze ist, dass ich Homematic-Devices (CUL) nutze, die kein on-for-timer unterstützen...
Zitat von: Bombjack am 04 Juli 2014, 18:02:53
Wenn ich das weglasse gibt es auch mehrfach Schaltbefehle, da die MyTwilight Aktualisierungsintervalle recht kurz sind.
Zitat von: Damian am 05 Juli 2014, 09:08:29
on-for-timer funktioniert bei mir auch bei HM-Devices (mit HM-LAN-Adapter). Wird wohl softwareseitig gelöst sein.
ZitatIch habe Wired-Devices (HMW_LC_Sw2_DR) an HM485, da gibt's kein on-for-timer...Dann würde ich an deiner Stelle mal eben im Homematic-Bereich Bescheid geben ;)
Zitat von: RoBra81 am 05 Juli 2014, 10:53:38
Ich habe Wired-Devices (HMW_LC_Sw2_DR) an HM485, da gibt's kein on-for-timer...
update
8)
ZitatMal angenommen, on-for-timer würde irgendwann gehenon-for-timer geht bereits jetzt, wenn Du den Umweg über readingsProxy gehst http://www.fhemwiki.de/wiki/ReadingsProxy .
Zitat von: RoBra81 am 05 Juli 2014, 16:34:25
Die Homematic wired Geräte sind imho nicht in CUL_HM drin sondern haben ein eigenes Modul. Mal angenommen, on-for-timer würde irgendwann gehen, bekäme ich den heraus, ob und wie lange der Timer schon läuft? Das brauche ich ja für mein Szenario...
define OG.hf.LI.Xxx.DI DOIF ([OG.hf.BM.Treppe:sensor] eq "51200") (set OG.hf.LI.Treppe on-for-timer 5)
attr OG.hf.LI.Xxx.DI do always
ZitatIch werde mir noch etwas für DOIF einfallen lassen, dass man auch solche Fälle ohne on-for-timer mit einer Zeile erledigen kann, so zu sagen, als Gegenstück zu wait.Steht dir natürlich frei das zu tun ;)
Zitat von: Puschel74 am 05 Juli 2014, 17:32:28
Hallo,
Steht dir natürlich frei das zu tun ;)
Ich würde aber eher favorisieren das on-/off-for-timer in die jeweiligen Device-Module mit aufgenommen wird.
Dann haben auch diejenigen etwas davon die weder IF noch DOIF verwenden und du musst Dir nicht noch zusätzlich Gedanken machen.
Grüße
Zitatja, on-for-timer würde allerdings je nach Gerätetyp (insb. FS20) ein Kommando an das Gerät schicken und unnötig Traffic produzieren, das würde bei DOIF nicht passieren.
Zitat von: Puschel74 am 05 Juli 2014, 17:40:58
Wenn ich ein FS20-Device mit on-for-timer einschalte läuft im Device die Zeit ab.
FHEM sendet kein off mehr an das Gerät also nur ein! Sendebefehl.
Zitat von: Puschel74 am 05 Juli 2014, 17:56:37
Hallo,
ah, das meinst du.
Ja das stimmt.
Daher habe ich das in meinen Codes bereits abgefangen ;)
Grüße
ZitatDaher habe ich das in meinen Codes bereits abgefangenwar mal wieder etwas zu kurz gedacht von mir.
Zitat von: Puschel74 am 05 Juli 2014, 21:45:31
Hallo,
daswar mal wieder etwas zu kurz gedacht von mir.
Ich hab die Meldezeiten der Bewegungsmelder auf die on-for-timer-Zeiten der Aktoren abgestimmt.
Wenn der Aktor on-for-timer 120 Sekunden hat dann meldet der Bewegungsmelder frühestens nach 115 Sekunden wieder wenn er noch eine Bewegung erkennt.
Ich hab auch Aktoren die on-for-timer 1920 Sekunden haben (FS20 kann nur so "krumme" Werte wenn es länger geht) - der Badezimmerventilator ist einer davon.
Da meldet der Bewegungsmelder auch nur alle x Sekunden (ich muss nochmal nachschauen wann genau) eine erkannte Bewegung.
Ob das mit allen Bewegungsmelder ght weiß ich nicht und denke ich mal nicht.
Aber FS20-BM können dahingehend eingestellt werden.
Ich denke mal das HM-BW das auch können.
Das würde ja auch im Hinblick auf die Batterielebensdauer Sinn machen nicht alle a Sekunden eine erkannte Bewegung zu melden (wobei a die kürzeste Zeit im BM ist).
Von daher wäre es auch besser den BM dahingehend zu programmieren und du müstest dir wieder keinen Kopf machen wie du das im DOIF abfangen kannst ;)
Grüße
define DI_BM DOIF ([BM] eq "on)(set Licht on)DOELSE(set Licht off)
attr DI_BM wait 0:10
define bm_dum dummy
define DI_bm_dum DOIF ([BM])(set bm_dum on,set bm_dum off)
attr DI_bm_dum do always
define DI_BM DOIF ([bm_dum] eq "on")(set Licht on)DOELSE(set Licht off)
attr DI_BM wait 0:10
Zitat von: Damian am 05 Juli 2014, 17:26:15
Du hast meine Frage nicht genau beantwortet, wann 51200 kommt und wann 0. Ich gehe mal davon aus, dass bei Bewegung 51200 kommt, dann würde mit:Code Auswählendefine OG.hf.LI.Xxx.DI DOIF ([OG.hf.BM.Treppe:sensor] eq "51200") (set OG.hf.LI.Treppe on-for-timer 5)
attr OG.hf.LI.Xxx.DI do always
dein Treppenlicht bei erster Bewegung angehen und bei jeder weiteren Bewegung innerhalb von 5 Sekunden, um weitere 5 Sekunden verlängert und wenn keine Bewegung innerhalb von 5 Sekunden kommt wieder ausgehen.
Das war´s.
Zitat von: Puschel74 am 05 Juli 2014, 16:48:50
Melde dich doch einfach mal dort und frag Dirk (das ist glaube ich der Modulautor) ob er on-/off-for-timer in das Modul einbauen könnte.
...
Die Modulautoren müssen nur danach gefragt/darauf hingewiesen/darum gebeten werden.
Zitat von: krikan am 05 Juli 2014, 16:55:18
on-for-timer geht bereits jetzt, wenn Du den Umweg über readingsProxy gehst http://www.fhemwiki.de/wiki/ReadingsProxy .
Zitat von: RoBra81 am 06 Juli 2014, 14:17:20Mal unabhängig von DOIF oder notify, warum trennst Du nicht die beiden Fälle:
Daher bin ich wieder bei meinen 6 mehr oder weniger umfangreichen notifies (Bewegungsmelder ein/aus, 2 Taster lang/kurz), die ich eben testweise durch 1 DOIF ersetzen wollte...
ZitatIch kann zwar nun on-for-timer für meine Homematic-Wired Geräte nutzen, bekomme aber nicht heraus, wie lange es noch dauert, bis das Gerät abgeschaltet wird.Könnest Dir mal on-till anschauen. Das entstehende "at deviceName+_till" lässt sich auswerten und mit modify anpassen.
Zitat von: RoBra81 am 06 Juli 2014, 14:17:20
da mein Bewegungsmelder bei Bewegung ein Relais schließt und erst bei "Keine Bewegung" wieder öffnet
define schalter_d dummy
define di_Schalter DOIF ([Schalter] =~/short/ )
(set schalter_d short, set schalter_d short_off)
DOELSEIF ([Schalter] =~/long/)
(set schalter_d long, set schalter_d long_off)
attr di_Schalter do always
define di_Licht DOIF ([schalter_d] eq "short" or [schalter_d] eq "long")
(set Licht on)
DOELSEIF ([schalter_d] eq "short_off")
(set Licht off)
DOELSEIF ([schalter_d] eq "long_off")
(set Licht off )
DOELSEIF ([BM] eq "on" and [Licht] eq "off")
(set Licht on)
DOELSEIF ([BM] eq "off")
(set Licht off)
attr di_Licht wait 0:60:1800:0:10
([001_Wetterstation:temperature]>25 and [001_Wetterstation:brightness]>65 and [Thermostat_Wohnzimmer:measured-temp]>22 and [002_Fenster_TR] eq "closed" and $hms gt "12:00" and $hms lt "20:30") (set Jalousie_TR 40,set Jalousie_dummy 40,set Verschattung_dummy 1) DOELSEIF ([Verschattung_dummy]>1) (set Jalousie_TR hoch,set Jalousie_dummy hoch,set Verschattung_dummy 0)
Zitat von: cruser1800 am 06 Juli 2014, 21:42:56
Ich habe leider auch ein kleines Problem. DOIF arbeitet leider nicht immer den ersten Teil ab, obwohl die Bedingungen alle Wahr sind. Der zweite Teil DOELSIF wird leider nie abgearbeitet. Die Bedingung ist 1.Code Auswählen([001_Wetterstation:temperature]>25 and [001_Wetterstation:brightness]>65 and [Thermostat_Wohnzimmer:measured-temp]>22 and [002_Fenster_TR] eq "closed" and $hms gt "12:00" and $hms lt "20:30") (set Jalousie_TR 40,set Jalousie_dummy 40,set Verschattung_dummy 1) DOELSEIF ([Verschattung_dummy]>1) (set Jalousie_TR hoch,set Jalousie_dummy hoch,set Verschattung_dummy 0)
Was mache ich falsch?
Danke für die Hilfe
Gruß Lutz
Verschattung_dummy 1) DOELSEIF ([Verschattung_dummy]>1
([Verschattung_dummy]=1
Zitat von: satprofi am 07 Juli 2014, 15:51:02
hallo.
ich habe auch kleines problem wo ich keine lösung finde.
ich schalte die klima ab einen bestimmten wert ein. das klappt auch.
jetzt möchte ich aber , wenn dieser wert bis zu einem anderen wert nicht unterschritten wird die klima weiterlaufen lassen.
wie realisiert man das mit DOIF ?
z.b. ab 1500W klima on, unter 1000W klima off.
define di_Klima DOIF ([Sensor:Watt]>1500) (set Klima on) DOELSEIF ([Sensor:Watt]<1000) (set Klima off)
Zitat von: Damian am 06 Juli 2014, 22:00:24
Version 1.4 im ersten Post.
-status "disabled" eingebaut
-Ein cmd-Status wird nur noch dann für einen nicht existierenden ELSE-Fall gesetzt, wenn es nur den DOIF-Fall gibt. Das grundsätzliche Setzen eines cmd-Status für nicht existierenden ELSE-Fall war ungünstig und machte die Wait-Timer-Steuerung zunichte. Das Beispiel im Post #190 würde z. B. mit Version 1.3 nicht funktionieren.
Gruß
Damian
Zitat von: cruser1800 am 07 Juli 2014, 21:01:48
Danke für deine Antwort. Ist es jetzt bei der Änderung so, dass wenn DOIF falsch ist DOELSIF abgearbeitet wird ohne das es ein weiteres Notify benötigt?
Gruß
define di_test DOIF ([Schalter1] eq "on")(set lampe1 on) DOELSEIF ([Schalter2] eq "on") (set lampe2 on) DOELSE (set lampe3 on)
define Bewaesserung_Zeit dummy
attr Bewaesserung_Zeit setList state
attr Bewaesserung_Zeit room Bewässerung_DOIF
attr Bewaesserung_Zeit setList state:1,2,3,4,5,6,7,8,9,10
#attr Bewaesserung_Zeit sortby 01
attr Bewaesserung_Zeit webCmd state
Define Automatik_DOIF dummy
attr Automatik_DOIF room Bewässerung_DOIF
attr Automatik_DOIF toggleDevice true
attr Automatik_DOIF webCmd an:aus
attr Automatik_DOIF devStateIcon aus:Bwaesserung_black_off_48_B an:Bwaesserung_gruen_on_48_B
attr Automatik_DOIF eventMap on:an off:aus
define Wasser_Eiche DOIF ([Automatik_DOIF] eq "an") (set 1_Bew_Eiche_DOIF on-for-timer 3) DOELSE (set 1_Bew_Eiche_DOIF aus)
Zitat von: Hoeness am 07 Juli 2014, 23:02:29
Mit dem folgende DOIF Ausdruck schalte ich jetzt meine 1_Bew_Eiche_DOIF ein.Code Auswählendefine Wasser_Eiche DOIF ([Automatik_DOIF] eq "an") (set 1_Bew_Eiche_DOIF on-for-timer 3) DOELSE (set 1_Bew_Eiche_DOIF aus)
In dem Beispiel schalte ich 1_Bew_Eiche_DOIF für 3 Sekunden ein.
Wie kann ich jetzt den Wert "meiner" Bewässerungszeit - Bewaesserung_Zeit- in dem Ausdruck benutzen?
Zitat von: kud am 08 Juli 2014, 19:51:10
Tolle Sache mit dem DOIF. Danke.
Aber mein Eintrag
define Feuchte_warnung DOIF ([arduino_ana_1] > 200) (system('/usr/bin/mplayer /opt/TTS/Wassereinbruch_bilge.mp3 &'))
liefert im Event-Monitor ein
DOIF Feuchte_warnung last_error: system('/usr/bin/mplayer /opt/TTS/Wassereinbruch_bilge.mp3 &'): Unknown command system('/usr/bin/mplayer, try help.
Hab ich da was übersehen?
Gruss
KU
DOELSEIF ([Heizungsmode] eq "off" and [Pac] < 1000 and $hms gt "10:00" and $hms lt "18:30") (set Klima_SZ off)
Zitat von: satprofi am 11 Juli 2014, 11:53:09
Hallo.
Warum schaltet DOIF trotzdem wenn Leistung unter 1000WCode Auswählen
DOELSEIF ([Heizungsmode] eq "off" and [Pac] < 1000 and $hms gt "10:00" and $hms lt "18:30") (set Klima_SZ off)
dieses commando wurde ausgewertet lt. state
DOELSEIF ([Heizungsmode] eq "off" and [Pac] < 1000 and (($hms gt "10:00" or [10:00]) and $hms lt "18:30") (set Klima_SZ off)
Zitat von: satprofi am 11 Juli 2014, 14:39:06
achso!
ich dachte es wird regelmässig geprüft. heisst wenn nach 10h die leistung unter 1000 fällt, passiert nichts mehr? wobei "off" bei mir für einschalten steht.
es sollte zw. 10 u. 18:30h die klima aus-, bzw. wieder eingeschalten werden wenn der wert unter od. über 1000w steht.
Zitat von: satprofi am 11 Juli 2014, 15:23:46
aber bei uhrzeit ändert sich status ja minütlich? kommt das nicht durch?
pac sendet alle 3min., und wait ist auf 300
######## Input 4 -Beregnung
define In4_Beregnung RPI_GPIO 10
attr In4_Beregnung active_low no
attr In4_Beregnung debounce_in_ms 50
attr In4_Beregnung devStateIcon aus:rain-icon_off an:rain-icon_on
attr In4_Beregnung direction input
attr In4_Beregnung eventMap on:an off:aus
attr In4_Beregnung group 1_Input
attr In4_Beregnung interrupt rising
attr In4_Beregnung pud_resistor down
attr In4_Beregnung room Bewässerung_DOIF
attr In4_Beregnung webCmd an:aus
######## Beleuchtung Terasse
define man_Bewaesserung dummy
attr man_Bewaesserung group 2_Output
attr man_Bewaesserung room Bewässerung_DOIF
attr man_Bewaesserung webCmd an:aus
attr man_Bewaesserung devStateIcon aus:Lampe_off an:Lampe_on
attr man_Bewaesserung eventMap on:aus off:an
define n_In4_Beregnung DOIF ([In4_Beregnung] eq "an" and [man_Bewaesserung] eq "aus") (set man_Bewaesserung an) DOELSEIF ([In4_Beregnung] eq "an" and [man_Bewaesserung] eq "an") (set man_Bewaesserung aus)
Zitat von: Hoeness am 12 Juli 2014, 22:27:16
Hi,
ich bins mal wieder ;-)
Ich möchte mit DOIF ein dummy toggeln (aus/an):
Der Trigger hierzu kommt von einem Taster über GPIO: hier die Config:Code Auswählen######## Input 4 -Beregnung
define In4_Beregnung RPI_GPIO 10
attr In4_Beregnung active_low no
attr In4_Beregnung debounce_in_ms 50
attr In4_Beregnung devStateIcon aus:rain-icon_off an:rain-icon_on
attr In4_Beregnung direction input
attr In4_Beregnung eventMap on:an off:aus
attr In4_Beregnung group 1_Input
attr In4_Beregnung interrupt rising
attr In4_Beregnung pud_resistor down
attr In4_Beregnung room Bewässerung_DOIF
attr In4_Beregnung webCmd an:aus
Der dummy ist wie folgt konfiguriert:Code Auswählen######## Beleuchtung Terasse
define man_Bewaesserung dummy
attr man_Bewaesserung group 2_Output
attr man_Bewaesserung room Bewässerung_DOIF
attr man_Bewaesserung webCmd an:aus
attr man_Bewaesserung devStateIcon aus:Lampe_off an:Lampe_on
attr man_Bewaesserung eventMap on:aus off:an
Mein DOIF sieht wie folgt aus:Code Auswählendefine n_In4_Beregnung DOIF ([In4_Beregnung] eq "an" and [man_Bewaesserung] eq "aus") (set man_Bewaesserung an) DOELSEIF ([In4_Beregnung] eq "an" and [man_Bewaesserung] eq "an") (set man_Bewaesserung aus)
Irgendwie stehe ich hier auf dem Schlauch.
Zitat von: Damian am 13 Juli 2014, 16:40:42Ich denke, es ist anders gemeint. Das DOIF soll von In4_Beregnung getriggert werden. Wenn von dort ein "an" kommt, soll das DOIF den Status von man_Bewaesserung jeweils umkehren (eben toggle).
Es kommt drauf an, was du genau haben möchtest. Bisher geht die Bewässerung an, wenn du deinen dummy aus machst und aus wenn du deinen dummy an machst und immer nur dann wenn in in4_Beregnung an. Wenn In4_Beregnung aus ist passiert gar nichts. Wenn du etwas anderes haben willst, dann musst du es genauer spezifizieren.
attr n_In4_Beregnung do always
Zitat von: Brockmann am 13 Juli 2014, 16:50:14
Ich denke, es ist anders gemeint. Das DOIF soll von In4_Beregnung getriggert werden. Wenn von dort ein "an" kommt, soll das DOIF den Status von man_Bewaesserung jeweils umkehren (eben toggle).
Die Frage ist halt, ob In4_Beregnung zwischenzeitlich auch mal was anderes als "an" triggert und den Status des DOIF damit ändert. Andernfalls fehlt einCode Auswählenattr n_In4_Beregnung do always
damit das DOIF so funktionieren kann.
Ist aber auch eher ins Blaue hinein geraten...
DOIF ([{sunset()}])(Schalter01 on) DOELSEIF ([23:59])(Schalter01 off)
Use of uninitialized value in pattern match (m//) at ./FHEM/98_DOIF.pm line 417.
Zitat von: Brockmann am 14 Juli 2014, 19:10:35
Hallo werte DOIF-Gemeinde,
heute habe ich folgendes DOIF definiert:Code AuswählenDOIF ([{sunset()}])(Schalter01 on) DOELSEIF ([23:59])(Schalter01 off)
Ist soweit selbsterklärend, denke ich. Das Licht soll bei Sonnenuntergang an gehen und um 23:59 ausgeschaltet werden.
Wurde auch akzeptiert und in den Readings stehen zwei plausible Timer.
Allerdings wird mir seitdem das Logfile mit folgender Fehlermeldung zugepflastert:Code AuswählenUse of uninitialized value in pattern match (m//) at ./FHEM/98_DOIF.pm line 417.
Alle paar Minuten kommt wieder eine neue gleichlautende Zeile dazu...
Ich bin etwa ratlos, weil ich keine DOIFs habe, die alle paar Minuten getriggert werden könnten. Die hängen alle an bestimmten Uhrzeiten oder an bestimmten Status-Dummys, die sich aber auch nicht minütlich ändern...
Zitat von: Damian am 14 Juli 2014, 20:56:13
Ich nehme an, dass du die Version 1.4 benutzt. Offenbar gibt es bei dir Trigger, die keinen Device-Namen liefern.
Ich bastle z. Zt. noch an der Version 1.5. Bis dahin kannst du im Modul in der Zeile 417 folgende Zeile einfügen:
return "" if (!$dev->{NAME});
danach kommt dann:
return "" if ($hash->{devices}{all} !~ / $dev->{NAME} /);
das sollte helfen.
Gruß
Damian
Zitat von: Damian am 14 Juli 2014, 21:19:41Das sieht gut aus. Nach dem Einfügen der Zeilen und "reload..." bleiben die Fehlermeldungen jetzt aus. Danke für den schnellen Fix.
Ich sehe gerade, das Problem ist wahrscheinlich eher die Tatsache, dass $hash->{devices}{all} nicht existiert, weil du nur Timer hast und keine Device-Angaben. Ich habe offenbar immer in Kombination mit Devices getestet :)
also dann ab Zeile 417 die roten Zeilen einfügen:
Zitat von: Brockmann am 15 Juli 2014, 08:37:27OK. Ich habe die gefixte Version (1.41) im ersten Post angehängt.
Das sieht gut aus. Nach dem Einfügen der Zeilen und "reload..." bleiben die Fehlermeldungen jetzt aus. Danke für den schnellen Fix.
last_cmd_event Terassentuer 2014-07-15 18:04:06
([001_Wetterstation:temperature]>25 and [001_Wetterstation:brightness]>70 and [Thermostat_Wohnzimmer:measured-temp]>22) (set Jalousie_WZ 40,set Jalousie_EZ 40,set Jalousie_KU 40,set Jalousie_dummy 40,set Verschattung_WZ_dummy on) DOELSEIF ([001_Wetterstation:brightness]<70 and [Verschattung_WZ_dummy] eq "on") (set Jalousie_WZ hoch,set Jalousie_EZ hoch,set Jalousie_KU hoch,set Jalousie_dummy hoch,set Verschattung_WZ_dummy off)
Zitat von: satprofi am 15 Juli 2014, 18:40:50Nein.
hallo.
kann es sein, dass wenn man zwischendurch eine änderung an den werten vornimmt, das ding dann nicht mehr richtig schaltet, bis man neu startet?
Zitat von: cruser1800 am 15 Juli 2014, 20:35:50Ein Wait_Timer kann nur durch ein Ereignis ausgelöst werden, hier also um 20:08:18 gesetzt um 20:08:19 (aufgrund einer langsamen Verarbeitung bei dir) auf 20.23:19, weil du offenbar 5 Minuten für Wait eingestellt hast.
Hallo,
ich habe eine Frage zum next_wait_timer!
Kann es sein, dass die Zeit vor der ersten Ausführung und nicht nach der ersten Ausführung läuft!
Bedingung für war:Code Auswählen([001_Wetterstation:temperature]>25 and [001_Wetterstation:brightness]>70 and [Thermostat_Wohnzimmer:measured-temp]>22) (set Jalousie_WZ 40,set Jalousie_EZ 40,set Jalousie_KU 40,set Jalousie_dummy 40,set Verschattung_WZ_dummy on) DOELSEIF ([001_Wetterstation:brightness]<70 and [Verschattung_WZ_dummy] eq "on") (set Jalousie_WZ hoch,set Jalousie_EZ hoch,set Jalousie_KU hoch,set Jalousie_dummy hoch,set Verschattung_WZ_dummy off)
Event ist eingetreten: 2014-07-15_20:08:18 001_Wetterstation brightness: 69
aber: 2014-07-15_20:08:19 Verschattung_WZ next_wait_timer: 15.07.2014 20:23:19 cmd_2 001_Wetterstation
Nach der Wartezeit ist dann cmd_2 auch ordnungsgemäß eingetreten.
Gruß Lutz
Zitat von: cruser1800 am 15 Juli 2014, 21:23:45
Hallo Damain,
das Ereignis war da. Heißt das, dass meine Fritzbox zu lange für die Bearbeitung des cmd_2 benötigt, so dass schon vor Bearbeitung der wait_timer gesetzt wird?
Dann sollte ich mir wohl eine andere Lösung als Server suchen!
Danke
Lutz
Zitat von: Damian am 15 Juli 2014, 21:28:29
Verstehe ich nicht. Der Timer wurde doch maximal eine Sekunde nach dem Event gesetzt (20:08:19) und nicht davor???
Gruß
Damian
Zitat von: cruser1800 am 15 Juli 2014, 21:33:41
Die Helligkeit hat den Wert unterschritten, so dass cmd_1 nicht eintritt und cmd_2 hätte ausgeführt werden müssen.
Leider wurde aber cmd_2 nicht ausgeführt sondern der wait_timer aktiviert. Somit wurde die erste Ausführung von cmd_2 erst nach der Wartezeit von 15 min aktiviert.
Da ich Jalousien damit steuere ist es 15 min länger dunkel.
Gruß
Lutz
Zitat von: Damian am 15 Juli 2014, 21:37:57
Wie sieht denn die Definition des Wait-Attributes aus, sonst kann ich nur raten.
Gruß
Damian
Zitat von: cruser1800 am 15 Juli 2014, 21:41:58
wait 900:900
Zitat von: Damian am 15 Juli 2014, 21:49:06
Es funktioniert wie programmiert. Mit wait 900:900 hast du definiert, dass er 15 Minuten warten solle bevor er das Kommando ausführt und genau das tut er auch.
Warum sollte er denn das Kommando cmd_2 um 20:23:18 ausführen, wenn du ihm sagst, dass er 15 Minuten nach dem Erfüllen der Bedingung (hier für cmd_2) warten soll.
Da hast du offenbar etwas missverstanden.
Gruß
Damian
Zitat von: cruser1800 am 15 Juli 2014, 21:52:15
Danke, wieder etwas dazu gelernt! Ich bin davon ausgegangen, dass er erst ausführt und dann bei erneuten Ergebnis erst eine definierte Pause abwartet.
Ist hier genau andersrum!
Danke
Lutz
Zitat von: Damian am 15 Juli 2014, 21:05:19
Nein.
An welchen Werten? Es wird immer nur einmal geschaltet, bis sich der Zustand ändert, wenn du do always nicht angibst.
Wenn man Änderungen an der Definition (DEF) vornimmt, werden alle Werte zurückgesetzt, dann sollte das nächste zutreffende Event das entsprechenden Kommando auslösen.
Für irgendwelche Analysen, musst du mir einen nachvollziehbaren Fall liefern.
Gruß
Damian
Zitat von: satprofi am 16 Juli 2014, 18:18:01
ich habe nur den temperaturwert geändert. danach kam nichts mehr, obwohl ja die temperatur zu hoch war.
liegts jetzt an "do always" ? das hab ich aktiviert.
define DI_Radio DOIF ([08:00-10:00]) (set Radio on) DOELSEIF (set Radio off)
define DI_Radio DOIF ([08:00-10:00]|06) (set Radio on) DOELSEIF (set Radio off)
define DI_Radio DOIF ([08:00-10:00]|135) (set Radio on) DOELSEIF (set Radio off)
define DI_Radio DOIF ([08:00-10:00]|7) (set Radio on) DOELSEIF (set Radio off)
define DI_Radio DOIF ([08:00-10:00]|8) (set Radio on) DOELSEIF (set Radio off)
define DI_Licht ([{sunrise_abs()}-{sunset_abs()}]) (set Aussenleuchte off) DOELSEIF (set Aussenleuchte on)
define DI_Rolladen DOIF ([Sensor:helligkeit]>100 and [06:25-09:00|8] or [09:00|7]) (set Rollladen on)
Zitat von: Damian am 16 Juli 2014, 22:16:32Wäre es prinzipiell auch möglich, ein "offenes" Intervall anzugeben. Für den Anwendungsfall, den ich hier schon mal geschildert hatte: Ein Licht soll bei Sonnenuntergang, aber frühestens 17:00 Uhr angeschaltet werden. Wenn der Sonnenuntergang vor 17:00 Uhr liegt, soll eben erst um 17:00 Uhr geschaltet werden.
Ich bin in der Testphase einer neuen Version, die nun auch mit Zeitintervallen umgehen kann. Ich habe auch gleich eine Wochentagfunktion eingebaut, weil ich die Wochentag-Abfragen umständlich fand. Hier einige Beispiele aus der neuen Doku:
DOIF ([{sunset_abs()}] and [17:00-]) (set Licht on) DOELSE (set Licht off)
DOIF ([{sunset_abs()}] and [17:00-sunrise_abs()}]) (set Licht on) DOELSE (set Licht off)
Zitat von: Brockmann am 17 Juli 2014, 06:47:16
Wäre es prinzipiell auch möglich, ein "offenes" Intervall anzugeben. Für den Anwendungsfall, den ich hier schon mal geschildert hatte: Ein Licht soll bei Sonnenuntergang, aber frühestens 17:00 Uhr angeschaltet werden. Wenn der Sonnenuntergang vor 17:00 Uhr liegt, soll eben erst um 17:00 Uhr geschaltet werden.
Theoretisch also:Code AuswählenDOIF ([{sunset_abs()}] and [17:00-]) (set Licht on) DOELSE (set Licht off)
aber praktisch geht das vermutlich nicht? Das Problem bei diesem Szenario ist, dass das Licht nicht zu einem bestimmten Zeitpunkt wieder ausgeschaltet werden soll, sondern über eine andere Funktion beim "ins Bett gehen" ausgeschaltet wird.
Wobei, wenn ich die richtig verstehe, könnte ich mir beispielsweise hiermit behelfen:Code AuswählenDOIF ([{sunset_abs()}] and [17:00-sunrise_abs()}]) (set Licht on) DOELSE (set Licht off)
Wobei sunrise_abs erst am nächsten Tag liegt und kleiner als 17:00 Uhr ist. Das reale Intervall wäre also beispielsweise heute 17:00-04:39:59. Würde DOIF damit in diesem Szenario wie gewünscht funktionieren?
Zitat von: Damian am 17 Juli 2014, 07:45:26Nur noch mal zur Sicherheit:
Intervalle z. B. [17:00-16:00] oder mit Funktionen werden unterstützt.
Zitat von: Brockmann am 17 Juli 2014, 07:58:00Wenn du es noch vor 17:00 Uhr definierst, dann ja. Es wird immer jeweils der nächstmögliche Trigger-Zeitpunkt genommen. Wenn du es nach 17:00 Uhr definierst, dann wird logischerweise zu erst um 04:00 Uhr getriggert und dann am nächsten Tag um 17:00 Uhr. Es wird aber immer ab 17:00 Uhr der Ausdruck wahr sein und ab 04:00 Uhr false.
Nur noch mal zur Sicherheit:
Das heisst, wenn bei einem Intervall die zweite Angabe kleiner als die erste ist, wird der zweite Zeitpunkt auf den nächsten Tag verschoben?
[17:00-04:00] wäre also zwischen 17:00 Uhr abends heute und 4:00 Uhr morgens am nächsten Tag wahr?
Zitat von: Brockmann am 17 Juli 2014, 06:47:16Ich sehe gerade, das wird so nicht funktionieren und zwar für den Fall, dass sunsset vor 17:00 Uhr liegt, dann wird zwar nochmal um 17:00 Uhr getriggert aber sunset ist dann nicht wahr.Code AuswählenDOIF ([{sunset_abs()}] and [17:00-sunrise_abs()}]) (set Licht on) DOELSE (set Licht off)
DOIF ([{sunset(0,"17:00","21:00")}-{sunrise_abs()}]) (set Licht on) DOELSE (set Licht off)
([Umweltsensor:Helligkeit]< 0.011 or $hms gt "23:00") (set Rolllaeden on,set ROLL_Schlafzimmer AB) DOELSEIF ([Umweltsensor:Helligkeit]> 0.011 or $hms gt "07:00") (set Rolllaeden off)
Zitat von: cwagner am 18 Juli 2014, 08:08:21Ich habe darüber auch schon nachgedacht, aber meiner Meinung nach ist es besser, wie es jetzt ist. Vor allem der Begriff "once" würde nahelegen, dass das DOIF nur ein einziges Mal und dann nie wieder ausgeführt wird. Und wenn man standardmäßig "do always" verwendet, würden genau solche Fälle, wie Du sie im Folgenden beschreibst, recht häufig auftreten.
Eine Anregung: I.d.R. will man ja in der Steuerung, dass etwas "allways" gedoed wird, was halten Du und die Mitbnenutzer davon, dass das attribut do als Default schon auf allways steht?
Wenn man dann eine Eintagsfliege will, kann es ja auf - huch - once gibt es gar nicht im Dropdown?
Zitat von: cwagner am 18 Juli 2014, 08:08:21Hast Du in diesem Fall vielleicht "do always" gesetzt? Das würde das beschriebene Verhalten jedenfalls erklären. Ohne "do always" sollte dieses DOIF immer nur einmal ausgeführt werden, wenn der Helligkeitswert unter die Schwelle sinkt und dann erst wieder, wenn er die Schwelle wieder überschreitet.
Ein zweites Thema: Wie könnte ich verhindern, dass dieses DOIF ständig immer wieder CMD1 von Eintreten der Dunkelheit bis Ende der Dunkelheit und CMD2 vice versa "feuert".
define n notify sensor set aktor on
([Umweltsensor:Helligkeit]< 0.011 or $hms gt "23:00") (set Rolllaeden on,set ROLL_Schlafzimmer AB) DOELSEIF ([Umweltsensor:Helligkeit]> 0.011 or $hms gt "07:00") (set Rolllaeden off)
([Umweltsensor:Helligkeit]< 0.011 or $hms gt "23:00") (set Rolllaeden on,set ROLL_Schlafzimmer AB) DOELSEIF ([Umweltsensor:Helligkeit]> 0.015 or $hms gt "07:00") (set Rolllaeden off)
Zitat von: Damian am 16 Juli 2014, 18:34:12
Poste mal deine Definition, dann kann ich dir sagen, ob die Sache sinnvoll ist. Vielleicht ist es nur ein Verständnisproblem.
Gruß
Damian
([Heizungsmode] eq "off" and [Pac:state] > 1500 and [HZ_Wohnzimmer_Weather] > 22 and [Terassentuer] eq "Closed" and $hms gt "10:00" and $hms lt "18:30") (set Klima_WZ on) DOELSEIF ([Heizungsmode] eq "auto" and [Pac:state] > 1500 and [HZ_Wohnzimmer_Weather] < 24 and [Terassentuer] eq "Closed" and $hms gt "08:00" and $hms lt "18:30") (set Klima_WZ on) DOELSEIF ([Klima_WZ_manuOn] eq "on" and [HZ_Wohnzimmer_Weather] > 23 and [Terassentuer] eq "Closed") (set Klima_WZ on) DOELSEIF ([Heizungsmode] eq "off" and [Pac:state] < 1000 and [Terassentuer] eq "Closed") (set Klima_WZ off) DOELSEIF ([Klima_WZ_manuOn] eq "off") (set Klima_WZ off) DOELSE (set Klima_WZ ff)
Zitat von: cwagner am 18 Juli 2014, 12:00:00
Unter den Attributen fand ich das serienmäßige eventmap, dass ich schon bei THRESHOLD verwandt habe, um in einer Webübersicht "Klartext" zu haben. Das scheint aber bei DOIF (noch nicht?) zu funktionieren.
Zitat von: satprofi am 18 Juli 2014, 12:20:05Ohne zu verstehen, was die Abfragen bei dir im Einzelnen bedeuten, habe ich dein Konstrukt etwas zusammengefasst und auf Intervalle umgestellt. do always macht hier keinen Sinn. Sonst wird unnötig bei dir ein set-Befehl wiederholt (wenn etwas auf off gesetzt wurde, dann muss man es beim nächsten Trigger nicht schon wieder auf off setzen)
Hallo.
Vielleicht findest du den/die fehler.Code Auswählen
([Heizungsmode] eq "off" and [Pac:state] > 1500 and [HZ_Wohnzimmer_Weather] > 22 and [Terassentuer] eq "Closed" and $hms gt "10:00" and $hms lt "18:30") (set Klima_WZ on) DOELSEIF ([Heizungsmode] eq "auto" and [Pac:state] > 1500 and [HZ_Wohnzimmer_Weather] < 24 and [Terassentuer] eq "Closed" and $hms gt "08:00" and $hms lt "18:30") (set Klima_WZ on) DOELSEIF ([Klima_WZ_manuOn] eq "on" and [HZ_Wohnzimmer_Weather] > 23 and [Terassentuer] eq "Closed") (set Klima_WZ on) DOELSEIF ([Heizungsmode] eq "off" and [Pac:state] < 1000 and [Terassentuer] eq "Closed") (set Klima_WZ off) DOELSEIF ([Klima_WZ_manuOn] eq "off") (set Klima_WZ off) DOELSE (set Klima_WZ ff)
do always
wait 300:300:0:300:0:300
Gruss.
((([Heizungsmode] eq "off" and [HZ_Wohnzimmer_Weather] > 22) or ([Heizungsmode] eq "auto" and [HZ_Wohnzimmer_Weather] < 24))
and [Pac:state] > 1500 and [10:00-18:30] and [Terassentuer] eq "Closed")
(set Klima_WZ on)
DOELSEIF ([Klima_WZ_manuOn] eq "on" and [HZ_Wohnzimmer_Weather] > 23 and [Terassentuer] eq "Closed")
(set Klima_WZ on)
DOELSEIF ([Heizungsmode] eq "off" and [Pac:state] < 1000 and [Terassentuer] eq "Closed")
(set Klima_WZ off)
DOELSEIF ([Klima_WZ_manuOn] eq "off")
(set Klima_WZ off)
DOELSE
(set Klima_WZ off)
wait 300:0:300:0:300
Zitat von: satprofi am 19 Juli 2014, 17:38:49
aha, danke.
kann man jetzt zeileneinrückung verwenden?
das wäre ja eine hilfe.
gruss
Zitat von: Damian am 19 Juli 2014, 17:23:17
Ohne zu verstehen, was die Abfragen bei dir im Einzelnen bedeuten, habe ich dein Konstrukt etwas zusammengefasst und auf Intervalle umgestellt. do always macht hier keinen Sinn. Sonst wird unnötig bei dir ein set-Befehl wiederholt (wenn etwas auf off gesetzt wurde, dann muss man es beim nächsten Trigger nicht schon wieder auf off setzen)Code Auswählen((([Heizungsmode] eq "off" and [HZ_Wohnzimmer_Weather] > 22) or ([Heizungsmode] eq "auto" and [HZ_Wohnzimmer_Weather] < 24))
and [Pac:state] > 1500 and [10:00-18:30] and [Terassentuer] eq "Closed")
(set Klima_WZ on)
DOELSEIF ([Klima_WZ_manuOn] eq "on" and [HZ_Wohnzimmer_Weather] > 23 and [Terassentuer] eq "Closed")
(set Klima_WZ on)
DOELSEIF ([Heizungsmode] eq "off" and [Pac:state] < 1000 and [Terassentuer] eq "Closed")
(set Klima_WZ off)
DOELSEIF ([Klima_WZ_manuOn] eq "off")
(set Klima_WZ off)
DOELSE
(set Klima_WZ off)
wait 300:0:300:0:300
Gruß
Damian
Zitat von: satprofi am 20 Juli 2014, 11:45:27
leider heute keine einschaltung mehr mit diesem code.
timer läuft seit 10:00 aber keine aktivität.
[edit]
Habe fehler gefunden, vielöleicht ein bug? wenn einer der readings " -???- " hat läuft das ganze nicht an. dies ist aber nach stromausfall oder restart von fhem der fall.
wie kann man das umgehen?
gruss
Zitat von: satprofi am 20 Juli 2014, 19:33:57
hallo.
es liegt nicht an DOIF, sondern an fhem selbst. denn werte die keine zustandsänderung nach reboot des systems haben, werden mit -???- gelistet.
DOIF ([tf_Sens1] eq "on" or [tf_Sens2] eq "on" or [tf_Sens3] eq "on" or . . . . .) (set display on_for_timer 20)
Zitat von: TecCheck am 20 Juli 2014, 22:21:54
Hallo zusammen,
Du solltest auf jeden Fall nach dem einchecken (das kommt, da bin ich sicher) neben einem Eintrag in die CommandRef eine WikiSeite mit allen Beispielen hier aus dem Post in Betracht ziehen. Du hast sicher viel Arbeit in dieses Modul investiert und es wäre zu schade, wenn es aus Unkenntniss kaum genutzt würde.
Zitat
So, jetzt mein (Luxus)Problem:
Ich möchte bei jeder Statusänderung (egal welche Änderung) einer meiner Tür/Fenstersensoren
einen Einschaltbefehl an ein Display senden.
Ist es mit DOIF möglich, dies zu erreichen, ohne jeden Sensor einzeln aufzuzählen wie:Code AuswählenDOIF ([tf_Sens1] eq "on" or [tf_Sens2] eq "on" or [tf_Sens3] eq "on" or . . . . .) (set display on_for_timer 20)
z.B. in dem man auf eine Statusänderung in einer Gruppe triggert wie zb.:
DOIF ([TF_SensorenGruppe] eq "on" or [TF_SensorenGruppe] eq "off") (set display on_for_timer 20)
oder kannst du eine solche funktion einbauen?
Ist das 'gemeinsame triggern' überhaupt in fhem möglich??
Zitat von: TecCheck am 20 Juli 2014, 22:53:22
Das nenne ich mal Support!
Da kann sich manche Hotline ein paar Scheiben von abschneiden.
Zitat von: Hoeness am 12 Juli 2014, 22:27:16
Hi,
ich bins mal wieder ;-)
Ich möchte mit DOIF ein dummy toggeln (aus/an):
Der Trigger hierzu kommt von einem Taster über GPIO: hier die Config:Code Auswählen######## Input 4 -Beregnung
define In4_Beregnung RPI_GPIO 10
attr In4_Beregnung active_low no
attr In4_Beregnung debounce_in_ms 50
attr In4_Beregnung devStateIcon aus:rain-icon_off an:rain-icon_on
attr In4_Beregnung direction input
attr In4_Beregnung eventMap on:an off:aus
attr In4_Beregnung group 1_Input
attr In4_Beregnung interrupt rising
attr In4_Beregnung pud_resistor down
attr In4_Beregnung room Bewässerung_DOIF
attr In4_Beregnung webCmd an:aus
Der dummy ist wie folgt konfiguriert:Code Auswählen######## Beleuchtung Terasse
define man_Bewaesserung dummy
attr man_Bewaesserung group 2_Output
attr man_Bewaesserung room Bewässerung_DOIF
attr man_Bewaesserung webCmd an:aus
attr man_Bewaesserung devStateIcon aus:Lampe_off an:Lampe_on
attr man_Bewaesserung eventMap on:aus off:an
Mein DOIF sieht wie folgt aus:Code Auswählendefine n_In4_Beregnung DOIF ([In4_Beregnung] eq "an" and [man_Bewaesserung] eq "aus") (set man_Bewaesserung an) DOELSEIF ([In4_Beregnung] eq "an" and [man_Bewaesserung] eq "an") (set man_Bewaesserung aus)
Irgendwie stehe ich hier auf dem Schlauch.
2014-07-20 23:38:21 DOIF n_In4_Beregnung cmd_1
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd: 1
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd_event: man_Bewaesserung
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_error: no error
2014-07-20 23:38:21 dummy man_Bewaesserung aus
2014-07-20 23:38:21 dummy man_Bewaesserung an
2014-07-20 23:38:21 DOIF n_In4_Beregnung cmd_2
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd: 2
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd_event: In4_Beregnung
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_error: no error
2014-07-20 23:38:21 RPI_GPIO In4_Beregnung Pinlevel: high
2014-07-20 23:38:21 RPI_GPIO In4_Beregnung an
2014-07-20 23:38:22 RPI_GPIO In4_Beregnung Pinlevel: low
2014-07-20 23:38:22 RPI_GPIO In4_Beregnung aus
2014-07-20 23:38:22 RPI_GPIO In4_Beregnung Langpress: off
Zitat von: Hoeness am 21 Juli 2014, 00:11:36
Hi,
Sorry für meinen späten Kommentar zu euren Antworten.
Ersteinmal möchte ich danke für eure Bemühungen sagen.
Da mein letzter Post ein paar Seiten her ist hier nochmal mein Problem:
Hat sich noch nicht viel geändert. Ich habe heute wieder ein paar Stunden experimentiert. Bin aber nicht weitergekommen.
Im Event Monitor kann ich sehen, dass das dummy man_Bewaesserung aus und danach sofort wieder eingeschaltet wird. Warum ist mir schleierhaft.Code Auswählen2014-07-20 23:38:21 DOIF n_In4_Beregnung cmd_1
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd: 1
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd_event: man_Bewaesserung
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_error: no error
2014-07-20 23:38:21 dummy man_Bewaesserung aus
2014-07-20 23:38:21 dummy man_Bewaesserung an
2014-07-20 23:38:21 DOIF n_In4_Beregnung cmd_2
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd: 2
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd_event: In4_Beregnung
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_error: no error
2014-07-20 23:38:21 RPI_GPIO In4_Beregnung Pinlevel: high
2014-07-20 23:38:21 RPI_GPIO In4_Beregnung an
2014-07-20 23:38:22 RPI_GPIO In4_Beregnung Pinlevel: low
2014-07-20 23:38:22 RPI_GPIO In4_Beregnung aus
2014-07-20 23:38:22 RPI_GPIO In4_Beregnung Langpress: off
Vielleicht kann mir jemand helfen.
attr n_In4 wait 1:1
Zitat von: Damian am 21 Juli 2014, 08:16:37
Ich kann das hier z. Zt. aus dem Urlaub nicht nachstellen. Vielleicht hat es doch etwas damit zu tun, dass durch das Setzen des Dummys das Event durch fhem nicht unterbunden wird und erneut ein Event bei n_In4 auslöst.
Du kannst mal probierenCode Auswählenattr n_In4 wait 1:1
zu setzen. Damit wird ein Verzögerungstimer von 1 Sekunde gesetzt, damit könnte das Problem umgangen werden.
Gruß
Damian
define n_In4_Beregnung DOIF ([In4_Beregnung] eq "an")
(IF ([man_Bewaesserung] eq "aus") (set man_Bewaesserung an) ELSE (set man_Bewaesserung aus))
attr n_In4 do always
Zitat von: Damian am 21 Juli 2014, 08:53:32Tja, ganz ohne wird es wohl auch in Zukunft nicht gehen. ;)
Und ich dachte IF bräuchte man gar nicht mehr :)
define CMD_dtoggle cmdalias dtoggle .* AS IF (Value("$EVTPART0") eq "an")(set $EVTPART0 aus) ELSE (set $EVTPART0 an)
define n_In4_Beregnung DOIF ([In4_Beregnung] eq "an") (dtoggle man_Bewaesserung)
define CMD_dtoggle cmdalias dtoggle .* AS IF (Value("$EVTPART0") eq "an")(set $EVTPART0 aus) ELSE (set $EVTPART0 an)
Zitat von: Hoeness am 21 Juli 2014, 10:57:33Einfach in die Kommandozeile in der Weboberfläche einfügen. Der allgemeine Konsens hier im Forum ist: Möglichst nichts direkt in der fhem.cfg erstellen/bearbeiten.Code Auswählendefine CMD_dtoggle cmdalias dtoggle .* AS IF (Value("$EVTPART0") eq "an")(set $EVTPART0 aus) ELSE (set $EVTPART0 an)
füge ich irgendwo (weit oben) in meine fhem.cfg ein.
define Cafe_Abends_Aus DOIF ([20:59-21:00] and [t5.ku.sd1_Pwr:power] < 2) (set t5.ku.sd1_Sw off)
Zitat von: Simon74 am 23 Juli 2014, 23:39:19Da das ganze ja nur einmal pro Tag ausgeführt werden soll, kannst Du das Intervall weglassen und einfach [21:00] schreiben.Code Auswählendefine Cafe_Abends_Aus DOIF ([20:59-21:00] and [t5.ku.sd1_Pwr:power] < 2) (set t5.ku.sd1_Sw off)
Ich hätte nun aber gerne im Logfile stehen das <DOIF "Cafe_Abends_Aus"> ausgelöst wurde, wie am einfachsten ?
Zitat von: RoBra81 am 24 Juli 2014, 13:11:44
Hallo,
ich bin gerade dabei meine Lüftersteuerung zu bauen. Ich möchte die maximale Lüfterstufe (0 bis 10) auf Basis verschiedener Kriterien begrenzen. Dabei habe ich an DOIF gedacht. Nun zu meiner Frage: eines der Kriterien soll die Zeit sein (Lüfter im Schlafzimmer nachts nicht auf höchster Stufe). Das wäre mit DOIF und [xx:00] ja kein Problem. Nun würde ich aber gern die Zeit dynamisch halten (Dropdownliste an meinem Lüftungsdummy). Gibt es nun eine Möglichkeit, wenn ein Nutzer eine Zeit auswählt (set LueftungsDummy Ruhe_Ab 10 => wird in einem Reading des Dummys gespeichert) daraus ein DOIF-Event [10:00] zu machen?
Vielen Dank
Ronny
define azLichtAus DOIF ([az_licht] eq "on")({Log 1,"az_licht wurde automatisch abgeschaltet";};;set az_licht off)
attr azLichtAus wait 10
azLichtAus: {Log 1,"az_licht wurde automatisch abgeschaltet";};;;;set az_licht off: Unknown command {Log, try help.
Unknown command };;set, try help.
Zitat von: gsbox am 24 Juli 2014, 15:42:50Versuch es mal mitCode Auswählendefine azLichtAus DOIF ([az_licht] eq "on")({Log 1,"az_licht wurde automatisch abgeschaltet";};;set az_licht off)
...abgeschaltet"},set az_licht off)
Zitat von: Damian am 24 Juli 2014, 15:15:38Zu welchem Zeitpunkt wird die Funktion denn zur Berechnung aufgerufen und der Timer gesetzt? Mein Eindruck ist, RoBra81 will einfach irgendwann im Laufe des Tages am Dummy eine Zeit einstellen und danach soll sich das DOIF dann richten. Aber das DOIF bekommt doch nichts davon mit, dass am Dummy etwas geändert wurde. Müsste da nicht irgendwie noch ein Trigger dazu, der bei jeder Änderung am Dummy für die Neuberechnung des Timers sorgt?
Zeiten kann man auch als Funktionen mit [{funktion(...)}] angeben. Dazu musst du dir eine eigene Funkion programmieren, die dann die entsprechende Zeit als Returnwert im Format HH:MM oder HH:MM:SS liefert, siehe z. B. sunset(...).
Zitat von: gsbox am 24 Juli 2014, 16:38:56Möglicherweise geht es noch eleganter, aber Du könntest einen Dummy "Anwesenheits-Simulation" definieren und in jedes dieser DOIFs die Bedingung
Jetzt definiere ich ja einige DOIF-Defines. Ist es möglich, diese zu gruppieren, so dass ich diese "Anwesenheits-Simulation" mit einem Atttribut aktivieren/deaktivieren kann ?
...and [Anwesenheits-Simulation] eq "on")
((([Heizungsmode] eq "off" and [HZ_Wohnzimmer_Weather] > 22) or ([Heizungsmode] eq "auto" and [HZ_Wohnzimmer_Weather] < 24)) and [Pac] > 1500 and [10:00-18:30] and [Terassentuer] eq "Closed")
(set Klima_WZ on)
DOELSEIF (([Heizungsmode] eq "off") or ([Heizungsmode] eq "auto") and [Pac] < 1000 and [Terassentuer] eq "Closed")
(set Klima_WZ off)
DOELSEIF ([Klima_WZ_manuOn] eq "on" and [HZ_Wohnzimmer_Weather] > 22 and [Terassentuer] eq "Closed")
(set Klima_WZ on)
DOELSEIF ([Klima_WZ_manuOn] eq "off")
(set Klima_WZ off)
DOELSE
(set Klima_WZ off)
Zitat von: satprofi am 24 Juli 2014, 18:55:50
Seit installation der neueren version klappt folgendes nicht mehr richtig
Achtung: Diese Version ist intern nicht abwärtskompatibel zu der vorherigen. Daher:
System anhalten, Modul kopieren, System wieder hochfahren (kein reload)
Danach bei allen bereits definierten DOIF-Modulen über die Weboberfläche auf DEF klicken und über modify-Button bestätigen.
Zitat von: satprofi am 24 Juli 2014, 19:12:12Auf was steht denn last_cmd?
Ja, hab ich. auch gelöscht und neu definiert.
doif schaltet nur mehr wenn die zeit erreicht wird. brauch ich jetzt "do always" ?
Zitat von: satprofi am 24 Juli 2014, 21:54:19Dann funktioniert alles wie programmiert.
Cmd-5
Zitat von: Hoeness am 24 Juli 2014, 22:34:54
Hallo,
ich habe eine Frage zu den Wochentagen, die ich bei Zeitangaben definieren kann:
1-6 entspricht Montag-Samstag?
7 entspricht WE
8 entspricht nicht WE
Wie kann ich den Sonntag definieren?
Ich hätte auch noch eine Idee.
Kann DOIF eventuell noch so erweitern, dass ich angeben kann, dass alle 2,3,4,5,... Tage etwas ausgelöst werden soll?
Gruß Hoeness
ZitatKann DOIF eventuell noch so erweitern, dass ich angeben kann, dass alle 2,3,4,5,... Tage etwas ausgelöst werden soll?
Zitat von: Damian am 24 Juli 2014, 23:30:02
Dann funktioniert alles wie programmiert.
Wenn cmd-5 (off) zuletzt ausgeführt wurde, dann wird es nicht noch mal ausgeführt (wozu auch, off ist off)
Gruß
Damian
define DI_Radio DOIF ([08:00-10:00]|7) (set Radio on) DOELSE (set Radio off)
funktioniert bei mir nicht, auch am Wochentag wird eingeschaltet und dann aber auch nicht mehr ausgeschaltet. Ohne angehängte 7 oder 8 funktioniert's...Genau so ist es mit anderen Wochentagen...sobald ich eine Tageszahl hinter eine Zeit setze, schaltet DOIF zwar ein, aber nicht mehr aus. Was mache ich falsch?
Zitat von: UweH am 25 Juli 2014, 18:38:30
Hallo,
dieses Beispiel:Code Auswählendefine DI_Radio DOIF ([08:00-10:00]|7) (set Radio on) DOELSE (set Radio off)
funktioniert bei mir nicht, auch am Wochentag wird eingeschaltet und dann aber auch nicht mehr ausgeschaltet. Ohne angehängte 7 oder 8 funktioniert's...Genau so ist es mit anderen Wochentagen...sobald ich eine Tageszahl hinter eine Zeit setze, schaltet DOIF zwar ein, aber nicht mehr aus. Was mache ich falsch?
Zitat von: satprofi am 25 Juli 2014, 10:23:54Also, das liegt eher an der Definition bzw. am Verständnis. Um 18:30 wird getriggert mit false in der ersten Bedingung, dadurch wird dein letzter Fall (DOELSE) ausgeführt. Wenn du dann Fenster aufmachst dann sind ebenfalls alle Bedingungen, wo Fenster abgefragt wird false und dadurch ist wieder dein DOELSE-Fall dran und dann passiert natürlich nichts, weil er schon zuvor geschaltet wurde. Wenn du etwas anderes willst, musst du dir eine andere Definition überlegen. Dein letzter DOELSE-Fall macht dir wahrscheinlich mehr kaputt als du annimmst.
nein, wenn terassentuer offen, dann keine reaktion. cmd_5 war ja nach 18:30 der fall, das klappt ja.
ich dachte du fragtest nach dem letzten state.
[edit]
ohne "do always" klappt die abschaltung nicht. da wird nur der timer abgefragt, also die angegebene zeit.
alles andere schaltet nicht ab. werde das ganze morgen aufs neue testen.
Zitat von: UweH am 25 Juli 2014, 18:38:30
Hallo,
dieses Beispiel:Code Auswählendefine DI_Radio DOIF ([08:00-10:00]|7) (set Radio on) DOELSE (set Radio off)
funktioniert bei mir nicht, auch am Wochentag wird eingeschaltet und dann aber auch nicht mehr ausgeschaltet. Ohne angehängte 7 oder 8 funktioniert's...Genau so ist es mit anderen Wochentagen...sobald ich eine Tageszahl hinter eine Zeit setze, schaltet DOIF zwar ein, aber nicht mehr aus. Was mache ich falsch?
define DI_Radio DOIF ([08:00-10:00|7]) (set Radio on) DOELSE (set Radio off)
([STATUS] =~ "Abwesend|Urlaub")
(cmd 1)
DOELSEIF([{OldValue("STATUS")}] ne "Nacht")
(cmd 2)
DOIF: the at function "OldValue("STATUS")" must return a timespec and not Anwesend.: {OldValue("STATUS")}
Zitat von: Brockmann am 30 Juli 2014, 08:26:55
Gerade habe ich folgendes DOIF versucht:Code Auswählen([STATUS] =~ "Abwesend|Urlaub")
(cmd 1)
DOELSEIF([{OldValue("STATUS")}] ne "Nacht")
(cmd 2)
Das führt zur FehlermeldungCode AuswählenDOIF: the at function "OldValue("STATUS")" must return a timespec and not Anwesend.: {OldValue("STATUS")}
Das verstehe ich auch: DOIF akzeptiert in dieser Form nur Funktionen, die eine Zeit zurückliefern, aus der sich ein Timer generieren lässt.
Mein Frage ist, ob diese Einschränkung eigentlich wirklich notwendig ist? Prinzipiell könnte man doch eine beliebige Funktion in dieser Form verwenden.
Liefert die Funktion eine Zeit zurück, wird ein entsprechender Timer generiert. Wenn nicht, wird sei einfach nur als Bedingung ausgewertet, wenn das DOIF anderweitig angestoßen wird.
Das böte auch die Möglichkeit, in DOIFs Bedingungen zu formulieren, die nur zur Laufzeit überprüft werden, ohne selbst Trigger für das DOIF zu sein, was in manche Situationen im Hinblick auf Effizienz durchaus sinnvoll sein kann.
(Es geht mir dabei auch gar nicht um das konkrete Beispiel. Das habe ich nun durch Einfügen entsprechenden Perl-Codes innerhalb von (cmd 2) gelöst, was ich aber als "unschöne" Lösung empfinde.)
(OldValue("STATUS") ne "Nacht")
([&STATUS] ne "Nacht")
entspräche: (OldValue("STATUS") ne "Nacht")
allerdings mit Trigger und damit einer Auswertung beim Event von STATUS.([STATUS] and (OldValue("STATUS") ne "Nacht")
Zitat von: Brockmann am 30 Juli 2014, 12:10:53Ja, ich muss auch immer aufpassen, dass man sich die Perl-Syntax nicht verbaut & kann nämlich auch eine Referenz auf Funktionen sein. Durch DOIF wird IF zunehmend an Bedeutung verlieren, obwohl es, wie wir beim Toggeln gesehen haben, durchaus noch seine Berechtigung hat. Ich werde spätestens vor dem Einchecken die Doku aus IF in die DOIF-Doku zusätzlich übernehmen. Ich denke, dass die meisten z. B. auch nicht wissen, dass man auch solche Sache beim DOIF machen kann:
Hallo Damian,
Danke für die Erläuterung. Da kann DOIF wieder mal schon mehr, als ich dachte. ;)
Vielleicht wäre es sinnvoll, die Dokumentation um ein solches Beispiel zu erweitern. Bislang ist da nur sunset in eckigen Klammern drin, was ja nochmal etwas anderes ist.
(Ja, ich weiß, in der Featureliste steht was von voller Perl-Unterstützung, aber was das bedeutet und wie man es einsetzen kann, erkennt eben nicht jeder gleich (*Pfeil auf mich*).
Dass bestimmte Arten von Bedingungen keinen Trigger definieren, empfinde ich nicht als Nachteil, sondern sogar als Vorteil, solange man die Wahl hat, welche Variante man verwendet.
Das lässt einem Spielraum, bei der Definition ein wenig auf Effizienz zu achten.
Eine spezielle Unterstützung für OldValue fände ich übertrieben, da es ja doch eher exotisch ist, OldValue als Trigger zu verwenden. Und man könnte es auch jetzt schon definieren:Code Auswählen([STATUS] and (OldValue("STATUS") ne "Nacht")
Dann wird bei jedem Wechsel von STATUS geprüft, ob der vorherige Zustand "Nacht" war. Dafür braucht es keine eigene Syntax, finde ich.
define di_temp DOIF ( [18:00] and ([outdoor:temperature] > 10)) (set thermostat desired-temp {([thermostat:desired-temp:d]+1)})
attr di_Rolladen State Heute beträgt die Temperatur [Wetter:temp] Grad, der Rolladen ist jetzt [di_Rolladen]
define di_Fenster DOIF ([Fenster] eq "closed") and [Tuer] eq "closed)
DOELSEIF ([Fenster] eq "open" and [Tuer] eq "closed)
DOELSEIF ([Fenster] eq "closed" and [Tuer] eq "open")
DOELSEIF ([Fenster] eq "open" and [Tuer] eq "open")
attr di_Fenster cmdState beide zu|Fenster offen|Tür offen|beide offen
Zitat von: Damian am 30 Juli 2014, 12:54:58Könnte ich damit den State eines DOIFs individuell anpassen, also z. B. so:
Man wird beliebigen Status, unabhängig von Abfragen definieren können:Code Auswählenattr di_Rolladen State Heute beträgt die Temperatur [Wetter:temp] Grad, der Rolladen ist jetzt [di_Rolladen]
Zusätzlich wird man auch Zahlen in der Statusausgabe formatieren können wie beim THRESHOLD über sprintf.
attr mein_DOIF State [mein_DOIF:last_cmd] durch [mein_DOIF:last_cmd_event] um [mein_DOIF:...
Zitat von: Damian am 30 Juli 2014, 12:54:58Das heißt, man sollte auch jetzt schon "leere" Ausführungsteile angeben können? Das habe ich nämlich heute morgen gerade erfolglos ausprobiert:
Dann sollen reine Status-Definitionen ohne Ausführungteil möglich sein:
Das kann man zwar jetzt auch schon, aber man muss noch () für die Ausführung angeben:
DI_Test DOIF: no commands: ([STATUS] eq "Anwesend") ()
Zitat von: Brockmann am 30 Juli 2014, 13:44:28mit [DEVICE:Reading] kannst du beliebige Readings angeben, insbesondere die eigenen deines DOIF-Moduls. Beim Status muss ich noch schauen, sonst beißt sich die Katze in den Schwanz.
Könnte ich damit den State eines DOIFs individuell anpassen, also z. B. so:Code Auswählenattr mein_DOIF State [mein_DOIF:last_cmd] durch [mein_DOIF:last_cmd_event] um [mein_DOIF:...
Ups, dabei fällt mir gerade ein, auf den TimeStamp eines Readings kann DOIF nicht zugreifen, oder?
Ich hätte im Status der meisten DOIFs am liebsten den letzten Befehl, das auslösende Objekt und den Zeitpunkt des Befehls stehen, damit man das direkt ablesen kann.
ZitatFür Timestamps muss ich mir noch was einfallen lassen.
Also quasi: Rolladen_runter durch Wettersensor um 2014-07-30 13:20:29
Zitat
Das heißt, man sollte auch jetzt schon "leere" Ausführungsteile angeben können? Das habe ich nämlich heute morgen gerade erfolglos ausprobiert:Code AuswählenDI_Test DOIF: no commands: ([STATUS] eq "Anwesend") ()
define di DOIF
attr di State Die Aussentemperatur beträgt: [Aussen:temp], die Feuchtigkeit beträgt [Aussen:humidity]
#define di_Waschmaschine DOIF ([Verbrauch_WAMA_Wh:power]<3) (set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '',set Waschmaschine off)
#attr di_Waschmaschine wait 300
Momentan auskommentiert damit mein Handy Ruhe gibt.2014.08.02 12:27:51 3: CUL_HM set CUL_HM_HM_LC_SW4_SM_263839 statusRequest
2014.08.02 12:27:52 3: CUL_HM set Garagentor statusRequest
2014.08.02 12:34:17 3: CUL_HM set Waschmaschine off
2014.08.02 12:34:17 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 12:41:57 3: CUL_HM set Waschmaschine off
2014.08.02 12:41:57 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 12:49:38 3: CUL_HM set Waschmaschine off
2014.08.02 12:49:38 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 12:54:59 3: CUL_HM set Waschmaschine off
2014.08.02 12:54:59 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 13:02:16 3: CUL_HM set Waschmaschine off
2014.08.02 13:02:16 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 13:07:21 3: CUL_HM set Waschmaschine off
2014.08.02 13:07:21 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 13:12:32 3: CUL_HM set Waschmaschine off
2014.08.02 13:12:32 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 13:17:49 3: CUL_HM set Waschmaschine off
2014.08.02 13:17:49 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 13:25:01 3: CUL_HM set Waschmaschine off
2014.08.02 13:25:01 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 13:30:02 3: CUL_HM set Waschmaschine off
2014.08.02 13:30:02 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 13:35:10 3: CUL_HM set Waschmaschine off
2014.08.02 13:35:10 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 13:40:23 3: CUL_HM set Waschmaschine off
2014.08.02 13:40:23 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 13:47:30 3: CUL_HM set Waschmaschine off
2014.08.02 13:47:30 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 13:54:34 3: CUL_HM set Waschmaschine off
2014.08.02 13:54:34 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 14:00:13 3: CUL_HM set Waschmaschine off
2014.08.02 14:00:13 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 14:07:57 3: CUL_HM set Waschmaschine off
2014.08.02 14:07:57 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 14:13:20 3: CUL_HM set Waschmaschine off
2014.08.02 14:13:20 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 14:20:40 3: CUL_HM set Waschmaschine off
2014.08.02 14:20:40 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 14:25:46 3: CUL_HM set Waschmaschine off
2014.08.02 14:25:46 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 14:30:59 3: CUL_HM set Waschmaschine off
2014.08.02 14:30:59 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 14:36:18 3: CUL_HM set Waschmaschine off
2014.08.02 14:36:18 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 14:43:32 3: CUL_HM set Waschmaschine off
2014.08.02 14:43:32 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 14:48:35 3: CUL_HM set Waschmaschine off
2014.08.02 14:48:35 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 14:53:44 3: CUL_HM set Waschmaschine off
2014.08.02 14:53:44 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 14:59:00 3: CUL_HM set Waschmaschine off
2014.08.02 14:59:00 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 15:06:09 3: CUL_HM set Waschmaschine off
2014.08.02 15:06:09 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 15:13:16 3: CUL_HM set Waschmaschine off
2014.08.02 15:13:16 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 15:18:56 3: CUL_HM set Waschmaschine off
2014.08.02 15:18:56 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 15:26:43 3: CUL_HM set Waschmaschine off
2014.08.02 15:26:43 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 15:32:08 3: CUL_HM set Waschmaschine off
2014.08.02 15:32:08 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 15:39:30 3: CUL_HM set Waschmaschine off
2014.08.02 15:39:30 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 15:44:38 3: CUL_HM set Waschmaschine off
2014.08.02 15:44:38 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 15:49:53 3: CUL_HM set Waschmaschine off
2014.08.02 15:49:53 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 15:55:14 3: CUL_HM set Waschmaschine off
2014.08.02 15:55:14 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 16:02:31 3: CUL_HM set Waschmaschine off
2014.08.02 16:02:31 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 16:07:35 3: CUL_HM set Waschmaschine off
2014.08.02 16:07:35 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 16:12:46 3: CUL_HM set Waschmaschine off
2014.08.02 16:12:46 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 16:18:03 3: CUL_HM set Waschmaschine off
2014.08.02 16:18:03 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 16:25:15 3: CUL_HM set Waschmaschine off
2014.08.02 16:25:15 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 16:30:16 3: CUL_HM set Waschmaschine off
2014.08.02 16:30:16 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 16:35:23 3: CUL_HM set Waschmaschine off
2014.08.02 16:35:23 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 16:40:37 3: CUL_HM set Waschmaschine off
2014.08.02 16:40:37 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 16:47:43 3: CUL_HM set Waschmaschine off
2014.08.02 16:47:43 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 16:54:47 3: CUL_HM set Waschmaschine off
2014.08.02 16:54:47 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 17:00:26 3: CUL_HM set Waschmaschine off
2014.08.02 17:00:26 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 17:08:10 3: CUL_HM set Waschmaschine off
2014.08.02 17:08:10 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 17:13:32 3: CUL_HM set Waschmaschine off
2014.08.02 17:13:32 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 17:20:52 3: CUL_HM set Waschmaschine off
2014.08.02 17:20:52 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 17:25:58 3: CUL_HM set Waschmaschine off
2014.08.02 17:25:58 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 17:31:11 3: CUL_HM set Waschmaschine off
2014.08.02 17:31:11 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 17:36:30 3: CUL_HM set Waschmaschine off
2014.08.02 17:36:30 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 17:43:44 3: CUL_HM set Waschmaschine off
2014.08.02 17:43:44 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 17:48:47 3: CUL_HM set Waschmaschine off
2014.08.02 17:48:47 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 17:53:56 3: CUL_HM set Waschmaschine off
2014.08.02 17:53:56 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 17:59:12 3: CUL_HM set Waschmaschine off
2014.08.02 17:59:12 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 18:06:20 3: CUL_HM set Waschmaschine off
2014.08.02 18:06:20 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014.08.02 18:12:21 3: CUL_HM set Garagentor getConfig
2014.08.02 18:12:23 3: CUL_HM set Garagentor on-for-timer 1
Zitatund hier her vermittelt wurdeAber nur weil du DOIF verwenden willst und das gehört HIER behandelt (und nicht 6 Seiten lang im Anfängerbereich).
Zitat2014.08.02 12:49:38 3: CUL_HM set Waschmaschine offpasst mAn nicht zu diesem aus dem Device-Logfile:
2014.08.02 12:49:38 2: di_Waschmaschine: set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
Zitat2014-08-02_12:49:58 Verbrauch_WAMA_Wh power: 0.01Da der Verbrauch erst 20 Sekunden SPÄTER in das Logfile wandert.
Zitat von: satprofi am 03 August 2014, 16:26:57
Hallo.
Ich habe hier einen denkfehler, bzw. denke ich zu einfach?
Leider funktioniert das and / or nicht. Es schaltet die Kellertuer auch wenn "Alarm_on" off ist.
(([Alarm_on] eq "on") and ([Fenster_Waschkueche] eq "Open") or ([Geraeteschupfen] eq "Open") or ([Kellertuer] eq "Open")) (set Alarm_Sirene on-for-timer 30)
Ziel ist: Alarm_Sirene on-for-timer 30 wenn Alarm_on und eine der bestimmten Türen offen. Oder muss ich für jede tür ein DOELSEIF erstellen?
gruss
perl error in condition: InternalDoIf('Heizungsmode','STATE','') eq "on" DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,""): syntax error at (eval 3517) line 1, near ""on" DOIF_time"
Zitat von: satprofi am 03 August 2014, 16:39:48
Aha, danke.
Verstehe ich das richtig, das sämtliche and und or in eigene Klammern sitzen müssen?
z.b.
(([Alarm_on] "on" and [06:00-18:00]) and ([Fenster_Waschkueche] eq "Open") or ([Geraeteschupfen] eq "Open") or ([Kellertuer] eq "Open")) (set Alarm_Sirene on-for-timer 30)
würde Sirene nur aktivieren wenn Alarm_on und Tür offen zw. 6:00 u. 18:00 ?
Zitat von: satprofi am 03 August 2014, 16:50:05
Hallo.
Gerade entdeckt:Code Auswählen
perl error in condition: InternalDoIf('Heizungsmode','STATE','') eq "on" DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,""): syntax error at (eval 3517) line 1, near ""on" DOIF_time"
hast Du einen Tip?
gruss
Internals:
DEF 24ABCE01
NAME Waschmaschine
NR 132
STATE on
TYPE CUL_HM
chanNo 01
device CUL_HM_HM_ES_PMSw1_Pl_24ABCE
Readings:
2014-08-02 18:49:40 CommandAccepted yes
2014-08-03 08:33:59 deviceMsg on (to HMLAN1)
2014-08-03 08:33:59 level 100
2014-08-03 08:33:59 pct 100
2014-08-03 08:33:59 recentStateType info
2014-08-03 08:33:59 state on
2014-08-03 08:33:59 timedOn off
Helper:
Role:
chn 1
prs 1
Attributes:
icon scene_washing_machine
model HM-ES-PMSw1-Pl
peerIDs 00000000,
room Übersicht,Keller
Zitat von: ostseehuepfer am 03 August 2014, 18:15:48
Hey,
also list di_Waschmaschine ergibt No device named di_Waschmaschine found
und list Waschmaschine ergibt Internals:Code AuswählenInternals:
DEF 24ABCE01
NAME Waschmaschine
NR 132
STATE on
TYPE CUL_HM
chanNo 01
device CUL_HM_HM_ES_PMSw1_Pl_24ABCE
Readings:
2014-08-02 18:49:40 CommandAccepted yes
2014-08-03 08:33:59 deviceMsg on (to HMLAN1)
2014-08-03 08:33:59 level 100
2014-08-03 08:33:59 pct 100
2014-08-03 08:33:59 recentStateType info
2014-08-03 08:33:59 state on
2014-08-03 08:33:59 timedOn off
Helper:
Role:
chn 1
prs 1
Attributes:
icon scene_washing_machine
model HM-ES-PMSw1-Pl
peerIDs 00000000,
room Übersicht,Keller
Grüße
Internals:
DEF ([Verbrauch_WAMA_Wh:power]<3) (set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '',set Waschmaschine off)
NAME di_Waschmaschine
NR 213
NTFY_ORDER 50-di_Waschmaschine
STATE ???
TYPE DOIF
Condition:
0 ReadingValDoIf('Verbrauch_WAMA_Wh','power','')<3
Devices:
0 Verbrauch_WAMA_Wh
all Verbrauch_WAMA_Wh
Do:
0 set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '',set Waschmaschine off
Helper:
last_cond -1
last_timer 0
sleeptimer -1
Readings:
0 Verbrauch_WAMA_Wh:power
Attributes:
wait 300
Zitat von: ostseehuepfer am 03 August 2014, 18:21:44
Hey,
sorry ja klar muss ich es erst akivierenCode AuswählenInternals:
DEF ([Verbrauch_WAMA_Wh:power]<3) (set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '',set Waschmaschine off)
NAME di_Waschmaschine
NR 213
NTFY_ORDER 50-di_Waschmaschine
STATE ???
TYPE DOIF
Condition:
0 ReadingValDoIf('Verbrauch_WAMA_Wh','power','')<3
Devices:
0 Verbrauch_WAMA_Wh
all Verbrauch_WAMA_Wh
Do:
0 set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '',set Waschmaschine off
Helper:
last_cond -1
last_timer 0
sleeptimer -1
Readings:
0 Verbrauch_WAMA_Wh:power
Attributes:
wait 300
Internals:
DEF ([Verbrauch_WAMA_Wh:power]<3) (set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '',set Waschmaschine off)
NAME di_Waschmaschine
NR 213
NTFY_ORDER 50-di_Waschmaschine
STATE cmd_2
TYPE DOIF
Readings:
2014-08-03 18:29:05 last_cmd 2
2014-08-03 18:29:05 last_cmd_event Verbrauch_WAMA_Wh
2014-08-03 18:39:56 last_error set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014-08-03 18:39:56 next_wait_timer no wait_timer
2014-08-03 18:29:05 state cmd_2
Condition:
0 ReadingValDoIf('Verbrauch_WAMA_Wh','power','')<3
Devices:
0 Verbrauch_WAMA_Wh
all Verbrauch_WAMA_Wh
Do:
0 set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '',set Waschmaschine off
Helper:
last_cond 1
last_timer 0
sleepdevice Verbrauch_WAMA_Wh
sleeptimer -1
Readings:
0 Verbrauch_WAMA_Wh:power
Attributes:
wait 300
Zitat von: ostseehuepfer am 03 August 2014, 18:41:31
Hier die Antwort nicht wundern hab ne 50 Watt Glühbirne dran gehängt anstelle der WamaCode AuswählenInternals:
DEF ([Verbrauch_WAMA_Wh:power]<3) (set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '',set Waschmaschine off)
NAME di_Waschmaschine
NR 213
NTFY_ORDER 50-di_Waschmaschine
STATE cmd_2
TYPE DOIF
Readings:
2014-08-03 18:29:05 last_cmd 2
2014-08-03 18:29:05 last_cmd_event Verbrauch_WAMA_Wh
2014-08-03 18:39:56 last_error set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '';set Waschmaschine off: OK
2014-08-03 18:39:56 next_wait_timer no wait_timer
2014-08-03 18:29:05 state cmd_2
Condition:
0 ReadingValDoIf('Verbrauch_WAMA_Wh','power','')<3
Devices:
0 Verbrauch_WAMA_Wh
all Verbrauch_WAMA_Wh
Do:
0 set pushmsg msg 'Keller' 'Waschmaschine FERTIG!!!' '' 0 '',set Waschmaschine off
Helper:
last_cond 1
last_timer 0
sleepdevice Verbrauch_WAMA_Wh
sleeptimer -1
Readings:
0 Verbrauch_WAMA_Wh:power
Attributes:
wait 300
Zitat von: ostseehuepfer am 03 August 2014, 20:03:26
Hey,
super danke für die Info. Was meinst du wann die neue Version erscheint? Nur ca. will kein Stress machen.
Grüße
Zitat von: ostseehuepfer am 03 August 2014, 20:17:10
Danke !!! Nehme mal an damit bekomme ich keine weiteren doppelten Nachrichten?
Grüße
Zitat von: ostseehuepfer am 03 August 2014, 20:19:18
OK wird gleich getestet Danke!!!!!
Läuft :) Vielen Vielen Dank !!!
Zitat von: Brockmann am 05 August 2014, 10:55:00
Eine Beobachtung zum praktischen Umgang mit DOIFs, die ich einfach mal loswerden muss:
(am besten erstmal ganz durchlesen, ich brauche keine "Lösung", sondern möchte das Problem zur Diskussion stellen)
In den letzten Tagen musste ich mit meiner Konfiguration ziemlich herumbasteln (ich hatte es irgendwie geschafft, Geräte ohne Typ zu haben, wodurch mein Log mit Fehlermeldungen prall gefüllt wurde, aber das hatte nichts mit DOIFs zu tun). Ich habe diverse Objekte, gelöscht, umbenannt, kopiert, unter dem alten Namen neu definiert usw. Dabei sind mir ein paar Besonderheit im Umgang mit DOIFs aufgefallen. Ich bin mir nicht sicher, ob das Spezialitäten von DOIF sind, aber bei anderen Modulen ist es mir so zumindest noch nicht begegnet.
Grundlegendes "Problem" dabei ist die Prüfung beim Definieren eines DOIFs. Das DOIF wird ja quasi direkt ausprobiert und getestet, ob alle referenzierten Objekte vorhanden sind usw. Nur dann wird das DOIF auch tatsächlich definiert. Soweit, so gut.
Allerdings findet dieser Prozess bei jedem Einlesen der fhem.cfg (sprich bei jedem Neustart) erneut statt. Auch hier wird die Plausibilität geprüft und die DOIFs werden nicht definiert, wenn diese nicht gegeben ist.
Was bedeutet das in der Praxis?Im worst case hat man aber weder Fehlermeldungen noch das Fehlen des DOIFs bemerkt, immer mal wieder Save config geklickt und hin und wieder einen Neustart durchgeführt. Dann wundert man sich eben eines Tages, was eigentlich aus diesem komplexen DOIF geworden ist, das man für irgendeinen Sonderfall mühsam programmiert hatte.
- Man definiert ein völlig plausibles, korrektes DOIF, wo beispielsweise ein Bedingung wie ([Wetter:temperature] < 24) drin steht.
- Irgendwann später löscht man - warum auch immer - das Objekt Wetter. Soweit noch kein Problem. Das DOIF funktioniert dann selbstverständlich nicht mehr, aber es gibt zumindest eine Fehlermeldung, die darauf hinweist. Falls man also bemerkt, dass das DOIF nicht mehr wie erwartet funktioniert, kann man erfahren, warum das so ist.
- Vielleicht bekommt man es aber nicht mit und behebt das Problem nicht. Aber irgendwann speichert man mal wieder die Konfiguration per Save config. Auch noch kein Problem.
- Irgendwann macht man einen Neustart. Auf den ersten Blick immer noch kein Problem, es sei denn man achtet auf die dabei auftretende Fehlermeldung, dass ein DOIF nicht definiert werden konnte, weil der darin referenzierte Wetter-Wert fehlt.Das sieht man aber nur, wenn man die "Startseite" von FHEM öffnet und nicht direkt einen bestimmten Raum oder ein Dashboard oder Floorplan.
- Früher oder später merkt man vielleicht, dass das DOIF sich nicht mehr an der gewohnten Stelle findet und nicht mehr tut, was es soll. Noch ist aber nichts verloren, denn in der fhem.cfg steht der Code für das DOIF bis jetzt noch drin.
- Aber nur solange, bis man nach dem Neustart das erste Mal Save config anklickt. Dann wird die aktuelle Konfiguration in der fhem.cfg gespeichert. Da das DOIF nicht (mehr) dazu gehört, fliegt es nun aus der fhem.cfg. Nun ist also auch der Code des DOIFs verloren, außer selbstverständlich im Backup, das man sinnvollerweise angelegt hat. ;)
Nebenbei: Es gibt noch eine spezielle Variante dieses Ablaufs, wo man noch weniger Chancen hat, etwas zu bemerken: wenn man ein referenziertes Objekt löscht und gleich anschließend unter demselben Namen neu erstellt. Das klappt erstmal problemlos und das DOIF arbeitet ordnungsgemäß weiter. Aber nur bis zum nächsten Neustart. Denn da das refenzierte Objekt NACH dem DOIF (neu)definiert wurde, steht es in der fhem.cfg nun HINTER dem DOIF. Es ist also noch nicht bekannt, wenn das DOIF definiert werden soll -> Fehlermeldung, DOIF wird nicht definiert und fliegt beim nächsten Save config aus der fhem.cfg. Warum das passiert ist völlig logisch und nachvollziehbar. Aber intuitiv ist es trotzdem irgendwie nicht, oder?
Nun hat mich dieses Verhalten nicht vor unüberwindbare Hindernisse gestellt. Ich habe es schnell bemerkt und mich darauf eingestellt. Außerdem mache ich vor umfangreicheren Änderungen auch immer eine Sicherung der fhem.cfg, so dass ich "verlorenen" Code schnell wiederherstellen konnte. Ich befürchte nur, dass weniger versierte Benutzer mit diesem Verhalten ihre Schwierigkeiten bekommen könnten. Wenn DOIF in den "FHEM-Kanon" aufgenommen und von immer mehr Leuten eingesetzt wird, könnten sich also Fehlermeldungen wie "Hilfe, mein DOIF ist verschwunden" häufen.
Für mich stellt sich aber auch grundlegend die Frage, ob es wirklich sinnvoll ist, das Definieren von DOIFs zu verweigern, wenn diese die Plausibilitätsprüfung nicht bestehen. Die Alternative wäre, wie auch jetzt eine Fehlermeldung auszugeben, das DOIF aber trotzdem in die Konfiguration aufzunehmen (zumindest wenn sich der Fehler auf die Referenzen bezieht und nicht auf Klammerung o. ä.). Es funktioniert dann selbstverständlich nicht richtig, bis es korrigiert wurde. Aber genau das Phänomen tritt jetzt ja auch auf, wenn man einem DOIF im laufenden Betrieb ein referenziertes Objekt "unter dem Hintern weglöscht". Das Leben geht weiter, nur das DOIF tut halt nicht, was es soll und meldet statt dessen einen Fehler.
DOIF (wenn dies und das) (tu das) DOELSEIF ([wz.led.off] ne "") (define wz.led.off at +00:15 set t5.wz.bs1.b:FILTER=STATE!=off off)
Zitat von: Simon74 am 07 August 2014, 14:49:59Das kann so nicht gehen. Du fragst damit ja eine Eigenschaft eines Objekts ab, das nicht existiert. Und das gibt einen Fehler.
ich würde gerne im DOELSEIF Teil einen "at" Eintrag definieren, jedoch nur wenn dieser "at" noch nicht vorhanden ist.
Ich habe es mal so versucht, was nicht funktioniert:Code AuswählenDOIF (wenn dies und das) (tu das) DOELSEIF ([wz.led.off] ne "") (define wz.led.off at +00:15 set t5.wz.bs1.b:FILTER=STATE!=off off)
DOELSEIF(not defined $defs{wz.led.off})(define...)
([FHEM_Kalender:modeStarted] ne "")
(
setreading Datastore Cal_start_sum (get FHEM_Kalender summary [FHEM_Kalender:modeStarted]),
setreading Datastore Cal_start_loc (get FHEM_Kalender location [FHEM_Kalender:modeStarted])
)
Cal_start_loc (get FHEM_Kalender location 2vdojpgsnaoneamvfiqcgooglecom) 2014-08-07 14:44:03
Cal_start_sum (get FHEM_Kalender summary 2vdo5og6naoneamvfpqcgooglecom) 2014-08-07 14:44:03
Zitat von: Brockmann am 07 August 2014, 15:25:58Eigentlich war meine Idee bei DOIF notify, at, watchdog nicht mehr benutzen zu müssen, da diese Funktionalität in DOIF steckt. Wenn du nur eine Verzögerung haben willst, dann kannst du das einfach mit dem wait-attribut realisieren.
Das kann so nicht gehen. Du fragst damit ja eine Eigenschaft eines Objekts ab, das nicht existiert. Und das gibt einen Fehler.
Die Existenz von Objekten kannst Du mit defined $defs{<Objektname>} abfragen, also ungefähr (ungetestet):Code AuswählenDOELSEIF(not defined $defs{wz.led.off})(define...)
(Diese Bedingung würde so aber nie getriggert werden, also der Trigger für das DOIF muss aus einer der anderen Bedingungen kommen!)
Zitat von: Brockmann am 07 August 2014, 15:29:39
Ich habe folgendes als DOIF erstellt:Code Auswählen([FHEM_Kalender:modeStarted] ne "")
(
setreading Datastore Cal_start_sum (get FHEM_Kalender summary [FHEM_Kalender:modeStarted]),
setreading Datastore Cal_start_loc (get FHEM_Kalender location [FHEM_Kalender:modeStarted])
)
In den Readings habe ich dann stehen:Code Auswählen
Cal_start_loc (get FHEM_Kalender location 2vdojpgsnaoneamvfiqcgooglecom) 2014-08-07 14:44:03
Cal_start_sum (get FHEM_Kalender summary 2vdo5og6naoneamvfpqcgooglecom) 2014-08-07 14:44:03
Also der Ausdruck in eckigen Klammern wird ausgewertet, aber der Rest nicht. Gibt es eine Möglichkeit, den Rückgabewert der get-Funktion ins Reading zu schreiben?
Ich habe schon verschiedene Varianten von Kombinationen von Klammern, fhem"..." usw ausprobiert, aber ich bekomme es nicht hin.
Zitat von: Damian am 07 August 2014, 15:57:18
Eigentlich war meine Idee bei DOIF notify, at, watchdog nicht mehr benutzen zu müssen, da diese Funktionalität in DOIF steckt. Wenn du nur eine Verzögerung haben willst, dann kannst du das einfach mit dem wait-attribut realisieren.
... DOELSEIF ([wz.led.off] ne "") (set t5.wz.bs1.b:FILTER=STATE!=off off)
attr modulname wait ...:900
auch den Filter kannst du dir sparen, da bei DOIF im Gegensatz zu notify nur einmal geschaltet wird.
Gruß
Damian
Zitat von: jens am 08 August 2014, 11:10:00Ansich sollten die States auch von DOIFs im Statefile gesichert und beim Neustart wieder eingelesen werden. Du müsstest nur dafür sorgen, dass regelmäßig ein WriteStatefile durchgeführt wird, beispielsweise so:
Muß ich damit leben, da der erste Statuswechsel ja erst nach dem restart passiert, oder kann ich das "peak reading" irgendwie initalisieren?
define StateFile_schreiben at +*01:00:00 {WriteStatefile}
Zitat von: Brockmann am 08 August 2014, 11:29:26
Ansich sollten die States auch von DOIFs im Statefile gesichert und beim Neustart wieder eingelesen werden. Du müsstest nur dafür sorgen, dass regelmäßig ein WriteStatefile durchgeführt wird, beispielsweise so:Code Auswählendefine StateFile_schreiben at +*01:00:00 {WriteStatefile}
Das schreibt einmal pro Stunde den aktuelle Stand ins Statefile. Man kann das natürlich alternativ auch an bestimmte wichtige Ereignisse/Aktionen dranhängen.
Bei einem Neustart wird direkt nach dem Einlesen der fhem.cfg auch das Statefile eingelesen, so dass alle Objekte wieder in dem Zustand sind, den sie beim letzten Schreiben des Statefiles hatten.
Zitat von: Damian am 08 August 2014, 11:45:35Ah, sorry, ich hatte angenommen, dass die Readings ausschlaggebend wären.
Das wird leider z. Zt. nicht helfen. Ich merke mir den letzten Zustand in Internals nicht in Readings, diese werden beim Neustart neugesetzt. Damit der Zustand ein Reboot überlebt, müsste ich mir den letzten Zustand in den Readings merken (das Reading last_cmd wird jetzt schon gesetzt aber nicht ausgewertet)
Zitat von: Brockmann am 08 August 2014, 11:50:09Ich werde das in der nächsten Version auf Reading-Auswertung umstellen. Dann wird der Zustand erhalten bleiben und das Kommando nicht erneut ausgeführt.
Ah, sorry, ich hatte angenommen, dass die Readings ausschlaggebend wären.
([Datastore])
(
IF ([Datastore] eq "Test")(trigger global Datastore_Test)
)
IF (Test eq "Test") (trigger global Datastore_Test) : Bareword "Test" not allowed while "strict subs" in use at (eval 96002) line 1.
IF ("[Datastore]" eq "Test")(trigger global Datastore_Test)
Zitat von: Brockmann am 11 August 2014, 09:20:47ja, es ist tatsächlich ein Seiteneffekt, weil bei FHEM-Kommandos DOIF die Readings in eckigen Klammern ersetzt, bevor IF überhaupt zum Zuge kommt.
Verträgt sich DOIF eigentlich mit IF?
Also mir ist schon klar, dass DOIF das IF eigentlich überflüssig machen sollte. Aber ich habe beispielsweise einen Anwendungsfall, wo beim Triggern eines Ereignisses bestimmte Aktionen immer durchgeführt werden sollen, andere nur in Abhängigkeit von weiteren Bedingungen. Bei einem reinen DOIF müsste ich die "Immer-Aktionen" in jedem Ausführungsteil wiederholen, was ja nicht Sinn der Sache ist. Deshalb dachte ich mir, ich setze in den Ausführungsteil des DOIF ein paar IFs rein. Aber ich habe das Gefühl, dass es da ein grundsätzliches Problem gibt.Code Auswählen([Datastore])
(
IF ([Datastore] eq "Test")(trigger global Datastore_Test)
)
sollte formal korrekt sein, oder? Führt aber mit set Datastore Test zur Fehlermeldung:Code AuswählenIF (Test eq "Test") (trigger global Datastore_Test) : Bareword "Test" not allowed while "strict subs" in use at (eval 96002) line 1.
set Datastore "Test" hingegen klappt.
Um die "verschwundenen" Anführungszeichen zurückzubekommen, habe es dann testweise mal inCode AuswählenIF ("[Datastore]" eq "Test")(trigger global Datastore_Test)
geändert und überraschenderweise scheint es so zu funktionieren.
Ist das ein ungewollter Seiteneffekt bei der Kombination von IF und DOIF oder ist das so beabsichtigt? Dann sollte man das vielleicht noch dokumentieren.
Zitat von: Damian am 11 August 2014, 09:40:13
ja, es ist tatsächlich ein Seiteneffekt, weil bei FHEM-Kommandos DOIF die Readings in eckigen Klammern ersetzt, bevor IF überhaupt zum Zuge kommt.
Ich muss mir die Problematik genauer anschauen. Evtl. muss ich bei DOIF erkennen, dass ein IF-Befehl ausgeführt werden soll und die Ersetzung nicht vornehmen und sie IF überlassen. Diesen Mechanismus habe ich bereits bei verschtelten IF-Befehlen schon eingebaut, daher sollte es machbar sein.
Gruß
Damian
Zitat von: Damian am 11 August 2014, 12:33:31Sieht gut aus, Danke!
Mit der neuen Version (1.61 im ersten Post) sollte es keinen Grund mehr geben auf Perl-if ausweichen zu müssen. ;)
Funktioniert jetzt mit IF, wie man es erwartet.
Zitat von: cwagner am 12 August 2014, 07:23:59
Hallo Damian,
DOIF verfüllt alle Versprechungen und gerade die ABlösung von AT bewährt sich aktuell bei mir besonders: Mein System ist wegen einer anderen Entwicklung instabil, es stürzt also gelegentlich ab: Bei AT bedeutete eine verpasste Zeit auch, dass der entsprechende Befehl ausfiel.
Bei meinen inzwischen 10 DOIFs werden die Bedingungen beim Neustart geprüft und entsprechend alle artig nachgeholt.
Das finde ich sehr fein - wie überhaupt die Vielseitigkeit des Moduls so groß ist, dass ich es vermutlich noch viel öfter einsetzen kann.
Danke!
Christian
([Bad:humidity])
(
setreading Datastore BZ_H_1 [Bad:humidity],
set Schwellwert [Datastore:BZ_H_1]
)
(60)
(
setreading Datastore BZ_H_1 60,
set Schwellwert 59
)
Zitat von: Brockmann am 12 August 2014, 08:54:15
Mir ist gestern noch eine Kleinigkeit aufgefallen, die aber wohl mit der Funktionsweise von DOIF zusammenhängt und sich nicht ändern lässt.
[Bad:humidity] = 60
[Datastore:BZ_H_1] = 59Code Auswählen
([Bad:humidity])
(
setreading Datastore BZ_H_1 [Bad:humidity],
set Schwellwert [Datastore:BZ_H_1]
)
setzt Schwellwert nicht auf auf 60, wie man intuitiv erwarten würde, sondern auf 59.
Wenn das DOIF getriggert wird, wird in dem Moment alles in eckigen Klammern interpretiert und intern durch die in diesem Moment geltenden Werte ersetzt. Ändert man diese Werte dann innerhalb des DOIFs, bekommt das DOIF davon nichts mehr mit und rechnet mit den "alten" Werten weiter.
Intern geht das Ganze quasi so an den Interpreter:Code Auswählen
(60)
(
setreading Datastore BZ_H_1 60,
set Schwellwert 59
)
Dieses Verhalten dürfte sich jederzeit umgehen lassen notfalls indem man per ReadingsVal direkt ausliest. Oder in diesem einfachen (konstruierten) Beispiel bei der zweiten Zuweisung halt wieder den Eingangswert nimmt und nicht den Zwischenspeicher. Ist also kein Problem, nur eine kleine Stolperfalle, auf die man stoßen kann.
Also: Wenn man in einem DOIF (oder auch IF) in ein Reading schreibt, sollte man dieses Reading dahinter nicht mehr per [] verwenden, sondern nur per ReadingsVal, richtig?
([Bewohner:state] eq "present" and [08:00-20:59:54]) (set Steckdose2 on)
DOELSEIF ([Status_Xpeed:state] eq "on" and ($hms ge "19:00" or $hms le "07:59:59")) (set Steckdose2:FILTER=STATE!=on on) DOELSEIF ([Mediacenter_manuOn:state] eq "on") (set Steckdose2:FILTER=STATE!=on on)
DOELSE (set Steckdose2 off)
Zitat von: satprofi am 12 August 2014, 18:43:27
Hallo.
Ich habe hiermit ein ProblemCode Auswählen
([Bewohner:state] eq "present" and [08:00-20:59:54]) (set Steckdose2 on)
DOELSEIF ([Status_Xpeed:state] eq "on" and ($hms ge "19:00" or $hms le "07:59:59")) (set Steckdose2:FILTER=STATE!=on on) DOELSEIF ([Mediacenter_manuOn:state] eq "on") (set Steckdose2:FILTER=STATE!=on on)
DOELSE (set Steckdose2 off)
Trotz aktiviertem Mediacenter_manuOn, schaltet mir DOIF die Steckdose off.
why?
Das ganze mit IF klappt zwar, aber da wird das Mediacenter_manuOn gar nicht ausgewertet.
gruss
Zitat von: tekki am 12 August 2014, 19:50:04
Hallo Damian,
ich möchte mich an dieser Stelle für die super Arbeit und das klasse Modul bedanken. Es erleichtert mir meine Umsetzungen erheblich :)
In den Posts habe ich von der Errormeldung beim Einsatz von Pushmsg gelesen. Ich setze es auch ein und bekommen mit Version 1.61 auch noch den Error. Die Mitteilung wird aber geschickt.
DEF
([05:05] or [12:00] or [19:00]) (set Push_msg msg 'Test' 'Das ist ein Test'' '' 0 '')
error set Push_msg msg 'Test' 'Das ist ein Test'' '' 0 '': OK
Ich kann damit leben, wollte es Dir nur zur Info mitteilen.
Grüße
Ralph
Zitat von: Damian am 24 Juni 2014, 21:01:47Hi,
Zum Installieren Modul 98_DOIF.pm ins FHEM-Verzeichnis kopieren und in der Kommandozeile reload 98_DOIF.pm eingeben.
Zitat-rw-r--r-- 1 fhem dialout 32873 Aug 12 21:53 98_DOIF.pmAber nach dem reload 98_DOIF.pm in der Kommandozeile kann ich immer noch nicht den neuen DOIF verwenden. FHEM kennt diesen DOIF-Befehl schlichtweg nicht.
Zitat von: Roaster am 12 August 2014, 22:22:50
Hi,
ich habe so meine lieben Probleme das Modul zu installieren. Lt. Anleitung oben ist das Module ins Verzeichnis /opt/fhem/FHEM kopiert worden. Die Berechtigungen sollten auch korrekt gesetzt sein:Aber nach dem reload 98_DOIF.pm in der Kommandozeile kann ich immer noch nicht den neuen DOIF verwenden. FHEM kennt diesen DOIF-Befehl schlichtweg nicht.
Was mache ich denn falsch?
Zitat von: Damian am 12 August 2014, 21:26:57
So wie du es definiert hast, ist es sogar ziemlich wahrscheinlich. Entscheidend ist folgender Absatz aus der Doku:
Die Angaben werden immer von links nach rechts abgearbeitet. Es wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist. Hinzu kommt, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event auch ein Device beinhalten (Angaben in eckigen Klammern).
Jetzt überlege mal, was ausgeführt wird um z. B. 08:00 Uhr, wenn Bewohner:state nicht present ist und Mediacenter_manuOn:state on.
... dein ELSE-Fall.
Gruß
Damian
Zitat von: satprofi am 13 August 2014, 06:04:41
alles klar, thx.
(([Bewohner:state] eq "present" and [08:00-21:00]) or ([Status_Xpeed:state] eq "on" and [19:00-08:00]) or [Mediacenter_manuOn:state] eq "on") (set Steckdose2 on) DOELSE (set Steckdose2 off)
Zitat von: Damian am 12 August 2014, 22:25:03
Was hast du probiert zu definieren mit dem Modul?
Zitat von: ph1959de am 13 August 2014, 09:34:18
Hast Du mal versucht, das DOIF über das Befehls-Eingabefeld zu definieren? Gleiche Reaktion/Fehlermeldung?
Ja, soben mitCode Auswählen
DOIF ([GarageTorRechtsZu:state] == "closed" and [GarageTorRechtsAuf:state] == "opened")
DOELSEIF ([GarageTorRechtsZu:state] == "opened" and [GarageTorRechtsAuf:state] == "opened")
DOELSEIF ([GarageTorRechtsZu:state] == "opened" and [GarageTorRechtsAuf:state] == "closed")
Bei GarageTorRechtsZu und GarageTorRechtsAuf handelt es sich um Max Fensterkontakte, die ansonsten einwandfrei funktionieren. Ich habe sie hier auf dem Schreibtisch. Wenn ich diese Zeilen im Eingabefeld eingeben und Enter drücke erhalte ich:ZitatUnknown command DOIF, try help.
Für mich bedeutet diese Meldung: DOIF ist nicht vorhanden ??? oder Liege ich so falsch mit meiner Annahme? Wie muss ich das Modul dann korrekterweise installieren?
Zitat von: Roaster am 13 August 2014, 18:43:58
Für mich bedeutet diese Meldung: DOIF ist nicht vorhanden ??? oder Liege ich so falsch mit meiner Annahme? Wie muss ich das Modul dann korrekterweise installieren?
define di_Fenster
DOIF ([GarageTorRechtsZu:state] == "closed" and [GarageTorRechtsAuf:state] == "opened")
DOELSEIF ([GarageTorRechtsZu:state] == "opened" and [GarageTorRechtsAuf:state] == "opened")
DOELSEIF ([GarageTorRechtsZu:state] == "opened" and [GarageTorRechtsAuf:state] == "closed")
Zitat von: Roaster am 13 August 2014, 18:54:33
Äh, ja sorry wurde von mir abgeschnitten:Code Auswählendefine di_Fenster
DOIF ([GarageTorRechtsZu:state] == "closed" and [GarageTorRechtsAuf:state] == "opened")
DOELSEIF ([GarageTorRechtsZu:state] == "opened" and [GarageTorRechtsAuf:state] == "opened")
DOELSEIF ([GarageTorRechtsZu:state] == "opened" and [GarageTorRechtsAuf:state] == "closed")
define DI_Fenster DOIF ([Dummy1])(set Dummy1 1)
Zitat von: Roaster am 14 August 2014, 08:30:42
Oh Mann! Das muss einem aber auch mal gesagt werden, dass das ganze als Einzeiler geschrieben werden muss. Da wäre ich im Leben nicht darauf gekommen :-\
Bin wohl zu sehr C# Compiler und Editor verwöhnt. Alles klar, nun läuft es auch für Dummies ;D
Vielleicht mal explizit ins erste Posting aufnehmen für solche wie mich 8)
Zitat von: Brockmann am 14 August 2014, 09:34:50
...
Und für von C#-Compiler und -Editor Verwöhnte:
Man kann den DEF-Editor durch eine abgespeckte Version von codemirror ersetzen, dann hat man auch Code-Highlighting, Bracket-Matching, Autocompletion usw. in der FHEM-Weboberfläche.
Zitat von: Damian am 14 August 2014, 09:00:19
Und noch was, Zeichenketten werden im Gegensatz zu Zahlen nicht mit == verglichen, sondern mit eq (siehe Beispiele in der Doku). Genaueres zu Perl-Operatoren siehe hier: http://de.selfhtml.org/perl/sprache/operatoren.htm
Zitat von: ph1959de am 14 August 2014, 10:01:09Wow, ganz neues Feeling im Editor! Super - Danke für den Tipp!
Siehe dazu auch diesen Abschnitt (http://www.fhemwiki.de/wiki/Konfiguration#Syntaxhervorhebung)im Wiki.
([Tuerkontakt] eq "closed" and [Schloss] eq "unlocked")
(set Schloss lock)
DOELSEIF ([Tuerkontakt] eq "closed" and [Schloss] eq "locked (uncertain)")
(set Schloss unlock,{ PushBulletText('Türstatus locked (uncertain)') },set Schloss lock)
DOELSEIF ([Tuerkontakt] eq "closed" and [Schloss] eq "unlocked (uncertain)")
(set Schloss unlock,{ PushBulletText('Türstatus unlocked (uncertain)') },set Schloss lock)
DOELSEIF ([Tuerkontakt] eq "closed" and [Schloss] eq "NACK")
(set Schloss unlock,{ PushBulletText('Türstatus NACK') },set Schloss lock)
last_error
set Schloss unlock;{ PushBulletText('Türstatus NACK') };set Schloss lock: Not enough arguments for main::PushBulletText at (eval 85658) line 1, near "'Türstatus NACK') "
Zitat von: Invers am 15 August 2014, 22:42:47Der Fehler hat mit DOIF nichts zu tun. Du rufst die PushBulletText-Funktion mit zuwenig Argumenten auf.
Die Meldung lautet bei Auslösung durch NACK:Code Auswählenlast_error
set Schloss unlock;{ PushBulletText('Türstatus NACK') };set Schloss lock: Not enough arguments for main::PushBulletText at (eval 85658) line 1, near "'Türstatus NACK') "
Kann mir bitte jemand helfen, den Fehler zu finden?
Zitat von: satprofi am 16 August 2014, 11:25:09Schau doch mal in die Readings des Twilight-Moduls. Da gibt es ein Reading namens aktEvent, dass immer das zuletzt ausgelöste Event angibt.
Kurze Frage zu eventsreading, wie stelle ich es an das sr_weather von mytwilight als schaltzeitpunkt erkannt wird?
([mytwilight:aktEvent] eq "sr_weather")(set...)
Zitat von: Puschel74 am 16 August 2014, 11:58:18
Hallo,
schalte die Lampe doch mit einem on-for-timer 7200 ein
Sollte das Gerät kein on-for-timer können lass dir ein at anlegen das 2 Stunden später die Lampe ausschaltet.
Grüße
define DI_Lampe_an DOIF ([mytwilight:aktEvent] eq "sr_weather") (set Lampe on)
define DI_Lampe_aus DOIF ([Lampe] eq "on"]) (set Lampe off)
attr DI_Lampe_aus wait 7200
([myTwilight:aktEvent] eq "sr_weather") ("define Lampe_on at +01:00:00 set AquaLamp3000K on","define Lampe2_on at +03:00:00 set AquaLamp4000K_1 on","define Lampe3_on at +04:00:00 set AquaLamp4000K_2 on)
last_error {"define Lampe_on at +01:00:00 set AquaLamp3000K on","define Lampe2_on at +03:00:00 set AquaLamp4000K_1 on","define Lampe3_on at +04:00:00 set AquaLamp4000K_2 on"}: HASH(0x141c9f8)
([myTwilight:aktEvent] eq "sr_weather") (define Lampe_on at +01:00:00 set AquaLamp3000K on,define Lampe2_on at +03:00:00 set AquaLamp4000K_1 on,define Lampe3_on at +04:00:00 set AquaLamp4000K_2 on)
([myTwilight:aktEvent] eq "sr_weather") (set AquaLamp3000K on)
DOELSEIF ([myTwilight:aktEvent] eq "sr_weather") (set AquaLamp4000K_1 on)
DOELSEIF ([myTwilight:aktEvent] eq "sr_weather") (set AquaLamp4000K_2 on)
DOELSEIF ([10:00]) (set AquaLamp3000K off)
DOELSEIF ([17:00]) (set AquaLamp3000K on)
DOELSEIF ([myTwilight:aktEvent] eq "ss_weather) (set AquaLamp4000K_1 off)
DOELSEIF ([myTwilight:aktEvent] eq "ss_civil) (set AquaLamp4000K_2 off)
DOELSEIF ([21:45]) (set AquaLamp3000K off)
([myTwilight:aktEvent] eq "sr_weather") (set AquaLamp3000K on,sleep 7200,set AquaLamp4000K_1 on,sleep 3600,set AquaLamp4000K_2 on)
DOELSEIF ([10:00]) (set AquaLamp3000K off)
DOELSEIF ([17:00]) (set AquaLamp3000K on)
DOELSEIF ([myTwilight:aktEvent] eq "ss_weather) (set AquaLamp4000K_1 off)
DOELSEIF ([myTwilight:aktEvent] eq "ss_civil) (set AquaLamp4000K_2 off)
DOELSEIF ([21:45]) (set AquaLamp3000K off)
([Wetter_1] or [Wetter_2])
(
setreading WETTER humidity {sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2))}
)
DOIF: no right bracket: {sprintf("%.0f"
Zitat von: Brockmann am 17 August 2014, 13:18:54Perl-Auswertung muss zusätzlich in runde Klammern, also {(....)} -steht so in der Doku. Das musste ich einbauen, da z. B. at selbst geschweifte Klammern für Wiederholungen nutzt.
Hallo Damian,
ich sitze gerade an folgender Definition:Code Auswählen
([Wetter_1] or [Wetter_2])
(
setreading WETTER humidity {sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2))}
)
Das führt zu folgender Fehlermeldung:Code AuswählenDOIF: no right bracket: {sprintf("%.0f"
Meine Vermutung: DOIF interpretiert das Komma zwischen den Parametern von sprintf als "sein" Komma und beendet die Anweisung an der Stelle, was zur Verstümmelung des sprintf und damit logischerweise zur Fehlermeldung führt.
Wie muss ich das formulieren, um dieses Problem zu vermeiden?
(Sinn des Ganzen ist, vom Durchschnitt der aktuellen Werte nur den ganzzahligen Teil als Reading in einen anderen Dummy zu schreiben.)
Zitat von: Damian am 17 August 2014, 14:17:04Das habe ich schon probiert.
Perl-Auswertung muss zusätzlich in runde Klammern, also {(....)} -steht so in der Doku. Das musste ich einbauen, da z. B. at selbst geschweifte Klammern für Wiederholungen nutzt.
([Wetter_1] or [Wetter_2])
(
setreading WETTER humidity {(sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2)))}
)
DOIF: no right bracket: {(sprintf("%.0f"
Zitat von: Brockmann am 17 August 2014, 14:28:38
Das habe ich schon probiert.Code Auswählen
([Wetter_1] or [Wetter_2])
(
setreading WETTER humidity {(sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2)))}
)
ErgibtCode AuswählenDOIF: no right bracket: {(sprintf("%.0f"
Zitat von: Damian am 17 August 2014, 15:09:38Ah, OK, es gibt immer noch eine Variante, auf die man nicht kommt. ;)
OK. Damit Komma bei FHEM-Befehlen nicht als Trennzeichen gilt, so muss der FHEM-Befehl, wie bei IF, zusätzlich in runde Klammern, also ((setreading...))
([Wetter_1] or [Wetter_2])
(
(setreading WETTER humidity ({(sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2)))}))
)
Zitat von: Brockmann am 17 August 2014, 17:50:19
Ah, OK, es gibt immer noch eine Variante, auf die man nicht kommt. ;)
Komplett muss die Klammerarie übrigens so aussehen, damit dann auch der Wert und nicht der Ausdruck im Reading landet:Code Auswählen
([Wetter_1] or [Wetter_2])
(
(setreading WETTER humidity ({(sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2)))}))
)
Falls jemand eine Möglichkeit sieht, die eine oder andere Klammer noch loszuwerden, immer her damit.
Ich meine, das ")))}))" am Ende der Zeile darf man wirklich niemandem zeigen, oder?
Ohne Editor mit Bracket-Matching kann man sich da gleich die Kugel geben.
Naja, jetzt läuft es jedenfalls... Danke für die Unterstützung.
Zitat von: Damian am 17 August 2014, 18:14:19Also die beiden äußeren müssen bleiben, meine ich. Die habe ich extra eingefügt, als ich im Reading (sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2))) anstelle des gewünschten Wertes stehen hatte. Aber die inneren müssten tatsächlich verzichtbar sein. Mal sehen, ob ich mich traue, da nochmal ran zu gehen. ;)
(setreading WETTER humidity ({(sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2))])}))
Die vier roten Klammern können weg.
Zitat von: Brockmann am 17 August 2014, 18:25:16
Also die beiden äußeren müssen bleiben, meine ich. Die habe ich extra eingefügt, als ich im Reading (sprintf("%.0f",(([Wetter_1:humidity]+[Wetter_2:humidity])/2))) anstelle des gewünschten Wertes stehen hatte. Aber die inneren müssten tatsächlich verzichtbar sein. Mal sehen, ob ich mich traue, da nochmal ran zu gehen. ;)
Meine Anmerkungen waren übrigens auch gar nicht so kritisch gemeint. Mir ist schon klar, dass manche Probleme komplexe Lösungen erfordern.
Aber wenn Du noch Spielraum für Vereinfachung siehst, umso besser.
Wobei das ja nun auch keine Aufgabenstellung ist, die ein Paradebeispiel für die Verwendung von DOIF darstellt. Ich verwende es aber immer gerne, wenn es um Readings geht, weil der Zugriff darauf per DOIF deutlich einfacher und besser lesbar ist.
(setreading dummy_t test1 on, setreading dummy_t test2 [dummy_t:test1])
Zitat von: Damian am 17 August 2014, 18:42:08Du hast Recht. Ich musste die Klammern innerhalb der geschwungenen Klammer hinzufügen, damit der Ausdruck ausgewertet wird, nicht außerhalb.
Ich bin immer noch der Meinung, dass die roten Klammern weg können. Probiere es mal aus. Wir wollen keinem unnötige Klammern empfehlen.
Zitat von: tekki am 12 August 2014, 19:50:04
Hallo Damian,
ich möchte mich an dieser Stelle für die super Arbeit und das klasse Modul bedanken. Es erleichtert mir meine Umsetzungen erheblich :)
In den Posts habe ich von der Errormeldung beim Einsatz von Pushmsg gelesen. Ich setze es auch ein und bekommen mit Version 1.61 auch noch den Error. Die Mitteilung wird aber geschickt.
DEF
([05:05] or [12:00] or [19:00]) (set Push_msg msg 'Test' 'Das ist ein Test'' '' 0 '')
error set Push_msg msg 'Test' 'Das ist ein Test'' '' 0 '': OK
Ich kann damit leben, wollte es Dir nur zur Info mitteilen.
Grüße
Ralph
Zitat von: tekki am 18 August 2014, 08:03:33
Hallo Damian,
ich habe hierzu noch einmal eine Frage. Kann es sein das durch den von Push_MSG verursachten Error, die weiteren Nachrichten nicht mehr versendet werden.
Immer wenn ich in der DEF auf modify klicke, wird das DOIF neu initialisiert und sendet einmal die Nachricht zur nächsten Zeitpunkt. Dann erscheint der Error und es kommen keine weiteren Nachrichten. Klicke ich erneut in der DEF wieder auf modify, versendet das DOIF zum nächsten Zeitpunkt wieder eine Nachricht.
Oder habe ich in meiner DEF einen Fehler. Ziel ist es, dass ich zu mehreren Zeitpunkten eine Erinnerungs-Nachricht bekommen möchte.
Grüße
Ralph
define DI_Licht DOIF ([08:00]) (set Switch on)
attr DI_Licht do always
Zitat von: tekki am 12 August 2014, 19:50:04Geht es dabei immer noch um diese Definition?Code AuswählenDEF
([05:05] or [12:00] or [19:00]) (set Push_msg msg 'Test' 'Das ist ein Test'' '' 0 '')
DEF
([05:05-05:06] or [12:00-12:01] or [19:00-19:01]) (set Push_msg msg 'Test' 'Das ist ein Test'' '' 0 '')
define DI_Radio DOIF ([08:00-10:00] or [20:00-22:00]) (set Radio on) DOELSE (set Radio off)
Zitat von: Brockmann am 18 August 2014, 10:13:38Das stimmt nicht. Auch hier ein Beispiel aus der Doku:
Ich stelle das mal zur Diskussion, weil ich es etwas unintuitiv finde, dass man beim Angeben von klassischen Schaltzeitpunkten per DOIF grundsätzlich do always setzen muss. Ohne ergibt keinen Sinn, weil das DOIF dann nur ein einziges Mal getriggert würde, also ein einmaliger Schaltzeitpunkt im wahrsten Sinn des Wortes wäre, was ja ein eher exotisches Anwendungszenario ist.
define DI_Licht DOIF ([08:00] or [10:00] or [20:00]) (set Switch on) DOELSEIF ([09:00] or [11:00] or [00:00]) (set Switch off)
([05:05-05:06] or [12:00-12:01] or [19:00-19:01]) (set Push_msg msg 'Test' 'Das ist ein Test'' '' 0 '')
Zitat von: Damian am 18 August 2014, 10:49:24
Ich denke es reicht diesen Sachverhalt deutlich zu dokumentieren. Ich sehe da keinen logischen Bruch.
([myTwilight:aktEvent] eq "sr_weather") (set AquaLamp3000K on)
DOELSEIF ([myTwilight:aktEvent] eq "sr_weather") (set AquaLamp4000K_1 on)
DOELSEIF ([myTwilight:aktEvent] eq "sr_weather") (set AquaLamp4000K_2 on)
DOELSEIF ([10:00]) (set AquaLamp3000K off)
DOELSEIF ([17:00]) (set AquaLamp3000K on)
DOELSEIF ([myTwilight:aktEvent] eq "ss_weather) (set AquaLamp4000K_1 off)
DOELSEIF ([myTwilight:aktEvent] eq "ss_civil) (set AquaLamp4000K_2 off)
DOELSEIF ([21:45]) (set AquaLamp3000K off)
Internals:
CFGFN
DEF (([DG_xx_RS_Markise_Rain:state] eq "rain") and (([DG_hz_TK_Dachfenster:state] eq "open") or ([DG_wz_TK_Dachfenster:state] eq "open"))) ( set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '')
NAME di_Rain
NR 163
NTFY_ORDER 50-di_Rain
STATE cmd_2
TYPE DOIF
CHANGETIME:
Helper:
Dblog:
Last_cmd:
Mydblog:
TIME 1408371955.65279
VALUE 2
Last_cmd_event:
Mydblog:
TIME 1408371955.65279
VALUE DG_hz_TK_Dachfenster
Last_error:
Mydblog:
TIME 1408424752.34098
VALUE set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 ''
State:
Mydblog:
TIME 1408371955.65279
VALUE cmd_2
Readings:
2014-08-18 16:25:55 last_cmd 2
2014-08-18 16:25:55 last_cmd_event DG_hz_TK_Dachfenster
2014-08-19 07:05:52 last_error set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014-08-18 16:25:55 state cmd_2
Condition:
0 (ReadingValDoIf('DG_xx_RS_Markise_Rain','state','') eq "rain") and ((ReadingValDoIf('DG_hz_TK_Dachfenster','state','') eq "open") or (ReadingValDoIf('DG_wz_TK_Dachfenster','state','') eq "open"))
Devices:
0 DG_xx_RS_Markise_Rain DG_hz_TK_Dachfenster DG_wz_TK_Dachfenster
all DG_xx_RS_Markise_Rain DG_hz_TK_Dachfenster DG_wz_TK_Dachfenster
Do:
0 set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 ''
Helper:
last_cond 1
last_timer 0
sleeptimer -1
Readings:
0 DG_xx_RS_Markise_Rain:state DG_hz_TK_Dachfenster:state DG_wz_TK_Dachfenster:state
Attributes:
group doif
2014.08.19 07:05:52.340 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 07:05:51.356 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 07:05:50.451 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 07:00:00.027 3: CUL_HM set DG_xx_RS_Markise_Heating on-for-timer 500
2014.08.19 06:55:53.602 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 06:55:52.238 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 06:55:50.493 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 06:45:52.288 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 06:45:51.368 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 06:45:50.497 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 06:35:52.235 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 06:35:51.341 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 06:35:50.451 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 06:30:00.027 3: CUL_HM set DG_xx_RS_Markise_Heating on-for-timer 500
2014.08.19 06:25:52.333 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 06:25:51.373 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 06:25:50.479 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 06:21:03.356 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
2014.08.19 06:20:49.135 2: di_Rain: set myPushover msg 'Regen - Dachfenster' 'Es faengt an zu regnen und ein Dachfenster ist offen.' 'iPhone5S' 0 '': OK
Zitat von: maxritti am 19 August 2014, 07:18:29Du arbeitest nicht mit der aktuellen Version von DOIF.
Heute morgen hat meine Frau dann mal die Dachfenster geöffnet und schwups, kommen die Meldungen, da der Regensensort auf "rain" steht, wegen Tau.
Dafür habe ich nun mal ein at definiert, welches alle 30 Minuten die Heizung des Sensors anschmeisst.
Aber das ist nicht das Problem.
Kurioserweise kommen nun brav etwa alle 10 Minuten die Pushmeldungen aufs Handy, obwohl sich weder der Regensensor noch die Sensoren am Fenster ändern.
Bisher bin ich davon ausgegangen, dass DOIF bei Änderungen reagiert.
Nur warum passiert das dann so wie bei mir?
Zitat von: Damian am 18 August 2014, 08:09:20
Du hast da was vergessen ;)
Zitat aus der Doku:
"Angaben, bei denen aufgrund der Definition kein Zustandswechsel erfolgen kann z. B.:Code Auswählendefine DI_Licht DOIF ([08:00]) (set Switch on)
attr DI_Licht do always
müssen mit Attribut "do always" definiert werden, damit sie nicht nur einmal, sondern jedes mal (hier jeden Tag) ausgeführt werden."
Gruß
Damian
Zitat von: Damian am 19 August 2014, 17:48:39Na, das sind doch mal gute Nachrichten!
Das aktuelle Modul wurde eingecheckt. Es ist also ab morgen per Update verfügbar.
Zitat von: Brockmann am 20 August 2014, 07:30:48
Na, das sind doch mal gute Nachrichten!
Bei der Gelegenheit nochmal Danke für das tolle Modul und das geduldige Erklären. ;)
Aus meiner Sicht bringt DOIF FHEM insgesamt ein schönes Stückchen voran.
Zitat von: det. am 21 August 2014, 22:18:26
Hallo Damian,
vielen Dank für das sehr nützliche Modul. Hat gleich ein paar Altlasten (notify für WW-Zirkulation und Helligkeits- und zeitgesteuerte Außenbeleuchtung ersetzt). Ein kleines Problem habe ich noch - und vielleicht nur zu dumm gewesen, das in Deinem sehr ausführlichen commandref Artikel zu finden: Ich möchte einen Aktor nach 5min wieder ausschalten und der beherrscht kein on-for-timer 300.
define schalter_d dummy
define di_Schalter DOIF ([Bewegungsmelder] eq "motion" ) (set schalter_d on, set schalter_d off)
attr di_Schalter do always
define di_Licht DOIF ([schalter_d] eq "on") (set Licht on) DOELSE (set Licht off)
attr di_Licht wait 0:300
Zitat von: RoBra81 am 22 August 2014, 10:59:58Man kann mit DOIF (fast) alles machen. Das heißt aber nicht, dass man alles mit DOIF machen muss oder sollte (IMHO).
Geht das mit DOIF?
Zitat von: RoBra81 am 22 August 2014, 13:04:54Wie sehen die Events bei press_long bzw. press_short denn genau aus? Drück doch mal beides und poste dann hier das Protokoll aus dem Event-Monitor.
kann mir noch jemand einen Tipp geben, wie ich einen langen Tastendruck als Bedingung formulieren kann? Ich habe ein HMW_IO_12_Sw7_DR_JEQ0497826 mit den Readings press_long und press_short. Beim Betätigen des Tasters gibt es die Events press_long und press_short, aber wie muss ich es Formulieren, damit der die entsprechende Aktion im DOIF ausgelöst wird?
2014-08-22 13:41:38 HM485 OG.ez.WS.Ku_Tuer_1 press_short: press_short 14
2014-08-22 13:41:44 HM485 OG.ez.WS.Ku_Tuer_1 press_short: press_short 15
2014-08-22 13:41:46 HM485 OG.ez.WS.Ku_Tuer_1 press_long: press_long 16
2014-08-22 13:41:51 HM485 OG.ez.WS.Ku_Tuer_1 press_long: press_long 17
Zitat von: RoBra81 am 22 August 2014, 13:43:27Hmm, ich bin mir nicht sicher, was es mit den Zahlen jeweils am Ende auf sich hat. Zählen die einfach immer hoch?
Jeweils zwei mal gedrückt:Code Auswählen2014-08-22 13:41:38 HM485 OG.ez.WS.Ku_Tuer_1 press_short: press_short 14
2014-08-22 13:41:44 HM485 OG.ez.WS.Ku_Tuer_1 press_short: press_short 15
2014-08-22 13:41:46 HM485 OG.ez.WS.Ku_Tuer_1 press_long: press_long 16
2014-08-22 13:41:51 HM485 OG.ez.WS.Ku_Tuer_1 press_long: press_long 17
([OG.ez.WS.Ku_Tuer1:press_short])
define TaserNot notify OG.ez.WS.Durchgang_1.*press_long.* ...
([OG.ez.WS.Durchgang_1:press_long])
trigger OG.ez.WS.Durchgang_1 press_long
trigger OG.ez.WS.Durchgang_1 dsfdsfdsfds
trigger OG.ez.WS.Durchgang_1 press_long: press_long 55
Zitat von: RoBra81 am 22 August 2014, 14:29:09Diese Definition ist leider nicht eindeutig. Die kann darauf reagieren, dass der Status des Geräts den Wert press_long irgendwas annimmt oder dass das Reading press_long des Geräts auf irgendwas gesetzt wird. Deshalb kann man (bzw. ich jedenfalls) daraus nicht einfach so eine passende DOIF-Bedingung ableiten. Anders gesagt: Das Notify reagiert einfach auf jedes Event, beim dem auf die Zeichenkette "ez.WS.Durchgang_1" die Zeichenkette "press_long" folgt.
: Um mit dem Taster ein notify zu Triggern habe ich schon seit längerem eine funktionierende Schreibweise:Code Auswählendefine TaserNot notify OG.ez.WS.Durchgang_1.*press_long.* ...
Zitat von: RoBra81 am 22 August 2014, 14:29:09Code Auswählen([OG.ez.WS.Durchgang_1:press_long])
([OG.ez.WS.Durchgang_1] =~/long/)
define DI_Test DOIF
ins Frontend eingebe, kann ich nicht mehr konfigurieren. Ich muss das DOIF löschen und korrekt definieren. define DI_Anwesend DOIF ([Schloss] eq "locked" and [BinIchDa] eq "present") (BinIchDa setstate absent)
BinIchDa setstate absent: Unknown command BinIchDa, try help.
setstate <devspec> <value>
während Du behauptest(?) im WebInterface (damit meinst Du das Befehls-Eingabefeld(?)) würde <devspec> setstate <value>
funktionieren?Zitat von: Invers am 27 August 2014, 01:45:56
Einen Hinweis und eine Frage hätte ich.
Hinweis:
Wenn ich die DefinitionCode Auswählendefine DI_Test DOIF
ins Frontend eingebe, kann ich nicht mehr konfigurieren. Ich muss das DOIF löschen und korrekt definieren.
define DI_Test DOIF
define DI_Test DOIF ([Schloss])
Zitat von: satprofi am 28 August 2014, 08:13:15
Hallo.
Wollte gestern meine DOIF mit einem Structure-Device ergänzen, klappte auch alles. Aber nach rereadcfg sollte ich erst dieses angelegte DOIF definieren, und es war auch wirklich weg. Erst nach löschen dieses und neu angelegten DOIF klappte es. Was wurde da geändert? Ich will das nicht jetzt bei allen DOIF (ca. 20) auch erleben! Auch weil das ganze nicht sofort als Fehler gemeldet wird, sondern erst bei neustart von FHEM.
Zitat von: satprofi am 28 August 2014, 14:20:23
aha,danke. heisst das vor jeder änderung erst gelöscht werden sollte und dann neu anlegen. puh, ganz starker tobak.
ich hätte doch kein fhem update machen sollen.
Zitat von: Damian am 28 August 2014, 14:37:10
Es reicht normalerweise, wie ich bereits mehrfach geschrieben habe, nach dem Update auf den DEF-Button zu klicken und über modify-Button das Modul ändern (bzw. neu definieren), dann werden alle relevanten readings und internals im Modul gelöscht und neu angelegt.
Du kannst dich immerhin trösten - du warst bei den ersten DOIF-Usern dabei :)
Gruß
Damian
Zitat von: satprofi am 28 August 2014, 15:01:26Also wenn du modify mit dem aktuellen Modul machst und save config machst, dann muss nach dem Neustart alles funktionieren (woher sollen denn dann noch die alten readings bzw. internals kommen)
eben, leider nicht. nach modify-button kommt keine fehlermeldung oder dergleichen. auch funktioniert das modul weiterhin. erst bei neustart oder rereadcfg von fhem ist alles ,zuvor modifizierte, weg!
Zitat von: satprofi am 28 August 2014, 18:29:33
woher weiss ich ob ich aktuelles modul habe?
define Alarm_Push_ext DOIF ([FensterStatus] eq "open" and [ANLAGE_STATUS] eq "scharf") (set Pushover1 msg 'Externer Alarm' 'Einbrecher ist im Haus und öffnete $fenster_ext' '' 2 'persistent' 30 3600)
my $fenster_ext = ReadingsVal("FensterStatus","LastDevice","")
Zitat von: netbus am 29 August 2014, 09:26:24Wozu die Variable? Du kannst das Reading direkt mit [FensterStatus:LastDevice] einfügen, also
Hallo Damian,
ich möchte gerne ein Reading einer Variablen übergeben und das dann verschicken. Geht das auch mit DOIF?
So schaut mein Code ausCode Auswählendefine Alarm_Push_ext DOIF ([FensterStatus] eq "open" and [ANLAGE_STATUS] eq "scharf") (set Pushover1 msg 'Externer Alarm' 'Einbrecher ist im Haus und öffnete $fenster_ext' '' 2 'persistent' 30 3600)
Und dieses Reading würde ich gerne einbauenCode Auswählenmy $fenster_ext = ReadingsVal("FensterStatus","LastDevice","")
define Alarm_Push_ext DOIF ([FensterStatus] eq "open" and [ANLAGE_STATUS] eq "scharf") (set Pushover1 msg 'Externer Alarm' 'Einbrecher ist im Haus und öffnete [FensterStatus:LastDevice]' '' 2 'persistent' 30 3600)
DOIF ([{sunset(0,"17:00","21:00")}-{sunrise_abs()}]) (set Licht on) DOELSE (set Licht off)
([{sunset("HORIZON-3",0,"17:00","21:00")}-{sunrise_abs()}]) (set Tageslicht dunkel) DOELSE (set Tageslicht hell)
([{sunset("HORIZON",-60,"17:00","21:00")}-{sunrise_abs()}]) (set Tageslicht dunkel) DOELSE (set Tageslicht hell)
([[color=red]([/color]{sunset("HORIZON-3",0,"17:00","21:00")}[color=red])[/color]-{sunrise_abs()}]) (set Tageslicht dunkel) DOELSE (set Tageslicht hell)
Zitat von: frado1 am 31 August 2014, 13:21:03
Wie mache ich es richtig ?
ZitatIch werde es korrigieren, dann brauchst du nichts zu ändern.
Zitat von: frado1 am 31 August 2014, 15:24:07
Hallo Damian,
Super, danke für die schnelle Antwort.
Viele Grüße
Franz
([FBDECT_22] eq "off") (set FBDECT_22 off) DOELSEIF ([SamsungS2plus:powerLevel]>99) (set FBDECT_22 off) DOELSEIF ([FBDECT_22] eq "on" and [SamsungS2plus:powerLevel]<9) (set FBDECT_22 on)
([FBDECT_22] eq "off") (set FBDECT_22 off) DOELSEIF ([SamsungS2plus:powerLevel]<9) (set FBDECT_22 on) DOELSEIF ([FBDECT_22] eq "off" and [SamsungS2plus:powerLevel]>99) (set FBDECT_22 off)
Zitat von: tagedieb am 02 September 2014, 19:45:37Code Auswählen([FBDECT_22] eq "off") (set FBDECT_22 off)
([SamsungS2plus:powerLevel]>99) (set FBDECT_22 off) DOELSEIF ([SamsungS2plus:powerLevel]<9) (set FBDECT_22 on)
Zitat von: tagedieb am 03 September 2014, 07:11:34Damian schläft noch. ;)
Guten morgen Damian
Zitat von: tagedieb am 03 September 2014, 07:11:34eq steht für "EQual", also auf deutsch "gleich". FBDECT_22 eq "off" bedeutet also "wenn der Status von FBDECT gleich off ist".
also heisst das "eq" nicht: "wenn es NICHT an ist" sondern: "wenn es an ist" ? habe ich das jetzt richtig verstanden?
Zitat von: tagedieb am 03 September 2014, 07:11:34Das kommt darauf an, was Du damit erreichen willst. Ich nehme an, Du wilst eine Steckdose mit dem Ladegerät für das Samsung ein und ausschalten, so dass das Samsung bei Bedarf geladen wird? Dann sollte das reichen.
dann sollte das ja reichen?Code Auswählen([SamsungS2plus:powerLevel]>99) (set FBDECT_22 off) DOELSEIF ([SamsungS2plus:powerLevel]<9) (set FBDECT_22 on)
Damian schläft noch. ;)
.*:[Bb]attery.* { if("%" !~ m/ok/) {DebianMail('jupp@@zupp.net','FHEM Batteriewarnung','@ %')} }
Zitat von: juppzupp am 03 September 2014, 10:16:53
Wenn ich nun folgenden notify durch DOIF ersetzen würdeCode Auswählen.*:[Bb]attery.* { if("%" !~ m/ok/) {DebianMail('jupp@@zupp.net','FHEM Batteriewarnung','@ %')} }
frage ich mich wie die Zustandsverwaltung funktioniert. Würde die pro Device oder "nur" pro DOIF stattfinden ?
Folgendes Szenario :
Sensor 1 meldet "Battery low" -> email wird geschickt
Sensor 1 meldet "Battery low" -> email wird nicht mehr geschickt, da keine Zustandsänderung
Sensor 2 meldet "Battery low" -> email wird ?
define DI_Battery DOIF ([Sensor1:Battery] eq "low")(send mail) DOELSEIF ([Sensor2:Battery] eq "low")(send mail) DOELSEIF ([Sensor3:Battery] eq "low")(send mail)... usw.
Zitat von: tagedieb am 03 September 2014, 08:01:37Das braucht ihr nicht. Ich habe zwar geschlafen, aber in Vollnarkose!Code AuswählenDamian schläft noch. ;)
dann sind wir mal gaaanz leise ;)
Zitat von: Damian am 03 September 2014, 16:23:38Dann wünsche ich gute Erholung und schnelle Genesung!
Das braucht ihr nicht. Ich habe zwar geschlafen, aber in Vollnarkose!
Nun bin ich wieder wach und lebe noch :)
Zitat von: bamm-bamm am 03 September 2014, 20:12:30Jein. Du könntest zwar im DOIF über die Funktion RpiTemp("") auf die Temperatur zugreifen und Vergleichen. Aber da das eine Funktion und kein Gerät ist, würde dieses Bedingung das DOIF niemals auslösen. (Die Funktion erzeugt keine regelmäßigen Events, sondern antwortet eben nur, wenn Sie gefragt wird.)
Kann ich über z.B. DOIF regeln, daß ab einer bestimmten CPU-Temperatur das Relais einschaltet (Piface 1 auf 1) und bei einer anderenm wieder ausschaltet (Piface 1 auf 0)?
Das Schalten des Relais würde ich wohl hinbekommen denke ich, aber wie (bzw. woher) kann ich die Temperatur auslesen und dann einbinden?
define <name_at> at +*00:05 { fhem("set <name> ".RpiTemp("")) }
DOIF ([<name>] > 55)(set Luefter an) DOELSE (set Luefter off)
Zitat von: Brockmann am 04 September 2014, 07:44:41Vieleicht baue ich irgendwann mal die bereits am Anfang geplante Selbsttriggerung noch ein.
Jein. Du könntest zwar im DOIF über die Funktion RpiTemp("") auf die Temperatur zugreifen und Vergleichen. Aber da das eine Funktion und kein Gerät ist, würde dieses Bedingung das DOIF niemals auslösen. (Die Funktion erzeugt keine regelmäßigen Events, sondern antwortet eben nur, wenn Sie gefragt wird.)
Du könntest aber die Temperatur regelmäßig in einen Dummy schreiben (ich zitiere mal aus dem Wiki (http://www.fhemwiki.de/wiki/Raspberry_Pi:_99_RPiutils.pm)):Code Auswählendefine <name_at> at +*00:05 { fhem("set <name> ".RpiTemp("")) }
Das schreibt alle fünf Minuten die aktuelle Temperatur in <name>. Diesen Dummy könntest Du dann wiederum im DOIF als Bedingung einsetzen, alsoCode AuswählenDOIF ([<name>] > 55)(set Luefter an) DOELSE (set Luefter off)
Zitat von: bamm-bamm am 06 September 2014, 12:04:35Poste hier Ausgabe von 'list Raspberry_Luefter'
Danke für die Info. Leider klappt das bei mir nicht. Es erfolgt kein Schalten. Hier mal der Auszug aus der CFG:
define Rasptemp dummy
attr Rasptemp room RPi
define Rasptemp_log FileLog ./log/Rasptemp-%Y-%m.log Rasptemp
attr Rasptemp_log room RPi
define Rasptemp_at at +*00:05 { fhem("set Rasptemp ".RpiTemp("")) }
define Raspberry_Luefter DOIF ([Rasptemp]>51)(set piface 1 1) DOELSE (set piface 1 0)
Hab ich da irgendwo nen Denkfehler?;)
Zitat von: bamm-bamm am 07 September 2014, 15:42:00Es wurde das zweite Kommando ausgeführt. Jetzt muss du im Log schauen, warum um 15:38:15 set piface 1 0 nicht erfolgreich war.
---schnipp----
Internals:
CFGFN
DEF ([Rasptemp]>51)(set piface 1 1) DOELSE (set piface 1 0)
NAME Raspberry_Luefter
NR 215
NTFY_ORDER 50-Raspberry_Luefter
STATE cmd_2
TYPE DOIF
Readings:
2014-09-07 15:38:15 cmd_event Rasptemp
2014-09-07 15:38:15 cmd_nr 2
2014-09-07 15:38:15 e_Rasptemp_STATE T: 53.53
2014-09-07 15:38:15 state cmd_2
Condition:
0 InternalDoIf('Rasptemp','STATE','')>51
Devices:
0 Rasptemp
all Rasptemp
Do:
0 set piface 1 1
1 set piface 1 0
Helper:
last_timer 0
sleeptimer -1
Internals:
0 Rasptemp:STATE
all Rasptemp:STATE
Readings:
State:
Attributes:
----schnapp----
Da wohl T: xx.xx ausgelesen wird, hatte ich in DOIF schon mit Parameter":d" und als Grenzwert 51.00 probiert. Beides jedoch ohne Erfolg.
Zitat von: Damian am 07 September 2014, 18:32:21Was vielleicht noch eine sinnvolle Ergänzung wäre (und mit den geplanten Erweiterungen so noch nicht möglich wäre, oder?): Eine "globale" DO-Vorgabe, in welchem zeitlichen Abstand das DOIF ausgeführt werden soll, unabhängig davon, durch welchen DO-Fall es getriggert wurde.
Die Angaben können für jeden DO-Fall mit Doppelpunkt, wie beim wait-Attribut, angegeben werden werden:
attr di_benachrichtigung do 3x600:0
Zitat von: Damian am 07 September 2014, 15:54:11
Es wurde das zweite Kommando ausgeführt. Jetzt muss du im Log schauen, warum um 15:38:15 set piface 1 0 nicht erfolgreich war.
Gruß
Damian
Zitat von: bamm-bamm am 08 September 2014, 09:33:54
Leider hatte ich mein Log da noch zu klein (verbose). Ist jetzt behoben. Aber "cmd_2" wäre auch falsch, da bei Temperatur über 51 cmd_1 hätte ausgeführt werden müssen. Also doch eher ein Problem beim Auslesen des Temperaturwertes?
DEF ([Rasptemp]>51)(set piface 1 1) DOELSE (set piface 1 0)
Zitat von: Brockmann am 08 September 2014, 08:47:28
Diese Erweiterungen für DOIF hören sich sehr gut an.
Was vielleicht noch eine sinnvolle Ergänzung wäre (und mit den geplanten Erweiterungen so noch nicht möglich wäre, oder?): Eine "globale" DO-Vorgabe, in welchem zeitlichen Abstand das DOIF ausgeführt werden soll, unabhängig davon, durch welchen DO-Fall es getriggert wurde.
Praxisbeispiel: Ich habe ein DOIF, das Wetterdaten an ein Tablet zur Darstellung in einem Widget übermittelt. Das DOIF wird verschieden getriggert (Wettersensor innen, Wettersensor außen), soll das Widget aber höchstens alle 30 Minuten aktualisieren. Jetzt könnte ich zwar beide DO-Fälle mit do 1800:1800 begrenzen, aber wenn die Sensoren immer schön abwechselnd melden, würden diese Vorgaben quasi ignoriert, oder?
Da würde ich mir sowas wie do @1800 wünschen, was das DOIF insgesamt quasi für 30 Minuten disabled und dann wieder enabled.
Wie immer nur als Anregung gedacht... :)
Zitat von: Brockmann am 08 September 2014, 09:41:48
Versuch doch mal ([Rasptemp:state:d]>51)
Damit werden nur die Zahlen ausgewertet und "T:" ignoriert.
Zitat von: bamm-bamm am 08 September 2014, 10:47:42
Super - danke schön ;)
Irgendwie hatte ich die Wiki wohl falsch verstanden und es nur mit "Rasptemp:d", also ohne "state" probiert.
Scheinbar stören auch die Nachkommastellen nicht *puu*, nach halbstündiger Beobachtung scheint der Wechsel zu klappen.
Ich hätte zwar auch einen temperaturgesteuerten Lüfter einbauen können, aber der Raspberry/Piface sollen schliesslich selbst mal was tun für den teuren Strom *gg*
define switch_d dummy
define di_switch DOIF ([BM_Kueche] eq "motion" and [BM_Kueche:brightness:d] <50) (set switch_d on, set switch_d off)
attr di_switch do always
define di_light DOIF ([switch_d] eq "on") (set LED_Kueche on,set MyTTS tts An.) DOELSE (set LED_Kueche off,set MyTTS tts Aus.)
attr di_light wait 0:240
attr BM_Kueche event-on-update-reading state
Zitat von: Invers am 11 September 2014, 09:24:46
Da ich mein folgendes Problem gerne mit DOIF lösen würde, poste ich mal hier. Sollte das nicht ok sein, ziehe ich gerne zu HM um.
Ich möchte meine Küchenbeleuchtung mit dem DOIF Beispiel aus der Commandref nutzen und hab das mal nachgebaut:Code Auswählendefine switch_d dummy
define di_switch DOIF ([BM_Kueche] eq "motion" and [BM_Kueche:brightness:d] <50) (set switch_d on, set switch_d off)
attr di_switch do always
define di_light DOIF ([switch_d] eq "on") (set LED_Kueche on,set MyTTS tts An.) DOELSE (set LED_Kueche off,set MyTTS tts Aus.)
attr di_light wait 0:240
Leider funktioniert es nicht wie erwartet.
Zuerst stellte ich fest, dass motion vom Bewegungsmelder auch gemeldet wurde, wenn irgendein anderer Wert sich änderte.
Das konnte ich umgehen, indem ich beim BMCode Auswählenattr BM_Kueche event-on-update-reading state
gesetzt habe.
Das hat nun leider den Nachteil, dass auch nichts anderes mehr im Log erscheint. Gerne würde ich wieder die Helligkeitswerte loggen, aber das löst leider dann auch motion aus.
Leider funktioniert es trotzdem noch nicht, wie erwartet. Das Licht geht zwar brav immer bei Bewegung an, aber leider geht es immer wieder mal aus, auch dann, wenn Bewegung stattfindet.
Es hat den Anschein, als wenn eine fortlaufende Bewegung nicht registriert wird, sondern nur, wenn eine Unterbrechung stattfindet, also wenn jemand kurzzeitig den Raum verlässt und wieder rein kommt.
Kennt jemand eine Möglichkeit, die Bewegung mit einem DOIF so abzufragen, dass das Licht so lange an bleibt, bis 240 Sekunden keine Bewegung stattgefunden hat?
Das könnte man wahrscheinlich mit motioncount lösen, aber ich bekomme das nicht in das DOIF rein.
Danke im Voraus.
define di_switch DOIF ([BM_Kueche] eq "motion") (IF ([BM_Kueche:brightness:d] <50) (set switch_d on, set switch_d off))
define di_Rollo_WZ_mitte DOIF ([Bewegungsmelder1:brightness]>110 and [07:00-07:45|12345] or [08:30|7]) (set Rollo_WZ_mitte:FILTER=level!=100 on) DOELSEIF ([Bewegungsmelder1:brightness]<65 and [17:00-22:00]|01234) (set Rollo_WZ_mitte:FILTER=level!=0 off) DOELSEIF ([Bewegungsmelder1:brightness]<65 and [20:00-22:30]|56) (set Rollo_WZ_mitte:FILTER=level!=0 off)
or [08:30|7]
Zitat von: Otto am 11 September 2014, 20:24:22
Hallo,
ein tolles Modul!
Ich habe meine Rollos umgestellt, aber auch sehr viele Bedingungen vor:
der einfache code ist der:Code Auswählendefine di_Rollo_WZ_mitte DOIF ([Bewegungsmelder1:brightness]>110 and [07:00-07:45|12345] or [08:30|7]) (set Rollo_WZ_mitte:FILTER=level!=100 on) DOELSEIF ([Bewegungsmelder1:brightness]<65 and [17:00-22:00]|01234) (set Rollo_WZ_mitte:FILTER=level!=0 off) DOELSEIF ([Bewegungsmelder1:brightness]<65 and [20:00-22:30]|56) (set Rollo_WZ_mitte:FILTER=level!=0 off)
Jetzt sollen noch für Sommer und Winter unterschiedliche Zeiten gelten und brightness auch für den TeilCode Auswählenor [08:30|7]
Sollte man das alles in eine DOIF oder aufteilen in mehrere
Gruß Otto
([Helligkeit] eq "on" and [06:25-08:00|8]) or [09:00|7])
((set R_W_S,R_W_W[1-3] on))
DOELSEIF ([Helligkeit] eq "off")
((set R_W_S,R_W_W[1-3] off))
Internals:
CFGFN
DEF ([mySL:Pac_avg] >= 2100) (set EG_wz_RO_TerrasseRechts 0) DOELSEIF ([mySL:Pac_avg] >= 1501) (set EG_wz_RO_TerrasseRechts 30) DOELSE (set EG_wz_RO_TerrasseRechts 100)
NAME di_CheckSonneRechts
NR 145
NTFY_ORDER 50-di_CheckSonneRechts
STATE cmd_3
TYPE DOIF
CHANGETIME:
Helper:
Dblog:
Cmd_event:
Mydblog:
TIME 1410874307.33259
VALUE mySL
Cmd_nr:
Mydblog:
TIME 1410874307.33259
VALUE 3
State:
Mydblog:
TIME 1410874307.33259
VALUE cmd_3
Readings:
2014-09-16 15:31:47 cmd_event mySL
2014-09-16 15:31:47 cmd_nr 3
2014-09-16 16:46:50 e_mySL_Pac_avg 1191
2014-09-16 15:31:47 state cmd_3
2014-09-16 09:44:31 wait_timer no timer
Condition:
0 ReadingValDoIf('mySL','Pac_avg','') >= 2100
1 ReadingValDoIf('mySL','Pac_avg','') >= 1501
Devices:
0 mySL
1 mySL
all mySL
Do:
0 set EG_wz_RO_TerrasseRechts 0
1 set EG_wz_RO_TerrasseRechts 30
2 set EG_wz_RO_TerrasseRechts 100
Helper:
last_timer 0
sleeptimer -1
Internals:
Readings:
0 mySL:Pac_avg
1 mySL:Pac_avg
all mySL:Pac_avg
State:
Attributes:
group doif
verbose 5
wait 900
Zitat von: maxritti am 16 September 2014, 16:52:42Gegen 15:30 hat der Wert um 1500 oszilliert, also war mal Bedingung 2 und mal Bedingung 3 erfüllt.
Hat dazu jemand eine Idee, warum der Rollo da um 15:30 so oft hoch und runter gegangen ist?
Eigentlich hätte ich erwartet, dass der um 15:28 hoch fährt, weil Pac_avg unter den Schwellwert gerutscht ist. Dann sollte erst mal dank wait 900 15 Minuten Ruhe sein. Stattdessen geht der um 15:30 wieder runter um dann um 15:33 wieder hoch zu fahren.
attr <...> wait 900:900:900
Zitat von: maxritti am 17 September 2014, 12:00:37Ja, exakt das macht das wait-Attribut. Es wartet beim Eintreten einer Bedingung, ob diese über einen Zeitraum x unverändert wahr bleibt und führt erst dann die Aktion aus. So ist das wait-Attribut (derzeit) definiert. Damian hat aber schon angedeutet, das wait-Attribut in der nächsten Version zu erweitern, so dass auch das möglich sein sollte, was Du meinst, also Aktion sofort ausführen, aber dann erstmal x Sekunden nichts mehr tun.
Irgendwie habe ich den Eindruck, dass das wait 900:900:900 die Schaltvorgänge um 15 Minuten verzögert.
Zitat von: Brockmann am 17 September 2014, 12:08:59
Ja, exakt das macht das wait-Attribut. Es wartet beim Eintreten einer Bedingung, ob diese über einen Zeitraum x unverändert wahr bleibt und führt erst dann die Aktion aus. So ist das wait-Attribut (derzeit) definiert. Damian hat aber schon angedeutet, das wait-Attribut in der nächsten Version zu erweitern, so dass auch das möglich sein sollte, was Du meinst, also Aktion sofort ausführen, aber dann erstmal x Sekunden nichts mehr tun.
Zitat von: maxritti am 17 September 2014, 17:15:39Du könntest zusätzliche Bedingungen für den Türkontakt einfügen und bei denen die wait-Zeit auf 0 setzen. Du müsstest dabei auf die Reihenfolge achten, so dass die Bedingungen, die durch Änderungen am Türstatus getriggert werden, vor den allgemeineren Bedingungen stehen. Ist schon etwas komplizierter, sollte aber machbar sein.
Bekommt man das mit dem DOIF überhaupt hin, was ich mir da gedacht habe?
Zitat von: knochenmuehle am 19 September 2014, 17:45:38
([05:15-23:59] and [geofancy:currLoc_Susie] eq "home" or [geofancy:currLoc_Arthur] eq "home") (set He_Zirkulationspumpe on) DOELSE (set He_Zirkulationspumpe off)
warum wird hier nicht zu den Anfangs- bzw Endzeiten ein bzw. ausgeschaltet? Zwischendurch wenn keiner zu Hause ist, wird geschaltet.
Andreas
([05:15-23:59] and ([geofancy:currLoc_Susie] eq "home" or [geofancy:currLoc_Arthur] eq "home")) (set He_Zirkulationspumpe on) DOELSE (set He_Zirkulationspumpe off)
Zitat von: knochenmuehle am 20 September 2014, 08:24:31
Danke, jetzt läufts!
define di_Reklame DOIF ([[d_Reklame_Vorgabe:start]-[d_Reklame_Vorgabe:ende]] and ([EIB_6302] le [d_Reklame_Vorgabe:vorgabe]))(set struct_10_11010 on)
di_Reklame DOIF: unknown expression format: 00
EIB_6302 {
if(ReadingsVal("d_Reklame_Vorgabe","modus","error") eq "auto")
{if
(
(
(
(ReadingsVal("d_Reklame_Vorgabe","start","error") < ReadingsVal("d_Reklame_Vorgabe","ende","error")) and
(($hour.":".$min) >= ReadingsVal("d_Reklame_Vorgabe","start","error"))and
(($hour.":".$min) < ReadingsVal("d_Reklame_Vorgabe","ende","error"))
)
or
(
(ReadingsVal("d_Reklame_Vorgabe","start","error") > ReadingsVal("d_Reklame_Vorgabe","ende","error"))and
(
(
(($hour.":".$min) >= ReadingsVal("d_Reklame_Vorgabe","start","error"))and
(($hour.":".$min) <= "24:00")
)
or
(
(($hour.":".$min) >= "00:00")and
(($hour.":".$min) < ReadingsVal("d_Reklame_Vorgabe","ende","error"))
)
)
)
)and
(Value("EIB_6302") <= ReadingsVal("d_Reklame_Vorgabe","vorgabe","error"))
)
{
if(Value("struct_10_11010") ne 80)
{fhem("set struct_10_11010 on")}
}
else
{
if(Value("struct_10_11010") ne 5)
{fhem("set struct_10_11010 off")}
}
}}
Zitat von: igami am 23 September 2014, 08:20:49Schau mal dieses Beispiel aus der Command-Ref:
Ist es möglich Readings als Zeitintervalle auszuwerten?
[11:00-{sunset_abs()}]
Zitat von: igami am 23 September 2014, 12:42:41Du könntest versuchen, die Bedingung um die Teilbedingung
Nur dann werden die Zeiten nicht sofort beim Ändern in das DOIF übernommen. Das wäre in diesem Fall nicht schlimm, ich habe aber auch noch eine andere Schaltung, die ich nur über Zeit und nicht zusätzlich noch über Helligkeit mache, da wird dann erst beim Schalten der alten Zeiten die neue Zeit übernommen.
and [d_Reklame_Vorgabe:start]
DOIF ([{anfang()}-{ende()}])(set...)
Zitat von: det. am 23 September 2014, 19:26:51
Hallo Damian,
habe eine Weile gebraucht um festzustellen, das Dein Modul mit readings die über FHEM2FHEM von einem Childserver kommen, nichts anfangen kann. Habe mir dann über cloneDummy geholfen. Gibt es dafür einen leicht zu erklärenden Grund?
Zitat von: Damian am 23 September 2014, 19:45:44da es bei notifys funktioniert - müssen doch mMn Events erzeugt werden. Irgendwie setzt Dein Modul das physische Vorhandensein der Sensordefinition vor Eintritt des Events voraus?
Wahrscheinlich wird bei Änderung dieser Readings kein Event erzeugt.
Zitat von: det. am 23 September 2014, 19:55:41
da es bei notifys funktioniert - müssen doch mMn Events erzeugt werden. Irgendwie setzt Dein Modul das physische Vorhandensein der Sensordefinition vor Eintritt des Events voraus?
define di_test DOIF ([blabla:blabla]) (set bla on)
define Heizung_Schalter dummy
attr Heizung_Schalter group Global.Schalter.Heizung
attr Heizung_Schalter icon max_heizungsthermostat
attr Heizung_Schalter room Global
attr Heizung_Schalter setList state:Anwesend,Arbeit,Pfalz,Abwesend
attr Heizung_Schalter webCmd state
define di_Kinderzimmer_Heizung_Schalter DOIF (Kinderzimmer_Heizung_Schalter eq "Anwesend")\
(set Kinderzimmer_Heizung_Schalter Anwesend, set Wohnzimmer_Heizung_Schalter Anwesend)\
DOELSEIF (Kinderzimmer_Heizung_Schalter eq "Arbeit")\
(set Kinderzimmer_Heizung_Schalter Arbeit, set Wohnzimmer_Heizung_Schalter Arbeit)\
DOELSEIF (Kinderzimmer_Heizung_Schalter eq "Pfalz")\
(set Kinderzimmer_Heizung_Schalter Pfalz, set Wohnzimmer_Heizung_Schalter Pfalz)\
DOELSEIF (Kinderzimmer_Heizung_Schalter eq "Abwesend")\
(set Kinderzimmer_Heizung_Schalter Abwesend, set Wohnzimmer_Heizung_Schalter Abwesend)
#####################################################################
define Kinderzimmer_Heizung_Schalter dummy
attr Kinderzimmer_Heizung_Schalter group Kinderzimmer.Schalter.Heizung
attr Kinderzimmer_Heizung_Schalter icon max_heizungsthermostat
attr Kinderzimmer_Heizung_Schalter room Kinderzimmer
attr Kinderzimmer_Heizung_Schalter setList state:Anwesend,Arbeit,Pfalz,Abwesend
attr Kinderzimmer_Heizung_Schalter webCmd state
define di_Kinderzimmer_Heizung_Schalter DOIF (Kinderzimmer_Heizung_Schalter eq "Anwesend" or Kinderzimmer_Heizung_Schalter eq "Arbeit" or Kinderzimmer_Heizung_Schalter eq "Pfalz")\
({HeizungTemperaturlisteSetzen("Kinderzimmer_Heizung_Schalter", "Kinderzimmer_Heizung_Clima")})\
DOELSEIF (Kinderzimmer_Heizung_Schalter eq "Abwesend")\
(set Kinderzimmer_Heizung_Clima controlManu off)
#####################################################################
define Wohnzimmer_Heizung_Schalter dummy
attr Wohnzimmer_Heizung_Schalter group Wohnzimmer.Schalter.Heizung
attr Wohnzimmer_Heizung_Schalter icon max_heizungsthermostat
attr Wohnzimmer_Heizung_Schalter room Wohnzimmer
attr Wohnzimmer_Heizung_Schalter setList state:Anwesend,Arbeit,Pfalz,Abwesend
attr Wohnzimmer_Heizung_Schalter webCmd state
define di_Wohnzimmer_Heizung_Schalter DOIF (Wohnzimmer_Heizung_Schalter eq "Anwesend" or Wohnzimmer_Heizung_Schalter eq "Arbeit" or Wohnzimmer_Heizung_Schalter eq "Pfalz")\
({HeizungTemperaturSetzen("Wohnzimmer_Heizung_Schalter", "Wohnzimmer_Wandthermostat_Climate")})\
DOELSEIF (Wohnzimmer_Heizung_Schalter eq "Abwesend")\
(set Wohnzimmer_Wandthermostat_Climate controlManu off)
Error messages while initializing FHEM:
configfile: di_Kinderzimmer_Heizung_Schalter DOIF: no state, reading or time in condition: Kinderzimmer_Heizung_Schalter eq "Anwesend"
di_Kinderzimmer_Heizung_Schalter DOIF: no state, reading or time in condition: Kinderzimmer_Heizung_Schalter eq "Anwesend" or Kinderzimmer_Heizung_Schalter eq "Arbeit" or Kinderzimmer_Heizung_Schalter eq "Pfalz"
di_Wohnzimmer_Heizung_Schalter DOIF: no state, reading or time in condition: Wohnzimmer_Heizung_Schalter eq "Anwesend" or Wohnzimmer_Heizung_Schalter eq "Arbeit" or Wohnzimmer_Heizung_Schalter eq "Pfalz"
Zitat von: dancatt am 25 September 2014, 15:36:24
Was mache ich da falsch?
([06:00-08:00] and [SamsungTv] eq "disconnected") ({HueOffSofa}) DOELSE ({HueOffSideBoard})
attr wait 0:10
Zitat von: Steffen am 01 Oktober 2014, 07:04:24
Hallo!
Es geht um diese Code versuch:Code Auswählen([06:00-08:00] and [SamsungTv] eq "disconnected") ({HueOffSofa}) DOELSE ({HueOffSideBoard})
Code Auswählenattr wait 0:10
ich möchte das zu erst HueOffSofa(ausgeführt/aus) geht und dann etwas Zeit verzögert(ca.30sek) die HueOffSideBoard aber irgendwie klappt das so nicht richtig, die "HueOffSofa" wird ordentlich wie in der 99.pm angelegt ausgestellt aber bei der "HueOffSideBoard" will es einfach nicht funktionieren?!
Beide .pm werden korrekt ausgeführt wenn ich sie in Fhem direkt ausführe.
Hat jemand vielleicht eine Idee?
Mfg Steffen
Zitat von: Damian am 01 Oktober 2014, 07:51:13
"else" heißt auf deutsch "sonst". Der Fall DOELSE wird nur ausgeführt, wenn deine Bedingung nicht! wahr ist, also sonst.
Gruß
Damian
Zitat von: Steffen am 01 Oktober 2014, 08:09:21Dafür gibt es den Sleep-Befehl (http://fhem.de/commandref.html#sleep). Also ungefähr so:
Das hatte ich mir auch schon gedacht und war nur ein versuch von vielen aber bekommt man denn zwei Befehle mit einer Verzögerung(wait) unter gebracht??
({HueOffSofa};;sleep 30 quiet;;{HueOffSideBoard})
Zitat von: Brockmann am 01 Oktober 2014, 08:35:44
Dafür gibt es den Sleep-Befehl (http://fhem.de/commandref.html#sleep). Also ungefähr so:Code Auswählen
({HueOffSofa};;sleep 30 quiet;;{HueOffSideBoard})
Wichtig: Unbedingt, das FHEM-sleep verwenden, nicht das Perl-sleep, denn letzteres hält FHEM für den angegebenen Zeitraum komplett an.
Alternativ könntest Du auch ein at +00:00:30 definieren, das würde 30 Sekunden später ausgeführt und dann wieder gelöscht.
ZitatLampe soll ab 6:00 Uhr angehen, wenn es dunkel ist und wieder ausgehen, wenn es hell wird, spätestens aber um 9:00 Uhr:
define di_lamp DOIF ([06:00-09:00] and [sensor:brightness] < 40) (set lamp on) DOELSE (set lamp off)
Zitat von: Otto am 03 Oktober 2014, 07:32:00Die Bedingung ist ab 9:00 Uhr nicht mehr wahr und damit geht die Lampe aus. Daher ist es egal ob nach 9:00 brightness >40, da die Bedingung bereits falsch ist und die Lampe ausgegangen ist. Mehr als falsch geht nicht und mehr als aus auch nicht ;)
Hallo,
habe mal eine Verständnisfrage, im commandref steht:
Aber wenn die brightness nach 9:00 >40 ist passiert nix, richtig?
Wie fängt man das ab?
Gruß Otto
Zitat von: holzwurm83 am 03 Oktober 2014, 19:28:27
Hallo zusammen, ich möchte über meine Fensterkontakte meine Rollladen steuern. Z.B. wenn ich das Fenster inerhalb von zwei sec auf und wieder zu mache soll der Rollo hochfahren. Habe mir die Doku komplett durchgelesen, aber finde dazu irgendwie keinen Ansatz.
Könnt ihr mir weiterhelfen?
setreading Fenster doppelkick off
(nur einmalig setzen)define di_fensterhoch DOIF ([Fenster])
(IF ([Fenster:doppelklick] eq "on")
(set Rollladen hoch)
ELSE
(setreading Fenster doppelklick on, define doppelklick_off at +00:00:02 setreading Fenster doppelklick off))
attr di_fensterhoch do always
define WZ_J_OST dummy
attr WZ_J_OST KU_J_Front Alle_Jalousie
attr WZ_J_OST alias Osten
attr WZ_J_OST devStateIcon 00:fts_shutter_up:auf C8:fts_shutter_down:stop C9:fts_shutter_manual:zu
attr WZ_J_OST eventMap zu:00 auf:C8 stop:C9
attr WZ_J_OST group Jalousie
attr WZ_J_OST icon fts_blade_arc
attr WZ_J_OST room Wohnzimmer
attr WZ_J_OST setList zu auf stop
attr WZ_J_OST webCmd zu:auf:stop
define WZ_Fenster_OST_R DOIF ([HMW_Sen_SC_12_DR_JEQ0545703_05:sensor] == 51200 and [HMW_Sen_SC_12_DR_JEQ0545703_06:sensor] == 0) DOELSEIF ([HMW_Sen_SC_12_DR_JEQ0545703_05:sensor] == 0 and [HMW_Sen_SC_12_DR_JEQ0545703_06:sensor] == 51200) DOELSEIF ([HMW_Sen_SC_12_DR_JEQ0545703_05:sensor] == 51200 and [HMW_Sen_SC_12_DR_JEQ0545703_06:sensor] == 51200)
attr WZ_Fenster_OST_R cmdState zu|gekippt|offen
attr WZ_Fenster_OST_R devStateIcon zu:fts_window_1w offen:fts_window_1w_open@red gekippt:fts_window_1w_tilt@red
attr WZ_Fenster_OST_R group Fenster
attr WZ_Fenster_OST_R icon fts_door_right
attr WZ_Fenster_OST_R room Wohnzimmer
define di_fensterhoch DOIF ([WZ_Fenster_OST_R]) (IF ([WZ_Fenster_OST_R:doppelklick] eq "offen") (set WZ_J_OST auf) ELSE (setreading WZ_Fenster_OST_R doppelklick offen, define doppelklick_zu at +00:00:04 setreading Fenster doppelklick zu))
attr di_fensterhoch do always
define WZ_Fenster_OST_R DOIF ([HMW_Sen_SC_12_DR_JEQ0545703_05:sensor] == 51200 and [HMW_Sen_SC_12_DR_JEQ0545703_06:sensor] == 0) DOELSEIF ([HMW_Sen_SC_12_DR_JEQ0545703_05:sensor] == 0 and [HMW_Sen_SC_12_DR_JEQ0545703_06:sensor] == 51200) DOELSEIF ([HMW_Sen_SC_12_DR_JEQ0545703_05:sensor] == 51200 and [HMW_Sen_SC_12_DR_JEQ0545703_06:sensor] == 51200)
Zitatdu weisst aber das du ALLE Fenster gegen den Namen deines Fensters austauschen musst?Ein Fenster hatte ich wohl übersehen:
Selbiges mit dem Rollladen.
define di_fensterhoch DOIF ([WZ_Fenster_OST_R]) (IF ([WZ_Fenster_OST_R:doppelklick] eq "offen") (set WZ_J_OST auf) ELSE (setreading WZ_Fenster_OST_R doppelklick offen, define doppelklick_zu at +00:00:04 setreading WZ_Fenster_OST_R doppelklick zu))
attr di_fensterhoch do always
ZitatAuch fehlt mir irgendwie das neue Reading beim Fenster - auch hier bietet es sich an im geposteten Code Fenster gegen den Namen deines Fensters zu tauschen.Habe da noch mal ein Bild angehängt. Mit dem Bilder anhängen muss ich aber noch üben.
ZitatDas ist ein Define eines DOIF und kein Device im Sinne von - das ist der Sensor an meinem Fenster.
ZitatHeißt es, dass man es nun anders lösen muss?Weiß ich nicht - da muss Damian was dazu sagen.
setreading WZ_Fenster_OST_R doppelkick off
Zitat von: Damian am 05 Oktober 2014, 16:26:19
In der Fehlermeldung steht: IF: unknown reading: WZ_Fenster_OST_R:doppelklick
also hast du nicht zu Anfang , wie ich geschrieben habe:Code Auswählensetreading WZ_Fenster_OST_R doppelkick off
gesetzt.
Gruß
Damian
Zitat von: Damian am 05 Oktober 2014, 16:26:19
In der Fehlermeldung steht: IF: unknown reading: WZ_Fenster_OST_R:doppelklick
also hast du nicht zu Anfang , wie ich geschrieben habe:Code Auswählensetreading WZ_Fenster_OST_R doppelkick off
gesetzt.
Gruß
Damian
setreading WZ_Fenster_OST_R doppelkick zu
Zitat von: Puschel74 am 05 Oktober 2014, 16:41:14
doppelkick oder doppelklick?
define di_fensterhoch DOIF ([WZ_Fenster_OST_R]) (IF ([WZ_Fenster_OST_R:doppelklick] eq "offen") (set WZ_J_OST auf) ELSE (setreading WZ_Fenster_OST_R doppelklick offen, define doppelklick_zu at +00:00:02 setreading WZ_Fenster_OST_R doppelklick zu))
attr di_fensterhoch do always
attr di_fensterhoch verbose 5
doppelklick offen
setreading WZ_Fenster_OST_R doppelklick zu
2014.10.05 17:34:58 2: di_fensterhoch: IF ([WZ_Fenster_OST_R:doppelklick] eq "offen") (set WZ_J_OST auf) ELSE (setreading WZ_Fenster_OST_R doppelklick offen, define doppelklick_zu at +00:00:02 setreading WZ_Fenster_OST_R doppelklick zu): doppelklick_zu already defined, delete it first
Zitatdoppelklick_zu already defined, delete it firstist normal wenn du innerhalb der Zeit das Fenster nochmal öffnest - das at ist zu diesem Zeitpunkt bereits definiert.
Zitat von: holzwurm83 am 05 Oktober 2014, 17:39:27
Anbei meine finale Def.:Code Auswählendefine di_fensterhoch DOIF ([WZ_Fenster_OST_R]) (IF ([WZ_Fenster_OST_R:doppelklick] eq "offen") (set WZ_J_OST auf) ELSE (setreading WZ_Fenster_OST_R doppelklick offen, define doppelklick_zu at +00:00:02 setreading WZ_Fenster_OST_R doppelklick zu))
attr di_fensterhoch do always
attr di_fensterhoch verbose 5
Beim Fenster habe ich als Reading nun immerCode Auswählendoppelklick offen
stehen.
Habe mitCode Auswählensetreading WZ_Fenster_OST_R doppelklick zu
versucht "zu" zu setzten, aber das geht auch nicht.
Im Log steht dann folgende Meldung:Code Auswählen2014.10.05 17:34:58 2: di_fensterhoch: IF ([WZ_Fenster_OST_R:doppelklick] eq "offen") (set WZ_J_OST auf) ELSE (setreading WZ_Fenster_OST_R doppelklick offen, define doppelklick_zu at +00:00:02 setreading WZ_Fenster_OST_R doppelklick zu): doppelklick_zu already defined, delete it first
2014-10-05 19:37:59 dummy WZ_J_OST C8
2014-10-05 19:37:59 DOIF di_fensterhoch cmd_nr: 1
2014-10-05 19:37:59 DOIF di_fensterhoch cmd_event: WZ_Fenster_OST_R
2014-10-05 19:37:59 DOIF di_fensterhoch cmd_1
2014-10-05 19:37:59 DOIF WZ_Fenster_OST_R cmd_nr: 3
2014-10-05 19:37:59 DOIF WZ_Fenster_OST_R cmd_event: HMW_Sen_SC_12_DR_JEQ0545703_06
2014-10-05 19:37:59 DOIF WZ_Fenster_OST_R offen
2014-10-05 19:37:59 HM485 HMW_Sen_SC_12_DR_JEQ0545703_06 sensor: 51200
2014-10-05 19:38:01 HM485_LAN HM485_LAN RAW 0000CBB8 98 00000001 7802C8
2014-10-05 19:38:01 dummy WZ_J_OST C8
2014-10-05 19:38:01 DOIF di_fensterhoch cmd_nr: 1
2014-10-05 19:38:01 DOIF di_fensterhoch cmd_event: WZ_Fenster_OST_R
2014-10-05 19:38:01 DOIF di_fensterhoch cmd_1
2014-10-05 19:38:01 DOIF WZ_Fenster_OST_R cmd_nr: 1
2014-10-05 19:38:01 DOIF WZ_Fenster_OST_R cmd_event: HMW_Sen_SC_12_DR_JEQ0545703_06
2014-10-05 19:38:01 DOIF WZ_Fenster_OST_R zu
2014-10-05 19:38:01 HM485 HMW_Sen_SC_12_DR_JEQ0545703_06 sensor: 0
Zitat von: holzwurm83 am 05 Oktober 2014, 19:42:37
Der Eventmonitor Zeigt folgendes:Code Auswählen2014-10-05 19:37:59 dummy WZ_J_OST C8
2014-10-05 19:37:59 DOIF di_fensterhoch cmd_nr: 1
2014-10-05 19:37:59 DOIF di_fensterhoch cmd_event: WZ_Fenster_OST_R
2014-10-05 19:37:59 DOIF di_fensterhoch cmd_1
2014-10-05 19:37:59 DOIF WZ_Fenster_OST_R cmd_nr: 3
2014-10-05 19:37:59 DOIF WZ_Fenster_OST_R cmd_event: HMW_Sen_SC_12_DR_JEQ0545703_06
2014-10-05 19:37:59 DOIF WZ_Fenster_OST_R offen
2014-10-05 19:37:59 HM485 HMW_Sen_SC_12_DR_JEQ0545703_06 sensor: 51200
2014-10-05 19:38:01 HM485_LAN HM485_LAN RAW 0000CBB8 98 00000001 7802C8
2014-10-05 19:38:01 dummy WZ_J_OST C8
2014-10-05 19:38:01 DOIF di_fensterhoch cmd_nr: 1
2014-10-05 19:38:01 DOIF di_fensterhoch cmd_event: WZ_Fenster_OST_R
2014-10-05 19:38:01 DOIF di_fensterhoch cmd_1
2014-10-05 19:38:01 DOIF WZ_Fenster_OST_R cmd_nr: 1
2014-10-05 19:38:01 DOIF WZ_Fenster_OST_R cmd_event: HMW_Sen_SC_12_DR_JEQ0545703_06
2014-10-05 19:38:01 DOIF WZ_Fenster_OST_R zu
2014-10-05 19:38:01 HM485 HMW_Sen_SC_12_DR_JEQ0545703_06 sensor: 0
Also wird nur einmal "offen" erzeugt.
ZitatVor deinem Test des Doppelklicks, muss das Reading doppelklick bei WZ_Fenster_OST_R auf "zu" stehen und natürlich kein doppelklick_zu-at existieren.
2014.10.05 20:01:41 2: di_fensterhoch: IF ([WZ_Fenster_OST_R:doppelklick] eq "offen") (set WZ_J_OST auf) ELSE (setreading WZ_Fenster_OST_R doppelklick offen, define doppelklick_zu at +00:00:02 setreading WZ_Fenster_OST_R doppelklick zu): doppelklick_zu already defined, delete it first
Zitat von: holzwurm83 am 05 Oktober 2014, 20:07:13
Da liegt wohl auch das Problem!? WZ_Fenster_OST_R steht auf "offen" und ich kann es nicht auf "zu" setzen, da doppelklick_zu-at bereits existiert.Code Auswählen2014.10.05 20:01:41 2: di_fensterhoch: IF ([WZ_Fenster_OST_R:doppelklick] eq "offen") (set WZ_J_OST auf) ELSE (setreading WZ_Fenster_OST_R doppelklick offen, define doppelklick_zu at +00:00:02 setreading WZ_Fenster_OST_R doppelklick zu): doppelklick_zu already defined, delete it first
Das at finde ich leider nicht um es zu löschen.
setreading WZ_Fenster_OST_R doppelklick zu
Zitat von: holzwurm83 am 05 Oktober 2014, 20:17:55
hm?
MitCode Auswählensetreading WZ_Fenster_OST_R doppelklick zu
bleibt das reading auf offen stehen.
Zitat von: holzwurm83 am 05 Oktober 2014, 20:31:41
Ich meine eigentlich das Reading. Zur Sicherheit ein Screenshot.
define di_fensterhoch DOIF ([WZ_Fenster_OST_R]) (IF ([WZ_Fenster_OST_R:doppelklick] eq "offen") (set WZ_J_OST auf) ELSE (setreading WZ_Fenster_OST_R doppelklick offen, define doppelklick_zu at +00:00:02 setreading WZ_Fenster_OST_R doppelklick zu))
Zitat von: Puschel74 am 05 Oktober 2014, 20:59:01
Hallo,
sorry Damian aber setreading sollte eben kein Event auslösen.
Grüße
define di_fensterhoch DOIF ([WZ_Fenster_OST_R]) (IF ([WZ_Fenster_OST_R:doppelklick] eq "offen") (set WZ_J_OST auf) ELSE (set test_F_R WZ_Fenster_OST_R doppelklick offen, define doppelklick_zu at +00:00:02 set test_F_R WZ_Fenster_OST_R doppelklick zu))
attr di_fensterhoch do always
attr di_fensterhoch verbose 5
define test_F_R dummy
Zitat von: holzwurm83 am 05 Oktober 2014, 20:59:40
Da ist wohl irgendwo noch ein Fehler. Sobald ist das angelegte DOIF lösche kann ich das Reading wieder setzten. Finde hier aber den Fehler nicht:Code Auswählendefine di_fensterhoch DOIF ([WZ_Fenster_OST_R]) (IF ([WZ_Fenster_OST_R:doppelklick] eq "offen") (set WZ_J_OST auf) ELSE (setreading WZ_Fenster_OST_R doppelklick offen, define doppelklick_zu at +00:00:02 setreading WZ_Fenster_OST_R doppelklick zu))
define Doppelklick dummy
set Doppelklick off
define di_fensterhoch DOIF ([WZ_Fenster_OST_R])
(IF ([Doppelklick] eq "on")
(set WZ_J_OST auf)
ELSE
(set Doppelklick on, define doppelklick_zu at +00:00:02 set Doppelklick off))
attr di_fensterhoch do always
Zitat von: Damian am 05 Oktober 2014, 21:05:35Stimmt - laut commandref soll setreading auch ein Event auslösen.
Das tut er aber! Probier mal aus.
Gruß
Damian
Zitat von: holzwurm83 am 05 Oktober 2014, 21:37:35Noch nicht, mache erst mal Urlaub. Es wird aber ein ganzes Paket voller neuer Features für das Modul geben, die es in sich haben. ;)
Sehr schön! ;D Vielen Dank Damian! Jetzt geht das!
Weist du schon ab du die Version fertig hast, um das Dummy zu sparen?
Zitat von: Puschel74 am 05 Oktober 2014, 21:51:43
Hallo,
@holzwurm
Kannst du nochmal selbiges versuchen nur anstelle von setreading setstate verwenden?
Danke.
Grüße
Zitat von: Puschel74 am 05 Oktober 2014, 21:51:43
Hallo,
@holzwurm
Kannst du nochmal selbiges versuchen nur anstelle von setreading setstate verwenden?
Danke.
Grüße
define di_fensterhoch DOIF ([WZ_Fenster_OST_L]) (IF ([WZ_Fenster_OST_L:doppelklick] eq "offen") (set WZ_J_OST auf) ELSE (setstate WZ_Fenster_OST_L doppelklick offen, define doppelklick_zu at +00:00:02 setstate WZ_Fenster_OST_L doppelklick zu))
ZitatSobald ist das angelegte DOIF lösche kann ich das Reading wieder setzten.Ok, das hatte ich übersehen/verdrängt/vergessen 8)
Zitat von: satprofi am 06 Oktober 2014, 22:39:31Also wenn, dann
HAbe erfolgreich einge DOIF mit Dummys verknüpft. Jetzt habe ich eine Frage zu den State`s, wie muss der code aussehen wenn "on" oder "on-till" als wahr erkannt wird?
wäre ([dummy] eq "on" or eq "on-till") richtig?
([dummy] eq "on" or [dummy] eq "on-till")
oder etwas kürzer ([dummy] =~ "on|on-till")
define LichtAn DOIF ([EnO_switch_00001010:buttons] eq "pressed")(set Lampe on) DOELSEIF ([EnO_switch_00001010:buttons] eq "released") (set Lampe off)
attr LichtAn cmdState on|off
attr LichtAn room EnOcean
attr LichtAn wait 0:10
Zitat von: Spartacus am 07 Oktober 2014, 15:10:01Vielleicht hat Damian auch dafür eine Idee, aber ich stelle mir das schwierig vor, weil ja ein und dasselbe DOIF quasi auf dasselbe Ereignis unterschiedlich reagieren soll mit einer Verzögerung von 600s. Aber solange buttons auf "pressed" bleibt wird das DOIF eben nicht wieder getriggert und kann deshalb auch nicht erneut (anders) reagieren.
Kann diese Zwangsabschaltung in das DOIF integriert werden, oder baue ich einen watchdog drumherum, der den Aktor abschaltet?
attr ... wait 600
und wieder ausschaltet. Kommt zwischendurch das "released", ändert das zweite DOIF seinen Zustand und geht wieder schlafen. Wenn nicht, schlägt die Zwangsabschaltung zu.
Zitat von: Brockmann am 07 Oktober 2014, 15:24:02
Vielleicht hat Damian auch dafür eine Idee, aber ich stelle mir das schwierig vor, weil ja ein und dasselbe DOIF quasi auf dasselbe Ereignis unterschiedlich reagieren soll mit einer Verzögerung von 600s. Aber solange buttons auf "pressed" bleibt wird das DOIF eben nicht wieder getriggert und kann deshalb auch nicht erneut (anders) reagieren.
Eigentlich bietet sich dafür ein zweites DOIF an, das auf dasselbe Ereignis reagiert, aber mitCode Auswählenattr ... wait 600
und wieder ausschaltet. Kommt zwischendurch das "released", ändert das zweite DOIF seinen Zustand und geht wieder schlafen. Wenn nicht, schlägt die Zwangsabschaltung zu.
Zitat von: Spartacus am 07 Oktober 2014, 19:27:50
Ich hoffe, dass das watchdog Modul die Verzögerung des DOIF abbricht.... teste ich mal.
define di_Benachrichtigung DOIF ([EnO_switch_00001010:buttons] eq "pressed") ({email()}, set Lampe off)
attr di_Benachrichtigung wait 600
2014-10-12_20:40:40 opvenval 0
2014-10-12_20:40:37 opvd1val 0
2014-10-12_20:39:43 opzupval 0
2014-10-12_20:39:37 ophupval 1
2014-10-12_20:39:25 doif_push_hp_ophupval disabled
2014-10-12_20:29:37 ophupval 0
2014-10-12_20:27:37 opwupval 0
2014-10-12_20:26:37 opsolval 0
2014-10-12_20:26:37 opflhval 0
2014-10-12_20:19:37 op2weval 0
2014-10-12_20:11:37 opwupval 0
2014-10-12_20:09:40 opzupval 0
2014-10-12_20:09:40 opvenval 0
2014-10-12_20:09:37 opvd1val 0
2014-10-12_19:59:42 doif_push_hp_ophupval cmd_2
2014-10-12_19:59:42 doif_push_hp_ophupval cmd_event: ophupval
2014-10-12_19:59:42 doif_push_hp_ophupval cmd_nr: 2
2014-10-12_19:59:37 ophupval 0
2014-10-12_19:55:38 opsolval 0
2014-10-12_19:55:38 opflhval 0
2014-10-12_19:55:38 opwupval 0
2014-10-12_19:52:44 doif_push_hp_ophupval cmd_1
2014-10-12_19:52:44 doif_push_hp_ophupval cmd_event: ophupval
2014-10-12_19:52:44 doif_push_hp_ophupval cmd_nr: 1
2014-10-12_19:52:37 ophupval 1
./log/WP_D-%Y-%m-%d.log opvd1val|opvenval|op2weval|ophupval|opwupval|opzupval|opflhval|opsolval
Zitat von: oniT am 12 Oktober 2014, 20:56:02
Hallo Damian,
zunächst einmal muss ich sagen, ich finde das Modul ziemlich gut und versuche mich nach und nach ein wenig ranzutasten. Jetzt habe ich eine Frage dazu und hoffe diese wurde nich schon beantwortet :-) Ich lese zwar in diesem Thread ab und zu mit, weiß jedoch nicht ob diese Frage bereits gestellt wurde.
Und zwar wird jedesmal bei einer Ausführung ein Eintrag in das Logfile des Device erzeugt.
Zum Beispiel:Code Auswählen
2014-10-12_20:40:40 opvenval 0
2014-10-12_20:40:37 opvd1val 0
2014-10-12_20:39:43 opzupval 0
2014-10-12_20:39:37 ophupval 1
2014-10-12_20:39:25 doif_push_hp_ophupval disabled
2014-10-12_20:29:37 ophupval 0
2014-10-12_20:27:37 opwupval 0
2014-10-12_20:26:37 opsolval 0
2014-10-12_20:26:37 opflhval 0
2014-10-12_20:19:37 op2weval 0
2014-10-12_20:11:37 opwupval 0
2014-10-12_20:09:40 opzupval 0
2014-10-12_20:09:40 opvenval 0
2014-10-12_20:09:37 opvd1val 0
2014-10-12_19:59:42 doif_push_hp_ophupval cmd_2
2014-10-12_19:59:42 doif_push_hp_ophupval cmd_event: ophupval
2014-10-12_19:59:42 doif_push_hp_ophupval cmd_nr: 2
2014-10-12_19:59:37 ophupval 0
2014-10-12_19:55:38 opsolval 0
2014-10-12_19:55:38 opflhval 0
2014-10-12_19:55:38 opwupval 0
2014-10-12_19:52:44 doif_push_hp_ophupval cmd_1
2014-10-12_19:52:44 doif_push_hp_ophupval cmd_event: ophupval
2014-10-12_19:52:44 doif_push_hp_ophupval cmd_nr: 1
2014-10-12_19:52:37 ophupval 1
Ist das so gewollt und kann man das verhindern? Rein von der Definition her dürfte es ja nicht passieren denke ich.Code Auswählen
./log/WP_D-%Y-%m-%d.log opvd1val|opvenval|op2weval|ophupval|opwupval|opzupval|opflhval|opsolval
Danke
Gruß,
Tino
./log/WP_D-%Y-%m-%d.log opvd1val|opvenval|op2weval|ophupval|opwupval|opzupval|opflhval|opsolval
([opwupval:state] == 1)(set PushBulletiPhone message An | An | iPhone) DOELSEIF ([opwupval:state] == 0)(set PushBulletiPhone message Aus | Aus | iPhone)
Zitat von: oniT am 12 Oktober 2014, 21:42:46Code Auswählen
./log/WP_D-%Y-%m-%d.log opvd1val|opvenval|op2weval|ophupval|opwupval|opzupval|opflhval|opsolval
([18:00|5] and $yday % 14 == 0) (set TESTLAMPE on) DOELSEIF ([23:59|0] and $yday % 14 == 0) (set TESTLAMPE off)
Zitat von: Jens_B am 13 Oktober 2014, 09:19:17
Hallo Zusammen,
ich möchte jetzt in Bezug auf DOIF folgendes umsetzen, eine Lampe/Schalter soll nur alle 14 Tage an den Wochenenden an sein (Ab Freitag 18 Uhr zum Beispiel bis Sonntag 23:59).
Ich habe das jetzt als DOIF so realisiert:Code Auswählen
([18:00|5] and $yday % 14 == 0) (set TESTLAMPE on) DOELSEIF ([23:59|0] and $yday % 14 == 0) (set TESTLAMPE off)
Sollte doch funktionieren oder? Wie beeinflusse ich jetzt das auch der 14 Tagesryhtmus genommen wird, den ich brauche? Starten soll es jetzt diesen Freitag, danach alle 2 Wochen.
Gruß
Jens
([18:00|5] and strftime("%W",localtime)%2 == 1)
(set TESTLAMPE on)
DOELSEIF ([23:59|0] and strftime("%W",localtime)%2 == 1)
(set TESTLAMPE off)
ZitatWird so nicht gut funktionieren. Die Wahrscheinlichkeit, dass am Freitag sich der Tag des Jahres durch 14 teilen lässt, ist 1 zu 14, also eher unwahrscheinlich, in diesem Jahr sogar 0 %
([18:00|5] and strftime("%W",localtime)%2 == 1)
(set TESTLAMPE on)
DOELSEIF ([23:59|0] and strftime("%W",localtime)%2 == 1)
(set TESTLAMPE off)
Zitat von: Damian am 12 Oktober 2014, 22:06:01
Eines der Schlüsselwörter kommt offenbar im Namen des DOIF-Moduls vor. Genauere Syntax zu regexp-Angaben beim Filelog siehe:
http://fhem.de/commandref_DE.html#FileLog
Gruß
Damian
define di_Benachrichtigung DOIF ([EnO_switch_00001010:buttons] eq "pressed") ({email()}, set Lampe off)
attr di_Benachrichtigung wait 600
define LichtAn DOIF ([EnO_switch_00001010:buttons] eq "pressed")(set Lampe on) DOELSEIF ([EnO_switch_00001010:buttons] eq "released") (set Lampe off)
attr LichtAn cmdState on|off
attr LichtAn room EnOcean
attr LichtAn wait 0:10
define LichtAn DOIF ([EnO_switch_00001010:buttons] eq "pressed")(set Lampe on) DOELSEIF ([di_Benachrichtigung] eq "cmd_2") DOELSEIF ([EnO_switch_00001010:buttons] eq "released") (set Lampe off)
attr LichtAn wait 0:0:10
attr LichtAn cmdState on|off|off
DOELSEIF ([di_Benachrichtigung] eq "cmd_2")
Zitat von: Spartacus am 17 Oktober 2014, 16:03:02
Hi Damian,
irgendwie habe ich es noch nicht verstanden!
Fehlt da nicht bei diesem DOIF noch eine Aktion? zB. set Lampe off?Code AuswählenDOELSEIF ([di_Benachrichtigung] eq "cmd_2")
So oder so!
wenn ich das so teste, wie Du gepostet hast, bleibt der Aktor an.
wenn ich das DOELSEIF ergänze, schaltet der Aktor nur kurz ein, und direkt wieder aus.
Spartacus.
"released"->"pressed"->"released".
Zitat von: Spartacus am 17 Oktober 2014, 17:47:36
Wird der Fehler behoben (Schnee schippen!) und ist der Zustand am Eingang wieder auf "released" zurückgefallen, dann muss das Licht auch wieder direkt einschalten, wenn die LS durchschritten wird.
Zitat von: Spartacus am 17 Oktober 2014, 19:11:30
Hi Damian,
ne, falsch verstanden! Hier wird nichts manuell abgeschaltet! Die Abschaltung erfolgt nur durch das "di_Benachrichtigung"!
Nehmen wir an, es schneit! (zum Glück wird es morgen 25 Grad! 8))
Der Schnee blockiert irgendwann die Lichtschranke ("released"->"pressed"), Licht schaltet ein und wird ständig nachgetriggert, da Zustand="pressed". Nach 10min. greift der Timer der Notabschaltung, das Licht geht aus.
Das heißt: Schranke ist blockiert ("pressed"), Licht ist aber aus!
Nun schaufelt der fleißige Hausbesitzer am späten Abend den Schnee weg, der Zustand des Eingangs ändert sich von "pressed" auf "released", das Licht bleibt aber aus. Soweit alles gut!
Wenn jetzt der Hausbesitzer in sein warmes Haus zurückkehrt, durchschreitet er erneut die LS und das Licht sollte nun wieder einschalten, da nun der ursprüngliche Zustand (LS="released") wieder hergestellt ist. Und genau das passiert nicht!
Nachdem der Schnee weggeräumt wurde ("pressed"->"released") startet die Ausschaltverzögerung des Moduls "LichtAn" (obwohl Lich aus ist) und verhindert für die Dauer der Ausschaltverzögerung das erneute Einschalten durch den Eingang der LS.
Das heißt:
Durchschreitet jemand während dieser 10s die LS erneut, schaltet das Licht nicht ein. Erst nach Ablauf der Verzögerungszeit kann man durch erneutes Durchschreiten der LS den Aktor schalten.
Das mag kleinkariert klingen, ist auch bei 10s nicht tragisch. Bei 2-3min Ausschaltverzögerung aber ungünstig, da sich der Aktor während dieser Zeit nicht einschalten lässt.
Christian.
define Notaus dummy
define di_Benachrichtigung DOIF ([EnO_switch_00001010:buttons] eq "pressed") ({email()}, set Lampe off, set Notaus on)
define LichtAn DOIF ([EnO_switch_00001010:buttons] eq "pressed")(set Lampe on) DOELSEIF ([EnO_switch_00001010:buttons] eq "released") (set Lampe off) DOELSEIF ([Notaus] eq "on")
attr LichtAn wait 0:10:0
attr LichtAn cmdState on|off|off
Zitat von: Spartacus am 18 Oktober 2014, 08:45:23
Damian,
erst einmal vielen Dank für Deine Antwort. Ich werde das mal testen.
Wie ich Deinem Post entnehmen kannst, planst Du das DOIF zu erweitern um solche Aufgabenstellungen einfacher zu lösen.
Das finde ich großartig!
Aber heute gibt es vermutlich den letzten Sommertag! Also lieber mal Pause machen und ab in den Garten......
Ich melde mich...
Vielen Dank,
Christian
Zitat von: Spartacus am 18 Oktober 2014, 13:53:14
Hi puschel,
genau die Frage habe ich mir auch gestellt! Das durchblicke ich nicht! Aber es funktioniert!
Christian.
Zitat von: Spartacus am 18 Oktober 2014, 13:53:14
Hi puschel,
genau die Frage habe ich mir auch gestellt! Das durchblicke ich nicht! Aber es funktioniert!
Christian.
set Notaus off
noch einbauen - und zwar dort wo es deiner Meinung nach Sinn macht ;)Internals:
CFGFN
DEF (([harmony.hub.1:currentActivity] eq "BLUE RAY" or [harmony.hub.1:currentActivity] eq "DVD") and [dummy.rollade.1:state] eq "on") (set hm.rollade.2 pct 65, set hm.rollade.1 pct 65)
DOELSEIF ([dummy.rollade.1:state] eq "off") (set hm.rollade.2. off, IF ([hm.sec.1:state] eq "closed") set hm.rollade.1 off)
DOELSE (set hm.rollade.2 on, set hm.rollade.1 on)
NAME doif.media.film
NR 1049
NTFY_ORDER 50-doif.media.film
STATE cmd_3
TYPE DOIF
CHANGETIME:
Helper:
Dblog:
Cmd_event:
Mydblog:
TIME 1413804423.30252
VALUE harmony.hub.1
Cmd_nr:
Mydblog:
TIME 1413804423.30252
VALUE 3
State:
Mydblog:
TIME 1413804423.30252
VALUE cmd_3
Readings:
2014-10-20 13:27:03 cmd_event harmony.hub.1
2014-10-20 13:27:03 cmd_nr 3
2014-10-20 13:27:06 e_harmony.hub.1_currentActivity NETZWERKPLAYER
2014-10-20 13:27:03 state cmd_3
Condition:
0 (ReadingValDoIf('harmony.hub.1','currentActivity','') eq "BLUE RAY" or ReadingValDoIf('harmony.hub.1','currentActivity','') eq "DVD") and ReadingValDoIf('dummy.rollade.1','state','') eq "on"
1 ReadingValDoIf('dummy.rollade.1','state','') eq "off"
Devices:
0 harmony.hub.1 dummy.rollade.1
1 dummy.rollade.1
all harmony.hub.1 dummy.rollade.1
Do:
0 set hm.rollade.2 pct 65, set hm.rollade.1 pct 65
1 set hm.rollade.2. off, IF ([hm.sec.1:state] eq "closed") set hm.rollade.1 off
2 set hm.rollade.2 on, set hm.rollade.1 on
Helper:
last_timer 0
sleeptimer -1
Internals:
Readings:
0 harmony.hub.1:currentActivity dummy.rollade.1:state
1 dummy.rollade.1:state
all harmony.hub.1:currentActivity dummy.rollade.1:state
State:
Timerfunc:
Attributes:
room Media,Wohnzimmer
hm.rollade.1 = Terassentür mit Sonderbehandlung
hm.rollade.1 = normales Fenster
dummy.rollade.1 "Sollzustand der Rollade (On = Offen, Off = geschlossen)
das Device hm.rollade.1 geht auf und nicht zu, wenn der Fensterkontakt (hm.sec.1) "open" ist
(([harmony.hub.1:currentActivity] eq "BLUE RAY" or [harmony.hub.1:currentActivity] eq "DVD") and [dummy.rollade.1:state] eq "on") (set hm.rollade.2 pct 65, set hm.rollade.1 pct 65)
DOELSEIF ([dummy.rollade.1:state] eq "off") (set hm.rollade.2. off, IF ([hm.sec.1:state] eq "closed") set hm.rollade.1 off)
DOELSE (set hm.rollade.2 on, set hm.rollade.1 on)
ZitatHabe ich es richtig gemacht?Funktioniert es den so wie du es möchtest?
Zitat von: Wuppi68 am 20 Oktober 2014, 13:42:29
Habe ich es richtig gemacht?
Zitat von: Damian am 20 Oktober 2014, 16:06:08
Ob es richtig funktioniert oder nicht, kannst nur du beurteilen. Grundsätzlich ist nichts falsch, was deinen Anforderungen entspricht. Bei IF musst du allerdings den Befehl ebenfalls in Klammen setzen, also:
IF ([hm.sec.1:state] eq "closed") (set hm.rollade.1 off)
Gruß
Damian
define Heizung DOIF([DS18B20_Gartenhaus:temperature] >1.5) (set EnO_FSR14_GH_D off)
DOELSEIF ([DS18B20_Gartenhaus:temperature] <0.5 and {(!$isdst)}) (set EnO_FSR14_GH_D on)
Zitat von: Spartacus am 21 Oktober 2014, 14:09:33
Hallo,
ich bin es noch mal! Habe nun ein anderes Problem mit dem DOIF:Code Auswählendefine Heizung DOIF([DS18B20_Gartenhaus:temperature] >1.5) (set EnO_FSR14_GH_D off)
DOELSEIF ([DS18B20_Gartenhaus:temperature] <0.5 and {(!$isdst)}) (set EnO_FSR14_GH_D on)
Der Frostwächter soll nur einschalten, wenn die Sommerzeit beendet ist. $isdst steht momentan auf "1" . Somit sollte die "und"-Verknüpfung nicht erfüllt sein und die Heizung ausbleiben. Allerdings schaltet die Heizung trotzdem!
Wo habe ich jetzt den Fehler in meinem DOIF?
Christian
Zitat von: Wuppi68 am 20 Oktober 2014, 19:50:04
Danke Damian,
es klappt noch nicht ganz :-( Werde aber jetzt noch einmal alle Zustände durchgehen ...
für das IF hätte ich wahrscheinlich etwas länger gebraucht - noch einmal Danke
cu
Ralf
([harmony.hub.1:currentActivity] eq "BLUE RAY" or [harmony.hub.1:currentActivity] eq "DVD")
(
IF ([dummy.rollade.1:state] eq "on")
(set hm.rollade.2 pct 65, set hm.rollade.1 pct 65)
ELSE
(set hm.rollade.2 off, IF ([hm.sec.1:state] eq "closed") (set hm.rollade.1 off) )
)
DOELSE
(
IF ([dummy.rollade.1:state] eq "on")
(set hm.rollade.2 on, set hm.rollade.1 on)
ELSE
(set hm.rollade.2 off, IF ([hm.sec.1:state] eq "closed") (set hm.rollade.1 off)
)
)
Zitat von: Damian am 21 Oktober 2014, 20:58:17Hallo Damian,
In der Bedingung gilt die normale Perlsyntax, außer "Sachen" in eckigen Klammern, also:
... ([DS18B20_Gartenhaus:temperature] <0.5 and !$isdst)...
Gruß
Damian
Zitat von: Spartacus am 21 Oktober 2014, 21:45:25
Hallo Damian,
danke für den Hinweis! Scheint zu funzen. Jetzt aber noch eine Frage:
Wenn man den Code in der DOIF ändert, dann ändert sich der State auf "initialized". Es dauert eine ganze Zeit, bis sich ein Status (cmd1, cmd2) einstellt. Was passiert da im Hintergrund, und kann man einen definierten State einfach setzten?
Spartacus
([Fenster_WZ] eq "Open" and [Heizungsmode] eq "auto") (set HZ_Wohnzimmer_Clima controlManu 16)
DOELSE ([Fenster_WZ] eq "Closed" and [Heizungsmode] eq "auto") (set HZ_Wohnzimmer_Clima controlMode auto)
Zitat von: satprofi am 25 Oktober 2014, 18:54:56
Hallo.
Habe problem mit folgenden DOIFCode Auswählen
([Fenster_WZ] eq "Open" and [Heizungsmode] eq "auto") (set HZ_Wohnzimmer_Clima controlManu 16)
DOELSE ([Fenster_WZ] eq "Open" and [Heizungsmode] eq "auto") (set HZ_Wohnzimmer_Clima controlMode auto)
last_error
Closed eq "Closed"; and auto eq "auto": Unknown command Closed, try help. Unknown command and, try help.
Was ist damit gemeint?
Fenster_WZ ist eine structure
gruss
ZitatWahrscheinlich meinst du DOELSEIF statt DOELSE. DOELSE hat keine Bedingung.
(([MK_Haustuer] eq "auf") and ([MK_Bad1] eq "auf" or [MK_Gast] eq "auf" or [MK_Bad2] eq "auf" or [MK_Heizung] eq "auf" or [MK_Kueche] eq "auf" or [MK_Terrasse] eq "auf" or [MK_Schlafzimmer] eq "auf")) (set Tablet ttsSay "@ ist auf") DOELSE (set Tablet ttsSay "Alles zu, tschüss, bis bald"))
Zitat von: knochenmuehle am 26 Oktober 2014, 17:40:32
Hallo, ich versuche mir ansagen zu lassen, wenn ein Fenster auf ist, wenn ich das Haus verlasse:Code Auswählen(([MK_Haustuer] eq "auf") and ([MK_Bad1] eq "auf" or [MK_Gast] eq "auf" or [MK_Bad2] eq "auf" or [MK_Heizung] eq "auf" or [MK_Kueche] eq "auf" or [MK_Terrasse] eq "auf" or [MK_Schlafzimmer] eq "auf")) (set Tablet ttsSay "@ ist auf") DOELSE (set Tablet ttsSay "Alles zu, tschüss, bis bald"))
dieser Versuch ist allerdings misslungen, wenn alles zu ist, passt es, wenn etwas auf ist möchte ich hören was auf ist, haut aber nicht hin...
Andreas
Zitat von: Damian am 26 Oktober 2014, 17:45:30Ich weiß nicht, ob das in diesem Fall hinhaut. Wenn ich zwei Fenster offen habe, eines schließe und dann rausgehe, dann ist das geschlossene das LastDevice und nicht das offene, oder?
Du kannst aber deine Fenster in eine Structure packen, diese in DOIF abfragen (dann wird die Abfrage auch wesentlich einfacher) und bei set Tablet ttsSay [<deine Structure>:LastDevice] angeben.
Zitat von: Brockmann am 26 Oktober 2014, 18:03:39
Ich weiß nicht, ob das in diesem Fall hinhaut. Wenn ich zwei Fenster offen habe, eines schließe und dann rausgehe, dann ist das geschlossene das LastDevice und nicht das offene, oder?
Zitat von: Damian am 26 Oktober 2014, 19:12:49Man könnte sich eine eigene Perl-Funktion bauen, die alle Fensterobjekte durchgeht und die zurückliefert, die "open" sind.
Stimmt. An den Fall habe ich nicht gedacht. Dann bleibt wohl nur der notify übrig oder mehrere DOELSEIF-Fälle.
Zitat von: Brockmann am 26 Oktober 2014, 19:37:55
Man könnte sich eine eigene Perl-Funktion bauen, die alle Fensterobjekte durchgeht und die zurückliefert, die "open" sind.
Eigentlich schade, denn im Prinzip "weiß" DOIF ja, wer die Bedingung erfüllt hat. Wären in solche Szenarien praktisch, wenn man das verwenden könnte.
Zitat von: Damian am 26 Oktober 2014, 19:53:45Daran hatte ich auch zuerst gedacht, aber das wäre - zumindest ist diesem Fall - auch keine Lösung. Denn in der Regel ist hier ja das Öffnen der Haustür der Trigger und nicht das Öffnen eines Fensters. Demzufolge würde im cmd_event die Haustür stehen...
ja, der Reading cmd_event im DOIF-Modul mit dem Namen des letzten Devices wird erst beim Setzen des Status geschrieben, daher leider paar Millisekunden zu spät. Ich denke, da kann ich sicherlich zukünftig noch etwas in DOIF einbauen.
"MK_Haustuer:auf;MK_Bad1:zu;MK_Gast:auf;MK_Bad2:zu;MK_Heizung:zu;MK_Kueche:zu;MK_Terrasse:zu;MK_Schlafzimmer:zu"
Zitat von: Brockmann am 26 Oktober 2014, 20:05:04ja, allerdings kümmere ich mich nicht selbst um die Zustände, sondern überlasse es Perl über die zuvor abgelegte Bedingungen mit entsprechenden Funktionen siehe conditions im DOIF-Modul mit list-Ausgabe.
Daran hatte ich auch zuerst gedacht, aber das wäre - zumindest ist diesem Fall - auch keine Lösung. Denn in der Regel ist hier ja das Öffnen der Haustür der Trigger und nicht das Öffnen eines Fensters. Demzufolge würde im cmd_event die Haustür stehen...
Eine spontane Idee (ggf. für die sehr erweiterte ToDo-Liste): Wenn DOIF irgendwie die Werte der getroffenen Bedingung als Liste von Name:Wert-Paare zugänglich machen würde, also z. B.Code Auswählen"MK_Haustuer:auf;MK_Bad1:zu;MK_Gast:auf;MK_Bad2:zu;MK_Heizung:zu;MK_Kueche:zu;MK_Terrasse:zu;MK_Schlafzimmer:zu"
Dann könnte man sich daraus mit einer Regex relativ flexibel die Informationen rausziehen, die man benötigt.
Zitat von: MaJu am 26 Oktober 2014, 19:53:17
Hallo Andreas,
vor dem gleichen Problem stand ich auch.
Hier die Lösung, die hervorragend funktioniert, es werden genau die offenen Fenster angesagt:
http://forum.fhem.de/index.php/topic,10628.msg162593.html#msg162593
([Wohnungstuer] eq "open" and [Abwesenheit] eq "gehen") (set Licht.* aus)
([myCalendar] modeStarted.*cq5k8hl2bfcvcb2mllkugu573ogooglecom) (set Restmuell on) DOELSE (set Restmuell off)
perl error in condition: InternalDoIf('myCalendar','STATE','') modeStarted.*cq5k8hl2bfcvcb2mllkugu573ogooglecom: syntax error at (eval 688998) line 1, near ") modeStarted"
Zitat von: satprofi am 31 Oktober 2014, 13:36:52Code Auswählen([myCalendar] modeStarted.*cq5k8hl2bfcvcb2mllkugu573ogooglecom) (set Restmuell on) DOELSE (set Restmuell off)
hatte aber schon einmal funktioniert, aber einige updates schon dazwischen. liegts an dem?
([myCalendar:modeStarted] =~ "cq5k8hl2bfcvcb2mllkugu573ogooglecom") (set Restmuell on) DOELSE (set Restmuell off)
Zitat von: Brockmann am 31 Oktober 2014, 14:11:56
Aber ich würde es auch eher so probieren (ungetestet):Code Auswählen([myCalendar:modeStarted] =~ "cq5k8hl2bfcvcb2mllkugu573ogooglecom") (set Restmuell on) DOELSE (set Restmuell off)
Zitat von: satprofi am 31 Oktober 2014, 17:53:02
bei DOIF benötigt man das doch nicht.
define led15rg DOIF ([Batterielader_aus] eq "off" and [08:00-22:00]) (set LED_15 led green) \
DOELSEIF ([Batterielader_aus] eq "on" and [08:00-22:00]) ( set LED_15 led red) \
DOELSE (set LED_15 led off)
attr led15rg do always
attr led15rg room DOIF
Zitat von: satprofi am 01 November 2014, 09:20:53
Hallo.
Danke, der fehler dürfte wegenb Übernahme aus notify entstanden sein.
Habe aber jetzt neues Problem, warum auch immer.
Leider wird um 8:01 die Led nicht angesteuert, erst nach Statuswechsel. Dies funktioniert nur sporadisch.Code Auswählen
define led15rg DOIF ([Batterielader_aus] eq "off" and [08:00-22:00]) (set LED_15 led green) \
DOELSEIF ([Batterielader_aus] eq "on" and [08:00-22:00]) ( set LED_15 led red) \
DOELSE (set LED_15 led off)
attr led15rg do always
attr led15rg room DOIF
last_cmd_event timer_1 08:01h
state cmd_3
define led14rg DOIF ([Netz_Schuetz_aus] eq "on" and [08:01-22:00]) (set LED_14 led red) \
DOELSEIF ([Netz_Schuetz_aus] eq "off" and [08:01-22:00]) (set LED_14 led green) \
DOELSE (set LED_14 led off)
attr led14rg do always
attr led14rg room DOIF
Zitat von: satprofi am 01 November 2014, 11:41:30
sorry, falsche zeile kopiertCode Auswählen
define led14rg DOIF ([Netz_Schuetz_aus] eq "on" and [08:01-22:00]) (set LED_14 led red) \
DOELSEIF ([Netz_Schuetz_aus] eq "off" and [08:01-22:00]) (set LED_14 led green) \
DOELSE (set LED_14 led off)
attr led14rg do always
attr led14rg room DOIF
Zitat von: Steffen am 01 November 2014, 12:16:56
Hallo!
Wollte einen timer setzten der alle 10 minuten ein befehl ausführt, geht das auch mit DOIF?
Mfg Steffen
Zitat von: Damian am 01 November 2014, 12:20:48
Das geht erst mit der nächsten Version von DOIF. Z. Zt. musst du at benutzen.
Gruß
Damian
Zitat von: satprofi am 01 November 2014, 12:13:12
Device Homematic.
Status wie um 22:00, aus. Zwischenzeitlich, 02:00-04:00, wurde aber der Status auf on geändert.
Zitat von: satprofi am 02 November 2014, 08:40:17Dann sollte es jetzt immer funktionieren. Der Bug-Fix ist übrigens ab heute per FHEM-Update verfügbar und ist für alle zu empfehlen, die mit Zeitintervallen arbeiten.
Danke. Klappt zumimdest heute
Gesendet von meinem GT-I9300
define Kugel_Wohn DOIF ([FS20_S8_B] eq "on") (set Wohnzimmer_Kugel on) DOELSEIF ([FS20_S8_B] eq "off") (set Wohnzimmer_Kugel off)
attr Kugel_Wohn do always
ZitatArbeitest du mit Dummy´s ? Wenn nicht schalte einen Dummy,Also wenn er NICHT mit einem Dummy arbeitet soll er einen schalten :o
Zitat von: The-Holgi am 02 November 2014, 11:26:34
Hallo, versuche gerade eine Lampe (Wohnzimmer_Kugel) die mit einer Elro Steckdose geschaltet wird über eine FS20 S8 Fernbedienung (FS20_S8_B)zu schalten.Code Auswählendefine Kugel_Wohn DOIF ([FS20_S8_B] eq "on") (set Wohnzimmer_Kugel on) DOELSEIF ([FS20_S8_B] eq "off") (set Wohnzimmer_Kugel off)
Code Auswählenattr Kugel_Wohn do always
Mit diesem code läßt sich die Lampe über die Fernbedienung ein aber nicht mehr ausschalten. Der Zustand des Schalters wird in fhem korrekt angezeigt (on;off).
Hat vielleicht jemand einen Tipp für mich ?
Edit: Über 2 notify´s funktioniert es problemlos.
Gruß Holgi
Zitat von: The-Holgi am 02 November 2014, 11:26:34Das sollte so eigentlich funktionieren. Allerdings kenne ich die Eigenheiten dieser Fernbedienung nicht. Kann es sein, dass die nur ganz kurz den Status "off" annimmt? Dann könnte es sein, dass sie in dem Moment wo das DOIF den Status auswertet eben schon nicht mehr "off" ist. Wäre eine Erklärung.
Hat vielleicht jemand einen Tipp für mich ?
define Kugel_Wohn DOIF ([FS20_S8_B] eq "on") (set Wohnzimmer_Kugel on) DOELSE(set Wohnzimmer_Kugel off)
Zitat von: Brockmann am 02 November 2014, 12:25:33Das funktioniert, die Lampe bleibt auch so lange an bis man die 2. Taste (off) betätigt. Die Fernbedienung ist auf 4 Kanal- Betrieb eingestellt.
Einfach nurCode Auswählendefine Kugel_Wohn DOIF ([FS20_S8_B] eq "on") (set Wohnzimmer_Kugel on) DOELSE(set Wohnzimmer_Kugel off)
sollte eigentlich ausreichen. Und das könnte auch das Problem lösen.
Nachtrag: Wobei, wenn die Fernbedienung eben nicht dauerhaft "on" oder "off" ist, dann würde bei dieser Variante das Licht immer wieder ausgehen...
Zitat von: The-Holgi am 02 November 2014, 12:37:29
Das funktioniert, die Lampe bleibt auch so lange an bis man die 2. Taste (off) betätigt. Die Fernbedienung ist auf 4 Kanal- Betrieb eingestellt.
Also jeweils eine Taste für on und eine für off.
Danke euch für die schnelle Hilfe.
Gruß Holgi
define Kugel_Wohn DOIF ([FS20_S8_B] eq "on" or [FS20_S8_B] eq "dimup") (set Wohnzimmer_Kugel on) DOELSE(set Wohnzimmer_Kugel off)
define switch1on notify FS20_701002:on set ELRO_11111_E on
Zitat von: Puschel74 am 02 November 2014, 15:43:26Genau darum ging es mir, hatte es vorher auch mit 2 notify´s laufen.
Aber es geht eben auch mit DOIF - und damit noch eleganter als mit notify.
Und auserdem hast du vermutlich noch ein zweites zum abschalten ::)
Das braucht Holgi nicht da er alles in einem DOIF hat - was aber auch wieder in einem notify geht aber nichtmehr so elegant aussieht.
define DI_AnwesenheitJo DOIF ([08:00-22:00] and [Handy_JoS3] eq "present") (set WandTablet ttsSay Hallo Tschoooo.)
Zitat von: cotecmania am 02 November 2014, 20:44:44
Hallo,
Bin auch DOIF-Neuling und wollte eine Ansage mit WebViewControl realisieren, wenn ich nach Hause komme.
Das soll aber nur tagsüber passieren.Code Auswählendefine DI_AnwesenheitJo DOIF ([08:00-22:00] and [Handy_JoS3] eq "present") (set WandTablet ttsSay Hallo Tschoooo.)
Ging ein paar Tage gut, aber als ich mal nach 22:00 Uhr nach Hause kam hörte ich nichts, was ja ok war.
Nur leider wurde ich dann am nächtsen Morgen um 8:00 Uhr mit dem Spruch geweckt.
Hat die Reihenfolge auch was zu sagen ? Muss ich zuerst "present" abfragen und dann mit der Zeit "verunden"?
Oder was mache ich falsch ?
Gruss
define DI_AnwesenheitJo DOIF ($hms gt "08:00" and $hms lt "22:00" and [Handy_JoS3] eq "present") (set WandTablet ttsSay Hallo Tschoooo.)
Zitat von: DamianBei Zeitintervallen wird am Anfang und am Ende getriggert, bei dir also um 8:00 und 22:00 Uhr. Das ist in den meisten Fällen auch so erwünscht. Wenn du keine Zeit-Triggerung wünschst, dann musst du die $hms-Variable benutzen, hier also:
define DI_AnwesenheitJo DOIF (![08:00-22:00] and [Handy_JoS3] eq "present") (set WandTablet ttsSay Hallo Tschoooo.)
Zitat von: Brockmann am 03 November 2014, 08:36:51
Hallo Damian,
kann sogar sein, dass ich das schonmal vorgeschlagen habe:
Man könnte solche Szenarien (und die kommen gar nicht sooo selten vor, ich habe jedenfalls auch sowas) in DOIF recht elegant erschlagen, wenn es eine Möglichkeit gäbe, Bedingungen als non-trigger zu definieren. Nur mal als Idee:Code Auswählendefine DI_AnwesenheitJo DOIF (![08:00-22:00] and [Handy_JoS3] eq "present") (set WandTablet ttsSay Hallo Tschoooo.)
Das ! vor dem [ würde DOIF so interpretieren, dass diese Bedingung zwar geprüft wird, wenn dieser Zweig getriggert wird, aber dass eben keine eigenen Trigger für den Zeitintervall definiert werden.
Dann hätte man genau das gewünschte Verhalten, ohne die intuitive DOIF-Ebene verlassen zu müssen. Funktionell wäre es dasselbe, aber wesentlich benutzerfreundlicher, oder?
Zitat von: Damian am 03 November 2014, 09:39:53Ja, das Symbol dafür will gut überlegt sein. Das ! war auch nur eine spontane Idee.
-Readings ohne Trigger [NoTrigger:...] oder [#...] oder ['...] oder [^...]
Zitat von: Brockmann am 03 November 2014, 10:14:10
Ja, das Symbol dafür will gut überlegt sein. Das ! war auch nur eine spontane Idee.Bleibt sonst aber auch nicht viel übrig, was man auf deutschen wie englischen Tastaturen ohne weiteres tippen kann.
- [#...] wäre wohl auch suboptimal, weil es in der fhem.cfg Kommentare einleitet.
- ['...] könnte bei Editoren mit Syntaxhighlighting unangenehme Nebenwirkungen haben, oder?
- [^...] Dagegen spricht wohl nichts, wobei ich dieses Zeichen wegen der Eingabe immer etwas nervig finde (es erscheint ja erst beim nächste Zeichen mit).
Zitat von: Damian am 02 November 2014, 13:06:02Hm, einen Schönheitsfehler gibt es noch.Code Auswählendefine Kugel_Wohn DOIF ([FS20_S8_B] eq "on" or [FS20_S8_B] eq "dimup") (set Wohnzimmer_Kugel on) DOELSE(set Wohnzimmer_Kugel off)
Zitat von: The-Holgi am 04 November 2014, 06:26:37
Hm, einen Schönheitsfehler gibt es noch.
Ich lasse die Lampe bei Sonnenuntergang anschalten, wenn ich dann versuche über die Fernbedienung auszuschalten muß man zuerst den on Taster betätigen.
attr Kugel_Wohn do always
Zitat von: satprofi am 04 November 2014, 10:24:25
Hallo. Wieviel DOIF verträgt fhem? Ich habe ca 20 und fhem friert jetzt öfters ein. Heisst , pausiert ca. 10-15 min. Auch über webif nicht erreichbar.
Gesendet von meinem GT-I9300
Zitat von: satprofi am 04 November 2014, 12:52:26
Wobei mein sleep nur vormittags läuft.die freezer aber den ganzen tag
Gesendet von meinem GT-I9300
cam.alarm_on.off
([t5.ping.cam1] eq "present") ()
DOELSEIF ([Personen:state] eq "absent")
(set t5.cam1 cmd 6,set t5.cam1 cmd 15,{Log 1, "Kamera-Alarm: Ein (Abwesend)"})
DOELSEIF ([!isday()] and [t5.ku.sd2_Sw] eq "off" and [t5.wz.sd1_Sw] eq "off")
(set t5.cam1 cmd 6,set t5.cam1 cmd 15,{Log 1, "Kamera-Alarm: Ein (Nacht)"})
DOELSE
(set t5.cam1 cmd 9,set t5.cam1 cmd 14,{Log 1, "Kamera-Alarm: Aus"})
Zitat von: Simon74 am 04 November 2014, 14:22:39
Kann ich DOIF für meine Kamerasteuerung sinnvoll nutzen ?
Also Positionen anfahren und Motion-Detect On/Off, alles in einem DOIF anstatt notifys..
Wäre mein Code so richtig ?
Was er machen soll, Logik:
1. Wenn Kamera eingeschaltet
2. Wenn Personen abwesend: Set Kameraposition + Motion-Detect ON
3. Wenn TV und LED aus: Set Kameraposition + Motion-Detect ON (Nachtalarm)
4. Wenn 2+3 nicht zutrifft: Kameraposition + Motion-Detect OFFCode Auswählencam.alarm_on.off
([t5.ping.cam1] eq "present") ()
DOELSEIF ([Personen:state] eq "absent")
(set t5.cam1 cmd 6,set t5.cam1 cmd 15,{Log 1, "Kamera-Alarm: Ein (Abwesend)"})
DOELSEIF ([!isday()] and [t5.ku.sd2_Sw] eq "off" and [t5.wz.sd1_Sw] eq "off")
(set t5.cam1 cmd 6,set t5.cam1 cmd 15,{Log 1, "Kamera-Alarm: Ein (Nacht)"})
DOELSE
(set t5.cam1 cmd 9,set t5.cam1 cmd 14,{Log 1, "Kamera-Alarm: Aus"})
define di_kamera DOIF ([t5.ping.cam1] eq "present" and [Personen:state] eq "absent")
(set t5.cam1 cmd 6,set t5.cam1 cmd 15,{Log 1, "Kamera-Alarm: Ein (Abwesend)"})
DOELSEIF ..
Zitat von: Simon74 am 04 November 2014, 16:43:21
Achso sorry, die erste Codezeile sollte nur den Namen der Definition darstellen.
Commandref habe ich schon gelesen: Von links nach rechts und,
"Es wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist"
Also muss ich immer ALLE Bedinungen bei mehreren DOIFELSE schreiben, richtig ?
([bewemelder:brightness] < 35 and [!isday()] and [Personen:state] ne "absent" and ([pc:state] eq "on" or [receiver:state] eq "on"))
(set t5.wz.bs1.b on,{Log 1, "bm.fl_wz.led.brightness: LED Ein"})
DOELSE
(set t5.wz.bs1.b off,{Log 1, "bm.fl_wz.led.brightness: LED Aus"})
Zitat von: Simon74 am 04 November 2014, 22:30:05
Ich habe noch ein Beispiel das ich nicht gelöst bekomme.
Ich möchte wenn Helligkeit > 35 und Anwesend die Leds einschalten.
Ausschalten erst wieder wenn PC und Receiver ausgeschaltet werden.Code Auswählen([bewemelder:brightness] < 35 and [!isday()] and [Personen:state] ne "absent" and ([pc:state] eq "on" or [receiver:state] eq "on"))
(set t5.wz.bs1.b on,{Log 1, "bm.fl_wz.led.brightness: LED Ein"})
DOELSE
(set t5.wz.bs1.b off,{Log 1, "bm.fl_wz.led.brightness: LED Aus"})
Die Probleme dabei:
1. Wenn ich zwischendurch das Licht einschalte, schalten (Bewegungsmelderhelligkeit) die Leds wieder aus, möchte ich nicht
2. Wenn ich dazwischen abwesend war gehen die Leds nicht mehr an (Leds werden vom Abwesenheitstrigger mit ausgeschaltet)
3. Einschalten sollte es immer wenn Anwesend und Helligkeit> (ohne den Status der Geräte)
[!isday()]
kann nicht gut funktionieren.([bewemelder:brightness] > 35 and !isday() and [Personen:state] ne "absent" )
(set t5.wz.bs1.b on,{Log 1, "bm.fl_wz.led.brightness: LED Ein"})
DOELSEIF ([pc:state] eq "off" and [receiver:state] eq "off" or [Personen:state] eq "absent")
(set t5.wz.bs1.b off,{Log 1, "bm.fl_wz.led.brightness: LED Aus"})
Zitat von: hansgans am 05 November 2014, 19:08:42
ich hab da irgendwo nen fehler kann mir da wer helfen ?
define waschen DOIF ([sw_kueche_oben_01] eq "Long.1.*" and [sw_wasch_Sw] eq "off" ) (set sw_wasch_Sw on) DOELSEIF ([sw_kueche_oben_01] eq "Long.1.*" and [sw_wasch_Sw] eq "on" ) (set sw_wasch_Sw off)
sw_kueche_oben_01 ist ein HM-PB-2-WM55 und sw_wasch_Sw ne HM-ES-PMSw1-Pl und ich will auf long ne schaltung von der HM-ES-PMSw1-Pl
weil auf short schon was anderes drauf läuft
define waschen DOIF ([sw_kueche_oben_01] =~ "Long.1.")
( IF ([sw_wasch_Sw] eq "off")
(set sw_wasch_Sw on)
ELSE
(set sw_wasch_Sw off)
)
Zitat von: Puschel74 am 05 November 2014, 22:59:11
Nach 44 Seiten noch immer nicht alle Fälle abgedeckt - DOIF scheint ja wohl ziemlich mächtig zu sein (oder die wenigsten haben Lust die commandref oder den Beitrag zu lesen 8) ).
ZitatInternals:
DEF ([pl_soBad] eq "on") (attr pr_soBad disable 0,attr at_soBad disable 0)
DOELSEIF ([pl_soBad] eq "off") (attr pr_soBad disable 1,attr at_soBad disable 1)
DOELSEIF ([pr_soBad] eq "present") (attr at_soBad disable 1,set Events add Bad Player erkannt)
DOELSEIF ([pr_soBad] eq "disabled") (set Events add Presence Bad disable)
DOELSEIF ([pr_soBad] eq "absent") (set Events add scane nach Player Bad)
DOELSE (set Events add Else Fall do_soBad)
NAME do_soBad
Zitat von: der-Lolo am 06 November 2014, 14:14:21
Hallo Damian und sonstige mitleser...
Ich bin damit beschäftigt ein DOIF zu entwickeln, drehe mich aber ein bisschen im Kreis.
Es geht mir um meinen Sonos Play3 der im Bad steht, dieser wird über eine PhilipsHue Steckdose geschaltet ( pl_soBad )
Nun passiert etwa 1 von 4 mal das der player sich nicht richtig im Sonos Netz anmeldet.
Obwohl er über die Fritzbox und seine Mac Adresse die IP 192.168.178.53 zugewiesen bekommt meldet er sich bei den anderen Sonos Teilnehmern und dem Sonos Modul mit der IP 192.168.0.57
Auf Sonos Seite versuche ich schon sehr lange diesen Fehler zu verhindern - es gelingt mir aber nicht.
Ich habe nun also ein Presence Device ( pr_soBad ) auf die richtige IP gesetzt und wünsche mir das:
Wenn ich die Steckdose anschalte und der Player diese IP bezieht - das Presence Device und ein Timer disabled wird.
Wenn ich die Steckdose anschalte und der Player die falsche IP benutzt - ein Timer nach zwei Minuten die Steckdose für 10sek ausschaltet und ein neuer Versuch gestartet wird.
Das ganze Spiel soll solange stattfinden bis der player sich korrekt angemeldet hat.
Der Player brauch nach anschalten bis zu 2 Minuten um sich überhaupt anzumelden, deswegen würde ich den Timer starten wenn ich die Steckdose einschalte. Zur zeit sieht das so aus:
Problem ist das der Timer ( at_soBad ) sich nach auslösen löscht.
Ich vermute ein Watchdog würde mir helfen, weiss aber nicht so recht wie und wo ich ansetzen müsste.
Vielleicht kannst Du Damian - oder ein anderer mitleser mir helfen.
1000 Dank!
define di_sono DOIF ([pl_soBad] eq "on")
(
IF ([pr_soBad] eq "present")
(set Events add Bad Player erkannt)
ELSE
(set pl_soBad off, define at_pl_soBad at +00:00:10 set pl_soBad on)
)
attr di_sono wait 120
attr di_sono do always
DEF
([.*._hz_Clima:measured-temp] < 30) (set %DEVICE controlManu 16)
Zitat von: chris1284 am 06 November 2014, 21:09:27
Moin, kann das Modul grundsätzlich mit solch einem Code abreiten?Code AuswählenDEF
([.*._hz_Clima:measured-temp] < 30) (set %DEVICE controlManu 16)
leider triggert es bei mir so nicht.
Ich möchte ein doif für alle Thermostate mit ähnlichem Namen ([**]_hz_Clima) verwenden und entsprechend im "do" teil das device steuern.
Zitat von: Damian am 06 November 2014, 15:08:58
Könnte ohne zusätzliche Timer so funktionieren :Code Auswählendefine di_sono DOIF ([pl_soBad] eq "on")
(
IF ([pr_soBad] eq "present")
(set Events add Bad Player erkannt)
ELSE
(set pl_soBad off, define at_pl_soBad at +00:00:10 set pl_soBad on)
)
attr di_sono wait 120
attr di_sono do always
Gruß
Damian
ZitatInternals:
DEF ([pl_soBad] eq "on") (
IF ([pr_soBad] eq "present")
(set Events add Bad Player erkannt,attr pr_soBad disable 1)
ELSE
(set pl_soBad off,set Events add Versuche den Player neu zu starten.., define at_pl_soBad at +00:00:05 set pl_soBad on)
)
NAME do_soBad
Internals:
DEF ([pl_soBad] eq "on") (set Events add Sonos Lautsprecher im Bad angeschaltet...,attr pr_soBad disable 0)
DOELSEIF ([pl_soBad] eq "off") (set Events add Sonos Bad ausgeschaltet...,attr pr_soBad disable 1)
NAME do_pl_soBad
Zitat von: der-Lolo am 06 November 2014, 23:47:20
Danke Dir Damian, das funktioniert wie erwartet.
Ich habe nun noch ein zusätzliches DOIF hinzugefügt um dem Presence Device zum richtigen Zeitpunkt ein disable 0 oder 1 geben zu können.
Falls Du eine bessere Idee hast, geb bescheid.
DANKE!
define GartenBeleuchtung DOIF (\
([17:00-22:30|56] or\
[17:00-22:30] and [Feiertag:tomorrow] ne "none" or\
[17:00-21:00|01234] and [Feiertag:tomorrow] eq "none" or\
[17:00-02:00] and [Feiertag:state] eq "Silverster" \
) and [myTwilight:twilight_weather] <30) (set EnO_switch_FF94C082 on) DOELSE (set EnO_switch_FF94C082 off)
attr GartenBeleuchtung cmdState on|off
attr GartenBeleuchtung room Gartenlicht
attr GartenBeleuchtung wait 900:900
Zitat von: Spartacus am 07 November 2014, 08:33:29Ja. In der ersten Version von DOIF wurde nach dem Neustart immer geschaltet - der letzte Zustand war egal. Das hatte den Nachteil, dass immer etwas ausgeführt wurde, obwohl es vor Herunterfahren des System bereits geschaltet wurde. Z. B. bei "Waschmaschine fertig" - das kann man hier im Thread irgendwo nachlesen. Nun wird der letzte Zustand des Moduls ausgewertet. Wenn das System abstürzt, dann wurde nichts gespeichert und damit stimmt der tatsächliche Zustand mit dem zuletzt gesetzten nicht überein. Das ist mir auch als negativ schon aufgefallen. Ich werde in der nächsten Version ein Attribut einführen, mit dem man festlegen kann, ob das Modul nach dem Neustart neu initialisiert werden soll - so wie in der ersten Version.
Guten morgen,
Ich habe immer noch ein Problem mit der Logik von DOIF.
Folgendes ist implementiert:Code Auswählendefine GartenBeleuchtung DOIF (\
([17:00-22:30|56] or\
[17:00-22:30] and [Feiertag:tomorrow] ne "none" or\
[17:00-21:00|01234] and [Feiertag:tomorrow] eq "none" or\
[17:00-02:00] and [Feiertag:state] eq "Silverster" \
) and [myTwilight:twilight_weather] <30) (set EnO_switch_FF94C082 on) DOELSE (set EnO_switch_FF94C082 off)
attr GartenBeleuchtung cmdState on|off
attr GartenBeleuchtung room Gartenlicht
attr GartenBeleuchtung wait 900:900
Fhem stürzt von Zeit zu Zeit einfach ab, bzw. ist ais irgendwelchen Gründen so start ausgelastet, dass nur noch ein Kill -9 hilft um es zu beenden (das liegt m.E. an der Verwendung vom Sonos Modul, das muss irgendwann mal auf einen separaten rpi).
Normalerweise geht das Gartenlicht irgendwann zwischen 17:00 und twilight_weather an. Wenn ich nun merke, dass sich hier nichts tut, ist fhem mal wieder abgestürzt. Wenn ich fhem nun neu starte, sollte eigentlich das DOIF greifen und die Gartenbeleuchtung direkt einschalten wenn die Bedingungen (ist nach 17:00 und twilight weather) erfüllt sind. Das passiert aber nicht! Anders ist es, wenn ich ein normales define at *17:00 nehme. Dann wird nach dem Neustart direkt geschaltet, wenn die Zeit von 17:00 erreicht ist.
Ist das "normal" mit dem DOIF oder kann man das abfangen?
Gruß,
Christian.
([17:00-22:30|56] or\
[17:00-22:30] and [Feiertag:tomorrow] ne "none" or\
[17:00-21:00|01234] and [Feiertag:tomorrow] eq "none" or\
[17:00-02:00] and [Feiertag:state] eq "Silverster" \
)
Zitat von: igami am 07 November 2014, 09:01:47Ich sehe keine Fehler, auch keine fehlenden Klammern. Man sollte natürlich die Reihenfolge der Operatoren kennen.Code Auswählen
([17:00-22:30|56] or\
[17:00-22:30] and [Feiertag:tomorrow] ne "none" or\
[17:00-21:00|01234] and [Feiertag:tomorrow] eq "none" or\
[17:00-02:00] and [Feiertag:state] eq "Silverster" \
)
da fehlen ganz bestimmt ein paar klammern, sonst passiert das ganze nie, da auf Silvester Neujahr folgt und nach Silvester aber kein Feiertag sein darf.
Überleg doch noch mal wann du genau schalten möchtest 5 ist Freitag 6 ist Samstag 0 ist Sonntag.
Grüße
Igami
Zitat von: satprofi am 07 November 2014, 14:21:15
HAllo.
Ich klink mich kurz ein, wie fragt man mit DOIF mytwilight:ss ab?
Zitat von: Puschel74 am 07 November 2014, 19:09:39
Schon klar - mitdenken und eines der vielen vorhandenen Beispiele abwandeln ist wohl nicht.
Was machst du nur wenn das Forum mal 2 Wochen down ist oder Damian mal 2 Wochen auf Urlaub 8)
define GartenBeleuchtung DOIF (\
([17:00-22:30|56] or\
[17:00-22:30] and [Feiertag:tomorrow] ne "none" or\
[17:00-21:00|01234] and [Feiertag:tomorrow] eq "none" or\
[17:00-02:00] and [Feiertag:state] eq "Silverster" \
) and [myTwilight:twilight_weather] <30) (set EnO_switch_FF94C082 on) DOELSE (set EnO_switch_FF94C082 off)
attr GartenBeleuchtung cmdState on|off
attr GartenBeleuchtung room Gartenlicht
attr GartenBeleuchtung wait 900:900
NR 446
NTFY_ORDER 50-GartenBeleuchtung
STATE off
TYPE DOIF
Readings:
2014-11-07 22:30:00 cmd_event timer_2
2014-11-07 22:30:00 cmd_nr 2
2014-11-08 00:00:02 e_Feiertag_state none
2014-11-08 00:00:02 e_Feiertag_tomorrow none
2014-11-08 10:47:43 e_myTwilight_twilight_weather 100
2014-11-07 22:30:00 state off
2014-11-07 18:16:48 timer_1_c1 08.11.2014 17:00:00|56
2014-11-07 22:30:00 timer_2_c1 08.11.2014 22:30:00|56
2014-11-07 18:16:48 timer_3_c1 08.11.2014 17:00:00
2014-11-07 22:30:00 timer_4_c1 08.11.2014 22:30:00
2014-11-07 18:16:48 timer_5_c1 08.11.2014 17:00:00|01234
2014-11-07 21:00:00 timer_6_c1 08.11.2014 21:00:00|01234
2014-11-07 18:16:48 timer_7_c1 08.11.2014 17:00:00
2014-11-08 02:00:00 timer_8_c1 09.11.2014 02:00:00
2014-11-08 10:44:32 wait_timer no timer
Condition:
0 (DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"56") or DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"") and ReadingValDoIf('Feiertag','tomorrow','') ne "none" or DOIF_time($hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,"01234") and ReadingValDoIf('Feiertag','tomorrow','') eq "none" or DOIF_time($hash->{realtime}{6},$hash->{realtime}{7},$wday,$hms,"") and ReadingValDoIf('Feiertag','state','') eq "Silverster" ) and ReadingValDoIf('myTwilight','twilight_weather','') <30
Days:
0 56
1 56
4 01234
5 01234
Devices:
0 Feiertag myTwilight
all Feiertag myTwilight
Do:
0 set EnO_switch_FF94C082 on
1 set EnO_switch_FF94C082 off
Helper:
last_timer 8
sleeptimer -1
Internals:
Readings:
0 Feiertag:tomorrow Feiertag:state myTwilight:twilight_weather
all Feiertag:tomorrow Feiertag:state myTwilight:twilight_weather
Realtime:
0 17:00:00
1 22:30:00
2 17:00:00
3 22:30:00
4 17:00:00
5 21:00:00
6 17:00:00
7 02:00:00
State:
Time:
0 17:00:00
1 22:30:00
2 17:00:00
3 22:30:00
4 17:00:00
5 21:00:00
6 17:00:00
7 02:00:00
Timecond:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
Timer:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
Timerfunc:
Timers:
0 0 1 2 3 4 5 6 7
Attributes:
cmdState on|off
room Gartenlicht
wait 600:600
Zitat von: Spartacus am 08 November 2014, 11:06:14Nur als Hinweis:
Ich weiß, bei "twilight_weather" geht das mit der geplanten Zeit nicht da würde ich dann auf "ss_weather" wechseln, da es für twilight_weather ja keine Uhrzeit gibt. Wie kann ich erkennen, welcher der 8 Timer als nächstes relevant wird!
Zitat von: Brockmann am 09 November 2014, 10:12:48
DOIF stellt seine Timer immer zu einem bestimmten Zeitpunkt x mit den dann aktuellen Werten ein (wie und wann genau, weiß ich nicht mehr, steht hier irgendwo in diesem mittlerweile recht länglichen Thread).
define ntfy_redefine_GartenBeleuchtung notify myTwilight:twilight_weather {my $DEF=InternalVal('GartenBeleuchtung','DEF','DEF error');;fhem("modify GartenBeleuchtung $DEF")}
Zitat von: igami am 09 November 2014, 13:04:06
Hallo Christian,
versuch es mal mit etwas in der folgenden Art:Code Auswählen
define ntfy_redefine_GartenBeleuchtung notify myTwilight:twilight_weather {my $DEF=InternalVal('GartenBeleuchtung','DEF','DEF error');;fhem("modify GartenBeleuchtung $DEF")}
soetwas in der Art nutze ich bei uns in der Firma auch um Schaltzeiten komfortabel via DropDown zu ändern.
Dadurch wird das DOIF einfach neu initialisiert und auch die Werte neu ausgelesen.
Grüße
Igami
define flurlichtsteuerung DOIF (([OWX_26_0A9116000000:light:d]<10) and ([SCHb_Haustuer] eq "off") and [opentime()<time()]) (set Flur on-for-timer 320)
define storeLastOff notify Flur:off { $data{lastOffTime} = opentime() }
sub
opentime()
{
my $startzeit= time()+180;
return $startzeit;
}
Zitat von: det. am 09 November 2014, 19:09:08
Hallo Damian,
komme mit der Lichtsteuerung meines Hausflures beim Öffnen der Haustür nicht weiter (soll nach Ausschalten nicht sofort beim nächsten Türöffnen wieder angehen oder wenn man vor dem Verlassen bereits ausgeschaltet hat). Es gab da mal einen Wiki Artikel, habe das mit Deinem Modul umgesetzt, u.a. weil das genial nur numerische Werte aus meinem 1-wire Helligkeitsmodul rausfiltert. Läuft, nur die Sache mit der Zeitsteuerung geht offenbar nicht, weil die time() kein Device ist. Habe jetzt recht lange ohne Erfolg probiert und bin guter Hoffnung, dass Du mit einer Lösung helfen kannst.Code Auswählendefine flurlichtsteuerung DOIF (([OWX_26_0A9116000000:light:d]<10) and ([SCHb_Haustuer] eq "off") and [opentime()<time()]) (set Flur on-for-timer 320)
Code Auswählendefine storeLastOff notify Flur:off { $data{lastOffTime} = opentime() }
Code Auswählensub
opentime()
{
my $startzeit= time()+180;
return $startzeit;
}
Flur ist ein HM Schalter; Schb_Haustür eine alte 2 Kanal FS20 Sünde...
define flurlichtsteuerung DOIF ([Flur] eq "off")
({$data{lastOffTime}=time()+180})
DOELSEIF ([OWX_26_0A9116000000:light:d]<10 and [SCHb_Haustuer] eq "off" and $data{lastOffTime} < time())
(set Flur on-for-timer 320)
attr flurlichtsteuerung do always
Zitat von: kumue am 11 November 2014, 11:30:45
Hallo zusammen,
mein DOIF soll nur am Sonntag zu einer bestimment Zeit ausgeführt werden. Also habe ich ([18:30-23:00|0]) definiert.
Aber es wird auch an den anderen Wochentagen ausgeführt.
Vermute, es liegt am Pipe-Zeichen. Änderungen mache ich in der GUI über DEF.
Habe Pipe
- aus der commandreferenz kopiert
- normal über die Tastatur eingegeben
- über den ASCII Code U+007C (VERTICAL LINE)
Half alles nix.
Bei den Updates bin ich auf dem neusten Stand.
Vielleicht hat jemand einen Tipp....
Danke im voraus.
Gruß Kai
Zitat von: kumue am 11 November 2014, 14:04:36
Habe gerade ein Test-DOIF angelegt,,,
Mit ([18:00-20:00|0]) wurde geschaltet, mit ([18:02-20:00|06]) nicht...
Steht die 0, der Sonntag also allein da, gibts bei mir Probleme...
Zitat von: moonsorrox am 18 November 2014, 12:06:18
@Damian
ich habe da mal eine Frage zu deinem DOIF Modul. Ich habe vor eine Beleuchtungssteuerung für mein Aussenlicht zu erstellen, so nach dem Muster "Aus, Dämmerungsschaltung und Zufall".. wobei hier für mich interessant ist die sogenannte Zufallsschaltung z.B. bei nicht Anwesenheit.
Kann ich dieses mit dem DOIF Modul erstellen, dass wenn ich in einer Setlist auf Zufall schalte das die Beleuchtung z.B sich immer mal zu vollkommen unbestimmten Zeiten ein-/ausschaltet für eine gewisse Zeit mal 1 Std. oder auch 30min. usw. wobei auch die Ein und Ausschaltzeiten variieren sollten und diese auch nur ab und bis zu einer Zeit, also eben abends ab Dämmerung bis morgens Dämmerung.
Ich habe in der commandref schon so einiges gelesen über dein Modul, aber ob dieses was ich möchte so zu bewerkstelligen ist habe ich nicht raus finden können. Evtl. sagst du ja sofort ja das geht oder mit Einschränkung oder eben nicht.
Vielen Dank für deine Hilfestellung vorab
define di_schalten_mit_Zufall DOIF ([{einschaltfunktion()}-{ausschaltfunktion()}])(set ...)
Zitat von: moonsorrox am 18 November 2014, 16:51:31Schau Dir mal das Modul RandomTimer (http://fhem.de/commandref.html#RandomTimer) an. Das macht im Prinzip das, was Du suchst, denke ich.
Ich werde mal schauen was ich hier so finde, dachte aber es geht ohne die Programmierung in der 99_myUtils, denn das wird mir nicht gelingen.
Werde dann dazu einen Beitrag unter Beleuchtung anfangen zu schreiben denn da passt es besser hin...
Rollläden sollen an Arbeitstagen nach 6:25 Uhr hochfahren, wenn es hell wird, am Wochenende erst um 9:00 Uhr, herunter sollen sie wieder, wenn es dunkel wird:
define di_shutters DOIF ([sensor:brightness]>100 and [06:25-09:00|8] or [09:00|7]) (set shutters up) DOELSEIF ([sensor:brightness]<50) (set shutters down)
[14:00|128]
oder [14:00|12] and !$we
?define RolloHinten DOIF (([14:00|12] and (!$we)) or ([myT:twilight_weather]>30 and [06:25-09:00|345] or [08:30-09:00|7]) and [Rollo_Master:state] eq "on") (set RolloDOIF on) DOELSEIF ([myT:twilight_weather]<30 and [Rollo_Master:state] eq "on") (set RolloDOIF off)
Zitat8 steht für Arbeitstage und wird mit anderen Zahlen mit or verknüpft und nicht mit and, daher musst du aufCode Auswählen[14:00|128]
[14:00|12] and !$we
ausweichen.ZitatDie die übrigen Wochentage (Mi-Fr) kann man doch noch mit weiteren geschachtelten and/or-bedingungen mit separatem Timer in die eine DOIF-Bedingung einfügen ,oder ? Also "Mo+Di um 14:00 Uhr", "Mi-Fr Twilight_weather>30" und am Wochenende ($we) nicht vor 8:30?Je nach dem, wie du es definierst, kannst du das in weitere DOELSEIF-Fälle packen. Wenn es der gleiche Ausführungscode ist, kannst du es evtl. sogar in die gleiche Bedingung mit or verknüpft einbauen.
Zitat von: Bartimaus am 19 November 2014, 16:29:34
Hi Damian,
Danke für die schnelle Antwort. Ich hatte meinen Beitrag zwischenzeitlich editiert, und mal einen Testcode eingesetzt. Hoffe die Klammern sind richtig. Hans auch zum testen in meine FHEM.cfg gepackt. Bin mal gespannt :)
Lg
define RolloHinten DOIF (([14:00|12] and (!$we)) or ([myT:twilight_weather]>30 and [06:25-09:00|345] or [08:30-09:00|7]) and [Rollo_Master:state] eq "on") (set RolloDOIF on) DOELSEIF ([myT:twilight_weather]<30 and [Rollo_Master:state] eq "on") (set RolloDOIF off)
text x y { InternalVal('WegLampe1_Ein','STATE','') }
text x y { InternalVal('WegLampe1_Aus','STATE','') }
Zitat von: moonsorrox am 19 November 2014, 17:43:58
@Damian
ich habe bisher die Zeiten in einer RSS Übersicht dargestellt mit diesem CodeCode Auswählen
text x y { InternalVal('WegLampe1_Ein','STATE','') }
text x y { InternalVal('WegLampe1_Aus','STATE','') }
jetzt habe ich ja wie im anderen Beitrag schon geschrieben die Steuerung der Außenbeleuchtung (noch nicht komplett, brauche noch etwas Hilfe) mit deinem DOIF Modul gemacht, wie kann ich jetzt die Zeiten/Timer darstellen. Habe schon einige Definitionen probiert bisher kein Erfolg. Ich sehe die ganzen Zeiten ja in den Readings, aber ich möchte sie alle in einer Übersicht haben.
Getestet habe ich schon cmd_1, cmd_2, timer_1_c1,timer_2_c1 usw. mit Readingsval und auch "state" schon probiert aber ich bekomme keine Zeitanzeige hin.. :-\
Zitat von: Bartimaus am 19 November 2014, 18:06:10
@Damian,
vielen lieben Dank. Deine Hilfsbereitschaft ist wie immer vorbildlich. :-*
Jetzt kann ich aus 9 '*at' 2 DOIF machen. Und das nur für meine beiden Jalousien. Für Pool und Aussenlampe kann ich jetzt auch was abspecken :)
define RolloVorne DOIF (([myT:twilight_weather]>40 and [06:25|8] and fhem("get Schulferien today") eq "none") or ([09:15|7] or (fhem("get Schulferien today") ne "none")) and ([RolloVorne_Master:state] eq "on")) (set RolloVoDOIF on) DOELSEIF ((([myT:twilight_weather]<30 and fhem("get Schulferien tomorrow") ne "none") or ([22:30|56]) or ([21:15|0] and fhem("get Schulferien tomorrow") eq "none")) and ([Rollo_Master:state] eq "on")) (set RolloVoDOIF off)
state cmd_2 2014-11-20 13:11:10
timer_1_c1 21.11.2014 06:25:00|8 2014-11-20 13:12:00
timer_2_c121.11.2014 09:15:00|72014-11-20 13:12:00
timer_3_c220.11.2014 22:30:00|562014-11-20 13:12:00
timer_4_c220.11.2014 21:15:002014-11-20 13:12:00
fhem("get Schulferien today") eq "none"
[Schulferien:today] eq "none"
(([myT:twilight_weather]>40 and [06:25|8] and fhem("get Schulferien today") eq "none") or ([09:15|7] or (fhem("get Schulferien today") ne "none")) and ([RolloVorne_Master:state] eq "on")) (set RolloVoDOIF on) DOELSEIF ((([myT:twilight_weather]<10 and fhem("get Schulferien tomorrow") ne "none") and ([22:30|56]) or ([21:15|0] and fhem("get Schulferien tomorrow") eq "none")) and ([Rollo_Master:state] eq "on")) (set RolloVoDOIF off)
(([myT:twilight_weather]>40 and [06:25|8] and [Schulferien:today] eq "none") or ([09:15|7] or [Schulferien:today] ne "none")) and ([RolloVorne_Master:state] eq "on")) (set RolloVoDOIF on) DOELSEIF ((([myT:twilight_weather]<10 and [Schulferien:tomorrow] ne "none") and ([22:30|56]) or ([21:15|0] and [Schulferien:tomorrow] eq "none")) and ([Rollo_Master:state] eq "on")) (set RolloVoDOIF off)
RolloVorne DOIF: expected DOELSEIF or DOELSE: and ([RolloVorne_Master:state] eq "on")) (set RolloVoDOIF on) DOELSEIF ((([myT:twilight_weather]<10 and [Schulferien:tomorrow] ne "none") and ([22:30|56]) or ([21:15|0] and [Schulferien:tomorrow] eq "none")) and ([Rollo_Master:state] eq "on")) (set RolloVoDOIF off)
(
([myT:twilight_weather]>40 and [06:25|8] and [Schulferien:today] eq "none") or
([09:15|7] or [Schulferien:today] ne "none")
) and ([RolloVorne_Master:state] eq "on")
)
(set RolloVoDOIF on)
DOELSEIF
(
( ([myT:twilight_weather]<10 and [Schulferien:tomorrow] ne "none") and ([22:30|56]) or
([21:15|0] and [Schulferien:tomorrow] eq "none")
) and ([Rollo_Master:state] eq "on")
)
(set RolloVoDOIF off)
Zitat von: Damian am 20 November 2014, 19:04:19
Ich würde dir empfehlen bei komplexeren Definitionen mit Zeilenumbrüchen im DEF-Editor zu arbeiten:
Ich habe deinen fehlerhaften Ausdruck eingerückt:Code Auswählen(
([myT:twilight_weather]>40 and [06:25|8] and [Schulferien:today] eq "none") or
([09:15|7] or [Schulferien:today] ne "none")
) and ([RolloVorne_Master:state] eq "on")
->)<- Zuviel
(set RolloVoDOIF on)
DOELSEIF
(
( ([myT:twilight_weather]<10 and [Schulferien:tomorrow] ne "none") and ([22:30|56]) or
([21:15|0] and [Schulferien:tomorrow] eq "none")
) and ([Rollo_Master:state] eq "on")
)
(set RolloVoDOIF off)
Es sollte dir jetzt auffallen, dass eine Klammer zu viel ist.
Gruß
Damian
Define RolloVorne first
:-[ Zitat von: Bartimaus am 20 November 2014, 19:18:00Das ist falsch:
Ja, die markierte Klammer ist zuviel, habe ich auch in Notepad++ geprüft, aber wenn ich diese entferne (egal ob via DEF oder fhem.cfg) erhalte ich die nächste Fehlermeldung beim speichern:Code AuswählenDefine RolloVorne first
:-[
Ich suche weiter...
(
([myT:twilight_weather]>40 and [06:25|8] and [Schulferien:today] eq "none") or
([09:15|7] or [Schulferien:today] ne "none")
)<- hiermit hast du deine Bedingung bereits abgeschlossen and ([RolloVorne_Master:state] eq "on")
)
(set RolloVoDOIF on)
DOELSEIF
(
( ([myT:twilight_weather]<10 and [Schulferien:tomorrow] ne "none") and ([22:30|56]) or
([21:15|0] and [Schulferien:tomorrow] eq "none")
) and ([Rollo_Master:state] eq "on")
)
(set RolloVoDOIF off)
[Schulferien:today] eq "none"
2014.11.20 18:51:58 2: RolloVorne: reading does not exist: [Schulferien:today]
Zitat von: Bartimaus am 20 November 2014, 19:47:19ok. Dann probier einfach mal:
:-[ ::) :-*
beiCode Auswählen[Schulferien:today] eq "none"
erhalte ich im Log diese Meldung:Code Auswählen2014.11.20 18:51:58 2: RolloVorne: reading does not exist: [Schulferien:today]
Bug oder Feature ?
der alte "fhem{get....." Befehl liefert ein korrektes "none" zurück....
([myT:twilight_weather]>40 and ([06:25|8] or [09:15|7]) and [RolloVorne_Master:state] eq "on")
(set RolloVoDOIF on)
DOELSEIF
...
([FBDECT_17:power]<25) (set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_01 off, set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_02 off)
2014.11.20 20:16:19 1: PERL WARNING: Argument "16.30 W" isn't numeric in numeric lt (<) at (eval 5055) line 1.
2014.11.20 20:16:19 1: PERL WARNING: Argument "16.30 W" isn't numeric in numeric lt (<) at (eval 5057) line 1.
2014.11.20 20:16:19 1: PERL WARNING: Argument "16.30 W" isn't numeric in numeric lt (<).....
e_FBDECT_17_power 16.37 W 2014-11-20 20:28:19
([22:00-00:00|5]) (set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_01 on, set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_02 on)
([22:00-00:00|5]) (set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_01, set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_02 on)
Zitat von: Inputsammler am 20 November 2014, 20:40:14
Jetzt meine Frage gibt es da ein Lösung wie ich den Werk konvertiere oder so.
Zitat von: commandref
http://fhem.de/commandref_DE.html#DOIF (http://fhem.de/commandref_DE.html#DOIF)]
Mögliche Formatangaben für <format> sind:
'd' zum Filtern von positiven und negativen Dezimalzahlen.
[<device>:<reading>:d] entspricht [<device>:<reading>:[(-?\d+(\.\d+)?)]]
Zitat von: Inputsammler am 20 November 2014, 20:40:14hinter dem Komma steht noch ein set, das gehört da nicht hin, es sei denn du hast ein Device mit dem Namen set und möchtest beiden den Zustand 'CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_02 off' geben
jetzt meine Frage warum geht das nicht wenn ich es vereinfache wie in der WIKI und in der Referenz gezeigt wird nicht
nur mit einen on befehl und mit Komma getrennt.
Zitat von: Inputsammler am 20 November 2014, 20:40:14das Modul ist doch mittlerweile ofiziell eingecheckt und wird per update verteilt, ich denke nicht, dass das im ersten Beitrag noch aktuell ist, aber da kann nur Damian was zu sagen ;)
Und noch eine kleine Frage das Modul von dir auf der ersten Seite ist immer das aktuelle?
Denn im Modul steht immer noch die alte Version und das alte Datum?
Zitat von: Inputsammler am 20 November 2014, 20:40:14Code Auswählen2014.11.20 20:16:19 1: PERL WARNING: Argument "16.30 W" isn't numeric in numeric lt (<) at (eval 5055) line 1.
2014.11.20 20:16:19 1: PERL WARNING: Argument "16.30 W" isn't numeric in numeric lt (<) at (eval 5057) line 1.
2014.11.20 20:16:19 1: PERL WARNING: Argument "16.30 W" isn't numeric in numeric lt (<).....
Aber das ist mir nun auch zu erklären weil der AVM Steckdose als Reading das zurück liefertCode Auswählene_FBDECT_17_power 16.37 W 2014-11-20 20:28:19
([FBDECT_17:power:d]<25) (set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_01 off, set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_02 off)
Zitatjetzt meine Frage warum geht das nicht wenn ich es vereinfache wie in der WIKI und in der Referenz gezeigt wird nicht
nur mit einen on befehl und mit Komma getrennt.Code Auswählen([22:00-00:00|5]) (set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_01, set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_02 on)
([22:00-00:00|5]) ((set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_01, CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_02 on))
ZitatUnd noch eine kleine Frage das Modul von dir auf der ersten Seite ist immer das aktuelle?
Denn im Modul steht immer noch die alte Version und das alte Datum?
Zitat von: Bartimaus am 20 November 2014, 20:07:52ok, na dann:
Hi,
Schulferien.holiday ist NICHT mit $WE verheiratet, deswegen muss ich die separat abfragen.
Feiertag.holiday ist bei mir mit $WE verheiratet, da ich dort MEINE Urlaubstage eingetragen habe. D.h. morgen habe ich frei, meine Jungs aber nicht. Darum sollen deren Rollos mit Helligkeitssteuerung hochgehen, meine Rollos jedoch erst um 8:30....
(
[myT:twilight_weather]>40 and
([06:25|8] and [Schulferien:today] eq "none" or [09:15|7] or [Schulferien:today] ne "none") and
[RolloVorne_Master:state] eq "on"
)
(set RolloVoDOIF on)
DOIF
....
Zitat von: Damian am 03 November 2014, 09:39:53
Gut dass wir auf das Thema kommen. In meiner Todo-Liste habe ich bereits "kein Trigger" für Readings vor längerer Zeit aufgenommen. Meine erste Idee war auch das Ausrufungszeichen gewesen. Allerdings würde das bei Programmierern "das Gegenteil von" bedeuten und das ist es nicht.
Daher habe ich nach anderen Zeichen gesucht, das sind meine letzten Aufzeichnungen:
-Readings ohne Trigger [NoTrigger:...] oder [#...] oder ['...] oder [^...]
So etwas würde man dann auf Zeiten übertragen.
Gruß
Damian
Zitat von: igami am 21 November 2014, 13:18:13
Das könnte ich nun wirklich gut gebrauchen. Bist du schon weiter gekommen? Es würde sich vielleicht auch ein [?...] anbieten, oder ist das schon anderweitig verplant wie in readingsGroup für Attribute?
Ansonsten noch als Vorschlag [*...], aber mit [noTrigger:...] kommt man bestimmt auch klar.
Werde mir solange mit ReadingsVal behelfen.
Grüße
Igami
Zitat von: locodriver am 21 November 2014, 17:26:15
Ich hätte auch noch eine Anregung ;):
Das Attribut "do" in "doalways" ändern und wie bei "disable" mit 0 und 1 aus- bzw. einschalten. Ich denke, dann kann man bei Bedarf das Attribut ein- oder ausschalten und muss es nicht "deleten" wenn es mal nicht (mehr) gebraucht wird.
Die DOIF-Nutzer müssten natürlich das Attribut händisch ändern, aber das wäre ja nur einmalig.
Uwe
Zitat von: locodriver am 21 November 2014, 17:26:15Dann doch bitte lieber wie bei wait für jedes cmd separat
Das Attribut "do" in "doalways" ändern und wie bei "disable" mit 0 und 1 aus- bzw. einschalten. Ich denke, dann kann man bei Bedarf das Attribut ein- oder ausschalten und muss es nicht "deleten" wenn es mal nicht (mehr) gebraucht wird.
Die DOIF-Nutzer müssten natürlich das Attribut händisch ändern, aber das wäre ja nur einmalig.
Zitat von: locodriver am 21 November 2014, 18:28:07
@Damian: momentan habe zumindest ich keine Anwendung bei mir, aber wenn du schon weiter planst, dann lasse ich mich überraschen.
define di_motion DOIF ([motion])
(set light on)
(set light off)
attr di_motion wait 0:500
attr di_motion do always|resetwait
define di_motion DOIF ([motion])
(set light on)
wait 500 (set light off)
attr di_motion do always|resetwait
define di_push DOIF ([Device])
(set pushmeldung "kein Event")
attr di_push wait 600
attr di_push do always|resetwait
define di_fertig DOIF ([Watt]<2)
(set pushmeldung "Waschmaschine fertig)
attr di_fertig repeatsame 3
attr di_fertig evenpause 600
define di_fensterhoch DOIF ([Fenster])(set Rollladen hoch)
attr di_fensterhoch waitsame 2
attr di_fenseterhoch do always
.*:[Bb]attery.* { if ($EVENT !~ m/ok/) {fhem("set pushmessage message ".$NAME.": ".$EVENT." um ".TimeNow());Log 3, "$NAME : Batteriewarnung $EVENT"}}
([.*:battery.*] eq "low")({fhem("set pushmessage message ".$NAME.": ".$EVENT." um ".TimeNow())." <doif>"},{Log 3, "$NAME : Batteriewarnung $EVENT"})
Internals:
CFGFN
DEF ([.*:battery.*] eq "low")({fhem("set pushmessage message ".$NAME.": ".$EVENT." um ".TimeNow())." <doif>"},{Log 3, "$NAME : Batteriewarnung $EVENT"})
NAME BattChecker
NR 7219
NTFY_ORDER 50-BattChecker
STATE initialized
TYPE DOIF
Readings:
2014-11-22 17:28:26 state initialized
Condition:
0 ReadingValDoIf('.*','battery.*','') eq "low"
Devices:
0 .*
all .*
Do:
0 {fhem("set pushmessage message ".$NAME.": ".$EVENT." um ".TimeNow())." <doif>"},{Log 3, "$NAME : Batteriewarnung $EVENT"}
Helper:
last_timer 0
sleeptimer -1
Readings:
0 .*:battery.*
all .*:battery.*
State:
Timerfunc:
Attributes:
room System
Zitatkann ich mit DOIF auf Readings triggern, die bei verschiedenen Modulen den gleichen Namen haben?
if (a* > 50) ...
( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}-{sunset("CIVIL",9000,"19:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}- {sunset("CIVIL",9000,"19:00","22:20")}|06]))
(set WegLampe_Sw_01 on)
DOELSEIF ([Zeitsteuerung] eq "Dämmerung" and ([00:15|01234] or [01:15|56]))
(set WegLampe_Sw_02 off)
DOELSE
(set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)
Zitatvllt hast du ja trotz deiner knappen Zeit mal ein Moment und schaust mal auf meinen Code im DOIF Modul, ich habe nach einigen Versuchen es nicht hin bekommen.Ich sag jetzt mal nix dazu :P
Zitat von: Damian am 20 November 2014, 21:27:38Danke Danke das habe ich wirklich vollkommen überlesen .....
Im Reading ist W als Einheit daher filtern nach Zahlen einsetzen, siehe commandref von DOIF
alsoCode Auswählen([FBDECT_17:power:d]<25) (set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_01 off, set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_02 off)
ZitatDa habe ich ein kleines Problem damit, den das funktioniert leider nicht so.Code Auswählen([22:00-00:00|5]) ((set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_01, CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_02 on))
Warum das so ist steht ebenfalls in der Commandref von DOIF.
([13:49-15:00|7]) (set CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_01 on, set CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_02 on)
([13:56-15:00|7]) ((set CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_01, CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_02 on))
2014.11.23 13:56:00 2: PM_NAS_OFF_TEST: set CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_01, CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_02 on: Unknown argument CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_02, choose one of clear:readings,trigger,register,rssi,msgEvents,all getConfig getRegRaw inhibit:on,off off on on-for-timer on-till peerBulk peerIODev press regBulk regSet sign:on,off statusRequest toggle
ZitatJa mich hat es gewundert das es nicht mit deinen Namen (Damian) angezeigt wird bei dem FHEM Befehl "Version" deswegen ist es mir nicht aufgefallen
Das Modul ist eingecheckt (steht im ersten Post) und ist immer aktuell per FHEM-Update.
Zitat von: moonsorrox am 23 November 2014, 12:39:32
Hier mal der Code zum DOIF aus dem DEFCode Auswählen( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}-{sunset("CIVIL",9000,"19:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}- {sunset("CIVIL",9000,"19:00","22:20")}|06]))
(set WegLampe_Sw_01 on)
DOELSEIF ([Zeitsteuerung] eq "Dämmerung" and ([00:15|01234] or [01:15|56]))
(set WegLampe_Sw_02 off)
DOELSE
(set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)
Zitat von: Inputsammler am 23 November 2014, 14:04:35
Aber mit der Verkürzung nichtCode Auswählen([13:56-15:00|7]) ((set CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_01, CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_02 on))
([13:56-15:00|7]) ((set CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_01,CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_02 on))
Internals:
CFGFN ./FHEM/zwischenstecker.cfg
DEF (
(
[15:00-02:00|56] or
[15:00-02:00] and [nrw_feiertag:tomorrow] ne "none" or
[15:00-23:00|01234] and [nrw_feiertag:tomorrow] eq "none"
) and [twilight:twilight_weather] <50
)
(
set switch_fb_1 on,set switch_powerMeter_1 on
) DOELSE (
set switch_fb_1 off,set switch_powerMeter_1 off
)
NAME di_innenbeleuchtung
NR 128
NTFY_ORDER 50-di_innenbeleuchtung
STATE cmd_1
TYPE DOIF
Readings:
2014-11-23 16:56:25 cmd_event twilight
2014-11-23 16:56:25 cmd_nr 1
2014-11-23 00:00:02 e_nrw_feiertag_tomorrow none
2014-11-23 20:26:27 e_twilight_twilight_weather 0
2014-11-23 16:56:25 state cmd_1
2014-11-23 15:00:00 timer_1_c1 24.11.2014 15:00:00|56
2014-11-23 02:00:00 timer_2_c1 24.11.2014 02:00:00|56
2014-11-23 15:00:00 timer_3_c1 24.11.2014 15:00:00
2014-11-23 02:00:00 timer_4_c1 24.11.2014 02:00:00
2014-11-23 15:00:00 timer_5_c1 24.11.2014 15:00:00|01234
2014-11-22 23:10:21 timer_6_c1 23.11.2014 23:00:00|01234
2014-11-23 16:56:25 wait_timer no timer
Condition:
0 ( DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"56") or DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"") and ReadingValDoIf('nrw_feiertag','tomorrow','') ne "none" or DOIF_time($hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,"01234") and ReadingValDoIf('nrw_feiertag','tomorrow','') eq "none" ) and ReadingValDoIf('twilight','twilight_weather','') <50
Days:
0 56
1 56
4 01234
5 01234
Devices:
0 nrw_feiertag twilight
all nrw_feiertag twilight
Do:
0 set switch_fb_1 on,set switch_powerMeter_1 on
1 set switch_fb_1 off,set switch_powerMeter_1 off
Helper:
last_timer 6
sleepdevice twilight
sleeptimer -1
Internals:
Readings:
0 nrw_feiertag:tomorrow twilight:twilight_weather
all nrw_feiertag:tomorrow twilight:twilight_weather
Realtime:
0 15:00:00
1 02:00:00
2 15:00:00
3 02:00:00
4 15:00:00
5 23:00:00
State:
Time:
0 15:00:00
1 02:00:00
2 15:00:00
3 02:00:00
4 15:00:00
5 23:00:00
Timecond:
0 0
1 0
2 0
3 0
4 0
5 0
Timer:
0 0
1 0
2 0
3 0
4 0
5 0
Timerfunc:
Timers:
0 0 1 2 3 4 5
Attributes:
alias Automatik Zwischenstecker
group Automation
room Server
sortby 90
wait 900
Zitat von: Funk.Odyssey am 23 November 2014, 20:32:28
Hat jemand einen Tipp, warum die Lampen bei folgendem DOIF um 0:00 Uhr ausgehen?Code Auswählen
Internals:
CFGFN ./FHEM/zwischenstecker.cfg
DEF (
(
[15:00-02:00|56] or
[15:00-02:00] and [nrw_feiertag:tomorrow] ne "none" or
[15:00-23:00|01234] and [nrw_feiertag:tomorrow] eq "none"
) and [twilight:twilight_weather] <50
)
(
set switch_fb_1 on,set switch_powerMeter_1 on
) DOELSE (
set switch_fb_1 off,set switch_powerMeter_1 off
)
Merkwürdigerweise hatte ich es vor einiger Zeit auch schon, dass beide Lampen zu unterschiedlichen Zeiten geschaltet wurde. Dem bin ich aber nie nachgegangen. Wahrscheinlich auch nur ein Typo im Set-Aufruf.
Zitat von: Damian am 23 November 2014, 14:10:37
Als Empfehlung: Versuche den DOELSE-Fall durch einen DOELSEIF-Fall zu ersetzen.
Zitat von: moonsorrox am 24 November 2014, 00:01:06
also ich sollte das DOELSE im Code durch DOELSEIF ersetzen..! das hatte ich nämlich auch schon probiert
Dann bekomme ich diesen Fehler:
di_Aussenlampe DOIF: no state, reading or time in condition: set WegLampe_Sw_01 off,set WegLampe_Sw_02 on
Zitat von: Funk.Odyssey am 23 November 2014, 22:48:44
Oh. Cool. Danke für die Erklärung. Ich werde mir das die Tage mal näher anschauen.
Kann man eigentlich innerhalb eines DOIF mehrere Perl-Befehle ausführen? Ich hatte das mal ausprobiert und eine ganze Latte an ReadingsVal an Variabeln zugewiesen. Diese wollte ich im Condition-Part abfragen. Aber irgendwie ging das nicht. Nun habe ich alles in die MyUtil.pm ausgelagert.
Zitat von: moonsorrox am 24 November 2014, 00:01:06Du sollst das DOELSE durch ein DOELSEIF ersetzen, aber das DOELSEIF benötigt eine Bedingung, während beim DOELSE nur die Aktion steht.
also ich sollte das DOELSE im Code durch DOELSEIF ersetzen..! das hatte ich nämlich auch schon probiert
ZitatCode Auswählen( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}-{sunset("CIVIL",9000,"19:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}- {sunset("CIVIL",9000,"19:00","22:20")}|06]))
(set WegLampe_Sw_01 on)
DOELSEIF ([Zeitsteuerung] eq "Dämmerung" and ([00:15|01234] or [01:15|56]))
(set WegLampe_Sw_02 off)
DOELSE
(set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)
( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}|06]))
(set WegLampe_Sw_01 on)
DOELSEIF ( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",9000,"19:00","22:20")}|12345] or [{sunset("CIVIL",9000,"19:00","22:20")}|06]))
(set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)
DOELSEIF ([Zeitsteuerung] eq "Dämmerung" and ([00:15|01234] or [01:15|56]))
(set WegLampe_Sw_02 off)
Zitat von: satprofi am 24 November 2014, 12:48:49
Hallo.
Ich habe eine frage zum set befehl. Bei fs20 actoren wird mit set on-till der befehl zum actor gesendet der dann selbst abschaltet. Gestern entdeckte ich per zufall das DOIF ein at generiert der den actor zur gesetzten zeit abschaltet. Ust das eine doif eigenheit oder von fhem. Klappt das on-till nur mit Fs20 sender?
Gesendet von meinem GT-I9300
Zitat von: Brockmann am 24 November 2014, 08:27:05
Vorschlag: Komm doch mal von dem Intervall weg und verwende statt dessen Anfangs- und Endzeit direkt, etwa so (ungeprüft):
...
Sollte genau dasselbe bewirken, nur dass Du ohne DOELSE auskommst.
([{getJalTime("workdayOpenSoft")}|8] or [{getJalTime("weekendOpenSoft")}|7])
(
IF ([auto_jal_open_mit_tueren] eq "ja")
(set alle_jalousien_mit_tueren:FILTER=STATE!=on 10)
ELSE
(set alle_jalousien_ohne_tueren:FILTER=STATE!=on 10)
)
DOELSEIF
([{getJalTime("workdayOpen")}|8] or [{getJalTime("weekendOpen")}|7])
(
IF ([auto_jal_open_mit_tueren] eq "ja")
(set alle_jalousien_mit_tueren on)
ELSE
(set alle_jalousien_ohne_tueren on)
)
DOELSEIF
([{getJalTime("closeRealSoft")}])
(
IF ([auto_jal_close_mit_tueren] eq "ja")
(set alle_jalousien_mit_tueren:FILTER=STATE!=off 50)
ELSE
(set alle_jalousien_ohne_tueren:FILTER=STATE!=off 50)
)
DOELSEIF
([{getJalTime("closeReal")}])
(
IF ([auto_jal_close_mit_tueren] eq "ja")
(set alle_jalousien_mit_tueren off)
ELSE
(set alle_jalousien_ohne_tueren off)
)
Zitat von: Damian am 24 November 2014, 08:22:00
In der Bedingung von DOIF kannst du alles angeben, was du auch in einer Perl-if-Bedingung angeben kannst, denn es wird ja von Perl ausgewertet. Getriggert wird allerdings nur auf Angaben in eckigen Klammern.
(
{my $feiertag = ReadingsVal("nrw_feiertag","tomorrow","")}
(
[16:30-23:00|56] or
[16:30-23:00] and $feiertag ne "none" or
[16:30-22:00|01234] and $feiertag eq "none"
) and [twilight:twilight_weather] <25
)
(
set ku_aussenlampe on,set hwr_aussenlampe on
) DOELSE (
set ku_aussenlampe off,set hwr_aussenlampe off
)
Zitat von: Brockmann am 24 November 2014, 08:27:05Ok heute Abend/Nacht weiß ich mehr, ich werde mir dieses mal genau anschauen... mal schauen ob das so funktioniert
Sollte genau dasselbe bewirken, nur dass Du ohne DOELSE auskommst.
Zitat von: Funk.Odyssey am 24 November 2014, 14:08:47
Könntest du mir dann bitte einen Tipp geben, wie ich z.B. - innerhalb eines DOIF - oft verwendete ReadingsVal vorziehe und einer Variable zuweise? Beziehungsweise: Ob der folgende Ansatz in die richtig Richtung geht? Ich möchte den Code halt schlank und lesbar gestalten.
Ich habe es mal quick&dirty anhand des Beispiels mit der Aussenbeleuchtung ausprobiert.Code Auswählen
(
{my $feiertag = ReadingsVal("nrw_feiertag","tomorrow","")}
(
[16:30-23:00|56] or
[16:30-23:00] and $feiertag ne "none" or
[16:30-22:00|01234] and $feiertag eq "none"
) and [twilight:twilight_weather] <25
)
(
set ku_aussenlampe on,set hwr_aussenlampe on
) DOELSE (
set ku_aussenlampe off,set hwr_aussenlampe off
)
In diesem DOIF wurden die Timer sogar angelegt. Damit hatte ich nicht gerechnet, denn in vorherigen Versuchen bin ich gescheitert.
define di.test DOIF ([test] eq "on") (set lampe1,lampe2,lampe3 on)
Zitat von: netbus am 24 November 2014, 16:14:03
Steht leider nichts in der Commandref und Wiki.
Zitat von: Commandref
http://fhem.de/commandref_DE.html#DOIF (http://fhem.de/commandref_DE.html#DOIF)
Falls ein Komma nicht als Trennzeichen zwischen FHEM-Befehlen gelten soll, so muss der FHEM-Ausdruck zusätzlich in runde Klammern gesetzt werden:
define di_light DOIF ([08:00]) ((set lamp1,lamp2 on),set switch on)
Zitat von: netbus am 24 November 2014, 16:14:03
Hallo Damian,
wie kann ich mit DOIF mehrere Befehle mit dem selben state gleichzeitig schalten. Steht leider nichts in der Commandref und Wiki.Code Auswählendefine di.test DOIF ([test] eq "on") (set lampe1,lampe2,lampe3 on)
geht leider nicht
Zitat von: Brockmann am 24 November 2014, 08:27:05
Vorschlag: Komm doch mal von dem Intervall weg und verwende statt dessen Anfangs- und Endzeit direkt, etwa so (ungeprüft):Code Auswählen
( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}|06]))
(set WegLampe_Sw_01 on)
DOELSEIF ( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",9000,"19:00","22:20")}|12345] or [{sunset("CIVIL",9000,"19:00","22:20")}|06]))
(set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)
DOELSEIF ([Zeitsteuerung] eq "Dämmerung" and ([00:15|01234] or [01:15|56]))
(set WegLampe_Sw_02 off)
Sollte genau dasselbe bewirken, nur dass Du ohne DOELSE auskommst.
DOELSEIF ( [Zeitsteuerung] eq "Dämmerung" and [01:15|56] or ([00:20|01234]))
(set WegLampe_Sw_02 off)
Zitat von: ojb am 24 November 2014, 22:17:40
Hallo,
ich möchte gernen einen Watchdog bauen der auf das Ausbleiben eines Signals reagiert.
Mit dem Attribut wait kann man das ja schön realisieren.
Mir ist bei den Tests jetzt aber aufgefallen, dass der Timer erst aufgezogen wird wenn um ersten Mal das Signal gekommen ist. Ich möchte gerne aber auch einen "Störfall" abfangen bei dem das überwachte Signal eine bestimmte Zeit überhaupt nicht kommt.
Wie könnte man das realisieren?
Danke und lieben Gruß
Oli
Zitat von: moonsorrox am 25 November 2014, 00:26:58Ich kann mir keinen vernünftigen Grund vorstellen, warum das DOIF mit dieser Bedingung an einem Dienstag um 0:15 nicht schalten sollte. Es sei denn, Zeitsteuerung war nicht eq "Dämmerung".Code AuswählenDOELSEIF ([Zeitsteuerung] eq "Dämmerung" and ([00:15|01234] or [01:15|56]))
(set WegLampe_Sw_02 off)
ich habe also das mal so wie oben übernommen... leider hat er heute also um 00:15 nicht ausgeschaltet.
Zitat von: moonsorrox am 25 November 2014, 00:26:58Die Klammerung im ursprünglichen Code war korrekt. So ist es jetzt Quatsch, weil Du damit sagst "Wenn es Dämmerung und 1:15 an einem Freitag bzw. Samstag ist, ODER WENN es 0:20 an einem So,Mo,Di,Mi,Do ist. Damit wäre die Bedingung um 0:20 So-Do immer wahr, egal ob Zeitsteuerung eq "Dämmerung" oder nicht.
Hier mal meine Änderung nach dem letzten DOELSEIF
(Die Zeit ist jetzt erst mal egal wollte nur nochmals probieren)Code AuswählenDOELSEIF ( [Zeitsteuerung] eq "Dämmerung" and [01:15|56] or ([00:20|01234]))
(set WegLampe_Sw_02 off)
list <Name des DOIF>
kannst Du Dir eine detaillierte Aufstellung eines DOIFs anschauen. Mach das mal, nachdem das DOIF nicht das getan hat, was es sollte. Außerdem solltest Du mal im Logfile nachschauen, was um 0:15 passiert ist. Vielleicht findet sich dort eine Erklärung.
Zitat von: ojb am 25 November 2014, 09:10:18Ich weiß zwar nicht, wo das steht, aber es stimmt, ich habe mir Perl als Programmiersprache erst angeguckt als ich das THRESHOLD-Modul ausgehend vom PID-Modul programmiert habe. Na ja, wenn man "vorbelastet" ist, dann ist es nicht so schwer sich eine neue Programmiersprache anzueignen auch wenn ich beruflich nicht mehr programmiere.
Hi Damian,
ok, super. Danke.
Und Danke für DOIF. Das ist echt ein super Modul.
Hab ich das richtig gelesen, Du hast erst mit den Modulen mit Perl angefangen?
Liebe Grüße
Oli
Zitat von: Brockmann am 25 November 2014, 09:17:04Ich auch nicht, dabei war ich mir sicher das es jetzt alles gut ist :-\
Ich kann mir keinen vernünftigen Grund vorstellen, warum das DOIF mit dieser Bedingung an einem Dienstag um 0:15 nicht schalten sollte. Es sei denn, Zeitsteuerung war nicht eq "Dämmerung".
Zitat von: Brockmann am 25 November 2014, 09:17:04Ok das mache ich, werde den Code wieder so ins DEF schreiben wie von dir vorgeschlagen und mal zu einer etwas früheren Zeit schon mal probieren.
MitCode Auswählenlist <Name des DOIF>
kannst Du Dir eine detaillierte Aufstellung eines DOIFs anschauen. Mach das mal, nachdem das DOIF nicht das getan hat, was es sollte. Außerdem solltest Du mal im Logfile nachschauen, was um 0:15 passiert ist. Vielleicht findet sich dort eine Erklärung.
2014.11.25 00:15:00 3: Registering HTTPSRV gds_web_resse for URL /resse...
2014.11.25 00:15:00 3: GDS resse: tempDir=/tmp/
2014.11.25 00:15:00 3: GDS resse: created
2014.11.25 00:15:00 1: Including ./FHEM/Wetter.cfg
2014.11.25 00:15:00 1: Including ./FHEM/BeleuchtungEingang.cfg
2014.11.25 00:15:00 1: Including ./FHEM/Schlafzimmer.cfg
2014.11.25 00:15:00 1: Including ./FHEM/Wohnzimmer.cfg
2014.11.25 00:15:00 3: WEBhook: port 8087 opened
2014.11.25 00:15:00 3: WEBtablet: port 8085 opened
2014.11.25 00:15:00 3: WEBphone: port 8084 opened
2014.11.25 00:15:00 3: WEB: port 8083 opened
2014.11.25 00:15:00 3: telnetPort: port 7072 opened
2014.11.25 00:15:00 1: HMLAN_Parse: HMUSB new condition init
2014.11.25 00:15:00 3: HMUSB device opened
2014.11.25 00:15:00 3: Opening HMUSB device 127.0.0.1:1234
2014.11.25 00:15:00 1: HMLAN_Parse: HMUSB new condition disconnected
2014.11.25 00:15:00 1: Including fhem.cfg
2014.11.25 00:15:00 3: Unregistering HTTPSRV gds_web_resse for URL /resse...
2014.11.25 00:15:00 3: Unregistering GEOFANCY geofancy for URL /geo...
Zitat von: moonsorrox am 25 November 2014, 12:56:35
Ins Log habe ich natürlich schon geschaut, gleich gestern als es nicht schaltete... aber da steht um 00:15 nix von Bedeutung für das DOIF 8)
Zitat von: Brockmann am 25 November 2014, 14:54:47oh ja das sieht verdammt danach aus :-\ das wäre echt der absolute Zufall, ich sollte Lotto spielen ;)
Die Meldungen im Log sehen mir aber sehr nach FHEM-Neustart pünktlich um 0:15 Uhr aus.
fhem> list DWD_IK
Internals:
DEF gds40165 ttNMcGXu
LOCAL 1
NAME DWD_IK
NR 219
STATE active
TYPE GDS
CHANGETIME:
Helper:
Dblog:
_datasource:
Mydblog:
TIME 1416937500.03169
VALUE Quelle
A_areadesc:
Mydblog:
TIME 1416937500.03169
VALUE Ilm-Kreis
A_category:
Mydblog:
TIME 1416937500.03169
VALUE Met
A_event:
Mydblog:
TIME 1416937500.03169
VALUE FROST
A_eventcode_area_color:
Mydblog:
TIME 1416937500.03169
VALUE 255 255 0
A_eventcode_group:
Mydblog:
TIME 1416937500.03169
VALUE FROST
A_eventcode_ii:
Mydblog:
TIME 1416937500.03169
VALUE 22
A_eventcode_license:
Mydblog:
TIME 1416937500.03169
VALUE Geobasisdaten
A_eventcode_profile_version:
Mydblog:
TIME 1416937500.03169
VALUE 2.1
A_expires:
Mydblog:
TIME 1416937500.03169
VALUE 2014-11-26T09:00:00+00:00
A_expires_local:
Mydblog:
TIME 1416937500.03169
VALUE 26.11.2014 10:00:00
A_geocode_state:
Mydblog:
TIME 1416937500.03169
VALUE TH
A_geocode_warncellid:
Mydblog:
TIME 1416937500.03169
VALUE 116070000
A_headline:
Mydblog:
TIME 1416937500.03169
VALUE Amtliche WARNUNG vor FROST
A_msgtype:
Mydblog:
TIME 1416937500.03169
VALUE Alert
A_onset:
Mydblog:
TIME 1416937500.03169
VALUE 2014-11-25T23:00:00+00:00
A_onset_local:
Mydblog:
TIME 1416937500.03169
VALUE 26.11.2014 00:00:00
A_responsetype:
Mydblog:
TIME 1416937500.03169
VALUE None
A_sent:
Mydblog:
TIME 1416937500.03169
VALUE 2014-11-25T17:00:00+00:00
A_sent_local:
Mydblog:
TIME 1416937500.03169
VALUE 25.11.2014 18:00:00
A_status:
Mydblog:
TIME 1416937500.03169
VALUE Actual
A_valid:
Mydblog:
TIME 1416937500.03169
VALUE 1
Readings:
2014-11-25 18:45:00 _dataSource Quelle: Deutscher Wetterdienst
2014-11-25 18:45:00 _tzOffset 3600
2014-11-25 18:45:00 a_areaDesc Ilm-Kreis
2014-11-25 18:45:00 a_category Met
2014-11-25 18:45:00 a_event FROST
2014-11-25 18:45:00 a_eventCode_AREA_COLOR 255 255 0
2014-11-25 18:45:00 a_eventCode_AREA_COLOR_hex ffff00
2014-11-25 18:45:00 a_eventCode_GROUP FROST
2014-11-25 18:45:00 a_eventCode_II 22
2014-11-25 18:45:00 a_eventCode_LICENSE Geobasisdaten: Copyright Bundesamt für Kartographie und Geodäsie, Frankfurt am Main, 2013
2014-11-25 18:45:00 a_eventCode_PROFILE_VERSION 2.1
2014-11-25 18:45:00 a_expires 2014-11-26T09:00:00+00:00
2014-11-25 18:45:00 a_expires_local 26.11.2014 10:00:00
2014-11-25 18:45:00 a_geoCode_STATE TH
2014-11-25 18:45:00 a_geoCode_WARNCELLID 116070000
2014-11-25 18:45:00 a_headline Amtliche WARNUNG vor FROST
2014-11-25 18:45:00 a_msgType Alert
2014-11-25 18:45:00 a_onset 2014-11-25T23:00:00+00:00
2014-11-25 18:45:00 a_onset_local 26.11.2014 00:00:00
2014-11-25 18:45:00 a_responseType None
2014-11-25 18:45:00 a_sent 2014-11-25T17:00:00+00:00
2014-11-25 18:45:00 a_sent_local 25.11.2014 18:00:00
2014-11-25 18:45:00 a_status Actual
2014-11-25 18:45:00 a_valid 1
2014-11-25 18:45:00 state active
fhem> list DO_DWD_ALERT_IK
Internals:
DEF ([DWD_IK:a_geoCode_WARNCELLID] eq "116070000") (set Pushover msg 'DWD Alarm IK' '[DWD_IK:a_headline] Beginn [DWD_IK:a_onset_local] Ende [DWD_IK:a_expires_local]' '' 1 'siren')
NAME DO_DWD_ALERT_IK
NR 165
NTFY_ORDER 50-DO_DWD_ALERT_IK
STATE cmd_2
TYPE DOIF
CHANGETIME:
Helper:
Dblog:
Cmd_event:
Mydblog:
TIME 1416937334.95721
VALUE DWD_IK
Cmd_nr:
Mydblog:
TIME 1416937334.95721
VALUE 2
Error:
Mydblog:
TIME 1416936437.76991
VALUE reading does not exist
State:
Mydblog:
TIME 1416937334.95721
VALUE cmd_2
Readings:
2014-11-25 18:42:14 cmd_event DWD_IK
2014-11-25 18:42:14 cmd_nr 2
2014-11-25 18:45:00 e_DWD_IK_a_geoCode_WARNCELLID 116070000
2014-11-25 18:42:14 state cmd_2
Condition:
0 ReadingValDoIf('DWD_IK','a_geoCode_WARNCELLID','') eq "116070000"
Devices:
0 DWD_IK
all DWD_IK
Do:
0 set Pushover msg 'DWD Alarm IK' '[DWD_IK:a_headline] Beginn [DWD_IK:a_onset_local] Ende [DWD_IK:a_expires_local]' '' 1 'siren'
Helper:
last_timer 0
sleeptimer -1
Internals:
Readings:
0 DWD_IK:a_geoCode_WARNCELLID
all DWD_IK:a_geoCode_WARNCELLID
State:
Timerfunc:
Attributes:
group Services
icon cloud102
room Wetter
wait 90
Zitat von: kumue am 25 November 2014, 18:53:48
Leider meint DOIF, daß das Reading a_geoCode_WARNCELLID nicht existiert.
'A_geocode_warncellid' ne 'a_geoCode_WARNCELLID'
Zitat
Vollkommen zurecht, guckt dir das Reading noch mal genau an ;)
Code: [Auswählen]
'A_geocode_warncellid' ne 'a_geoCode_WARNCELLID'
Zitat von: kumue am 25 November 2014, 19:21:25Sorry, habe mich verguckt, das reading heißt ja auch a_geoCode_WARNCELLID.
Jetzt habe ich auch eine FM im logfile...
Readings:
2014-11-25 18:42:14 cmd_event DWD_IK
2014-11-25 18:42:14 cmd_nr 2
2014-11-25 18:45:00 e_DWD_IK_a_geoCode_WARNCELLID 116070000
2014-11-25 18:42:14 state cmd_2
Error:
Mydblog:
TIME 1416936437.76991
VALUE reading does not exist
fhem> list DO_DWD_ALERT_IK
Internals:
DEF ([DWD_IK:a_areaDesc] eq "Ilm-Kreis") (set Pushover msg 'DWD Alarm IK' '[DWD_IK:a_headline] Beginn [DWD_IK:a_onset_local] Ende [DWD_IK:a_expires_local]' '' 1 'siren')
NAME DO_DWD_ALERT_IK
NR 165
NTFY_ORDER 50-DO_DWD_ALERT_IK
STATE cmd_1
TYPE DOIF
CHANGETIME:
Helper:
Dblog:
Cmd_event:
Mydblog:
TIME 1416944148.09654
VALUE DWD_IK
Cmd_nr:
Mydblog:
TIME 1416944148.09654
VALUE 1
Error:
Mydblog:
TIME 1416944148.09654
VALUE set Pushover msg 'DWD Alarm IK' 'Amtliche WARNUNG vor FROST Beginn 26.11.2014 00:00:00 Ende 26.11.2014 10:00:00' '' 1 'siren'
State:
Mydblog:
TIME 1416944148.09654
VALUE cmd_1
Wait_timer:
Mydblog:
TIME 1416944148.11595
VALUE no timer
Readings:
2014-11-25 20:35:48 cmd_event DWD_IK
2014-11-25 20:35:48 cmd_nr 1
2014-11-25 20:34:17 e_DWD_IK_a_areaDesc Ilm-Kreis
2014-11-25 20:35:48 error set Pushover msg 'DWD Alarm IK' 'Amtliche WARNUNG vor FROST Beginn 26.11.2014 00:00:00 Ende 26.11.2014 10:00:00' '' 1 'siren': OK
2014-11-25 20:35:48 state cmd_1
2014-11-25 20:35:48 wait_timer no timer
Condition:
0 ReadingValDoIf('DWD_IK','a_areaDesc','') eq "Ilm-Kreis"
Devices:
0 DWD_IK
all DWD_IK
Do:
0 set Pushover msg 'DWD Alarm IK' '[DWD_IK:a_headline] Beginn [DWD_IK:a_onset_local] Ende [DWD_IK:a_expires_local]' '' 1 'siren'
Helper:
last_timer 0
sleepdevice DWD_IK
sleeptimer -1
Internals:
Readings:
0 DWD_IK:a_areaDesc
all DWD_IK:a_areaDesc
State:
Timerfunc:
Attributes:
do always
group Services
icon cloud102
room Wetter
wait 90
Zitat von: santalaus am 25 November 2014, 22:24:05
Hallo,
ich habe eine kleine Frage, da ich im Moment unsicher bin.
and {(time_str2num(ReadingsTimestamp( "CUL_HM_HM_LC_Dim1TPBU_FM_1A703C","timedOn",0 ))-time ) > 3600 } and
Es geht dabei um eine BadlüfterSteuerung. Der Lüfter läuft wenn der Actor on ist nach 60 sec mit reduzierter Drehzahl an und nach dem Ausschalten eine Zeit mit erhöhter Drehzahl.
Mit der Abfrage möchte ich nun ein erneutes Antriggern des Actors während der Lüfter noch läuft verhindern. Ich gehe über das Reading da der Actor nicht nur mit dem Doif den Lüfter triggert sondern ggf auch direkt via Schalter.
Da es ja Perl ist, tauchen die Werte nicht im doif auf.
Denke ich prinzipell richtig oder einfach zu kompliziert.
Vielen Dank fürs eindenken
Nico
Zitat von: kumue am 25 November 2014, 20:43:44
Warum nun im list <DOIF> ein error-Reading mit dem eigentlichen Befehl auftaucht.. keine Ahnung...
Zitat
Das liegt daran, dass set Pushover... einen Returnwert ungleich Null zurückgibt.
Das wird zwar unter Error festgehalten, hat aber sonst keine Bedeutung für das Verhalten des Moduls.
Zitat von: Damian am 26 November 2014, 10:20:28
Die geschweiften Klammern musst du weglassen. Sonst muss natürlich noch entweder eine Zeitangabe oder ein Reading bzw. ein Status irgendwo in eckigen Klammern mit einem Operator (and, or) verknüpft werden, damit dein Modul auch getriggert wird.
Zitat von: santalaus am 26 November 2014, 18:12:50
Hallo Damian,
irgendwie klapp es nicht :(
Die vollständigt Dev sieht so aus:
([07:30-22:00] and [CUL_HM_HM_LC_Dim1TPBU_FM_1A703C:state] eq "off" and [CUL_HM_HM_LC_Dim1TPBU_FM_1A703C:timedOn] eq "off" and ( (time_str2num(ReadingsTimestamp( "CUL_HM_HM_LC_Dim1TPBU_FM_1A703C","timedOn",0 ))-time ) > 1800 ) and [CUL_HM_HB_UW_Sen_THPL_I_D79284:dewpoint]<[CUL_HM_HB_UW_Sen_THPL_I_CC84F5:dewpoint] and ([CUL_HM_HB_UW_Sen_THPL_I_3E9262:humidity] - [CUL_HM_HB_UW_Sen_THPL_I_CC84F5:humidity]) > 2 ) (set CUL_HM_HM_LC_Dim1TPBU_FM_1A703C on-for-timer 65)
ohne den ReadingsTimestamp Teil funktioniert es halt so das bei jeder Wertänderung erneut getriggert wird. Dann schaltet der Lüfter aber leider auf langsamer also suboptimal.
Nun wird es überhaupt nicht getriggert. Der time Teil wird doch in sec angeben also 1800s= 30min warten. Wie kann ich mir da nochwas zwischenbauen zum prüfen?
Nico
Zitat von: Damian am 26 November 2014, 18:45:49
Dieser Teil:
(time_str2num(ReadingsTimestamp( "CUL_HM_HM_LC_Dim1TPBU_FM_1A703C","timedOn",0 ))-time ) > 1800
wird nie wahr. Warum? Überlege mal kurz selbst.
Zitat von: Reinerlein am 26 November 2014, 22:28:07
Hallo Damian,
erstmal Danke für das tolle Modul. Ich finde es sehr hilfreich und richtig übersichtlich...
Aber ich habe ein Problem, welches meiner Meinung nach ein Bug im Modul sein könnte:
Ich habe einen Homematic Bewegungsmelder. Dieser sendet bei Bewegung ein "motion" und in jedem Fall ca. alle 5 Minuten drei Statuswerte (brightness, cover, battery).
Nun habe ich (nach Idee aus der Commandref) einen DOIF-Trigger mit folgender Definition gebaut:
----------------snip---------------
define trigger DOIF ([aussen_Vorgarten_PIR] eq "motion") (set aussen_Vorgarten_PIR_Motion on, set aussen_Vorgarten_PIR_Motion off)
attr trigger do always
----------------snip---------------
Sinn davon ist es, den Dummy bei Auftreten des Motion-Ereignisses des PIR einmal an und gleich wieder auszuschalten (weil darauf dann andere Notifies und/oder DOIFs reagieren).
Ich meine, das hat schon mal gut funktioniert. Mittlerweile wird dieses DOIF aber leider immer getriggert, wenn am PIR *irgendwas* aktualisiert wird (in diesem Fall alle 5 Minuten). Ich habe auch schon mal auf das Reading "motion" geprüft - mit demselben Ergebnis...
Das kann man gut an den Timestamps ablesen.
Hat sich in den letzten beiden Tagen etwas am Modul verändert, womit dieses Verhalten erklärbar wird? Oder habe ich doch noch irgendwo einen Denkfehler?
Danke schon mal für deine Hilfe...
Nachtrag:
Ich habe natürlich noch ein paar andere DOIFs, die tatsächlich auch auf die brightness prüfen sollen. Kann es sein, dass die im Hintergrund irgendwie zusammenhängen. Gibt es da vielleicht eine Namensgleicheit bei der internen Auflistung der Events, oder Modul-statische Variablen o.ä.?
Ich habe jetzt noch nicht in den Code reingeschaut...
Grüße
Reinerlein
Internals:
DEF ([aussen_Vorgarten_PIR] eq "motion") (set aussen_Vorgarten_PIR_Motion on, set aussen_Vorgarten_PIR_Motion off)
NAME aussen_Vorgarten_PIR_Motion_Trigger
NR 1458
NTFY_ORDER 50-aussen_Vorgarten_PIR_Motion_Trigger
STATE Triggered
TYPE DOIF
Readings:
2014-11-27 12:22:33 cmd_event aussen_Vorgarten_PIR
2014-11-27 12:22:33 cmd_nr 1
2014-11-27 12:22:32 e_aussen_Vorgarten_PIR_STATE motion
2014-11-27 12:22:33 state Triggered
Condition:
0 InternalDoIf('aussen_Vorgarten_PIR','STATE','') eq "motion"
Devices:
0 aussen_Vorgarten_PIR
all aussen_Vorgarten_PIR
Do:
0 set aussen_Vorgarten_PIR_Motion on, set aussen_Vorgarten_PIR_Motion off
Helper:
last_timer 0
sleeptimer -1
Internals:
0 aussen_Vorgarten_PIR:STATE
all aussen_Vorgarten_PIR:STATE
Readings:
State:
Attributes:
cmdState Triggered
do always
group PIR
room _Sensoren
Internals:
DEF 342A4B
HMLAN_MSGCNT 180
HMLAN_RAWMSG E342A4B,0000,C8F72AA2,FF,FFA7,F78410342A4BAF410D0601D400
HMLAN_RSSI -89
HMLAN_TIME 2014-11-27 12:22:32
IODev HMLAN
LASTInputDev HMLAN
MSGCNT 180
NAME aussen_Vorgarten_PIR
NR 1442
STATE motion
TYPE CUL_HM
lastMsg No:F7 - t:10 s:342A4B d:AF410D 0601D400
protLastRcv 2014-11-27 12:22:32
protSnd 30 last_at:2014-11-27 11:37:57
protState CMDs_done
rssi_at_HMLAN avg:-82.27 min:-95 max:-76 lst:-89 cnt:180
Readings:
2014-11-26 21:55:06 Activity alive
2014-11-23 17:14:55 CommandAccepted yes
2014-11-20 20:32:40 D-firmware 1.6
2014-11-20 20:32:40 D-serialNr LEQ1278807
2014-11-23 17:14:55 PairedTo 0xAF410D
2014-11-23 17:13:53 R-brightFilter 4
2014-11-23 17:13:53 R-captInInterval on
2014-11-23 17:13:53 R-evtFltrNum 1
2014-11-19 17:58:59 R-evtFltrPeriod 1 s
2014-11-23 17:14:56 R-ledOnTime 0 s
2014-11-23 17:13:53 R-minInterval 30
2014-11-23 17:14:55 R-pairCentral 0xAF410D
2014-11-23 17:14:55 RegL_00: 02:01 0A:AF 0B:41 0C:0D 00:00
2014-11-23 17:14:56 RegL_01: 01:12 02:49 08:00 22:00 00:00
2014-11-27 12:22:32 battery ok
2014-11-27 12:22:32 brightness 212
2014-11-27 12:22:32 cover closed
2014-11-27 11:37:57 motion on (to vccu)
2014-11-27 11:37:57 motionCount 140_next:14s
2014-11-27 12:22:32 recentStateType info
2014-11-27 11:37:57 state motion
2014-11-25 15:04:37 trigDst_AF410D noConfig
2014-11-27 11:37:57 trigDst_vccu noConfig
Helper:
mId 005D
rxType 28
Io:
newChn +342A4B,00,01,1E
nextSend 1417087352.87598
prefIO
rxt 2
vccu
p:
342A4B
00
01
1E
Mrssi:
mNo F7
Io:
HMLAN -87
Prt:
bErr 0
sProc 0
sleeping 0
Rspwait:
Q:
qReqConf
qReqStat
Role:
chn 1
dev 1
Rssi:
At_hmlan:
avg -82.2777777777777
cnt 180
lst -89
max -76
min -95
Attributes:
IODev HMLAN
actCycle 000:10
actStatus alive
autoReadReg 4_reqStatus
expert 2_full
firmware 1.6
group PIR
model HM-Sen-MDIR-O
peerIDs 00000000,
room _Sensoren
serialNr LEQ1278807
showtime 1
subType motionDetector
Internals:
NAME aussen_Vorgarten_PIR_Motion
NR 1457
STATE 2014-11-27 12:22:32
TYPE dummy
Readings:
2014-11-27 12:22:32 state off
Attributes:
group PIR
room _Sensoren
setList on off
stateFormat { ReadingsTimestamp('aussen_Vorgarten_PIR_Motion', 'state', '-') }
webCmd on:off
Zitat von: Reinerlein am 27 November 2014, 12:29:17
Hi Damian,
das ist richtig. Nur ist der Timestamp der letzten Bewegung (und auch des entsprechenden state-Readings) älter als der Triggerzeitpunkt dieses DOIFs.
Dieses DOIF hätte gar nicht reagieren sollen, da der Zustand nicht neu gesetzt worden ist (sieht man ja auch im Event-Monitor).
Das DOIF reagiert aber.
Zitat von: Reinerlein am 27 November 2014, 14:17:31
Hallo Damian,
ok, ich dachte das Modul würde sich dabei genauso verhalten wie ein Notify, und nur die Events auswerten, die für das geforderte Reading auftreten...
Zitat von: Reinerlein am 27 November 2014, 17:13:20
Hi Damian,
es wird nicht mit aktualisiert, da bleibt immer "info" drin.
Es wird nur aktualisiert, wenn die "anderen" Informationen geliefert werden, also immer zusammen mit battery und co.
Grüße
Reinerlein
DOIF ((time - time_str2num(ReadingsTimestamp( "aussen_Vorgarten_PIR","motion",0 )) < 5 and [aussen_Vorgarten_PIR]) (....
Zitat von: Inputsammler am 20 November 2014, 20:40:14
Frage 1:
Ich habe mir die Funktion (def) angelegtCode Auswählen([FBDECT_17:power]<25) (set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_01 off, set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_02 off)
Dieser soll bewirken wenn die Leistung an der Steckdose unter 25 Watt fällt er die 2 Homatic ausschaltet.
perl error in condition: InternalDoIf('Zeitsteuerung','STATE','') eq "Zufall" and * (DOIF_time_once($hash->{timer}{0},$wday,"12345") or DOIF_time_once($hash->{timer}{1},$wday,"06")): syntax error at (eval 674927) line 1, near "* (DOIF_time_once"
( [Zeitsteuerung] eq "Zufall" and * ([{sunset("CIVIL",0,"17:00","22:20")}|12345] or [{sunset("CIVIL",-14900,"12:00","22:20")}|06]))
( set Ladestation 01:05:00 260 500/800 )
Zitat von: moonsorrox am 29 November 2014, 13:06:25Wesentlich ist bei solchen Fehlermeldungen (meist) das was hinter "near" steht, also konkret die Stelle bezeichnet, wo es geknallt hat. Hier das *-Zeichen. Kann es sein, dass Du mit DOIF und at durcheinander kommst? Bei at brauchst Du ein *, bei DOIF nicht...
Das ist der Fehler mit dem unten angehängten Code, sagt mir als unerfahrener Perluser leider nichtsCode Auswählen
perl error in condition: InternalDoIf('Zeitsteuerung','STATE','') eq "Zufall" and * (DOIF_time_once($hash->{timer}{0},$wday,"12345") or DOIF_time_once($hash->{timer}{1},$wday,"06")): syntax error at (eval 674927) line 1, near "* (DOIF_time_once"
Hier der Code aus dem DEF:Code Auswählen( [Zeitsteuerung] eq "Zufall" and * ([{sunset("CIVIL",0,"17:00","22:20")}|12345] or [{sunset("CIVIL",-14900,"12:00","22:20")}|06]))
( set Ladestation 01:05:00 260 500/800 )
Zitat von: Brockmann am 29 November 2014, 14:33:51genau diese "*" ohne hatte ich schon probiert, ging aber auch nicht..!
Wesentlich ist bei solchen Fehlermeldungen (meist) das was hinter "near" steht, also konkret die Stelle bezeichnet, wo es geknallt hat. Hier das *-Zeichen. Kann es sein, dass Du mit DOIF und at durcheinander kommst? Bei at brauchst Du ein *, bei DOIF nicht...
Wenn Du das weglässt, sollte der Fehler verschwinden. Dafür kommt vermutlich ein anderer, aber der hat mit DOIF dann nichts mehr zu tun. ;)
set Ladestation 01:05:00 260 500/800 : Unknown argument 01:05:00, choose one of clear:readings,trigger,register,rssi,msgEvents,all getConfig getRegRaw getSerial getVersion inhibit:on,off off on on-for-timer on-till pair peerBulk peerIODev press raw regBulk regSet reset sign:on,off statusRequest toggle unpair
Zitat von: moonsorrox am 29 November 2014, 14:56:55Woraus Du nicht schließen solltest, dass das "*" richtig wäre. Immerhin bekommst Du ohne * eine andere Fehlermeldung. Und das hatte ich Dir ja auch angekündigt.
genau diese "*" ohne hatte ich schon probiert, ging aber auch nicht..!
Zitat von: moonsorrox am 29 November 2014, 14:56:55Nein, sicher kannst Du das so nicht schreiben. Aber wo soll ich anfangen? Ich vermute, Du möchtest auf diese Weise RandomTimer ins Spiel bringen. Das kann so aber nicht funktionieren. Bitte lies Dir die Commandref zu RandomTimer in aller Ruhe durch und versuche das Konzept zu verstehen. Mit einem set auf einen Schalter wirst Du keinen RandomTimer hinbekommen. Der wird als eigenes Objekt definiert. Darin taucht der zu verwendende Schalter als Parameter auf.
EDITH:// hier ist er, ich denke ich kann das mit der Zeit hinten so nicht schreiben.. das da Ladestation steht ist nur zum probieren da ich diese hier neben dem PC habe und so sehen kann ob es funtioniert..!
Fehlermeldung:Code Auswählenset Ladestation 01:05:00 260 500/800 : Unknown argument 01:05:00, choose one of clear:readings,trigger,register,rssi,msgEvents,all getConfig getRegRaw getSerial getVersion inhibit:on,off off on on-for-timer on-till pair peerBulk peerIODev press raw regBulk regSet reset sign:on,off statusRequest toggle unpair
Zitat von: Damian am 07 September 2014, 18:32:21
Ich plane folgende Erweiterungen des Moduls:
[...]
2) Wiederholung alle X-Sekunden zulassen
Beispiel für Benachrichtigung:
define di_hohe_feuchtigkeit DOIF ([bad:humidity]>70) (set tablet ttsSay Bitte im Badezimmer lüften.)
attr di_hohe_feuchtigkeit wait 300
attr di_hohe_feuchtigkeit do 600
[...]
Zitat von: fhainz am 29 November 2014, 16:35:04
Gibt es dazu schon was neues?
Grüße
Zitat von: fhainz am 29 November 2014, 17:59:53
Ja kein stress. Ich habs derzeit über einen watchdog laufen. Wollte das ganze nur vereinfachen ;)
Grüße
Zitat von: Brockmann am 29 November 2014, 16:29:30jo hast du und ich hatte es ja auch schon probiert und wußte das ein Fehler kommt.. ;)
Und das hatte ich Dir ja auch angekündigt.
Zitat von: Brockmann am 29 November 2014, 16:29:30ich habe die commandref ständig offen vom DOIF und vom RT ;) :D
Bitte lies Dir die Commandref zu RandomTimer in aller Ruhe durch und versuche das Konzept zu verstehen.
Dunkelheit_off DOIF: the at function "ReadingsVal("myTwilight","sr_indoor","")" must return a timespec and not <empty string>.: {ReadingsVal("myTwilight","sr_indoor","")}\
define Dunkelheit_off DOIF ([{ReadingsVal("myTwilight","sr_indoor","")}]) (set Dunkelheit off)
Zitat von: satprofi am 30 November 2014, 18:59:17
Hallo.
Nach heutigem update und anschliesenden shutwdown/restart kam folgende meldungCode Auswählen
Dunkelheit_off DOIF: the at function "ReadingsVal("myTwilight","sr_indoor","")" must return a timespec and not <empty string>.: {ReadingsVal("myTwilight","sr_indoor","")}\Code Auswählen
define Dunkelheit_off DOIF ([{ReadingsVal("myTwilight","sr_indoor","")}]) (set Dunkelheit off)
was wurde jetzt bei doif geändert?
Zitat von: knochenmuehle am 01 Dezember 2014, 11:42:39
Fehlermeldung: di_TueraufPumpean: perl error in condition: (InternalDoIf('Zirkulationspumpe','STATE','') eq "off" and InternalDoIf('MK_Haustuer','STATE','') eq "open") (set Zirkulationspumpe on): syntax error at (eval 46) line 1, near ") ("
DEF: (([Zirkulationspumpe] eq "off" and [MK_Haustuer] eq "open") (set Zirkulationspumpe on))
ich seh den Wald vor lauter Bäumen nicht ...
([Zirkulationspumpe] eq "off" and [MK_Haustuer] eq "open") (set Zirkulationspumpe on)
(([Zirkulationspumpe] eq "off") and ([MK_Haustuer] eq "open")) (set Zirkulationspumpe on)
perl error in condition: InternalDoIf('Zeitsteuerung','STATE','') eq "Zufall" and RandomTimer * (DOIF_time_once($hash->{timer}{0},$wday,"0123456")) WegLampe_Sw_02 * {sunset_abs (3 * 3600) } 480 : syntax error at (eval 1326470) line 1, near ") WegLampe_Sw_02 "
( [Zeitsteuerung] eq "Zufall" and RandomTimer * ([{sunset_abs("CIVIL",-8100,"14:00","22:20")}|0123456]) WegLampe_Sw_02 * {sunset_abs (3 * 3600) } 480 )
Zitat von: moonsorrox am 01 Dezember 2014, 14:43:26
da ich immer noch am probieren bin und kein Ergebnis ohne Fehler hin bekomme, hier mal mein letzter Stand.
Als Fehler ist ein Syntax error vorhanden, vllt ist es ja nur noch eine Kleinigkeit, aber meine ganzen Versuche scheiterten bisher
Fehler:Code Auswählenperl error in condition: InternalDoIf('Zeitsteuerung','STATE','') eq "Zufall" and RandomTimer * (DOIF_time_once($hash->{timer}{0},$wday,"0123456")) WegLampe_Sw_02 * {sunset_abs (3 * 3600) } 480 : syntax error at (eval 1326470) line 1, near ") WegLampe_Sw_02 "
DEF:Code Auswählen( [Zeitsteuerung] eq "Zufall" and RandomTimer * ([{sunset_abs("CIVIL",-8100,"14:00","22:20")}|0123456]) WegLampe_Sw_02 * {sunset_abs (3 * 3600) } 480 )
Der hintere Teil des codes ist exakt aus der commandref vom RT genommen (device ersetzt durch meines) damit dachte ich habe ich ein Erfolg :-\
Ich wollte jetzt nicht noch einen Beitrag in RandomTimer eröffnen, deshalb hier nochmal, da der Fehler ja im DOIF erscheint.
Zitat von: maxritti am 01 Dezember 2014, 15:09:03ja klar das sagt ja wohl auch der Fehler, aber leider bin ich da nicht so bewandert und benötige Hilfe...
Auch das sieht für mich wieder nicht stimmig aus.
Laut CommandRef müsste die DEF des DOIFs in diesem Format enden.
(<Bedingung>) (<Befehle>) DOELSEIF (<Bedingung>) (<Befehle>) DOELSEIF ... DOELSE (<Befehle>)
WegLampe_Sw_02 * {sunset_abs (3 * 3600) } 480 )
( [Zeitsteuerung] eq "Zufall" and RandomTimer * ([{sunset_abs("CIVIL",-8100,"14:00","22:20")}|0123456])
Zitat von: Reinerlein am 28 November 2014, 16:18:53Tausend Dank! Klappt so.
dafür kannst du das Attribut "wait" am DOIF einstellen. Damit kannst du die Zeitverzögerung in Sekunden einstellen, die *vor* Ausführung des entsprechenden Kommandos gewartet wird.
Wenn innerhalb der Wartezeit die Bedingung für die Ausführung des Kommandos wieder ungültig wird, wird der Timer abgebrochen (und bei Gültigkeit wieder angestartet).
Zitat von: maxritti am 01 Dezember 2014, 16:43:12das habe ich mal gemacht, folgendes kommt dann:
Will heissen, gib mal folgenden Code in Dein Webinterface bei fhem ein und drücke Enter.Code AuswählenWegLampe_Sw_02 * {sunset_abs (3 * 3600) } 480 )
Zitat von: maxritti am 01 Dezember 2014, 16:43:12wenn ich aber jetzt eine Klammer wegnehme kommt der Fehler wie oben...
Denn mind. die letzte Klammer ) ist zuviel oder vorne fehlt eine.
Wobei ich von dem gesamten Code nicht weiss, was er machen soll, aber das ist eine andere Baustelle :)
Zitat von: maxritti am 01 Dezember 2014, 16:43:12Diese Bedingung läuft schon ohne den RandomTimer, dann steht an Stelle von "Zufall" eben "Dämmerung", so habe ich es genannt, der Code ist weiter oben in dem Beitrag.
Und damit wäre dann alles vor dem WegLampe_Sw_02 die Bedingung des DOIFs.
Also das hier:Code Auswählen( [Zeitsteuerung] eq "Zufall" and RandomTimer * ([{sunset_abs("CIVIL",-8100,"14:00","22:20")}|0123456])
Und da ist die öffnende Klammer am Anfang zuviel oder am Ende fehlt eine.
Auf jeden Fall stimmt die Anzahl der ( nicht mit der Anzahl der ) überein.
Zitat von: maxritti am 01 Dezember 2014, 16:43:12naja... :-\ das mit den Klammern erscheint mir schon logisch, aber funktioniert eben nicht, vllt geht das nicht mit dem RandomTimer..?
Eventuell wird es damit plausibler, wie das syntaktisch auszusehen hat?
Zitat von: moonsorrox am 02 Dezember 2014, 00:39:14
das habe ich mal gemacht, folgendes kommt dann:
Unknown command WegLampe_Sw_02, try help.
wenn ich aber jetzt eine Klammer wegnehme kommt der Fehler wie oben...
und mit Klammer "(" vorn Unknown command (WegLampe_Sw_02, try help
Zitat von: moonsorrox am 02 Dezember 2014, 00:39:14
naja... :-\ das mit den Klammern erscheint mir schon logisch, aber funktioniert eben nicht, vllt geht das nicht mit dem RandomTimer..?
Zitat von: Jens_B am 02 Dezember 2014, 07:25:45ja natürlich ist das klar, darum ging es mir ja auch gar nicht..! ;)
das fehlt doch komplett.
*{sunset_abs("CIVIL",1800,"17:00","22:20")} AussenLampe 01:05:00 900 700/100
Zitat von: maxritti am 02 Dezember 2014, 08:07:02das ist schon klar, aber ich wollte eben diese Zufallssteuerung/RT in das DOIF einbauen.. ;)
Randomtimer ist ein eigenständiges Modul. Damit muss halt ein neues Device definiert werden, welches dann eben einen solchen RandomTimer definiert, wo wann was passieren soll.
Zitat von: maxritti am 02 Dezember 2014, 08:07:02vollkommen richtig
Da sehe ich mal keinen direkten Zusammenhang zwischen DOIF und Randomtimer.
Zitat von: maxritti am 02 Dezember 2014, 08:07:02das hatte ich ja gestern geschrieben, was ich erreichen möchte.
Passt ja jetzt nicht wirklich hier hin, aber ich habe das so gelöst.
Mit einem Dummy sage ich meinem Fhem, ob ich in Urlaub bin oder nicht (Verreist = ja oder nein).
Dann habe ich einen Randomtimer, der im Attribut disableCond eine Funktion isVerreist() abfragt, welche 0 oder 1 zurückliefert eben den Status von meinem Urlaubsdummy.
Damit ist der Randomtimer ein oder aus. Und im Timer selber steht dann das Device welches zu der Zufallszeit geschaltet werden soll.
#### Zeitsteuerung Dummy ###
define Zeitsteuerung dummy
attr Zeitsteuerung alias Zeitsteuerung aktivieren
attr Zeitsteuerung devStateIcon Aus:general_aus@lightgreen Dämmerung:weather_sunrise@blue Zufall:general_an_fuer_zeit@Crimson
attr Zeitsteuerung eventMap Aus Dämmerung Zufall
attr Zeitsteuerung group Aussen Beleuchtung
attr Zeitsteuerung icon time_clock
attr Zeitsteuerung room Automation
attr Zeitsteuerung setList state:Aus,Dämmerung,Zufall
attr Zeitsteuerung sortby 01
attr Zeitsteuerung webCmd state
Zitat von: moonsorrox am 02 Dezember 2014, 15:00:53
Deshalb ja auch immer meine Frage geht das überhaupt den Code vom RT ins DOIF einzubauen..?
Zitat von: Brockmann am 29 November 2014, 16:29:30Und dem schließe ich mich jetzt auch an und denke für Deine Anforderung solltest Du ein separates Thema erstellen.
Woraus Du nicht schließen solltest, dass das "*" richtig wäre. Immerhin bekommst Du ohne * eine andere Fehlermeldung. Und das hatte ich Dir ja auch angekündigt.
Nein, sicher kannst Du das so nicht schreiben. Aber wo soll ich anfangen? Ich vermute, Du möchtest auf diese Weise RandomTimer ins Spiel bringen. Das kann so aber nicht funktionieren. Bitte lies Dir die Commandref zu RandomTimer in aller Ruhe durch und versuche das Konzept zu verstehen. Mit einem set auf einen Schalter wirst Du keinen RandomTimer hinbekommen. Der wird als eigenes Objekt definiert. Darin taucht der zu verwendende Schalter als Parameter auf.
Aber wie ich schon sagte, für den ohnehin schon arg langen DOIF-Thread ist das IMHO völlig off-topic.
Zitat von: maxritti am 02 Dezember 2014, 15:16:47OK Danke, schade trotzdem.
Aus meiner Sicht kann man die Frage klar mit NEIN beantworten.
Und dem schließe ich mich jetzt auch an und denke für Deine Anforderung solltest Du ein separates Thema erstellen.
define di_Rollo_WZ_mitte DOIF (([Bewegungsmelder1:brightness]>120 and [07:15-10:00|012456]) or [06:45|3]) (set Rollo_WZ_mitte:FILTER=level!=100 on) DOELSEIF ([Bewegungsmelder1:brightness]<90 and [17:00-22:00]|0123456) (set Rollo_WZ_mitte:FILTER=level!=0 off)
Zitat von: Otto am 03 Dezember 2014, 07:31:30Wenn es wirklich genau so definiert ist, liegt das an der allerletzten eckigen Klammer. Die muss hinter die Tage, nicht davor, so wie bei der anderen Bedingung auch.
Das Rollo fährt Mittwoch um 6:45 hoch und später um 6:49 wieder runter.
Warum fährt es vor 17:00 runter??
define DI_test DOIF ([Dummy] and {time_str2num("$year-$month-$mday $hms") - time_str2num(ReadingsTimestamp("DI_test","cmd_event",0)) > 10})
(trigger global bla)
attr DI_test do always
Zitat von: Brockmann am 03 Dezember 2014, 14:18:46
Da das nächste Feature-Update ja noch ein wenig hin ist, wollte ich mir eine dringend benötigte Funktionalität selbst zurechtbasteln, nämlich die Möglichkeit, ein DOIF höchstens alle X Sekunden auszuführen.
Meine Idee dazu: man ziehe von der aktuellen Zeit den Zeitpunkt des Reading cmd_event, ab, der ja beim letzten Ausführen des DOIF gesetzt wurde. Wenn dieser Wert > X, darf das DOIF ausgeführt werden. Das ganze wird als zusätzliche Bedingung ins DOIF gepackt:Code Auswählen
define DI_test DOIF ([Dummy] and {time_str2num("$year-$month-$mday $hms") - time_str2num(ReadingsTimestamp("DI_test","cmd_event",0)) > 10})
(trigger global bla)
attr DI_test do always
Theoretisch funktioniert der Teil in geschweiften Klammern, zumindest kann ich den so in der FHEM-Befehlszeile eingeben und bekomme die erwartete Antwort.
Aber als Bedingung in DOIF bewirkt es nicht das gewünschte, sondern die Bedingung ist anscheinend immer wahr, denn die Aktion wird jedes Mal ausgeführt. Aber ich bekomme auch bei jedem Aufruf eine Warnung im Log:
PERL WARNING: Odd number of elements in anonymous hash at (eval 17759) line 1.
Nun weiß ich nicht, ob ich was falsch mache, DOIF sich hier irgendwie verschluckt oder ob dieser Ansatz grundlegend nicht funktionieren kann.
define DI_test DOIF ([Dummy] and (time() - time_str2num(ReadingsTimestamp("DI_test","cmd_event",0))) > 10)
(trigger global bla)
attr DI_test do always
Zitat von: Spartacus am 03 Dezember 2014, 20:36:40
Hallo,
mit DOIF kann man Zeitintervalle angeben, an denen bestimmte Aktionen stattfinden sollen. Das bezieht sich m.W. aber nur auf Wochentage und Zeitintervalle mit Stunden, Minuten und Sekunden.
Geht das auch mit dem Datumswerten?
z.B.
vom 01.01.-10.01. von 16:00 bis 19:00
vom 11.01. bis 10.12. von 0:00 bis 24:00
vom 11.12. bis 31.12. von 16:00 bis 24:00
Danke und Gruß,
Christian
define di.01.rp.01.EG.ku.SD.Kochinsel DOIF ($mday>=1 and $mday<=4 and $month==11 and [21:48-22:00])\
(set rp.01.EG.ku.SD.Kochinsel on)\
DOELSE\
(set rp.01.EG.ku.SD.Kochinsel off)
Zitat von: Spartacus am 03 Dezember 2014, 21:57:46
Hallo Damian,
danke für den Hinweis. Aber irgendwie sehe ich den Wald vor Bäumen nicht, oder ich habe Dich falsch verstanden...
Auf jeden Fall ist die Funzel nicht angegangen, es wurde direkt das DOELSE ausgeführt...Code Auswählendefine di.01.rp.01.EG.ku.SD.Kochinsel DOIF ($mday>=1 and $mday<=4 and $month==11 and [21:48-22:00])\
(set rp.01.EG.ku.SD.Kochinsel on)\
DOELSE\
(set rp.01.EG.ku.SD.Kochinsel off)
bitte nicht über die kryptischen Namen wundern...die werden nach einem Schema zusammengebaut...
Christian
Internals:
CFGFN config/Kueche.cfg
DEF ($mday>=1 and $mday<=5 and $month==11 and [09:05-09:15]) (set rp.01.EG.ku.SD.Kochinsel on)
DOELSE (set rp.01.EG.ku.SD.Kochinsel off)
NAME di.01.rp.01.EG.ku.SD.Kochinsel
NR 454
NTFY_ORDER 50-di.01.rp.01.EG.ku.SD.Kochinsel
STATE initialized
TYPE DOIF
Readings:
2014-12-04 09:00:33 state initialized
2014-12-04 09:00:33 timer_1_c1 04.12.2014 09:05:00
2014-12-04 09:00:33 timer_2_c1 04.12.2014 09:15:00
Condition:
0 $mday>=1 and $mday<=5 and $month==11 and DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")
Days:
Devices:
Do:
0 set rp.01.EG.ku.SD.Kochinsel on
1 set rp.01.EG.ku.SD.Kochinsel off
Helper:
last_timer 2
sleeptimer -1
Realtime:
0 09:05:00
1 09:15:00
State:
Time:
0 09:05:00
1 09:15:00
Timecond:
0 0
1 0
Timer:
0 0
1 0
Timerfunc:
Timers:
0 0 1
Attributes:
alias autom. Weihnachtsbaumbeleuchtung
cmdState on|off
devStateIcon .*on:light_light_dim_100@lightgreen .*off:light_light_dim_00@red
group Scripte
icon scene_x-mas@lightgreen
room 01-Küche
Internals:
CFGFN config/Kueche.cfg
DEF ($mday>=1 and $mday<=5 and $month==11 and [09:05-09:15]) (set rp.01.EG.ku.SD.Kochinsel on)
DOELSE (set rp.01.EG.ku.SD.Kochinsel off)
NAME di.01.rp.01.EG.ku.SD.Kochinsel
NR 454
NTFY_ORDER 50-di.01.rp.01.EG.ku.SD.Kochinsel
STATE off
TYPE DOIF
Readings:
2014-12-04 09:05:00 cmd_event timer_1
2014-12-04 09:05:00 cmd_nr 2
2014-12-04 09:05:00 state off
2014-12-04 09:05:00 timer_1_c1 05.12.2014 09:05:00
2014-12-04 09:00:33 timer_2_c1 04.12.2014 09:15:00
Condition:
0 $mday>=1 and $mday<=5 and $month==11 and DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")
Days:
Devices:
Do:
0 set rp.01.EG.ku.SD.Kochinsel on
1 set rp.01.EG.ku.SD.Kochinsel off
Helper:
last_timer 2
sleeptimer -1
Internals:
Readings:
Realtime:
0 09:05:00
1 09:15:00
State:
Time:
0 09:05:00
1 09:15:00
Timecond:
0 0
1 0
Timer:
0 0
1 0
Timerfunc:
Timers:
0 0 1
Attributes:
alias autom. Weihnachtsbaumbeleuchtung
cmdState on|off
devStateIcon .*on:light_light_dim_100@lightgreen .*off:light_light_dim_00@red
group Scripte
icon scene_x-mas@lightgreen
room 01-Küche
Zitat von: Damian am 03 Dezember 2014, 15:27:53Danke für den Hinweis. So klappt es. Die engültige Lösung war das aber auch noch nicht, da ich einen Denkfehler drin hatte:
In der Bedingung von DOIF befindest du dich bereits auf der Perl-Ebene, da sind die geschweiften Klammern an dieser Stelle zu viel des Guten. Das kannst du aber auch einfacher haben und ohne Fehlermeldung ;) :
define DI_test DOIF ([Dummy] and (time() - time_str2num(ReadingsTimestamp("DI_test", "last_exec", "0000-00-00 00:00:00"))) >= 10)
(
trigger global bla,
setReading DI_test last_exec wasauchimmer
)
attr DI_test do always
(([07:00-08:30|12345] and [hl.01.Feiertag:today] eq "none" or
[16:30-22:30|12345] and [hl.01.Feiertag:today] eq "none" or
[08:30-23:00] and [hl.01.Feiertag:today] ne "none" or
[08:30-23:00|60]) and (($mday>=27 and $month==12) or ($mday<=12 and $month==1))) or
([16:00-23:00] and [hl.01.Feiertag:state] eq "Heiligabend") or
([08:30-02:00] and [hl.01.Feiertag:state] eq "Silverster") (set rp.01.EG.ku.SD.Kochinsel on)
DOELSE (set rp.01.EG.ku.SD.Kochinsel off)
Zitat von: Brockmann am 04 Dezember 2014, 17:53:19
Danke für den Hinweis. So klappt es. Die engültige Lösung war das aber auch noch nicht, da ich einen Denkfehler drin hatte:
Wenn ich in der Kondition den Zeitpunkt des letzten cmd_event abfrage und die Kondition dadurch scheitert, wird logischerweise trotzdem jedes Mal ein neues cmd_event gesetzt. Dadurch wird dieser Zeitpunkt immer nachgezogen und wenn das DOIF sehr häufig angetriggert wird, kann es dadurch im Extremfall niemals wahr werden.
Damit es robust läuft, habe ich nun ein eigenes Reading dafür verwendet, das jedes Mal gesetzt wird, wenn die Aktion ausgeführt wurde. In dessen Timestamp ist somit der Zeitpunkt der letzten Ausführung zuverlässig festgehalten und darauf kann man sich beziehen. Das Beispiel würde dann ungefähr so aussehen (Klammern ohne Gewähr):Code Auswählen
define DI_test DOIF ([Dummy] and (time() - time_str2num(ReadingsTimestamp("DI_test", "last_exec", "0000-00-00 00:00:00"))) >= 10)
(
trigger global bla,
setReading DI_test last_exec wasauchimmer
)
attr DI_test do always
Gibt jeweils beim ersten Durchlauf, wenn das last_exec-Reading noch nicht existiert, eine Warnung, wohl weil dieser kreative "000..."-Fallback-String keine saubere time-Definition ist.
PERL WARNING: Use of uninitialized value in subtraction (-) at (eval 38499) line 1.
Aber von solchen Kleinlichkeiten sollte man sich nicht aufhalten lassen... ;)
Wobei, wenn jemand einen Tipp hat, wie ich die Warnung vermeiden kann, optimiere ich das gerne noch.
Zitat von: Spartacus am 04 Dezember 2014, 18:05:49wo sind die Klammern der Bedingung?
Hallo,
bin immer noch am basteln und finde den Fehler nicht!
Schaltzeiten sollen sein:
im Zeitraum vom: 27.12. bis 12.01.
mo-fr 07:00 bis 08:30 und 16:30 bis 22:30
sa,so, feiertags, 08:30 bis 23:00
am:
24.12 16:00 bis 23:00
31.12 08:30 bis 01:00Code Auswählen(([07:00-08:30|12345] and [hl.01.Feiertag:today] eq "none" or
[16:30-22:30|12345] and [hl.01.Feiertag:today] eq "none" or
[08:30-23:00] and [hl.01.Feiertag:today] ne "none" or
[08:30-23:00|60]) and (($mday>=27 and $month==12) or ($mday<=12 and $month==1))) or
([16:00-23:00] and [hl.01.Feiertag:state] eq "Heiligabend") or
([08:30-02:00] and [hl.01.Feiertag:state] eq "Silverster") (set rp.01.EG.ku.SD.Kochinsel on)
DOELSE (set rp.01.EG.ku.SD.Kochinsel off)
Danke,
Spartacus
Zitat von: Spartacus am 04 Dezember 2014, 19:51:53
Damian,
ich habe das nicht gesehen! Sorry, aber ich habe hier mehr als ne Stunde gesucht! Ich brauch doch ne Brille! Meine Frau hat recht, auch wenn ich das ungern zugebe!
Jetzt muss nur noch die Reihenfolge der Bedingungen stimmen! Könnte das so klappen wie gewünscht? Gibt ja nicht so viele Möglichkeiten es zu testen....jedes Jahr genau eine, um genau zu sein! :)
Danke, Danke,
Christian.
... [08:30-23:00] and [hl.01.Feiertag:today] ne "none" and [Ferientag:state]=1...
Zitat von: Damian am 04 Dezember 2014, 18:18:37
Der Urknall der Computerzeit ist:
{time_str2num("1970-01-01 01:00:00")}
define DI_test DOIF ([Dummy] and (time() - time_str2num(ReadingsTimestamp("DI_test", "last_exec", "1970-01-01 01:00:00"))) >= <SEKUNDEN>)
(
<...beliebige Anweisungen>,
setReading DI_test last_exec wasauchimmer
)
attr DI_test do always
Zitat von: Spartacus am 04 Dezember 2014, 21:51:10
Hallo Damian,
Besten Dank.
Ich habe ein Dummy namens "Ferientag" dessen Wert über ein notify auf "0" oder "1" gesetzt wird.
Frage ich das im DOIF so ab?Code Auswählen... [08:30-23:00] and [hl.01.Feiertag:today] ne "none" and [Ferientag:state]=1...
Danke,
Christian.
[11:39-22:30|12345] and ([hl.01.Feiertag:state] eq "none" and [cal.01.Ferien.dum:state]==1)
Zitat von: Spartacus am 05 Dezember 2014, 11:35:32
Hallo,
Hm! Irgendwie bekomme ich die Meldung: "reading does not exist: [Ferientag:state]" Ich bin jetzt verwirrt! Da es state im Dummy Ferientag gibt!
Christian
NACHTRAG: Ich war einfach nur zu doof! Man sollte auch den Devicenamen nehmen, nicht den Aliasnamen, dann klappt´s auch mit dem DOIF!
und es muss natürlich auch so lauten:Code Auswählen[11:39-22:30|12345] and ([hl.01.Feiertag:state] eq "none" and [cal.01.Ferien.dum:state]==1)
[11:39-22:30|12345] and ([hl.01.Feiertag:state] eq "none" and [cal.01.Ferien.dum])
2014.12.05 13:50:28 1: Error: Ferientag has no TYPE
2014.12.05 13:51:00 2: di.01.rp.01.EG.ku.SD.Kochinsel: internal does not exist: [cal.01.Ferien.dum:STATE]
Zitat von: Spartacus am 05 Dezember 2014, 13:44:33
Hallo Damian,
cool, danke!
Wenn ich es richtig verstehe, bedeutet dies, das dieser Ausdruck ausreicht!Code Auswählen[11:39-22:30|12345] and ([hl.01.Feiertag:state] eq "none" and [cal.01.Ferien.dum])
Gruß,
Christian
NACHTRAG:
so scheint es doch nichtzu gehen: Im Log taucht dieser Fehler auf:Code Auswählen2014.12.05 13:50:28 1: Error: Ferientag has no TYPE
2014.12.05 13:51:00 2: di.01.rp.01.EG.ku.SD.Kochinsel: internal does not exist: [cal.01.Ferien.dum:STATE]
define taste_8_kurz DOIF ([fb8_Btn_08:Short.*]) (set Rollogwc runter) (set Rollofl runter) (set Rollokre runter) (set Rollokli runter)
attr taste_8_kurz do always
attr taste_8_kurz wait 5:5:5:5
define taste_8_kurz DOIF ([fb8_Btn_08:Short.*]) (set Rollogwc runter,define next at +00:00:05 set Rollofl runter,define next2 at +00:00:05 set Rollokre runter,define next3 at +00:00:05 set Rollokli runter)
Zitat von: GiJoe73 am 05 Dezember 2014, 19:52:38
Die ganzen Set kannst du so schreiben: (set rollo1 runter , set rollo2 runter , set rollo3 .....)
Dann sollte es klappen
define taste_8_kurz DOIF ([fb8_Btn_08]) (set Rollogwc runter , define next at +00:00:05 set Rollofl runter , define next2 at +00:00:10 set Rollokre runter , define next3 at +00:00:15 set Rollokli runter)
Zitat von: Damian am 05 Dezember 2014, 18:13:05Moin Damian,
Das bedeutet einfach, dass zu diesem Zeitpunkt kein Zustand von cal.01.Ferien.dum gesetzt war.
Gruß
Damian
nternals:
CFGFN config/Dienste.cfg
CHANGED
NAME cal.01.Ferien.dum
NR 72
STATE 0
TYPE dummy
Readings:
2014-12-05 15:40:42 state 0
Attributes:
alias Ferientag
event-on-change-reading .*
room 98-Dummy
Zitat von: Spartacus am 06 Dezember 2014, 09:25:48
Moin Damian,
Verstehe ich nicht! STATE steht auf 0 und ist damit gesetzt, oder?ICode Auswählennternals:
CFGFN config/Dienste.cfg
CHANGED
NAME cal.01.Ferien.dum
NR 72
STATE 0
TYPE dummy
Readings:
2014-12-05 15:40:42 state 0
Attributes:
alias Ferientag
event-on-change-reading .*
room 98-Dummy
Wo mache ich den Gedankenfehler ?
Christian
Zitat von: Damian am 06 Dezember 2014, 09:43:04
Das liegt wohl an der Null. Ich werde es in der nächsten Version korrigieren, solange kannst du etwas anderes stattdessen nehmen z. B. off.
define doif_zeitschaltuhr_licht_livingcolors DOIF ([{sunset("REAL")}-21:00]) (set licht_livingcolors on,set licht_livingcolors on) DOELSE ( {fhem("set licht_livingcolors off;set licht_livingcolors off") if ((Value("licht_livingcolors") ne "off") && (Value("harmony_wz") eq "PowerOff"))})
Zitat von: MarkusN am 07 Dezember 2014, 18:24:36
Moin. Versuche momentan verschiedene at und notify auf doif umzustellen. Mehrmals habe ich beim Versuch ein doif zu definieren FHEM abgeschossen, zuletzt mit diesem Konstrukt:Code Auswählendefine doif_zeitschaltuhr_licht_livingcolors DOIF ([{sunset("REAL")}-21:00]) (set licht_livingcolors on,set licht_livingcolors on) DOELSE ( {fhem("set licht_livingcolors off;set licht_livingcolors off") if ((Value("licht_livingcolors") ne "off") && (Value("harmony_wz") eq "PowerOff"))})
Hat sich da irgendwo ein Syntax Fehler eingeschlichen, oder mache ich was anderes falsch?
Grüße,
Markus
Zitat von: MarkusN am 07 Dezember 2014, 18:24:36Warum das FHEM abschiesst, weiß ich auch nicht. Diese Konstruktion mit dem nachgeschalteten if ist etwas ungewöhnlich, aber formal vermutlich korrekt? Habe ich so aber noch nie gemacht. Und im fhem("...") hätte ich es mal mit zwei ;; probiert.
Moin. Versuche momentan verschiedene at und notify auf doif umzustellen. Mehrmals habe ich beim Versuch ein doif zu definieren FHEM abgeschossen, zuletzt mit diesem Konstrukt:Code Auswählendefine doif_zeitschaltuhr_licht_livingcolors DOIF ([{sunset("REAL")}-21:00]) (set licht_livingcolors on,set licht_livingcolors on) DOELSE ( {fhem("set licht_livingcolors off;set licht_livingcolors off") if ((Value("licht_livingcolors") ne "off") && (Value("harmony_wz") eq "PowerOff"))})
Hat sich da irgendwo ein Syntax Fehler eingeschlichen, oder mache ich was anderes falsch?
DOELSE (IF ([licht_livingcolors] ne "off" and [harmony_wz] eq "PowerOff")(set licht_livingcolors off,set licht_livingcolors off))
Zitat von: Damian am 07 Dezember 2014, 18:48:00
Unabhängig davon weiß ich nicht, ob du das willst, was du da definiert hast, insb.: Wenn eine Lampe brennt, soll nach 21:00 Uhr nichts ausgeschaltet werden???
Zitat von: Brockmann am 07 Dezember 2014, 18:56:42
Aber ich würde den DOELSE-Teil so lösen:Code AuswählenDOELSE (IF ([licht_livingcolors] ne "off" and [harmony_wz] eq "PowerOff")(set licht_livingcolors off,set licht_livingcolors off))
Sollte dasselbe bewirken.
Hat das eine Grund, dass Du immer zwei sets auf dasselbe Gerät machst? Oder ist das nur Beispielcode?
Internals:
CFGFN
DEF (([duRolloMaster:state] eq "an") and (([EG_dr_TS_Terrasse:luminosity] < 0.3) or [22:10])) (set du_EG_wz_RO_TerrasseRechts off) DOELSEIF (([duPVRollo:state] eq "an") and ([mySL:Pac_avg] >= 2100)) (set du_EG_wz_RO_TerrasseRechts 0) DOELSEIF ( ([duPVRollo:state] eq "an") and ([mySL:Pac_avg] >= 1501) ) (set du_EG_wz_RO_TerrasseRechts 30) DOELSE (set du_EG_wz_RO_TerrasseRechts on)
NAME di_EG_wz_RO_TerrasseRechts_ru
NR 5432
NTFY_ORDER 50-di_du_EG_wz_RO_TerrasseRechts
STATE cmd_4
TYPE DOIF
Readings:
2014-12-07 20:32:27 cmd_event duRolloMaster
2014-12-07 20:32:27 cmd_nr 4
2014-12-07 20:32:16 e_EG_dr_TS_Terrasse_luminosity 0.15
2014-12-07 20:32:28 e_duRolloMaster_state an
2014-12-07 20:32:30 e_mySL_Pac_avg 0
2014-12-07 20:32:27 state cmd_4
2014-12-07 20:32:07 timer_1_c1 07.12.2014 22:10:00
2014-12-07 20:32:30 wait_timer no timer
Condition:
0 (ReadingValDoIf('duRolloMaster','state','') eq "an") and ((ReadingValDoIf('EG_dr_TS_Terrasse','luminosity','') < 0.3) or DOIF_time_once($hash->{timer}{0},$wday,""))
1 (ReadingValDoIf('duPVRollo','state','') eq "an") and (ReadingValDoIf('mySL','Pac_avg','') >= 2100)
2 (ReadingValDoIf('duPVRollo','state','') eq "an") and (ReadingValDoIf('mySL','Pac_avg','') >= 1501)
Days:
Devices:
0 duRolloMaster EG_dr_TS_Terrasse
1 duPVRollo mySL
2 duPVRollo mySL
all duRolloMaster EG_dr_TS_Terrasse duPVRollo mySL
Do:
0 set du_EG_wz_RO_TerrasseRechts off
1 set du_EG_wz_RO_TerrasseRechts 0
2 set du_EG_wz_RO_TerrasseRechts 30
3 set du_EG_wz_RO_TerrasseRechts on
Helper:
last_timer 1
sleepdevice duRolloMaster
sleeptimer -1
Internals:
Readings:
0 duRolloMaster:state EG_dr_TS_Terrasse:luminosity
1 duPVRollo:state mySL:Pac_avg
2 duPVRollo:state mySL:Pac_avg
all duRolloMaster:state EG_dr_TS_Terrasse:luminosity duPVRollo:state mySL:Pac_avg
Realtime:
0 22:10:00
State:
Time:
0 22:10:00
Timecond:
0 0
Timer:
0 0
Timerfunc:
Timers:
0 0
Attributes:
room LichtRollo
wait 10:10:10
Zitat von: maxritti am 07 Dezember 2014, 20:58:18
Selbstgespräch nächster Teil:
Ohne den DOELSE Teil, ohne wait und mit do "always" scheint es zu klappen.
Jetzt müsste ich nur noch verstehen warum bzw warum es mit dem DOELSE nicht so klappt wie gedacht.
Zitat von: maxritti am 07 Dezember 2014, 20:58:18Damian war mal wieder schneller, aber nur weil ich es etwas ausführlicher geschrieben habe: ;)
Selbstgespräch nächster Teil:
Ohne den DOELSE Teil, ohne wait und mit do "always" scheint es zu klappen.
Jetzt müsste ich nur noch verstehen warum bzw warum es mit dem DOELSE nicht so klappt wie gedacht.
([Ueberschuss] > 1000 and [Absorbtionsphase] eq "Open" and [08:00-17:00]) (set Batterielader_aus off)
internal doesnt exist [Ueberschuss:STATE]
([Ueberschuss:state] > 1000 and [Absorbtionsphase] eq "Open" and [08:00-17:00]) (set Batterielader_aus off)
Zitat von: Damian am 08 Dezember 2014, 08:31:15
do always in Verbindung mit zyklisch sendenden Sensoren, hier vermutlich: EG_dr_TS_Terrasse:luminosity, ist wenig sinnvoll.
Wenn man keinen Trigger bei solchen Sensoren haben will, dann muss man sie mit ReadingsVal(..) in der Bedingung angeben.
Gruß
Damian
Zitat von: Brockmann am 08 Dezember 2014, 08:33:49
Damian war mal wieder schneller, aber nur weil ich es etwas ausführlicher geschrieben habe: ;)
Du hast in Deinen Konditionen verschiedene Bedingungen drin. Wann immer ein dazu passendes Event auftritt, wird das DOIF getriggert, also beispielsweise wenn [mySL:Pac_avg] irgendeinen Wert meldet. Dann werden die Konditionen getestet, in denen dieser Wert enthalten ist. Ist keine der Konditionen wahr (weil der Wert zu hoch/zu niedrig ist oder eine verknüpfte Bedingung nicht stimmt), fällt DOIF auf den DOELSE-Fall zurück.
Genau aus diesem Grund ist (IMHO) eine der goldenen Regeln bei DOIFs, auf DOELSE möglichst zu verzichten bzw. es nur in Ausnahmefällen einzusetzen, wo man die Auswirkung genau überblicken und Seiteneffekte ausschließen kann. Und Deine Beschreibung passt genau zu solchen unerwarteten Seiteneffekten.
Ansonsten kannst Du Dir bei jeder Bedingung überlegen, ob sie wirklich eine Auswertung des DOIFs triggern soll. In einer zukünftigen Version wird es wohl die Möglichkeit geben, Bedingungen in DOIF-Notation als nicht-triggernd zu kennzeichnen. Bis dahin kann man anstelle der DOIF-Notation ganz klassisch Value oder ReadingsVal verwenden, um denselben Effekt zu erreichen.
Zitat von: maxritti am 08 Dezember 2014, 09:44:03
Nur so recht verstanden habe ich es nicht, warum der DOELSE Zweig gestern abend überhaupt als Ergebis kommt.
DOELSEIF (([duPVRollo:state] eq "an") and ([mySL:Pac_avg] >= 2100))
DOELSEIF ([duPVRollo:state] eq "an" and ReadingsVal("mySL","Pac_avg",0) >= 2100)
Zitat von: Brockmann am 08 Dezember 2014, 10:45:11
Vielleicht ist der Unterschied nun etwas klarer. Grundsätzlich kann man sagen: Bedingungen mit [] triggern und werden geprüft, Bedingungen ohne [] triggern nicht und werden nur geprüft, wenn von anderer Seite getriggert wurde.
attr MeinDOIF wait 300:0:0:0:300:0
Zitat von: Brockmann am 08 Dezember 2014, 15:27:53
Ich habe gerade ein sonderbares Verhalten in Kombination mit dem wait-Attribut festgestellt.
Ich habe ein etwas komplexeres DOIF mit fünf DOELSEIFs, also sechs Konditionen und sechs Aktionen. Dazu gehört:Code Auswählenattr MeinDOIF wait 300:0:0:0:300:0
Nun passiert folgendes: Zwei verschiedene Konditionen des DOIFs werden praktisch zeitgleich durch zwei verschiedene Readings getriggert und beide Konditionen sind insgesamt wahr. Ich gebe zu, dass ist etwas unglücklich und lässt sich sicher irgendwie vermeiden, nur habe ich es bei der Komplexität des DOIFs bislang einfach übersehen.
Die erste Kondition hat ein 300s-wait, so dass das DOIF pausiert. Die zweite getroffene Kondition wird ebenfalls nicht ausgeführt, obwohl sie ein 0s-wait hat.
Nach ca. 20 Sekunden ändert sich eine Bedingung der ersten Kondition, so dass diese nun abgebrochen wird. Das klappt auch, zumindest wird die entsprechende Aktion zu keinem Zeitpunkt ausgeführt.
ABER: Pünktlich 300 Sekunden nach dem ursprünglichen Triggern wird nun die Aktion der zweiten getroffenen Kondition ausgeführt, deren wait mit 0 definiert ist.
In diesem Szenario mit zwei Instanzen eines DOIFs in der Queue scheint mir irgendwie die zweite Instanz den wait-Intervall der ersten zu "erben"?
Zitat von: Damian am 08 Dezember 2014, 16:18:34
Wenn du es reproduzieren kannst, dann kann ich da mal schauen. Prinzipiell, gibt es zu einem Zeitpunkt immer nur einen Wait-Timer.
define DI_test DOIF ([Datastore:test1] eq "test")(trigger global test1)
DOELSEIF ([Datastore:test2] eq "test")(trigger global test2)
attr DI_test wait 20:0
2014-12-08 17:28:38 DOIF DI_test wait_timer: 08.12.2014 17:28:58 cmd_1 Datastore
2014-12-08 17:28:38 dummy Datastore test1: test
2014-12-08 17:28:38 dummy Datastore test2: test
2014-12-08 17:28:46 DOIF DI_test wait_timer: no timer
2014-12-08 17:28:46 Global global test2
2014-12-08 17:28:46 DOIF DI_test cmd_nr: 2
2014-12-08 17:28:46 DOIF DI_test cmd_event: Datastore
2014-12-08 17:28:46 DOIF DI_test cmd_2
2014-12-08 17:28:46 dummy Datastore test1: bla
2014-12-08 17:29:00 CUL_HM CUL_HM_HM_CC_TC_201407_Climate 0
Zitat von: Brockmann am 08 Dezember 2014, 19:04:21
Ich versuche mal ein leicht reproduzierbares Beispiel.
Folgendes DOIF:Code Auswählendefine DI_test DOIF ([Datastore:test1] eq "test")(trigger global test1)
DOELSEIF ([Datastore:test2] eq "test")(trigger global test2)
attr DI_test wait 20:0
Dazu irgendein Dummy (im Beispiel Datastore) mit den Readings test1 und test2.
Dann den Befehl
setReading Datastore test1 test;setReading Datastore test2 test
Man kann die beiden Befehle auch nacheinander abschicken. Solange der zweite innerhalb des wait-Intervalls vom ersten erfolgt wird er (vorläufig) ignoriert.
Schickt man dann innerhalb des definierten wait-Intervalls (im Beispiel 20 Sekunden) hinterher
setReading Datastore test1 wasauchimmer
und macht so die erste Kondition nachträglich unwahr, wird plötzlich die Aktion der zweiten Kondition ausgeführt.
Die Events sehen dann beispielsweise so aus:Code Auswählen2014-12-08 17:28:38 DOIF DI_test wait_timer: 08.12.2014 17:28:58 cmd_1 Datastore
2014-12-08 17:28:38 dummy Datastore test1: test
2014-12-08 17:28:38 dummy Datastore test2: test
2014-12-08 17:28:46 DOIF DI_test wait_timer: no timer
2014-12-08 17:28:46 Global global test2
2014-12-08 17:28:46 DOIF DI_test cmd_nr: 2
2014-12-08 17:28:46 DOIF DI_test cmd_event: Datastore
2014-12-08 17:28:46 DOIF DI_test cmd_2
2014-12-08 17:28:46 dummy Datastore test1: bla
2014-12-08 17:29:00 CUL_HM CUL_HM_HM_CC_TC_201407_Climate 0
Um 17:28:46 habe ich das setReading Datastore test1 bla hinterhergeschickt und dadurch die erste (verzögerte) Kondition unwahr werden lassen. In dem Moment wird dann die Aktion der zweiten Kondition ausgeführt (Global global test2).
Kannst Du das nachvollziehen?
Zitat von: Damian am 08 Dezember 2014, 20:43:14OK, das ist schon mal eine wichtige Erkenntnis. War mir bislang entgangen.
Ja, es verhält sich so wie programmiert. Das Problem ist, dass das Modul immer getriggert wird, wenn sich irgendetwas im devices ändert. Da bei dir beide Readings im gleichen Device stecken, wird durch "setReading Datastore test1 bla" eben auch die zweite Bedingung wegen Datastore getriggert und wenn sie wahr ist wird das Kommando ausgeführt.
Zitat von: Brockmann am 09 Dezember 2014, 07:27:12
Moin,
OK, das ist schon mal eine wichtige Erkenntnis. War mir bislang entgangen.
Das ist aber nur das halbe Problem. Denn mich stört ebenso, dass beim
setReading Datastore test1 test;setReading Datastore test2 test
das zweite setReading bzw. die dazu gehörende Kondition<>Aktion im DOIF komplett ignoriert wird. Denn das würde bedeuten, dass man bei Verwendung des wait-Attributs innerhalb eines DOIFs nur Konditionen haben darf, die in einem exklusiven Oder-Verhältnis stehen. Andernfalls bestünde die Gefahr, dass das DOIF wie in diesem Beispiel unter Umständen nicht reagiert, wenn es reagieren sollte.
Nun gebe ich zu, dass alleine schon DOELSEIF ein Exklusiv-Oder impliziert, aber ich war irgendwie davon ausgegangen, dass DOIF sich in dieser Hinsicht etwas toleranter verhalten würde.
Zitat von: Damian am 06 Dezember 2014, 16:50:39Hallo Damian,
Problem gefixed und eingecheckt. Korrektur ab morgen per FHEM-Update.
Gruß
Damian
define act_on_Taste1 notify (RC1_TASTE1:Long.1-.*|RC2_TASTE1:Long.1-.*|RC3_TASTE1:Long.1-.*|RC4_TASTE1:Long.1-.*) set USW2_GANG on-for-timer 1
define DI_act_on_Taste1 DOIF ([RC1_TASTE1] =~ "Long.1-")|([RC2_TASTE1] =~ "Long.1-")|([RC3_TASTE1] =~ "Long.1-")|([RC4_TASTE1] =~ "Long.1-") (set USW2_GANG on-for-timer 1)
Zitat von: Damian am 09 Dezember 2014, 08:48:02Nee, wir reden noch so ein bißchen aneinander vorbei, aber das liegt auch an mir. Ich kämpfe noch etwas mit dem Verständnis.
Ich weiß nicht ob ich dich richtig verstanden habe, aber ob wait oder nicht wait, das Abarbeiten der Bedingungen ist immer gleich.
define DI_test DOIF ([test1] eq "test")(trigger global test1)
DOELSEIF ([test2] eq "test")(trigger global test2)
attr DOIF wait 20:0
Zitat von: chriz am 09 Dezember 2014, 15:14:37
Kann ich stattdessen Folgendes für DOIF verwenden, oder muss ich ggf. etwas ändern?Code Auswählen
define DI_act_on_Taste1 DOIF ([RC1_TASTE1] =~ "Long.1-")|([RC2_TASTE1] =~ "Long.1-")|([RC3_TASTE1] =~ "Long.1-")|([RC4_TASTE1] =~ "Long.1-") (set USW2_GANG on-for-timer 1)
define DI_act_on_Taste1 DOIF ([RC1_TASTE1] =~ "Long.1-" or [RC2_TASTE1] =~ "Long.1-" or [RC3_TASTE1] =~ "Long.1-" or [RC4_TASTE1] =~ "Long.1-") (set USW2_GANG on-for-timer 1)
Zitat von: Brockmann am 09 Dezember 2014, 15:28:32
Nee, wir reden noch so ein bißchen aneinander vorbei, aber das liegt auch an mir. Ich kämpfe noch etwas mit dem Verständnis.
Können wir uns auf folgende Aussage einigen?
"Ein laufender wait-Timer aus einer Kondition1 wird abgebrochen, wenn eine andere Kondition2 desselben DOIFs getriggert wird und wahr ist, auch wenn die Kondition1, die den wait-Timer ursprünglich ausgelöst hat, zu diesem Zeitpunkt immer noch wahr ist."
Beispiel:Code Auswählen
define DI_test DOIF ([test1] eq "test")(trigger global test1)
DOELSEIF ([test2] eq "test")(trigger global test2)
attr DOIF wait 20:0
test1 und test2 sind jeweils Dummys.
set test1,test2 test => Die Aktion trigger global test2 wird sofort ausgeführt, trigger global test1 gar nicht.
set test2,test1 test => Die Aktion trigger global test2 wird sofort ausgeführt, trigger global test1 20 Sekunden später.
Ist das so korrekt?
Wohlgemerkt: Ich will gar nicht darauf hinaus, dass hier ein "Fehler" in DOIF vorliegen würde. Ich halte es nur für eine Beschränkung, bei der man darüber diskutieren kann, ob sie notwendig, sinnvoll oder unvermeidlich ist.
Nur am Wochenende bzw. an Feiertagen lt. holiday-Datei (7 entspricht $we):
define di_radio DOIF ([08:00-10:00|7]) (set radio on) DOELSE (set radio off)
Nur an Arbeitstagen (8 ist das Gegenteil von 7, entspricht !$we):
define di_radio DOIF ([08:00-10:00|8]) (set radio on) DOELSE (set radio off)
Zitat von: Spartacus am 09 Dezember 2014, 22:08:40
Hallo,
ich habe eine Frage zur Zeitsteuerung in Verbindung mit DOIF
in der commandRef steht:Code AuswählenNur am Wochenende bzw. an Feiertagen lt. holiday-Datei (7 entspricht $we):
define di_radio DOIF ([08:00-10:00|7]) (set radio on) DOELSE (set radio off)
Nur an Arbeitstagen (8 ist das Gegenteil von 7, entspricht !$we):
define di_radio DOIF ([08:00-10:00|8]) (set radio on) DOELSE (set radio off)
bedeutet dies, dass "7" und "8" bzw. die Variable $we und !$we) automatisch für alle Feiertage in der holiday Datei gesetzt wird, oder muss man da noch irgendetwas in fhem konfiguriren. zumindest muss doch das holiday Modul geladen sein, oder?
Christian
([{sunset("REAL")}-22:35|01234]) (mach dies) DOELSE ([{sunset("REAL")}-(23:30)|56] (mach das)
Error: {sunset("REAL")}-23 has no TYPE
Zitat von: dieda am 10 Dezember 2014, 01:25:39
Ich zacker gerade an so einen Ausdruck rum:Code Auswählen([{sunset("REAL")}-22:35|01234]) (mach dies) DOELSE ([{sunset("REAL")}-(23:30)|56] (mach das)
Bekomme dann im Log so was:Code AuswählenError: {sunset("REAL")}-23 has no TYPE
Wo ist da der Denkfehler?
Zitat von: Damian am 09 Dezember 2014, 17:52:39Mich interessiert primär, dass ich die Funktionsweise richtig verstehe und ob es eine bewusste Design-Entscheidung war, dies so zu machen oder es vielleicht technisch auch gar nicht anders machbar ist.
Du kannst mir gerne ein konkretes Beispiel nennen, was sich so verhält, wie du es für sinnvoll erachtest, ohne, dass es im Widerspruch zur Commandref des Moduls steht.
Zitat von: Brockmann am 10 Dezember 2014, 08:59:43Es war von mir eine bewusste Entscheidung wait mit Reset zu realisieren. Ich wollte in erster Linie eine Art watchdog-Funktionaltät haben. Tue etwas nach einer gewissen Zeit, wenn der Zustand sich nicht ändert. Der andere Fall tue etwas, wenn eine gewisse Zeit nichts passiert steht ja bereits auf der todo-Liste.
Mich interessiert primär, dass ich die Funktionsweise richtig verstehe und ob es eine bewusste Design-Entscheidung war, dies so zu machen oder es vielleicht technisch auch gar nicht anders machbar ist.
Im letzteren Fall muss man halt damit leben. Im ersteren Fall würde ich die Entscheidung für unglücklich halten.
Ein Szenario, bei dem ein laufender wait-Timer abgebrochen wird, nur weil eine andere Kondition wahr wird (ohne dass die auslösende Kondition deshalb unwahr wird), ist im Grunde genommen immer ein ungewollter Seiteneffekt. Denn wenn ich WOLLTE, dass irgendein Ereignis meinen laufenden wait-Timer abbricht, dann hätte ich das entsprechende Reading von vorne herein in die Kondition einfügen sollen, die den wait-Timer startet. Dann würde diese Kondition beim Eintreffen des Ereignisses unwahr und der Timer deshalb abgebrochen.
Zitat von: Damian am 10 Dezember 2014, 12:14:57Wir reden immer noch etwas aneinander vorbei. Ich versuche es mal, auf den Punkt zu bringen.
Es war von mir eine bewusste Entscheidung wait mit Reset zu realisieren. Ich wollte in erster Linie eine Art watchdog-Funktionaltät haben. Tue etwas nach einer gewissen Zeit, wenn der Zustand sich nicht ändert. Der andere Fall tue etwas, wenn eine gewisse Zeit nichts passiert steht ja bereits auf der todo-Liste.
Zitat von: Damian am 10 Dezember 2014, 12:14:57
Möchte man dagegen den einfachen Fall haben, tue etwas auf jeden Fall nach X-Sekunden, dann braucht man nur einen at-Timer zu setzen oder sonst ein Sleep (natürlich nicht in Kombination mit DOIF). Dieser Fall ist aus meiner Sicht, aber oft wenig sinnvoll. Denn wenn ein Ereignis während der Wartezeit mehrfach vorkommt, dann habe ich mehrere Timer, die mehrfach die gleiche Aktion ausführen - wozu?
Von daher ist wait nicht mit at bzw. sleep gleichzusetzen - das war von Anfang an so von mir beabsichtigt gewesen.
Zitat von: Damian am 10 Dezember 2014, 07:53:23
([{sunset("REAL")}-22:35|01234]) (mach dies) DOELSE ([{sunset("REAL")}-23:30|56]) (mach das)
Du musst schon auf die korrekte Klammerung achten.
Gruß
Damian
Zitat von: Brockmann am 10 Dezember 2014, 13:49:51ok. Das würde aber bedeuten, dass man mehrere Timer bräuchte, denn die zweite und dritte und usw. Bedingung kann ja auch ein wait haben. Das würde einen nicht unerheblichen Verwaltungsaufwand bedeuten, da zukünftig auch noch wait´s zwischen den Kommandos dazukommen sollen. Ich möchte eigentlich die Sache möglichst einfach halten und mit einem Timer auskommen. Wenn mehrere Bedingungen bzgl. der Timer unabhängig voneinander funktionieren sollen, dann muss man sie halt in mehrere DOIFs aufteilen.
Wir reden immer noch etwas aneinander vorbei. Ich versuche es mal, auf den Punkt zu bringen.
Du sagst:
Wenn sich bei laufendem wait-Timer der Zustand eines DOIFs ändert, muss die Kondition, die den wait-Timer gestartet hat, unwahr geworden sein. Also wird der Timer gelöscht.
Ich sage:
Wenn sich bei laufendem wait-Timer der Zustand eines DOIFs ändert, muss die Kondition, die den wait-Timer gestartet hat, nicht automatisch unwahr geworden sein. Deshalb sollte der Timer nicht gelöscht werden. Ein laufender Timer sollte nur gelöscht werden, wenn die auslösenden Kondition erneut getriggert wurde und dadurch tatsächlich unwahr geworden ist.
Zitat2014.12.10 16:42:55 1: PERL WARNING: Argument "1840.85 W" isn't numeric in numeric gt (>) at (eval 8682) line 1.
([Trockner:power]>4) (set Trockner_betrieb on) DOELSEIF ([Trockner:power]<3) (set Trockner_betrieb off)
Internals:
DEF ([Trockner:power]>4) (set Trockner_betrieb on) DOELSEIF ([Trockner:power]<3) (set Trockner_betrieb off)
NAME Trockner_DI
NR 828
NTFY_ORDER 50-Trockner_DI
STATE cmd_1
TYPE DOIF
Readings:
2014-12-10 16:49:55 cmd_event Trockner
2014-12-10 16:49:55 cmd_nr 1
2014-12-10 16:48:55 e_Trockner_power 1883.91 W
2014-12-10 16:49:55 state cmd_1
2014-12-10 16:49:55 wait_timer no timer
Condition:
0 ReadingValDoIf('Trockner','power','')>4
1 ReadingValDoIf('Trockner','power','')<3
Devices:
0 Trockner
1 Trockner
all Trockner
Do:
0 set Trockner_betrieb on
1 set Trockner_betrieb off
Helper:
last_timer 0
sleepdevice Trockner
sleeptimer -1
Internals:
Readings:
0 Trockner:power
1 Trockner:power
all Trockner:power
State:
Timerfunc:
Attributes:
do always
wait 60:300
define di.02.EI.ss.SA.Licht DOIF ((([EG.ss.TK.Haustuer:buttons] eq "pressed") or \
[EG.ss.LS.Eingang:buttons] eq "pressed") and [tw.01.Daemmerung:twilight] <55 or \
[00:00-02:00] and [hl.01.Feiertag:state] eq "Silvester")\
(set EI.ss.SA.Licht on)\
DOELSEIF\
(([EG.ss.TK.Haustuer:buttons] eq "released" or \
[EG.ss.LS.Eingang:buttons] eq "released") and [hl.01.Feiertag:state] ne "Silvester" )\
(set EI.ss.SA.Licht off)\
DOELSEIF \
([Notaus] eq "on" and [hl.01.Feiertag:state] ne "Silvester")
attr di.02.EI.ss.SA.Licht alias autom. Eingangslicht
attr di.02.EI.ss.SA.Licht cmdState on|off|off
attr di.02.EI.ss.SA.Licht disable 0
attr di.02.EI.ss.SA.Licht room 05-Eingang
attr di.02.EI.ss.SA.Licht wait 0:120:0
#
#
# Email senden, wenn Tür länger als 10min auf steht
#
define di.03.EI.ss.SA.Licht DOIF ([EG.ss.TK.Haustuer:buttons] eq "pressed") ({eMail('muster@mann.de','Warnung','Haustür steht offen')}, \
set EI.ss.SA.Licht off, set Notaus on)\
attr di.03.EI.ss.SA.Licht alias Warnung Eingang
attr di.03.EI.ss.SA.Licht cmdState active
attr di.03.EI.ss.SA.Licht room 05-Eingang
attr di.03.EI.ss.SA.Licht wait 600
#kurzer Druck:
seq.01.EG.fl.WS.Eingangslicht:trigger set EI.ss.SA.Licht toggle
#langer Druck:
seq.01.EG.fl.WS.Eingangslicht:partial_1 set EI.ss.SA.Licht on-for-timer 3600
define DOIF DI_test ([test1] eq "ja" and [test2] eq "test")
(trigger global test1)
DOELSEIF ([test2] eq "test")
(trigger global test2)
attr DI_Test wait 20:0
2014-12-10 10:51:40 DOIF DI_test wait_timer: 10.12.2014 10:52:00 cmd_1 test2
2014-12-10 10:51:40 dummy test2 test
2014-12-10 10:51:46 dummy test1 nein
2014-12-10 10:52:00 Global global test2
2014-12-10 10:52:00 DOIF DI_test cmd_nr: 2
2014-12-10 10:52:00 DOIF DI_test cmd_event: test2
2014-12-10 10:52:00 DOIF DI_test cmd_2
2014-12-10 10:52:00 DOIF DI_test wait_timer: no timer
Zitat von: Gisbert am 11 Dezember 2014, 09:03:43
ich habe immer noch das Problem, dass die Zeitangsben sich nicht auf den gleichen Tag beziehen, sondern auf den nächsten, wenn eine Schranke bereits in der Vergangenheit liegt. Ich hatte zunächst 3 Befehle mit doelseif gekoppelt. Der Versuch es mit drei einzelnen doif's zu versuchen, brachte das gleiche falsche Ergebnis.
2014-12-11 08:20:00 timer_1_c1 12.12.2014 08:20:00
Zitat von: Gisbert am 11 Dezember 2014, 11:26:48
vielen Dank für deine Antwort. Ist es dann so, dass nur um wie in meinem Fall nur 8:20 geprüft wird, ob das Licht an ist? Wenn es zwischendurch durch den Taster eingeschaltet wird, wird dann nicht mehr geprüft? Was für einen Sinn hat dann die 2. Zeitschranke? In der Commandref hab ich es so verstanden, dass innerhalb des Zeitraums geprüft wird.
DEF ([08:20-16:40] and [Haustuer.Licht] eq "on") (set Haustuer.Licht off)
Zitat von: Brockmann am 11 Dezember 2014, 09:13:41
Ich habe mein ursprüngliches Problem für die Diskussion der letzten Tage nun etwas weiter analysieren können und dabei die eigentliche Ursache für die gelegentlichen "Fehlfunktionen" erkannt. Allerdings kann ich mir das Verhalten auch mit den neuen Erkenntnissen bzgl. wait-Timern nicht erklären. Ich habe es mal in einem Beispiel vereinfacht:Code Auswählen
define DOIF DI_test ([test1] eq "ja" and [test2] eq "test")
(trigger global test1)
DOELSEIF ([test2] eq "test")
(trigger global test2)
attr DI_Test wait 20:0
Ich setze test2 auf "test", test1 steht in dem Moment auf "ja". Damit treffe ich die erste Kondition und der wait-Timer startet. Soweit klar.
Die zweite Kondition würde auch passen, aber da die erste schon traf, sollte die zweite in dem Fall ja ignoriert werden, oder?
Während der wait-Timer läuft, setze ich test1 auf "nein". Damit wird die erste Kondition unwahr. Nun sollte der Timer abgebrochen und die Aktion nicht ausgeführt werden.
Nach meinem Verständnis sollte an der Stelle Schluss sein.
ABER: Pünktlich 20 Sekunden nach dem ursprünglichen Triggern der ersten Kondition wird die Aktion der zweiten Kondition ausgeführt?
Event-Monitor:Code Auswählen
2014-12-10 10:51:40 DOIF DI_test wait_timer: 10.12.2014 10:52:00 cmd_1 test2
2014-12-10 10:51:40 dummy test2 test
2014-12-10 10:51:46 dummy test1 nein
2014-12-10 10:52:00 Global global test2
2014-12-10 10:52:00 DOIF DI_test cmd_nr: 2
2014-12-10 10:52:00 DOIF DI_test cmd_event: test2
2014-12-10 10:52:00 DOIF DI_test cmd_2
2014-12-10 10:52:00 DOIF DI_test wait_timer: no timer
[device:reading:d]
Zitat von: Brockmann am 11 Dezember 2014, 09:13:41
Ich habe mein ursprüngliches Problem für die Diskussion der letzten Tage nun etwas weiter analysieren können und dabei die eigentliche Ursache für die gelegentlichen "Fehlfunktionen" erkannt. Allerdings kann ich mir das Verhalten auch mit den neuen Erkenntnissen bzgl. wait-Timern nicht erklären. Ich habe es mal in einem Beispiel vereinfacht:Code Auswählen
define DOIF DI_test ([test1] eq "ja" and [test2] eq "test")
(trigger global test1)
DOELSEIF ([test2] eq "test")
(trigger global test2)
attr DI_Test wait 20:0
Ich setze test2 auf "test", test1 steht in dem Moment auf "ja". Damit treffe ich die erste Kondition und der wait-Timer startet. Soweit klar.
Die zweite Kondition würde auch passen, aber da die erste schon traf, sollte die zweite in dem Fall ja ignoriert werden, oder?
Während der wait-Timer läuft, setze ich test1 auf "nein". Damit wird die erste Kondition unwahr. Nun sollte der Timer abgebrochen und die Aktion nicht ausgeführt werden.
Nach meinem Verständnis sollte an der Stelle Schluss sein.
ABER: Pünktlich 20 Sekunden nach dem ursprünglichen Triggern der ersten Kondition wird die Aktion der zweiten Kondition ausgeführt?
Zitat von: Damian am 11 Dezember 2014, 22:14:31Die Verwirrung lichtet sich. Ich denke, der Grund für das (für mich) unerwartete Verhalten ist letztlich folgender (und das war mir bislang so nicht klar):
Die Programmierung ist ganz einfach: ein laufender Timer wird nur dann zurückgesetzt, wenn ein anders Kommando ausgeführt werden soll bzw. ein Timer für dieses Kommando gestartet wird (wenn ein wait für dieses Kommando definiert ist), also wenn der Zustand cmd_x auf cmd_y wechsel oder timerbedingt später wechseln soll. Das gilt auch, wenn es nur einen If-Fall gibt, hier gibt es nämlich auch den Zustand cmd_2.
Zitat von: sam50 am 12 Dezember 2014, 10:41:48Da ist mit der Klammerung einiges im Argen. Versuche es mal so (ungetestet):
define Jahreszeit_st DOIF ({[Sunrise()}] and [{myAverage("43200", "FileLog_Aussen_Temp", "4:::")}] < 12)({set Jahreszeit Winter})
Meinem verständniss nach bedeutet der Fehler 'must return a timespec and not 4.6.: ' es soll dort eine zeitangabe rein und nicht der wert 4.6 (Ist der Durschnittswert).
Das verstehe ich nicht --> Vielleicht kann mir ja jemand einen Tip geben. ;) ;)
define Jahreszeit_st DOIF ([{sunrise()}] and myAverage("43200", "FileLog_Aussen_Temp", "4:::") < 12)(set Jahreszeit Winter)
Zitat von: Spartacus am 12 Dezember 2014, 11:06:08Dein DOIF bekommt nichts von irgendwelchen Tasterdrücken mit, weil Du in den Bedingungen weder den Taster noch den Status des Lichts abfragst.
http://forum.fhem.de/index.php/topic,23833.msg228951.html#msg228951
Vielleicht kann mir noch jemand einen Tipp dazu geben, wie ich das am Besten lösen sollte.
Zitat von: Brockmann am 12 Dezember 2014, 13:18:08
Da ist mit der Klammerung einiges im Argen. Versuche es mal so (ungetestet):Code Auswählen
define Jahreszeit_st DOIF ([{sunrise()}] and myAverage("43200", "FileLog_Aussen_Temp", "4:::") < 12)(set Jahreszeit Winter)
Zitat von: Spartacus am 12 Dezember 2014, 11:06:08
Vielleicht kann mir noch jemand einen Tipp dazu geben, wie ich das am Besten lösen sollte.
Zitat von: Brockmann am 12 Dezember 2014, 13:26:15
Dein DOIF bekommt nichts von irgendwelchen Tasterdrücken mit, weil Du in den Bedingungen weder den Taster noch den Status des Lichts abfragst.
Die beiden Geschichten laufen quasi völlig nebeneinander her und streiten sich, wer nun das Licht schalten darf.
Integriere den Taster bzw. die dadurch generierten Events irgendwie in das DOIF, damit es beim Betätigen des Tasters getriggert wird und entsprechend der neuen Situation seinen Status ändern kann.
Zitat von: Spartacus am 12 Dezember 2014, 14:11:48Wenn ich es richtig verstehe, soll der Taster das DOIF in jeder Situation "überstimmen"?
Ggf. muss man in der Sequence sich ein Hilfsdummy setzten, welches man im DOIF dann auswertet, aber genau da fehlt mir der Wegweiser, der zum Ziel führen könnte!
Zitat von: Brockmann am 12 Dezember 2014, 15:22:38
Wenn ich es richtig verstehe, soll der Taster das DOIF in jeder Situation "überstimmen"?
Würde es dann nicht ausreichen, die Konditionen jeweils um eine Abfrage des Lichtstatus zu erweitern? Also das Licht nur einschalten, wenn es nicht schon eingeschaltet ist und nur ausschalten, wenn es nicht schon ausgeschaltet ist. Zumindest die beiden von Dir beschriebenen "Fehler-Situationen" sollten sich dadurch auflösen lassen. Und generell erreichst Du damit, dass das DOIF mitbekommt, wenn sich extern an der "Lichtsituation" etwas verändert und darauf reagieren kann.
Ob das jetzt für alle Eventualitäten in Deinem Szenario ausreicht, weiß ich nicht. Aber den Sonderfall Silvester kannst Du ja bald testen. ;)
(((<Haustür offen> or <LS betätigt>) and <dunkel>) or ([0:00 - 02:00] and <Neujahr>)) and <Licht off>
(set Licht on)
DOELSEIF
(<Haustür zu> and <LS Leerlauf> and <Licht on> and nicht (<Neujahr> and [00:00 - 02:00]))
(set Licht off)
Zitat von: Spartacus am 12 Dezember 2014, 19:21:25Ist etwas schwierig, solchen "Pseudo-Code" zu beurteilen. Dann lieber richtigen.
was meinst Du?
Zitat von: Reinerlein am 14 Dezember 2014, 02:16:08
Hallo Damian,
ich wollte mal fragen, ob die Zugriffsmöglichkeit auf den Timestamp eines Readings schon in Reichweite ist.
Ich würde den gerne in Abfragen mit einbeziehen, bzw. als alleinige Bezugsgröße verwenden, z.B.:
15 Minuten nach dem letzten Auftreten eines Bewegungs-Ereignisses meines PIR soll die Aussenbeleuchtung leicht gedimmt noch angeschaltet bleiben.
So in der Art könnte ich mir einige Bedinungen vorstellen. Dafür ist (zumindest in meinem Konstrukt) die Verwendung des Wait-Timers nicht passend, da dort noch einige andere Bedingungen geprüft werden, um andere Dinge mit dem Licht zu machen...
Danke schon mal für deine Antwort...
Grüße
Reinerlein
Zitat von: Reinerlein am 14 Dezember 2014, 10:02:24
Hi Damian,
ja, so habe ich es auch umgesetzt. Ich finde nur diese Schreibweise etwas "unelegant" bzw. in meinem großen Konstrukt unübersichtlich, und ich dachte irgendwo gelesen zu haben, dass du da bei Gelegenheit etwas zum Rest passenderes bauen wolltest...
Trotzdem Danke für den Hinweis...
Grüße
Reinerlein
[<device>:<reading>:sec]
für Zeit in Sekunden seit der letzten Änderung des Readings auf die immer länger werdende todo-Liste setzen (diese aktualisiere ich im ersten Post des Threads).define sKurzerLangerDruck_UR sequence PTM210.Gira.01:BI 0.5 PTM210.Gira.01:buttons:.released
attr sKurzerLangerDruck_UR disable 0
attr sKurzerLangerDruck_UR room 99-Test
attr sKurzerLangerDruck_UR triggerPartial 1
#
define nKurzerDruck_UR notify sKurzerLangerDruck_UR:trigger \
{ \
if (ReadingsVal ("Eingangslicht.dum", "state",0) eq"on")\
{\
fhem("set Eingangslicht.dum off")\
}\
else\
{\
fhem("set Eingangslicht.dum on")\
}\
}
sKurzerLangerDruck_UR:trigger
define diEingangsLicht DOIF (([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") or [sKurzerLangerDruck_UR:trigger])
(([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") or
([PTM210.Gira.01:buttons] eq "pressed" and [Eingangslicht.dum] eq "off"))
(set Aktor on)
DOELSEIF
([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and [Eingangslicht.dum] eq "off")
(set Aktor off)
DOELSEIF
([PTM210.Gira.01:buttons] eq "pressed" and [Eingangslicht.dum] eq "on")
(set Aktor off)
#
#
#
attr wait 0:10:0
Zitat von: Spartacus am 14 Dezember 2014, 16:58:40Ich verstehe nicht, wozu Du [Eingangslicht.dum] brauchst. Prüfe doch einfach direkt den Status des Aktors. Dann hast Du auch immer den korrekte Zustand.
Ich kann den korrekten Zustand nicht bestimmen, wenn der Aktor beispielsweise durch die Lichtschranke aktiviert wurde.
Zitat von: Spartacus am 15 Dezember 2014, 10:19:42Ich würde es so versuchen:
ich brauche doch irgendeinen Merker für den Taster, da er doch alle anderen Sensoren sticht!
define diEingangsLicht DOIF(([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") and [Aktor] eq "off"))
(set Aktor on)
DOELSEIF ([PTM210.Gira.01:buttons] eq "pressed" and [Aktor] eq "off")
(set Aktor on)
DOELSEIF ([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and [Aktor] eq "on" and [diEingangsLicht] eq "sensor_on")
(set Aktor off)
DOELSEIF ([PTM210.Gira.01:buttons] eq "pressed" and [Aktor] eq "on")
(set Aktor off)
#
attr diEingangsLicht wait 0:0:10:0
attr diEingangsLicht cmd_state sensor_on|manual_on|sensor_off|manual_off
define TestSteuerung dummy
attr TestSteuerung devStateIcon Aus:general_aus@lightgreen Ein:general_an_fuer_zeit@Crimson
attr TestSteuerung eventMap Aus Ein
attr TestSteuerung icon time_clock
attr TestSteuerung room Automation
attr TestSteuerung setList state:Aus,Ein
attr TestSteuerung sortby 01
attr TestSteuerung webCmd state
(([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") and [Aktor] eq "off")
Zitat von: Spartacus am 15 Dezember 2014, 19:28:46Denk mal drüber nach, ob der Aktor überhaupt ein Trigger sein sollte. Ich meine, dass das in dem Szenario nicht nötig ist. Also würde ich statt [Aktor] eq off besser Value("Aktor") eq "off" usw. verwenden. Das sollte das Problem beheben, oder?Code Auswählen(([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") and [Aktor] eq "off")
Wenn jetzt die Haustür offen steht, ("pressed") dann kann ich den Aktor zwar mit dem Taster ausschalten, aber er wird dann direkt wieder eingeschaltet, da "Haustuer:pressed" und "Aktor:off" wahr sind...hier müsste man auf "Haustuer:released" and " LS:released "warten, bevor das o.a. DOIF wieder zugelassen werden darf.
Zitat von: satprofi am 17 Dezember 2014, 17:12:07
Hallo Damian.
Könntest du mir einen Denkansatz geben? Ich suche eine möglichkeit, mit dem Powermeter von HM das Ende eines Waschzyklus auszugeben. Trigger soll aber ein Überschreiten eines bestimmten Wertes sein, und auslösen einer Meldung dann ein Wert der unterschritten wird.
Würde das ohne do always klappen?
Zitat von: Brockmann am 18 Dezember 2014, 14:41:33
Wir hatten hier im Thread ja ein paar Mal das Thema Pushover-Modul, weil sich das nicht ganz Fhem-konform verhält und nach erfolgreichem Versand ein "OK" anstelle von 0 zurückliefert.
Ich meine, dass der DOIF-Code sogar extra angepasst wurde, um damit umzugehen?
Ich hatte das vor einiger Zeit schon im Pushover-Thread angemerkt und laut Johannes_B (Modulentwickler) ist das nun korrigiert.
ZitatPushmeldung beim Ausbleiben eines Events:kommt so wie auf Seite 1 beschrieben
Zitat von: fhem-hm-knecht am 18 Dezember 2014, 18:21:03
@ Damian
Hallo weißt du schon wann kommt so wie auf Seite 1 beschrieben
bzw attr di_push do always|resetwait
lieb frag?
([harmony:currentActivity] "PowerOff") (set Radio off) DOELSE (set Fernsehen off)
([harmony:currentActivity] eq "PowerOff") (set Radio off) DOELSE (set Fernsehen off)
([harmony:activity] eq "PowerOff" and ReadingsVal("harmony","previousActivity","undefined") eq "<Name deiner Aktivität zum Radiohören>") (set Radio off)
attr <Name deines DOIFs> wait 3
(([06:00-09:00] or [17:00-20:00]) and ([BM_Kueche] eq "motion")) (IF ([BM_Kueche:brightness:d] <40) (set switch_d_lang on, set switch_d_lang off))
Zitat von: Invers am 19 Dezember 2014, 17:36:55
Ich habe nun keine Idee mehr, wo ich suchen kann. Daher mal die folgende Frage:
Ich habe das DOIF aus der Commandref nachgebaut mit allem "Zubehör". Funktioniert auch, allerdings mit einem kleinen Makel, den ich nicht weg bekomme.Code Auswählen(([06:00-09:00] or [17:00-20:00]) and ([BM_Kueche] eq "motion")) (IF ([BM_Kueche:brightness:d] <40) (set switch_d_lang on, set switch_d_lang off))
mit do always.
Problem: immer um 6 und um 17 Uhr geht das Licht nun für 109 Minuten an, ohne durch den BM ausgelöst zu werden.
Bei meinem 2. DOIF passiert das auch, der dir restlichen Tageszeiten abdeckt und mit 1 Minute läuft. Der geht zu jeder Beginnzeit dann allerdings für eine Minute an.
Ich hoffe, mich verständlich auszudrücken.
Hat jemand eine Idee, wie ich den DOIFs das abgewöhnen kann? Die Androhung von Schlägen hat nichts gebracht. LOL
Zitat von: Invers am 19 Dezember 2014, 17:52:04
Ja, ist er.
Zitat von: Invers am 19 Dezember 2014, 18:21:24Dass zum Startpunkt getriggert wird, ist klar, da "motion" bei HM immer gesetzt ist. Ich werde später noch Zeitintervalle ohne Trigger realisieren, solange müsstest du z. B.:
Nö, ich meine in diesem Fall ein anderes Problem zu haben. Meine BM triggern nicht mehr wild rum.
Das Schalten erfolgt ja bei mir immer genau zum Start-Zeitpunkt eines Intervalls. Also, wenn Start 6 uhr und ende 8 Uhr ist, startet das DOIF immer genau um 6 uhr und läuft 10 Minuten, falls Dauer so programmiert ist. Im Anschluss daran klappt alles ganz normal, wie es soll. Immer!
Selbiges läuft auch am 2. DOIF, der aber nur 1 Minute schaltet, weil ich die Minute halt so will.
Wie gesagt, das passiert IMMER zur Startzewit eines Zeitraumes. Der BM löst nicht aus zu diesem Zeitpunkt.
2014-12-10_16:20:35 BM_Kueche motion
2014-12-10_16:24:39 BM_Kueche motion
2014-12-10_17:16:59 BM_Kueche motion
2014-12-10_17:17:30 BM_Kueche motion
$HMS gt "06:00" and $HMS lt "09:00"
statt [06:00-09:00]
angeben.((($HMS gt "09:00" and $HMS lt "17:00") or ($HMS gt "20:00" and $HMS lt "06:00")) and (([BM_Kueche] eq "motion") and ([BM_Kueche:brightness:d] <40))) (set switch_d on, set switch_d off)
Zitat von: Invers am 19 Dezember 2014, 23:17:50
Schade, abgesehen, dass ich niemals auf so einen Gedanken gekommen wäre, schaltet nun gar nichts mehr.
Vermutlich habe ich dich falsch verstanden?
Hier mal mein neuer Code:Code Auswählen((($HMS gt "09:00" and $HMS lt "17:00") or ($HMS gt "20:00" and $HMS lt "06:00")) and (([BM_Kueche] eq "motion") and ([BM_Kueche:brightness:d] <40))) (set switch_d on, set switch_d off)
2014.12.20 21:58:41 2: WZ_Fenster_OST_L: perl error in condition: ReadingValDoIf('HMW_Sen_SC_12_DR_JEQ0545703_07','SENSOR','') == on and ReadingValDoIf('HMW_Sen_SC_12_DR_JEQ0545703_08','SENSOR','') == off: Bareword "on" not allowed while "strict subs" in use at (eval 106) line 1.
Bareword "off" not allowed while "strict subs" in use at (eval 106) line 1.
[code]define WZ_Fenster_OST_L DOIF ([HMW_Sen_SC_12_DR_JEQ0545703_07:SENSOR] == on and [HMW_Sen_SC_12_DR_JEQ0545703_08:SENSOR] == off) DOELSEIF ([HMW_Sen_SC_12_DR_JEQ0545703_07:SENSOR] == off and [HMW_Sen_SC_12_DR_JEQ0545703_08:SENSOR] == on) DOELSEIF ([HMW_Sen_SC_12_DR_JEQ0545703_07:SENSOR] == on and [HMW_Sen_SC_12_DR_JEQ0545703_08:SENSOR] == on)
attr WZ_Fenster_OST_L alias OST L
attr WZ_Fenster_OST_L cmdState zu|gekippt|offen
attr WZ_Fenster_OST_L devStateIcon zu:fts_window_1w offen:fts_window_1w_open@red gekippt:fts_window_1w_tilt@red
attr WZ_Fenster_OST_L group Fenster
attr WZ_Fenster_OST_L icon fts_door_right
attr WZ_Fenster_OST_L room Wohnzimmer
2014.12.20 21:58:41 2: WZ_Fenster_OST_L: perl error in condition: ReadingValDoIf('HMW_Sen_SC_12_DR_JEQ0545703_07','SENSOR','') == on and ReadingValDoIf('HMW_Sen_SC_12_DR_JEQ0545703_08','SENSOR','') == off: Bareword "on" not allowed while "strict subs" in use at (eval 107) line 1.
Bareword "off" not allowed while "strict subs" in use at (eval 107) line 1.
2014.12.20 21:58:41 2: WZ_Fenster_OST_L: perl error in condition: ReadingValDoIf('HMW_Sen_SC_12_DR_JEQ0545703_07','SENSOR','') == on and ReadingValDoIf('HMW_Sen_SC_12_DR_JEQ0545703_08','SENSOR','') == off: Bareword "on" not allowed while "strict subs" in use at (eval 108) line 1.
Bareword "off" not allowed while "strict subs" in use at (eval 108) line 1.
Zitat von: holzwurm83 am 20 Dezember 2014, 22:15:58Der besagt, dass er mit dem Begriff on oder off nichts anfangen kann, weil Du die in Anführungszeichen setzen muss (so wie es auch in den zahlreichen Beispielen in der Commandref oder hier im Thread gehandhabt wird).
Jetzt bekomme ich folgenden Fehler mit dem ich nicht klarkomme.
Zitat von: Damian am 17 Dezember 2014, 20:05:56
Was ist mit dem Beispiel aus der commandref von DOIF zu "Waschmaschine fertig"?
Gruß
Damian
define di_EG_wz_RO_Carport
DOIF (([du_Rollo_Master:state] eq "an") and ([EG_wz_TK_Carport:state] eq "closed") and ((([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru:state]) and ([15:00-24:00])) or [22:10-24:00]))
(set EG_wz_RO_Carport off)
DOELSEIF (([du_Rollo_Master:state] eq "an") and ((([EG_dr_TS_Terrasse:luminosity] > [du_Rollo_Luminosity_ho:state]) and !$we) or ([{Value("du_Rollo_Zeit_ho")}] and !$we) or ([{Value("du_Rollo_Zeit_ho_WE")}] and $we)) or ([EG_wz_TK_Carport:state] eq "open"))
(set EG_wz_RO_Carport on)
DOELSEIF (([du_Rollo_PV:state] eq "an") and ([EG_wz_TK_Carport:state] eq "closed") and ([mySL:Pac_avg] >= 2100) and ([myTL:azimuth] > 70) and ([myTL:azimuth] < 170))
(set EG_wz_RO_Carport 0)
DOELSEIF (([du_Rollo_PV:state] eq "an") and ([EG_wz_TK_Carport:state] eq "closed") and ([mySL:Pac_avg] >= 1501) and ([myTL:azimuth] > 70) and ([myTL:azimuth] < 170))
(set EG_wz_RO_TerrasseLinks 30)
Please define di_EG_wz_RO_Carport first
di_EG_wz_RO_Carport DOIF: the at function "Value("du_Rollo_Zeit_ho")" must return a timespec and not ???.: {Value("du_Rollo_Zeit_ho")}
Zitat von: maxritti am 21 Dezember 2014, 15:17:11
Hallo zusammen,
bezugnehmend auf das Posting hier habe ich mir meine Jalousiesteuerung ein wenig anders umgesetzt.
Denn die Idee mit Dummies usw fand ich ganz gut.
http://forum.fhem.de/index.php/topic,29124.msg219148.html#msg219148
Nun habe ich mehrere Dummies definiert (siehe Anhang), wo ich mehrere Parameter setzen kann.
Für meine 5 Jalousien habe ich nun pro Jalousie ein DOIF definiert, wo ich die in den Dummies definierten Werte mit einbeziehe.
Ein DOIF sieht beispielsweise so aus:Code Auswählendefine di_EG_wz_RO_Carport
DOIF (([du_Rollo_Master:state] eq "an") and ([EG_wz_TK_Carport:state] eq "closed") and ((([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru:state]) and ([15:00-24:00])) or [22:10-24:00]))
(set EG_wz_RO_Carport off)
DOELSEIF (([du_Rollo_Master:state] eq "an") and ((([EG_dr_TS_Terrasse:luminosity] > [du_Rollo_Luminosity_ho:state]) and !$we) or ([{Value("du_Rollo_Zeit_ho")}] and !$we) or ([{Value("du_Rollo_Zeit_ho_WE")}] and $we)) or ([EG_wz_TK_Carport:state] eq "open"))
(set EG_wz_RO_Carport on)
DOELSEIF (([du_Rollo_PV:state] eq "an") and ([EG_wz_TK_Carport:state] eq "closed") and ([mySL:Pac_avg] >= 2100) and ([myTL:azimuth] > 70) and ([myTL:azimuth] < 170))
(set EG_wz_RO_Carport 0)
DOELSEIF (([du_Rollo_PV:state] eq "an") and ([EG_wz_TK_Carport:state] eq "closed") and ([mySL:Pac_avg] >= 1501) and ([myTL:azimuth] > 70) and ([myTL:azimuth] < 170))
(set EG_wz_RO_TerrasseLinks 30)
Das Problem ist nun, dass wenn ich FHEM neu starte, was ja spätestens nach einem Update der Fall sein wird, alle DOIFs für die Jalousien verschwinden.
Im log sehe ich dann so etwas:Code AuswählenPlease define di_EG_wz_RO_Carport first
di_EG_wz_RO_Carport DOIF: the at function "Value("du_Rollo_Zeit_ho")" must return a timespec and not ???.: {Value("du_Rollo_Zeit_ho")}
Jetzt frage ich mich nur, an was das liegt?
Denn das Dummie du_Rollo_Zeit_ho (Zeit hoch:) ist wie man im Screenshot sieht vorhanden und auch gefüllt.
Liegt das eventuell an der Reihenfolge, wie die DOIFs und Dummies in der Config gespeichert sind? Da habe ich ja mMn mal nicht wirklich viel Einfluss drauf.
Schon gar nicht bei der ConfigDB ;-)
Zumindest ein "configDB list" zeigt mir auch erst die Definition der DOIFs und dann des Dummies.
Zitat von: Damian am 21 Dezember 2014, 18:44:02Danke für den Ansatz. Dahin ist vorhin auch mein Gedanke gegangen.
ja, zum Zeitpunkt der Definition des Moduls ist das Dummy offenbar nicht vorhanden. Evtl. hilft ReadingsVal("du_Rollo_Zeit_ho","state","00:00") statt Value("du_Rollo_Zeit_ho"). Hier wird zumindest ein Default-Wert bei Nichtvorhandensein genommen.
Gruß
Damian
Zitat von: MarkusN am 21 Dezember 2014, 19:23:53
Damian, ich möchte einfach mal Danke sagen. Das DOIF Modul macht viele Anwendungsfälle deutlich einfacher, ich habe unzählige notify und at gelöscht, Fälle in denen ich ein Konstrukt aus mehreren notifys und dummys gebaut habe sind mit einem DOIF abgebacken. Es gibt zwar einige Fallstricke, aber wenn man die verstanden hat (und auch nicht wieder vergisst :D ) ist das wirklich eine herrliche Sache, ich bin begeistert. Danke! Auch fürdas IF-Modulden IF-Befehl!
Grüße,
Markus
CFGFN
DEF ([du_Rollo_Zeit_ru] or [du_Rollo_Zeit_ho_WE] or [du_Rollo_Zeit_ho]) (modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseLinks:&DEF])
NAME di_Rollo_SetTime
NR 185
NTFY_ORDER 50-di_Rollo_SetTime
STATE cmd_1
TYPE DOIF
Readings:
2014-12-21 20:57:56 cmd_event du_Rollo_Zeit_ho_WE
2014-12-21 20:57:56 cmd_nr 1
2014-12-21 20:45:42 e_du_Rollo_Zeit_ho_STATE 06:35
2014-12-21 20:57:56 e_du_Rollo_Zeit_ho_WE_STATE 08:00
2014-12-21 20:39:24 e_du_Rollo_Zeit_ru_STATE 20:40
2014-12-21 20:57:56 state cmd_1
Condition:
0 InternalDoIf('du_Rollo_Zeit_ru','STATE','') or InternalDoIf('du_Rollo_Zeit_ho_WE','STATE','') or InternalDoIf('du_Rollo_Zeit_ho','STATE','')
Devices:
0 du_Rollo_Zeit_ru du_Rollo_Zeit_ho_WE du_Rollo_Zeit_ho
all du_Rollo_Zeit_ru du_Rollo_Zeit_ho_WE du_Rollo_Zeit_ho
Do:
0 modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseLinks:&DEF]
Helper:
last_timer 0
sleeptimer -1
Internals:
0 du_Rollo_Zeit_ru:STATE du_Rollo_Zeit_ho_WE:STATE du_Rollo_Zeit_ho:STATE
all du_Rollo_Zeit_ru:STATE du_Rollo_Zeit_ho_WE:STATE du_Rollo_Zeit_ho:STATE
Readings:
State:
Attributes:
do always
room LichtRollo
CFGFN
DEF global:INITIALIZED {Log 3, "----> Initialized: ".Value("du_Rollo_Zeit_ho")}
NAME no_Initialized
NOTIFYDEV global
NR 187
NTFY_ORDER 50-no_Initialized
REGEXP global:INITIALIZED
STATE 2014-12-21 20:57:16
TYPE notify
global:INITIALIZED modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF]
Internals:
DEF ([{sunset("REAL")}-22:35|01234] or [weihn_dr] eq "on" or [{sunset("REAL")}-23:30|56]) (set weihn_dr on) DOELSE (set weihn_dr off)
NAME Weihnachtsbeleuchtung_dr
NR 831
NTFY_ORDER 50-Weihnachtsbeleuchtung_dr
STATE cmd_2
TYPE DOIF
Readings:
2014-12-22 10:11:36 cmd_event weihn_dr
2014-12-22 10:11:36 cmd_nr 2
2014-12-22 10:11:36 e_weihn_dr_STATE off
2014-12-22 10:11:36 state cmd_2
2014-12-21 16:21:30 timer_1_c1 22.12.2014 16:21:59|01234
2014-12-21 22:35:00 timer_2_c1 22.12.2014 22:35:00|01234
2014-12-21 16:21:30 timer_3_c1 22.12.2014 16:21:59|56
2014-12-21 23:30:00 timer_4_c1 22.12.2014 23:30:00|56
Condition:
0 DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"01234") or InternalDoIf('weihn_dr','STATE','') eq "on" or DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"56")
Days:
0 01234
1 01234
2 56
3 56
Devices:
0 weihn_dr
all weihn_dr
Do:
0 set weihn_dr on
1 set weihn_dr off
Helper:
last_timer 4
sleeptimer -1
Internals:
0 weihn_dr:STATE
all weihn_dr:STATE
Readings:
Realtime:
0 16:21:59
1 22:35:00
2 16:21:59
3 23:30:00
State:
Time:
0 {sunset("REAL")}
1 22:35:00
2 {sunset("REAL")}
3 23:30:00
Timecond:
0 0
1 0
2 0
3 0
Timer:
0 0
1 0
2 0
3 0
Timerfunc:
Timers:
0 0 1 2 3
Attributes:
do always
room Weihnachten
2014.12.21 16:21:30 3: FS20 set weihn_dr on
2014.12.21 16:21:30 3: FS20 set weihn_dr on
2014.12.21 16:21:30 3: FS20 set weihn_dr on
2014.12.21 16:21:30 3: FS20 set weihn_wz on
2014.12.21 16:21:30 3: FS20 set weihn_wz on
2014.12.21 22:35:00 3: FS20 set weihn_dr on
2014.12.21 23:30:00 3: FS20 set weihn_dr on
2014.12.21 23:48:35 3: FS20 set weihn_dr off
define di_lightTest DOIF ([{sunset("REAL",0,"16:00","21:00")}]) (set FS_1BEAE8 on-for-timer 3000, set Schalter_1BEA79 on-for-timer 3000, set Brunnen_20C4F6 on-for-timer 3000, {(`echo set myRolS_son on | nc -w 1 192.168.148.17 7072`)}, {(`echo set myRolW_son on | nc -w 1 192.168.148.17 7072`)})
ZitatAngaben, bei denen aufgrund der Definition kein Zustandswechsel erfolgen kann z. B.:
define di_light DOIF ([08:00]) (set switch on)
attr di_light do always
müssen mit Attribut "do always" definiert werden, damit sie nicht nur einmal, sondern jedes mal (hier jeden Tag) ausgeführt werden.
Zitat von: MarkusN am 22 Dezember 2014, 12:27:08
Wenn weihn_dr an ist wird weihn_dr eingeschaltet? Deine erste Bedingung solltest du noch mal überdenken.
Zitator [weihn_dr] eq "on"
Zitat von: dieda am 22 Dezember 2014, 18:23:46Dieser Teil hat aber schon einen wesentlichen Unterschied gemacht, denn vorher war die Kondition immer wahr, wenn weihn_dr erst einmal eingeschaltet war. Das DOIF konnte also gar nicht wieder ausschalten.
Es verhält sich genauso, wenn ich den Teil
rausnehme. Daran liegt es also nicht.
# Squence Test
#
define sKurzerLangerDruck_UR sequence PTM210.Gira.01:BI 0.5 PTM210.Gira.01:buttons:.released
attr sKurzerLangerDruck_UR disable 0
attr sKurzerLangerDruck_UR reportEvents 1
attr sKurzerLangerDruck_UR room 99-Test
attr sKurzerLangerDruck_UR triggerPartial 1
#
# Kurzer Druck
#
define nKurzerDruck_UR notify sKurzerLangerDruck_UR:trigger set TestLampe on
attr nKurzerDruck_UR disable 0
attr nKurzerDruck_UR room 99-Test
#
# Langer Druck
#
define nLangerDruck_UR notify sKurzerLangerDruck_UR:partial_1 set TestLampe off
attr nLangerDruck_UR disable 0
attr nLangerDruck_UR room 99-Test
InternalDoIf('Zeitsteuerung','STATE','') ~= "Dämmerung|Aus": syntax error at (eval 342092) line 1, near ") ~"
( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}|06]))
(set WegLampe_Sw_01 on)
DOELSEIF ( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",9000,"19:00","22:20")}|0123456]))
(set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)
DOELSEIF ([Zeitsteuerung] eq "Dämmerung" and ([00:15|12345] or [01:15|06]))
(set WegLampe_Sw_02 off)
DOELSEIF([Zeitsteuerung] ~= "Dämmerung|Aus")(attr ZufallsTimerAussenlicht disable 1)
DOELSEIF([Zeitsteuerung] eq "Zufall")(attr ZufallsTimerAussenlicht disable 0)
Zitat von: moonsorrox am 23 Dezember 2014, 20:14:58Es muss =~ heißen und nicht ~=.
Hatte das Dummy immer auf Dämmerung und alles lief, nun auf Zufall geht es nicht
wo liegt jetzt der Fehler..?
[16:00-23:00] and [hl.01.Feiertag:state] eq "Heiligabend" and [Taster:buttons] eq "pressed"
Zitat von: Spartacus am 24 Dezember 2014, 12:05:10
Hallo,
ich möchte mit einem DOIF einen Aktor an Heiligabend in der Zeit von 16:00 bis 23:00 einschalten, wenn innerhalb dieser Zeit ein Taster betätigt wird. Um 23:00 geht dann das Licht automatisch aus.Code Auswählen[16:00-23:00] and [hl.01.Feiertag:state] eq "Heiligabend" and [Taster:buttons] eq "pressed"
Das funktioniert leider nicht, da der Taster dirket wieder auf "released" geht und damit die Bedingung nicht mehr erfüllt ist.
Jemand nen Tipp?
Spartacus
[?16:00-23:00] and [hl.01.Feiertag:state] eq "Heiligabend" and [Taster:buttons] eq "pressed"
Zitat von: Damian am 24 Dezember 2014, 12:09:58Danke Damian,
Dazu brauchst du, wie könnte es anders sein, das DOIF-Weihnachtspaket ;) aus dem Nachbarthread.
Dann Zeit mit Fragezeichen angeben:Code Auswählen[?16:00-23:00] and [hl.01.Feiertag:state] eq "Heiligabend" and [Taster:buttons] eq "pressed"
Gruß
Damian
Zitat von: Spartacus am 24 Dezember 2014, 12:22:55
Danke Damian,
aber das ändert doch nichts daran, dass durch das "Released" des Tasters die Bedingung unwahr wird, und dadurch der Aktor wieder ausgeht, oder?
Christian
((([07:00-08:30|12345] and [hl.01.Feiertag:state] eq "none" or
[16:30-22:00|12345] and ([hl.01.Feiertag:state] eq "none" and ![cal.01.Ferien.dum]) or
[08:30-23:00] and [cal.01.Ferien.dum] or
[08:30-23:00] and [hl.01.Feiertag:state] ne "none" or
[08:30-23:00|60]) and (($mday>=25 and $month==12) or ($mday<=12 and $month==1))) or
[16:20-23:00] and [hl.01.Feiertag:state] eq "Heiligabend" and [EG.ss.TK.Haustuer:buttons] eq "pressed" and [?rp.01.EG.ku.SD.Kochinsel] or
[08:30-02:00] and [hl.01.Feiertag:state] eq "Silverster") (set rp.01.EG.ku.SD.Kochinsel on)
DOELSE (set rp.01.EG.ku.SD.Kochinsel off)
Zitat von: Spartacus am 24 Dezember 2014, 12:45:19
Oh sorry Damian,
das stimmt natürlich!
Das ist der Zweig, der bei 16:20 anfängt.Code Auswählen((([07:00-08:30|12345] and [hl.01.Feiertag:state] eq "none" or
[16:30-22:00|12345] and ([hl.01.Feiertag:state] eq "none" and ![cal.01.Ferien.dum]) or
[08:30-23:00] and [cal.01.Ferien.dum] or
[08:30-23:00] and [hl.01.Feiertag:state] ne "none" or
[08:30-23:00|60]) and (($mday>=25 and $month==12) or ($mday<=12 and $month==1))) or
[16:20-23:00] and [hl.01.Feiertag:state] eq "Heiligabend" and [EG.ss.TK.Haustuer:buttons] eq "pressed" and [?rp.01.EG.ku.SD.Kochinsel] or
[08:30-02:00] and [hl.01.Feiertag:state] eq "Silverster") (set rp.01.EG.ku.SD.Kochinsel on)
DOELSE (set rp.01.EG.ku.SD.Kochinsel off)
Attribute sind nicht gesetzt.
da soll gleich der Weihnachtsbaum angehen, wenn die Tür aufgeschlossen wird.... :-)
Christian
[EG.ss.TK.Haustuer:buttons] eq "pressed"
[EG.ss.TK.Haustuer:buttons]
[?rp.01.EG.ku.SD.Kochinsel]
meinst du wahrscheinlich [?rp.01.EG.ku.SD.Kochinsel] ne "on"
Zitat von: Bennemannc am 25 Dezember 2014, 18:47:32Also lt. commandref sollte das so mit "or" gehen. Hatte vorher alles in drei "doif" ( 1 Rauf Woche, 1x rauf WE und 1x runter ) ging aber mit der Unterscheidung von Woche und Wochenende auch nicht. Aktuell heute morgen festgestellt das die Rollade um 06:05 Uhr rauf ging statt um 8:01 Uhr.
Hallo,
also ich würde auf ($we) bzw. auf (!$we). Die Oderverknüpfung vorne sieht etwas komisch aus. Ich weiß nicht ob ($we) auch Feiertage beinhaltet. Müßtest Du mal nachlesen. Zudem habe ich das in zwei "at" gepackt - einer für rauf und einer für runter.
Gruß Christoph
get <name> today
{$we}
in die Komandozeile, sollte heute 1 ausgebenZitat von: Otto am 25 Dezember 2014, 20:50:10get nw today ergibt 1. Weihnachtstag und {$we} ergibt 1
Hallo,
hast du denn holiday abgefragt?Code Auswählenget <name> today
Oder du machst einCode Auswählen{$we}
in die Komandozeile, sollte heute 1 ausgeben
# Steuerung Brahea
define Steuerung_Brahea DOIF ([Temp_Brahea:temperature] <= -4 or [Temp_Brahea:temperature2] <= 2.5) (set Heizung_Sw_01 on) DOELSE (set Heizung_Sw_01 off)
attr Steuerung_Brahea do always
attr Steuerung_Brahea room Balkon
DOIF ([07:00-22:35|7] or [13:00-21:35|8] and [rr_Stefan] eq "home") (set Adventskranz on) DOELSE (set Adventskranz off)
[Temp_Brahea:temperature:d]
Zitat von: der-Lolo am 26 Dezember 2014, 09:48:44
@Alexander
versuch mal das temp reading auf zahlen zu filtern...Code Auswählen[Temp_Brahea:temperature:d]
natürlich für beide..
Ausserdem solltest Du dem sensor das attribut event on change reading geben.
Zitat von: Alexander am 26 Dezember 2014, 09:36:55
Ich würde gerne einen Schalter temperaturabhängig an- und ausschalten. Der Temperatursensor heißt Temp_Brahea und hat die Readings temperature und temperature2. Der Schalter(kanal) heißt Heizung_Sw_01.
Warum erzeugt der folgende Code keine funktionierende Schaltung (bei kleiner gleich -4°C bzw. 2.5°C einschalten, sonst aus)? Stattdessen bekomme ich auf dem HomeMatic USB-Stick einen Highload Fehler.Code Auswählen# Steuerung Brahea
define Steuerung_Brahea DOIF ([Temp_Brahea:temperature] <= -4 or [Temp_Brahea:temperature2] <= 2.5) (set Heizung_Sw_01 on) DOELSE (set Heizung_Sw_01 off)
attr Steuerung_Brahea do always
attr Steuerung_Brahea room Balkon
Zitat von: Damian am 26 Dezember 2014, 10:32:26
Bei zyklisch sendenden Sensoren darfst du kein do always angeben, sonst wird deine Heizung ständig geschaltet.
Gruß
Damian
Zitat von: StefanW am 26 Dezember 2014, 09:47:34
Hallo,
Ich habe ein kleines Problem mit meiner DOIF - Funktion.Code AuswählenDOIF ([07:00-22:35|7] or [13:00-21:35|8] and [rr_Stefan] eq "home") (set Adventskranz on) DOELSE (set Adventskranz off)
Mein Adventskranz soll also am WE und an Feiertagen von 7 - 22.35 Uhr, unter der Woche von 13 - 21.35 Uhr an sein, aber nur wenn ich zu Hause bin.
Globales Attribut holiday2we ist gesetzt ist und eine entsprechende .holiday-Datei ist vorhanden.
Anwesenheit per Residentsmodul funktioniert.
Mein Problem ist nun, das zwar zur richtigen Zeit an & ausgeschaltet wird, aber wenn sich zwischenzeitlich der Anwesenheitsstatus von home auf absent ändert, wird das ignoriert und das Licht bleibt trotzdem an.
Wo liegt da mein Fehler?
Gruß
Stefan
DOIF (([07:00-22:35|7] or [13:00-21:35|8]) and [rr_Stefan] eq "home") (set Adventskranz on) DOELSE (set Adventskranz off)
Zitat von: Alexander am 26 Dezember 2014, 10:35:33
OK, danke. Was würde man hier stattdessen setzen? Nichts?
Die Temperatursensoren senden alle 4 Sekunden. Es soll aber nur geschaltet werden, wenn es auch wirklich etwas zu schalten gibt: on zu off ODER off zu on.
Zitat von: Damian am 26 Dezember 2014, 10:36:03
Du musst die Prioritäten der Operatoren beachten, and kommt vor or, daher ist wohl das, was du meinst:Code AuswählenDOIF (([07:00-22:35|7] or [13:00-21:35|8]) and [rr_Stefan] eq "home") (set Adventskranz on) DOELSE (set Adventskranz off)
Gruß
Damian
Zitat von: Damian am 26 Dezember 2014, 10:44:22
Dann ist wohl kein Wunder, dass HM sich beschwert und dein Log dürfte zugemüllt sein. do always wird nur angegeben, wenn sich das selbe Kommando wiederholen soll, wie beim notify, sonst wird es nicht angegeben. Erklärt wird es im ersten Beispiel zu Ereignissteuerung in der Commandref von DOIF.
Gruß
Damian
Zitat von: Alexander am 26 Dezember 2014, 10:48:45
Vielen Dank! Ich habe die Commandref gelesen, vor lauter Bäumen aber wohl nicht mehr den Wald gesehen.
Kann es sein, dass DOIF ohne do always noch länger braucht, bis der Schalter schaltet? Die Temperatur war nun 5 Minuten unter Soll und jetzt wurde erst eingeschaltet.
Zitat von: Spartacus am 27 Dezember 2014, 17:28:54
Hallo,
ich möchte noch einmal versuchen diese Frage loszuwerden, da ich mir seit tagen den Kopf zerbreche, wie ich das lösen kann:
Wie kann ich in einem DOIF auf ein Event aus einem notify reagieren?
Ich will einen Tasterklick im DOIF auswerten, aber dieser "Klick" wird mittels sequence zwischen "Kurz-" und "Langdruck" unterschieden. Daraus entstehen dann die notifies "trigger" und "partial_x" Und genau dieses Event muss ich irgendwie in einem DOIF weiterverarbeiten...ein Reading gibt es leider nicht!
Hat niemand eine Idee, wie man das lösen kann?
Christian
Zitat von: der-Lolo am 27 Dezember 2014, 19:05:18
ein simpler trigger auf das DOIF selbst geht nicht?
so wie es bei einem notify möglich ist?
(([du_Rollo_Master:state] eq "an") and ([EG_wz_TK_Terrasse:state] eq "closed") and ([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru:state]) and ([{ReadingsVal("du_Rollo_Zeit_ru_start","state","00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende","state","00:00")}]) or
([du_Rollo_Master:state] eq "an") and [{ReadingsVal("du_Rollo_Zeit_ru_ende","state","00:00")}])
(set du_EG_wz_RO_TerrasseLinks off)
DOELSEIF ((([du_Rollo_Master:state] eq "an") and ([EG_wz_TK_Terrasse:state] eq "open")) or
(([du_Rollo_Master:state] eq "an") and ([EG_wz_TK_Terrasse:state] eq "closed") and ([EG_dr_TS_Terrasse:luminosity] > [du_Rollo_Luminosity_ru:state]) and ([{ReadingsVal("du_Rollo_Zeit_ho_start","state","00:00")}-{ReadingsVal("du_Rollo_Zeit_ho_ende","state","00:00")}]) or
([du_Rollo_Master:state] eq "an") and [{ReadingsVal("du_Rollo_Zeit_ho_ende","state","00:00")}]))
(set du_EG_wz_RO_TerrasseLinks on)
(([du_Rollo_Master:state] eq "an") and ([EG_wz_TK_Terrasse:state] eq "closed") and ([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru:state]) and ([10:00-21:30]) or
([du_Rollo_Master:state] eq "an") and [21:30])
(set du_EG_wz_RO_TerrasseLinks off)
DOELSEIF ((([du_Rollo_Master:state] eq "an") and ([EG_wz_TK_Terrasse:state] eq "open")) or
(([du_Rollo_Master:state] eq "an") and ([EG_wz_TK_Terrasse:state] eq "closed") and ([EG_dr_TS_Terrasse:luminosity] > [du_Rollo_Luminosity_ru:state]) and ([06:45-10:00]) or
([du_Rollo_Master:state] eq "an") and [10:00]))
(set du_EG_wz_RO_TerrasseLinks on)
DEF ([du_Rollo_Luminosity_ru] or [du_Rollo_Zeit_ru_start] or [du_Rollo_Zeit_ru_ende] or [du_Rollo_Zeit_ho_start] or [du_Rollo_Zeit_ho_WE_start] or [du_Rollo_Zeit_ho_ende]) (modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF])
NAME di_Rollo_SetTime
NR 27
NTFY_ORDER 50-di_Rollo_SetTime
STATE cmd_1
TYPE DOIF
Readings:
2014-12-29 12:02:21 cmd_event du_Rollo_Zeit_ru_start
2014-12-29 12:02:21 cmd_nr 1
2014-12-22 17:12:39 e_du_Rollo_Zeit_ho_WE_start_STATE 08:30
2014-12-29 12:02:21 e_du_Rollo_Zeit_ru_start_STATE 10:15
2014-12-29 12:02:21 state cmd_1
Condition:
0 InternalDoIf('du_Rollo_Luminosity_ru','STATE','') or InternalDoIf('du_Rollo_Zeit_ru_start','STATE','') or InternalDoIf('du_Rollo_Zeit_ru_ende','STATE','') or InternalDoIf('du_Rollo_Zeit_ho_start','STATE','') or InternalDoIf('du_Rollo_Zeit_ho_WE_start','STATE','') or InternalDoIf('du_Rollo_Zeit_ho_ende','STATE','')
Devices:
0 du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende du_Rollo_Zeit_ho_start du_Rollo_Zeit_ho_WE_start du_Rollo_Zeit_ho_ende
all du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende du_Rollo_Zeit_ho_start du_Rollo_Zeit_ho_WE_start du_Rollo_Zeit_ho_ende
Do:
0 modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF]
Helper:
last_timer 0
sleeptimer -1
Internals:
0 du_Rollo_Luminosity_ru:STATE du_Rollo_Zeit_ru_start:STATE du_Rollo_Zeit_ru_ende:STATE du_Rollo_Zeit_ho_start:STATE du_Rollo_Zeit_ho_WE_start:STATE du_Rollo_Zeit_ho_ende:STATE
all du_Rollo_Luminosity_ru:STATE du_Rollo_Zeit_ru_start:STATE du_Rollo_Zeit_ru_ende:STATE du_Rollo_Zeit_ho_start:STATE du_Rollo_Zeit_ho_WE_start:STATE du_Rollo_Zeit_ho_ende:STATE
State:
Attributes:
do always
group z_doif
room Licht/Rollo
Zitat von: maxritti am 29 Dezember 2014, 12:08:10
Ist das Verhalten ggf so gewollt?
Wenn ja, frage ich hier mal, wie ich mich denn dazu anstellen müsste, diese Parametrierung meiner DOIFs wieder zu ermöglichen? :)
Internals:
CFGFN
DEF ([{ReadingsVal("test_d","state","00:00")}])(set bla on)
NAME di_test
NR 395
NTFY_ORDER 50-di_test
STATE cmd_1
TYPE DOIF
Readings:
2014-12-29 13:02:00 cmd_event timer_1
2014-12-29 13:02:00 cmd_nr 1
2014-12-29 13:02:00 error set bla on: Please define bla first
2014-12-29 13:02:00 state cmd_1
2014-12-29 13:02:00 timer_1_c1 30.12.2014 13:02:00
Condition:
0 DOIF_time_once($hash->{timer}{0},$wday,"")
Days:
Devices:
Do:
0 set bla on
Helper:
last_timer 1
sleeptimer -1
Internals:
Readings:
Realtime:
0 13:02:00
State:
Time:
0 {ReadingsVal("test_d","state","00:00")}
Timecond:
0 0
Timer:
0 0
Timerfunc:
Timers:
0 0
Attributes:
define du_Eingabe dummy
attr du_Eingabe setList state:textField
attr du_Eingabe webCmd state
define du_Ausgabe dummy
define di_Rollo DOIF ([{ReadingsVal("du_Eingabe", "state", "00:00")}]) (set du_Ausgabe "DOIF executed")
define di_SetTime DOIF ([du_Eingabe]) (modify di_Rollo [di_Rollo:&DEF])
attr di_SetTime do always
define di_SetTime DOIF ([du_Eingabe]) (modify di_Rollo [di_Rollo:&DEF])
Zitat von: Damian am 29 Dezember 2014, 14:29:31
OK.
Dass duCode Auswählendefine di_SetTime DOIF ([du_Eingabe]) (modify di_Rollo [di_Rollo:&DEF])
definiert hast, hast du nicht geschrieben.
Zitat von: Damian am 29 Dezember 2014, 14:29:31Das hat tatsächlich etwas mit dem Update zu tun.
Vorher wurde Code in geschweiften Klammern bei einem FHEM-Befehl ausgeführt, wenn er zusätzlich in runde Klammern gepackt wurde, nun wird er auch ohne runde Klammern ausgeführt. Das führt zu diesem Verhalten.
Tja, sollte eine Vereinfachung sein - dann werde ich wohl das alte Verhalten wieder einbauen müssen.
Gruß
Damian
Zitat von: Damian am 27 Dezember 2014, 19:13:10Hallo Damian,
DOIF wertet keine Events aus - hat bisher offenbar noch keiner vermisst. Es wird allerdings durch einen Trigger geweckt, wenn das entsprechende Device angegeben wird.
Eine Auswertung von Events ließe sich aber relativ leicht einbauen.
Gruß
Damian
Zitat von: Spartacus am 29 Dezember 2014, 20:14:28
Hallo Damian,
Ja, das mit dem Dummy habe ich auch schon probiert, Aber so trivial ist das auch nicht, da das Dummy-Device "pressed" nur so lange zeigen darf, wie die Taste gedrückt ist.... habe noch keine Ahnung, wie ich das Event "trigger" oder "partial_n dafür nutzen kann.
Besteht die Chance, dass Event-Auswertungen mit ins DOIF kommen?
Danke und Gruß,
Christian
Dann werde ich den Taster zunächst ohne sequence betreiben....
define seq sequence BT1:on 1 BT1:on
define di DOIF ([seq:?trigger]) (set...)
define ny notify seq:trigger set dum on
define di DOIF ([dum] eq "on") (set ...)
Zitat von: Damian am 29 Dezember 2014, 21:16:54Moin Damian,
Kann ich auf die todo-Liste setzen, allerdings würde mitCode Auswählendefine seq sequence BT1:on 1 BT1:on
Code Auswählendefine di DOIF ([seq:?trigger]) (set...)
nichts anderes sein als:Code Auswählendefine ny notify seq:trigger set dum on
define di DOIF ([dum] eq "on") (set ...)
Gruß
Damian
([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") and [?rp.02.EG.ku.SD.Kochinsel] eq "off")
(set rp.02.EG.ku.SD.Kochinsel on)
DOELSEIF ([PTM210.Gira.01:state] eq "A0" and [rp.02.EG.ku.SD.Kochinsel] eq "off")
(set rp.02.EG.ku.SD.Kochinsel on)
DOELSEIF ([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and [rp.02.EG.ku.SD.Kochinsel] eq "on" and [diEingangsLicht] eq "sensor_on")
(set rp.02.EG.ku.SD.Kochinsel off)
DOELSEIF ([PTM210.Gira.01:state] eq "A0" and [rp.02.EG.ku.SD.Kochinsel] eq "on")
(set rp.02.EG.ku.SD.Kochinsel off)
[00:00-02:00] and [hl.01.Feiertag] eq "Neujahr"
[24:00-02:00] and [hl.01.Feiertag] eq "Silvester"
nehmen wollen, Wertet das DOIF den Zeitraum 24:00 Uhr - 02:00 aus?Zitat von: Spartacus am 30 Dezember 2014, 08:28:38Ein Trigger ist immer als ein Zeitpunkt zu verstehen - einen dauerhaften Zustand gibt es hier nicht. Das würde sich auch nicht ändern, wenn ich Triggerauswertung in DOIF einbauen würde. Der Dummy hat zwar den Zustand "on", getriggert wird das DOIF-Modul allerdings immer nur wenn seq:trigger triggert. Der Zustand des Dummys ist unerheblich an dieser Stelle, wenn man es sonst nirgendwo abfragt.
Moin Damian,
M.E. ist das doch ein Unterschied. Vielleicht durchschaue ich es nicht ganz, aber der Trigger der Sequenz ist ein Impuls( off-on-off), der dann die Aktion im DOIF auslöst. Im zweiten Beispiel bleibt der Dummy auf "on" Das Dummy-Device müsste quasi direkt wieder auf "off" gesetzt werden, damit der Langdruck als Impuls verstanden wird.
Zitat
...noch eine Frage in anderer Sache:
ich möchte Neujahr von 0:00 bis 02:00 eine Lampe einschalten. Das Holiday Modul wird erst um 00:00:02 aktualisiert, sodass ich mitCode Auswählen[00:00-02:00] and [hl.01.Feiertag] eq "Neujahr"
nichts anfangen kann. Stattdessen würde ichCode Auswählen[24:00-02:00] and [hl.01.Feiertag] eq "Silvester"
nehmen wollen, Wertet das DOIF den Zeitraum 24:00 Uhr - 02:00 aus?
Christian
ZitatOb 00:00 oder 24:00 ist egal, das sieht man an den gesetzten Timern. Getriggert wird immer zum Zeitpunkt der gesetzten Timer und wenn hl.01.Feiertag sich ändert. Von 00:00 und 02:00 ist die Abfrage logisch als wahr zu sehen.
ZitatEin Trigger ist immer als ein Zeitpunkt zu verstehen - einen dauerhaften Zustand gibt es hier nicht. Das würde sich auch nicht ändern, wenn ich Triggerauswertung in DOIF einbauen würde. Der Dummy hat zwar den Zustand "on", getriggert wird das DOIF-Modul allerdings immer nur wenn seq:trigger triggert. Der Zustand des Dummys ist unerheblich an dieser Stelle, wenn man es sonst nirgendwo abfragt.Das ist interessant! Bedeutet, dass "on" hier keinerlei Bedeutung hat? Wenn ich also ein zweites mal den Taster betätige, wäre das Dummy-Device ja bereits auf "on". Der Trigger aus der Sequence würde das Dummy Device erneut auf "on" setzten, obwohl es auf "on" ist, und das würde dann tatsächlich die Aktion im DOIF auslösen?
Zitat von: Spartacus am 30 Dezember 2014, 18:51:49
Hallo Damian,
vielen Dank, dann würde das Licht ca. 2s nach Mitternacht angehen (Feiertag ändert sich von Silvester auf Neujahr), wenn ich die Abfrage auf Neujahr lasse, richtig?
Das wäre zu verkraften.Das ist interessant! Bedeutet, dass "on" hier keinerlei Bedeutung hat? Wenn ich also ein zweites mal den Taster betätige, wäre das Dummy-Device ja bereits auf "on". Der Trigger aus der Sequence würde das Dummy Device erneut auf "on" setzten, obwohl es auf "on" ist, und das würde dann tatsächlich die Aktion im DOIF auslösen?
Christian
Gruß,
Christian.
define RGB_Floor_Motion_d dummy attr RGB_Floor_Motion_d room Test # define di_RGB_Floor_Motion_SchalterS DOIF ([MD_FloorS] eq "motion" ) (set RGB_Floor_Motion_d on, set RGB_Floor_Motion_d off) attr di_RGB_Floor_Motion_SchalterS do always attr di_RGB_Floor_Motion_SchalterS room Test # define di_RGB_Floor_Motion_SchalterB DOIF ([MD_FloorB] eq "motion" ) (set RGB_Floor_Motion_d on, set RGB_Floor_Motion_d off) attr di_RGB_Floor_Motion_SchalterB do always attr di_RGB_Floor_Motion_SchalterB room Test # define di_RGB_Floor_Motion_Licht DOIF ([RGB_Floor_Motion_d] eq "on") (set AKT_RGB_Floor1 RGB 0000FF) DOELSE (set AKT_RGB_Floor1 RGB 000000) attr di_RGB_Floor_Motion_Licht room Test attr di_RGB_Floor_Motion_Licht wait 0:120 ###################################################################################################################################### define SEN_SWI_Floor1_FloorLightWhite_d dummy attr SEN_SWI_Floor1_FloorLightWhite_d room Test define di_SEN_SWI_Floor1_FloorLightWhite DOIF ([SEN_SWI_Floor1_FloorLightWhite] =~/short/ ) (set SEN_SWI_Floor1_FloorLightWhite_d short, set SEN_SWI_Floor1_FloorLightWhite_d short_off) DOELSEIF ([SEN_SWI_Floor1_FloorLightWhite] =~/long/) (set SEN_SWI_Floor1_FloorLightWhite_d long, set SEN_SWI_Floor1_FloorLightWhite_d long_off) attr di_SEN_SWI_Floor1_FloorLightWhite do always attr di_SEN_SWI_Floor1_FloorLightWhite room Test define di_AKT_RGB_Floor1 DOIF ([SEN_SWI_Floor1_FloorLightWhite_d] eq "short" or [SEN_SWI_Floor1_FloorLightWhite_d] eq "long") (set AKT_RGB_Floor1 RGB FFFFFF) DOELSEIF ([SEN_SWI_Floor1_FloorLightWhite_d] eq "short_off") (set AKT_RGB_Floor1 RGB 000000) DOELSEIF ([SEN_SWI_Floor1_FloorLightWhite_d] eq "long_off") (set AKT_RGB_Floor1 RGB 000000) DOELSEIF ([MD_FLOORB] eq "on" and [AKT_RGB_Floor1] eq "off") (set AKT_RGB_Floor1 RGB FFFFFF) DOELSEIF ([MD_FLOORB] eq "off") (set AKT_RGB_Floor1 RGB 000000) attr di_AKT_RGB_Floor1 room Test attr di_AKT_RGB_Floor1 wait 0:60:1800:0:10 |
Zitat von: Damian am 30 Dezember 2014, 19:00:36Super!
ja und ja.
Gruß
Damian
(
([16:30-22:30|56] or
[16:30-22:30] and [hl.01.Feiertag:tomorrow] ne "none" or
[16:30-21:30|01234] and [hl.01.Feiertag:tomorrow] eq "none" or
[16:30-02:00] and [hl.01.Feiertag] eq "Silverster"
) and [Tageslicht.dum] eq "dunkel") (set GA.ss.SA.Licht on) DOELSE (set GA.ss.SA.Licht off)
[16:30-02:00] and [?hl.01.Feiertag] eq "Silverster"
Zitat von: Spartacus am 31 Dezember 2014, 09:51:22ja, so wird nur um 16:30 und um 02:00 getriggert und nächstes Jahr sollte die Lampe nicht mehr um Mitternacht zu Silvester angehen.
Super!
Besten Dank.
Eine Sache habe ich noch! Heute Nacht hat meine Gartenbeleuchtung eingeschaltet. Das sollte so nicht passieren und ich glaube, den Fehler auch gefunden zu haben, bin mir aber nicht sicher! Deshalb wäre es prima, wenn noch einmal jemand drüber guckt....Code Auswählen(
([16:30-22:30|56] or
[16:30-22:30] and [hl.01.Feiertag:tomorrow] ne "none" or
[16:30-21:30|01234] and [hl.01.Feiertag:tomorrow] eq "none" or
[16:30-02:00] and [hl.01.Feiertag] eq "Silverster"
) and [Tageslicht.dum] eq "dunkel") (set GA.ss.SA.Licht on) DOELSE (set GA.ss.SA.Licht off)
M.E. hat das Umschalten auf "Silvester" um kurz nach 0:00 Uhr zugeschlagen.
Eigentlich soll das Licht erst heute Nacht, also von Silvester, 16:00 Uhr bis Neujahr 02:00 einschalten.
Reicht es aus, den Trigger für "Feiertag" zu entfernen?Code Auswählen[16:30-02:00] and [?hl.01.Feiertag] eq "Silverster"
Oder funktioniert das nicht?
Danke,
Christian
define sKurzerLangerDruck_UR sequence PTM210.Gira.01:BI 0.5 PTM210.Gira.01:buttons:.released
attr sKurzerLangerDruck_UR triggerPartial 1
...
define nLangerDruck_UR notify sKurzerLangerDruck_UR:partial_1 set LangDruck on
---
define LangDruck dummy
define diEingangsLicht DOIF (([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") and [?rp.02.EG.ku.SD.Kochinsel] eq "off") \
(set rp.02.EG.ku.SD.Kochinsel on)\
DOELSEIF ([LangDruck] eq "on" and [rp.02.EG.ku.SD.Kochinsel] eq "off") \
(set rp.02.EG.ku.SD.Kochinsel on)\
DOELSEIF ([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and [rp.02.EG.ku.SD.Kochinsel] eq "on" and [diEingangsLicht] eq "sensor_on") \
(set rp.02.EG.ku.SD.Kochinsel off)\
DOELSEIF ([LangDruck] eq "on" and [rp.02.EG.ku.SD.Kochinsel] eq "on")\
(set rp.02.EG.ku.SD.Kochinsel off)
attr diEingangsLicht cmdState sensor_on|manual_on|sensor_off|manual_off
attr diEingangsLicht wait 0:0:10:0
[PTM210.Gira.01:state] eq "A0"
ersetze funzt es wie es soll.Zitat von: Papaloewe am 31 Dezember 2014, 10:36:16
@Spartatcus
Schau mal du hast "Silverster" und nicht "Silvester" geschrieben.
define wk.Waschzeit_change dummy
attr wk.Waschzeit_change icon icoUhr
attr wk.Waschzeit_change room Waschkeller
attr wk.Waschzeit_change setList state:time
attr wk.Waschzeit_change userReadings update {return 1}
attr wk.Waschzeit_change webCmd state
DOELSEIF ([wk.Waschzeit_change:update]>0 && [{ReadingsVal("wk.Waschzeit_change","state","00:00")}] && [wk.WaschmaschineWartemodus] eq "on" ) (set wk.WaschmaschineWartemodus off,set wk.Waschmaschine_Betrieb on,set wk.PwrSw_Switch on)
modify wk.Waschmaschine_DI {InternalVal("wk.Waschmaschine_DI","DEF","")}
define wk.WamaSetTime DOIF ([wk.Waschzeit_change]) (modify wk.Waschmaschine_DI [wk.Waschmaschine_DI:&DEF])
aktualsiert das DOIF "wk.Waschmaschine_DI"Zitat von: Sidey am 01 Januar 2015, 22:51:51
Allerdings wird der Abschnitt ReadingsVal nicht durch die Zeit ersetzt, wüsste auch nicht wieso.
Das ginge doch nur, wenn ich ReadingsVal in eine Variable speichere und dann an dieser Stelle den Wert der Varialble einsetze oder?
Grüße Sidey
Zitat von: raimundl am 01 Januar 2015, 14:41:09Dein Modul wird zu Beginn und zum Ende des Zeitintervalls getriggert und jedesmal, wenn Nexus4 etwas sendet. Das Zeitintervall ist von sunset bis 23:00 Uhr wahr. D. h. wenn Nexus4 um 16:03:35 "absent" war, dann wird set ausgeführt und immer dann wenn nexus4 zwischen sunset und 23:00 Uhr sich meldet und "absent" ist, hier offenbar um 16:05:20.
Hallo und Danke für all die Möglichkeiten.
Erste Schritte getan, Anwendung funktioniert - trotzdem die Bitte einen Blick darauf zu werfen:
Was:
Anwesenheitssimulation (wenn Handy Nexus4 absent) durch Einschalten einer Beleuchtung mit Verständigung über Pushover ab "sunset" bis zu einer bestimmten Uhrzeit.
Wie (aus fhem.cfg):
define nichtda DOIF ([{sunset("REAL",0,"15:00","22:00")}-23:00] and ([Nexus4] eq "absent")) (set EG_Decke02 on-till 23:09:50, set Pushover1 msg 'Titel' 'Anwesenheitssimulation' '' 0 '')\
Frage:
Wieso wird bei "sunset" und "absent" der Befehl für die Einschaltung der Beleuchtung und die Verständigung zweimal (Abstand ca. 1 Minute) ausgeführt:
2014-12-31_16:03:35 EG_Decke02 set_on-till 23:09:50
2014-12-31_16:03:36 EG_Decke02 level: 100
2014-12-31_16:03:36 EG_Decke02 pct: 100
2014-12-31_16:03:36 EG_Decke02 deviceMsg: on (to CUL0)
2014-12-31_16:03:36 EG_Decke02 on
2014-12-31_16:03:36 EG_Decke02 timedOn: running
2014-12-31_16:05:20 EG_Decke02 set_on-till 23:09:50
2014-12-31_16:05:22 EG_Decke02 level: 100
2014-12-31_16:05:22 EG_Decke02 pct: 100
2014-12-31_16:05:22 EG_Decke02 deviceMsg: on (to CUL0)
2014-12-31_16:05:22 EG_Decke02 on
2014-12-31_16:05:22 EG_Decke02 timedOn: running
Die Funktion ist dadurch nicht gestört!
LG
Edit: Heute mit "sunset_abs()" probiert - auch zweimal ausgeführt. Es dürfte jeweils mit neuem "sunset-Zeitpunkt" zu tun haben (jeden Tag jetzt ca. 1 Min. später)?
Zitat von: Damian am 01 Januar 2015, 23:22:14
Dein Modul wird zu Beginn und zum Ende des Zeitintervalls getriggert und jedesmal, wenn Nexus4 etwas sendet. Das Zeitintervall ist von sunset bis 23:00 Uhr wahr. D. h. wenn Nexus4 um 16:03:35 "absent" war, dann wird set ausgeführt und immer dann wenn nexus4 zwischen sunset und 23:00 Uhr sich meldet und "absent" ist, hier offenbar um 16:05:20.
Gruß
Damian
Zitat von: raimundl am 02 Januar 2015, 08:31:56
Hallo Damian!
Ich glaube den Grund für das (richtige) Verhalten gefunden zu haben:
"sunset" ist zum Beispiel am 29.12.2014 um 16:35 - bei erreichen dieser Zeit und Nexus4 "absent" wird die Bedingung wahr. Dann jedoch springt "sunset" sofort auf die Zeit vom nächsten Tag, das ist derzeit ca. 2 Min. später, also 16:37 am 30.12.2014 und die Bedingung wird wieder wahr. Daher das zweimalige Schalten. Das Datum wird ja beim Zeitvergleich nicht berücksichtigt?
Danke und LG
(
([16:30-22:30|56] or
[16:30-22:30] and [hl.01.Feiertag:tomorrow] ne "none" or
[16:30-21:30|01234] and [hl.01.Feiertag:tomorrow] eq "none" or
[16:30-02:00] and [?hl.01.Feiertag] eq "Silvester"
) and [Tageslicht.dum] eq "dunkel") (set GA.ss.SA.Licht on) DOELSE (set GA.ss.SA.Licht off)
Zitat von: Spartacus am 02 Januar 2015, 09:37:44
Hallo,
Zunächst wünsche ich allen ein Frohes Neues Jahr und alles Gute für 2015.
Ich bin nun dabei, meine Neujahrs uns Silvester-DOIFs auszuwerrrten. So richtig hat das alles nicht geklappt und versuche nun den Fehler zu finden.Code Auswählen(
([16:30-22:30|56] or
[16:30-22:30] and [hl.01.Feiertag:tomorrow] ne "none" or
[16:30-21:30|01234] and [hl.01.Feiertag:tomorrow] eq "none" or
[16:30-02:00] and [?hl.01.Feiertag] eq "Silvester"
) and [Tageslicht.dum] eq "dunkel") (set GA.ss.SA.Licht on) DOELSE (set GA.ss.SA.Licht off)
Irgendwie hatte ich erwartet, dass mein Licht bis 02:00 Uhr brennt, schaltete sich aber um 00:00:03 Uhr ab. Offenbar wird doch auf den Kalender und "Silvester" getriggert.
Das verstehe ich aber nicht.
Christian
((([EG.ss.TK.Haustuer:buttons] eq "pressed") or
[EG.ss.LS.Eingang:buttons] eq "pressed") and [Tageslicht.dum] eq "dunkel" or
[00:00-02:00] and [?hl.01.Feiertag] eq "Neujahr")
(set EI.ss.SA.Licht on)
DOELSEIF
([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and [?hl.01.Feiertag] ne "Neujahr" )
(set EI.ss.SA.Licht off)
DOELSEIF
(([TK.Notaus.dum] eq "on" or [LS.Notaus.dum] eq "on") and [hl.01.Feiertag] ne "Neujahr")
DOELSEIF
([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and
!([00:00-02:00] and [?hl.01.Feiertag] ne "Neujahr") )
(set EI.ss.SA.Licht off)
Zitat von: Spartacus am 02 Januar 2015, 11:02:41Es gibt keine Rangordnung beim Triggern. Entweder wird zu einem bestimmten Zeitpunkt getriggert oder eben nicht - es wird aber immer die ganze Bedingung ausgewertet. Zukünftig wird man mehrere unabhängige Bedingungen zu einem Kommando definieren können, dann haben sich hoffentlich die unabsichtlichen Abhängigkeiten erledigt.
Hi Damian,
ok, (hoffentlich) verstanden! Das heißt, der Trigger vom Kalender steht über der Zeitangabe. Dann erklären sich auch einige andere Phänomene anderer DOIFs.
ZitatDas macht die Sache unnötig kompliziert und noch mehr unüberschaubar.
Jetzt habe ich in der folgenden Anweisung auch noch einen Fehler. Das Licht wurde gestern an Neujahr durch TK und LS eingeschaltet, aber nicht mehr ausgeschaltet. Ist auch klar, da ich das Abschalten in "cmd2" durch "Neujahr" verhindere. Das ist natürlich Quatsch! Es darf nur während 00:00 und 02:00 an Neujahr verhindert werden.
Muss ich das dann so lösen?Code AuswählenDOELSEIF
([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and
!([00:00-02:00] and [?hl.01.Feiertag] ne "Neujahr") )
(set EI.ss.SA.Licht off)
Beim Notaus (cmd3) dann identisch, damit auch das während 00:00 und 02:00 verhindert wird, richtig?
((([EG.ss.TK.Haustuer:buttons] eq "pressed") or
[EG.ss.LS.Eingang:buttons] eq "pressed") and [Tageslicht.dum] eq "dunkel" or
[00:00] and [?hl.01.Feiertag] eq "Silvester")
(set EI.ss.SA.Licht on)
.....
Zitat von: Spartacus am 02 Januar 2015, 11:38:31
Ich würde das Intervall [00:00-02:00] trennen und ohne Intervall zum Einschalten mit "[00:00] and [...Sylvester]" und zum Abschalten mit "02:00 and [... Neujahr]" definieren.
Hi,
das Einschalten ist mir klar! Das sollte so aussehen:Code Auswählen((([EG.ss.TK.Haustuer:buttons] eq "pressed") or
[EG.ss.LS.Eingang:buttons] eq "pressed") and [Tageslicht.dum] eq "dunkel" or
[00:00] and [?hl.01.Feiertag] eq "Silvester")
(set EI.ss.SA.Licht on)
.....
Aber das Abschalten durch die LS und den TK im DOELSEIF muss ich doch in dem Zeitraum 00:00 bis 02:00 verhindern? Wie soll das ohne Intervall gehen? Das verstehe ich nicht!
Das DOELSEIF (cmd2) hat ein wait von 120sec. als Ausschaltverzögerung. Und dieser Fall darf ja dann nicht eintreten..
Christian
define di.02.EI.ss.SA.Licht DOIF ((([EG.ss.TK.Haustuer:buttons] eq "pressed") or \
[EG.ss.LS.Eingang:buttons] eq "pressed") and [Tageslicht.dum] eq "dunkel" or \
[00:00-02:00] and [?hl.01.Feiertag] eq "Neujahr")\
(set EI.ss.SA.Licht on)\
DOELSEIF\
([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and [hl.01.Feiertag] ne "Neujahr" )\
(set EI.ss.SA.Licht off)\
DOELSEIF \
(([TK.Notaus.dum] eq "on" or [LS.Notaus.dum] eq "on") and [hl.01.Feiertag] ne "Neujahr")\
attr di.02.EI.ss.SA.Licht alias autom. Eingangslicht
attr di.02.EI.ss.SA.Licht cmdState on|off|off
attr di.02.EI.ss.SA.Licht devStateIcon .*on:light_light_dim_100@lightgreen .*off:light_light_dim_00@red
attr di.02.EI.ss.SA.Licht disable 0
attr di.02.EI.ss.SA.Licht initialize cmd_2
attr di.02.EI.ss.SA.Licht room 05-Eingang
attr di.02.EI.ss.SA.Licht wait 0:120:0:0
#
#
# Email senden, wenn Tür länger als 10min auf steht
#
define di.03.EI.ss.SA.Licht DOIF ([EG.ss.TK.Haustuer:buttons] eq "pressed") ({eMail('name@domain.de','Warnung','Haustür steht offen')}, \
set EI.ss.SA.Licht off, set TK.Notaus.dum on)\
attr di.03.EI.ss.SA.Licht alias Warnung Eingang
attr di.03.EI.ss.SA.Licht cmdState Notaus|Leerlauf
attr di.03.EI.ss.SA.Licht room 05-Eingang
attr di.03.EI.ss.SA.Licht wait 600
#
# Email senden, wenn Lichtschranke länger als 10min blockiert ist
#
define di.04.EI.ss.SA.Licht DOIF ([EG.ss.LS.Eingang:buttons] eq "pressed") ({eMail('name@domain.de','WARNUNG! Lichtschranke bockiert!')}, \
set EI.ss.SA.Licht off, set LS.Notaus.dum on)\
attr di.04.EI.ss.SA.Licht alias Warnung Lichtschranke
attr di.04.EI.ss.SA.Licht cmdState Notaus|Leerlauf
attr di.04.EI.ss.SA.Licht room 05-Eingang
attr di.04.EI.ss.SA.Licht wait 600
define diEingangsLicht DOIF (([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") and [?Aktor] eq "off") \
(set Aktor on)\
DOELSEIF ([PTM210.Gira.01:state] eq "A0" and [Aktor] eq "off") \
(set Aktor on)\
DOELSEIF ([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and [Aktor] eq "on" and [diEingangsLicht] eq "sensor_on") \
(set Aktor off)\
DOELSEIF ([PTM210.Gira.01:state] eq "A0" and [Aktor] eq "on")\
(set Aktor off)
attr diEingangsLicht cmdState sensor_on|manual_on|sensor_off|manual_off
attr diEingangsLicht disable 0
attr diEingangsLicht room 99-Test
attr diEingangsLicht wait 0:0:10:0
#
# Squence Test
#
define sKurzerLangerDruck_UR sequence PTM210.Gira.01:BI 0.5 PTM210.Gira.01:buttons:.released
attr sKurzerLangerDruck_UR disable 0
attr sKurzerLangerDruck_UR room 99-Test
attr sKurzerLangerDruck_UR triggerPartial 1
#
# Kurzer Druck
#
define nKurzerDruck_UR notify sKurzerLangerDruck_UR:trigger set TestLampeKurzDruck on
attr nKurzerDruck_UR disable 0
attr nKurzerDruck_UR room 99-Test
#
# Langer Druck
#
define nLangerDruck_UR notify sKurzerLangerDruck_UR:partial_1 set TestLampeLangDruck on
attr nLangerDruck_UR disable 0
attr nLangerDruck_UR room 99-Test
# Dummy für Gira Taster, Langdruck
define LangDruck dummy
attr LangDruck room 99-Test
#
#
define diEingangsLicht DOIF (([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") and [?Aktor] eq "off") \
(set Aktor on)\
DOELSEIF ([?PTM210.Gira.01] eq "BI" and [LangDruck] eq "on" and [Aktor] eq "off") \
(set Aktor on)\
DOELSEIF ([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and [Aktor] eq "on" and [diEingangsLicht] eq "sensor_on") \
(set Aktor off)\
DOELSEIF ([?PTM210.Gira.01] eq "BI" and [LangDruck] eq "on" and [Aktor] eq "on")\
(set Aktor off)
attr diEingangsLicht cmdState sensor_on|manual_on|sensor_off|manual_off
attr diEingangsLicht disable 0
attr diEingangsLicht room 99-Test
attr diEingangsLicht wait 0:0:10:0
Zitat von: maxritti am 01 Januar 2015, 23:13:56
Hi,
ich verstehe jetzt nicht ganz, auf was Du raus willst?
Klappt das nicht mit dem DOIF, welches auf die Änderung in Deinem Zeitdummy reagiert und die DEF des anderen DOIFs ändert?
waitsame 300:0
([wk.PwrSw_Switch] eq "on" && [wk.PwrSw_Power:power] >= 5 && [wk.WaschmaschineWartemodus] eq "on") (set wk.WaschmaschineWartemodus off)
DOELSEIF ([wk.PwrSw_Switch] eq "on" && [wk.PwrSw_Power:power] >= 5 && [wk.WaschmaschineWartemodus] eq "on") (set wk.PwrSw_Switch off)
([Batterielader_aus] eq "on" and [08:01-22:00]) (set LED_15 led red)
DOELSEIF ([Batterielader_aus] eq "off" and [08:01-22:00]) ( set LED_15 led green)
DOELSE (set LED_15 led off)
([Netz_Schuetz_aus] eq "on" and [08:01-22:00]) (set LED_14 led red)
DOELSEIF ([Netz_Schuetz_aus] eq "off" and [08:01-22:00]) (set LED_14 led green)
DOELSE (set LED_14 led off)
Zitat von: Sidey am 02 Januar 2015, 23:15:45
Was ich nun beobachtet habe ist, dass die 2. Bedingung eigentlich nie ausgeführt wird.
Ist es so, dass die Prüfung weiterer Bedingungen Abgebrochen wird, wenn die 1. Bedingung erfüllt ist, egal ob nun waitsame aktiv ist oder nicht?
Mit diese Abfragen wollte ich nur eines erreichen.
Schalte ich die Waschmaschine einmal ein, dann soll die Spannung unterbrochen werden und auf den Timer gewartet werden.
Schalte ich dann aber manuell wieder ein (Abstand von max 5 min zum 1. Einschalten), dann soll die Maschine ihr Programm abspulen.
Ich könnte mir das natürlich auch über einen dummy merken. Dachte nur, es würde vielleicht ohne klappen.
Zitat von: satprofi am 03 Januar 2015, 09:55:06
Hallo Damian.
Ich verzweifle an 2 DOIF, wobei eines wunderbar klappt, das zweite aber nur bedingt.
Ziel ist , eine Led zu steuern die mir den Status des Wechselrichters anzeigt, aber nur zw. bestimmter Zeit.
Das erste klapptCode Auswählen
([Batterielader_aus] eq "on" and [08:01-22:00]) (set LED_15 led red)
DOELSEIF ([Batterielader_aus] eq "off" and [08:01-22:00]) ( set LED_15 led green)
DOELSE (set LED_15 led off)
dieses aber nicht,nur bei statusänderung. warum es nicht die led zündet verstehe ich nichtCode Auswählen
([Netz_Schuetz_aus] eq "on" and [08:01-22:00]) (set LED_14 led red)
DOELSEIF ([Netz_Schuetz_aus] eq "off" and [08:01-22:00]) (set LED_14 led green)
DOELSE (set LED_14 led off)
state von Netz_Schuetz_aus ist "off"
wo ist der fehler?
lg.
Zitat von: Spartacus am 02 Januar 2015, 13:23:14
Damian,
ich bin Dir sehr dankbar für Deine Hilfe! Ich versuche jetzt seit fast 2 Monaten dieses ganze Konstrukt ans Fliegen zu kriegen und stolpere immer wieder über neue Probleme. Die ganze Sache ist sehr komplex und ich habe damals, vor 10 Jahren, auch sehr lange getüftelt, bis das mit der CControl mal lief.Der Ansatz mit dem DOIF ist sicherlich korrekt, aber ich komme einfach nicht weiter:
Ich liste hier nochmals alles auf, wäre echt toll, wenn Du Dir das mal ansiehst. Ich verstehe, dass es nicht ganz einfach ist, fremden Code nachzuvollziehen, aber vielleicht ist mein Ansatz auch nicht korrekt und alles ist viel einfacher!
Sensoren/Aktoren:
1. Taster: (später mit Langdruck über Sequence)
2. Lichtschranke: Ruhezustand->buttons:released, betätigt->buttons:pressed
3. Türkontakt: Tür zu->buttons:released, Tür offen-> buttons:pressed
4. Beleuchtung: Aktor
5. Notaus: Dummy
Abhängigkeiten:
- LS oder TK werden betätigt (buttons:pressed) -> Aktor schaltet ein, Ausschaltverzögerung 120s. (Das ist nötig, weil LS und TK nur einen Impuls abgeben ( released-> pressed-> released). Es soll auch nachgetriggert werden, bis die Notabschaltung greift!
- Der Aktor schaltet direkt ab, wenn der Zusatnd "pressed" bei LS oder TK länger als 10min anliegt. Es wird eine Mail verschickt. (Notabschaltung: Tür steht sehr lange auf, LS ist durch Gegenstand blockiert)
Der Aktor darf erst wieder freigegeben werden, wenn LS und TK auf "released" sind. (Tür ist wieder zu und LS nicht mehr blockiert!; das funktioniert noch nicht!)
- Der Aktor schaltet Neujahr von 0:00 Uhr bis 02:00 Uhr unabhängig vom Zusatand der LS und des TK (pressed, released ist egal; das funktioniert nicht korrekt!)
- Der Taster toggelt unabhängig von allen o.a. Bedingungen den Aktor per Klick auf die obere Wippe (Die Funktion läuft bereits mit dem TestCode, allerdings ohne Sequence) Hier ist zu beachten, dass bei eingeschaltetem Aktor, der Klick auf die Wippe diesen direkt (ohne Ausschaltverzögerung) ausschaltet und umgekehrt.
Die Sequece und die Ansteuerung eines TestLampeKurzDruck/TestlampeLangDruck-Dummys habe ich noch nicht in den Testcode einbauen können. Das klappt mit dem Dummy nicht!
siehe auch (http://forum.fhem.de/index.php/topic,23833.msg237801.html#msg237801 (http://forum.fhem.de/index.php/topic,23833.msg237801.html#msg237801))
Zitat von: Damian am 03 Januar 2015, 10:09:36Hi Damian,
Leider habe ich nicht die Zeit mich in komplexere Probleme der User einzuarbeiten. Vielleicht gibt es hier andere DOIF-User, die etwas mehr Zeit haben und dir helfen können.
Gruß
Damian
define diEingangsLicht DOIF (([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") and [?rp.02.EG.ku.SD.Kochinsel] eq "off") \
(set rp.02.EG.ku.SD.Kochinsel on)\
DOELSEIF ([?PTM210.Gira.01] eq "BI" and [LangDruck] eq "on" and [rp.02.EG.ku.SD.Kochinsel] eq "off") \
(set rp.02.EG.ku.SD.Kochinsel on)\
DOELSEIF ([17:03] and [?hl.01.Feiertag] eq "Silvester1")\
(set rp.02.EG.ku.SD.Kochinsel on)\
DOELSEIF ([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and \
[rp.02.EG.ku.SD.Kochinsel] eq "on" and [diEingangsLicht] eq "sensor_on") \
(set rp.02.EG.ku.SD.Kochinsel off)\
DOELSEIF ([?PTM210.Gira.01] eq "BI" and [LangDruck] eq "on" and [rp.02.EG.ku.SD.Kochinsel] eq "on")\
(set rp.02.EG.ku.SD.Kochinsel off)\
DOELSEIF ([17:10] and [?hl.01.Feiertag] eq "Silvester1")\
(set rp.02.EG.ku.SD.Kochinsel off)
attr diEingangsLicht cmdState sensor_on|manual_on|Silvester_on|sensor_off|manual_off|Silvester_off
attr diEingangsLicht disable 0
attr diEingangsLicht room 99-Test
attr diEingangsLicht wait 0:0:0:120:0
Zitatdieses aber nicht,nur bei statusänderung. warum es nicht die led zündet verstehe ich nicht
Code: [Auswählen]
([Netz_Schuetz_aus] eq "on" and [08:01-22:00]) (set LED_14 led red)
DOELSEIF ([Netz_Schuetz_aus] eq "off" and [08:01-22:00]) (set LED_14 led green)
DOELSE (set LED_14 led off)
state von Netz_Schuetz_aus ist "off"
define Garagenbelueftung_feucht DOIF ([Temperatur_Garage:humidity] > 70 and [Temperatur_Garage:temperature] > 5 and [MyWeather:temperature] > 5 and [Abwesend:state] eq "nein" and [12:00-20:00] and ([MyWeather:humidity] +10 < [Temperatur_Garage:humidity])) (set Garage_Schalten Lueften, define Garage_wieder_Schliessen_2 at +00:15:00 set Garage_Schalten Schliessen)
Zitat von: Sany am 03 Januar 2015, 12:47:02
@satprofi
Hallo Satprofi,
So wie ich das gesamte DOIF verstanden habe muss sich nach dem modify DEF irgendeine der Bedingungen erfüllt werden, um das DOIF von initialized in einen cmd_x Zustand zu versetzen. Es ist nicht so, dass das DOIF von sich aus die Bedingungen durchgeht und bei Erfüllung dann die Ausführung vornimmt. In deinem Beispiel, wenn es zwicheen 8:01 und 22:00 ist, müßte als einmal der Netz_Schuetz_aus seinen Zustand ändern, damit das DOIF in einen cmd_x Zustand kommt und entsprechend schaltet.
Probier das mal und berichte.
Gruß
([Heizungsmode] eq "auto" and [08:00-22:00]) (set LED_09 led green) DOELSE (set LED_09 led off)
Zitat von: satprofi am 04 Januar 2015, 11:50:38
Hallo.
ja, so ist es. Bei statusänderung schaltet ja DOIF, aber warum nicht jetzt?
Um 08:01 wird abgefragt was die Sensoren machen, sehe ich ja in den readings. Vor 08:01 ist die led finster, danach sollte es aber eingeschaltet werden, weil ja um 08:01 der Netzschütz_aus "off" ist. aber er schaltet nicht, sondern meldet "cmd3". Warum? do always ist auch definiert.
Andere Leds klappen ja auch richtig.Code Auswählen
([Heizungsmode] eq "auto" and [08:00-22:00]) (set LED_09 led green) DOELSE (set LED_09 led off)
Zitat von: Damian am 04 Januar 2015, 11:55:51
Dann poste mal den Output von list <dein_doif-modul> von diesem Verhalten.
Gruß
Damian
nternals:
DEF ([Batterielader_aus] eq "on" and [13:28-22:00]) (set LED_15 led red)
DOELSEIF ([Batterielader_aus] eq "off" and [08:01-22:00]) ( set LED_15 led green)
DOELSE (set LED_15 led off)
NAME led15rg
NR 559
NTFY_ORDER 50-led15rg
STATE cmd_1
TYPE DOIF
Readings:
2015-01-04 13:28:00 cmd_event timer_1
2015-01-04 13:28:00 cmd_nr 1
2015-01-04 13:28:00 state cmd_1
2015-01-04 13:28:00 timer_1_c1 05.01.2015 13:28:00
2015-01-04 13:26:27 timer_2_c1 04.01.2015 22:00:00
2015-01-04 13:26:27 timer_3_c2 05.01.2015 08:01:00
2015-01-04 13:26:27 timer_4_c2 04.01.2015 22:00:00
Condition:
0 InternalDoIf('Batterielader_aus','STATE','') eq "on" and DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")
1 InternalDoIf('Batterielader_aus','STATE','') eq "off" and DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"")
Days:
Devices:
0 Batterielader_aus
1 Batterielader_aus
all Batterielader_aus
Do:
0 set LED_15 led red
1 set LED_15 led green
2 set LED_15 led off
Helper:
last_timer 4
sleeptimer -1
Internals:
0 Batterielader_aus:STATE
1 Batterielader_aus:STATE
all Batterielader_aus:STATE
Readings:
Realtime:
0 13:28:00
1 22:00:00
2 08:01:00
3 22:00:00
State:
Time:
0 13:28:00
1 22:00:00
2 08:01:00
3 22:00:00
Timecond:
0 0
1 0
2 1
3 1
Timer:
0 0
1 0
2 0
3 0
Timerfunc:
Timers:
0 0 1
1 2 3
Attributes:
room DOIF
Zitat von: Michi240281 am 04 Januar 2015, 13:05:35
Mal ne allgemeine Frage: Es war ja die Rede davon, dass das DOIF Modul sehr wenig Ressourcen verbraucht. Macht es Sinn, wenn ich meine ganzen notifies in DOIF ändere?
Zitat von: satprofi am 04 Januar 2015, 13:29:34
Hallo.
habe mal die zeit auf 13:28 wegen Test geändert, und komischerweise klappt es .
kann es sein, das mehrere DOIF , die zur selben zeit schalten sollen, sich in die quere kommen?
trotzdem hier der auszugCode Auswählen
nternals:
DEF ([Batterielader_aus] eq "on" and [13:28-22:00]) (set LED_15 led red)
DOELSEIF ([Batterielader_aus] eq "off" and [08:01-22:00]) ( set LED_15 led green)
DOELSE (set LED_15 led off)
NAME led15rg
NR 559
NTFY_ORDER 50-led15rg
STATE cmd_1
TYPE DOIF
Readings:
2015-01-04 13:28:00 cmd_event timer_1
2015-01-04 13:28:00 cmd_nr 1
2015-01-04 13:28:00 state cmd_1
2015-01-04 13:28:00 timer_1_c1 05.01.2015 13:28:00
2015-01-04 13:26:27 timer_2_c1 04.01.2015 22:00:00
2015-01-04 13:26:27 timer_3_c2 05.01.2015 08:01:00
2015-01-04 13:26:27 timer_4_c2 04.01.2015 22:00:00
Condition:
0 InternalDoIf('Batterielader_aus','STATE','') eq "on" and DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")
1 InternalDoIf('Batterielader_aus','STATE','') eq "off" and DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"")
Days:
Devices:
0 Batterielader_aus
1 Batterielader_aus
all Batterielader_aus
Do:
0 set LED_15 led red
1 set LED_15 led green
2 set LED_15 led off
Helper:
last_timer 4
sleeptimer -1
Internals:
0 Batterielader_aus:STATE
1 Batterielader_aus:STATE
all Batterielader_aus:STATE
Readings:
Realtime:
0 13:28:00
1 22:00:00
2 08:01:00
3 22:00:00
State:
Time:
0 13:28:00
1 22:00:00
2 08:01:00
3 22:00:00
Timecond:
0 0
1 0
2 1
3 1
Timer:
0 0
1 0
2 0
3 0
Timerfunc:
Timers:
0 0 1
1 2 3
Attributes:
room DOIF
DOELSEIF (BEDINGUNG) (set DEVICE off ,{DebianMail('pushmail@@gmx.de','Mail Header','Mail Text')})
Zitat von: Sidey am 04 Januar 2015, 19:25:28
Hallöchen allerseits,
ich habe noch ein Problem. Ich versuche aus einem DOIF eine eMail zu versenden.
Das sieht so aus:Code Auswählen
DOELSEIF (BEDINGUNG) (set DEVICE off ,{DebianMail('pushmail@@gmx.de','Mail Header','Mail Text')})
Der Teil in den geschweiften Klammern wird allerdings nicht ausgeführt. set DEVICE off und andere Befehle die davor kommen klappen.
Was mache ich falsch?
Grüße Sidey
([Netz_Schuetz_aus] eq "on" and [08:01-22:00]) (set LED_14 led red)
DOELSEIF ([Netz_Schuetz_aus] eq "off" and [08:01-22:00]) (set LED_14 led green)
DOELSE (set LED_14 led off)
Internals:
DEF 25F54701
NAME Netz_Schuetz_aus
NR 549
STATE off
TYPE CUL_HM
chanNo 01
device HM_4fach_PV
Readings:
2015-01-05 07:00:00 CommandAccepted yes
2014-11-07 10:42:31 R-sign off
2014-11-07 10:56:47 RegL_01: 08:00 00:00
2015-01-05 07:00:00 deviceMsg off (to HM_Cul)
2015-01-05 07:00:00 level 0
2015-01-05 07:00:00 pct 0
2015-01-05 07:00:00 recentStateType ack
2015-01-05 07:00:00 state off
2015-01-05 07:00:00 timedOn off
Helper:
dlvlCmd ++A011123ABC25F5470201000000
Role:
chn 1
prs 1
Attributes:
group PV_Speicher
model HM-LC-SW4-SM
peerIDs 00000000,
room SolarEdge
webCmd statusRequest:on:off
Zitat von: satprofi am 05 Januar 2015, 09:42:40
Hallo Damian.
Heute 08:01 sollte die Led geschaltet werdenCode Auswählen([Netz_Schuetz_aus] eq "on" and [08:01-22:00]) (set LED_14 led red)
DOELSEIF ([Netz_Schuetz_aus] eq "off" and [08:01-22:00]) (set LED_14 led green)
DOELSE (set LED_14 led off)
, leider aber nicht.sie wurde aber um 22:00 ausgeschaltet. bin am verzweifeln wo ich suchen sollCode Auswählen
Internals:
DEF 25F54701
NAME Netz_Schuetz_aus
NR 549
STATE off
TYPE CUL_HM
chanNo 01
device HM_4fach_PV
Readings:
2015-01-05 07:00:00 CommandAccepted yes
2014-11-07 10:42:31 R-sign off
2014-11-07 10:56:47 RegL_01: 08:00 00:00
2015-01-05 07:00:00 deviceMsg off (to HM_Cul)
2015-01-05 07:00:00 level 0
2015-01-05 07:00:00 pct 0
2015-01-05 07:00:00 recentStateType ack
2015-01-05 07:00:00 state off
2015-01-05 07:00:00 timedOn off
Helper:
dlvlCmd ++A011123ABC25F5470201000000
Role:
chn 1
prs 1
Attributes:
group PV_Speicher
model HM-LC-SW4-SM
peerIDs 00000000,
room SolarEdge
webCmd statusRequest:on:off
Internals:
DEF ([Netz_Schuetz_aus] eq "on" and [08:01-22:00]) (set LED_14 led red)
DOELSEIF ([Netz_Schuetz_aus] eq "off" and [08:01-22:00]) (set LED_14 led green)
DOELSE (set LED_14 led off)
NAME led14rg
NR 560
NTFY_ORDER 50-led14rg
STATE cmd_3
TYPE DOIF
Readings:
2015-01-05 08:01:00 cmd_event timer_1
2015-01-05 08:01:00 cmd_nr 3
2015-01-05 07:00:00 e_Netz_Schuetz_aus_STATE off
2015-01-05 08:01:00 state cmd_3
2015-01-05 08:01:00 timer_1_c1 06.01.2015 08:01:00
2015-01-04 22:00:00 timer_2_c1 05.01.2015 22:00:00
2015-01-05 08:01:00 timer_3_c2 06.01.2015 08:01:00
2015-01-04 22:00:00 timer_4_c2 05.01.2015 22:00:00
Condition:
0 InternalDoIf('Netz_Schuetz_aus','STATE','') eq "on" and DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")
1 InternalDoIf('Netz_Schuetz_aus','STATE','') eq "off" and DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"")
Days:
Devices:
0 Netz_Schuetz_aus
1 Netz_Schuetz_aus
all Netz_Schuetz_aus
Do:
0 set LED_14 led red
1 set LED_14 led green
2 set LED_14 led off
Helper:
last_timer 4
sleeptimer -1
Internals:
0 Netz_Schuetz_aus:STATE
1 Netz_Schuetz_aus:STATE
all Netz_Schuetz_aus:STATE
Readings:
Realtime:
0 08:01:00
1 22:00:00
2 08:01:00
3 22:00:00
State:
Time:
0 08:01:00
1 22:00:00
2 08:01:00
3 22:00:00
Timecond:
0 0
1 0
2 1
3 1
Timer:
0 0
1 0
2 0
3 0
Timerfunc:
Timers:
0 0 1
1 2 3
Attributes:
do always
room DOIF
DOIF ([Netz_Schuetz_aus] eq "on" and [08:01-22:00]) (set LED_14 led red)
DOELSEIF ([Netz_Schuetz_aus] eq "off" and [08:01-22:00]) (set LED_14 led green)
DOELSEIF [22:00:05] (set LED_14 led off)
Zitat von: Spartacus am 02 Januar 2015, 13:23:14Hallo,
Damian,
ich bin Dir sehr dankbar für Deine Hilfe! Ich versuche jetzt seit fast 2 Monaten dieses ganze Konstrukt ans Fliegen zu kriegen und stolpere immer wieder über neue Probleme. Die ganze Sache ist sehr komplex und ich habe damals, vor 10 Jahren, auch sehr lange getüftelt, bis das mit der CControl mal lief.Der Ansatz mit dem DOIF ist sicherlich korrekt, aber ich komme einfach nicht weiter:
Ich liste hier nochmals alles auf, wäre echt toll, wenn Du Dir das mal ansiehst. Ich verstehe, dass es nicht ganz einfach ist, fremden Code nachzuvollziehen, aber vielleicht ist mein Ansatz auch nicht korrekt und alles ist viel einfacher!
Sensoren/Aktoren:
1. Taster: (später mit Langdruck über Sequence)
2. Lichtschranke: Ruhezustand->buttons:released, betätigt->buttons:pressed
3. Türkontakt: Tür zu->buttons:released, Tür offen-> buttons:pressed
4. Beleuchtung: Aktor
5. Notaus: Dummy
Abhängigkeiten:
- LS oder TK werden betätigt (buttons:pressed) -> Aktor schaltet ein, Ausschaltverzögerung 120s. (Das ist nötig, weil LS und TK nur einen Impuls abgeben ( released-> pressed-> released). Es soll auch nachgetriggert werden, bis die Notabschaltung greift!
- Der Aktor schaltet direkt ab, wenn der Zusatnd "pressed" bei LS oder TK länger als 10min anliegt. Es wird eine Mail verschickt. (Notabschaltung: Tür steht sehr lange auf, LS ist durch Gegenstand blockiert)
Der Aktor darf erst wieder freigegeben werden, wenn LS und TK auf "released" sind. (Tür ist wieder zu und LS nicht mehr blockiert!; das funktioniert noch nicht!)
- Der Aktor schaltet Neujahr von 0:00 Uhr bis 02:00 Uhr unabhängig vom Zusatand der LS und des TK (pressed, released ist egal; das funktioniert nicht korrekt!)
- Der Taster toggelt unabhängig von allen o.a. Bedingungen den Aktor per Klick auf die obere Wippe (Die Funktion läuft bereits mit dem TestCode, allerdings ohne Sequence) Hier ist zu beachten, dass bei eingeschaltetem Aktor, der Klick auf die Wippe diesen direkt (ohne Ausschaltverzögerung) ausschaltet und umgekehrt.
Die Sequece und die Ansteuerung eines TestLampeKurzDruck/TestlampeLangDruck-Dummys habe ich noch nicht in den Testcode einbauen können. Das klappt mit dem Dummy nicht!
siehe auch (http://forum.fhem.de/index.php/topic,23833.msg237801.html#msg237801 (http://forum.fhem.de/index.php/topic,23833.msg237801.html#msg237801))
altueller Code:Code Auswählen.....
TestCode:Code Auswählen
.....
Ich hoffe, ich konnte es jetzt verständlich und vollständig darstellen.
Ganz lieben Dank und Gruß,
Christian.
# Licht in Abhängigkeit vom Türkontakt und Lichtschranke 120sec einschalten
# Taster für manuellen Betrieb des Eingangslichtes
# Neujahrsbeleuchtung im Eingang für 2h unabhängig vom Notaus
# Email wenn Haustür länger offen steht, oder Lichtschranke blockiert ist
#
define di.02.EI.ss.SA.Licht DOIF (([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") and \
[?EI.ss.SA.Licht] eq "off" and [?LS.TK.Notaus.dum] eq "off" and [?Tageslicht.dum] eq "dunkel") \
(set EI.ss.SA.Licht on)\
DOELSEIF ([seq.01.EG.fl.WS.Eingangslicht:?partial_1] and [EI.ss.SA.Licht] eq "off") \
(set EI.ss.SA.Licht on)\
DOELSEIF ([00:00] and [?hl.01.Feiertag] eq "Silvester")\
(set EI.ss.SA.Licht on)\
DOELSEIF ([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and \
[EI.ss.SA.Licht] eq "on" and [di.02.EI.ss.SA.Licht] eq "Sensor_on") \
(set EI.ss.SA.Licht off)\
DOELSEIF ([seq.01.EG.fl.WS.Eingangslicht:?partial_1] and [EI.ss.SA.Licht] eq "on")\
(set EI.ss.SA.Licht off)\
DOELSEIF ([02:00] and [?hl.01.Feiertag] eq "Neujahr")\
(set EI.ss.SA.Licht off)\
DOELSEIF ([LS.TK.Notaus.dum] eq "on")
attr di.02.EI.ss.SA.Licht alias autom. Eingangslicht
attr di.02.EI.ss.SA.Licht cmdState Sensor_on|manual_on|Silvester_on|Sensor_off|manual_off|Silvester_off|Notaus
attr di.02.EI.ss.SA.Licht disable 0
attr di.02.EI.ss.SA.Licht room 05-Eingang
attr di.02.EI.ss.SA.Licht wait 0:0:0:120:0:0:0
#
#
# Email senden, wenn Tür/ LS länger als 10min auf steht/blockiert ist
#
define di.03.EI.ss.SA.Licht DOIF ([EG.ss.TK.Haustuer:buttons] eq "pressed" and [?di.02.EI.ss.SA.Licht] ne "Silvester_on") ({eMail('name@domain.de','Warnung! Haustür auf!')}, \
set EI.ss.SA.Licht off, set LS.TK.Notaus.dum on)\
DOELSEIF\
([EG.ss.LS.Eingang:buttons] eq "pressed" and [?di.02.EI.ss.SA.Licht] ne "Silvester_on") ({eMail('name@domain.de','WARNUNG! Lichtschranke bockiert!')}, \
set EI.ss.SA.Licht off, set LS.TK.Notaus.dum on)\
DOELSEIF\
([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released")\
(set LS.TK.Notaus.dum off)
attr di.03.EI.ss.SA.Licht alias Warnung Eingang
attr di.03.EI.ss.SA.Licht cmdState Warnung_Tuer|Warnung_LS|Leerlauf
attr di.03.EI.ss.SA.Licht room 05-Eingang
attr di.03.EI.ss.SA.Licht wait 600:600:0
define Garagenbelueftung_feucht DOIF ([Temperatur_Garage:humidity] > 70 and [Garagentor:state] eq "closed" and [Temperatur_Garage:temperature] > 5 and [MyWeather:temperature] > 5 and [Abwesend:state] eq "nein" and [12:00-20:00] and ([MyWeather:humidity_10] < [Temperatur_Garage:humidity])) (set Garage_Schalten Lueften, define Garage_wieder_Schliessen_2 at +00:15:00 set Garage_Schalten Schliessen)
attr Garagenbelueftung_feucht cmdpause 14400
attr Garagenbelueftung_feucht room Garage
Internals:
DEF ([Temperatur_Garage:humidity] > 70 and [Garagentor:state] eq "closed" and [Temperatur_Garage:temperature] > 5 and [MyWeather:temperature] > 5 and [Abwesend:state] eq "nein" and [12:00-20:00] and ([MyWeather:humidity_10] < [Temperatur_Garage:humidity])) (set Garage_Schalten Lueften, define Garage_wieder_Schliessen_2 at +00:15:00 set Garage_Schalten Schliessen)
NAME Garagenbelueftung_feucht
NR 564
NTFY_ORDER 50-Garagenbelueftung_feucht
STATE cmd_2
TYPE DOIF
Readings:
2015-01-04 23:02:57 cmd_event Garagentor
2015-01-04 23:02:57 cmd_nr 2
2015-01-05 16:02:46 e_Abwesend_state nein
2015-01-05 16:02:45 e_Garagentor_state closed
2015-01-05 16:02:41 e_MyWeather_humidity_10 80
2015-01-05 16:02:41 e_MyWeather_temperature 5
2015-01-05 16:26:33 e_Temperatur_Garage_humidity 83
2015-01-05 16:26:33 e_Temperatur_Garage_temperature 6.7
2015-01-04 23:02:57 state cmd_2
2015-01-05 12:00:00 timer_1_c1 06.01.2015 12:00:00
2015-01-04 23:02:47 timer_2_c1 05.01.2015 20:00:00
Condition:
0 ReadingValDoIf('Temperatur_Garage','humidity','') > 70 and ReadingValDoIf('Garagentor','state','') eq "closed" and ReadingValDoIf('Temperatur_Garage','temperature','') > 5 and ReadingValDoIf('MyWeather','temperature','') > 5 and ReadingValDoIf('Abwesend','state','') eq "nein" and DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") and (ReadingValDoIf('MyWeather','humidity_10','') < ReadingValDoIf('Temperatur_Garage','humidity',''))
Days:
Devices:
0 Temperatur_Garage Garagentor MyWeather Abwesend
all Temperatur_Garage Garagentor MyWeather Abwesend
Do:
0 set Garage_Schalten Lueften, define Garage_wieder_Schliessen_2 at +00:15:00 set Garage_Schalten Schliessen
Helper:
last_timer 2
sleeptimer -1
Internals:
Readings:
0 Temperatur_Garage:humidity Garagentor:state Temperatur_Garage:temperature MyWeather:temperature Abwesend:state MyWeather:humidity_10
all Temperatur_Garage:humidity Garagentor:state Temperatur_Garage:temperature MyWeather:temperature Abwesend:state MyWeather:humidity_10
Realtime:
0 12:00:00
1 20:00:00
State:
Time:
0 12:00:00
1 20:00:00
Timecond:
0 0
1 0
Timer:
0 0
1 0
Timerfunc:
Timers:
0 0 1
Attributes:
cmdpause 14400
room Garage
ZitatJetzt gerade sind alle Bedingungen erfüllt,Sicher?
[MyWeather:temperature] > 5
Zitat2015-01-05 16:02:41 e_MyWeather_temperature 5
Zitat von: Puschel74 am 05 Januar 2015, 16:33:43
Hallo,
Sicher?
Das einzige das mir auffällt.Code Auswählen[MyWeather:temperature] > 5
5 ist nicht >5 sondern =5.
Sollte in der Zwischenzeit die Temp. auf 5.1 gewandert sein sollte dein DOIF auch gezündet haben.
Wenn nicht muss Damian schauen.
Grüße
define Garagenbelueftung_feucht DOIF ([Temperatur_Garage:humidity] > 70 and [Garagentor:state] eq "closed" and [Temperatur_Garage:temperature] > 5 and [MyWeather:temperature] > 4 and [Abwesend:state] eq "nein" and [12:00-20:00] and ([MyWeather:humidity_10] < [Temperatur_Garage:humidity])) (set Garage_Schalten Lueften, define Garage_wieder_Schliessen_2 at +00:15:00 set Garage_Schalten Schliessen)
attr Garagenbelueftung_feucht cmdpause 14400
attr Garagenbelueftung_feucht room Garage
Internals:
DEF ([Temperatur_Garage:humidity] > 70 and [Garagentor:state] eq "closed" and [Temperatur_Garage:temperature] > 5 and [MyWeather:temperature] > 4 and [12:00-20:00] and [Abwesend:state] eq "nein" and ([MyWeather:humidity_10] < [Temperatur_Garage:humidity])) (set Garage_Schalten Lueften, define Garage_wieder_Schliessen_2 at +00:15:00 set Garage_Schalten Schliessen)
NAME Garagenbelueftung_feucht
NR 564
NTFY_ORDER 50-Garagenbelueftung_feucht
STATE cmd_2
TYPE DOIF
Readings:
2015-01-05 16:52:10 cmd_event Garagentor
2015-01-05 16:52:10 cmd_nr 2
2015-01-05 16:52:19 e_Garagentor_state closed
2015-01-05 16:51:05 e_MyWeather_humidity_10 80
2015-01-05 16:51:05 e_MyWeather_temperature 5
2015-01-05 16:52:09 e_Temperatur_Garage_humidity 83
2015-01-05 16:52:09 e_Temperatur_Garage_temperature 6.7
2015-01-05 16:52:10 state cmd_2
2015-01-05 16:40:52 timer_1_c1 06.01.2015 12:00:00
2015-01-05 16:40:52 timer_2_c1 05.01.2015 20:00:00
Condition:
0 ReadingValDoIf('Temperatur_Garage','humidity','') > 70 and ReadingValDoIf('Garagentor','state','') eq "closed" and ReadingValDoIf('Temperatur_Garage','temperature','') > 5 and ReadingValDoIf('MyWeather','temperature','') > 4 and DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") and ReadingValDoIf('Abwesend','state','') eq "nein" and (ReadingValDoIf('MyWeather','humidity_10','') < ReadingValDoIf('Temperatur_Garage','humidity',''))
Days:
Devices:
0 Temperatur_Garage Garagentor MyWeather Abwesend
all Temperatur_Garage Garagentor MyWeather Abwesend
Do:
0 set Garage_Schalten Lueften, define Garage_wieder_Schliessen_2 at +00:15:00 set Garage_Schalten Schliessen
Helper:
last_timer 2
sleeptimer -1
Internals:
Readings:
0 Temperatur_Garage:humidity Garagentor:state Temperatur_Garage:temperature MyWeather:temperature Abwesend:state MyWeather:humidity_10
all Temperatur_Garage:humidity Garagentor:state Temperatur_Garage:temperature MyWeather:temperature Abwesend:state MyWeather:humidity_10
Realtime:
0 12:00:00
1 20:00:00
State:
Time:
0 12:00:00
1 20:00:00
Timecond:
0 0
1 0
Timer:
0 0
1 0
Timerfunc:
Timers:
0 0 1
Attributes:
cmdpause 14400
room Garage
Zitat[Garagentor:state] eq "closed"
Zitat2015-01-05 16:52:19 e_Garagentor_state closed
Zitat[Temperatur_Garage:temperature] > 5
Zitat2015-01-05 16:52:09 e_Temperatur_Garage_temperature 6.7
Zitat[Abwesend:state] eq "nein"???
define Garagenbelueftung_feucht DOIF ([Temperatur_Garage:humidity] > 60 and [Garagentor:state] eq "closed" and [Temperatur_Garage:temperature] > 3;
and [Temperatur_Garage:temperature] < 10 and ([Temperatur_Garage:temperature]-[MyWeather:temperature] < 3) and [12:00-20:00] and [Abwesend:state] eq "nein";
and ([MyWeather:humidity_10] < [Temperatur_Garage:humidity])) (set Garage_Schalten Lueften, define Garage_wieder_Schliessen_2 at +00:25:00 set Garage_Schalten Schliessen);
DOELSEIF ([Temperatur_Garage:humidity] > 60 and [Garagentor:state] eq "closed" and [Temperatur_Garage:temperature] > 9 and [Temperatur_Garage:temperature] < 25;
and ([Temperatur_Garage:temperature]-[MyWeather:temperature] < 7) and [12:00-20:00] and [Abwesend:state] eq "nein" and ([MyWeather:humidity_10] < [Temperatur_Garage:humidity]));
(set Garage_Schalten Lueften, define Garage_wieder_Schliessen_2 at +00:25:00 set Garage_Schalten Schliessen)
([wk.PwrSw_Switch] eq "on" && [wk.PwrSw_Power:power] >= 5 && [wk.WaschmaschineWartemodus] eq "off" && [wk.Waschmaschine_Betrieb] eq "off") (set wk.WaschmaschineWartemodus on,set wk.PwrSw_Switch off)
DOELSEIF ([wk.PwrSw_Switch] eq "on" && [wk.PwrSw_Power:power] >= 5 && [wk.WaschmaschineWartemodus] eq "on") (set wk.WaschmaschineWartemodus off,set wk.Waschmaschine_Betrieb on)
2015.01.07 06:40:00.030 3: CUL_HM set OG_elt_RO_Strasse on
2015.01.07 06:40:00.029 3: CUL_HM set OG_elt_RO_Strasse on
CFGFN
DEF ([du_Rollo_Master] eq "an" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}])) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}]))
(set OG_elt_RO_Strasse off)
DOELSEIF ([OG_elt_RO_Strasse] ne "on" and [du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}] and !$we or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}] and $we))
(set OG_elt_RO_Strasse on)
NAME di_OG_elt_RO_Strasse
NR 176
NTFY_ORDER 50-di_OG_elt_RO_Strasse
STATE cmd_2
TYPE DOIF
Readings:
2015-01-07 06:40:00 cmd_event timer_4
2015-01-07 06:40:00 cmd_nr 2
2015-01-07 11:39:36 e_EG_dr_TS_Terrasse_luminosity 146
2015-01-07 06:40:20 e_OG_elt_RO_Strasse_STATE on
2015-01-07 06:40:00 state cmd_2
2015-01-06 18:32:32 timer_1_c1 07.01.2015 16:10:00
2015-01-06 21:30:00 timer_2_c1 07.01.2015 21:30:00
2015-01-06 21:30:00 timer_3_c1 07.01.2015 21:30:00
2015-01-07 06:40:00 timer_4_c2 08.01.2015 06:40:00
2015-01-07 09:30:00 timer_5_c2 08.01.2015 09:30:00
Condition:
0 InternalDoIf('du_Rollo_Master','STATE','') eq "an" and ((ReadingValDoIf('EG_dr_TS_Terrasse','luminosity','') < InternalDoIf('du_Rollo_Luminosity_ru','STATE','') and (DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,""))) or DOIF_time_once($hash->{timer}{2},$wday,""))
1 InternalDoIf('OG_elt_RO_Strasse','STATE','') ne "on" and InternalDoIf('du_Rollo_Master','STATE','') eq "an" and (DOIF_time_once($hash->{timer}{3},$wday,"") and !$we or DOIF_time_once($hash->{timer}{4},$wday,"") and $we)
Days:
Devices:
0 du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru
1 OG_elt_RO_Strasse du_Rollo_Master
all du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru OG_elt_RO_Strasse
Do:
0 set OG_elt_RO_Strasse off
1 set OG_elt_RO_Strasse on
Helper:
last_timer 5
sleeptimer -1
Internals:
0 du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE
1 OG_elt_RO_Strasse:STATE du_Rollo_Master:STATE
all du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE OG_elt_RO_Strasse:STATE
Readings:
0 EG_dr_TS_Terrasse:luminosity
all EG_dr_TS_Terrasse:luminosity
Realtime:
0 16:10:00
1 21:30:00
2 21:30:00
3 06:40:00
4 09:30:00
State:
Time:
0 {ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}
1 {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
2 {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
3 {ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}
4 {ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}
Timecond:
0 0
1 0
2 0
3 1
4 1
Timer:
0 0
1 0
2 0
3 0
4 0
Timerfunc:
Timers:
0 0 1 2
1 3 4
Trigger:
Attributes:
room LichtRollo
Zitat von: maxritti am 07 Januar 2015, 11:41:34
Hallo,
mir ist etwas im FHEM Log aufgefallen.
In meinem FHEM existiert für jeden Rollo ein DOIF, welches aufgrund von Helligkeit, Fensterkontakten etc den Status des Rollos schaltet.
Nun ist mir aufgefallen, dass es u.U. zwei Schaltungen für einen Rollo gibt.
Hier mal einer der Kandidaten, welcher heute morgen auffällig geworden ist:Code Auswählen2015.01.07 06:40:00.030 3: CUL_HM set OG_elt_RO_Strasse on
2015.01.07 06:40:00.029 3: CUL_HM set OG_elt_RO_Strasse on
Zustande gekommen sind diese Schaltvorgänge mMn durch dieses DOIF.Code AuswählenCFGFN
DEF ([du_Rollo_Master] eq "an" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}])) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}]))
(set OG_elt_RO_Strasse off)
DOELSEIF ([OG_elt_RO_Strasse] ne "on" and [du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}] and !$we or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}] and $we))
(set OG_elt_RO_Strasse on)
NAME di_OG_elt_RO_Strasse
NR 176
NTFY_ORDER 50-di_OG_elt_RO_Strasse
STATE cmd_2
TYPE DOIF
Readings:
2015-01-07 06:40:00 cmd_event timer_4
2015-01-07 06:40:00 cmd_nr 2
2015-01-07 11:39:36 e_EG_dr_TS_Terrasse_luminosity 146
2015-01-07 06:40:20 e_OG_elt_RO_Strasse_STATE on
2015-01-07 06:40:00 state cmd_2
2015-01-06 18:32:32 timer_1_c1 07.01.2015 16:10:00
2015-01-06 21:30:00 timer_2_c1 07.01.2015 21:30:00
2015-01-06 21:30:00 timer_3_c1 07.01.2015 21:30:00
2015-01-07 06:40:00 timer_4_c2 08.01.2015 06:40:00
2015-01-07 09:30:00 timer_5_c2 08.01.2015 09:30:00
Condition:
0 InternalDoIf('du_Rollo_Master','STATE','') eq "an" and ((ReadingValDoIf('EG_dr_TS_Terrasse','luminosity','') < InternalDoIf('du_Rollo_Luminosity_ru','STATE','') and (DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,""))) or DOIF_time_once($hash->{timer}{2},$wday,""))
1 InternalDoIf('OG_elt_RO_Strasse','STATE','') ne "on" and InternalDoIf('du_Rollo_Master','STATE','') eq "an" and (DOIF_time_once($hash->{timer}{3},$wday,"") and !$we or DOIF_time_once($hash->{timer}{4},$wday,"") and $we)
Days:
Devices:
0 du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru
1 OG_elt_RO_Strasse du_Rollo_Master
all du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru OG_elt_RO_Strasse
Do:
0 set OG_elt_RO_Strasse off
1 set OG_elt_RO_Strasse on
Helper:
last_timer 5
sleeptimer -1
Internals:
0 du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE
1 OG_elt_RO_Strasse:STATE du_Rollo_Master:STATE
all du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE OG_elt_RO_Strasse:STATE
Readings:
0 EG_dr_TS_Terrasse:luminosity
all EG_dr_TS_Terrasse:luminosity
Realtime:
0 16:10:00
1 21:30:00
2 21:30:00
3 06:40:00
4 09:30:00
State:
Time:
0 {ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}
1 {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
2 {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
3 {ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}
4 {ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}
Timecond:
0 0
1 0
2 0
3 1
4 1
Timer:
0 0
1 0
2 0
3 0
4 0
Timerfunc:
Timers:
0 0 1 2
1 3 4
Trigger:
Attributes:
room LichtRollo
Aufgrund des Timers um 06:40 ist der Rollo hochgefahren worden.
Nur warum stehen im Log von FHEM zwei Schaltvorgänge?
Zitat von: maxritti am 07 Januar 2015, 16:56:13
Ziemlich sicher. Wenn ich ein configdb list mache, kommt die ganze Konfiguration meines FHEMs. Okay bis auf Inhalten von myUtils.pm usw.
In der ganzen Config gibt es ein set OG_elt_RO_Strasse on nur ein einziges mal und zwar genau das in dem DOIF.
Eventuell ist es ja auch ein neues senden vom HMLAN, weil der OG_elt_RO_Strasse auf den ersten Befehl nicht geantwortet hat.
rssi Wert so um die -74.
Könnte man dem DOIF noch mehr Debugging Informationen mit beispielsweise verbose=5 entlocken?
Eigene Antwort:
Das kann ich ja einfach mal setzen und schauen was passiert.
Ich werde das aber mal beobachten und mich ggf noch mal melden.
fhem> {TimeNow()}
2015-01-07 18:37:56
fhem> list wz_heizung_absenkung
Internals:
CFGFN
DEF ([16:00-18:30|8]) (set thr_wz desired 21) DOELSEIF ([18:30-23:00|8]) (set thr_wz desired 22) DOELSEIF ([09:00-11:30|7]) (set thr_wz desired 21) DOELSEIF ([11:30-23:00|7]) (set thr_wz desired 22) DOELSE (set thr_wz desired 20)
NAME wz_heizung_absenkung
NR 66309
NTFY_ORDER 50-wz_heizung_absenkung
STATE cmd_5
TYPE DOIF
Readings:
2015-01-07 18:30:00 cmd_event timer_2
2015-01-07 18:30:00 cmd_nr 5
2015-01-07 18:30:00 state cmd_5
2015-01-07 16:00:00 timer_1_c1 08.01.2015 16:00:00|8
2015-01-07 18:30:00 timer_2_c1 08.01.2015 18:30:00|8
2015-01-07 18:30:00 timer_3_c2 08.01.2015 18:30:00|8
2015-01-06 23:15:25 timer_4_c2 07.01.2015 23:00:00|8
2015-01-07 09:00:00 timer_5_c3 08.01.2015 09:00:00|7
2015-01-07 11:30:00 timer_6_c3 08.01.2015 11:30:00|7
2015-01-07 11:30:00 timer_7_c4 08.01.2015 11:30:00|7
2015-01-06 23:15:25 timer_8_c4 07.01.2015 23:00:00|7
Condition:
0 DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"8")
1 DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"8")
2 DOIF_time($hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,"7")
3 DOIF_time($hash->{realtime}{6},$hash->{realtime}{7},$wday,$hms,"7")
Days:
0 8
1 8
2 8
3 8
4 7
5 7
6 7
7 7
Devices:
Do:
0 set thr_wz desired 21
1 set thr_wz desired 22
2 set thr_wz desired 21
3 set thr_wz desired 22
4 set thr_wz desired 20
Helper:
last_timer 8
sleeptimer -1
Internals:
Readings:
Realtime:
0 16:00:00
1 18:30:00
2 18:30:00
3 23:00:00
4 09:00:00
5 11:30:00
6 11:30:00
7 23:00:00
State:
Time:
0 16:00:00
1 18:30:00
2 18:30:00
3 23:00:00
4 09:00:00
5 11:30:00
6 11:30:00
7 23:00:00
Timecond:
0 0
1 0
2 1
3 1
4 2
5 2
6 3
7 3
Timer:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
Timerfunc:
Timers:
0 0 1
1 2 3
2 4 5
3 6 7
Zitat von: juppzupp am 07 Januar 2015, 18:40:30
Ich glaub ich hab knöpfe auf den augen 8)
Es sollte doch jetzt 22 eingestellt sein, ist aber 20 ?Code Auswählenfhem> {TimeNow()}
2015-01-07 18:37:56Code Auswählenfhem> list wz_heizung_absenkung
Internals:
CFGFN
DEF ([16:00-18:30|8]) (set thr_wz desired 21) DOELSEIF ([18:30-23:00|8]) (set thr_wz desired 22) DOELSEIF ([09:00-11:30|7]) (set thr_wz desired 21) DOELSEIF ([11:30-23:00|7]) (set thr_wz desired 22) DOELSE (set thr_wz desired 20)
NAME wz_heizung_absenkung
NR 66309
NTFY_ORDER 50-wz_heizung_absenkung
STATE cmd_5
TYPE DOIF
Readings:
2015-01-07 18:30:00 cmd_event timer_2
2015-01-07 18:30:00 cmd_nr 5
2015-01-07 18:30:00 state cmd_5
2015-01-07 16:00:00 timer_1_c1 08.01.2015 16:00:00|8
2015-01-07 18:30:00 timer_2_c1 08.01.2015 18:30:00|8
2015-01-07 18:30:00 timer_3_c2 08.01.2015 18:30:00|8
2015-01-06 23:15:25 timer_4_c2 07.01.2015 23:00:00|8
2015-01-07 09:00:00 timer_5_c3 08.01.2015 09:00:00|7
2015-01-07 11:30:00 timer_6_c3 08.01.2015 11:30:00|7
2015-01-07 11:30:00 timer_7_c4 08.01.2015 11:30:00|7
2015-01-06 23:15:25 timer_8_c4 07.01.2015 23:00:00|7
Condition:
0 DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"8")
1 DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"8")
2 DOIF_time($hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,"7")
3 DOIF_time($hash->{realtime}{6},$hash->{realtime}{7},$wday,$hms,"7")
Days:
0 8
1 8
2 8
3 8
4 7
5 7
6 7
7 7
Devices:
Do:
0 set thr_wz desired 21
1 set thr_wz desired 22
2 set thr_wz desired 21
3 set thr_wz desired 22
4 set thr_wz desired 20
Helper:
last_timer 8
sleeptimer -1
Internals:
Readings:
Realtime:
0 16:00:00
1 18:30:00
2 18:30:00
3 23:00:00
4 09:00:00
5 11:30:00
6 11:30:00
7 23:00:00
State:
Time:
0 16:00:00
1 18:30:00
2 18:30:00
3 23:00:00
4 09:00:00
5 11:30:00
6 11:30:00
7 23:00:00
Timecond:
0 0
1 0
2 1
3 1
4 2
5 2
6 3
7 3
Timer:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
Timerfunc:
Timers:
0 0 1
1 2 3
2 4 5
3 6 7
([Temperatur_Garage:humidity] > 60 and [Garagentor:state] eq "closed" and [Temperatur_Garage:temperature] > 3 and [Temperatur_Garage:temperature] < 9 and ([Temperatur_Garage:temperature]-[MyWeather:temperature] < 3) and [12:00-20:00] and [Abwesend:state] eq "nein" and ([MyWeather:humidity_10] < [Temperatur_Garage:humidity])) (set Garage_Schalten Lueften, define Garage_wieder_Schliessen_2 at +00:25:00 set Garage_Schalten Schliessen) DOELSEIF ([Temperatur_Garage:temperature] > 15) (set Garage_Schalten Lueften, define Garage_wieder_Schliessen_3 at +00:25:00 set Garage_Schalten Schliessen)
Zitat von: juppzupp am 07 Januar 2015, 18:52:52
ok, danke.
in der commandref hatte ich gelesen, das immer der erste fall der matched genommen wird, und da doelse ganz hinten steht.......
falsch interpretiert.
Zitat von: Michi240281 am 07 Januar 2015, 19:55:30Der Zustand ist nach der Definition immer "initialized" bis eine Bedingung wahr wird und der Zustand auf cmd.. wechselt und bei dir ist das offenbar bis jetzt nicht der Fall.
Habe immer noch Probleme! Irgendwas scheint mit dem Modul nicht zu stimmen! Habe meinen DOELSEIF Fall mal auf ein Minimum reduziert, dennoch geht der state nur auf initialized!Code Auswählen([Temperatur_Garage:humidity] > 60 and [Garagentor:state] eq "closed" and [Temperatur_Garage:temperature] > 3 and [Temperatur_Garage:temperature] < 9 and ([Temperatur_Garage:temperature]-[MyWeather:temperature] < 3) and [12:00-20:00] and [Abwesend:state] eq "nein" and ([MyWeather:humidity_10] < [Temperatur_Garage:humidity])) (set Garage_Schalten Lueften, define Garage_wieder_Schliessen_2 at +00:25:00 set Garage_Schalten Schliessen) DOELSEIF ([Temperatur_Garage:temperature] > 15) (set Garage_Schalten Lueften, define Garage_wieder_Schliessen_3 at +00:25:00 set Garage_Schalten Schliessen)
Jmd ne Idee?
Zitat von: juppzupp am 07 Januar 2015, 20:08:38
ich steh aufm schlauch. das [16:00-18:30] nicht wahr ist, ist klar, aber warum ist [18:30-23:00|8] dann nicht wahr ?
Zitat von: Damian am 07 Januar 2015, 20:16:11
Als Abhilfe: Definiere den zweiten Timer einfach auf [18:30:01-23:00|8], dann kommt er ziemlich sicher als zweiter dran.
([FS20_S8_B] eq "on" or [FS20_S8_B] eq "dimup") (set huebridge_HUEGroup0 on) wait 3 (set huebridge_HUEGroup0 effect colorloop) DOELSE (set huebridge_HUEGroup0 off)
(set huebridge_HUEGroup0 on, wait 3, set huebridge_HUEGroup0 effect colorloop) DOELSE (set huebridge_HUEGroup0 off)
Zitat von: MaJu am 09 Januar 2015, 15:37:00
Sollte man besser sleep verwenden statt wait?
Zitat von: MaJu am 09 Januar 2015, 15:37:00Weder noch...
Sollte man besser sleep verwenden statt wait?
(set huebridge_HUEGroup0 on, define tmp_blah at +00:03 set huebridge_HUEGroup0 effect colorloop) DOELSE (set huebridge_HUEGroup0 off)
Zitat von: Brockmann am 09 Januar 2015, 16:17:14
Und was genau soll das "wait 3" bewirken???
[/code]
define di_test DOIF (<Bedingung>)(<Kommando1>)wait <sec>(<Kommando2>)
Zitat von: The-Holgi am 09 Januar 2015, 16:46:22Und da steht es auf der "ToDo"-Liste, also als für die Zukunft geplantes Feature.
Das wait 3 Hatte ich aus dem ersten Beitrag:
Internals:
CFGFN
DEF ([du_Rollo_Master] eq "an" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}])) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}]))
(set OG_elt_RO_Strasse off)
DOELSEIF ([OG_elt_RO_Strasse] ne "on" and [du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}] and !$we or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}] and $we))
(set OG_elt_RO_Strasse on)
NAME di_OG_elt_RO_Strasse
NR 176
NTFY_ORDER 50-di_OG_elt_RO_Strasse
STATE cmd_1
TYPE DOIF
Readings:
2015-01-07 16:59:54 cmd_event EG_dr_TS_Terrasse
2015-01-07 16:59:54 cmd_nr 1
2015-01-09 17:00:52 e_EG_dr_TS_Terrasse_luminosity 0.43
2015-01-09 16:58:51 e_OG_elt_RO_Strasse_STATE off
2015-01-07 16:59:54 state cmd_1
2015-01-09 16:10:00 timer_1_c1 10.01.2015 16:10:00
2015-01-08 21:30:00 timer_2_c1 09.01.2015 21:30:00
2015-01-08 21:30:00 timer_3_c1 09.01.2015 21:30:00
2015-01-09 06:40:00 timer_4_c2 10.01.2015 06:40:00
2015-01-09 09:30:00 timer_5_c2 10.01.2015 09:30:00
Condition:
0 InternalDoIf('du_Rollo_Master','STATE','') eq "an" and ((ReadingValDoIf('EG_dr_TS_Terrasse','luminosity','') < InternalDoIf('du_Rollo_Luminosity_ru','STATE','') and (DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,""))) or DOIF_time_once($hash->{timer}{2},$wday,""))
1 InternalDoIf('OG_elt_RO_Strasse','STATE','') ne "on" and InternalDoIf('du_Rollo_Master','STATE','') eq "an" and (DOIF_time_once($hash->{timer}{3},$wday,"") and !$we or DOIF_time_once($hash->{timer}{4},$wday,"") and $we)
Days:
Devices:
0 du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru
1 OG_elt_RO_Strasse du_Rollo_Master
all du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru OG_elt_RO_Strasse
Do:
0 set OG_elt_RO_Strasse off
1 set OG_elt_RO_Strasse on
Helper:
last_timer 5
sleeptimer -1
Internals:
0 du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE
1 OG_elt_RO_Strasse:STATE du_Rollo_Master:STATE
all du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE OG_elt_RO_Strasse:STATE
Readings:
0 EG_dr_TS_Terrasse:luminosity
all EG_dr_TS_Terrasse:luminosity
Realtime:
0 16:10:00
1 21:30:00
2 21:30:00
3 06:40:00
4 09:30:00
State:
Time:
0 {ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}
1 {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
2 {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
3 {ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}
4 {ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}
Timecond:
0 0
1 0
2 0
3 1
4 1
Timer:
0 0
1 0
2 0
3 0
4 0
Timerfunc:
Timers:
0 0 1 2
1 3 4
Trigger:
Attributes:
room LichtRollo
Internals:
CFGFN
DEF ([du_Rollo_Master] eq "an" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}])) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}]))
(set OG_ki1_RO_Carport off)
DOELSEIF ([du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}] and !$we or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}] and $we))
(set OG_ki1_RO_Carport on)
NAME di_OG_ki1_RO_Carport
NR 175
NTFY_ORDER 50-di_OG_ki1_RO_Carport
STATE cmd_1
TYPE DOIF
Readings:
2015-01-09 16:52:23 cmd_event EG_dr_TS_Terrasse
2015-01-09 16:52:23 cmd_nr 1
2015-01-09 17:03:57 e_EG_dr_TS_Terrasse_luminosity 0.36
2015-01-09 16:52:23 state cmd_1
2015-01-09 16:10:00 timer_1_c1 10.01.2015 16:10:00
2015-01-08 21:30:00 timer_2_c1 09.01.2015 21:30:00
2015-01-08 21:30:00 timer_3_c1 09.01.2015 21:30:00
2015-01-09 06:40:00 timer_4_c2 10.01.2015 06:40:00
2015-01-09 09:30:00 timer_5_c2 10.01.2015 09:30:00
Condition:
0 InternalDoIf('du_Rollo_Master','STATE','') eq "an" and ((ReadingValDoIf('EG_dr_TS_Terrasse','luminosity','') < InternalDoIf('du_Rollo_Luminosity_ru','STATE','') and (DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,""))) or DOIF_time_once($hash->{timer}{2},$wday,""))
1 InternalDoIf('du_Rollo_Master','STATE','') eq "an" and (DOIF_time_once($hash->{timer}{3},$wday,"") and !$we or DOIF_time_once($hash->{timer}{4},$wday,"") and $we)
Days:
Devices:
0 du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru
1 du_Rollo_Master
all du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru
Do:
0 set OG_ki1_RO_Carport off
1 set OG_ki1_RO_Carport on
Helper:
last_timer 5
sleeptimer -1
Internals:
0 du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE
1 du_Rollo_Master:STATE
all du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE
Readings:
0 EG_dr_TS_Terrasse:luminosity
all EG_dr_TS_Terrasse:luminosity
Realtime:
0 16:10:00
1 21:30:00
2 21:30:00
3 06:40:00
4 09:30:00
State:
Time:
0 {ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}
1 {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
2 {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
3 {ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}
4 {ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}
Timecond:
0 0
1 0
2 0
3 1
4 1
Timer:
0 0
1 0
2 0
3 0
4 0
Timerfunc:
Timers:
0 0 1 2
1 3 4
Trigger:
Attributes:
room LichtRollo
Zitat von: maxritti am 09 Januar 2015, 17:07:58Naja, es gibt ja einen kleinen, aber feinen Unterschied zwischen den Defintionen, die Du hier aufgelistet hast. Den kannst Du ja auch selbst leicht herausfinden. Höchstwahrscheinlich macht genau dieser Unterschied den ... hm ... Unterschied aus. Tipp: Er liegt nicht im DOIF, sondern im DOELSEIF-Zweig.
Vermutlich sehe ichmal wiederden Wald vor lauter Bäumen nicht.
Es wäre super, wenn da mal einer einen Blick drauf werfen könnte.
Zitat von: Damian am 09 Januar 2015, 16:13:42
Bei sleep in Kombination mit DOIF wird das System für die Zeit stillgelegt. Wait zwischen den Kommandos ist noch nicht realisiert. Z. Zt. ist at die einzige sinnvolle Lösung.
Damian
Zitat von: Brockmann am 09 Januar 2015, 17:41:17
Naja, es gibt ja einen kleinen, aber feinen Unterschied zwischen den Defintionen, die Du hier aufgelistet hast. Den kannst Du ja auch selbst leicht herausfinden. Höchstwahrscheinlich macht genau dieser Unterschied den ... hm ... Unterschied aus. Tipp: Er liegt nicht im DOIF, sondern im DOELSEIF-Zweig.
Vielleicht kann der DOELSEIF-Fall dadurch nie eintreten, dann bleibt das DOIF dauerhaft im cmd_1-Status. Ein erneutes Eintreten der DOIF-Bedingungen führt dann nicht zu einer Statusänderung des DOIFs, also passiert auch nichts. Das ist aber nur eine Vermutung, die zum geschilderten Verhalten passen würde. Zumindest aber ist das erste DOIF ja schon seit zwei Tagen im Status cmd_1, seitdem ist also anscheinend der DOELSEIF-Fall nie eingetreten. Folglich konnte es heute auch nicht auf den DOIF-Fall reagieren.
([?OG_elt_RO_Strasse] ne "off" and [du_Rollo_Master] eq "an" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}])) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}]))
(set OG_elt_RO_Strasse off)
DOELSEIF ([?OG_elt_RO_Strasse] ne "on" and [du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}] and !$we or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}] and $we))
(set OG_elt_RO_Strasse on)
Zitat von: maxritti am 09 Januar 2015, 19:12:19
Danke Dir für den Tip mit dem ?
Ich würde das dann einfach mal so definieren.
Also zu Beginn bei DOIF und bei DOELSEIF die Abfrage des aktuellen Status des Aktors.Code Auswählen([?OG_elt_RO_Strasse] ne "off" and [du_Rollo_Master] eq "an" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}])) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}]))
(set OG_elt_RO_Strasse off)
DOELSEIF ([?OG_elt_RO_Strasse] ne "on" and [du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}] and !$we or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}] and $we))
(set OG_elt_RO_Strasse on)
Mal schauen, ob das funktioniert wie ich das wollte.
[{timer}] and $we
mit [{timer}|7]
angeben.Zitat von: Damian am 09 Januar 2015, 19:25:12
Zeitabfragen mit $we lassen sich eleganter mit statt mitCode Auswählen[{timer}] and $we
mitCode Auswählen[{timer}|7]
angeben.
Gruß
Damian
Zitat von: maxritti am 09 Januar 2015, 19:32:20
Aber damit decke ich doch keine Holiday Informationen ab?
define Lichterkette DOIF ([?18:00-04:00] and [QUAD] eq "on" ) (set Steckdose_B on) DOELSEIF ([QUAD] eq "off") (set Steckdose_B off)
attr Lichterkette do always
{sunset(0,"17:00","21:00")}
Zitat von: bretterknaller am 09 Januar 2015, 20:02:55Code Auswählen{sunset(0,"17:00","21:00")}
Wenn ich es mit sunset mache habe ich ja auch eine feste Schaltzeit z.b 19:34
define Lichterkette DOIF ([?{sunset(0,"17:00","21:00")}-04:00] and [QUAD] eq "on" ) (set Steckdose_B on) DOELSEIF ([QUAD] eq "off") (set Steckdose_B off)
Zitat von: Sidey am 07 Januar 2015, 09:47:10
..
Jetzt passiert folgendes. Wenn die Erste Bedingung wahr ist, wird mein dummy auf in gesetzt.
Danach scheint das Doif erneut getriggert zu werden und die 2. Bedingung ist wahr.Code Auswählen
([wk.PwrSw_Switch] eq "on" && [wk.PwrSw_Power:power] >= 5 && [wk.WaschmaschineWartemodus] eq "off" && [wk.Waschmaschine_Betrieb] eq "off") (set wk.WaschmaschineWartemodus on,set wk.PwrSw_Switch off)
DOELSEIF ([wk.PwrSw_Switch] eq "on" && [wk.PwrSw_Power:power] >= 5 && [wk.WaschmaschineWartemodus] eq "on") (set wk.WaschmaschineWartemodus off,set wk.Waschmaschine_Betrieb on)
Zitat von: Damian am 09 Januar 2015, 20:22:04
Die Zeit ist nicht fest, sondern variiert jeden Tag. Das funktioniert bei DOIF auch mit Fragezeichen :) Probier mal aus. Bei dir dann:Code Auswählendefine Lichterkette DOIF ([?{sunset(0,"17:00","21:00")}-04:00] and [QUAD] eq "on" ) (set Steckdose_B on) DOELSEIF ([QUAD] eq "off") (set Steckdose_B off)
Gruß
Damian
define di_BadU DOIF ([FensterBadU] eq "open") (set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
attr di_BadU do resetwait
attr di_BadU repeatsame 3
attr di_BadU room BadU
attr di_BadU wait 420
Zitat von: blueberry63 am 10 Januar 2015, 15:55:00
Hallo,
ich möchte eine Funktion mit DOIF bauen, die mir einen Klingelton auf meinem Fritzfon abspielt, wenn das Badfenster in der kalten Jahreszeit zu lange auf ist. Hier ist meine Definition:Code Auswählen
define di_BadU DOIF ([FensterBadU] eq "open") (set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
attr di_BadU do resetwait
attr di_BadU repeatsame 3
attr di_BadU room BadU
attr di_BadU wait 420
Nach meinem Verständnis sollte die Aktion nach 7 Min. und danach noch 2x ausgeführt werden, falls das Fenster zwischenzeitlich nicht geschlossen wurde. ES FUNKTIONIERT ABER NUR EINMAL :-(
Was mache ich falsch?
Gruß
Blueberry63
define di_BadU DOIF ([FensterBadU] eq "open")
(set WLANAP2 ring 610 20 Alert show:Fenster zumachen!",sleep 420;set WLANAP2 ring 610 20 Alert show:Fenster zumachen!";sleep 420;set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
attr di_BadU wait 420
define di_BadU1 DOIF ([FensterBadU] eq "open")
(set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
attr di_BadU1 wait 420
define di_BadU2 DOIF ([FensterBadU] eq "open")
(set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
attr di_BadU2 wait 840
define di_BadU3 DOIF ([FensterBadU] eq "open")
(set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
attr di_BadU3 wait 1260
Zitat von: blueberry63 am 10 Januar 2015, 18:28:45Drei DOIFs sind mindestes zwei zuviel. ;)
die Lösung mit den 3 DOIFs werde ich ausprobieren. Ursprünglich hatte ich es mit einem Watchdog probiert, aber das funktionierte nicht.
define di_Bad DOIF ([FensterBadU] eq "open")
(set WLANAP2 ring 610 20 Alert show:Fenster zumachen!)
DOELSEIF ([FensterBadU] eq "open" and [di_Bad] eq "N1")
(set WLANAP2 ring 610 20 Alert show:Fenster zumachen!)
DOELSEIF ([FensterBadU] eq "open" and [di_Bad] eq "N2")
(set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
DOELSEIF ([FensterBadU] eq "closed")
attr di_Bad cmdState N1|N2|N3|N0
attr di_Bad wait 420:420:420
Zitat von: Brockmann am 11 Januar 2015, 08:28:24
Drei DOIFs sind mindestes zwei zuviel. ;)
Folgende Variante müsste es eigentlich auch alleine schaffen, indem sie sich über den cmdstate noch zweimal selbst triggert:Code Auswählen
define di_Bad DOIF ([FensterBadU] eq "open")
(set WLANAP2 ring 610 20 Alert show:Fenster zumachen!)
DOELSEIF ([FensterBadU] eq "open" and [di_Bad] eq "N1")
(set WLANAP2 ring 610 20 Alert show:Fenster zumachen!)
DOELSEIF ([FensterBadU] eq "open" and [di_Bad] eq "N2")
(set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
DOELSEIF ([FensterBadU] eq "closed")
attr di_Bad cmdState N1|N2|N3|N0
attr di_Bad wait 420:420:420
define Licht_25_Januar_an at *07:15:00 {if($year==2011 && $month==1 && $mday==25) {fhem("set Licht1 on")} }
define test99 DOIF ([{$mday==1}]) (set Vitrine an)
Zitat von: Michi240281 am 11 Januar 2015, 16:40:37
Hallo,
ist es möglich, in Verbindung mit dem DOIF Modul jeden 1. eines Monats ein KOmmando zu triggern?
Ich habe folgendes als Ausgangsbasis genommen:Code Auswählendefine Licht_25_Januar_an at *07:15:00 {if($year==2011 && $month==1 && $mday==25) {fhem("set Licht1 on")} }
Also habe ich mir das &mday==25 rausgepickt und folgendes getestet:Code Auswählendefine test99 DOIF ([{$mday==1}]) (set Vitrine an)
Habe gedacht, das müsste vllt gehen, weil in der command ref zum DOIF Modul folgendes steht:
+ Zeitangaben in der Bedingung: [HH:MM:SS] oder [HH:MM] oder [{<perl-function>}]
Aber irgendwie tuts das nicht!
Jmd ne Idee?
define test99 DOIF ([07:15] and $mday==1) (set Vitrine an)
.....
and (($mday>=01 and $month==2) or ($mday<=11 and $month==30))
[00:00-24:00] and ...
lösen?Zitat
define di_Bad DOIF ([FensterBadU] eq "open")
(set WLANAP2 ring 610 20 Alert show:Fenster zumachen!)
DOELSEIF ([FensterBadU] eq "open" and [di_Bad] eq "N1")
(set WLANAP2 ring 610 20 Alert show:Fenster zumachen!)
DOELSEIF ([FensterBadU] eq "open" and [di_Bad] eq "N2")
(set WLANAP2 ring 610 20 Alert show:Fenster zumachen!")
DOELSEIF ([FensterBadU] eq "closed")
attr di_Bad cmdState N1|N2|N3|N0
attr di_Bad wait 420:420:420
Zitat von: MaJu am 12 Januar 2015, 10:55:48Hä? Was soll das denn sein? :o
Probiere mal:
Fenster.*
(Mit Punkt vorm Stern)
ZitatHä? Was soll das denn sein?
Zitat von: Spartacus am 12 Januar 2015, 09:38:50
Hallo,
überlege gerade, wie ich eine Steckdose in einem bestimmten Zeitraum mit Dauersaft versorge. Wenn man den Trigger nicht auf den perl code legen kann!
Der Verbraucher soll zwischen 01.02. und 31.11. dauernd auf "on" sein. Danach schaltet er ab!
das macht man dann ja so...Code Auswählen.....
and (($mday>=01 and $month==2) or ($mday<=11 and $month==30))
nur wo lege ich den Trigger hin?
muss ich das dann mitCode Auswählen[00:00-24:00] and ...
lösen?
Christian
DOIF ([08:00] and $mday == 1 and $month==2) (set lamp on) DOELSEIF ([20:00] and $mday ==30 and $month==11) (set lamp off)
.*:[Bb]attery:.* { if(($EVENT !~ m/ok/) && (time > $main::NewMailtime)) {
my $alias = AttrVal($NAME,"alias",$NAME);
fhem ("set Pushover msg 'FHEM-WARNUNG' '$alias $EVENT'");
$main::NewMailtime = time + 14400;
Log 3, "$NAME: Batteriewarnung $EVENT";
}
}
define BatterieCheck DOIF ([*:[Bb]attery.*]) !=~ "ok") (set Pushover msg 'FHEM-WARNUNG' '$NAME $EVENT')
BatterieCheck DOIF: expected DOELSEIF or DOELSE: !=~ "ok") (set Pushover msg 'FHEM-WARNUNG' '$NAME $EVENT')
Zitat von: Mitch am 12 Januar 2015, 16:08:51Wie wenige Posts zuvor gerade schon mal geschrieben: "Wildcards" sind bei DOIF nicht möglich.
Folgendes habe ich probiert:Code Auswählendefine BatterieCheck DOIF ([*:[Bb]attery.*]) !=~ "ok") (set Pushover msg 'FHEM-WARNUNG' '$NAME $EVENT')
Wird aber, vermutlich wegen den Klammern, nicht angenommen.
Kann ich mit DOIF überhaupt alle Devices überwachen?
define test DOIF ([SCHALTER] eq "off" and ([DEVICE1] eq "on" or [DEVICE2] eq "on" or [DEVICE3] eq "on"...))
([sKurzerLangerDruck_UL:?partial_1] and [outdoorlight] eq "off") (define later at +00:05:00 set outdoorlight off, set outdoorlight on)
DOELSEIF ([sKurzerLangerDruck_UL:?partial_1] and [outdoorlight] eq "on") (delete later, set outdoorlight off)
Zitat von: maxritti am 13 Januar 2015, 17:36:01
Da musst du mMn einfach ein paar Klammern spendieren:Code Auswählendefine test DOIF ([SCHALTER] eq "off" and ([DEVICE1] eq "on" or [DEVICE2] eq "on" or [DEVICE3] eq "on"...))
(([dunkel] eq "on" and [geofency:currLoc_Mitch] =~ "arrived") or ([dunkel] eq "on" and [CUL_HM_HM_RC_Key4_2_26DDB3_open]) or ([dunkel] eq "on" and [CUL_HM_HM_RC_Key4_2_24BFB1_open]) or ([dunkel] eq "on" and [CUL_HM_HM_RC_Key4_2_26DCB2_open]) or ([dunkel] eq "on" and [FS21_5b090]) or ([dunkel] eq "on" and [Klingel1])) (set CUL_HM_Gartenlicht on)
Internals:
CFGFN
DEF (([dunkel] eq "on" and [geofency:currLoc_Mitch] =~ "arrived") or ([dunkel] eq "on" and [CUL_HM_HM_RC_Key4_2_26DD4F_open]) or ([dunkel] eq "on" and [CUL_HM_HM_RC_Key4_2_24BFB5_open]) or ([dunkel] eq "on" and [CUL_HM_HM_RC_Key4_2_26DC6A_open]) or ([dunkel] eq "on" and [FS21_5b090]) or ([dunkel] eq "on" and [Klingel1])) (set CUL_HM_Gartenlicht on)
NAME Gartenlicht.Activator
NR 4439
NTFY_ORDER 50-Gartenlicht.Activator
STATE cmd_1
TYPE DOIF
CHANGETIME:
Readings:
2015-01-13 18:56:52 cmd_event dunkel
2015-01-13 18:56:52 cmd_nr 1
2015-01-13 18:56:52 e_dunkel_STATE on
2015-01-13 18:56:52 state cmd_1
Condition:
0 (InternalDoIf('dunkel','STATE','') eq "on" and ReadingValDoIf('geofency','currLoc_Mitch','') =~ "arrived") or (InternalDoIf('dunkel','STATE','') eq "on" and InternalDoIf('CUL_HM_HM_RC_Key4_2_26DD4F_open','STATE','')) or (InternalDoIf('dunkel','STATE','') eq "on" and InternalDoIf('CUL_HM_HM_RC_Key4_2_24BFB5_open','STATE','')) or (InternalDoIf('dunkel','STATE','') eq "on" and InternalDoIf('CUL_HM_HM_RC_Key4_2_26DC6A_open','STATE','')) or (InternalDoIf('dunkel','STATE','') eq "on" and InternalDoIf('FS21_5b090','STATE','')) or (InternalDoIf('dunkel','STATE','') eq "on" and InternalDoIf('Klingel1','STATE',''))
Devices:
0 dunkel geofency CUL_HM_HM_RC_Key4_2_26DD4F_open CUL_HM_HM_RC_Key4_2_24BFB5_open CUL_HM_HM_RC_Key4_2_26DC6A_open FS21_5b090 Klingel1
all dunkel geofency CUL_HM_HM_RC_Key4_2_26DD4F_open CUL_HM_HM_RC_Key4_2_24BFB5_open CUL_HM_HM_RC_Key4_2_26DC6A_open FS21_5b090 Klingel1
Do:
0 set CUL_HM_Gartenlicht on
Helper:
last_timer 0
sleeptimer -1
Internals:
0 dunkel:STATE CUL_HM_HM_RC_Key4_2_26DD4F_open:STATE CUL_HM_HM_RC_Key4_2_24BFB5_open:STATE CUL_HM_HM_RC_Key4_2_26DC6A_open:STATE FS21_5b090:STATE Klingel1:STATE
all dunkel:STATE CUL_HM_HM_RC_Key4_2_26DD4F_open:STATE CUL_HM_HM_RC_Key4_2_24BFB5_open:STATE CUL_HM_HM_RC_Key4_2_26DC6A_open:STATE FS21_5b090:STATE Klingel1:STATE
Readings:
0 geofency:currLoc_Mitch
all geofency:currLoc_Mitch
State:
Timerfunc:
Trigger:
Attributes:
DbLogExclude .*
do always
verbose 0
Zitat von: Mitch am 13 Januar 2015, 18:57:12
und jetzt? :-[
([dunkel] eq "on" and ([geofency:currLoc_Mitch] =~ "arrived" or [CUL_HM_HM_RC_Key4_2_26DD4F_open] or [CUL_HM_HM_RC_Key4_2_24BFB5_open] or [CUL_HM_HM_RC_Key4_2_26DC6A_open] [FS21_5b090]) or [Klingel1]) (set CUL_HM_Gartenlicht on)
ZitatFiltern nach ZahlenGruss
Es soll aus einem Reading, das z. B. ein Prozentzeichen beinhaltet, nur der Zahlenwert für den Vergleich genutzt werden:
define di_heating DOIF ([adjusting:actuator:d] < 10) (set heating off) DOELSE (set heating on)
Zitat von: Brockmann am 13 Januar 2015, 20:08:29
Jetzt machst Du daraus erstmal:Code Auswählen
([dunkel] eq "on" and ([geofency:currLoc_Mitch] =~ "arrived" or [CUL_HM_HM_RC_Key4_2_26DD4F_open] or [CUL_HM_HM_RC_Key4_2_24BFB5_open] or [CUL_HM_HM_RC_Key4_2_26DC6A_open] [FS21_5b090]) or [Klingel1]) (set CUL_HM_Gartenlicht on)
Ist das gleiche in kürzer und lesbarer.
Dann hast Du da jede Menge Bedingungen der Form ([CUL_HM_HM_RC_Key4_2_26DD4F_open] or [CUL_HM_HM_RC_Key4_2_24BFB5_open] or [CUL_HM_HM_RC_Key4_2_26DC6A_open] [FS21_5b090]) or [Klingel1]) ohne einen Vergleich oder ähnliches drin. Die sind doch eigentlich immer wahr, egal was für einen State das Device hat. Was willst Du damit erreichen?
Zitat von: cotecmania am 13 Januar 2015, 20:25:33
Hallo,
wie kann man denn aus einem Ereignis, das einen String liefert, nur einen bestimmten Teil (Zahl) davon verwenden ?
define DI_StromNOK DOIF ([CUL_EM_1:cum_day] > 10) ...
cum_day liefert "CUM_DAY: 6.542 CUM: 63610.375 COST: 0.00"
Ich habe mit split versucht den Teil2 des strings (6.542) zu extrahieren, bin aber klaeglich gescheitert ...
Folgende regexp wuerde mir die Zahl filtern : (?<=CUM_DAY: )(.*)(?= CUM:)
Wie baue ich das ein ?
Das Beispiel in der commandref (:d) verstehe ich nicht :Gruss
Zitat von: Spartacus am 13 Januar 2015, 17:36:48
Hallo,
ich möchte mit einem LangDruck auf einen Taster einen Aktor toggeln. Allerdings soll dieser in der Einschaltzeit begrenzt sein und automatisch abschalten, falls man es vergisst.Code Auswählen([sKurzerLangerDruck_UL:?partial_1] and [outdoorlight] eq "off") (define later at +00:05:00 set outdoorlight off, set outdoorlight on)
DOELSEIF ([sKurzerLangerDruck_UL:?partial_1] and [outdoorlight] eq "on") (delete later, set outdoorlight off)
Soweit geht das auch mit dem "define later", allerdings hat das Ganze einen Haken. Wenn cmd1 ausgeführt wird und das "later" den Aktor abschaltet, bleibt das DOIF im cmd1 stehen. Das heißt, das erneute Einschalten wird nicht getriggert.
Hat jemand einen Tipp, bzw. kann man das auch einfacher lösen, ohne ein "later" zu definieren?
Christian
([sKurzerLangerDruck_UL:?partial_1] and [?outdoorlight] eq "off") (set outdoorlight on-for-timer 60)
DOELSEIF ([sKurzerLangerDruck_UL:?partial_1] and [?outdoorlight] eq "on") (outdoorlight off)
Zitat von: Mitch am 13 Januar 2015, 20:43:46
die eine Bedingung muss sein, dass dunkel an ist
wenn dann enweder einer der Fernbedienungen (CUL_HM_HM_RC_Key4_2_xxxxxx_open) gedrückt wird ODER mein Handy am Eingang ODER der Schalter FS21_xxx ODER die Klingel gedrückt wird
soll das Licht angehen.
Zitat von: Mitch am 13 Januar 2015, 20:43:46
Ich möchte also jedes Event von den FBs, der Klingel und dem Schalter abfangen.
rename CUL_HM_HM_RC_Key4_2_26DD4F_open Lass_dir_einen_neuen_Namen_einfallen
([Klingel1] ne "mausetot")
([dunkel] eq "on" and ([geofency:currLoc_Mitch] =~ "arrived" or [CUL_HM_HM_RC_Key4_2_26DD4F_open:?open] or [CUL_HM_HM_RC_Key4_2_24BFB5_open:?open] or [CUL_HM_HM_RC_Key4_2_26DC6A_open:?open] [FS21_5b090:?on]) or [Klingel1:?on]) (set CUL_HM_Gartenlicht on)
(([dunkel] eq "on" and [geofency:currLoc_Mitch] eq "Garten") or ([dunkel] eq "on" and [CUL_HM_FB_Leoni_light:?to]) or ([dunkel] eq "on" and [CUL_HM_FB_Markus_light:?to]) or ([dunkel] eq "on" and [CUL_HM_FB_Simone_light:?to]) or ([dunkel] eq "on" and [FS21_5b090:?toggle]) or ([dunkel] eq "on" and [Klingel1:?on])) (set CUL_HM_Gartenlicht on)
([dunkel] eq "on" and ([geofency:currLoc_Mitch] eq "Garten" or [CUL_HM_FB_Markus_light:?to] or [CUL_HM_FB_Simone_light:?to] or [FS21_5b090:?toggle] or [Klingel1:?on])) (set CUL_HM_Gartenlicht on)
Zitat von: MaJu am 14 Januar 2015, 10:29:53
Dann kannst du es auch zusammenfassen und kürzer schreiben:Code Auswählen([dunkel] eq "on" and ([geofency:currLoc_Mitch] eq "Garten" or [CUL_HM_FB_Markus_light:?to] or [CUL_HM_FB_Simone_light:?to] or [FS21_5b090:?toggle] or [Klingel1:?on])) (set CUL_HM_Gartenlicht on)
Zitat von: MaJu am 14 Januar 2015, 10:29:53
Beachte, dass das Licht IMMER eingeschalten ist/wird, wenn bei Dunkelheit dein Geafancy-Status "Garten" ist. Du musst also für "zu Hause" einen anderen Geofancy-Status haben. Und: Soll das Licht auch angehen, wenn du aus dem Haus raus in den Garten gehst? Das wäre aktuell der Fall. Wie geht das Licht dann aber aus?
Zitat von: Mitch am 14 Januar 2015, 11:56:51Hast du OR auch mit den kompletten Bedingungen getestet? Denn die auf der Vorseite genannte Version war ohne Bedingungen, du hattest dort einfach Devices aufgeführt ohne festzulegen, was geprüft werden soll.
mit nur OR hat es nicht funktioniert, deswegen die Verknüfungen in Klammern.
([RolloSZmodus] eq "FHEM" and ([{sunrise_abs(6000,"07:30","08:30")}|12345] or [{sunrise_abs(3600,"08:45","09:20")}|06]))
DOELSEIF ([{sunset("CIVIL",2200,"17:30","22:30")}]) (set RollladenSZ down 30)
DOELSE (set RollladenSZ on)
DOELSEIF([RolloSZmodus] eq "Aus")(set RollladenSZ off)
([RolloSZmodus] eq "Beschattung" and ([MeinWetter:temperature] > 24 and [07:00-{sunset_abs()}])) (set RollladenSZ down 80) DOELSE (set RollladenSZ up 40)
Zitat von: der-Lolo am 15 Januar 2015, 07:19:30
@moonsorrox:
Ich glaube nicht das ein DOELSE vor dem letztem DOELSEIF stehen darf
Zitat von: Damian am 15 Januar 2015, 10:21:12Das glaube ich auch, ich würde die Bedingung umstellen, so das erstmal was gemacht wird und nicht das nichts gemacht wird. Vielleicht kann man auch die erste Anweisung als leer Klammer setzen. Ich zitiere mal die Commandref:
Das glaube ich auch nicht. Zitat aus der Commandref:
+ Es können beliebig viele DOELSEIF-Angaben gemacht werden, sie sind, wie DOELSE am Ende der Kette, optional
Abgesehen davon vermisse ich den Ausführungsteil von der ersten Bedingung.
Gruß
Damian
Zitat von: Damian am 15 Januar 2015, 10:21:12
Abgesehen davon vermisse ich den Ausführungsteil von der ersten Bedingung.
([RolloSZmodus] eq "FHEM" and ([{sunrise_abs(0,"07:30","18:30")}|12345] or [{sunrise_abs(3600,"08:45","09:20")}|06]))
(set RollladenSZ up 30)
DOELSEIF ( [RolloSZmodus] eq "FHEM" and ([{sunset("CIVIL",14000,"20:30","22:20")}|0123456]))
(set RollladenSZ down 30)
DOELSEIF([RolloSZmodus] eq "Aus")()
DOELSEIF([RolloSZmodus] eq "Beschattung" and ([MeinWetter:temperature] > 24 and [07:00-{sunset_abs()}])) (set RollladenSZ down 80) DOELSE (set RollladenSZ up 40)
Zitat von: MaJu am 15 Januar 2015, 15:46:23recht haste, klar wenn keiner der drei FHEM, Beschattung oder Nachtschicht wahr ist macht er auch nichts ;) Danke
Das DOELSEIF([RolloSZmodus] eq "Aus")() kannst du weglassen. Warum prüfst du, wenn du dann doch nichts ausführen lässt?
Zitat von: moonsorrox am 14 Januar 2015, 19:19:14Code Auswählen([RolloSZmodus] eq "FHEM" and ([{sunrise_abs(6000,"07:30","08:30")}|12345] or [{sunrise_abs(3600,"08:45","09:20")}|06]))
DOELSEIF ([{sunset("CIVIL",2200,"17:30","22:30")}]) (set RollladenSZ down 30)
DOELSE (set RollladenSZ on)
DOELSEIF([RolloSZmodus] eq "Aus")(set RollladenSZ off)
Zitat von: MaJu am 15 Januar 2015, 17:45:41ja das ist auch nicht so einfach, ein wenig habe ich mir aus schon vorhandene DOIF abgeschaut, aber begreifen ist die andere Sache ;)
@moonsorrox
Bitte schau dir nochmal den Aufbau von DOIF an. So wie du schreibst, hast du das Prinzip noch nicht ganz erfasst.
Zitat von: MaJu am 15 Januar 2015, 17:45:41soweit ich das verstanden habe prüfe ich ja in der ersten Bedingung auf Wochentag und in der zweiten eben ob Wochenende ist, richtig..?
(Nur) Wenn die erste Bedingung nicht wahr ist, kannst du mit DOELSEIF auf eine zweite Bedingung prüfen lassen und wieder einen Befehl geben was zu tun ist wenn die Bedingung erfüllt ist.
Zitat von: MaJu am 15 Januar 2015, 17:45:41aber DOELSE wird nicht zwingend am Ende gebraucht, oder.? das habe ich ja bei dem neuen umgestellten Code nicht.
Wenn die erste und die zweite Bedingung nicht erfüllt sind, kannst du auf eine dritte prüfen lassen und so weiter.
Und ganz zum Schluss kannst du FHEM mit DOELSE sagen was es tun soll wenn keine der Bedingungen erfüllt ist. Das musst du aber nicht.
Zitat von: MaJu am 15 Januar 2015, 17:45:41ja das ist mir klar, das kann ich raus nehmen, weil ich erkläre es mal so wie ich es verstanden habe...
Es macht einfach absolut keinen Sinn zu prüfen ob RolloSZmodus auf AUS ist, wenn keine Aufgabe gestellt wird insofern die Bedingung erfüllt wurde.
(
[{sunset_abs("HORIZON=-2",0,"16:30","21:30")}-22:30|56] or
[{sunset_abs("HORIZON=-2",0,"16:30","21:30")}-22:30] and [?hl.01.Feiertag:tomorrow] ne "none" or
[{sunset_abs("HORIZON=-2",0,"16:30","21:00")}-21:30|01234] and [?hl.01.Feiertag:tomorrow] eq "none" or
[{sunset_abs("HORIZON=-2",0,"16:30","21:30")}-02:00] and [?hl.01.Feiertag] eq "Silvester")
(set outdoorlight on)
DOELSE (set outdoorlight off)
([wz_licht_stehlampe_schreibtischlampe_sw_01:channelB] eq "BI" and [wz_licht_schreibtisch_ac_01:pct] eq 0 and [wz_licht_stehlampe_schreibtischlampe_sw_01:buttons] eq "pressed") (set wz_licht_schreibtisch_ac_01 pct 50)
DOELSEIF ([wz_licht_stehlampe_schreibtischlampe_sw_01:channelB] eq "BI" and [wz_licht_schreibtisch_ac_01:pct] ne 0 and [wz_licht_stehlampe_schreibtischlampe_sw_01:buttons] eq "pressed") (set wz_licht_schreibtisch_ac_01 pct 100)
DOELSEIF ([wz_licht_stehlampe_schreibtischlampe_sw_01:channelB] eq "B0" and [wz_licht_schreibtisch_ac_01:pct] ne 0 and [wz_licht_stehlampe_schreibtischlampe_sw_01:buttons] eq "pressed") (set wz_licht_schreibtisch_ac_01 pct 0)
2015-01-15 20:13:43 DOIF di_wz_licht_stehlampe_schreibtischlampe_sw_01 cmd_nr: 2
2015-01-15 20:13:43 DOIF di_wz_licht_stehlampe_schreibtischlampe_sw_01 cmd_event: wz_licht_schreibtisch_ac_01
2015-01-15 20:13:43 DOIF di_wz_licht_stehlampe_schreibtischlampe_sw_01 cmd_2
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 bri: 128
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 onoff: 1
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 pct: 50
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 dim50%
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 bri: 254
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 pct: 100
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 on
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 rgb: 000000
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 rgb: 000000
2015-01-15 20:13:43 DOIF di_wz_licht_stehlampe_schreibtischlampe_sw_01 cmd_nr: 1
2015-01-15 20:13:43 DOIF di_wz_licht_stehlampe_schreibtischlampe_sw_01 cmd_event: wz_licht_stehlampe_schreibtischlampe_sw_01
2015-01-15 20:13:43 DOIF di_wz_licht_stehlampe_schreibtischlampe_sw_01 cmd_1
2015-01-15 20:13:43 EnOcean wz_licht_stehlampe_schreibtischlampe_sw_01 buttons: pressed
2015-01-15 20:13:43 EnOcean wz_licht_stehlampe_schreibtischlampe_sw_01 channelB: BI
2015-01-15 20:13:43 EnOcean wz_licht_stehlampe_schreibtischlampe_sw_01 BI
2015-01-15 20:13:43 EnOcean wz_licht_stehlampe_schreibtischlampe_sw_01 buttons: released
2015-01-15 20:13:43 EnOcean wz_licht_stehlampe_schreibtischlampe_sw_01 buttons: released
define wz_licht_stehlampe_schreibtischlampe_sw_01 EnOcean 002A7176
attr wz_licht_stehlampe_schreibtischlampe_sw_01 IODev TCM310
attr wz_licht_stehlampe_schreibtischlampe_sw_01 room EnOcean,Wohnzimmer
attr wz_licht_stehlampe_schreibtischlampe_sw_01 subType switch
define wz_licht_schreibtisch_ac_01 HUEDevice 1
attr wz_licht_schreibtisch_ac_01 userattr lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0
attr wz_licht_schreibtisch_ac_01 IODev huebridge_orpheus
attr wz_licht_schreibtisch_ac_01 alias Schreibtisch
define di_wz_licht_stehlampe_schreibtischlampe_sw_01 DOIF ([wz_licht_stehlampe_schreibtischlampe_sw_01:state] eq "BI" and [wz_licht_schreibtisch_ac_01:pct] eq 0) (set wz_licht_schreibtisch_ac_01 pct 50)\
DOELSEIF ([wz_licht_stehlampe_schreibtischlampe_sw_01:state] eq "BI" and [wz_licht_schreibtisch_ac_01:pct] ne 0) (set wz_licht_schreibtisch_ac_01 pct 100)\
DOELSEIF ([wz_licht_stehlampe_schreibtischlampe_sw_01:state] eq "B0" and [wz_licht_schreibtisch_ac_01:pct] ne 0) (set wz_licht_schreibtisch_ac_01 pct 0)
attr di_wz_licht_stehlampe_schreibtischlampe_sw_01 room EnOcean,Wohnzimmer
Zitat von: Zephyr am 15 Januar 2015, 20:18:18
75 Seiten? Na wenn sich hier jemals wieder eine Lösung anfindet... :-/
([?wz_licht_stehlampe_schreibtischlampe_sw_01:channelB] eq "BI" and [?wz_licht_schreibtisch_ac_01:pct] eq 0 and [wz_licht_stehlampe_schreibtischlampe_sw_01:buttons] eq "pressed") (set wz_licht_schreibtisch_ac_01 pct 50)
DOELSEIF ([?wz_licht_stehlampe_schreibtischlampe_sw_01:channelB] eq "BI" and [?wz_licht_schreibtisch_ac_01:pct] ne 0 and [wz_licht_stehlampe_schreibtischlampe_sw_01:buttons] eq "pressed") (set wz_licht_schreibtisch_ac_01 pct 100)
DOELSEIF ([?wz_licht_stehlampe_schreibtischlampe_sw_01:channelB] eq "B0" and [?wz_licht_schreibtisch_ac_01:pct] ne 0 and [wz_licht_stehlampe_schreibtischlampe_sw_01:buttons] eq "pressed") (set wz_licht_schreibtisch_ac_01 pct 0)
Zitat von: Spartacus am 15 Januar 2015, 20:12:04Da man mit Zeitangaben der Form HH:MM schlecht rechnen kann, muss man es immer wieder umrechnen, um eine Minutendifferenz zu bilden, um damit schlussendlich den tatsächlichen Einschalt und Ausschaltzeitpunkt zu definieren. Das würde ich in Perl-Routinen auslagern, die man dann mit [{begin}-{end}] in der Bedingung angeben kann. Alles andere dürfte in der Bedingung von DOIF recht unübersichtlich werden.
Hallo,
ich möchte hier erreichen, dass outdoorlight immer mindestens 30min eingeschaltet wird, bzw. nicht einschaltet, wenn zwischen Sonnenuntergang und fixer Abschaltzeit weniger als 30min liegen.Code Auswählen(
[{sunset_abs("HORIZON=-2",0,"16:30","21:30")}-22:30|56] or
[{sunset_abs("HORIZON=-2",0,"16:30","21:30")}-22:30] and [?hl.01.Feiertag:tomorrow] ne "none" or
[{sunset_abs("HORIZON=-2",0,"16:30","21:00")}-21:30|01234] and [?hl.01.Feiertag:tomorrow] eq "none" or
[{sunset_abs("HORIZON=-2",0,"16:30","21:30")}-02:00] and [?hl.01.Feiertag] eq "Silvester")
(set outdoorlight on)
DOELSE (set outdoorlight off)
Das funktioniert so halbwegs mit diesem Code, hat aber einen Haken. Im Sommer ist es um 21:30 teilweise noch zu hell für eine Gartenbeleuchtung und es macht eigentlich keinen Sinn das Licht einzuschalten; hier wird aber spätestens um 21:30 bzw. 21:00 eingeschaltet, egal wie dunkel es ist. Da die Abschaltzeit immer fix sein soll, kann ich nicht mit "wait" arbeiten; geht bei Zeiten m.E. sowieso nicht.
Wichtig ist, dass ich aber eine Mindestbrenndauer erreichen will, die von der Ausschaltzeit abzuziehen ist. Der Trigger zum Einschalten kommt dann, wenn "Ausschaltzeit"-"Mindestbrenndauer"<= "Sonnenuntergang(dunkel)" ist.
Hat jemand eine Idee, wie man das am Besten umsetzt?
Christian
([netatmo_indoor:co2]>"1300") (set LED_CO_Warnung on) DOELSEIF ([netatmo_indoor:co2]<"800") (set LED_CO_Warnung off) DOELSE (set LED_Mediteran on)
Zitat von: Ironangel am 15 Januar 2015, 22:15:09
Hallo Damian,
ich habe auch ein Problem mit DOIF. Ist wahrscheinlich ein Anfängerproblem und deshalb war ich auch im Anfängerforum aber da schreibe ich nur mit mir selbst. Ich möchte mein Problem gerne hier schildern.
Ich habe meinen Netatmo im FHEM integriert. Jetzt möchte ich, dass bei überschreiten des Co2 Wertes von 1300 eine Lampe anggeht (WifiLight). und diese erst wieder ausgeht, wenn der Wert 800 erreicht hat. Ich komme aber nicht klar. Mein Code funktioniert nicht und ich komme als Anfänger trotz Lesen der Referenz nicht dahinter. Kannst Du mir auf die Sprünge helfen? Anbei mein Code:Code Auswählen
([netatmo_indoor:co2]>"1300") (set LED_CO_Warnung on) DOELSEIF ([netatmo_indoor:co2]<"800") (set LED_CO_Warnung off) DOELSE (set LED_Mediteran on)
VG,
Jörg
Internals:
DEF ([netatmo_cojones_indoor:co2] > "1300") (set LED_CO_Warnung on) DOELSE (set LED_Mediteran on)
NAME netatmo
NR 35
NTFY_ORDER 50-netatmo
STATE cmd_2
TYPE DOIF
Readings:
2015-01-15 22:07:55 cmd_event netatmo_cojones_indoor
2015-01-15 22:07:55 cmd_nr 2
2015-01-15 22:27:56 e_netatmo_cojones_indoor_co2 837
2015-01-15 22:07:55 state cmd_2
Condition:
0 ReadingValDoIf('netatmo_cojones_indoor','co2','') > "1300"
Devices:
0 netatmo_cojones_indoor
all netatmo_cojones_indoor
Do:
0 set LED_CO_Warnung on
1 set LED_Mediteran on
Helper:
last_timer 0
sleeptimer -1
Internals:
Readings:
0 netatmo_cojones_indoor:co2
all netatmo_cojones_indoor:co2
State:
Timerfunc:
Attributes:
room Home
Zitat von: Ironangel am 15 Januar 2015, 22:30:41
Das?Code Auswählen
Internals:
DEF ([netatmo_cojones_indoor:co2] > "1300") (set LED_CO_Warnung on) DOELSE (set LED_Mediteran on)
NAME netatmo
NR 35
NTFY_ORDER 50-netatmo
STATE cmd_2
TYPE DOIF
Readings:
2015-01-15 22:07:55 cmd_event netatmo_cojones_indoor
2015-01-15 22:07:55 cmd_nr 2
2015-01-15 22:27:56 e_netatmo_cojones_indoor_co2 837
2015-01-15 22:07:55 state cmd_2
Condition:
0 ReadingValDoIf('netatmo_cojones_indoor','co2','') > "1300"
Devices:
0 netatmo_cojones_indoor
all netatmo_cojones_indoor
Do:
0 set LED_CO_Warnung on
1 set LED_Mediteran on
Helper:
last_timer 0
sleeptimer -1
Internals:
Readings:
0 netatmo_cojones_indoor:co2
all netatmo_cojones_indoor:co2
State:
Timerfunc:
Attributes:
room Home
([netatmo_cojones_indoor:co2] > "1300") (set LED_CO_Warnung on) DOELSE (set LED_Mediteran on)
e_netatmo_cojones_indoor_co2 837
state cmd_2
Zitat von: Ironangel am 15 Januar 2015, 22:36:22
Ja, aber nicht wie gewollt.
Ich möchte das die Lampe bei >1300 angeht und erst wieder ausgeht wenn der Wert <800 erreicht und dann erst wieder bei >1300 usw....
([netatmo_indoor:co2]>"1300") (set LED_CO_Warnung on) DOELSEIF ([netatmo_indoor:co2]<"800") (set LED_CO_Warnung off) DOELSE (set LED_Mediteran on)
Zitat von: Ironangel am 15 Januar 2015, 22:45:24
Jo, ich weiss halt nicht wie ich den Bereich von 1300 - 800 definieren soll. Wenn ichCode Auswählen
([netatmo_indoor:co2]>"1300") (set LED_CO_Warnung on) DOELSEIF ([netatmo_indoor:co2]<"800") (set LED_CO_Warnung off) DOELSE (set LED_Mediteran on)
schreibe, klappt es nicht.
([netatmo_cojones_indoor:co2]>"1250") (set LED_Mediteran off,set LED_CO_Warnung on) DOELSEIF ([netatmo_cojones_indoor:co2]<"800") (set LED_CO_Warnung off,******set LED_Mediteran on) DOELSEIF ([16:00-23:59]) (set LED_Mediteran on) DOELSE (set LED_Mediteran off)
set LED_Mediteran on)
(set LED_CO_Warnung off,
(([sec_eingang:state] eq "open" or [iPhoneWlan:state] eq "present" or [iPhone:state] eq "present") and ([?rr_Martin:state] ne "home")) (set rr_Martin home)
DOELSEIF ([iPhoneWlan:state] eq "absent" and [iPhone:state] eq "absent" and [?rr_Martin:state] eq "home" and [sec_eingang:state:sec]<1900) (set rr_Martin absent)
attr hs wait 0:1800
cmd_event sec_eingang 2015-01-15 16:56:31
cmd_nr 1 2015-01-15 16:56:31
e_iPhoneWlan_state absent 2015-01-16 08:10:12
e_iPhone_state absent 2015-01-16 08:09:27
e_sec_eingang_state closed 2015-01-16 08:08:21
state cmd_1 2015-01-15 16:56:31
wait_timer no timer 2015-01-16 08:40:12
Zitat von: Damian am 15 Januar 2015, 20:51:06
Lösung deines Problems sollte recht einfach sein. Durch das Schalten des Lichtest triggerst du dein Modul selbst. Daher solltest du deine Abfrage für den Lichtstatus mit Fragezeichen beginnen, damit dein Modul nicht erneut getriggert wird (das ist in der commandref des Moduls auch erklärt). Eigentlich reicht der trigger für "buttons", alles andere sind reine Abfragen. Also:
Zitat von: MartinMuc am 16 Januar 2015, 08:48:13Das Problem dürfte hier liegen:Code Auswählencmd_event sec_eingang 2015-01-15 16:56:31
cmd_nr 1 2015-01-15 16:56:31
e_iPhoneWlan_state absent 2015-01-16 08:10:12
e_iPhone_state absent 2015-01-16 08:09:27
e_sec_eingang_state closed 2015-01-16 08:08:21
state cmd_1 2015-01-15 16:56:31
wait_timer no timer 2015-01-16 08:40:12
e_sec_eingang_state closed 2015-01-16 08:08:21
[sec_eingang:state:sec]<1900
Internals:
DEF ([netatmo_cojones_indoor:co2]>"1200") (set LED_Mediteran off,set LED_CO_Warnung on) DOELSEIF ([16:00-23:59]) (set LED_Mediteran on) DOELSE (set LED_Mediteran off, set LED_CO_Warnung off)
NAME netatmo
NR 35
NTFY_ORDER 50-netatmo
STATE cmd_3
TYPE DOIF
Readings:
2015-01-16 16:10:29 cmd_event netatmo_cojones_indoor
2015-01-16 16:10:29 cmd_nr 3
2015-01-16 17:40:29 e_netatmo_cojones_indoor_co2 653
2015-01-16 16:10:29 state cmd_3
2015-01-16 16:00:00 timer_1_c2 17.01.2015 16:00:00
2015-01-16 12:11:32 timer_2_c2 16.01.2015 23:59:00
Condition:
0 ReadingValDoIf('netatmo_cojones_indoor','co2','')>"1200"
1 DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")
Days:
Devices:
0 netatmo_cojones_indoor
all netatmo_cojones_indoor
Do:
0 set LED_Mediteran off,set LED_CO_Warnung on
1 set LED_Mediteran on
2 set LED_Mediteran off, set LED_CO_Warnung off
Helper:
last_timer 2
sleeptimer -1
Internals:
Readings:
0 netatmo_cojones_indoor:co2
all netatmo_cojones_indoor:co2
Realtime:
0 16:00:00
1 23:59:00
State:
Time:
0 16:00:00
1 23:59:00
Timecond:
0 1
1 1
Timer:
0 0
1 0
Timerfunc:
Timers:
1 0 1
Attributes:
room Home
([du_Rollo_Master] eq "an" and [?OG_elt_RO_Strasse:state] ne "off" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}])) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}]))
(set OG_elt_RO_Strasse off)
DOELSEIF ([du_Rollo_Master] eq "an" and [?OG_elt_RO_Strasse:state] ne "on" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}|8] or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}|7]))
(set OG_elt_RO_Strasse on)
Internals:
CFGFN
DEF ([du_Rollo_Master] eq "an" and [?OG_elt_RO_Strasse:state] ne "off" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}])) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}]))
(set OG_elt_RO_Strasse off)
DOELSEIF ([du_Rollo_Master] eq "an" and [?OG_elt_RO_Strasse:state] ne "on" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}|8] or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}|7]))
(set OG_elt_RO_Strasse on)
NAME di_OG_elt_RO_Strasse
NR 176
NTFY_ORDER 50-di_OG_elt_RO_Strasse
STATE cmd_1
TYPE DOIF
Readings:
2015-01-15 17:09:42 cmd_event EG_dr_TS_Terrasse
2015-01-15 17:09:42 cmd_nr 1
2015-01-16 18:58:49 e_EG_dr_TS_Terrasse_luminosity 0.14
2015-01-15 17:09:42 state cmd_1
2015-01-16 16:10:00 timer_1_c1 17.01.2015 16:10:00
2015-01-15 21:30:00 timer_2_c1 16.01.2015 21:30:00
2015-01-15 21:30:00 timer_3_c1 16.01.2015 21:30:00
2015-01-16 06:40:00 timer_4_c2 17.01.2015 06:40:00|8
2015-01-16 09:30:00 timer_5_c2 17.01.2015 09:30:00|7
Condition:
0 InternalDoIf('du_Rollo_Master','STATE','') eq "an" and ReadingValDoIf('OG_elt_RO_Strasse','state','') ne "off" and ((ReadingValDoIf('EG_dr_TS_Terrasse','luminosity','') < InternalDoIf('du_Rollo_Luminosity_ru','STATE','') and (DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,""))) or DOIF_time_once($hash->{timer}{2},$wday,""))
1 InternalDoIf('du_Rollo_Master','STATE','') eq "an" and ReadingValDoIf('OG_elt_RO_Strasse','state','') ne "on" and (DOIF_time_once($hash->{timer}{3},$wday,"8") or DOIF_time_once($hash->{timer}{4},$wday,"7"))
Days:
3 8
4 7
Devices:
0 du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru
1 du_Rollo_Master
all du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru
Do:
0 set OG_elt_RO_Strasse off
1 set OG_elt_RO_Strasse on
Helper:
last_timer 5
sleeptimer -1
Internals:
0 du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE
1 du_Rollo_Master:STATE
all du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE
Readings:
0 EG_dr_TS_Terrasse:luminosity
all EG_dr_TS_Terrasse:luminosity
Realtime:
0 16:10:00
1 21:30:00
2 21:30:00
3 06:40:00
4 09:30:00
State:
Time:
0 {ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}
1 {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
2 {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
3 {ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}
4 {ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}
Timecond:
0 0
1 0
2 0
3 1
4 1
Timer:
0 0
1 0
2 0
3 0
4 0
Timerfunc:
Timers:
0 0 1 2
1 3 4
Trigger:
Attributes:
room LichtRollo
Zitat von: Ironangel am 16 Januar 2015, 17:45:28
Ich nochmal,
ich habe jetzt meinen DOIF-Befehl ein wenig umgestellt. Klappt aber irgendwie nicht. Ich erwarte jetzt die zweite Bedingung. Es kommt aber die dritte. Kann jemand einen Fehler sehen?Code Auswählen
Internals:
DEF ([netatmo_cojones_indoor:co2]>"1200") (set LED_Mediteran off,set LED_CO_Warnung on) DOELSEIF ([16:00-23:59]) (set LED_Mediteran on) DOELSE (set LED_Mediteran off, set LED_CO_Warnung off)
NAME netatmo
NR 35
NTFY_ORDER 50-netatmo
STATE cmd_3
TYPE DOIF
Readings:
2015-01-16 16:10:29 cmd_event netatmo_cojones_indoor
2015-01-16 16:10:29 cmd_nr 3
2015-01-16 17:40:29 e_netatmo_cojones_indoor_co2 653
2015-01-16 16:10:29 state cmd_3
2015-01-16 16:00:00 timer_1_c2 17.01.2015 16:00:00
2015-01-16 12:11:32 timer_2_c2 16.01.2015 23:59:00
Condition:
0 ReadingValDoIf('netatmo_cojones_indoor','co2','')>"1200"
1 DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")
Days:
Devices:
0 netatmo_cojones_indoor
all netatmo_cojones_indoor
Do:
0 set LED_Mediteran off,set LED_CO_Warnung on
1 set LED_Mediteran on
2 set LED_Mediteran off, set LED_CO_Warnung off
Helper:
last_timer 2
sleeptimer -1
Internals:
Readings:
0 netatmo_cojones_indoor:co2
all netatmo_cojones_indoor:co2
Realtime:
0 16:00:00
1 23:59:00
State:
Time:
0 16:00:00
1 23:59:00
Timecond:
0 1
1 1
Timer:
0 0
1 0
Timerfunc:
Timers:
1 0 1
Attributes:
room Home
([GDS:a_valid] eq 1 and [GDS:a_count] eq 1 ) (set gds_Warnung [GDS:a_0_event], attr gds_Warnung fp_HOME 430,530,0) DOELSEIF ([GDS:a_valid] eq 1 and [GDS:a_count] eq 2 ) (set gds_Warnung [GDS:a_0_event]+[GDS:a_1_event], attr gds_Warnung fp_HOME 430,530,0) DOELSEIF ([GDS:a_valid] eq 0 ) (deleteattr gds_Warnung fp_HOME)
Zitat von: MartinMuc am 16 Januar 2015, 19:42:09
Bei dir haben die Cojones getriggert, da Bedingung 1 nicht zutrifft und Bedingung 2 keine Cojones hat bleibt nur der Else Fall übrig
Zitat von: MartinMuc am 17 Januar 2015, 07:50:50
Das war eine vernünftige Antwort Ironangel, netatmo hat mit 653 getriggert das ist nicht größer als 1200 darum ist fall 1 nicht gültig
In Zweig 2 steht keine Bedingung für Netatmo daher ist dieser Fall auch nicht gültig also bleibt dir nur der Else Fall, aber das hab ich ja schon geschrieben
define Rollos_runter DOIF ([BM_Garage:brightness] < 110 ) ((set WZT_dummy zu) wait 2 (set WZFL_dummy zu) wait 2 (set WZFR_dummy zu) wait 2 (set WCF_dummy zu) wait 2 (set KUF_dummy zu) wait 2 (set SZT_dummy zu) wait 2 (set KZT_dummy zu))
Zitat von: RettungsTim am 19 Januar 2015, 08:31:15Klassisches Lesen-und-Verstehen-Problem: "wait" zwischen Befehlen steht auf der ToDo-Liste, soll also in der nächsten DOIF-Version implementiert werden. Zur Zeit kann man es aber noch nicht nutzen.
Leider wird nur das erste Kommando ausgeführt. Wo habe ich den den Fehler?!
define Rollos_runter DOIF ([BM_Garage:brightness] < 110 ) ((set WZT_dummy zu, sleep;set WZFL_dummy zu; sleep 2;set WZFR_dummy zu; sleep;set WCF_dummy zu;sleep 2;set KUF_dummy zu;sleep 2;set SZT_dummy zu;sleep 2;set KZT_dummy zu)
Zitat von: RettungsTim am 19 Januar 2015, 08:53:48
oh verdammt....
Guter hinweiß mit dem Komma, da war mein zweites Probem ohne "wait".
Dann mach ich auch mal ein "wait" auf "wait" ;D
Danke euch und sorry für die blöde Frage.-.-. Das habe ich echt nicht gelesen da ich in den 73 Seiten nach einer Lösung für mein Probelem gesucht habe und nicht alle Seiten gelesen habe :-(
Zitat von: RettungsTim am 19 Januar 2015, 08:31:15
ich habe mich mal an dem DOIF mit mehreren Kommandos Probiert.Code Auswählendefine Rollos_runter DOIF ([BM_Garage:brightness] < 110 ) ((set WZT_dummy zu) wait 2 (set WZFL_dummy zu) wait 2 (set WZFR_dummy zu) wait 2 (set WCF_dummy zu) wait 2 (set KUF_dummy zu) wait 2 (set SZT_dummy zu) wait 2 (set KZT_dummy zu))
Leider wird nur das erste Kommando ausgeführt. Wo habe ich den den Fehler?!
([BM_Garage:brightness] < 110 ) (set WZT_dummy zu, sleep 2; set WZFL_dummy zu; sleep 2; set WZFR_dummy zu; sleep 2; set WCF_dummy zu; sleep 2; set KUF_dummy zu; sleep 2; set SZT_dummy zu; sleep 2; set KZT_dummy zu)
([BM_Garage:brightness] < 110 ) (set WZT_dummy zu, set WZFL_dummy zu, set WZFR_dummy zu, set WCF_dummy zu, set KUF_dummy zu, set SZT_dummy zu, set KZT_dummy zu)
Zitat von: MaJu am 19 Januar 2015, 08:58:51
Wozu aber die "wait" dazwischen? Um dummys mit einem Status zu versehen musst du keine Pause reinsetzen und es abkürzen (dann mit Kommas):Code Auswählen([BM_Garage:brightness] < 110 ) (set WZT_dummy zu, set WZFL_dummy zu, set WZFR_dummy zu, set WCF_dummy zu, set KUF_dummy zu, set SZT_dummy zu, set KZT_dummy zu)
2015.01.21 00:00:00.059 3: CUL_HM set EG_ku_RO_StrasseLinks on
2015.01.21 00:00:00.055 3: CUL_HM set OG_ki1_RO_Carport off
2015.01.21 00:00:00.052 3: CUL_HM set OG_ki2_RO_Garten off
2015.01.21 00:00:00.049 3: CUL_HM set OG_elt_RO_Strasse off
2015.01.21 00:00:00.047 3: CUL_HM set EG_wz_RO_TerrasseRechts off
2015.01.21 00:00:00.044 3: CUL_HM set EG_ku_RO_StrasseRechts off
2015.01.21 00:00:00.041 3: CUL_HM set OG_ki2_RO_Garten on
2015.01.21 00:00:00.039 3: CUL_HM set OG_ki1_RO_Carport on
2015.01.21 00:00:00.036 3: CUL_HM set EG_wz_RO_TerrasseLinks on
2015.01.21 00:00:00.033 3: CUL_HM set EG_ku_RO_StrasseRechts on
2015.01.21 00:00:00.030 3: CUL_HM set OG_ki1_RO_Garten on
2015.01.21 00:00:00.027 3: CUL_HM set EG_wz_RO_Carport off
2015.01.21 00:00:00.021 3: CUL_HM set OG_elt_RO_Strasse on
2015.01.21 00:00:00.016 3: CUL_HM set EG_wz_RO_Carport on
2015.01.21 00:00:00.006 3: CUL_HM set EG_wz_RO_TerrasseRechts on
Internals:
CFGFN
DEF ([du_Rollo_Master] eq "an" and ([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and [du_Rollo_Art] ne "Weihnachten" and [{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}]) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}])
(set EG_ku_RO_StrasseLinks off)
DOELSEIF ([du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}|8] or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}|7]))
(set EG_ku_RO_StrasseLinks on)
NAME di_EG_ku_RO_StrasseLinks
NR 115
NTFY_ORDER 50-di_EG_ku_RO_StrasseLinks
STATE cmd_2
TYPE DOIF
Readings:
2015-01-21 00:00:00 cmd_event timer_4
2015-01-21 00:00:00 cmd_nr 2
2015-01-21 08:27:13 e_EG_dr_TS_Terrasse_luminosity 7.77
2015-01-21 00:00:00 state cmd_2
2015-01-21 00:00:00 timer_1_c1 21.01.2015 16:10:00
2015-01-21 00:00:00 timer_2_c1 21.01.2015 21:30:00
2015-01-21 00:00:00 timer_3_c1 21.01.2015 21:30:00
2015-01-21 06:40:00 timer_4_c2 22.01.2015 06:40:00|8
2015-01-21 00:00:00 timer_5_c2 21.01.2015 09:30:00|7
Condition:
0 InternalDoIf('du_Rollo_Master','STATE','') eq "an" and (ReadingValDoIf('EG_dr_TS_Terrasse','luminosity','') < InternalDoIf('du_Rollo_Luminosity_ru','STATE','') and InternalDoIf('du_Rollo_Art','STATE','') ne "Weihnachten" and DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")) or DOIF_time_once($hash->{timer}{2},$wday,"")
1 InternalDoIf('du_Rollo_Master','STATE','') eq "an" and (DOIF_time_once($hash->{timer}{3},$wday,"8") or DOIF_time_once($hash->{timer}{4},$wday,"7"))
Days:
3 8
4 7
Devices:
0 du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru du_Rollo_Art
1 du_Rollo_Master
all du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru du_Rollo_Art
Do:
0 set EG_ku_RO_StrasseLinks off
1 set EG_ku_RO_StrasseLinks on
Helper:
last_timer 5
sleeptimer -1
Internals:
0 du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE du_Rollo_Art:STATE
1 du_Rollo_Master:STATE
all du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE du_Rollo_Art:STATE
Readings:
0 EG_dr_TS_Terrasse:luminosity
all EG_dr_TS_Terrasse:luminosity
Realtime:
0 16:10:00
1 21:30:00
2 21:30:00
3 06:40:00
4 09:30:00
State:
Time:
0 {ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}
1 {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
2 {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
3 {ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}
4 {ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}
Timecond:
0 0
1 0
2 0
3 1
4 1
Timer:
0 0
1 0
2 0
3 0
4 0
Timerfunc:
Timers:
0 0 1 2
1 3 4
Trigger:
Attributes:
room LichtRollo
Zitat von: maxritti am 21 Januar 2015, 08:30:01
Heute in der Nacht sogar um 0:00:00 ??? . Denn da sind auf einmal 3 von den Rollos einfach hoch gefahren worden.
Und ich habe keine Ahnung warum.
DOELSEIF ([du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}|8] or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}|7]))
Zitat von: maxritti am 21 Januar 2015, 10:36:36Ja, JETZT schon. Die Timer werden durch das Triggern neu gesetzt.
Wobei bei den Readings doch die korrekten Werte drin stehen?
CFGFN
DEF ([du_Rollo_Master] or [du_Rollo_Zeit_ho] or [du_Rollo_Zeit_ho_WE] or [du_Rollo_Luminosity_ru] or [du_Rollo_Zeit_ru_start] or [du_Rollo_Zeit_ru_ende]) (modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseRechts:&DEF], modify di_OG_elt_RO_Strasse [di_OG_elt_RO_Strasse:&DEF], modify di_OG_ki1_RO_Carport [di_OG_ki1_RO_Carport:&DEF], modify di_OG_ki1_RO_Garten [di_OG_ki1_RO_Garten:&DEF], modify di_OG_ki2_RO_Garten [di_OG_ki2_RO_Garten:&DEF])
NAME di_Rollo_SetTime
NR 114
NTFY_ORDER 50-di_Rollo_SetTime
STATE cmd_1
TYPE DOIF
Readings:
2015-01-17 17:20:34 cmd_event du_Rollo_Luminosity_ru
2015-01-17 17:20:34 cmd_nr 1
2015-01-17 17:20:34 e_du_Rollo_Luminosity_ru_STATE 0.7
2015-01-11 19:21:26 e_du_Rollo_Master_STATE an
2015-01-14 08:10:06 e_du_Rollo_Zeit_ho_STATE 06:40
2015-01-17 17:20:34 state cmd_1
Condition:
0 InternalDoIf('du_Rollo_Master','STATE','') or InternalDoIf('du_Rollo_Zeit_ho','STATE','') or InternalDoIf('du_Rollo_Zeit_ho_WE','STATE','') or InternalDoIf('du_Rollo_Luminosity_ru','STATE','') or InternalDoIf('du_Rollo_Zeit_ru_start','STATE','') or InternalDoIf('du_Rollo_Zeit_ru_ende','STATE','')
Devices:
0 du_Rollo_Master du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende
all du_Rollo_Master du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende
Do:
0 modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseRechts:&DEF], modify di_OG_elt_RO_Strasse [di_OG_elt_RO_Strasse:&DEF], modify di_OG_ki1_RO_Carport [di_OG_ki1_RO_Carport:&DEF], modify di_OG_ki1_RO_Garten [di_OG_ki1_RO_Garten:&DEF], modify di_OG_ki2_RO_Garten [di_OG_ki2_RO_Garten:&DEF]
Helper:
last_timer 0
sleeptimer -1
Internals:
0 du_Rollo_Master:STATE du_Rollo_Zeit_ho:STATE du_Rollo_Zeit_ho_WE:STATE du_Rollo_Luminosity_ru:STATE du_Rollo_Zeit_ru_start:STATE du_Rollo_Zeit_ru_ende:STATE
all du_Rollo_Master:STATE du_Rollo_Zeit_ho:STATE du_Rollo_Zeit_ho_WE:STATE du_Rollo_Luminosity_ru:STATE du_Rollo_Zeit_ru_start:STATE du_Rollo_Zeit_ru_ende:STATE
State:
Attributes:
do always
room LichtRollo
Internals:
CFGFN
DEF global:INITIALIZED trigger di_Rollo_SetTime
NAME no_GlobalInitialized
NOTIFYDEV global
NR 180
NTFY_ORDER 50-no_GlobalInitialized
REGEXP global:INITIALIZED
STATE 2015-01-21 12:38:34
TYPE notify
Attributes:
group notify
room LichtRollo
Zitat von: maxritti am 21 Januar 2015, 12:42:19Es geht sogar noch einfach: Du könntest das DOIF direkt durch global:INITIALIZED triggern lassen, ungefähr so:
Hm, das war wohl einfacher als gedacht:
Ein Notify auf dem global:INITIALIZED und dieses triggert mein DOIF, welches die anderen DOIFs aus den Dummies aktualisiert.
DOIF ([global:?initialized])(modify di_EG_ku_RO_StrasseLinks ...
Zitat von: Brockmann am 21 Januar 2015, 12:52:55Gute Idee. Das werde ich heute abend mal umbauen.
Es geht sogar noch einfach: Du könntest das DOIF direkt durch global:INITIALIZED triggern lassen, ungefähr so:Code AuswählenDOIF ([global:?initialized])(modify di_EG_ku_RO_StrasseLinks ...
Zitat von: Brockmann am 21 Januar 2015, 12:52:55Die sind nicht wirklich alle gleich.
Aber wieso verwendest Du überhaupt für jedes Rollo ein eigenes DOIF, wenn die alle identisch sind? Wäre da nicht eine STRUCTURE mit allen Rollos sinnvoller? Ein Befehl (und ein DOIF) und alle Rollos gehen hoch oder runter.
2015.01.21 21:34:53 2: doif_le_fk_offen: internal does not exist: [le_fk_Fenster:STATE]
2015.01.21 21:34:53 2: doif_lu_fk_offen: internal does not exist: [lu_fk_Fenster:STATE]
2015.01.21 21:34:53 2: doif_sz_fk_offen: internal does not exist: [sz_fk_Fenster:STATE]
2015.01.21 21:34:55 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:34:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:34:55 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:35:00 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:35:00 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:35:00 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:35:05 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:35:05 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:35:05 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:35:10 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:35:10 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:35:10 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:35:15 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:35:15 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:35:15 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:35:20 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:35:20 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:35:20 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:35:25 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:35:25 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:35:25 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:35:30 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:35:30 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:35:30 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:35:35 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:35:35 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:35:35 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:35:40 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:35:40 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:35:40 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:35:45 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:35:45 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:35:45 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:35:50 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:35:50 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:35:50 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:35:55 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:35:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:35:55 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:36:01 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:36:01 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:36:01 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:36:02 1: Perfmon: possible freeze starting at 21:36:01, delay is 1.869
2015.01.21 21:36:05 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:36:05 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:36:05 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:36:10 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:36:10 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:36:10 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:36:15 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:36:15 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:36:15 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:36:20 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:36:20 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:36:20 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:36:25 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:36:25 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:36:25 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:36:27 1: Perfmon: possible freeze starting at 21:36:26, delay is 1.838
2015.01.21 21:36:31 1: Perfmon: possible freeze starting at 21:36:30, delay is 1.263
2015.01.21 21:36:31 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:36:31 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:36:31 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:36:35 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:36:35 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:36:35 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:36:40 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:36:40 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:36:40 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:36:45 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:36:45 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:36:45 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:36:50 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:36:50 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:36:50 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:36:55 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:36:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:36:55 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:37:01 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:37:01 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:37:01 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:37:05 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:37:05 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:37:05 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:37:10 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:37:10 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:37:10 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:37:15 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:37:15 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:37:15 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:37:20 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:37:20 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:37:20 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:37:25 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:37:25 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:37:25 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:37:30 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:37:30 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:37:30 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:37:35 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:37:35 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:37:35 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:37:40 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:37:40 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:37:40 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:37:45 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:37:45 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:37:45 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:37:50 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:37:50 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:37:50 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:37:55 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:37:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:37:55 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:38:01 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:38:01 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:38:01 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:38:06 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:38:06 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:38:06 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:38:10 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:38:10 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:38:10 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:38:15 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:38:15 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:38:15 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:38:20 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:38:20 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:38:20 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:38:25 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:38:25 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:38:25 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:38:30 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:38:30 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:38:30 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:38:35 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:38:35 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:38:35 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:38:40 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:38:40 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:38:40 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:38:45 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:38:45 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:38:45 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:38:50 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:38:50 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:38:50 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:38:55 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:38:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:38:55 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:39:00 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:39:00 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:39:00 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:39:05 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:39:05 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:39:05 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:39:10 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:39:10 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:39:10 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:39:15 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:39:15 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:39:15 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:39:20 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:39:20 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:39:20 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:39:25 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:39:25 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:39:25 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:39:30 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:39:30 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:39:30 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:39:36 1: Perfmon: possible freeze starting at 21:39:35, delay is 1.153
2015.01.21 21:39:36 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:39:36 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:39:36 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:39:40 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:39:40 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:39:40 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:39:45 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:39:45 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:39:45 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:39:50 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:39:50 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:39:50 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:39:55 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:39:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:39:55 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:40:00 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:40:00 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:40:00 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:40:05 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:40:05 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:40:05 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:40:10 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:40:10 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:40:10 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:40:15 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:40:15 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:40:15 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:40:20 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:40:20 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:40:20 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:40:25 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:40:25 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:40:25 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:40:30 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:40:30 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:40:30 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:40:35 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:40:35 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:40:35 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:40:40 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:40:40 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:40:40 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:40:45 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:40:45 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:40:45 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:40:50 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:40:50 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:40:50 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:40:55 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:40:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:40:55 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:41:00 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:41:00 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:41:00 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:41:05 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:41:05 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:41:05 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:41:10 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:41:10 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:41:10 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:41:15 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:41:15 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:41:15 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:41:20 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:41:20 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:41:20 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:41:25 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:41:25 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:41:25 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:41:30 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:41:30 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:41:30 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:41:35 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:41:35 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:41:35 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:41:40 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:41:40 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:41:40 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:41:45 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:41:45 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:41:45 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:41:50 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:41:50 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:41:50 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:41:55 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:41:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:41:55 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:42:00 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:42:00 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:42:00 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:42:05 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:42:05 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:42:05 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:42:10 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:42:10 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:42:10 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:42:15 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:42:15 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:42:15 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:42:20 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:42:20 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:42:20 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:42:25 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:42:25 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:42:25 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:42:30 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:42:30 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:42:30 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:42:35 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:42:35 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:42:35 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:42:40 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:42:40 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:42:40 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:42:45 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:42:45 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:42:45 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:42:50 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:42:50 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:42:50 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:42:55 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:42:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:42:55 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:43:00 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:43:00 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:43:00 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:43:05 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:43:05 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:43:05 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:43:10 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:43:10 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:43:10 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:43:15 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:43:15 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:43:15 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:43:20 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:43:20 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:43:20 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:43:25 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:43:25 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:43:25 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:43:30 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:43:30 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:43:30 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:43:35 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:43:35 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:43:35 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:43:40 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:43:40 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:43:40 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:43:45 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:43:45 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:43:45 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:43:50 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:43:50 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:43:50 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:43:55 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:43:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:43:55 1: Error: sz_fk_Fenster has no TYPE
fhem> list doif_bd_fk_offen
Internals:
CFGFN
DEF ([bd_fk_Fenster] eq "open" and [te_Sensor_WDS10_TH:temperature] < 16 and ($month > 10 or $month < 5))(set vi_MP3Remote_Btn5 press long)
NAME doif_bd_fk_offen
NR 855
NTFY_ORDER 50-doif_bd_fk_offen
STATE cmd_2
TYPE DOIF
Readings:
2015-01-21 21:39:37 cmd_event bd_fk_Fenster
2015-01-21 21:39:37 cmd_nr 2
2015-01-21 21:39:37 e_bd_fk_Fenster_STATE closed
2015-01-21 21:34:53 e_te_Sensor_WDS10_TH_temperature 0.3
2015-01-21 21:39:37 state cmd_2
2015-01-21 21:39:36 wait_timer no timer
Condition:
0 InternalDoIf('bd_fk_Fenster','STATE','') eq "open" and ReadingValDoIf('te_Sensor_WDS10_TH','temperature','') < 16 and ($month > 10 or $month < 5)
Devices:
0 bd_fk_Fenster te_Sensor_WDS10_TH
all bd_fk_Fenster te_Sensor_WDS10_TH
Do:
0 set vi_MP3Remote_Btn5 press long
Helper:
last_timer 0
sleepdevice bd_fk_Fenster
sleeptimer -1
Internals:
0 bd_fk_Fenster:STATE
all bd_fk_Fenster:STATE
Readings:
0 te_Sensor_WDS10_TH:temperature
all te_Sensor_WDS10_TH:temperature
State:
Attributes:
room 95_Info
wait 900
list doif_le_fk_offen
Internals:
CFGFN
DEF ([le_fk_Fenster] eq "open" and [te_Sensor_WDS10_TH:temperature] < 16 and ($month > 10 or $month < 5))(set vi_MP3Remote_Btn7 press long)
NAME doif_le_fk_offen
NR 857
NTFY_ORDER 50-doif_le_fk_offen
STATE ???
TYPE DOIF
Readings:
2015-01-21 21:34:53 e_te_Sensor_WDS10_TH_temperature 0.3
2015-01-21 21:34:53 error internal does not exist: [le_fk_Fenster:STATE]
2015-01-21 21:29:07 wait_timer no timer
Condition:
0 InternalDoIf('le_fk_Fenster','STATE','') eq "open" and ReadingValDoIf('te_Sensor_WDS10_TH','temperature','') < 16 and ($month > 10 or $month < 5)
Devices:
0 le_fk_Fenster te_Sensor_WDS10_TH
all le_fk_Fenster te_Sensor_WDS10_TH
Do:
0 set vi_MP3Remote_Btn7 press long
Helper:
last_timer 0
sleeptimer -1
Internals:
0 le_fk_Fenster:STATE
all le_fk_Fenster:STATE
Readings:
0 te_Sensor_WDS10_TH:temperature
all te_Sensor_WDS10_TH:temperature
State:
Attributes:
room 95_Info
wait 900
list doif_lu_fk_offen
Internals:
CFGFN
DEF ([lu_fk_Fenster] eq "open" and [te_Sensor_WDS10_TH:temperature] < 16 and ($month > 10 or $month < 5))(set vi_MP3Remote_Btn31 press long)
NAME doif_lu_fk_offen
NR 858
NTFY_ORDER 50-doif_lu_fk_offen
STATE ???
TYPE DOIF
Readings:
2015-01-21 21:34:53 e_te_Sensor_WDS10_TH_temperature 0.3
2015-01-21 21:34:53 error internal does not exist: [lu_fk_Fenster:STATE]
2015-01-21 21:29:09 wait_timer no timer
Condition:
0 InternalDoIf('lu_fk_Fenster','STATE','') eq "open" and ReadingValDoIf('te_Sensor_WDS10_TH','temperature','') < 16 and ($month > 10 or $month < 5)
Devices:
0 lu_fk_Fenster te_Sensor_WDS10_TH
all lu_fk_Fenster te_Sensor_WDS10_TH
Do:
0 set vi_MP3Remote_Btn31 press long
Helper:
last_timer 0
sleeptimer -1
Internals:
0 lu_fk_Fenster:STATE
all lu_fk_Fenster:STATE
Readings:
0 te_Sensor_WDS10_TH:temperature
all te_Sensor_WDS10_TH:temperature
State:
Attributes:
room 95_Info
wait 900
list doif_sz_fk_offen
Internals:
CFGFN
DEF ([sz_fk_Fenster] eq "open" and [te_Sensor_WDS10_TH:temperature] < 16 and ($month > 10 or $month < 5))(set vi_MP3Remote_Btn7 press long)
NAME doif_sz_fk_offen
NR 856
NTFY_ORDER 50-doif_sz_fk_offen
STATE ???
TYPE DOIF
Readings:
2015-01-21 21:34:53 e_te_Sensor_WDS10_TH_temperature 0.3
2015-01-21 21:34:53 error internal does not exist: [sz_fk_Fenster:STATE]
2015-01-21 21:29:07 wait_timer no timer
Condition:
0 InternalDoIf('sz_fk_Fenster','STATE','') eq "open" and ReadingValDoIf('te_Sensor_WDS10_TH','temperature','') < 16 and ($month > 10 or $month < 5)
Devices:
0 sz_fk_Fenster te_Sensor_WDS10_TH
all sz_fk_Fenster te_Sensor_WDS10_TH
Do:
0 set vi_MP3Remote_Btn7 press long
Helper:
last_timer 0
sleeptimer -1
Internals:
0 sz_fk_Fenster:STATE
all sz_fk_Fenster:STATE
Readings:
0 te_Sensor_WDS10_TH:temperature
all te_Sensor_WDS10_TH:temperature
State:
Attributes:
room 95_Info
wait 900
2015.01.21 21:02:15 2: doif_sz_fk_offen: internal does not exist: [sz_fk_Fenster:STATE]
2015.01.21 21:02:15 2: doif_le_fk_offen: internal does not exist: [le_fk_Fenster:STATE]
2015.01.21 21:02:15 2: doif_lu_fk_offen: internal does not exist: [lu_fk_Fenster:STATE]
2015.01.21 21:02:17 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:02:17 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:02:17 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:02:22 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:02:22 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:02:22 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:02:27 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:02:27 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:02:27 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:02:32 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:02:32 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:02:32 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:02:37 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:02:37 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:02:37 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:02:42 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:02:42 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:02:42 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:02:47 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:02:47 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:02:47 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:02:52 1: Error: le_fk_Fenster has no TYPE
2015.01.21 21:02:52 1: Error: lu_fk_Fenster has no TYPE
2015.01.21 21:02:52 1: Error: sz_fk_Fenster has no TYPE
2015.01.21 21:02:54 1: PERL WARNING: Argument "05:29:25" isn't numeric in numeric lt (<) at ./FHEM/98_statistics.pm line 541.
2015.01.21 21:02:54 1: PERL WARNING: Argument "15:32:38" isn't numeric in numeric gt (>) at ./FHEM/98_statistics.pm line 543.
Out of memory!
*** glibc detected *** perl: corrupted double-linked list: 0x04d28400 ***
delete doif.*
, die Fehlermeldungen kommer aber trotzdem noch im LogFile.Zitat von: AHA1805 am 21 Januar 2015, 21:50:38
Jetzt habe ich alle doif gelöschtCode Auswählendelete doif.*
, die Fehlermeldungen kommer aber trotzdem noch im LogFile.
list TYPE=DOIF
list TYPE=
Zitat von: AHA1805 am 22 Januar 2015, 18:31:54
Hallo
Ja sie waren alle gelöscht.
Ein Neustart von fhem brachte das System "zum Schweigen"
Gleicher Effekt beim wiederholten anlegen der DOIF.
Gruß Hannes
Gesendet von Tapatalk
define di_hum DOIF ([outdoor:humidity]>70)\
DOELSEIF ([outdoor:humidity]>50)\
DOELSE
Zitat von: Roger am 22 Januar 2015, 20:45:31
Hi,
ich möchte auch gern das DOIF Modul einsetzten. Der Code mit vielen Bedingungen und Befehlen kann ja schnell lang und unübersichtlich werden. Hier schreibe ich normalerweise den Code auf mehrere Zeilen, welche ich mit \ abschliesse.
Bei DOIF scheint das nicht zu gehen:Code Auswählendefine di_hum DOIF ([outdoor:humidity]>70)\
DOELSEIF ([outdoor:humidity]>50)\
DOELSE
bringt eine Fehlermeldung: di_hum DOIF: expected DOELSEIF or DOELSE: \DOELSEIF ([outdoor:humidity]>50)\DOELSE
In einer Zeile geht der Befehl. Gibt es eine Lösung das DOIF über mehrere Zeilen zu verteilen
Roger
Zitat von: Roger am 22 Januar 2015, 21:15:42
Hallo Damian,
ja, ein mehrzeiliger DOIF kann aus den cfg-File mit den \ geladen werden.
Aber über Telnet-Kommandozeile nimmt er den gleichen Code leider nicht an :(
Bei notify geht das zu Beispiel. Ich teste so immer den Code (delete ... define ...)
@automatisierer: auch " \" hilft nicht, Code war nur zur Demonstration der Fehlermeldung
Roger
Zitat von: Roger am 22 Januar 2015, 21:15:42
Ich teste so immer den Code (delete ... define ...)
Zitat von: Damian am 22 Januar 2015, 20:04:52
Arbeitest du mit Aliasnamen oder sind das die echten Devicenamen?
Du kannst es auch mit dem Reading "state" in der Bedingung probieren: [le_fk_Fenster:state] statt [le_fk_Fenster]
Gruß
Damian
define doif_bd_fk_offen DOIF ([bd_fk_Fenster:state] eq "open" and [te_Sensor_WDS10_TH:temperature] < 16 and ($month > 10 or $month < 5))(set vi_MP3Remote_Btn5 press long)
attr doif_bd_fk_offen room 95_Info
attr doif_bd_fk_offen wait 900
define doif_sz_fk_offen DOIF ([sz_fk_Fenster:state] eq "open" and [te_Sensor_WDS10_TH:temperature] < 16 and ($month > 10 or $month < 5))(set vi_MP3Remote_Btn7 press long)
attr doif_sz_fk_offen room 95_Info
attr doif_sz_fk_offen wait 900
define doif_le_fk_offen DOIF ([le_fk_Fenster:state] eq "open" and [te_Sensor_WDS10_TH:temperature] < 16 and ($month > 10 or $month < 5))(set vi_MP3Remote_Btn7 press short)
attr doif_le_fk_offen room 95_Info
attr doif_le_fk_offen wait 900
define doif_lu_fk_offen DOIF ([lu_fk_Fenster:state] eq "open" and [te_Sensor_WDS10_TH:temperature] < 16 and ($month > 10 or $month < 5))(set vi_MP3Remote_Btn31 press short)
attr doif_lu_fk_offen room 95_Info
attr doif_lu_fk_offen wait 900
2015.01.23 21:47:52 2: doif_le_fk_offen: reading does not exist: [le_fk_Fenster:state]
2015.01.23 21:47:52 2: doif_lu_fk_offen: reading does not exist: [lu_fk_Fenster:state]
2015.01.23 21:47:52 2: doif_sz_fk_offen: reading does not exist: [sz_fk_Fenster:state]
2015.01.23 21:47:55 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:47:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:47:55 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:48:01 1: Error: le_fk_Fenster has no TYPE
015.01.23 21:48:01 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:48:01 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:48:05 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:48:05 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:48:05 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:48:10 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:48:10 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:48:10 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:48:15 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:48:15 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:48:15 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:48:20 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:48:20 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:48:20 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:48:25 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:48:25 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:48:26 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:48:30 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:48:30 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:48:30 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:48:35 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:48:35 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:48:35 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:48:41 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:48:41 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:48:41 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:48:45 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:48:45 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:48:45 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:48:51 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:48:51 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:48:51 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:48:55 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:48:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:48:55 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:49:01 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:49:01 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:49:01 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:49:05 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:49:05 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:49:05 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:49:10 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:49:10 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:49:10 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:49:15 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:49:15 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:49:15 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:49:20 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:49:20 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:49:20 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:49:25 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:49:25 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:49:25 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:49:30 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:49:30 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:49:30 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:49:35 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:49:35 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:49:35 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:49:41 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:49:41 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:49:41 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:49:45 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:49:45 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:49:45 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:49:50 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:49:50 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:49:50 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:49:52 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:49:52 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:49:52 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:49:55 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:49:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:49:55 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:50:01 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:50:01 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:50:01 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:50:06 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:50:06 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:50:06 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:50:10 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:50:10 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:50:10 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:50:15 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:50:15 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:50:15 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:50:20 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:50:20 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:50:20 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:50:25 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:50:25 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:50:26 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:50:30 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:50:30 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:50:31 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:50:35 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:50:35 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:50:35 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:50:40 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:50:40 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:50:41 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:50:45 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:50:45 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:50:45 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:50:50 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:50:50 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:50:51 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:50:55 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:50:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:50:55 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:51:01 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:51:01 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:51:01 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:51:05 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:51:05 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:51:05 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:51:10 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:51:10 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:51:10 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:51:15 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:51:15 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:51:15 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:51:20 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:51:20 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:51:21 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:51:25 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:51:25 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:51:26 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:51:30 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:51:31 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:51:31 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:51:35 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:51:36 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:51:36 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:51:40 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:51:41 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:51:41 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:51:45 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:51:46 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:51:46 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:51:50 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:51:51 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:51:51 1: Error: sz_fk_Fenster has no TYPE
2015.01.23 21:51:55 1: Error: le_fk_Fenster has no TYPE
Zitat von: AHA1805 am 23 Januar 2015, 21:35:53Code Auswählendefine doif_bd_fk_offen DOIF ([bd_fk_Fenster:state] eq "open" and [te_Sensor_WDS10_TH:temperature] < 16 and ($month > 10 or $month < 5))(set vi_MP3Remote_Btn5 press long)
attr doif_bd_fk_offen room 95_Info
attr doif_bd_fk_offen wait 900
define doif_sz_fk_offen DOIF ([sz_fk_Fenster:state] eq "open" and [te_Sensor_WDS10_TH:temperature] < 16 and ($month > 10 or $month < 5))(set vi_MP3Remote_Btn7 press long)
attr doif_sz_fk_offen room 95_Info
attr doif_sz_fk_offen wait 900
define doif_le_fk_offen DOIF ([le_fk_Fenster:state] eq "open" and [te_Sensor_WDS10_TH:temperature] < 16 and ($month > 10 or $month < 5))(set vi_MP3Remote_Btn7 press short)
attr doif_le_fk_offen room 95_Info
attr doif_le_fk_offen wait 900
define doif_lu_fk_offen DOIF ([lu_fk_Fenster:state] eq "open" and [te_Sensor_WDS10_TH:temperature] < 16 and ($month > 10 or $month < 5))(set vi_MP3Remote_Btn31 press short)
attr doif_lu_fk_offen room 95_Info
attr doif_lu_fk_offen wait 900
Ich kann das Problem heute leider nicht mehr nachstellen :'(.
Zu früh gefreut :'(
Hat wunderbar funktioniert, und plötzlich ging es wieder los.
Begonnen hat das ganze mitCode Auswählen2015.01.23 21:47:52 2: doif_le_fk_offen: reading does not exist: [le_fk_Fenster:state]
2015.01.23 21:47:52 2: doif_lu_fk_offen: reading does not exist: [lu_fk_Fenster:state]
2015.01.23 21:47:52 2: doif_sz_fk_offen: reading does not exist: [sz_fk_Fenster:state]
2015.01.23 21:47:55 1: Error: le_fk_Fenster has no TYPE
2015.01.23 21:47:55 1: Error: lu_fk_Fenster has no TYPE
2015.01.23 21:47:55 1: Error: sz_fk_Fenster has no TYPE
Und seitdem kommen immer die Logeinträge.
Abhilft bringt nur die 4 DOIF löschen und FHEM neu starten.
Zitat von: Damian am 20 November 2014, 18:06:35
Du kannst auch statt:Code Auswählenfhem("get Schulferien today") eq "none"
eleganter:Code Auswählen[Schulferien:today] eq "none"
angeben.
Das gleiche gilt für tomorrow.
Gruß
Damian
reading does not exist: [Schulferien:today]
zurückgeliefert.fhem("get Schulferien today") eq "none"
klappts.....Zitat von: Bartimaus am 24 Januar 2015, 12:03:26
Guten Morgen Damian,
ich versuche mich gerade nochmal an meiner Rolladensteuerung via DOIF.
Wenn ich diesen Tip befolge, bekomme ich aberCode Auswählenreading does not exist: [Schulferien:today]
zurückgeliefert.
MitCode Auswählenfhem("get Schulferien today") eq "none"
klappts.....
Bug oder Feature ?
Zitat von: Damian am 22 Januar 2015, 20:49:29
Einfach über Weboberfläche auf DEF klicken und einfach mit Enter ohne \ arbeiten und sich freuen - es kann manchmal ganz einfach sein.
Gruß
Damian
du_Test:on set myPushover msg 'Notify - Dachfenster' 'Offenes Dachfenster'.$NAME 'iPhone5S' 0 ''
([du_Test:state] eq "on") (set myPushover msg 'Notify - Dachfenster' 'Offenes Dachfenster'.$NAME 'iPhone5S' 0 '')
Zitat von: Damian am 24 Januar 2015, 12:08:28
Dann hast du vielleicht nicht die aktuelle Version des holiday-Moduls - tomorrow wurde später als Reading eingebaut.
Ob das Reading da ist oder nicht kannst du ja selbst nachschauen.
Gruß
Damian
Zitat von: maxritti am 24 Januar 2015, 12:33:47$NAME gibt es bei DOIF nicht, dass ist eine Eigenschaft des notifys.
Hallo zusammen,
ich bin weiter dabei, meine notifys, Code aus myUtils.pm usw zu vereinfachen.
Da bietet sich DOIF immer besser an. Dafür noch mal vielen Dank an der Stelle für das Modul.
Jetzt gerade bin ich allerdings an einer Stelle, wo ich nicht wirklich weiterkomme.
Folgendes notify:Code Auswählendu_Test:on set myPushover msg 'Notify - Dachfenster' 'Offenes Dachfenster'.$NAME 'iPhone5S' 0 ''
Liefert mir den Namen du_Test in der Pushmessage mit.
Dagegen folgendes DOIF nicht. Da kommt $NAME in der Pushmessage an.Code Auswählen([du_Test:state] eq "on") (set myPushover msg 'Notify - Dachfenster' 'Offenes Dachfenster'.$NAME 'iPhone5S' 0 '')
MMn sollte sich doch <Befehle> aus dem DOIF gleich verhalten wie <Anweisung> aus dem DOIF.
Was habe ich da übersehen?
Geht das noch nicht in DOIF mit dem $NAME?
set myPushover msg 'Notify - Dachfenster' 'Offenes Dachfenster du_test' 'iPhone5S' 0 '')
set myPushover msg 'Notify - Dachfenster' 'Offenes Dachfenster Status von du_test: [du_test]' 'iPhone5S' 0 '')
Zitat von: maxritti am 24 Januar 2015, 13:38:44Theoretisch steht im Reading cmd_event drin, welches Gerät getriggert hat. Aber ich weiß nicht, ob diese Information im Moment der Ausführung schon aktualisiert wurde.
Ist halt nur ungünstig, wenn ich ein DOIF für mehrere Fensterkontakte habe, welche mit or verknüpft sind.
Die Meldung sollte halt nur den Kontakt beinhalten, welcher getriggert hat.
Zitat von: Brockmann am 24 Januar 2015, 14:26:27
Theoretisch steht im Reading cmd_event drin, welches Gerät getriggert hat. Aber ich weiß nicht, ob diese Information im Moment der Ausführung schon aktualisiert wurde.
Zitat von: maxritti am 25 Januar 2015, 19:10:23z. B.:
Neues Wochenende, neues Glück mit einem DOIF.
Bislang steuere ich meine Zirkulationspumpe über zwei Bewegungsmelder.
Sobald eine Bewegung erkannt wird, startet ein notify und prüft den Inhalt eines Dummys, ob der auf "unlocked" steht.
Wenn ja, dann setzt der den auf "locked" und schaltet meinen Zwischenstecker für die Zirkulationspumpe für 3 Minuten ein. Gleichzeitig definiert der ein "at", welches nach 20 Minuten den Dummy wieder auf "unlocked" setzt.
Damit bewirke ich, dass die Pumpe minimal alle 20minuten für 3 Minuten eingeschaltet wird.
Klappt auch 1a, aber ich dachte so, dass da ein DOIF geradezu prädestiniert für wäre.
Tjo, nun sitze ich schon die 2 Tage dran und bekomme es nicht hin.
Trotz mehrfachem Studium der DOIF Command Ref und den vielen Beispielen.
Ich habe da nun viel mit do always, wait, repeatsame, cmdpause & Co rumprobiert.
Auch habe ich die Definition mit [BM:state:sec] > 1200 probiert.
Aber nicht mit dem Ergebnis, wie es mein Konstrukt oben erledigt.
Schon gar nicht kann ich hier sagen, wann was ging und wann was nicht, wegen dieser ganzen Testerei ???
Am besten wird sein, ich mache mal einen geistigen Reset und fange noch mal von vorne an.
Oder aber hier schiebt mich mal einer in die richtige Richtung. :)
define di_zirkulation DOIF ([sensor] eq "motion")(set pumpe on-for-timer 180)
attr di_zirkulation cmdpause 1200
attr di_zirkulation do always
({ fhem("define ZirkuPumpe +*{30}00:20:00 set ZirkulationsPumpe on-for-timer 384") })
Zitat von: Damian am 25 Januar 2015, 21:06:57
z. B.:Code Auswählendefine di_zirkulation DOIF ([sensor] eq "motion")(set pumpe on-for-timer 180)
attr di_zirkulation cmdpause 1200
attr di_zirkulation do always
Gruß
Damian
Internals:
CFGFN
DEF ([EG_wc_BM_Motion] eq "motion" or [OG_bz_BM_Motion] eq "motion") (set DG_hz_SD_Zirkpumpe on-for-timer 180)
NAME di_zirkulation
NR 1302
NTFY_ORDER 50-di_zirkulation
STATE cmd_1
TYPE DOIF
Readings:
2015-01-25 21:18:04 cmd_event EG_wc_BM_Motion
2015-01-25 21:18:04 cmd_nr 1
2015-01-25 21:28:13 e_EG_wc_BM_Motion_STATE motion
2015-01-25 21:30:01 e_OG_bz_BM_Motion_STATE motion
2015-01-25 21:18:04 state cmd_1
Condition:
0 InternalDoIf('EG_wc_BM_Motion','STATE','') eq "motion" or InternalDoIf('OG_bz_BM_Motion','STATE','') eq "motion"
Devices:
0 EG_wc_BM_Motion OG_bz_BM_Motion
all EG_wc_BM_Motion OG_bz_BM_Motion
Do:
0 set DG_hz_SD_Zirkpumpe on-for-timer 180
Helper:
last_timer 0
sleeptimer -1
Internals:
0 EG_wc_BM_Motion:STATE OG_bz_BM_Motion:STATE
all EG_wc_BM_Motion:STATE OG_bz_BM_Motion:STATE
Readings:
State:
Trigger:
Attributes:
cmdpause 1200
do always
group doif
room Zirkulation
Internals:
CFGFN
DEF ([EG_wc_BM_Motion] eq "motion" or [OG_bz_BM_Motion] eq "motion") (set DG_hz_SD_Zirkpumpe on-for-timer 180)
NAME di_zirkulation
NR 1302
NTFY_ORDER 50-di_zirkulation
STATE cmd_1
TYPE DOIF
Readings:
2015-01-25 21:39:02 cmd_event EG_wc_BM_Motion
2015-01-25 21:39:02 cmd_nr 1
2015-01-25 21:39:02 e_EG_wc_BM_Motion_STATE motion
2015-01-25 21:35:07 e_OG_bz_BM_Motion_STATE motion
2015-01-25 21:39:02 state cmd_1
Condition:
0 InternalDoIf('EG_wc_BM_Motion','STATE','') eq "motion" or InternalDoIf('OG_bz_BM_Motion','STATE','') eq "motion"
Devices:
0 EG_wc_BM_Motion OG_bz_BM_Motion
all EG_wc_BM_Motion OG_bz_BM_Motion
Do:
0 set DG_hz_SD_Zirkpumpe on-for-timer 180
Helper:
last_timer 0
sleeptimer -1
Internals:
0 EG_wc_BM_Motion:STATE OG_bz_BM_Motion:STATE
all EG_wc_BM_Motion:STATE OG_bz_BM_Motion:STATE
Readings:
State:
Trigger:
Attributes:
cmdpause 1200
do always
group doif
room Zirkulation
e_EG_wc_BM_Motion_STATE
e_OG_bz_BM_Motion_STATE
Zitat von: maxritti am 25 Januar 2015, 21:41:13ja, du kannst auch auf das Ereignis triggern.
im 5 Minuten Takt hoch zählen.
Ob das eine Einstellung der BMs ist?
Bei denen finde ich allerdings kein Register oder Readings, was mit 600 Sekunden gesetzt ist.
Hast Du dazu eine Idee?
CFGFN
DEF ([EG_wc_BM_Motion:?motion] or [OG_bz_BM_Motion:?motion]) (set du_Zirkpumpe on, define at_Z-Off at +00:03:00 set du_Zirkpumpe off, attr du_Zirkpumpe room Zirkulation)
NAME di_zirkulation
NR 1302
NTFY_ORDER 50-di_zirkulation
STATE initialized
TYPE DOIF
Readings:
2015-01-26 16:22:17 state initialized
Condition:
0 EventDoIf('EG_wc_BM_Motion',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'motion') or EventDoIf('OG_bz_BM_Motion',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'motion')
Devices:
0 EG_wc_BM_Motion OG_bz_BM_Motion
all EG_wc_BM_Motion OG_bz_BM_Motion
Do:
0 set du_Zirkpumpe on, define at_Z-Off at +00:03:00 set du_Zirkpumpe off, attr du_Zirkpumpe room Zirkulation
Helper:
last_timer 0
sleeptimer -1
State:
Timerfunc:
Trigger:
all EG_wc_BM_Motion OG_bz_BM_Motion
Attributes:
cmdpause 1200
disable 1
do always
group doif
room Zirkulation
CFGFN
DEF 1F8685
IODev myHMLAN
LASTInputDev myHMLAN
MSGCNT 328
NAME EG_wc_BM_Motion
NR 128
STATE motion
TYPE CUL_HM
lastMsg No:E4 - t:41 s:1F8685 d:9A234E 01862160
myHMLAN_MSGCNT 328
myHMLAN_RAWMSG E1F8685,0000,0655D61B,FF,FFCB,E4A6411F86859A234E01862160
myHMLAN_RSSI -53
myHMLAN_TIME 2015-01-26 16:23:45
protLastRcv 2015-01-26 16:23:45
protSnd 104 last_at:2015-01-26 16:23:45
protState CMDs_done
rssi_at_myHMLAN avg:-54.37 min:-74 max:-49 lst:-53 cnt:328
Readings:
2015-01-25 16:51:15 Activity alive
2015-01-18 14:43:21 CommandAccepted yes
2015-01-18 14:43:20 D-firmware 1.6
2015-01-18 14:43:20 D-serialNr KEQ0363099
2015-01-18 14:43:21 PairedTo 0x9A234E
2014-11-16 19:14:34 R-brightFilter 7
2014-11-16 19:14:34 R-captInInterval off
2014-11-16 19:14:34 R-evtFltrNum 1
2014-11-16 19:14:34 R-evtFltrPeriod 1 s
2014-11-16 19:14:34 R-ledOnTime 0 s
2014-11-16 19:14:34 R-minInterval 60
2015-01-18 14:43:21 R-pairCentral 0x9A234E
2014-11-16 19:14:33 R-sabotageMsg on
2015-01-18 14:43:21 RegL_00: 02:01 0A:9A 0B:23 0C:4E 10:01 00:00
2015-01-18 14:43:22 RegL_01: 01:12 02:72 08:00 22:00 00:00
2015-01-26 16:23:40 battery ok
2015-01-26 16:23:45 brightness 33
2015-01-26 16:23:40 cover closed
2015-01-26 16:23:45 motion on (to myVCCU)
2015-01-26 16:23:45 motionCount 134_next:29s
2015-01-26 16:23:40 recentStateType info
2014-11-07 07:18:30 rssi_at_myHMLAN -44
2015-01-26 16:23:45 state motion
2015-01-18 07:46:16 trigDst_9A234E noConfig
2015-01-26 16:23:45 trigDst_myVCCU noConfig
2015-01-26 16:23:45 trigger_cnt 134
Helper:
mId 004A
rxType 28
Io:
newChn +1F8685,00,01,1E
nextSend 1422285825.59603
rxt 2
vccu myVCCU
p:
1F8685
00
01
1E
prefIO:
myHMLAN
Mrssi:
mNo E4
Io:
myHMLAN -51
Prt:
bErr 0
sProc 0
sleeping 0
Rspwait:
Q:
qReqConf
qReqStat
Role:
chn 1
dev 1
Rpt:
IO myHMLAN
flg A
ts 1422285825.50157
ack:
HASH(0xa15b4cc)
E480029A234E1F868501012100
HASH(0xa15b4cc)
E480029A234E1F868500
Rssi:
At_myhmlan:
avg -54.375
cnt 328
lst -53
max -49
min -74
Attributes:
IODev myHMLAN
IOgrp myVCCU:myHMLAN
actCycle 000:20
actStatus alive
alias WC
autoReadReg 4_reqStatus
expert 2_full
firmware 1.6
model HM-SEC-MDIR
peerIDs 00000000,
room Zirkulation
serialNr KEQ0363099
subType motionDetector
Zitat von: maxritti am 26 Januar 2015, 16:27:20
Merkwürdigerweise ist das DOIF dann gar nicht angesprungen, als der BM motion gesendet hat.
([ZeitsteuerungTV] eq "FHEM" and ([{sunset("CIVIL",-620,"16:35","22:30")}|12345] or [{sunset("CIVIL",-1220,"16:35","22:20")}|06]))
(set WZ_Lampe_TV on)
DOELSEIF ([ZeitsteuerungTV] eq "FHEM" and ([00:45|12345] or [01:15|06]) or ([Temperatur_Wohnzimmer:luminosity:] < 1.00))
(set WZ_Lampe_TV off)
DOELSEIF([ZeitsteuerungTV] eq "FHEM")(attr ZufallsTimerTVLED disable 1)
DOELSEIF([ZeitsteuerungTV] eq "Zufall")(attr ZufallsTimerTVLED disable 0)
Zitat von: moonsorrox am 28 Januar 2015, 14:19:07
Ich weiß jetzt nicht wo ich diese Zeit rein bringe, habe etliche Versuche hinter mir aber das klappt nicht :-\
DOELSEIF ([ZeitsteuerungTV] eq "FHEM" and ([00:45|12345] or [01:15|06] or ([Temperatur_Wohnzimmer:luminosity:] < 1.00 and $hms gt "23:00:00")))
Zitatdefine ni_GlobalInitialized notify global:INITIALIZED trigger di_Rollo_SetTime
trigger di_Rollo_SetTime
alleine funktioniert nicht.Zitat von: Brockmann am 28 Januar 2015, 15:03:58
Vielleicht so (ungetestet):Code Auswählen
DOELSEIF ([ZeitsteuerungTV] eq "FHEM" and ([00:45|12345] or [01:15|06] or ([Temperatur_Wohnzimmer:luminosity:] < 1.00 and $hms gt "23:00:00")))
... ([Temperatur_Wohnzimmer:luminosity:] < 1.00 and [?23:00-10:00]) ...
Zitat von: Brockmann am 28 Januar 2015, 15:03:58
Vielleicht so (ungetestet):
Zitat von: moonsorrox am 28 Januar 2015, 17:25:51
Ok vielen Dank, ich habe das mal so mit Damians Änderung eingebaut und werde es jetzt testen. Is ja gleich soweit das es angehen sollte, also sollte es auch anbleiben und nicht schon wieder ausgehen, denn der luminosity Wert ist schon unter "1"
@Damian
vielen Dank
die zweite Zeit ist gedacht für was..?
Das er sieht das es für den heutigen Tag gilt und über Mitternacht, dann erst morgen wieder..?
Das habe ich nicht verstanden.
Zitat von: Damian am 28 Januar 2015, 17:57:03ich lese echt viel in der commandref zu deinem DOIF Modul weil ich es genial finde was man damit alles machen, habe erfolgreich schon mindestens 6 DOIF im Betrieb, aber manchmal ist es nicht so einfach... ;)
Es sind Zeitintervalle (es gibt genügend Beispiele zu diesem Thema in der Commandref zu DOIF).
Ein Intervall hat ein Anfang und ein Ende. In diesem Beispiel ist das Zeitintervall von 23:00 Uhr bis 10:00 Uhr wahr in der sonstigen Zeit, also von 10:00 bis 23:00 Uhr ist es nicht wahr.
Zitat von: moonsorrox am 28 Januar 2015, 18:03:40
ich lese echt viel in der commandref zu deinem DOIF Modul weil ich es genial finde was man damit alles machen, habe erfolgreich schon mindestens 6 DOIF im Betrieb, aber manchmal ist es nicht so einfach... ;)
ZitatBeim Speichern der cfg datei, oder bei neustart von FHEM verlieren meine DOIF die Uhrzeiten.
Folgendes Notify sollte es auffangen:
Zitat
define ni_GlobalInitialized notify global:INITIALIZED trigger di_Rollo_SetTime
Funktioniert aber nicht :-( bzw. der Befehl
Code: [Auswählen]
trigger di_Rollo_SetTime
alleine funktioniert nicht.
Jemand eine Idee woran das liegen könnte? Ausserdem wird das notify anscheinendn nicht beim speichern der cfg aufgerufen. Hat da jemand eine idee wie ich das abfange?
Zitat von: RettungsTim am 28 Januar 2015, 15:30:58Auch das "oder" verwirrt mich. Das externe Speichern der fhem.cfg hat auf den laufenden Betrieb keine Auswirkungen, bis FHEM neu gestartet wird.
Beim Speichern der cfg datei, oder bei neustart von FHEM verlieren meine DOIF die Uhrzeiten.
Zitat von: Rince am 29 Januar 2015, 05:02:06
Trigger dient nicht zum "scharf" stellen, sondern zum auslösen eines Notify.
Und es braucht einen Parameter, der dem Notify vorgespielt werden soll.
(in erster Klammer steht die Prüfung, die erfüllt sein muss) (in der zweiten Klammer steht der Befehl der ausgeführt werden soll wenn die Bedingung in Klammer 1 wahr ist)
DOELSEIF
(wieder erste Klammer mit Bedingung) (und zweite Klammer mit Befehl wenn die Bedingung2 wahr ist)
DOELSEIF
(es können beliebig viele DOELSEIF-Bedingungen angegeben werden) (und jeweils in der zweiten Klammer der Befehl)
DOELSE
(optional gibt es dann DOELSE, das ausgeführt wird wenn keine der IF/DOELSEIF-Bedingungen wahr ist. DOELSE darf natürlich nur eine Klammer haben, es gibt ja keine eigene Prüfung)
Zitat von: maxritti am 29 Januar 2015, 09:11:05Die Idee von Brockmann aus dem Post hier funktioniert auch nicht wirklich.
http://forum.fhem.de/index.php/topic,23833.msg249269.html#msg249269
Nach dem Neustart stehen nach wie vor die Default Werte von ReadingsVal in den DOIFs Definitionen.
([Aussen_Sensor:luminosity:] < 0.90 ) (set FS20_S8_B on) DOELSE ([Aussen_Sensor:luminosity:] > 1.50 ) (set FS20_S8_B off)
2015.01.29 08:24:23 2: Licht_Kugel_an: 1.68 > 1.50 : Unknown command 1.68, try help.
([Aussen_Sensor:luminosity] < 0.90 ) (set FS20_S8_B on)
DOELSEIF
([Aussen_Sensor:luminosity] > 1.50 ) (set FS20_S8_B off)
Zitat von: maxritti am 29 Januar 2015, 09:11:05
Ich habe für meine Rollosteuerung ein paar Dummys erzeugt, wo ich manuell Zeiten eingeben kann.
Dies sind Zeitfenster, wenn Rollos hoch und runter gehen sollen.
Auch habe ich dort Schwellwerte für meinen Helligkeitssensor hinterlegt.
Zitat von: maxritti am 29 Januar 2015, 12:38:43
Gerade noch mal in Ruhe getestet.
Es funktioniert doch.
[global:?initialized] mit in die DEF das DOIF, welches auf die Eingaben der Dummys reagiert und dann stehen korrekt die Inhalte der Dummys in den timer :D der DOIFs.
2015.01.29 17:51:40.028 3: CUL_HM set OG_ki2_RO_Garten off
2015.01.29 17:51:40.026 3: CUL_HM set OG_ki1_RO_Garten off
2015.01.29 17:51:40.024 3: CUL_HM set OG_ki1_RO_Carport off
2015.01.29 17:51:40.022 3: CUL_HM set OG_elt_RO_Strasse off
2015.01.29 17:51:40.020 3: CUL_HM set EG_wz_RO_TerrasseRechts off
2015.01.29 17:51:40.018 3: CUL_HM set EG_wz_RO_TerrasseLinks off
2015.01.29 17:51:40.015 3: CUL_HM set EG_wz_RO_Carport off
2015.01.29 17:51:40.012 3: CUL_HM set EG_ku_RO_StrasseRechts off
2015.01.29 17:51:40.010 3: CUL_HM set EG_ku_RO_StrasseLinks off
2015.01.29 17:43:56.215 3: CUL_HM set OG_ki2_RO_Garten off
2015.01.29 17:43:56.213 3: CUL_HM set OG_ki1_RO_Garten off
2015.01.29 17:43:56.211 3: CUL_HM set OG_ki1_RO_Carport off
2015.01.29 17:43:56.209 3: CUL_HM set OG_elt_RO_Strasse off
2015.01.29 17:43:56.207 3: CUL_HM set EG_wz_RO_TerrasseRechts off
2015.01.29 17:43:56.205 3: CUL_HM set EG_wz_RO_TerrasseLinks off
2015.01.29 17:43:56.203 3: CUL_HM set EG_wz_RO_Carport off
2015.01.29 17:43:56.201 3: CUL_HM set EG_ku_RO_StrasseRechts off
2015.01.29 17:43:56.198 3: CUL_HM set EG_ku_RO_StrasseLinks off
2015.01.29 17:32:14.932 3: CUL_HM set OG_ki2_RO_Garten off
2015.01.29 17:32:14.930 3: CUL_HM set OG_ki1_RO_Garten off
2015.01.29 17:32:14.928 3: CUL_HM set OG_ki1_RO_Carport off
2015.01.29 17:32:14.927 3: CUL_HM set OG_elt_RO_Strasse off
2015.01.29 17:32:14.925 3: CUL_HM set EG_wz_RO_TerrasseRechts off
2015.01.29 17:32:14.923 3: CUL_HM set EG_wz_RO_TerrasseLinks off
2015.01.29 17:32:14.921 3: CUL_HM set EG_wz_RO_Carport off
2015.01.29 17:32:14.919 3: CUL_HM set EG_ku_RO_StrasseRechts off
2015.01.29 17:32:14.916 3: CUL_HM set EG_ku_RO_StrasseLinks off
2015.01.29 17:29:15.165 3: CUL_HM set OG_ki2_RO_Garten off
2015.01.29 17:29:15.163 3: CUL_HM set OG_ki1_RO_Garten off
2015.01.29 17:29:15.161 3: CUL_HM set OG_ki1_RO_Carport off
2015.01.29 17:29:15.159 3: CUL_HM set OG_elt_RO_Strasse off
2015.01.29 17:29:15.157 3: CUL_HM set EG_wz_RO_TerrasseRechts off
2015.01.29 17:29:15.155 3: CUL_HM set EG_wz_RO_TerrasseLinks off
2015.01.29 17:29:15.153 3: CUL_HM set EG_wz_RO_Carport off
2015.01.29 17:29:15.151 3: CUL_HM set EG_ku_RO_StrasseRechts off
2015.01.29 17:29:15.148 3: CUL_HM set EG_ku_RO_StrasseLinks off
2015.01.29 17:23:38.493 3: CUL_HM set OG_ki2_RO_Garten off
2015.01.29 17:23:38.491 3: CUL_HM set OG_ki1_RO_Garten off
2015.01.29 17:23:38.489 3: CUL_HM set OG_ki1_RO_Carport off
2015.01.29 17:23:38.487 3: CUL_HM set OG_elt_RO_Strasse off
2015.01.29 17:23:38.485 3: CUL_HM set EG_wz_RO_TerrasseRechts off
2015.01.29 17:23:38.483 3: CUL_HM set EG_wz_RO_TerrasseLinks off
2015.01.29 17:23:38.481 3: CUL_HM set EG_wz_RO_Carport off
2015.01.29 17:23:38.478 3: CUL_HM set EG_ku_RO_StrasseRechts off
2015.01.29 17:23:38.476 3: CUL_HM set EG_ku_RO_StrasseLinks off
Internals:
CFGFN
DEF ([global:?initialized] or [du_Rollo_Zeit_ho] or [du_Rollo_Zeit_ho_WE] or [du_Rollo_Luminosity_ru] or [du_Rollo_Zeit_ru_start] or [du_Rollo_Zeit_ru_ende]) (modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseRechts:&DEF], modify di_OG_elt_RO_Strasse [di_OG_elt_RO_Strasse:&DEF], modify di_OG_ki1_RO_Carport [di_OG_ki1_RO_Carport:&DEF], modify di_OG_ki1_RO_Garten [di_OG_ki1_RO_Garten:&DEF], modify di_OG_ki2_RO_Garten [di_OG_ki2_RO_Garten:&DEF])
NAME di_Rollo_SetTime
NR 106
NTFY_ORDER 50-di_Rollo_SetTime
STATE cmd_1
TYPE DOIF
Readings:
2015-01-29 19:04:31 cmd_event global
2015-01-29 19:04:31 cmd_nr 1
2015-01-29 19:04:31 e_global_events DELETED du_Test
2015-01-29 19:04:31 state cmd_1
Condition:
0 EventDoIf('global',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'initialized') or InternalDoIf('du_Rollo_Zeit_ho','STATE','') or InternalDoIf('du_Rollo_Zeit_ho_WE','STATE','') or InternalDoIf('du_Rollo_Luminosity_ru','STATE','') or InternalDoIf('du_Rollo_Zeit_ru_start','STATE','') or InternalDoIf('du_Rollo_Zeit_ru_ende','STATE','')
Devices:
0 global du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende
all global du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende
Do:
0 modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseRechts:&DEF], modify di_OG_elt_RO_Strasse [di_OG_elt_RO_Strasse:&DEF], modify di_OG_ki1_RO_Carport [di_OG_ki1_RO_Carport:&DEF], modify di_OG_ki1_RO_Garten [di_OG_ki1_RO_Garten:&DEF], modify di_OG_ki2_RO_Garten [di_OG_ki2_RO_Garten:&DEF]
Helper:
last_timer 0
sleeptimer -1
triggerDev global
triggerEvents:
DELETED du_Test
MODIFIED di_EG_ku_RO_StrasseLinks
MODIFIED di_EG_ku_RO_StrasseRechts
MODIFIED di_EG_wz_RO_Carport
MODIFIED di_EG_wz_RO_TerrasseLinks
MODIFIED di_EG_wz_RO_TerrasseRechts
MODIFIED di_OG_elt_RO_Strasse
MODIFIED di_OG_ki1_RO_Carport
MODIFIED di_OG_ki1_RO_Garten
MODIFIED di_OG_ki2_RO_Garten
Internals:
0 du_Rollo_Zeit_ho:STATE du_Rollo_Zeit_ho_WE:STATE du_Rollo_Luminosity_ru:STATE du_Rollo_Zeit_ru_start:STATE du_Rollo_Zeit_ru_ende:STATE
all du_Rollo_Zeit_ho:STATE du_Rollo_Zeit_ho_WE:STATE du_Rollo_Luminosity_ru:STATE du_Rollo_Zeit_ru_start:STATE du_Rollo_Zeit_ru_ende:STATE
Readings:
State:
Timerfunc:
Trigger:
all global
Attributes:
do always
room LichtRollo
2015-01-29 19:04:31 cmd_event global
2015-01-29 19:04:31 cmd_nr 1
2015-01-29 19:04:31 e_global_events DELETED du_Test
2015-01-29 19:04:31 state cmd_1
([du_Rollo_Master] eq "an" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "22:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "22:00:00")}])) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "22:00:00")}]))
(set OG_elt_RO_Strasse off)
DOELSEIF ([du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "10:00:00")}|8] or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "10:00:00")}|7]))
(set OG_elt_RO_Strasse on)
define du_Zeit dummy
attr du_Zeit setList state:textField
attr du_Zeit webCmd state
define du_Rollo dummy
define di_Rollo DOIF ([{ReadingsVal("du_Zeit", "state", "22:00:00")}]) (set du_Rollo on)
define di_SetTime DOIF ([global:?initialized] or [du_Zeit]) (modify di_Rollo [di_Rollo:&DEF])
attr di_SetTime do always
ZitatInternals:
CFGFN
DEF ([global:?initialized] or [du_Zeit]) (modify di_Rollo [di_Rollo:&DEF])
NAME di_SetTime
NR 45
NTFY_ORDER 50-di_SetTime
STATE cmd_1
TYPE DOIF
Readings:
2015-01-29 21:06:03 cmd_event global
2015-01-29 21:06:03 cmd_nr 1
2015-01-29 21:04:31 e_du_Zeit_STATE 09:30
2015-01-29 21:04:31 e_du_Zeit_events 09:30
2015-01-29 21:06:03 e_global_events DEFINED du_test
2015-01-29 21:06:03 state cmd_1
Condition:
0 EventDoIf('global',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'initialized') or InternalDoIf('du_Zeit','STATE','')
Devices:
0 global du_Zeit
all global du_Zeit
Do:
0 modify di_Rollo [di_Rollo:&DEF]
Helper:
last_timer 0
sleeptimer -1
triggerDev global
triggerEvents:
DEFINED du_test
MODIFIED di_Rollo
Internals:
0 du_Zeit:STATE
all du_Zeit:STATE
Readings:
State:
Trigger:
all global
Attributes:
do always
Zitat von: maxritti am 29 Januar 2015, 21:10:55
Das ganze ist auch reproduzierbar.
Man definiert folgenden Dummy:Code Auswählendefine du_Zeit dummy
attr du_Zeit setList state:textField
attr du_Zeit webCmd state
und diesen Dummy:Code Auswählendefine du_Rollo dummy
Dieses DOIF:Code Auswählendefine di_Rollo DOIF ([{ReadingsVal("du_Zeit", "state", "22:00:00")}]) (set du_Rollo on)
und dieses DOIF:Code Auswählendefine di_SetTime DOIF ([global:?initialized] or [du_Zeit]) (modify di_Rollo [di_Rollo:&DEF])
attr di_SetTime do always
Nun kann man in dem Dummy du_Zeit einen Zeitwert eingeben und den Focus aus dem Textfeld bewegen.
Dann sieht man im DOIF di_Rollo als internet Timer den eingegebenen Zeitwert.
Soweit so gut.
Gibt man in Fhem Web nun ein define du_test dummy sieht man bei den Readings vom DOIF di_SetTime, dass cmd_1 mit e_global_events
DEFINED du_test eben zu dem Zeitpunkt der Eingabe von define du_Test dummy ausgeführt wurde.
Das dürfte meiner Meinung nach nicht sein oder?
define di_SetTime DOIF ([global:?initialized])|([du_Zeit]) (modify di_Rollo [di_Rollo:&DEF])
define BinIchDa structure s_structure s3 s5
[code]define di_allesAusBeiAbwesend DOIF ([BinIchDa] eq "absent") \
(set TVLICHT_hinten off,\
set TVLICHT_vorne off,\
und so weiter......)
[/code]ZitatDazu die attribute wait und do always...
([pl_soBad] eq "on") (
IF ([pr_soBad] eq "present")
(IF ([player:config] eq "auto") (set sonos_Bad Volume 12,
set sonos_Wohnzimmer AddMember sonos_Bad, attr pr_soBad disable 1,
set EntertainmentEvents add Bad Lautsprecher im Automatikmode angeschaltet und zur Wohnzimmer Wiedergabe hinzugefügt...)
ELSE (set EntertainmentEvents add Der Bad Lautsprecher ist im Sonossystem zur Wiedergabe bereit...,
attr pr_soBad disable 1)
)
ELSE
(set pl_soBad off,set EntertainmentEvents add Netzwerkeinbindung missglückt - ich versuche den Player neu zu starten.,
define at_pl_soBad at +00:00:05 set pl_soBad on)
)
Zitat von: Damian am 29 Januar 2015, 21:45:26Kann es sein, dass das global auch noch durch andere Dinge getriggert wird?
Das ist ganz einfach. Durch das define ... triggert global. Da es in der ersten Bedingung vorkommt, wird diese ausgewertet. global ist zwar nicht initialized dafür ist aber dein or-Fall mit [du_Zeit] wahr und das führt zu cmd1.
Edit: Zukünftig wird man unabhängige Ereignisse bei DOIF angeben können (steht bereits auf der todo-Liste im ersten Post). Das wird dann in diesem Fall so aussehen:Code Auswählendefine di_SetTime DOIF ([global:?initialized])|([du_Zeit]) (modify di_Rollo [di_Rollo:&DEF])
Damit wird man solche Abhängigkeiten in den Griff bekommen.
Gruß
Damian
Zitat von: maxritti am 30 Januar 2015, 07:30:40ja, siehe mein letzter Beitrag
Kann es sein, dass das global auch noch durch andere Dinge getriggert wird?
ZitatIch vermute da mal in der Tat das global:?initialized.nein, siehe mein letzter Beitrag
ZitatDenn wenn das raus ist, ist ruhe.ist logisch
ZitatNur was kann das noch alles initiieren?hier gibt es nichts, was initialisiert
ZitatAber wenn es auf deinem ToDo Zettel steht ist es ja nur eine Frage der Zeit. :)
ZitatDanke schon mal dafür.
Internals:
CFGFN
DEF ([global:?initialized] or [du_Rollo_Zeit_ho:?] or [du_Rollo_Zeit_ho_WE:?] or [du_Rollo_Luminosity_ru:?] or [du_Rollo_Zeit_ru_start:?] or [du_Rollo_Zeit_ru_ende]:?) (modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseRechts:&DEF], modify di_OG_elt_RO_Strasse [di_OG_elt_RO_Strasse:&DEF], modify di_OG_ki1_RO_Carport [di_OG_ki1_RO_Carport:&DEF], modify di_OG_ki1_RO_Garten [di_OG_ki1_RO_Garten:&DEF], modify di_OG_ki2_RO_Garten [di_OG_ki2_RO_Garten:&DEF])
NAME di_Rollo_SetTime
NR 106
NTFY_ORDER 50-di_Rollo_SetTime
STATE initialized
TYPE DOIF
Readings:
2015-01-30 13:33:39 e_du_Rollo_Luminosity_ru_events 0.92
2015-01-30 13:33:50 e_du_Rollo_Zeit_ho_events 06:35
2015-01-30 13:33:17 e_global_events MODIFIED di_Rollo_SetTime
2015-01-30 13:33:50 error perl error in condition: EventDoIf('global',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'initialized') or EventDoIf('du_Rollo_Zeit_ho',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or EventDoIf('du_Rollo_Zeit_ho_WE',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or EventDoIf('du_Rollo_Luminosity_ru',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or EventDoIf('du_Rollo_Zeit_ru_start',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or InternalDoIf('du_Rollo_Zeit_ru_ende','STATE',''):?: Search pattern not terminated or ternary operator parsed as search pattern at (eval 23168) line 1.
2015-01-30 13:33:17 state initialized
Condition:
0 EventDoIf('global',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'initialized') or EventDoIf('du_Rollo_Zeit_ho',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or EventDoIf('du_Rollo_Zeit_ho_WE',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or EventDoIf('du_Rollo_Luminosity_ru',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or EventDoIf('du_Rollo_Zeit_ru_start',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or InternalDoIf('du_Rollo_Zeit_ru_ende','STATE',''):?
Devices:
0 global du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende
all global du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende
Do:
0 modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseRechts:&DEF], modify di_OG_elt_RO_Strasse [di_OG_elt_RO_Strasse:&DEF], modify di_OG_ki1_RO_Carport [di_OG_ki1_RO_Carport:&DEF], modify di_OG_ki1_RO_Garten [di_OG_ki1_RO_Garten:&DEF], modify di_OG_ki2_RO_Garten [di_OG_ki2_RO_Garten:&DEF]
Helper:
last_timer 0
sleeptimer -1
triggerDev du_Rollo_Zeit_ho
triggerEvents:
06:35
Internals:
0 du_Rollo_Zeit_ru_ende:STATE
all du_Rollo_Zeit_ru_ende:STATE
Readings:
State:
Timerfunc:
Trigger:
all global du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start
Attributes:
do always
room LichtRollo
Zitat von: der-Lolo am 30 Januar 2015, 06:35:23
Guten Morgen Invers,
Ich glaube ich habe einen ähnlichen anwendungsfall bereits in meiner config, Damian half mir damals dabei - aber schau selbst...
DEF=Dazu die attribute wait und do always...
Es ist also ein geschachtel mit IF.
Als eingangsbedingung nimmst du deinen abwesend Trigger, wait time sollte die zeit sein die du dir selbst gibst einen tastendruck auszulösen.
Sollte während der wait Time nicht der Tastendruck ausgelöst werden springt das konstruckt in den unteren ELSE zweig - in meinem fall der mit dem timer, dort solltest du dann alles ausschalten.
Das zweite IF konstrukt brauchst du wahrscheinlich gar nicht, bei mir wird in diesem fall anhand von player:config entschieden ob sich der player automatisch gruppieren soll - oder ob er sich als standalone ins sonos netz integriert.
Also das zweite if weglassen und dort deinen vorgang für anwesed trotz presence absent schalten.
Deine tts ausgabe mit der aufforderung eine taste zu drücken solltest du seperat auslösen.
In meinem Fall ist pl_ ein aktor (plug), pr_ ein presence Device, sonos ein player und EntertainmentEvents ein readingshistory als userlog.
Die möglichkeit in den ausführungsteile ein IF zu integrieren eröffnet allerdings auch neue Möglichkeiten für gebastel ;-)
define DI_Test DOIF ([Lampe_Korridor] eq "on")
(
IF ([Taster_unten] =~ "Short")
(set MyTTS tts Alle Handys offline!)
ELSE
(set Lampe_Korridor off)
)
attr DI_Test do always
attr DI_Test wait 20
Zitat von: maxritti am 30 Januar 2015, 13:35:20
Irgendwie habe ich immer mehr ? vor der Stirn stehen. ;)
Heisst das nun, dass ich bei allen Dummys, welche in meinem di_Rollo_SetTime abgefragt werden das :? einfügen sollte?
Das hat dann aber zur Folge, dass das DOIF gar nicht mehr reagiert.
Zitat von: Invers am 30 Januar 2015, 14:43:01
Vielen Dank, das funktioniert soweit eitgentlich (fast). Ich habe mir zum Test folgendes geschrieben:Code Auswählendefine DI_Test DOIF ([Lampe_Korridor] eq "on")
(
IF ([Taste_unten])
(set MyTTS tts Alle Handys offline!)
ELSE
(set Lampe_Korridor off)
)
attr DI_Test do always
attr DI_Test wait 20
Das funktioniert so lange, bis erstmalig die Taste kurz gedrückt wurde. Danach geht es nicht mehr, weil sich der Taster offenbar den Zustand merkt und bei Anfrage immer wieder zurückgibt. Es handelt sich um einen HM-PB-2-WM55-2.
Das bedeutet, dass es erst wieder geht, wenn der Taster zwischendurch einmal lang gedrückt wurde.
Kann man das irgendwie korrigieren? Falls nicht, müsste ich mir einen Dummy bauen.
define di_allesAusMeldung DOIF ([BinIchDa] eq "absent")
(set MyTTS tts Alle Handys offline!)
attr di_allesAusMeldung do always
define di_allesAusBeiAbwesend DOIF ([BinIchDa] eq "absent")
(set TVLICHT_hinten off, set TVLICHT_vorne off,...)
DOELSEIF ([Taste_unten])
attr di_allesAusBeiAbwesend 20
attr di_allesAusBeiAbwesend do always
Zitat von: Damian am 30 Januar 2015, 16:38:05
Du verwechselst [?Device] mit [Device:?]. Das erste ist für reine Abfrage ohne Trigger, das andere ist ein reiner Trigger auf alles vom Device.
Gruß
Damian
Internals:
CFGFN
DEF ([global:?initialized] or [du_Rollo_Zeit_ho:?] or [du_Rollo_Zeit_ho_WE:?] or [du_Rollo_Luminosity_ru:?] or [du_Rollo_Zeit_ru_start:?] or [du_Rollo_Zeit_ru_ende:?]) (modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseRechts:&DEF], modify di_OG_elt_RO_Strasse [di_OG_elt_RO_Strasse:&DEF], modify di_OG_ki1_RO_Carport [di_OG_ki1_RO_Carport:&DEF], modify di_OG_ki1_RO_Garten [di_OG_ki1_RO_Garten:&DEF], modify di_OG_ki2_RO_Garten [di_OG_ki2_RO_Garten:&DEF])
NAME di_Rollo_SetTime
NR 106
NTFY_ORDER 50-di_Rollo_SetTime
STATE cmd_2
TYPE DOIF
Readings:
2015-01-30 21:35:22 cmd_event global
2015-01-30 21:35:22 cmd_nr 2
2015-01-30 18:57:31 e_du_Rollo_Luminosity_ru_events 0.9
2015-01-30 18:57:38 e_du_Rollo_Zeit_ho_events 06:35
2015-01-30 21:35:22 e_global_events ATTR myDashboard_weblink room DashboardRoom
2015-01-30 21:35:22 state cmd_2
Condition:
0 EventDoIf('global',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'initialized') or EventDoIf('du_Rollo_Zeit_ho',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or EventDoIf('du_Rollo_Zeit_ho_WE',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or EventDoIf('du_Rollo_Luminosity_ru',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or EventDoIf('du_Rollo_Zeit_ru_start',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or EventDoIf('du_Rollo_Zeit_ru_ende',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'')
Devices:
0 global du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende
all global du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende
Do:
0 modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseRechts:&DEF], modify di_OG_elt_RO_Strasse [di_OG_elt_RO_Strasse:&DEF], modify di_OG_ki1_RO_Carport [di_OG_ki1_RO_Carport:&DEF], modify di_OG_ki1_RO_Garten [di_OG_ki1_RO_Garten:&DEF], modify di_OG_ki2_RO_Garten [di_OG_ki2_RO_Garten:&DEF]
Helper:
last_timer 0
sleeptimer -1
triggerDev global
triggerEvents:
ATTR myDashboard_weblink room DashboardRoom
Internals:
Readings:
State:
Trigger:
all global du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende
Attributes:
do always
room LichtRollo
Internals:
CFGFN
DEF ([du_Rollo_Master] eq "an" and ([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and [du_Rollo_Art] ne "Weihnachten" and [{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "22:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "22:00:00")}]) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "22:00:00")}])
(set EG_ku_RO_StrasseLinks off)
DOELSEIF ([du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "10:00:00")}|8] or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "10:00:00")}|7]))
(set EG_ku_RO_StrasseLinks on)
NAME di_EG_ku_RO_StrasseLinks
NR 107
NTFY_ORDER 50-di_EG_ku_RO_StrasseLinks
STATE cmd_1
TYPE DOIF
Readings:
2015-01-30 21:40:00 cmd_event timer_3
2015-01-30 21:40:00 cmd_nr 1
2015-01-30 21:40:00 state cmd_1
2015-01-30 21:39:18 timer_1_c1 31.01.2015 16:15:00
2015-01-30 21:40:00 timer_2_c1 31.01.2015 21:40:00
2015-01-30 21:40:00 timer_3_c1 31.01.2015 21:40:00
2015-01-30 21:39:18 timer_4_c2 31.01.2015 06:35:00|8
2015-01-30 21:39:18 timer_5_c2 31.01.2015 09:30:00|7
Condition:
0 InternalDoIf('du_Rollo_Master','STATE','') eq "an" and (ReadingValDoIf('EG_dr_TS_Terrasse','luminosity','') < InternalDoIf('du_Rollo_Luminosity_ru','STATE','') and InternalDoIf('du_Rollo_Art','STATE','') ne "Weihnachten" and DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")) or DOIF_time_once($hash->{timer}{2},$wday,"")
1 InternalDoIf('du_Rollo_Master','STATE','') eq "an" and (DOIF_time_once($hash->{timer}{3},$wday,"8") or DOIF_time_once($hash->{timer}{4},$wday,"7"))
Days:
3 8
4 7
Devices:
0 du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru du_Rollo_Art
1 du_Rollo_Master
all du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru du_Rollo_Art
Do:
0 set EG_ku_RO_StrasseLinks off
1 set EG_ku_RO_StrasseLinks on
Helper:
last_timer 5
sleeptimer -1
Internals:
0 du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE du_Rollo_Art:STATE
1 du_Rollo_Master:STATE
all du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE du_Rollo_Art:STATE
Readings:
0 EG_dr_TS_Terrasse:luminosity
all EG_dr_TS_Terrasse:luminosity
Realtime:
0 16:15:00
1 21:40:00
2 21:40:00
3 06:35:00
4 09:30:00
State:
Time:
0 {ReadingsVal("du_Rollo_Zeit_ru_start", "state", "22:00:00")}
1 {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "22:00:00")}
2 {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "22:00:00")}
3 {ReadingsVal("du_Rollo_Zeit_ho", "state", "10:00:00")}
4 {ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "10:00:00")}
Timecond:
0 0
1 0
2 0
3 1
4 1
Timer:
0 0
1 0
2 0
3 0
4 0
Timerfunc:
Timers:
0 0 1 2
1 3 4
Attributes:
room LichtRollo
Zitat von: maxritti am 30 Januar 2015, 21:43:58
Jetzt ist es allerdings wieder so, dass zwar nach einer Eingabeänderung der Dummys die DOIFs korrekte Timer beinhalten, aber nach einem Restart von FHEM wieder die Default Werte, welche von ReadingsVal(...) geliefert werden.
DOIF ([global:?initialized]) (modify...
DOIF ([global:?initialized] or [irgendeindevice:?] or...) (modify...
ZitatInternals:
CFGFN
DEF ([global:?initialized] or [du_Rollo_Zeit_ho:?] or [du_Rollo_Zeit_ho_WE:?] or [du_Rollo_Luminosity_ru:?] or [du_Rollo_Zeit_ru_start:?] or [du_Rollo_Zeit_ru_ende:?]) (modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseRechts:&DEF], modify di_OG_elt_RO_Strasse [di_OG_elt_RO_Strasse:&DEF], modify di_OG_ki1_RO_Carport [di_OG_ki1_RO_Carport:&DEF], modify di_OG_ki1_RO_Garten [di_OG_ki1_RO_Garten:&DEF], modify di_OG_ki2_RO_Garten [di_OG_ki2_RO_Garten:&DEF])
NAME di_Rollo_SetTime
NR 106
NTFY_ORDER 50-di_Rollo_SetTime
STATE cmd_2
TYPE DOIF
Readings:
2015-01-30 22:07:46 cmd_event global
2015-01-30 22:07:46 cmd_nr 2
2015-01-30 21:39:18 e_du_Rollo_Luminosity_ru_events 0.91
2015-01-30 18:57:38 e_du_Rollo_Zeit_ho_events 06:35
2015-01-30 22:07:46 e_global_events ATTR myDashboard_weblink room DashboardRoom
2015-01-30 22:07:46 state cmd_2
Condition:
0 EventDoIf('global',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'initialized') or EventDoIf('du_Rollo_Zeit_ho',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or EventDoIf('du_Rollo_Zeit_ho_WE',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or EventDoIf('du_Rollo_Luminosity_ru',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or EventDoIf('du_Rollo_Zeit_ru_start',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'') or EventDoIf('du_Rollo_Zeit_ru_ende',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'')
Devices:
0 global du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende
all global du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende
Do:
0 modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseRechts:&DEF], modify di_OG_elt_RO_Strasse [di_OG_elt_RO_Strasse:&DEF], modify di_OG_ki1_RO_Carport [di_OG_ki1_RO_Carport:&DEF], modify di_OG_ki1_RO_Garten [di_OG_ki1_RO_Garten:&DEF], modify di_OG_ki2_RO_Garten [di_OG_ki2_RO_Garten:&DEF]
Helper:
last_timer 0
sleeptimer -1
triggerDev global
triggerEvents:
ATTR myDashboard_weblink room DashboardRoom
Internals:
Readings:
State:
Trigger:
all global du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende
Attributes:
do always
room LichtRollo
Zitat von: maxritti am 30 Januar 2015, 22:11:27
Tjo,
ich verstehe es wie gesagt auch nicht mehr.
Noch mal ein letzter Versuch, vielleicht bringt uns das noch in die richtige Richtung:
Nach einem Shutdown und Serviceneustart von FHEM steht in dem DOIF dies hier:
Wie kann denn da auf einmal was von einem Dashboardweblink drin stehen?
Wie gesagt, wenn Dir dazu nichts einfällt, dann bin ich erst mal ruhig. Versprochen ;)
DEF ([{ReadingsVal("test_d","state","00:00")}])(set bla on)
NAME di_test
NR 374
NTFY_ORDER 50-di_test
STATE initialized
TYPE DOIF
Readings:
2015-01-30 23:38:45 state initialized
2015-01-30 23:38:45 timer_1_c1 31.01.2015 15:00:00
DEF ([global:?INITIALIZED] or [test_d:?])(modify di_test [di_test:&DEF])
NAME di_init
NR 375
NTFY_ORDER 50-di_init
STATE cmd_1
TYPE DOIF
Readings:
2015-01-30 23:38:45 cmd_event global
2015-01-30 23:38:45 cmd_nr 1
2015-01-30 23:38:45 e_global_events INITIALIZED
2015-01-30 23:37:53 e_test_d_events 15:00
2015-01-30 23:38:45 state cmd_1
define DI_WM DOIF ([WasserKeller] =~ "off" and [04:00] and [WM_4Uhr] eq "on") (set Waschmaschine on-for-timer 11264,define WA4 at +03:00 set WM_4Uhr off) DOELSEIF ([WasserKeller] =~ "off" and [16:00] and [WM_16Uhr] eq "on") (set Waschmaschine on-for-timer 11264,define WA16 at +03:00 set WM_16Uhr off)
Zitat von: Aarghh am 01 Februar 2015, 12:33:02
Moin Moin,
ich habe jetzt lange probiert, getestet und evaluiert. Und anscheinend triggert DOIF bei mir bei jeder Änderung des GEOFANCY Moduls. Egal wer grade wo ankommt oder weggeht.
Kann natürlich auch ein Fehler der Implementierung von GEOFANCY, Denkfehler meinerseits oder vielleicht ja auch so gewollt sein, ich versuch es erstmal hier, weil ein notify korrekt funktioniert. Zum Versuchsaufbau: ;)
DOIF:
define do_PERSON2_Status DOIF ([geofancy:PERSON2] =~ "left ORT" and [?do_PERSON2_Status] eq "anwesend") (...)
NOTIFY (funktioniert):
geofancy.*PERSON2.* set push msg 'Test' 'notify durch geofancy ausgelöst' 'Mich' 0 ''
Wenn jetzt eine ANDERE Person einen Ort verlässt oder betritt, wird das DOIF von PERSON2 getriggert. Die betreffenden Readings für PERSON2 sind zu dem Moment zutreffend:
geofancy:PERSON2 = left Ort1
do_PERSON2_Status = anwesend
sollten aber ja nicht ausgewertet werden(,oder?), da PERSON2 sich "nicht bewegt" hat und damit kein Event für diese Readings vom GEOFANCY Modul ausgelöst wurde. Events von do_PERSON2_Status sollten durch das ? ja eh nicht beachtet werden, richtig?
Riecht also alles nach nem Problem von GEOFANCY dachte ich. (Leider) hat ein test Notify korrekt funktioniert und triggert nur bei Bewegungen von PERSON2.
Also, hab ich was falsch verstanden? Oder funktioniert hier was nicht so, wie es soll?
Schönen Gruß,
Alex
Zitat von: KernSani am 01 Februar 2015, 01:08:25
Ich begebe mich auf dünnes Eis, da ich DOIF zwar verwende aber sicher kein Experte bin... Meinem Verständnis nach funktioniert dein DOELSEIF-Zweig nur, wenn es 16:00 Uhr ist und de entsprechenden Events für WasserKeller und WM_16Uhr eintreten. Das wird wohl kaum der Fall sein. Für reine Statusabfragen gibt's das ? - siehe commandref.
Grüße,
Oli
Zitat von: Aarghh am 02 Februar 2015, 12:42:33
Ahhh, ohhh, aha!
..und es hat klick gemacht! Wieso bin ich da noch nie vorher gegengelaufen?
Auf jeden Fall 1000 Dank für das bestimmt 100 mal Beantworten genau dieser Frage! ;)
Gruß, Alex
([Test.dum] = 10) (set Test on)
DOELSE (set Test off)
([Test.dum] < 10) (set Test on)
DOELSE (set Test off)
Zitat von: Spartacus am 02 Februar 2015, 22:21:09
Hallo,
habe gerade einen Hänger!
Will in einem DOIF ein Dummy Device abfragen.Code Auswählen([Test.dum] = 10) (set Test on)
DOELSE (set Test off)
funktioniert nicht, wenn Test.dum auf 10 gesetzt wird.
allerdings funzt dies hier korrekt.Code Auswählen([Test.dum] < 10) (set Test on)
DOELSE (set Test off)
Wie frage ich denn auf Gleichheit ab?
Christian
Zitat von: Damian am 30 Januar 2015, 23:50:45
So, ich habe bei mir die Sache nachgestellt, mit:Code AuswählenDEF ([{ReadingsVal("test_d","state","00:00")}])(set bla on)
NAME di_test
NR 374
NTFY_ORDER 50-di_test
STATE initialized
TYPE DOIF
Readings:
2015-01-30 23:38:45 state initialized
2015-01-30 23:38:45 timer_1_c1 31.01.2015 15:00:00
undCode AuswählenDEF ([global:?INITIALIZED] or [test_d:?])(modify di_test [di_test:&DEF])
NAME di_init
NR 375
NTFY_ORDER 50-di_init
STATE cmd_1
TYPE DOIF
Readings:
2015-01-30 23:38:45 cmd_event global
2015-01-30 23:38:45 cmd_nr 1
2015-01-30 23:38:45 e_global_events INITIALIZED
2015-01-30 23:37:53 e_test_d_events 15:00
2015-01-30 23:38:45 state cmd_1
funktioniert alles wie gewünscht, sowohl "set test_d 15:00" als auch Neustart führen zum korrekten Setzen der Zeit bei di_test.
Du musst bei [global:?INITIALIZED] Großbuchstaben verwenden.
Gruß
Damian
auto_jal_master] eq "ja")
(attr di_auto_jal_1 disable 0)
DOELSEIF
([auto_jal_master] eq "nein")
(attr di_auto_jal_1 disable 1)
DOELSEIF
(
[auto_jal_time_workday]
or [auto_jal_time_weekend]
or [auto_jal_time_close_min]
or [auto_jal_time_close_max]
or [global:?INITIALIZED]
)
(modify di_auto_jal_1 [di_auto_jal_1:&DEF])
Zitat von: duke-f am 02 Februar 2015, 08:44:12
Das scheint es gewesen zu sein.
define Wecker dummy
attr Wecker group Wecker
attr Wecker room Kinderzimmer,Medien,Wecker
attr Wecker setList state:off,normal,Cottbus
attr Wecker webCmd state
define Radio_Wecker DOIF ([06:57|8] and [?Wecker] eq "normal") (set Panasonic on,set Pumpe_Hz on-for-timer 180) DOELSEIF ([05:58] and [?Wecker] eq "Cottbus") (set Pumpe_Hz on-for-timer 180,set Panasonic on,set Wecker normal,define Pana_Cottbus at 07:05 set Panasonic off)
Zitat von: duke-f am 03 Februar 2015, 08:02:34
Hab' mich zu früh gefreut. Nachdem ich alles auf folgende Art geändert habe, ging gestern früh das Radio wie gewollt an, heute jedoch wieder nicht. :(
Jetzt ist das entsprechende DOIF so:Code Auswählen
define Wecker dummy
attr Wecker group Wecker
attr Wecker room Kinderzimmer,Medien,Wecker
attr Wecker setList state:off,normal,Cottbus
attr Wecker webCmd state
define Radio_Wecker DOIF ([06:57|8] and [?Wecker] eq "normal") (set Panasonic on,set Pumpe_Hz on-for-timer 180) DOELSEIF ([05:58] and [?Wecker] eq "Cottbus") (set Pumpe_Hz on-for-timer 180,set Panasonic on,set Wecker normal,define Pana_Cottbus at 07:05 set Panasonic off)
EDIT:
Ich vergaß zu erwähnen: Im Log gibt es um 6:57 keinen Eintrag.
Zitat von: Damian am 03 Februar 2015, 11:04:10
Dann poste hier die Ausgabe von: list Radio_Wecker
Gruß
Damian
Internals:
DEF ([06:57|8] and [?Wecker] eq "normal") (set Panasonic on,set Pumpe_Hz on-for-timer 180) DOELSEIF ([05:58] and [?Wecker] eq "Cottbus") (set Pumpe_Hz on-for-timer 180,set Panasonic on,set Wecker normal,define Pana_Cottbus at 07:05 set Panasonic off)
NAME Radio_Wecker
NR 542
NTFY_ORDER 50-Radio_Wecker
STATE cmd_1
TYPE DOIF
Readings:
2015-02-02 06:57:00 cmd_event timer_1
2015-02-02 06:57:00 cmd_nr 1
2015-02-02 06:57:00 state cmd_1
2015-02-03 06:57:00 timer_1_c1 04.02.2015 06:57:00|8
2015-02-03 05:58:00 timer_2_c2 04.02.2015 05:58:00
Condition:
0 DOIF_time_once($hash->{timer}{0},$wday,"8") and InternalDoIf('Wecker','STATE','') eq "normal"
1 DOIF_time_once($hash->{timer}{1},$wday,"") and InternalDoIf('Wecker','STATE','') eq "Cottbus"
Days:
0 8
Devices:
Do:
0 set Panasonic on,set Pumpe_Hz on-for-timer 180
1 set Pumpe_Hz on-for-timer 180,set Panasonic on,set Wecker normal,define Pana_Cottbus at 07:05 set Panasonic off
Helper:
last_timer 2
sleeptimer -1
Internals:
Readings:
Realtime:
0 06:57:00
1 05:58:00
State:
Time:
0 06:57:00
1 05:58:00
Timecond:
0 0
1 1
Timer:
0 0
1 0
Timerfunc:
Timers:
0 0
1 1
Attributes:
group Wecker
room Kinderzimmer,Wecker
Internals:
NAME Wecker
NR 540
STATE normal
TYPE dummy
Readings:
2015-01-31 15:18:17 state normal
Attributes:
group Wecker
room Kinderzimmer,Medien,Wecker
setList state:off,normal,Cottbus
webCmd state
Zitat von: duke-f am 03 Februar 2015, 11:25:26
Radio_Wecker
Zitat von: Commandref
Angaben, bei denen aufgrund der Definition kein Zustandswechsel erfolgen kann z. B.:Code Auswählendefine di_light DOIF ([08:00]) (set switch on)
attr di_light do always
müssen mit Attribut do always definiert werden, damit sie nicht nur einmal, sondern jedes mal (hier jeden Tag) ausgeführt werden.
Zitat von: Brockmann am 03 Februar 2015, 12:44:31
Das DOIF ändert innerhalb der Woche seinen Status nie (sofern sich Wecker nicht ändert).
Folglich wird eine Aktion Montags ausführt und dann erst wieder wieder Samstags, weil da die andere Bedingung zutrifft und sich der Zustand ändert.
Hier gilt (wenn auch in etwas erweitertem Sinn):
Zitat von: duke-f am 03 Februar 2015, 12:59:21
(Muss zugeben: Das mit "do always" hatte schon jemand erwähnt - ich hab's aber offensichtlich falsch verstanden).
Zitat von: dieda am 03 Februar 2015, 16:59:161. Weil immer zu unvorhersehbaren Zeiten mein Sonderfall "Cottbus" auftreten kann. Dann will ich nur eine Taste drücken (bisher ein Button im Webinterface, künftig auch einen Knopf auf einer Fernbedienung) und am nächsten Morgen werde ich eine Stunde früher geweckt. Am nächsten Tag ist dann automatisch wieder der Normalzustand eingestellt.
@Duke-F: Warum realisierst du das nicht mit einem DOIF und einem Kalender?
DEF ([cnt.OS.start.Ferien.dum] <= 10 or
[cnt.PG.start.Ferien.dum] <= 10 or
[cnt.SO.start.Ferien.dum] <= 10 or
[cnt.HB.start.Ferien.dum] <= 10 or
[cnt.WE.start.Ferien.dum] <= 10)
({fhem "set Test (ReadingsVal("%","state",""))})
DOELSE (set Test 0)
NAME SchulferienStart
NR 774
NTFY_ORDER 50-SchulferienStart
STATE cmd_1
TYPE DOIF
Readings:
2015-02-03 17:26:27 cmd_event cnt.OS.start.Ferien.dum
2015-02-03 17:26:27 cmd_nr 1
2015-02-03 17:26:27 e_cnt.OS.start.Ferien.dum_STATE 6
2015-02-03 17:26:27 error {fhem "set Test (ReadingsVal("%","state",""))}: Can't find string terminator '"' anywhere before EOF at (eval 153) line 1.
2015-02-03 17:26:27 state cmd_1
Condition:
0 InternalDoIf('cnt.OS.start.Ferien.dum','STATE','') <= 10 or InternalDoIf('cnt.PG.start.Ferien.dum','STATE','') <= 10 or InternalDoIf('cnt.SO.start.Ferien.dum','STATE','') <= 10 or InternalDoIf('cnt.HB.start.Ferien.dum','STATE','') <= 10 or InternalDoIf('cnt.WE.start.Ferien.dum','STATE','') <= 10
Devices:
0 cnt.OS.start.Ferien.dum cnt.PG.start.Ferien.dum cnt.SO.start.Ferien.dum cnt.HB.start.Ferien.dum cnt.WE.start.Ferien.dum
all cnt.OS.start.Ferien.dum cnt.PG.start.Ferien.dum cnt.SO.start.Ferien.dum cnt.HB.start.Ferien.dum cnt.WE.start.Ferien.dum
Do:
0 {fhem "set Test (ReadingsVal("%","state",""))}
1 set Test 0
Helper:
last_timer 0
sleeptimer -1
Internals:
0 cnt.OS.start.Ferien.dum:STATE cnt.PG.start.Ferien.dum:STATE cnt.SO.start.Ferien.dum:STATE cnt.HB.start.Ferien.dum:STATE cnt.WE.start.Ferien.dum:STATE
all cnt.OS.start.Ferien.dum:STATE cnt.PG.start.Ferien.dum:STATE cnt.SO.start.Ferien.dum:STATE cnt.HB.start.Ferien.dum:STATE cnt.WE.start.Ferien.dum:STATE
Readings:
State:
Timerfunc:
Trigger:
Attributes:
Zitat von: Spartacus am 03 Februar 2015, 17:39:44
Hallo,
ich muss noch mal mit meiner "Dummy-Ferienauswert-Prozedur" kommen.
Ich habe Dummies, die über eine Sub mit den Tagen bis zum jeweiligen FerienStart bzw. FerienEnde befüllt werden.
Nun möchte ich ein FerienStart und FerienEnde Dummy definieren, welches mir unabhängig vom Ferientyp (Sommerferien, Osterferien, etc) einen Countdown anzeigt. Also die Dummies FerienStart und FerienEnde herunterzählt. Die Zahl wird dann später über einen Sonos angesagt. Die SonosDevices sind auf einem 2.ten fhem Rechner, der per fhem2fhem gekoppelt ist.
Aber wie kann ich in meinem DOIF auf den Wert des richtigen Ferientyps (hier die "6" von e_cnt.OS.start.Ferien.dum_STATE) zugreifen um "Test" korekt zu setzten?
Oder ist der Ansatz falsch und es muss anders gelöst werden...Code AuswählenDEF ([cnt.OS.start.Ferien.dum] <= 10 or
[cnt.PG.start.Ferien.dum] <= 10 or
[cnt.SO.start.Ferien.dum] <= 10 or
[cnt.HB.start.Ferien.dum] <= 10 or
[cnt.WE.start.Ferien.dum] <= 10)
({fhem "set Test (ReadingsVal("%","state",""))})
DOELSE (set Test 0)
NAME SchulferienStart
NR 774
NTFY_ORDER 50-SchulferienStart
STATE cmd_1
TYPE DOIF
Readings:
2015-02-03 17:26:27 cmd_event cnt.OS.start.Ferien.dum
2015-02-03 17:26:27 cmd_nr 1
2015-02-03 17:26:27 e_cnt.OS.start.Ferien.dum_STATE 6
2015-02-03 17:26:27 error {fhem "set Test (ReadingsVal("%","state",""))}: Can't find string terminator '"' anywhere before EOF at (eval 153) line 1.
2015-02-03 17:26:27 state cmd_1
Condition:
0 InternalDoIf('cnt.OS.start.Ferien.dum','STATE','') <= 10 or InternalDoIf('cnt.PG.start.Ferien.dum','STATE','') <= 10 or InternalDoIf('cnt.SO.start.Ferien.dum','STATE','') <= 10 or InternalDoIf('cnt.HB.start.Ferien.dum','STATE','') <= 10 or InternalDoIf('cnt.WE.start.Ferien.dum','STATE','') <= 10
Devices:
0 cnt.OS.start.Ferien.dum cnt.PG.start.Ferien.dum cnt.SO.start.Ferien.dum cnt.HB.start.Ferien.dum cnt.WE.start.Ferien.dum
all cnt.OS.start.Ferien.dum cnt.PG.start.Ferien.dum cnt.SO.start.Ferien.dum cnt.HB.start.Ferien.dum cnt.WE.start.Ferien.dum
Do:
0 {fhem "set Test (ReadingsVal("%","state",""))}
1 set Test 0
Helper:
last_timer 0
sleeptimer -1
Internals:
0 cnt.OS.start.Ferien.dum:STATE cnt.PG.start.Ferien.dum:STATE cnt.SO.start.Ferien.dum:STATE cnt.HB.start.Ferien.dum:STATE cnt.WE.start.Ferien.dum:STATE
all cnt.OS.start.Ferien.dum:STATE cnt.PG.start.Ferien.dum:STATE cnt.SO.start.Ferien.dum:STATE cnt.HB.start.Ferien.dum:STATE cnt.WE.start.Ferien.dum:STATE
Readings:
State:
Timerfunc:
Trigger:
Attributes:
Christian
... (set Test [cnt.OS.start.Ferien.dum]) ...
Zitat von: dieda am 03 Februar 2015, 17:15:12
Das kann man doch einbauen. Oder verstehe ich da was falsch. Entweder du nimmst einen dynamischen Terminkalender oder einen Dummy, den du mit abfragst.
Zitat von: Damian am 03 Februar 2015, 17:44:22Hi Damian,Code Auswählen... (set Test [cnt.OS.start.Ferien.dum]) ...
einfacher wird es wohl nicht gehen, siehe Commandref zu DOIF "Nutzung von Readings, Stati oder Internals im Ausführungsteil"
Gruß
Damian
([cnt.OS.start.Ferien.dum] <= 10) (set Test [cnt.OS.start.Ferien.dum])
DOELSEIF
([cnt.PG.start.Ferien.dum] <= 10) (set Test [cnt.PG.start.Ferien.dum])
DOELSEIF
([cnt.SO.start.Ferien.dum] <= 10) (set Test [cnt.SO.start.Ferien.dum])
DOELSEIF
([cnt.HB.start.Ferien.dum] <= 10) (set Test [cnt.HB.start.Ferien.dum])
DOELSEIF
([cnt.WE.start.Ferien.dum] <= 10) (set Test [cnt.WE.start.Ferien.dum])
DOELSE (set Test 0)
define di_Fenster_Bad1_offen DOIF ([MK_Bad1:state] eq "open" and [THLP:temperature] < 16)(set Tablet ttsSay "Das Fenster im Badezimmer ist noch auf.")
attr di_Fenster_Bad1_offen cmdState auf|zu
attr di_Fenster_Bad1_offen do always
attr di_Fenster_Bad1_offen room at_notify
attr di_Fenster_Bad1_offen wait 900
Zitat von: knochenmuehle am 03 Februar 2015, 19:37:49
habe eine offenes Fenster Warung ge doif't und dabei das Problem, dass meine Fensterkontakte 2x open melden, einmal zur vccu und einmal zum Heizkörperthermostaten.
Somit bekomme ich auch 2x auf dem Tablet die Ansage, dass noch ein Fenster auf ist. Wie kann ich das ändern ?Code Auswählen
define di_Fenster_Bad1_offen DOIF ([MK_Bad1:state] eq "open" and [THLP:temperature] < 16)(set Tablet ttsSay "Das Fenster im Badezimmer ist noch auf.")
attr di_Fenster_Bad1_offen cmdState auf|zu
attr di_Fenster_Bad1_offen do always
attr di_Fenster_Bad1_offen room at_notify
attr di_Fenster_Bad1_offen wait 900
Gruß Andreas
define di_Fenster_Bad1_offen DOIF ([MK_Bad1:state] eq "open" and [?THLP:temperature] < 16)(set Tablet ttsSay "Das Fenster im Badezimmer ist noch auf.")...
Zitat von: knochenmuehle am 03 Februar 2015, 20:05:43
ne, der Fensterkontakt (Homematic) sendet 2x, einmal zur vccu und einmal zum Heizkörperthermostat
Gruß Andreas
([RT_BZ_1_WindowRec:trig_MK_Bad1] eq "open" and [?THLP:temperature] < 16)(set Tablet ttsSay "Das Fenster im Badezimmer ist noch auf.")
Zitat von: knochenmuehle am 03 Februar 2015, 20:30:26
es kommt 2x sofort nacheinander, hatte ohne wait gestetet.
mit nem ? bei der Temp. klappts jetzt.
als Trigger nehme ich jetzt auch das Fenster_auf reading des Thermostaten
damit funktioniert das ganze jetzt aber nur wenn sich die Temp innerhalb der 900 sek nicht ändert, oder ?Code Auswählen
([RT_BZ_1_WindowRec:trig_MK_Bad1] eq "open" and [?THLP:temperature] < 16)(set Tablet ttsSay "Das Fenster im Badezimmer ist noch auf.")
A.
([MK_Bad1:state] eq "open" and [?THLP:temperature] < 16)(set Tablet ttsSay "Das Fenster im Badezimmer ist noch auf.")
([cnt.OS.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.OS.start.Ferien.dum])
DOELSEIF
([cnt.PG.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.PG.start.Ferien.dum])
DOELSEIF
([cnt.SO.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.SO.start.Ferien.dum])
DOELSEIF
([cnt.HB.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.HB.start.Ferien.dum])
DOELSEIF
([cnt.WE.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.WE.start.Ferien.dum])
DOELSE (set cnt.NRW.start.Ferien.dum -deaktiv-)
([06:00|0123456]
and [PoolPumpe_Master:state] eq "on"
and [Pool:state:d]>= 1
and [Pool:state:d]< 15 )
((set PoolPumpe on-till {sprintf("%02d:%02d",6+[Pool:state:d]/6,([Pool:state:d]/6-int([Pool:state:d]/6))*60)}))
DOELSEIF
([Pool:state:d]>= 15
and [Pool:state:d]< 24 )
((set PoolPumpe on-till {sprintf("%02d:%02d",6+[Pool:state:d]/4,([Pool:state:d]/4-int([Pool:state:d]/4))*60)}))
DOELSEIF ([Pool:state:d]>= 24
and [Pool:state:d]<= 45)
((set PoolPumpe on-till {sprintf("%02d:%02d",6+[Pool:state:d]/3,([Pool:state:d]/3-int([Pool:state:d]/3))*60)}))
Poolsteuerung: perl error in condition: (DOIF_time_once($hash->{timer}{0},$wday,"0123456") and ReadingValDoIf('PoolPumpe_Master','state','') eq "on" and ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')>= 10 and ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')< 15 ) ((set PoolPumpe on-till {sprintf("%02d:%02d",6+ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')/6,(ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')/6-int(ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')/6))*60)})): syntax error at (eval 40587) line 1, near ") ("
'(-?\d+(\.\d+)?)')>= 10
auftaucht, wobei in der Bedingung ...'(-?\d+(\.\d+)?)')>= 1
steht. Ist das der Grund ?Zitat von: Bartimaus am 06 Februar 2015, 09:30:37
Guten Morgen,
ich teste gerade die Umstellung von "3 x (at*) IF" gegen ein "DOIF".
Dazu habe ich folgendes DOIF angelegt:Code Auswählen([06:00|0123456]
and [PoolPumpe_Master:state] eq "on"
and [Pool:state:d]>= 1
and [Pool:state:d]< 15 )
((set PoolPumpe on-till {sprintf("%02d:%02d",6+[Pool:state:d]/6,([Pool:state:d]/6-int([Pool:state:d]/6))*60)}))
DOELSEIF
([Pool:state:d]>= 15
and [Pool:state:d]< 24 )
((set PoolPumpe on-till {sprintf("%02d:%02d",6+[Pool:state:d]/4,([Pool:state:d]/4-int([Pool:state:d]/4))*60)}))
DOELSEIF ([Pool:state:d]>= 24
and [Pool:state:d]<= 45)
((set PoolPumpe on-till {sprintf("%02d:%02d",6+[Pool:state:d]/3,([Pool:state:d]/3-int([Pool:state:d]/3))*60)}))
Dieses DOIF dient dazu, unterschiedlich lange Pumpenlaufzeiten je Pooltemperatur zu generieren.
Im Log sehe ich, das die Pumpe zur definierten Zeit (06:00) eingeschaltet wurde, und zur errechneten Zeit ausgeschaltet wurde. Soweit so gut.
Jedoch sehe ich im Log auch folgenden Fehlerhinweis:Code AuswählenPoolsteuerung: perl error in condition: (DOIF_time_once($hash->{timer}{0},$wday,"0123456") and ReadingValDoIf('PoolPumpe_Master','state','') eq "on" and ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')>= 10 and ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')< 15 ) ((set PoolPumpe on-till {sprintf("%02d:%02d",6+ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')/6,(ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')/6-int(ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')/6))*60)})): syntax error at (eval 40587) line 1, near ") ("
Die Bedingung habe ich aus meiner alten IF-Bedingung kopiert, und dabei trat dieser Fehler im Log nicht auf.
Ich sehe, das im Logfile der Wert ...Code Auswählen'(-?\d+(\.\d+)?)')>= 10
auftaucht, wobei in der Bedingung ...Code Auswählen'(-?\d+(\.\d+)?)')>= 1
steht. Ist das der Grund ?
Hat jemand ne Idee ?
Zitat von: Spartacus am 04 Februar 2015, 21:09:34
Hallo,
so ganz glücklich bin ich noch nicht mit meiner Auswertung der Ferientage:Code Auswählen([cnt.OS.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.OS.start.Ferien.dum])
DOELSEIF
([cnt.PG.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.PG.start.Ferien.dum])
DOELSEIF
([cnt.SO.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.SO.start.Ferien.dum])
DOELSEIF
([cnt.HB.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.HB.start.Ferien.dum])
DOELSEIF
([cnt.WE.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.WE.start.Ferien.dum])
DOELSE (set cnt.NRW.start.Ferien.dum -deaktiv-)
Der Kalender wird alle 6h aktualisiertund die Werte in der Tabelle (Screenshot) werden heruntergezählt.
Erreicht ein Wert die "10" wird das Dummy cnt.NRW.start.Ferien.dum auf den Wert des jeweiligen Ferienevents gesetzt(Countdown 10..0).
Muss ich nun das do always setzten? Aber dann würde m.E. das Dummy cnt.NRW.start.Ferien.dum immer wieder auf -deaktiv- gesetzt, da immer ein Ferienevent > als 10 Tage ist und somit immer das DOELSE zutrifft, oder?
Was ist nun richtig, damit meine Logik funktioniert, vor allen Ferien immer einen 10 Tages Countdown anzuzeigen!
Danke,
Christian
Zitat von: Spartacus am 06 Februar 2015, 16:20:04
Hallo,
ich habe jetzt mehrere Versuche unternommen indem ich die Reihenfolge der DOIFELSEs umgestellt habe, aber irgendwie kommt am Ende immer das gleiche falsche Ergebnis raus! Ist DOIF hier der falsche Ansatz?
Gruß,
Christian
DOELSE (set cnt.NRW.start.Ferien.dum -deaktiv-)
DOELSEIF ([cnt.OS.start.Ferien.dum] > 10 and [cnt.PG.start.Ferien.dum] > 10 and ...) (set cnt.NRW.start.Ferien.dum -deaktiv-)
define Puffersteuerung_DI DOIF ([Kesselpumpe:?on] and [Puffer2_100:temperature] < 40 or [Heizkreispumpe:?on] and [Puffer1_25:temperature] < 40 ) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
define Puffersteuerung_DI DOIF (([Kesselpumpe:?on] and [Puffer2_100:temperature] < 40) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature] < 40 )) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
Zitat von: Puschel74 am 08 Februar 2015, 01:28:23
Und selbst die deutsche commandref kann dir nicht helfen??
Zitat von: Invers am 08 Februar 2015, 10:19:54
Ich denke mal, ich würde vor und nach dem or Klammern setzen, damit die Prüfung korrekt stattfinden kann.Code Auswählendefine Puffersteuerung_DI DOIF (([Kesselpumpe:?on] and [Puffer2_100:temperature] < 40) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature] < 40 )) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
ZirkulationsPumpeDOIF: { }: HASH(0x2257d98)
define Puffersteuerung_DI DOIF (([Kesselpumpe] eq "on" and [Puffer2_100:temperature] < 40) or ([Heizkreispumpe] eq "on" and [Puffer1_25:temperature] < 40 )) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
define Puffer_DI DOIF ([Kesselpumpe?:on] and [Puffer2_100:temperature]<30) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<50) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
Zitat von: MadCat am 10 Februar 2015, 12:00:18
Wenn ich die Commandref richtig verstanden habe müsste das eigendlich so aussehen, aber das mag fhem gar nicht.Code Auswählendefine Puffer_DI DOIF ([Kesselpumpe?:on] and [Puffer2_100:temperature]<30) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<50) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
define Puffer_DI DOIF (([Kesselpumpe:?on] and [Puffer2_100:temperature]<30) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<50)) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
Zitat von: MadCat am 10 Februar 2015, 12:22:05Im Eingabefeld der Weboberfläche.
kannst Du mir sagen wo ich das list Puffer_DI eingeben muss, bin noch nicht so firm mit fhem.
define OG.xx.BM.Logik.DI DOIF ([OG.ez.BM.Whg_Tuer.STATE:?on] and [?OG.tr.BM.Treppe:STATE] eq 'on') DOELSEIF ([OG.tr.BM.Treppe.STATE:?on] and [?OG.ez.BM.Whg_Tuer:STATE] eq 'on') DOELSE
attr OG.xx.BM.Logik.DI cmdState Runter|Hoch|Unbekannt
attr OG.xx.BM.Logik.DI do always
2015-02-10 11:48:06 HM485 OG.tr.BM.Treppe STATE: on
2015-02-10 11:48:11 HM485 OG.ez.BM.Whg_Tuer STATE: on
2015-02-10 11:48:33 HM485 OG.tr.BM.Treppe STATE: off
2015-02-10 11:48:59 HM485 OG.ez.BM.Whg_Tuer STATE: off
define OG.xx.BM.Logik.DI DOIF ([OG.ez.BM.Whg_Tuer:?STATE.*on] and [?OG.tr.BM.Treppe:STATE] eq 'on') DOELSEIF ([OG.tr.BM.Treppe:?STATE.*on] and [?OG.ez.BM.Whg_Tuer:STATE] eq 'on') DOELSE
attr OG.xx.BM.Logik.DI cmdState Runter|Hoch|Unbekannt
attr OG.xx.BM.Logik.DI do always
Wenn Bedingung erfüllt, dann schalte nach 5 Minuten das Licht aus und setzt Wert eines Dummys nach 15 Minuten auf x.
Wenn Bedingung innerhalb der ersten 5 Minuten nicht mehr erfüllt, dann mache nix.
Wenn Bedingung zwischen Minute 5 und 15 nicht mehr erfüllt, dann wurde das Licht ausgeschaltet aber Aktion nicht ausgeführt.
Internals:
CFGFN
DEF (([Kesselpumpe:?on] and [Puffer2_100:temperature]<30) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<50)) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
NAME Puffer_DI
NR 154
NTFY_ORDER 50-Puffer_DI
STATE off
TYPE DOIF
Readings:
2015-02-10 12:34:05 cmd_event Puffer1_25
2015-02-10 12:34:05 cmd_nr 2
2015-02-10 12:34:02 e_Heizkreispumpe_events on: ok on ok
2015-02-10 12:23:48 e_Kesselpumpe_events on ok
2015-02-10 14:49:23 e_Puffer1_25_events temperature: 52.13
2015-02-10 14:49:23 e_Puffer1_25_temperature 52.13
2015-02-10 14:49:23 e_Puffer2_100_events temperature: 33.94
2015-02-10 14:49:23 e_Puffer2_100_temperature 33.94
2015-02-10 12:34:05 state off
Condition:
0 (EventDoIf('Kesselpumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer2_100','temperature','')<30) or (EventDoIf('Heizkreispumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer1_25','temperature','')<50)
Devices:
0 Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
all Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
Do:
0 set Heizkreisventil on
1 set Heizkreisventil off
Helper:
last_timer 0
sleeptimer -1
triggerDev Puffer2_100
triggerEvents:
temperature: 33.94
Internals:
Readings:
0 Puffer2_100:temperature Puffer1_25:temperature
all Puffer2_100:temperature Puffer1_25:temperature
State:
Trigger:
all Kesselpumpe Heizkreispumpe
Attributes:
cmdState on|off
room Heizung
Zitat von: RoBra81 am 10 Februar 2015, 14:55:45
Ich habe nochmal eine andere Herausforderung: Ich kann ja eine Aktion mittels Attribut "wait" nach Eintreten der Bedingung verzögern. Nun habe ich jedoch ein Bedingung die zwei Aktionen mit unterschiedlicher Verzögerung auslösen soll - etwa in der Art ("Pseudocode"):
Gibt es hierfür eine Lösung mit einem DOIF oder muss ich mit mehreren DOIFs und Dummys arbeiten?
Vielen Dank
Ronny
Zitat von: MadCat am 10 Februar 2015, 15:01:52
Dazu gibt es doch in der Comandref ein Beispiel, wo man zwei Atribute mit Wait verzögern kann.
Musst Du mal gucken ob Du das für Dich verwenden kannst.
Zitat({fhem("set dustRobot command PowerToggle ;; sleep 1 ;; set dustRobot command Turbo ;; sleep 1 ;; set dustRobot command Start ;; set Erna done")})
Zitat von: der-Lolo am 10 Februar 2015, 15:12:15
Das richtige für dich... sleep halt dann so wie Du die Verzögerung brauchst.
Das ganze ist nicht fhem blockierend...
Zitat([pl_soBad] eq "on") (
IF ([pr_soBad] eq "present")
(IF ([player:config] eq "auto") (set sonos_Bad Volume 12,
set sonos_Wohnzimmer AddMember sonos_Bad, attr pr_soBad disable 1,
set EntertainmentEvents add Bad Lautsprecher im Automatikmode angeschaltet und zur Wohnzimmer Wiedergabe hinzugefügt...)
ELSE (set EntertainmentEvents add Der Bad Lautsprecher ist im Sonossystem zur Wiedergabe bereit...,
attr pr_soBad disable 1)
)
ELSE
(set pl_soBad off,set EntertainmentEvents add Netzwerkeinbindung missglückt, ich versuche den Player neu zu starten.,
define at_pl_soBad at +00:00:05 set pl_soBad on)
Zitat von: MadCat am 10 Februar 2015, 14:57:05Ja, das sieht ja soweit alles in Ordnung aus. Wenn das DOIF jetzt nicht das tut, was Du möchtest, schaust Du Dir (am Besten unmittelbar zu dem Zeitpunkt) dieses detaillierte Listing an. Da kannst Du genau sehen, wodurch das DOIF zuletzt getriggert wurde und welche Werte die Parameter in den Konditionen hatten. Dann sollte also nachvollziehbar sein, warum Dein DOIF so reagiert wie es das tut. Ansonsten nochmal mit dem list zum fraglichen Zeitpunkt hier nachfragen.
hab das list jetzt mal ausgeführt und dabei kommt folgendes raus.
Zitat von: Brockmann am 10 Februar 2015, 15:29:38
Ja, das sieht ja soweit alles in Ordnung aus. Wenn das DOIF jetzt nicht das tut, was Du möchtest, schaust Du Dir (am Besten unmittelbar zu dem Zeitpunkt) dieses detaillierte Listing an. Da kannst Du genau sehen, wodurch das DOIF zuletzt getriggert wurde und welche Werte die Parameter in den Konditionen hatten. Dann sollte also nachvollziehbar sein, warum Dein DOIF so reagiert wie es das tut. Ansonsten nochmal mit dem list zum fraglichen Zeitpunkt hier nachfragen.
Zitat von: MadCat am 10 Februar 2015, 14:57:05
Hallo Brockmann,
hab das list jetzt mal ausgeführt und dabei kommt folgendes raus.Code AuswählenInternals:
CFGFN
DEF (([Kesselpumpe:?on] and [Puffer2_100:temperature]<30) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<50)) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
NAME Puffer_DI
NR 154
NTFY_ORDER 50-Puffer_DI
STATE off
TYPE DOIF
Readings:
2015-02-10 12:34:05 cmd_event Puffer1_25
2015-02-10 12:34:05 cmd_nr 2
2015-02-10 12:34:02 e_Heizkreispumpe_events on: ok on ok
2015-02-10 12:23:48 e_Kesselpumpe_events on ok
2015-02-10 14:49:23 e_Puffer1_25_events temperature: 52.13
2015-02-10 14:49:23 e_Puffer1_25_temperature 52.13
2015-02-10 14:49:23 e_Puffer2_100_events temperature: 33.94
2015-02-10 14:49:23 e_Puffer2_100_temperature 33.94
2015-02-10 12:34:05 state off
Condition:
0 (EventDoIf('Kesselpumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer2_100','temperature','')<30) or (EventDoIf('Heizkreispumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer1_25','temperature','')<50)
Devices:
0 Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
all Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
Do:
0 set Heizkreisventil on
1 set Heizkreisventil off
Helper:
last_timer 0
sleeptimer -1
triggerDev Puffer2_100
triggerEvents:
temperature: 33.94
Internals:
Readings:
0 Puffer2_100:temperature Puffer1_25:temperature
all Puffer2_100:temperature Puffer1_25:temperature
State:
Trigger:
all Kesselpumpe Heizkreispumpe
Attributes:
cmdState on|off
room Heizung
Zitat von: MadCat am 10 Februar 2015, 15:37:40Laut Listing liegen die Temperaturen doch jeweils ÜBER den Vorgaben in den Konditionen. Wie sollen die Bedingungen da erfüllt sein?
das list war schon aktuell. Und obwohl beide Bedingungen erfüllt werden und das Heizkreisventil auf on gehen müsste, geht es sofort auf off und bleibt da stehen, selbst wenn ich die Soll Temperaturen ändere oder die Pumpen ein und ausschalte, hab alles versucht, aber es tut sich nix.
Zitat von: automatisierer am 10 Februar 2015, 15:41:58Nein, das sollte kein Problem sein. Wäre nur problematisch, wenn der Sensor noch die Maßeinheit mit ins Reading schreiben würde, dann müsste man das rausfiltern ([Puffer2_100:temperature:d]<30). Macht er ja aber offenbar nicht.
kann es sein, dass das DOIF Probleme mit den Nachkommastellen der Temperaturen hat? Ich hab nu keinen genauen Plan wie Perl sich da verhält, könnte mir das nur als Problemchen vorstellen.
define Puffersteuerung_DI DOIF ([Kesselpumpe] eq "on" and [Puffer2_100:temperature] < 40) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
attr Puffersteuerung_DI do always
Internals:
CFGFN
DEF (([Kesselpumpe:?on] and [Puffer2_100:temperature]<50) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<30)) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
NAME Puffer_DI
NR 154
NTFY_ORDER 50-Puffer_DI
STATE off
TYPE DOIF
Readings:
2015-02-10 16:23:41 cmd_event Puffer2_100
2015-02-10 16:23:41 cmd_nr 2
2015-02-10 16:23:40 e_Heizkreispumpe_events off: ok off ok
2015-02-10 16:23:34 e_Kesselpumpe_events on ok
2015-02-10 16:23:35 e_Puffer1_25_events temperature: 60.13
2015-02-10 16:23:35 e_Puffer1_25_temperature 60.13
2015-02-10 16:23:41 e_Puffer2_100_events temperature: 33.94
2015-02-10 16:23:41 e_Puffer2_100_temperature 33.94
2015-02-10 16:23:41 state off
Condition:
0 (EventDoIf('Kesselpumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer2_100','temperature','')<50) or (EventDoIf('Heizkreispumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer1_25','temperature','')<30)
Devices:
0 Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
all Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
Do:
0 set Heizkreisventil on
1 set Heizkreisventil off
Helper:
last_timer 0
sleeptimer -1
triggerDev Puffer2_100
triggerEvents:
temperature: 33.94
Internals:
Readings:
0 Puffer2_100:temperature Puffer1_25:temperature
all Puffer2_100:temperature Puffer1_25:temperature
State:
Timerfunc:
Trigger:
all Kesselpumpe Heizkreispumpe
Attributes:
cmdState on|off
do always
room Heizung
Internals:
CFGFN
DEF (([Kesselpumpe:?on] and [Puffer2_100:temperature]<50) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<30)) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
NAME Puffer_DI
NR 154
NTFY_ORDER 50-Puffer_DI
STATE on
TYPE DOIF
Readings:
2015-02-10 16:39:53 cmd_event Kesselpumpe
2015-02-10 16:39:53 cmd_nr 1
2015-02-10 16:23:40 e_Heizkreispumpe_events off: ok off ok
2015-02-10 16:39:53 e_Kesselpumpe_events on ok
2015-02-10 16:39:43 e_Puffer1_25_events temperature: 61.69
2015-02-10 16:39:43 e_Puffer1_25_temperature 61.69
2015-02-10 16:39:53 e_Puffer2_100_events temperature: 33.81
2015-02-10 16:39:53 e_Puffer2_100_temperature 33.81
2015-02-10 16:39:53 state on
Condition:
0 (EventDoIf('Kesselpumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer2_100','temperature','')<50) or (EventDoIf('Heizkreispumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer1_25','temperature','')<30)
Devices:
0 Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
all Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
Do:
0 set Heizkreisventil on
1 set Heizkreisventil off
Helper:
last_timer 0
sleeptimer -1
triggerDev Kesselpumpe
triggerEvents:
on ok
Internals:
Readings:
0 Puffer2_100:temperature Puffer1_25:temperature
all Puffer2_100:temperature Puffer1_25:temperature
State:
Timerfunc:
Trigger:
all Kesselpumpe Heizkreispumpe
Attributes:
cmdState on|off
do always
room Heizung
Internals:
CFGFN
DEF (([Kesselpumpe:?on] and [Puffer2_100:temperature]<50) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<30)) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
NAME Puffer_DI
NR 154
NTFY_ORDER 50-Puffer_DI
STATE off
TYPE DOIF
Readings:
2015-02-10 16:40:09 cmd_event Puffer1_25
2015-02-10 16:40:09 cmd_nr 2
2015-02-10 16:23:40 e_Heizkreispumpe_events off: ok off ok
2015-02-10 16:39:53 e_Kesselpumpe_events on ok
2015-02-10 16:40:09 e_Puffer1_25_events temperature: 61.69
2015-02-10 16:40:09 e_Puffer1_25_temperature 61.69
2015-02-10 16:39:53 e_Puffer2_100_events temperature: 33.81
2015-02-10 16:39:53 e_Puffer2_100_temperature 33.81
2015-02-10 16:40:09 state off
Condition:
0 (EventDoIf('Kesselpumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer2_100','temperature','')<50) or (EventDoIf('Heizkreispumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer1_25','temperature','')<30)
Devices:
0 Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
all Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
Do:
0 set Heizkreisventil on
1 set Heizkreisventil off
Helper:
last_timer 0
sleeptimer -1
triggerDev Puffer1_25
triggerEvents:
temperature: 61.69
Internals:
Readings:
0 Puffer2_100:temperature Puffer1_25:temperature
all Puffer2_100:temperature Puffer1_25:temperature
State:
Timerfunc:
Trigger:
all Kesselpumpe Heizkreispumpe
Attributes:
cmdState on|off
do always
room Heizung
Zitat von: MadCat am 10 Februar 2015, 16:33:31Ich hatte ja schon mal gefragt, ob Du Dir über die Funktionsweise von [Kesselpumpe:?on] im Klaren bist?
Bedingung 1 ist erfüllt, sollte also das Heizkreisventil auf on gehen.
Wenn ich die Kesselpumpe kurz aus schalte und dann wieder ein, geht das Heizkreisventil auch kurz auf on und nach ein paar Secunden wieder auf off.
Zitat von: MadCat am 10 Februar 2015, 16:41:37
OK, hier mal die beiden listCode AuswählenInternals:
CFGFN
DEF (([Kesselpumpe:?on] and [Puffer2_100:temperature]<50) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<30)) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
NAME Puffer_DI
NR 154
NTFY_ORDER 50-Puffer_DI
STATE on
TYPE DOIF
Readings:
2015-02-10 16:39:53 cmd_event Kesselpumpe
2015-02-10 16:39:53 cmd_nr 1
2015-02-10 16:23:40 e_Heizkreispumpe_events off: ok off ok
2015-02-10 16:39:53 e_Kesselpumpe_events on ok
2015-02-10 16:39:43 e_Puffer1_25_events temperature: 61.69
2015-02-10 16:39:43 e_Puffer1_25_temperature 61.69
2015-02-10 16:39:53 e_Puffer2_100_events temperature: 33.81
2015-02-10 16:39:53 e_Puffer2_100_temperature 33.81
2015-02-10 16:39:53 state on
Condition:
0 (EventDoIf('Kesselpumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer2_100','temperature','')<50) or (EventDoIf('Heizkreispumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer1_25','temperature','')<30)
Devices:
0 Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
all Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
Do:
0 set Heizkreisventil on
1 set Heizkreisventil off
Helper:
last_timer 0
sleeptimer -1
triggerDev Kesselpumpe
triggerEvents:
on ok
Internals:
Readings:
0 Puffer2_100:temperature Puffer1_25:temperature
all Puffer2_100:temperature Puffer1_25:temperature
State:
Timerfunc:
Trigger:
all Kesselpumpe Heizkreispumpe
Attributes:
cmdState on|off
do always
room HeizungCode AuswählenInternals:
CFGFN
DEF (([Kesselpumpe:?on] and [Puffer2_100:temperature]<50) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature]<30)) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
NAME Puffer_DI
NR 154
NTFY_ORDER 50-Puffer_DI
STATE off
TYPE DOIF
Readings:
2015-02-10 16:40:09 cmd_event Puffer1_25
2015-02-10 16:40:09 cmd_nr 2
2015-02-10 16:23:40 e_Heizkreispumpe_events off: ok off ok
2015-02-10 16:39:53 e_Kesselpumpe_events on ok
2015-02-10 16:40:09 e_Puffer1_25_events temperature: 61.69
2015-02-10 16:40:09 e_Puffer1_25_temperature 61.69
2015-02-10 16:39:53 e_Puffer2_100_events temperature: 33.81
2015-02-10 16:39:53 e_Puffer2_100_temperature 33.81
2015-02-10 16:40:09 state off
Condition:
0 (EventDoIf('Kesselpumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer2_100','temperature','')<50) or (EventDoIf('Heizkreispumpe',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'on') and ReadingValDoIf('Puffer1_25','temperature','')<30)
Devices:
0 Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
all Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
Do:
0 set Heizkreisventil on
1 set Heizkreisventil off
Helper:
last_timer 0
sleeptimer -1
triggerDev Puffer1_25
triggerEvents:
temperature: 61.69
Internals:
Readings:
0 Puffer2_100:temperature Puffer1_25:temperature
all Puffer2_100:temperature Puffer1_25:temperature
State:
Timerfunc:
Trigger:
all Kesselpumpe Heizkreispumpe
Attributes:
cmdState on|off
do always
room Heizung
Zitat von: Brockmann am 10 Februar 2015, 16:52:16
Warum verwendest Du nicht (wie hier schon mal vorgeschlagen) [Kesselpumpe] eq "on"? Diese Bedingung ist solange wahr, wie das Device Kesselpumpe den Status on hat.
Zitat von: Damian am 10 Februar 2015, 16:54:50
Warum arbeitest du mit Eventabfragen [Kesselpumpe:?on] statt mit Statusabfragen [Kesselpumpe] eq "on"? Eine Eventabfrage ist, im Gegensatz zu einer Statusabfrage nur in dieser "Sekunde" wahr in der sie stattfindet und sonst nicht und das war um 16:40:09 der Fall gewesen, was zu cmd2 führt.
Gruß
Damian
Zitat von: MadCat am 10 Februar 2015, 17:23:50
Hallo Damian, mit eq "on" geht DOIF direkt auf off und macht gar nichts.
mit
Zitat von: Damian am 10 Februar 2015, 17:28:48
Dann war die Pumpe eben nicht "on". Auch hier kann man es nur mit einem list ... beurteilen.
Internals:
CFGFN
DEF (([Kesselpumpe] eq "on" and [Puffer2_100:temperature]<50) or ([Heizkreispumpe] eq "on" and [Puffer1_25:temperature]<30)) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
NAME Puffer_DI
NR 154
NTFY_ORDER 50-Puffer_DI
STATE off
TYPE DOIF
Readings:
2015-02-10 17:30:59 cmd_event Puffer2_100
2015-02-10 17:30:59 cmd_nr 2
2015-02-10 17:30:40 e_Heizkreispumpe_STATE on ok
2015-02-10 17:30:38 e_Kesselpumpe_STATE on ok
2015-02-10 17:30:59 e_Puffer1_25_temperature 62.31
2015-02-10 17:30:59 e_Puffer2_100_temperature 33.69
2015-02-10 17:30:59 state off
Condition:
0 (InternalDoIf('Kesselpumpe','STATE','') eq "on" and ReadingValDoIf('Puffer2_100','temperature','')<50) or (InternalDoIf('Heizkreispumpe','STATE','') eq "on" and ReadingValDoIf('Puffer1_25','temperature','')<30)
Devices:
0 Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
all Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
Do:
0 set Heizkreisventil on
1 set Heizkreisventil off
Helper:
last_timer 0
sleeptimer -1
Internals:
0 Kesselpumpe:STATE Heizkreispumpe:STATE
all Kesselpumpe:STATE Heizkreispumpe:STATE
Readings:
0 Puffer2_100:temperature Puffer1_25:temperature
all Puffer2_100:temperature Puffer1_25:temperature
State:
Timerfunc:
Trigger:
Attributes:
cmdState on|off
do always
room Heizung
Zitat von: MadCat am 10 Februar 2015, 17:32:20
Doch Pumpe war on, hier das listingCode AuswählenInternals:
CFGFN
DEF (([Kesselpumpe] eq "on" and [Puffer2_100:temperature]<50) or ([Heizkreispumpe] eq "on" and [Puffer1_25:temperature]<30)) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
NAME Puffer_DI
NR 154
NTFY_ORDER 50-Puffer_DI
STATE off
TYPE DOIF
Readings:
2015-02-10 17:30:59 cmd_event Puffer2_100
2015-02-10 17:30:59 cmd_nr 2
2015-02-10 17:30:40 e_Heizkreispumpe_STATE on ok
2015-02-10 17:30:38 e_Kesselpumpe_STATE on ok
2015-02-10 17:30:59 e_Puffer1_25_temperature 62.31
2015-02-10 17:30:59 e_Puffer2_100_temperature 33.69
2015-02-10 17:30:59 state off
Condition:
0 (InternalDoIf('Kesselpumpe','STATE','') eq "on" and ReadingValDoIf('Puffer2_100','temperature','')<50) or (InternalDoIf('Heizkreispumpe','STATE','') eq "on" and ReadingValDoIf('Puffer1_25','temperature','')<30)
Devices:
0 Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
all Kesselpumpe Puffer2_100 Heizkreispumpe Puffer1_25
Do:
0 set Heizkreisventil on
1 set Heizkreisventil off
Helper:
last_timer 0
sleeptimer -1
Internals:
0 Kesselpumpe:STATE Heizkreispumpe:STATE
all Kesselpumpe:STATE Heizkreispumpe:STATE
Readings:
0 Puffer2_100:temperature Puffer1_25:temperature
all Puffer2_100:temperature Puffer1_25:temperature
State:
Timerfunc:
Trigger:
Attributes:
cmdState on|off
do always
room Heizung
Zitat von: Damian am 10 Februar 2015, 17:45:51
Das stimmt nicht. Die Pumpe war "on ok" und nicht "on" das ist ein feiner Unterschied. So etwas kannst du, wie übrigens in der Commandref zu DOIF dokumentiert ist, mit [Kesselpumpe] =~ "on" abfragen.
Gruß
Damian
Zitat von: RoBra81 am 10 Februar 2015, 14:55:45
...Code AuswählenWenn Bedingung erfüllt, dann schalte nach 5 Minuten das Licht aus und setzt Wert eines Dummys nach 15 Minuten auf x.
Wenn Bedingung innerhalb der ersten 5 Minuten nicht mehr erfüllt, dann mache nix.
Wenn Bedingung zwischen Minute 5 und 15 nicht mehr erfüllt, dann wurde das Licht ausgeschaltet aber Aktion nicht ausgeführt.
Gibt es hierfür eine Lösung mit einem DOIF oder muss ich mit mehreren DOIFs und Dummys arbeiten?
ZitatWas spricht dagegen zwei DOIF's zu verwenden? Meines Wissens ist es mit einem DOIF nicht möglich, ausser ev. mit einer perl Sub.
DI_Test DOIF (Bedingung)(Licht ein)
DOELSEIF(Bedingung and [DI_Test] eq "Licht_an")(Dummy x)
attr DI_Test wait 300:600
attr DI_Test cmdState Licht_an|Dummy_gesetzt
attr DI_Test wait 300:600
Zitat von: flurin am 10 Februar 2015, 18:14:23
@BrockmannCode Auswählenattr DI_Test wait 300:600
Zuerst dachte ich auch, so könnte es funktionieren aber die Logik stimmt nicht.
Zudem ist sowas schwer zu warten: Fehler suchen, erweitern usw.
Gruss
flurin
define di_Licht DOIF (Bedingung) (set Licht aus)
attr wait 300
define di_Aktion DOIF (Bedingung) (set dummy x)
attr wait 900
([inesa] eq "home") (set pushbullet_inesa message Ines kommt nach Hause ,sleep 20; set Tuer.GongMP3 playTone 039 )
Zitat von: inesa394 am 10 Februar 2015, 20:17:30Schau Dir mal das Attribut cmdpause in der DOIF-Referenz an.
Nun möchte ich das das doif nachdem es mich erkannt hat eine Zwangspause einlegt so von 10 minuten.
Zitat von: flurin am 10 Februar 2015, 18:14:23Du hast Recht, da bin ich mal wieder in die "wait ohne DOELSE"-Falle getappt. Wenn man einfach ein DOELSE (ohne Aktion) ans Ende setzt, sollte es klappen.Code Auswählenattr DI_Test wait 300:600
Zuerst dachte ich auch, so könnte es funktionieren aber die Logik stimmt nicht.
Zudem ist sowas schwer zu warten: Fehler suchen, erweitern usw.
desired_temp
Zitat von: Brockmann am 11 Februar 2015, 07:23:40
Und was Wartbarkeit angeht: Zwei DOIFs, die parallel auf dieselbe Bedingung triggern, finde ich auch nicht übersichtlicher, aber das ist sicher eine Geschmacksfrage.
Zitat von: Rohan am 11 Februar 2015, 09:39:45
Hi,Code Auswählendesired_temp
Schreibfehler oder steht das wirklich so in deinem DOIF (ich meine den Unterstrich "_")?
Gruß
Thomas
Zitat von: leuchte1 am 11 Februar 2015, 09:19:27Mit dem DOIF setzt Du das FHEM-Device auf die gewünschte Temperatur. Dass diese Information an das Gerät selbst übermittelt wird, darum kümmert sich FHEM bzw. das entsprechende HM...-Modul. Das hat mit dem DOIF nichts zu tun.
Der HM-CC-RT-DN läuft nicht im Burstmode, d.h. er frägt nur alle 2-3 min. ab und da ist Bedingung Uhrzeit u.U. längst passé. Den Burstmode will ich zu Gunsten der Batterielebensdauer vermeiden.
Zitat von: RoBra81 am 10 Februar 2015, 14:55:45Code AuswählenWenn Bedingung erfüllt, dann schalte nach 5 Minuten das Licht aus und setzt Wert eines Dummys nach 15 Minuten auf x.
Wenn Bedingung innerhalb der ersten 5 Minuten nicht mehr erfüllt, dann mache nix.
Wenn Bedingung zwischen Minute 5 und 15 nicht mehr erfüllt, dann wurde das Licht ausgeschaltet aber Aktion nicht ausgeführt.
Gibt es hierfür eine Lösung mit einem DOIF oder muss ich mit mehreren DOIFs und Dummys arbeiten?
define di_flex_lamp DOIF ([test_switch] eq "on") \
(define timer1 at +00:05 \
{ if (Value("test_switch") eq "on") { fhem("set flex_lamp on") } },\
define timer2 at +00:15 \
{ if (Value("test_switch") eq "on") { fhem("set flex_lamp off") } } )
Zitat von: Brockmann am 11 Februar 2015, 13:47:39War ich eigentlich auch der Meinung, hat ja beim bisherigen at-Befehl auch funktioniert. Aber nach einer Woche testen (lediglich einmal hat er geschalten) blieb mir nur die Vermutung, dass es mit dem Burstmode zusammenhängt.
Mit dem DOIF setzt Du das FHEM-Device auf die gewünschte Temperatur. Dass diese Information an das Gerät selbst übermittelt wird, darum kümmert sich FHEM bzw. das entsprechende HM...-Modul. Das hat mit dem DOIF nichts zu tun.
Wenn Du die Temperatur von Hand im Web-Frontend verstellst, musst Du ja schließlich auch nicht den Moment abpassen, wo der Thermostat gerade empfangsbereit ist, sondern Du klickst einfach und FHEM kümmert sich um den Rest.
Zitat von: leuchte1 am 11 Februar 2015, 09:19:27
Hallo zusammen,
ich steh gerade auf dem Schlauch. Bin am umstellen auf DOIF und will meine Heizkörper (HM-CC-RT-DN) zu einer bestimmten Uhrzeit zzgl. div. Bedingungen zu schalten.
define Heizung_Bad_an DOIF ([06:25] and !$we and ...........) (set Heizkoerper_Bad desired-temp 22)
Der HM-CC-RT-DN läuft nicht im Burstmode, d.h. er frägt nur alle 2-3 min. ab und da ist Bedingung Uhrzeit u.U. längst passé. Den Burstmode will ich zu Gunsten der Batterielebensdauer vermeiden.
Bin für jede Hilfe dankbar.
Gruß
Stefan
set Heizkoerper_Bad_Clima desired-temp 22
set Heizkoerper_Bad_Clima desired-temp 22.0
set Heizkoerper_Bad_Clima desired-temp 22.0
set Heizkoerper_Bad desired-temp 22.0
ZitatUnknown argument desired-temp, choose one of burstXmit clear:readings,trigger,register,rssi,msgEvents,all fwUpdate getConfig getRegRaw inhibit:on,off raw regBulk regSet reset sysTime unpair
Zitat
define Test DOIF ([05:30:00|8] and ([Bad_Heizkoerper_morgens_aufheizen] eq "aktiviert" or [Bad_Heizkoerper_morgens_aufheizen] eq "state aktiviert")) (set Bad_Heizkoerper_Thermostat desired-temp 23)
attr Test do always
Zitat von: automatisierer am 11 Februar 2015, 20:19:09
@ Rohan,
dem listing nach ist das aber richtig. Er hat halt den Namen von _Clima auf _Thermostat geändert. ...
Zitat von: leuchte1 am 12 Februar 2015, 03:16:36So richtig koscher ist die Definition aber auch nicht. Da fehlt ein Paar Klammern, sonst würde das DOIF die Heizung (auch) in dem Moment hochschalten, wo Bad_Heizkoerper_morgens_aufheizen auf state aktiviert gesetzt wird, und zwar ganz egal wie spät es dann gerade ist (and bindet stärker als or). Deshalb wäre es so korrekt (wenn ich Deine Absicht richtig verstehe):
DEF ([05:30:00] and !$we and [Bad_Heizkoerper_morgens_aufheizen] eq "aktiviert" or [Bad_Heizkoerper_morgens_aufheizen] eq "state aktiviert") (set Bad_Heizkoerper_Thermostat desired-temp 23)
DEF ([05:30:00] and !$we and ([Bad_Heizkoerper_morgens_aufheizen] eq "aktiviert" or [Bad_Heizkoerper_morgens_aufheizen] eq "state aktiviert")) (set Bad_Heizkoerper_Thermostat desired-temp 23)
Zitat von: Brockmann am 12 Februar 2015, 08:29:15
So richtig koscher ist die Definition aber auch nicht. Da fehlt ein Paar Klammern, sonst würde das DOIF die Heizung (auch) in dem Moment hochschalten, wo Bad_Heizkoerper_morgens_aufheizen auf state aktiviert gesetzt wird, und zwar ganz egal wie spät es dann gerade ist (and bindet stärker als or). Deshalb wäre es so korrekt (wenn ich Deine Absicht richtig verstehe):Code Auswählen
DEF ([05:30:00] and !$we and ([Bad_Heizkoerper_morgens_aufheizen] eq "aktiviert" or [Bad_Heizkoerper_morgens_aufheizen] eq "state aktiviert")) (set Bad_Heizkoerper_Thermostat desired-temp 23)
Und wie schon geschrieben wurde, brauchst Du bei solchen Zeitprogrammierungen unbedingt das Attribut do always, sonst wird das DOIF nur beim ersten Mal ausgeführt und dann nicht mehr, weil sich sein Zustand nicht verändert.
DEF ([05:30|8] and [Bad_Heizkoerper_morgens_aufheizen] =~ "aktiviert") (set Bad_Heizkoerper_Thermostat desired-temp 23)
Zitat von: automatisierer am 12 Februar 2015, 09:28:26
das hatte ich auch schon überlegt, hatte aber befürchtet, dass dann auch ein 'deaktiviert' triggert.
define test DOIF ([05:30|8] and [?Bad_Heizkoerper_morgens_aufheizen] !~ "deaktiviert") (set Bad_Heizkoerper_Thermostat desired-temp 23)
attr test do always
Zitat von: Damian am 12 Februar 2015, 09:55:09
P.S. Dass do always bei einem Zustand wichtig ist, steht nicht nur in der Commandref, sondern wurde hier schon mehrfach bei diesem Problem geschrieben ;)
Zitat von: flurin am 12 Februar 2015, 11:16:52
Hallo Damian
Wäre es denkbar, "do always" als Default zu setzen also im Modul entsprechend zu handhaben? Man könnte dann, wenn es stört, "do once" oder Ähnliches definieren.
Gruss
flurin
Zitat von: Damian am 12 Februar 2015, 11:42:57
Denkbar schon aber nicht sinnvoll, denn jede Definition, bei der zyklisch sendende Sensoren (z. B. Temperatur, usw.) angegeben werden (und das sind mindestens genauso viele), würde zum ständigen Ausführen der Befehle führen. Dieses Problem muss insb. bei notify-Definitionen umständlich durch if-Abfragen abgefangen werden und das sollte vom Anfang an bei DOIF, wie auch beim THRESHOLD anders sein.
Gruß
Damian
define FL_Klingeltaster_pushmsg DOIF ([FL_Klingeltaster] =~ "Short") (set pushmsg message Klingel wurde gedrückt!)
define FL_Klingeltaster_pushmsg DOIF ([FL_Klingeltaster] =~ "Short") ({my $LocalTime=localtime;; fhem("set pushmsg message Klingel wurde gedrückt!\n$LocalTime")})
{my $LocalTime=localtime;; fhem("set pushmsg message Klingel wurde gedrückt!\n$LocalTime")}
define ZSFuellstandToLowPushover notify ZS_Fuellstand_Indicator:ToLow {my $LocalTime=localtime;; fhem("set pushmsg message Füllstand Zisterne sehr niedrig (kleiner 3)!!!\n$LocalTime");;}
Zitat von: ultraedition am 12 Februar 2015, 21:44:12
Hallo, ich nutze seit einiger Zeit auch diverse DOIFs in meiner Hausautomation. Ich möchte eine Push-Nachricht verschicken wenn der Klingeltaster gedrückt wurde. Das funktioniert schon wie folgt.Code Auswählendefine FL_Klingeltaster_pushmsg DOIF ([FL_Klingeltaster] =~ "Short") (set pushmsg message Klingel wurde gedrückt!)
Wenn ich jedoch zusätzlich mit der Push-Nachricht einen Zeitstempel mitsenden willCode Auswählendefine FL_Klingeltaster_pushmsg DOIF ([FL_Klingeltaster] =~ "Short") ({my $LocalTime=localtime;; fhem("set pushmsg message Klingel wurde gedrückt!\n$LocalTime")})
erhalte ich bei den DOIF Readings folgende Fehlermeldung:
error {my $LocalTime=localtime; fhem("set pushmsg message Klingel wurde gedrückt!\n$LocalTime")}: Unknown command {my, try help. Unknown command fhem("set, try help.
Wenn ich jedoch den Code direkt in die FHEM Kommandozeile eingebe erhalte ich die Push Nachricht.Code Auswählen{my $LocalTime=localtime;; fhem("set pushmsg message Klingel wurde gedrückt!\n$LocalTime")}
Ich nutze diese Art des Aufbaus auch zusammen mit dem Notify. Auch da funktioniert es z.B.Code Auswählendefine ZSFuellstandToLowPushover notify ZS_Fuellstand_Indicator:ToLow {my $LocalTime=localtime;; fhem("set pushmsg message Füllstand Zisterne sehr niedrig (kleiner 3)!!!\n$LocalTime");;}
Was stimmt an dem Syntax nicht?
define FL_Klingeltaster_pushmsg DOIF ([FL_Klingeltaster] =~ "Short") (set pushmsg message Klingel wurde gedrückt! {(localtime)})
Zitat von: Damian am 12 Februar 2015, 09:55:09
P.S. Dass do always bei einem Zustand wichtig ist, steht nicht nur in der Commandref, sondern wurde hier schon mehrfach bei diesem Problem geschrieben ;)
Gruß
Damian
(([Kesselpumpe] =~ "on" and [Puffer2_100:temperature]<50) or ([Heizkreispumpe] =~ "on" and [Puffer1_25:temperature]<[Puffer2_20:temperature])) (set Heizkreisventil on, set Puffer_2 on, set Puffer_1 off) DOELSE (set Heizkreisventil off, set Puffer_2 off, set Puffer_1 on)
Zitat von: MadCat am 13 Februar 2015, 20:31:34
Hallo, Dank Eurer Hilfe, funktioniert mein DOIF genau so wie ich es gewollt habe, leider hatte ich aber ein Physikalisches Problem nicht bedacht.Code Auswählen(([Kesselpumpe] =~ "on" and [Puffer2_100:temperature]<50) or ([Heizkreispumpe] =~ "on" and [Puffer1_25:temperature]<[Puffer2_20:temperature])) (set Heizkreisventil on, set Puffer_2 on, set Puffer_1 off) DOELSE (set Heizkreisventil off, set Puffer_2 off, set Puffer_1 on)
Irgendwann, ist der Sollwert von [Puffer2_100:temperature]<50 erreicht, aber wie das nun mal so ist mit Temperaturen, Sie schwanken und so schaltet das Heizkreisventil solange auf und zu, bis der Kessel abgebrandt ist und die Kesselpumpe ausschaltet.
Mein Gedanke war nun dieses Problem mit einem Threshold in den Griff zu bekommen, aber wenn ich die Commandref richtig verstehe, geht dies aber wohl nicht mit meinen Bedingungen.
Hat vielleicht jemand eine Idee, wie ich dieses Problem gelöst bekomme?
attr <dein_DOIF_Modul> wait 900:900
Zitat von: Damian am 13 Februar 2015, 20:40:33
Definiere einfach ein wait-Attribut auf deine Befehle, so werden die Schwankungen ignoriert.
z. B. (15 minutige Verzögerung)Code Auswählenattr <dein_DOIF_Modul> wait 900:900
Gruß
Damian
Zitat von: MadCat am 13 Februar 2015, 20:58:54
Vielleicht nicht die sauberste Lösung aber Praktikabel, 15min wären mir aber zu kurz, bis zu welcher Zeitspanne kann dieses Wait ausgereizt werden?
Gruß Ralph
Zitat von: Damian am 13 Februar 2015, 21:06:48
Alternativ kannst du mit dem Attribut cmdpause experimentieren.
Gruß
Damian
Zitat von: MadCat am 13 Februar 2015, 21:14:00
Hm wo ist denn da der Unterschied zu dem wait, ich blicke da noch nicht durch.
Gruß Ralph
([state.NRW.FerienClone.dum])
(set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume=>5, Enabled => 0})
DOELSE
(set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0})
set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume=>5, Enabled => 0}
Zitat von: Spartacus am 14 Februar 2015, 17:22:20Es ist bei solchen Fragen immer hilfreich, die genaue Fehlermeldung dann auch mitzuliefern.
Was passt hier dem DOIF nicht?
([state.NRW.FerienClone.dum] or [hl.01.Feiertag.cdm:today] ne "none")
({fhem "set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 5, Enabled => 0}"})
DOELSE
({fhem "set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 5, Enabled => 1}"})
Zitat von: Spartacus am 14 Februar 2015, 17:52:51
Hi,
danke für den Tipp, das ";" frisst er beim Sonos-Befehl nicht, habe es nun so gemacht!Code Auswählen([state.NRW.FerienClone.dum] or [hl.01.Feiertag.cdm:today] ne "none")
({fhem "set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 5, Enabled => 0}"})
DOELSE
({fhem "set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 5, Enabled => 1}"})
Sieht zwar doof aus mit den Klammern, aber es funzt!
Christian
([state.NRW.FerienClone.dum] or [hl.01.Feiertag.cdm:today] ne "none")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 5, Enabled => 0}))
DOELSE
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 5, Enabled => 1}))
([wz_dm7020hd:hdd1_free]<60) ({sendEmail("Die Dreambox %DEVICE hat nur noch %READING GB Speicherplatz frei!")})
Zitat von: vbs am 15 Februar 2015, 21:54:27
Sorry, mal ne blöde Frage. Ich hab wirklich gesucht: In der commandref, im Forum, im Wiki, aber ich finde es einfach nicht :(
Was muss ich schreiben, um im Ausführungsteil den Namen und das Reading des auslösenden Events zu bekommenn (analog zu notify)? Ich hab versucht $DEVICE, $device, %DEVICE.
Zum Beispiel:Code Auswählen([wz_dm7020hd:hdd1_free]<60) ({sendEmail("Die Dreambox %DEVICE hat nur noch %READING GB Speicherplatz frei!")})
Danke!
([wz_dm7020hd:hdd1_free]<60) ({sendEmail("Die Dreambox wz_dm720hd hat nur noch [wz_dm7020hd:hdd1_free] GB Speicherplatz frei!")})
(
([?16:30-22:30|56] or
[?16:30-22:30] and [?hl.01.Feiertag:tomorrow] ne "none" or
[?16:30-21:30|01234] and [?hl.01.Feiertag:tomorrow] eq "none" or
[?16:30-02:00] and [?hl.01.Feiertag] eq "Silvester") and
[state.TW.Tageslicht.dum] eq "dunkel") (set GA.ss.SA.Licht on)
DOELSE (set GA.ss.SA.Licht off)
Zitat von: Spartacus am 16 Februar 2015, 10:01:28Wenn Du ein ? an die Zeitangabe setzt, triggert weder die Anfangs- noch die Endzeit. Dann wirds also nichts mit automatisch ausschalten.
Muss ich dann vor die Startzeiten ein "?" setzen? Reicht das aus? Die Ausschaltzeit soll dann wieder triggern auf 22:30 und 21:30, bzw. 02:00 Uhr!
Zitat von: Spartacus am 16 Februar 2015, 10:01:28
Hallo,
ich habe noch ein Problem mit meiner Gartenbeleuchtung festgestellt. Diese schaltet immer um 16:30 Uhr ein. Sie soll aber erst einschalten, wenn es dunkel ist. Also auf " [state.TW.Tageslicht.dum] eq "dunkel"" triggern.
Muss ich dann vor die Startzeiten ein "?" setzen? Reicht das aus? Die Ausschaltzeit soll dann wieder triggern auf 22:30 und 21:30, bzw. 02:00 Uhr!Code Auswählen(
([?16:30-22:30|56] or
[?16:30-22:30] and [?hl.01.Feiertag:tomorrow] ne "none" or
[?16:30-21:30|01234] and [?hl.01.Feiertag:tomorrow] eq "none" or
[?16:30-02:00] and [?hl.01.Feiertag] eq "Silvester") and
[state.TW.Tageslicht.dum] eq "dunkel") (set GA.ss.SA.Licht on)
DOELSE (set GA.ss.SA.Licht off)
([16:30-$endTime] and [state.TW.Tageslicht.dum] eq "dunkel" and (TU_Get_Decrement(ReadingsVal("state.TW.Tageslicht.dum","SU",""), "00:30:00")<$endTime)
(set GA.ss.SA.Licht on)
{
my $endTime =0
if (hl.01.Feiertag:tomorrow] ne "none" || $wday~=m/[56] ) {
my $endTime = "22:30";;}
elsif ($wday~=m/[01234] and hl.01.Feiertag:tomorrow] eq "none") {
my $endTime = "21:30";;}
}
ZitatCode Auswählen[16:30-$endTime]
[16:30-{endTime}]
Zitat von: Spartacus am 16 Februar 2015, 16:08:40
Hallo,
vielen Dank für die Antworten. Ich checke das heute noch einmal! Ich habe in diesem Zusammenhang aber noch eine andere Frage:
Ich möchte das ganze etwas umschreiben und die Endzeit vorher in einem "if" bestimmen.
Das DOIF soll dann nur das Licht triggern, wenn es dunkel ist und das Reading "SU-30min" < "endTime" istCode Auswählen([16:30-$endTime] and [state.TW.Tageslicht.dum] eq "dunkel" and (TU_Get_Decrement(ReadingsVal("state.TW.Tageslicht.dum","SU",""), "00:30:00")<$endTime)
(set GA.ss.SA.Licht on)
Die Variable endTime möchte ich im selben DOIF berechnenCode Auswählen{
my $endTime =0
if (hl.01.Feiertag:tomorrow] ne "none" || $wday~=m/[56] ) {
my $endTime = "22:30";;}
elsif ($wday~=m/[01234] and hl.01.Feiertag:tomorrow] eq "none") {
my $endTime = "21:30";;}
}
kriege es aber nicht kombiniert. Geht das überhaupt, oder muss ich das auslagern.
Christian
(([16:30-22:30|7] and [?state.TW.Tageslicht.dum:SU] lt "22:00" or [16:30-21:30|8] and [?state.TW.Tageslicht.dum:SU] lt "21:00")
and [?hl.01.Feiertag:tomorrow] ne "none" and [state.TW.Tageslicht.dum] eq "dunkel")
(set GA.ss.SA.Licht on)
define doif_PushoverStatus DOIF ([06:00] or [08:00] or [12:00] or [15:00] or [19:00] or [20:00] or [21:00] or [23:59]) (set pushmsg msg 'Status' 'Aussentemp. Küchenfenster [Aussentemp:temperature]°C - Aussentemp. Garten [CUL_WS_1:temperature]°C - Heizungspreset [Heizungspresets:state]''' -1 '')
Zitat von: earkle am 16 Februar 2015, 19:37:00
Ich habe es endlich geschafft und lasse mir mehrmals Täglich einen Status per Pushover senden.
Jetzt fehlt mir nur noch die Möglichkeit Zeilenumbrüche einzufügen- im normalen Pushover habe ich das mit " \n " geschafft. Hat da jemand eine Idee wie ich es jetzt schaffe?Code Auswählendefine doif_PushoverStatus DOIF ([06:00] or [08:00] or [12:00] or [15:00] or [19:00] or [20:00] or [21:00] or [23:59]) (set pushmsg msg 'Status' 'Aussentemp. Küchenfenster [Aussentemp:temperature]°C - Aussentemp. Garten [CUL_WS_1:temperature]°C - Heizungspreset [Heizungspresets:state]''' -1 '')
Danke und Gruß
Andreas
%0A
{'674' => {'Recurrence_Thursday' => 1,'IncludeLinkedZones' => '1','Volume' => '5','Shuffle' => 0,'Recurrence_Wednesday' => 1,'ProgramURI' => 'x-sonosapi-stream:s99166?sid=254&flags=32','Repeat' => 0,'Recurrence_Once' => 0,'StartTime' => '06:00:00','Duration' => '','Recurrence_Sunday' => 0,'Enabled' => '0','Recurrence_Friday' => 1,'Recurrence_Saturday' => 0,'Recurrence_Tuesday' => 1,'RoomUUID' => 'RINCON_B8E9375131E201400','ProgramMetaData' => '<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="R:0/0/3" parentID="R:0/0" restricted="true"><dc:title>WDR2 Ruhrgebiet</dc:title><upnp:class>object.item.audioItem.audioBroadcast</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">SA_RINCON65031_</desc></item></DIDL-Lite>','Recurrence_Monday' => 1}}
sub AlarmEnabled($$) {
my ($player, $alarmID) = @_;
my $AlarmState=eval(ReadingsVal('$player', 'AlarmList', '{}'))->{$alarmID}{Enabled};
return $AlarmState;
}
([04:50-06:30|0123456] or [09:00-22:00|06]
and ($month> 2 && $month< 10)
and [Brunnen_Master:state] eq "on")
(set Brunnen on)
DOELSE
(set Brunnen off)
([color=red]([/color][04:50-06:30|0123456] or [09:00-22:00|06][color=red])[/color]
and ($month> 2 && $month< 10)
and [Brunnen_Master:state] eq "on")
(set Brunnen on)
DOELSE
(set Brunnen off)
Anwendungsbeispiel: Meldung beim Ausbleiben eines Events
define di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again")
attr di_push wait 1800
attr di_push do resetwait
Zitat von: flurin am 18 Februar 2015, 15:09:31
Hallo,
Beim Beispiel aus der DokumentationCode AuswählenAnwendungsbeispiel: Meldung beim Ausbleiben eines Events
define di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again")
attr di_push wait 1800
attr di_push do resetwait
wird eine Meldung beim Ausbleiben eines Events ausgelöst. Das ist Ok.
Ich möchte jedoch, dass alle 1800 sec eine Meldung ausgelöst wird, solange bis der Tempsensor wieder sendet.
Ist das mit DOIF machbar?
Gruss
flurin
define di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again",trigger Tempsensor)
attr di_push wait 1800
attr di_push do resetwait
Zitat von: Damian am 18 Februar 2015, 16:06:50Code Auswählendefine di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again",trigger Tempsensor)
define di_test DOIF ([test_switch1])( { mySub("A");; mySub("B") } )
define di_test DOIF ([test_switch1])( { mySub("A");;;; mySub("B") } )
define di_test DOIF ([test_switch1])( { mySub("A") }, { mySub("B") } )
define di_test DOIF ([test_switch1])( { mySub("A"), mySub("B") } )
Zitat von: flurin am 19 Februar 2015, 11:49:06
Hallo Damian
Bei der Ausführung von mehreren Subs ist mir Folgendes aufgefallen (Auszüge aus fhem.cfg)
Diese Variante (die wäre für mich naheliegend) führt zu einem Fehler:Code Auswählendefine di_test DOIF ([test_switch1])( { mySub("A");; mySub("B") } )
so ist Ok:Code Auswählendefine di_test DOIF ([test_switch1])( { mySub("A");;;; mySub("B") } )
oder so:Code Auswählendefine di_test DOIF ([test_switch1])( { mySub("A") }, { mySub("B") } )
aber auch so:Code Auswählendefine di_test DOIF ([test_switch1])( { mySub("A"), mySub("B") } )
Welche Variante soll man bevorzugen?
Gruss
flurin
Zitat von: Damian am 19 Februar 2015, 12:10:03Code Auswählendefine di_test DOIF ([test_switch1])( { mySub("A"), mySub("B") } )
Die letzte dürfte auch nicht funktionieren
Zitat von: flurin am 19 Februar 2015, 13:06:57
dochjedoch nicht immer! also am besten nicht verwenden.
Edit: nochmals getestet > diese Variante funktioniert bei mir.
Gruss
flurin
{ mySub("A"), mySub("B") }
Zitat von: Damian am 19 Februar 2015, 18:01:52
Dann ist das eine Sache von fhem und nicht von DOIF, dann muss in der Eingabezeile ohne DOIF auch:Code Auswählen{ mySub("A"), mySub("B") }
funktionieren. Warum hier Komma als Trennzeichen funktioniert kann nur Rudi sagen.
(([state.NRW.FerienClone.dum] or [hl.01.Feiertag.cdm:today] ne "none") and [OG.kz.AL.Wecker.dum] eq "ein" )
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "ein")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 2, Enabled => 1}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "aus")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
Zitat von: Spartacus am 19 Februar 2015, 21:28:27Code Auswählen(([state.NRW.FerienClone.dum] or [hl.01.Feiertag.cdm:today] ne "none") and [OG.kz.AL.Wecker.dum] eq "ein" )
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
Wo habe ich hier den Fehler?
(([state.NRW.FerienClone.dum] ne "none" or [hl.01.Feiertag.cdm:today] ne "none") and [OG.kz.AL.Wecker.dum] eq "ein" )
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
define di_Handsender_1 DOIF ([Handsender_1:state:sec] < 0.5 and [test_Hansender] eq "zu") (set test_Hansender auf)\
DOELSEIF\
([Handsender_1:state:sec] < 0.5 and [test_Hansender] eq "auf") (set test_Hansender stop)\
DOELSEIF\
([Handsender_1:state:sec] < 0.5 and [test_Hansender] eq "stop") (set test_Hansender zu)
attr di_Handsender_1 do always
attr di_Handsender_1 room test
define di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again")
attr di_push wait 1800
attr di_push do resetwait
Zitat von: daschauher am 21 Februar 2015, 01:11:32
Hallo,
ich überwache einen Temperatursensor auf Funktion mittels:Code Auswählendefine di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again")
attr di_push wait 1800
attr di_push do resetwait
Jetzt würde ich gerne auch eine Nachricht bekommen wenn der Sensor wieder in Betrieb geht, also doch wieder sendet.
Stehe aber gerade voll auf dem Schlauch wie ich das machen könnte.
Hat jemand eine Idee oder einen Tip?
gruss
markus
define sensor_failure dummy
attr sensor_failure setList on off
define di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again", set sensor_failure on)
attr di_push wait 1800
attr di_push do resetwait
define di_sensor_alive DOIF ([Tempsensor] and [?sensor_failure] eq "on") ({set pushmsg "sensor alive") }, set sensor_failure off)
Zitat von: Spartacus am 20 Februar 2015, 19:04:14
Aber das Einschalten funzt halt nicht mehr, wenn ich state.NRW.FerienClone.dum wieder auf "0" setze!
Zitat von: Brockmann am 21 Februar 2015, 15:03:18Hallo Brockmann,
Natürlich funktioniert das nicht und warum das so ist, hatte ich ja auch geschrieben. Wenn Du als Teilbedingung einfach nur [state.NRW.FerienClone.dum] ohne Vergleich nimmst, dann ist diese Teilbedingung IMMER WAHR. Also egal, ob Du [state.NRW.FerienClone.dum] auf 1 oder 0 setzt, dieser Teil der Bedingung ist immer wahr. Solange [OG.kz.AL.Wecker.dum] auf "ein" steht, wird das DOIF deshalb immer die erste Kondition treffen und niemals die zweite. Aber es müsste die zweite treffen um den Wecker auszuschalten. Deshalb kannst Du den Wecker ein-, aber nicht wieder ausschalten. Du musst also [state.NRW.FerienClone.dum] in der Kondition mit irgendwas vergleichen. Womit genau, kann ich aber nur mutmassen, da ich ja nicht weiß, was so für Daten in Deinen Dummy stehen. Deshalb schrieb ich ja auch "Meinst Du vielleicht".
(([state.NRW.FerienClone.dum] eq "1" or [hl.01.Feiertag.cdm:today] ne "none") and [OG.kz.AL.Wecker.dum] eq "ein" )
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "ein")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 2, Enabled => 1}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "aus")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
Zitat von: Spartacus am 21 Februar 2015, 15:51:00Probier es mal mit [state.NRW.FerienClone.dum] == 1, weil es ja ein numerischer Vergleich ist.
Allerdings triggert er immer noch auf cmd1, wenn FerienClone von "1" auf "0" gesetzt wird! Ich verstehe das irgendwie noch nicht!
Zitat von: Brockmann am 21 Februar 2015, 16:20:36
Probier es mal mit [state.NRW.FerienClone.dum] = 1, weil es ja ein numerischer Vergleich ist.
Ansonsten in der Situation list <Name Deines DOIFs> und entweder selbst analysieren oder hier posten.
Zitat von: automatisierer am 21 Februar 2015, 16:27:07Wo Du Recht hast...
ich will nicht klugscheißen, aber mit einem = wirds wohl nicht funzen, müssen schon == sein.
nternals:
CFGFN Config/98-Sonos.cfg
DEF (([state.NRW.FerienClone.dum] == 1 or [hl.01.Feiertag.cdm:today] ne "none") and [OG.kz.AL.Wecker.dum] eq "ein" )
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "ein")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 2, Enabled => 1}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "aus")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
NAME di.01.OG.kz.SON.ZP_S1
NR 142
NTFY_ORDER 50-di.01.OG.kz.SON.ZP_S1
STATE ein
TYPE DOIF
Readings:
2015-02-21 16:42:27 cmd_event state.NRW.FerienClone.dum
2015-02-21 16:42:27 cmd_nr 1
2015-02-21 16:43:20 e_state.NRW.FerienClone.dum_STATE 1
2015-02-21 16:42:27 state ein
Condition:
0 (InternalDoIf('state.NRW.FerienClone.dum','STATE','') == 1 or ReadingValDoIf('hl.01.Feiertag.cdm','today','') ne "none") and InternalDoIf('OG.kz.AL.Wecker.dum','STATE','') eq "ein"
1 InternalDoIf('OG.kz.AL.Wecker.dum','STATE','') eq "ein"
2 InternalDoIf('OG.kz.AL.Wecker.dum','STATE','') eq "aus"
Devices:
0 state.NRW.FerienClone.dum hl.01.Feiertag.cdm OG.kz.AL.Wecker.dum
1 OG.kz.AL.Wecker.dum
2 OG.kz.AL.Wecker.dum
all state.NRW.FerienClone.dum hl.01.Feiertag.cdm OG.kz.AL.Wecker.dum
Do:
0 (set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0})
1 (set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 2, Enabled => 1})
2 (set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0})
Helper:
last_timer 0
sleeptimer -1
Internals:
0 state.NRW.FerienClone.dum:STATE OG.kz.AL.Wecker.dum:STATE
1 OG.kz.AL.Wecker.dum:STATE
2 OG.kz.AL.Wecker.dum:STATE
all state.NRW.FerienClone.dum:STATE OG.kz.AL.Wecker.dum:STATE
Readings:
0 hl.01.Feiertag.cdm:today
all hl.01.Feiertag.cdm:today
State:
Timerfunc:
Trigger:
Attributes:
alias Weckersteuerung
cmdState ein|ein|aus
group Sonos Script
room 98-Sonos
Zitat von: Spartacus am 21 Februar 2015, 16:49:47
Hi,
sorry! Es funzt nicht! Die Events von "state.NRW.FerienClone.dum" kann ich im EventLog sehen, die kommen sauber. "OG.kz.AL.Wecker.dum" habe ich permanent auf "ein" stehen. aber es wird immer cmd1 ausgeführt. Egal welchen Wert ich in "state.NRW.FerienClone.dum" einstelle!Code Auswählennternals:
CFGFN Config/98-Sonos.cfg
DEF (([state.NRW.FerienClone.dum] == 1 or [hl.01.Feiertag.cdm:today] ne "none") and [OG.kz.AL.Wecker.dum] eq "ein" )
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "ein")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 2, Enabled => 1}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "aus")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
NAME di.01.OG.kz.SON.ZP_S1
NR 142
NTFY_ORDER 50-di.01.OG.kz.SON.ZP_S1
STATE ein
TYPE DOIF
Readings:
2015-02-21 16:42:27 cmd_event state.NRW.FerienClone.dum
2015-02-21 16:42:27 cmd_nr 1
2015-02-21 16:43:20 e_state.NRW.FerienClone.dum_STATE 1
2015-02-21 16:42:27 state ein
Condition:
0 (InternalDoIf('state.NRW.FerienClone.dum','STATE','') == 1 or ReadingValDoIf('hl.01.Feiertag.cdm','today','') ne "none") and InternalDoIf('OG.kz.AL.Wecker.dum','STATE','') eq "ein"
1 InternalDoIf('OG.kz.AL.Wecker.dum','STATE','') eq "ein"
2 InternalDoIf('OG.kz.AL.Wecker.dum','STATE','') eq "aus"
Devices:
0 state.NRW.FerienClone.dum hl.01.Feiertag.cdm OG.kz.AL.Wecker.dum
1 OG.kz.AL.Wecker.dum
2 OG.kz.AL.Wecker.dum
all state.NRW.FerienClone.dum hl.01.Feiertag.cdm OG.kz.AL.Wecker.dum
Do:
0 (set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0})
1 (set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 2, Enabled => 1})
2 (set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0})
Helper:
last_timer 0
sleeptimer -1
Internals:
0 state.NRW.FerienClone.dum:STATE OG.kz.AL.Wecker.dum:STATE
1 OG.kz.AL.Wecker.dum:STATE
2 OG.kz.AL.Wecker.dum:STATE
all state.NRW.FerienClone.dum:STATE OG.kz.AL.Wecker.dum:STATE
Readings:
0 hl.01.Feiertag.cdm:today
all hl.01.Feiertag.cdm:today
State:
Timerfunc:
Trigger:
Attributes:
alias Weckersteuerung
cmdState ein|ein|aus
group Sonos Script
room 98-Sonos
Christian
Internals:
CFGFN Config/99-Dienste.cfg
DEF hl.01.Feiertag
NAME hl.01.Feiertag.cdm
NOTIFYDEV hl.01.Feiertag
NR 195
NTFY_ORDER 50-hl.01.Feiertag.cdm
STATE defined
TYPE cloneDummy
Readings:
2015-02-21 15:37:14 state defined
2015-02-21 00:00:02 today none
2015-02-21 00:00:02 tomorrow none
2015-02-21 00:00:02 yesterday none
Attributes:
alias Feiertag
cloneIgnore 1
group Kalender
room 99-Dienste
Internals:
CFGFN Config/98-Sonos.cfg
NAME OG.kz.AL.Wecker.dum
NR 146
STATE ein
TYPE dummy
Readings:
2015-02-21 15:41:20 state ein
Attributes:
alias Weckautomatik
devStateIcon aus:Wecker.Aus ein:Wecker.Wochentags
group Sonos Wecker
room 98-Sonos
webCmd ein:aus
Zitat von: Spartacus am 21 Februar 2015, 18:00:41
Hallo,
ich glaube wirklich es ist der perl-Interpreter!
DOIF ([state.NRW.FerienClone.dum] == 1)(set bla on) DOELSE (set bla off)
Zitat von: Spartacus am 21 Februar 2015, 18:00:41
cmdState Ein|Ein|Aus, bedeutet in diesem Zusammenhang, dass die Weckerautomatik von fhem in den ersten beiden Fällen greift und im letzten Fall durch den Switch "OG.kz.AL.Wecker.dum" außer Kraft gesetzt wird. Dann kann ich den Wecker nur noch zu Fuß über den Sonos-Controller steuern.
Zitat
(([state.NRW.FerienClone.dum] == 1 or [hl.01.Feiertag.cdm:today] ne "none") and [OG.kz.AL.Wecker.dum] eq "ein" )
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
(([state.NRW.FerienClone.dum] == 1) and [OG.kz.AL.Wecker.dum] eq "ein" )
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "ein")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 2, Enabled => 1}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "aus")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
Zitat von: der-Lolo am 21 Februar 2015, 19:03:44
Bei den vielen Versuchen die Du schon unternommen hast blickt wahrscheinlich niemand mehr so recht was jetzt schon alles versucht wurde...
ich würde mal
== 1 gegen eq "1" tauschen.
Zitat von: der-Lolo am 21 Februar 2015, 19:03:44Hi,
Bei den vielen Versuchen die Du schon unternommen hast blickt wahrscheinlich niemand mehr so recht was jetzt schon alles versucht wurde...
ich würde mal
== 1 gegen eq "1" tauschen.
define di.01.OG.kz.SON.ZP_S1 DOIF ([state.NRW.FerienClone.dum] eq "1") \
(set Lampe off)\
DOELSEIF\
([OG.kz.AL.Wecker.dum] eq "ein")\
(set Lampe on)\
DOELSEIF\
([OG.kz.AL.Wecker.dum] eq "aus")\
(set Lampe off)
attr di.01.OG.kz.SON.ZP_S1 alias Weckersteuerung
attr di.01.OG.kz.SON.ZP_S1 cmdState ein|ein|aus
attr di.01.OG.kz.SON.ZP_S1 group Sonos Script
attr di.01.OG.kz.SON.ZP_S1 room 98-Sonos
Zitat von: Spartacus am 21 Februar 2015, 20:04:49
Hi,
damit sind wir angefangen...
Ich habe den Code jetzt total abgespeckt und selbst das funktioniert nicht!
Es gibt die Dummy Devices "state.NRW.FerienClone.dum" und "OG.kz.AL.Wecker.dum"
"OG.kz.AL.Wecker.dum" steht auf "ein". Ändere ich dieses Dummy Device auf "aus", trifft cmd 3 zu. Schalte ich es auf "ein" kommt cmd2. Soweit alles gut.
Jetzt stelle ich "OG.kz.AL.Wecker.dum" auf "ein" und schallte "state.NRW.FerienClone.dum" von "0" nach "1". Es wird cmd1 ausgeführt. Nun schalte ich "state.NRW.FerienClone.dum" auf "5" und die Lampe bleibt aus. Es triggert cmd1. Das ist falsch!Code Auswählendefine di.01.OG.kz.SON.ZP_S1 DOIF ([state.NRW.FerienClone.dum] eq "1") \
(set Lampe off)\
DOELSEIF\
([OG.kz.AL.Wecker.dum] eq "ein")\
(set Lampe on)\
DOELSEIF\
([OG.kz.AL.Wecker.dum] eq "aus")\
(set Lampe off)
attr di.01.OG.kz.SON.ZP_S1 alias Weckersteuerung
attr di.01.OG.kz.SON.ZP_S1 cmdState ein|ein|aus
attr di.01.OG.kz.SON.ZP_S1 group Sonos Script
attr di.01.OG.kz.SON.ZP_S1 room 98-Sonos
Das gibt es doch gar nicht, oder?
Christian
NACHTRAG:
DOIF-Version:
$Id: 98_DOIF.pm 8031 2015-02-18 17:49:10Z damian-s $
Zitat von: Spartacus am 21 Februar 2015, 20:24:34
ok! Dann kann man meine Anwendung offenbar nicht mit einem DOIF lösen!
define di.01.OG.kz.SON.ZP_S1 DOIF ([state.NRW.FerienClone.dum] eq "1") \
(set Lampe off)\
DOELSEIF\
([OG.kz.AL.Wecker.dum] eq "ein" and (state.NRW.FerienClone.dum] ne "1")\
(set Lampe on)\
DOELSEIF\
([OG.kz.AL.Wecker.dum] eq "aus" and [state.NRW.FerienClone.dum] ne "1" )\
(set Lampe off)
Zitat von: der-Lolo am 21 Februar 2015, 20:30:13
das erschreckt mich jetzt auch ein bisschen... bedeutet das nun wirklich das wenn ein trigger der nur in bedingung 1 sitzt triggert und diese dann nicht mehr zutrifft das dann nicht in den weiteren DOELSEIFs geschaut wird welches wahr ist?
Ich dachte bis jetzt das es so läuft und setze z.b. DOELSE gezielt überwachend (logeintrag) ein.
ZitatDie Angaben werden immer von links nach rechts abgearbeitet. Es wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist. Hinzu kommt, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event auch das Device beinhalten.
Zitat von: der-Lolo am 21 Februar 2015, 20:43:12
Ok, das erklärt mir jetzt warum ich immer wiedermal ärger mit meinem HarmonyDOIF habe...
Danke, ich werde es entsprechend umbauen.
Zitat von: Spartacus am 21 Februar 2015, 20:56:19
Hallo,
Danke für die klärenden Worte!
Ich lese die Commandref eigentlich immer. Aber für einen Nicht-Programmierer ist Logik nicht immer logisch! Ich denke oft, "jetzt haste es gerafft" und dann kommt die Ernüchterung! Ich gebe nicht auf!
Danke an alle,
Christian
Zitat von: flurin am 22 Februar 2015, 16:29:09
Hallo Damian
Es fällt auf, dass das Schreiben von Postings in diesem Thread immer langsamer wird. Die Datenbank scheint überfordert zu sein.
Ev. ist es sinnvoll, ein neues Thread zu starten und das Bestehende zu schliessen.
Gruss
flurin