Hallo zusammen,
gestern bin ich auf einen Artikel gestoßen, bei dem die Anwesenheitssimulation mit Zufallszahlen "optimiert" wird.
Besonders den letzen Abschnitt in Zusammenhang mit Sunset find ich interessant und würde ich gerne nutzen.
https://www.computerhilfen.de/info/smart-home-programmieren-zufallszahlen-fhem.html (https://www.computerhilfen.de/info/smart-home-programmieren-zufallszahlen-fhem.html)
Allerdings werd ich aus dem dargestellten Code nicht schlau.
my $ZufallszahlMin = int(rand(15) +1 );;\
my $ZufallszahlMax = int(rand(15) +1 );;\
my $SunsetStart1 = int(rand(3) + 0 );;\
my $SunsetStart2 = int(rand(5) + 2 );;\
my $start = "17:".($ZufallszahlMin + 10);;\
my $ende = "21:".($ZufallszahlMax + 44);;\
fhem("define abends_Licht_an at *{sunset('HORIZON=".$SunsetStart1.".".$SunsetStart2."',0,'".$start."','".$ende."')} \
{ fhem('set LAMPE on-for-timer 3600') }");;\
Das ist doch nicht das vollständige define?! ???
Hab gestern schon bisschen gespielt und probiert, aber mit meinen praktisch nicht vorhandenen Programmierkenntnissen komm ich da nicht ohne Fehlermeldungen weiter.
Zusätzlich bräuchte ich noch folgendes mit rein:
(Value("jemand_anwesend") eq "absent")
Ich bin mal wieder auf eure Unterstützung angewiesen :-[
Grüße
ZitatHab gestern schon bisschen gespielt und probiert,
Dann erzähle mal.
ZitatDas ist doch nicht das vollständige define?!
Jnein. Wo würdest Du es denn eintippen?
warum kompliziert wenn es auch einfach geht ?
https://fhem.de/commandref.html#RandomTimer
und wenn wir einmal dabei sind
https://forum.fhem.de/index.php?topic=38660.0
Hi,
@rabehd
ZitatDann erzähle mal.
Also ich hab mal so angefangen, allerdings hab ich keine Ahnung wie das "at" aussehen soll.
Da der Code mit "\" ist, müsste ich ihn ja in die cfg kopieren ?!
define R_Schlafen_sunset_absent at *{sunset(0,"17:00","22:00")} {\
my $ZufallszahlMin = int(rand(10) +1 );;\
my $ZufallszahlMax = int(rand(8) +1 );;\
my $SunsetStart1 = int(rand(3) + 0 );;\
my $SunsetStart2 = int(rand(5) + 2 );;\
my $start = "17:".($ZufallszahlMin + 8);;\
my $ende = "21:".($ZufallszahlMax + 42);;\
fhem("define R_Schlafen_abends at *{sunset('HORIZON=".$SunsetStart1.".".$SunsetStart2."',0,'".$start."','".$ende."') && (Value("jemand_anwesend") eq "absent")} { \
fhem('set R_Schlafen 0') }");;\
}
@herrmannj
Zitat
warum kompliziert wenn es auch einfach geht ?
https://fhem.de/commandref.html#RandomTimer
Kenn ich. Aber in Zusammenhang mit dem RandomTimer von "einfach" zu sprechen...naja. ???
Zitat
und wenn wir einmal dabei sind
https://forum.fhem.de/index.php?topic=38660.0
Es war bestimmt gut gemeint, aber mit meinem aktuellen (Programmier-)Wissenstand, ist mir das keine Hilfe. Sorry.
Grüße
Zitatmüsste ich ihn ja in die cfg kopieren ?!
Keine gute Idee. Das ist für einige außerdem sowas wie Teufelsanbetung in einer Kirche.
Hast Du den Code mal versucht zu verstehen? Mir scheint er wenig sinnvoll.
Da wird ein at definiert, welches jeden Tag bei Sonnenuntergang zwischen 17 und 22 gestartet wird. Dieses at definiert ein weiteres at, welches
jeden Tag ....
Spätestens beim 2. Lauf gibt es eine Fehlermeldung weil "R_Schlafen_abends" schon da ist.
Wie gibt man sowas ein?
Ich würde das At erstmal blanko definieren.
Zitatdefine R_Schlafen_sunset_absent at *{sunset(0,"17:00","22:00")} {Platzhalter}
Dann kann man das DEF des at editieren (ohne \).
Es könnte auch sinnvoll sein, den Plathalter als Funktion zu betrachten und den Code so auszulagern.
Hallo Sven,
was für Fehlermeldungen bekommst du denn?
Ich habe den DEFINE mal etwas angepasst, jetzt wird er jeden Tag um 16:00 Uhr gestartet und definiert dann zufällig einen zweiten DEFINE, der dann das Licht steuert. Es wäre hier natürlich sauberer, vorher zu prüfen, ob dieser schon definiert ist und ihn dann mit delete erst zu löschen, da hat rabehd Recht :)
Und wenn du die fhem.cfg nicht direkt bearbeiten willst (wofür viel spricht, da es auch ein großes Risiko ist!) entferne einfach den Backslash "\" am Zeilenende und nehme nur einfache Semikolons, dann kannst du es so eingeben, wie rabehd mit dem Platzhalter vorgeschlagen hat.
Hier der Code:
define abends_Licht_an at *16:00:00 {\
my $ZufallszahlMin = int(rand(15) +1 );;\
my $ZufallszahlMax = int(rand(15) +1 );;\
my $SunsetStart1 = int(rand(3) + 0 );;\
my $SunsetStart2 = int(rand(5) + 2 );;\
my $start = "17:".($ZufallszahlMin + 10);;\
my $ende = "21:".($ZufallszahlMax + 44);;\
fhem("define abends_Licht_an2 at *{sunset('HORIZON=".$SunsetStart1.".".$SunsetStart2."',0,'".$start."','".$ende."')} { fhem('set LAMPE on-for-timer 3600') }");;\
}
Zitat von: nicor2k am 10 August 2017, 15:59:46
Es wäre hier natürlich sauberer, vorher zu prüfen, ob dieser schon definiert ist und ihn dann mit delete erst zu löschen
Oder einfach mit "defmod" arbeiten. damit umgehst das Problem.
Zitat
@herrmannj
Zitat
warum kompliziert wenn es auch einfach geht ?
https://fhem.de/commandref.html#RandomTimer
Kenn ich. Aber in Zusammenhang mit dem RandomTimer von "einfach" zu sprechen...naja. ???
define abends_Licht_zufall RandomTimer *{sunset_abs()} LAMPE 23:00:00 300
attr abends_Licht_zufall disableCond (Value("jemand_anwesend"") ne "absent")
attr abends_Licht_zufall switchmode 600/200
versucht, wenn "absent", zwischen sunset und 23:00, alle 300 Sekunden, die Lampe LAMPE mit einer Erfolgsrate von 60% anzuschalten wenn die aus ist, und eine Erfolgsrate von 20% auszuschalten wenn die an ist.
Findest Du dein Codestück mit mehrere at simpler??? ich nicht.
oder einfach hier nachschauen: https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung
Erst mal danke an alle für die Unterstützung.
Mittlerweile hab ich mir auch den RandomTimer nochmal genauer angeschaut .
Da ich mehrere Verwendungen für diesen Code habe, hab ich jetzt mal beide Varianten verwendet.
Muss jetzt mal die Langzeiterfahrungen abwarten.