Prüft repeatcmd die Bedingung erneut? Oder: repeatcmd irgendwie erkennen?

Begonnen von FunkOdyssey, 20 Dezember 2019, 16:49:45

Vorheriges Thema - Nächstes Thema

FunkOdyssey

Ich nehme einmal ein Beispiel aus der CommandRef und erweitere es um einen Vergleich der Helligkeitswerte:

define di_presence_simulation DOIF
(
   [19:00-00:00] and
   [lichtsensor:wert] < [$SELF:P_helligkeit,200]
)
(
   set lamp on-for-timer {(int(rand(1800)+300))}
)
DOELSE
(
   set lamp off
)
attr di_presence_simulation repeatcmd rand(3600)+2200
attr di_presence_simulation do always



Ich muss hier ein "do always" nutzen, da ich dies eigentlich in weiteren DOELSEIF-Teilen benötige.

Frage:
Ich möchte nicht, dass das DOIF immer wieder in cmd_1 rennt, weil es durch den Lichtsensor getriggt werden.
Also füge ich in der Condition folgende hinzu:

... and [?$SELF:state] !~ /cmd_1/"

Aber funktioniert dann überhaupt noch das repeatcmd?
Wird wirklich nur einmal die Bedingung geprüft und wirklich nur das CMD von repeatcmd wiederholt?

Sorry für die Frage: Ich kann es leider nicht testen.

amenomade

Bei repeatcmd wird das Befehl Nr X so lange wiederholt, wie Bedingung X wahr bleibt. Die Bedingung wird jedes Mal geprüft, wenn es getriggert wird. Aber Bedingung beim Triggern prüfen, heisst nicht, dass der Zustand sich ändert.
Erfolgt eine Zustandsänderung, wird die Wiederholung unterbrochen, und ein anderer Befhel ausgeführt (passend zu der entspr. Bedingung)

Ohne dass Du zeigst, was Du genau machen würdest, kann man nicht viel mehr sagen
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

FunkOdyssey

Hallo, es hat ein wenig gedauert.

Ich habe das DOIF ein wenig für diesen Thread vereinfacht.
Eigentlich will ich nur ein schönes Zufallsprinzip herstellen, aber gleichzeitig möglichst viel zu einer Lampe in ein DOIF aufnehmen.

Die Lampe soll nur zufällig geschaltet werden, wenn bestimmte Bedingungen erfüllt sind.

Die Abfragen nach "cmd_1" und "cmd_2" habe ich nur aufnehmen müssen, weil ich "do always" nutze. Der Helligkeitssensor triggert zyklisch. Wenn ich nun so recht überlege und das (hier schlankere) Beispiel sehen, braucht ich eigentlich kein "do always".

Es scheint aber dennoch zu funktionieren. Es wird immer der Ausführungsteil von "cmd_1" wiederholt, da ich "repeatcmd" gesetzt habe. Der Vergleich in "cmd_1" wird nur ungültig, wenn die Helligkeit zu groß wird oder die Alarmanlage ausgeschaltet wird. Es scheint also zu klappen.

defmod di_repeatcmd_test DOIF ( \
[di_helligkeit:median] < [$SELF:P_helligkeit,180] and\
[?$SELF:state] !~ /cmd_1/ and\
[alarmanlage] eq "scharf" and\
[?([08:00]+int(rand(1800)))-([01:00]+int(rand(1800)))]\
)\
(\
set testlampe on-for-timer {(int(rand(1800)+300))}\
)\
\
DOELSEIF\
(\
[$SELF:cmd_nr,"2"] !~ /2/ and\
(\
[alarmanlage] ne "scharf" or\
[?di_helligkeit:median] > [$SELF:P_helligkeit,180]\
)\
)\
(\
set testlampe:FILTER=state!=off off\
)\

attr di_repeatcmd_test do always
attr di_repeatcmd_test event-on-change-reading .*
attr di_repeatcmd_test readingList P_random,P_helligkeit
attr di_repeatcmd_test repeatcmd rand(3600)+2200:0:0
attr di_repeatcmd_test setList P_helligkeit:slider,0,1,1000
attr di_repeatcmd_test timerWithWait 1
attr di_repeatcmd_test wait 0:10
attr di_repeatcmd_test webCmd P_helligkeit



Ich habe gerade erst ein Log zum DOIF angelegt und kann also erst bald sehen, wie sich das DOIF im Detail verhält. Laut Log der Testlampe wird aber immer wieder zufällig geschaltet.