RandomTimer nachbauen: Berechnung im Condition-Teil als Reading speichern?

Begonnen von FunkOdyssey, 13 Januar 2017, 15:56:53

Vorheriges Thema - Nächstes Thema

FunkOdyssey

Kurz ne dumme Frage:

Ich versuche gerade meine RandomTimer-Geräte in einem DOIF abzubilden. Nur würde ich gerne den Zufallswert aus dem Vergleichsteil zum Debuggen irgendwie sichern? Entweder im Log oder als Reading. Wahrscheinlich muss ich auch mehrere DOIFELSE ergänzen und mich dann auf den gleichen Zufallswert beziehen. Kann man das auch irgendwie alles in einem DOIF machen? Oder muss ich den Zufallswert in nem Dummy speichern und mich halt darauf beziehen?


(
[+00:30:00] and
int(rand(1000)) < 500
)
(
set testlampe on
)
DOELSE
(
set testlampe off
)


Danke.

Ellert

Du könntest den Zufallswert in einem userReading bei Timer-Update erzeugen und dann in der Bedingung nicht triggernd verwenden.

FunkOdyssey

#2
Hmm, die Idee mit userreadings hatte ich auch. Nur kam ich nicht darauf, wie ich die Triggern soll. Aber das sollte doch möglich sein. Ich suche mir einfach "cmd" als Trigger aus. Muss ich mal ausprobieren.

Aktuell habe ich folgendes ausprobiert. Das gefällt mir vom Style aber absolut nicht. Und ich habe irgendeine Wait-Schleife drinne.


defmod di_zufallszahl DOIF (\
[+00:00:30]\
)\
(\
setreading di_zufallszahl P_random {(int(rand(1000)))}\
)\
DOELSEIF \
(\
[$SELF:P_random,500] < [$SELF:P_switchon,800]\
)\
(\
{Log 1, "Treffer: Die Zufallszahl lautet [di_zufallszahl:P_random]"}\
)
attr di_zufallszahl alias Zufallszahl
attr di_zufallszahl do always
attr di_zufallszahl readingList P_switchon,P_switchoff
attr di_zufallszahl room Entwicklung
attr di_zufallszahl selftrigger all
attr di_zufallszahl setList P_switchon:0,100,200,300,400,500,600,700,800,900\
P_switchoff:0,100,200,300,400,500,600,700,800,900
attr di_zufallszahl stateFormat P_random
attr di_zufallszahl wait 0:5
attr di_zufallszahl webCmd P_switchon:P_switchoff







Oh, das ist ja ganz einfach. Juchu.


defmod di_zufallszahl2 DOIF (\
[+00:00:15]\
)\
(\
\
)\

attr di_zufallszahl2 alias Zufallszahl2
attr di_zufallszahl2 do always
attr di_zufallszahl2 readingList P_switchon,P_switchoff
attr di_zufallszahl2 room Entwicklung
attr di_zufallszahl2 setList P_switchon:0,100,200,300,400,500,600,700,800,900\
P_switchoff:0,100,200,300,400,500,600,700,800,900
attr di_zufallszahl2 stateFormat P_random
attr di_zufallszahl2 userReadings P_Random:cmd.* {return int(rand(1000));;}
attr di_zufallszahl2 webCmd P_switchon:P_switchoff


Vielen Dank für den Hinweis.

FunkOdyssey

Ein wenig kniffelig war es dann doch noch.
Wenn man den RandomTimer wirklich vollständig abbilden will, dann muss man auch den Zufallswert mit einem Schwellwert beim Ausschalten prüfen wie auch den Zustand der Lampe mit einbeziehen. Somit kann die Ein- und Ausschaltwahrscheinlichkeit unterschiedlich gesteuert werden.

So sieht das nun aus:

defmod di_zufallszahl2 DOIF (\
[+00:30:00] and\
[?$SELF:P_random,500] < [?$SELF:P_switchon,800] and\
[?testlampe:state] eq "off"\
)\
(\
set testlampe on\
)\
DOELSEIF\
(\
[+00:30:00] and\
[?$SELF:P_random,500] < [?$SELF:P_switchoff,200] and\
[?testlampe:state] eq "on"\
)\
(\
set testlampe off\
)\
DOELSE\
(\
## notwendig, um per cmd-Änderung das userreading zu triggern\
)
attr di_zufallszahl2 alias Zufallszahl2
attr di_zufallszahl2 do always
attr di_zufallszahl2 readingList P_switchon,P_switchoff,P_random
attr di_zufallszahl2 room Entwicklung
attr di_zufallszahl2 setList P_switchon:0,100,200,300,400,500,600,700,800,900\
P_switchoff:0,100,200,300,400,500,600,700,800,900
attr di_zufallszahl2 stateFormat P_random
attr di_zufallszahl2 userReadings P_random:cmd.* {return int(rand(1000));;}
attr di_zufallszahl2 webCmd P_switchon:P_switchoff



So ganz glücklich bin ich noch nicht mit dem DOELSE (cmd3)-Teil wie auch mit den beiden Zeitintervallen.
Außerdem reagiert das DOIF ja erst bei der nächsten Aktivierung auf den vorherigen Zufallswert.
Aber damit kann ich leben. Ist nur schwieriger zu debuggen.

Ellert

Statt DOELSE könntest Du auf die Timer-Aktualisierung triggern (timer_01_c01.*)

FunkOdyssey

Das war der ursprüngliche Plan. Aber dann wurden die Zufallswerte nicht mehr im Log gespeichert.

Und leider habe ich nichts anderes zum Triggern. Ich würde es gerne eleganter lösen.

Ellert

Wenn Du den Zufallswert loggen willst, kannst Du es im userReading mit mit dem Perl-Befehl Log machen, der schreibt ins Haupt-Logfile.

Wenn Du ein extra Logfile fürs DOIF hast, musst Du in dessen Regex den Logfilenamen erwähnen.

Dann kannst Du mit fhem "trigger <logfilename> $name ".ReadingsVal($name,"P_random","1001"),1 ins Logfile schreiben.