Sunset + Zufall: Unterstützung bei Code

Begonnen von Mazz78, 10 August 2017, 07:39:39

Vorheriges Thema - Nächstes Thema

Mazz78

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

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
RaPi 4 / Buster / FHEM 6
CUL868 / JeeLink868
Banana M1 (Bananian) + ser2net + Stiebel Eltron LWZ403
FIRMATA -> Gartenbewässerung /-licht
ALEXA

rabehd

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?
Auch funktionierende Lösungen kann man hinterfragen.

herrmannj


Mazz78

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
RaPi 4 / Buster / FHEM 6
CUL868 / JeeLink868
Banana M1 (Bananian) + ser2net + Stiebel Eltron LWZ403
FIRMATA -> Gartenbewässerung /-licht
ALEXA

rabehd

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.
Auch funktionierende Lösungen kann man hinterfragen.

nicor2k

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') }");;\
}
FHEM auf Raspberry Pi 1 - 4 | Meine Browser-Plugins | Meine FHEM-Tipps

Frank_Huber

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.

amenomade

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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Mazz78

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.

RaPi 4 / Buster / FHEM 6
CUL868 / JeeLink868
Banana M1 (Bananian) + ser2net + Stiebel Eltron LWZ403
FIRMATA -> Gartenbewässerung /-licht
ALEXA