Hallo Leute,
Wie und wo ist mein Fehler mit den ständigen Status Meldungen in meinem DOIF
Internals:
DEF (([?20:00-03:30]
and
[avr:power] eq "off" and [Stefan] eq "present") or [Christin] eq "present")
(set Erdgeschoss_Licht off )
DOELSEIF
(([([22:00]+int(rand(1800))) |Mo Di Mi Do So]) or ([([22:20]+int(rand(7200))) |Fr Sa])
and
[Stefan] eq "absent" and [Christin] eq "absent"
and
[avr:power] eq "off")
(set Erdgeschoss_Licht off )
FUUID 5ec6df24-f33f-faf7-3710-eae47bcededb8c02
MODEL FHEM
NAME Licht_steuerung
NOTIFYDEV Christin,global,avr,Stefan
NR 163
NTFY_ORDER 50-Licht_steuerung
STATE cmd_1
TYPE DOIF
VERSION 20811 2019-12-22 17:45:08
READINGS:
2020-05-26 00:10:23 Device Stefan
2020-05-26 00:10:23 cmd 1
2020-05-26 00:10:23 cmd_event Stefan
2020-05-26 00:10:23 cmd_nr 1
2020-05-26 00:10:21 e_Christin_STATE present
2020-05-26 00:10:23 e_Stefan_STATE present
2020-05-25 23:58:51 e_avr_power on
2020-05-25 06:33:23 mode enabled
2020-05-26 00:10:23 state cmd_1
2020-05-25 21:47:17 timer_01_c01 26.05.2020 20:00:00
2020-05-25 21:47:17 timer_02_c01 26.05.2020 03:30:00
2020-05-25 22:18:48 timer_03_c02 26.05.2020 22:09:55|MoDiMiDoSo
2020-05-25 21:47:17 timer_04_c02 26.05.2020 00:16:56|FrSa
Regex:
accu:
cond:
Christin:
0:
&STATE ^Christin$
1:
&STATE ^Christin$
Stefan:
0:
&STATE ^Stefan$
1:
&STATE ^Stefan$
avr:
0:
power ^avr$:^power:
1:
power ^avr$:^power:
attr:
cmdState:
wait:
waitdel:
condition:
0 (::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'avr','power') eq "off" and ::InternalDoIf($hash,'Stefan','STATE') eq "present") or ::InternalDoIf($hash,'Christin','STATE') eq "present"
1 (::DOIF_time_once($hash,2,$wday,"MoDiMiDoSo")) or (::DOIF_time_once($hash,3,$wday,"FrSa")) and ::InternalDoIf($hash,'Stefan','STATE') eq "absent" and ::InternalDoIf($hash,'Christin','STATE') eq "absent" and ::ReadingValDoIf($hash,'avr','power') eq "off"
days:
2 MoDiMiDoSo
3 FrSa
do:
0:
0 set Erdgeschoss_Licht off
1:
0 set Erdgeschoss_Licht off
2:
helper:
DEVFILTER ^global$|^Christin$|^Stefan$|^avr$
NOTIFYDEV global|Christin|Stefan|avr
event present,presence: present
globalinit 1
last_timer 4
sleeptimer -1
timerdev Stefan
timerevent present,presence: present
triggerDev Stefan
timerevents:
present
presence: present
timereventsState:
state: present
presence: present
triggerEvents:
present
presence: present
triggerEventsState:
state: present
presence: present
internals:
all Stefan:STATE Christin:STATE
interval:
0 -1
1 0
intervalfunc:
localtime:
0 1590516000
1 1590456600
2 1590523795
3 1590445016
perlblock:
readings:
all avr:power
realtime:
0 20:00:00
1 03:30:00
2 22:09:55
3 00:16:56
time:
0 20:00:00
1 03:30:00
2 ([22:00]+int(rand(1800)))
3 ([22:20]+int(rand(7200)))
timeCond:
0 0
1 0
2 1
3 1
timer:
0 0
1 0
2 0
3 0
timers:
1 2 3
trigger:
triggertime:
1590445016:
localtime 1590445016
hash:
1590456600:
localtime 1590456600
hash:
1590516000:
localtime 1590516000
hash:
1590523795:
localtime 1590523795
hash:
uiState:
uiTable:
Attributes:
do always
room Licht
Dein "list" ist unlesbar, so mit allem auf einer Zeile
Du hast immer noch das and/or Problem wie hier geantwortet: https://forum.fhem.de/index.php/topic,35638.msg1057332.html#msg1057332
Das ist genau wie der Unterschied zwischen
2 * 2 * 2 + 2 = (2 * 2 * 2) + 2 = 10 => was du geschrieben hast
und
2 * 2 * (2 + 2) = 16 => was du vermutlich willst
Die PRESENCE Devices melden sich regelmässig. Das heisst, dass Bedingung 1 regelmässig getriggert wird, und daher mit do always, cmd1 regelmässig ausgeführt wird. Schau mal die Events im Eventmonitor
Oder zeig die Definition deiner PRESENCE Dinge. Vielleicht reicht ein event-on-change-reading drauf
EDIT: Du hast wahrscheinlich das gleiche and/or Problem in der 2. Bedingung: die Zeit Bedingung für Mo Di Mi Do So schaltet unabhängig von den PRESENCE Melder und unabhängig von avr:power.
DEF (([?20:00-03:30] and [avr:power] eq "off" and [Stefan] eq "present")
or [Christin] eq "present")
(set Erdgeschoss_Licht off )
DOELSEIF (([([22:00]+int(rand(1800))) |Mo Di Mi Do So])
or ([([22:20]+int(rand(7200))) |Fr Sa]) and [Stefan] eq "absent" and [Christin] eq "absent" and [avr:power] eq "off")
(set Erdgeschoss_Licht off )
Ja genau so wie du es schreibst hätte ich es gerne. Werde mir die Events anschauen.
05-26 00:02:15 structure Erdgeschoss_Licht off
2020-05-26 00:02:15 IT Brennstuhl_C off
2020-05-26 00:02:15 CUL nanoCUL raw: is000FFFF0FF00
2020-05-26 00:02:15 IT Steckdose_1 off
2020-05-26 00:02:16 CUL nanoCUL raw: is1FFF1FF0FF00
2020-05-26 00:02:16 DOIF Licht_steuerung cmd_nr: 1
2020-05-26 00:02:16 DOIF Licht_steuerung cmd: 1
2020-05-26 00:02:16 DOIF Licht_steuerung cmd_event: Christin
2020-05-26 00:02:16 DOIF Licht_steuerung cmd_1
2020-05-26 00:02:16 PRESENCE Christin present
2020-05-26 00:02:16 PRESENCE Christin presence: present
2020-05-26 00:02:16 structure Eltern present
2020-05-26 00:02:16 DOIF Subwoofer_auto error: condition c01: Can't find string terminator '"' anywhere before EOF, line 1.
2020-05-26 00:02:16 structure Erdgeschoss_Licht off
2020-05-26 00:02:16 IT Brennstuhl_C off
2020-05-26 00:02:17 CUL nanoCUL raw: is000FFFF0FF00
2020-05-26 00:02:17 IT Steckdose_1 off
2020-05-26 00:02:17 CUL nanoCUL raw: is1FFF1FF0FF00
2020-05-26 00:02:17 DOIF Licht_steuerung cmd_nr: 1
2020-05-26 00:02:17 DOIF Licht_steuerung cmd: 1
2020-05-26 00:02:17 DOIF Licht_steuerung cmd_event: Stefan
2020-05-26 00:02:17 DOIF Licht_steuerung cmd_1
2020-05-26 00:02:17 PRESENCE Stefan present
2020-05-26 00:02:17 PRESENCE Stefan presence: present
2020-05-
So sieht es in meinem Event aus es wird ständig getriggert.
Ich denke ich hab es. Hat zumindestens gerade passend geschaltet.
([?20:00-03:30]
and
[avr:power] eq "off" and ([Stefan] eq "present" or [Christin] eq "present"))
(set Erdgeschoss_Licht off )
DOELSEIF
(([([22:00]+int(rand(1800))) |Mo Di Mi Do So]) or ([([22:20]+int(rand(7200))) |Fr Sa])
and
[Stefan] eq "absent" and [Christin] eq "absent"
and
[avr:power] eq "off")
(set Erdgeschoss_Licht off )
Die erste Bedingung sieht besser aus, die 2. (DOELSEIF) ist meiner Meinung nach immer noch falsch
Sollte es nicht eher
(zeit or zeit) and presence and presence and power
sein? Ich weiss nicht, was Du genau machen willst, aber so wie es im Moment ist, wird es Mo Di Mi Do So immer schalten, egal die presences und power.
Ich hätte gerne am wochenende Unterschiedliche Zeiten zu in der Woche. Also in der Woche soll es so simuliert werden wenn wir nicht da sind als wären wir da und das abendliche TV prgramm ist zu ende. Und am Wochenende bleibt ja meistens etwas länger auf. Dort soll es dann länger an bleiben und anders schalten. Und es soll schalten wenn keiner von uns da ist.
Ja ich bekomme das mit den klammern nicht richtig hin. Weiß nie genau wann ich wo ein hinmachen muss. Versuche es über beiträge hier im Forum mir zusammen zu bauen.
Habe das Presence und Precense gegen einmal presence ausgetauscht.
Zitat von: Wasserwerk33 am 27 Mai 2020, 13:02:40
Ich hätte gerne am wochenende Unterschiedliche Zeiten zu in der Woche. Also in der Woche soll es so simuliert werden wenn wir nicht da sind als wären wir da und das abendliche TV prgramm ist zu ende. Und am Wochenende bleibt ja meistens etwas länger auf. Dort soll es dann länger an bleiben und anders schalten. Und es soll schalten wenn keiner von uns da ist.
Ja ich bekomme das mit den klammern nicht richtig hin. Weiß nie genau wann ich wo ein hinmachen muss. Versuche es über beiträge hier im Forum mir zusammen zu bauen.
Habe das Presence und Precense gegen einmal presence ausgetauscht.
Hab dir den Tipp oben gegeben: "and" ist wie "*", or ist wie "+", was Assoziativität, Vorrang und Distributivität angeht.
Wenn Du 2 * 2 + 2
schreibst, ist est wie
(2*2) +2
2* (2 + 2) ist etwas anderes
Also
Bedingung1 and Bedingung2 or Bedingung3 = (Bedingung1 and Bedingung2) or Bedingung3 = "beide erste gleichzeitig wahr, oder 3. wahr"
Bedingung1 and (Bedingung2 or Bedingung3) = "erste whar, und dazu eine oder beide der beiden anderen"
In dem Sinn ist deine DOELSEIF Bedingung vielleicht doch wirklich was Du willst, ich kann es nicht schätzen:
- in der Woche immer ca. um 22:00 Uhr, egal ob programm zu Ende oder nicht, und egal ob ihr da oder nicht da seid
- am Wochenend gegen 22:20 Uhr, aber nur wenn programm zu Ende und ihr seid nicht da
Kann ich den eine Uhrzeit ans Ende setzten? Denn wenn ich das so lese müsste ich meine Letzte Bedingung ja umdrehen? oder spielt das keine rolle wo ich die Uhrzeit hinmachen? habe mal gelesen die muss an den Anfang. den es soll ja eigentlich schalten Bedingung und Bedingung und Zeit oder die Zeit.
([Eltern] eq "absent"
and
[avr:power] eq "off" and
([([22:00]+int(rand(1800))) |Mo Di Mi Do So]) or ([([22:20]+int(rand(7200))) |Fr Sa]))
(set Erdgeschoss_Licht off )
Dann wäre es doch so richtig oder nicht??
somit habe ich Doch bedigung 1 und bedingung 2 and (bedingung3 or bedingung4) somit sind die ersten beiden wahr, und oder einer der beiden anderen.
Bei and-Verknüpfung kannst du die Angaben drehen und wenden wie du willst - es ändert nichts an der Funktion bzw. Aussage.
Jetzt hast Du folgendes geschrieben:
- wenn Ende des Programs und Eltern absent um ca. 22:00 Uhr in der Woche => ausschalten
- um 22:20 Uhr am Wochenende, egal der Status des Programs und egal die Eltern => ausschalten
Eltern and Power and ZeitWoche
or
ZeitWE
erstmal danke das ich euch die Zeit für mich nehmt und mir Helft.
okay dann muss zwischen Bedingung und "or" Bedingung die ")" weg und einer vor der Zeit auch noch. So das das system dann "eins" ergibt.
([Eltern] eq "absent"
and
[avr:power] eq "off" and
[([22:15]+int(rand(900))) |Mo Di Mi Do So] or ([([22:30]+int(rand(5400))) |Fr Sa]))
(set Erdgeschoss_Licht off )
Hätte da noch eine Frage hat mit diesem nichts zu tun. aber mit einem anderen Projekt.
Ich wurde gerne die jalousien schalten lassen. Kann ich alles nur mit getretten DOELSEIF schalten?? Oder gibt es noch eine trickt wie es nicht schaltet wenn CMD 1 schon ausgelöst wurde.
Also wenn ich 4 CMD drin habe schalten die immer weiter. Also wenn CMD 2 passt würden sie ja auch runter fahren und dann sind sie ja nicht auf sonnenscutz sondern zu.
gibt es da einen anderen Trick oder einfach nur passen schreiben? bei den anderen jalousien hatte ich reingeschrieben das erst der andere ausgelöst werden muss, bevor er wieder schalten darf.
Ihr müsst die "or" als richtig "oder" lesen
([?8:30-12:30] and [Twilight.Zuhause:azimuth] > 69 and [Twilight.Zuhause:azimuth] < 155 and [IbbenbuerenProplanta:fc0_weather9] =~ "heiter|klar|sonnig" and [LaCrosse_0C:temperature] > 14
or
[IbbenbuerenProplanta:fc0_weather9] =~"bedeckt|heiter" and [LaCrosse_0C:temperature] > 19
or
[?12:30-18:00] and [Twilight.Zuhause:azimuth] > 155 and [Twilight.Zuhause:azimuth] < 264 and [IbbenbuerenProplanta:fc0_weather15] =~ "heiter|klar|sonnig" and [LaCrosse_0C:temperature] > 15)
(set Sonnenschutz_OG_runter Trigger)
DOELSEIF
([?8:35-11:50] and [Twilight.Zuhause:azimuth] > 155 and [IbbenbuerenProplanta:fc_weather10] =~ "regen|wolkig|stark.bewoelkt"
or
[LaCrosse_0C:temperature] < 15
or
[?15:00-17:55] and [Twilight.Zuhause:azimuth] > 265 and [IbbenbuerenProplanta:fc_weather16] =~ "regen|wolkig|stark.bewoelkt"
or
[LaCrosse_0C:temperature] < 15)
(set Sonnenschutz_OG_hoch Trigger)
kann man das so schreiben wenn ich es richtig schreibe oder gibt es noch einen anderen weg?
([?8:35-11:50] and [Twilight.Zuhause:azimuth] > 155 and [IbbenbuerenProplanta:fc_weather10] =~ "regen|wolkig|stark.bewoelkt"
or
[LaCrosse_0C:temperature] < 15
or
[?15:00-17:55] and [Twilight.Zuhause:azimuth] > 265 and [IbbenbuerenProplanta:fc_weather16] =~ "regen|wolkig|stark.bewoelkt"
or
[LaCrosse_0C:temperature] < 15)
"etwas1 or etwas2 or etwas3 or etwas2 or etwas1 or etwas4 or etwas3 or etwas2 or etwas1 or etwas1 or etwas4"
hat genau das gleiche Verhalten wie
"etwas1 or etwas2 or etwas3 or etwas4"
Also das letzte [LaCrosse_0C:temperature] < 15 ist völlig überflüssig und ändert nichts an der Sache
Um nicht zu schalten, wenn CMD1 schon ausgelöst wurde kann man
.... and [$SELF] ne "cmd_1"
ZitatAlso wenn ich 4 CMD drin habe schalten die immer weiter
verstehe ich nicht. Du hast nur 2 cmds, und zwar hoch und runter.
Ich hatte die einzelnen Uhrzeiten als erste mit jeweils einem DOELSEIF getrennt. Und dann schaltet er zum Beispiel nachmittags nochmals obwohl die Jalousien morgens schon runtergefahren sind.
Ich habe es zur Zeit mit den Uhrzeit drin da unser Sohn mittags seinen Schlaf braucht und wenn die dann fahren wären doof.
Ah ok. Dann ja ist es besser mit "or" als als DOELSEIF Zweige