Hallo
Ich möchte gerne, wenn 2 Handys das WLAN verlassen, dass eine bestimmte Aktion durchgeführt wird.
Also erst wenn Handy 1 UND 2 sich abgemeldet haben soll zum Beispiel Steckdose 1 sich abschalten.
Wie das ganze mit 1 Handy funktioniert weiß ich bereits. Leider habe ich noch nicht herausgefunden wie man das 2. in den Befehl hinzufügen kann.
Dies ist der Code den ich für 1 Handy benutze:
define Watchdog_Abwesenheit watchdog Handy_1:absent 00:00:05 Handy_1:present {\
{fhem("set Schalter off")}\
{fhem("setstate Watchdog_Abwesenheit defined")}\
}
Wie kann ich nun den Code so umwandeln das die Bedingung mit dem 2. Handy erfüllt wird?
Danke schonmal
Versuch mal
define Watchdog_Abwesenheit watchdog (Handy_1:absent|Handy_2:absent) 00:00:05 (Handy_1:present|Handy_2:present) {\
{fhem("set Schalter off")}\
{fhem("setstate Watchdog_Abwesenheit defined")}\
}
Ich fürchte aber der zieht auch, wenn Handy1 present und Handy2 absent ist.
also via dummy?
define handypresence dummy
define presencepruefen at +*00:01 {my $state = (Value("Handy1") eq "present");$state = $state && (Value("Handy2") eq "present"); fhem("set handypresence $state")}
Damit führt handypresence die Info, ob beide Handys anwesend sind - ist eines abwesend, wird handypresence 0.
Und dann
define Watchdog_Abwesenheit watchdog handypresence:1 00:00:05 handypresence:0 {\
{fhem("set Schalter off")}\
{fhem("setstate Watchdog_Abwesenheit defined")}\
}
Weder bin ich sicher, ob's macht was Du willst, noch ob der watchdog so tut.
Eher mal als Denkanstoss...
LG, Uli
Hallo
Bei der Version mit dem Dummy bekomme ich leider folgende Fehlermeldung
Unknown command $state, try help Unknown command fhem("set, try help
Hi,
Hmm - Versuch mal nen anderen Variablennamen, zB $daheim :)
$state ist mglw ne Standardvariable in fhem...
Gruß Uli
Leider selbe Fehlermedung
Unknown command $daheim, try help Unknown command fhem("set, try help
ich durchdringe:
define presencepruefen at +*00:01 {my $state = (Value("Handy1") eq "present");$state = $state && (Value("Handy2") eq "present"); fhem("set handypresence $state")}
noch nicht ganz, aber ich halte es für denkbar, dass da Klammer und fehlende ";" escapes drin sein könnten. Leider kann ich als Watchdog-Looser in der Sache selbst nicht helfen.
Ich würde das ohne Watchdog einfach per "at *00:03:00" prüfen:
define Handy_abwesenheit at *00:03:00 {if (Value("Handy_1") eq "absent" && Value("Handy_2") eq "absent") {fhem("set Schalter off")}}
(Aus dem Kopf, ungetestet)
Hallo
Würde das nicht bedeuten, dass erst um 00:03Uhr der Status überprüft wird?
ZitatWürde das nicht bedeuten, dass erst um 00:03Uhr der Status überprüft wird?
Stimmt, "+" vergessen.
define Handy_abwesenheit at +*00:03:00 {if (Value("Handy_1") eq "absent" && Value("Handy_2") eq "absent") {fhem("set Schalter off")}}
Danke.
Das scheint zu funktionieren :)
Welchen Vor bzw. Nachteil hat es denn wenn man das mit "at" macht und nicht mit watchdog?
Kann man zu diesem Code auch noch eine zeitliche Bedingung hinzufügen?
Also, dass von 22:00 - 06:00Uhr der Schalter auf Off bleibt unabhängig von den Handys
ZitatWelchen Vor bzw. Nachteil hat es denn wenn man das mit "at" macht und nicht mit watchdog?
Es hat den Vorteil, dass ich weiss wie es geht und dir daher eine Lösung anbieten kann. Ansonsten ist es einfach nur ein anderer Weg zum Ziel.
ZitatKann man zu diesem Code auch noch eine zeitliche Bedingung hinzufügen?
Also, dass von 22:00 - 06:00Uhr der Schalter auf Off bleibt unabhängig von den Handys
Hm. Das ist bei deinem Code schon gegeben.
Ich meine: Dein Code schaltet unter bestimmten Bediungungen den Schalter OFF, aber NIEMALS on. Er schaltet auch zwischen 22:00 - 06:00Uhr den Schalter OFF oder nicht... aber dann ist er ja auch off.
Oder meinst du: define Handy_abwesenheit at +*00:03:00 soll in der Zeit nichts machen?
Das geht, ich bin mir aber gerade etwas über die Klammerung unsicher. Versuch mal bitte:
define Handy_abwesenheit at +*00:03:00 {if ( ($hour < 21 && $hour > 7) && Value("Handy_1") eq "absent" && Value("Handy_2") eq "absent") {fhem("set Schalter off")}}
Aus dem Kopf und Ungetestet und ich bin nicht 100% sicher, dass es so richtig ist. Beim Rumspielen mit Stundenbedingungen schiesst man sich gerne ein Loch ins Knie, indem man Bedingen wählt die immer oder nie zutreffen.
Im Prinzip möchte ich diesen Code zu einer bestimmten Zeit deaktivieren, welcher den Schalter auf ON stellt. Auf OFF stellen zu einer bestimmten Zeit ist wahrscheinlich rinfacher
define Watchdog_Anwesenheit watchdog (Handy_1:present|Handy_2:present) 00:00:05 (Handy_1:absent|Handy_2:absent) {\
fhem("set Schalter on");;\
fhem ("setstate Watchdog_Anwesenheit defined");;\
}
Edit: Ich werde mal versuchen den Befehlt auf "at" umzuschreiben
Danke. Hab mal den Code etwas umgebastelt
Mit diesem Code lässt sich die Aktivierung des Schalters ab einer bestimmten Zeit zu verhindern
define Handy_anwesenheit at +*00:00:03 {if ( ($hour < 22 && $hour > 7) && Value("Handy_1") eq "present"|Value("Handy_2") eq "present") {fhem("set Schalter on")}}
Jetzt brauch ich nur noch einen Code der mir den Schalter um 22:01 auf "off" stellt. Dann müsste es im Prinzip so funktionieren wie ich mir das vorstelle.
Edit: Ok den hab ich nun auch :)
define Schalter_AUS at *22:01:00 set Schalter off
define Handy_anwesenheit at +*00:00:03 {if ( ($hour < 22 && $hour > 7) && Value("Handy_1") eq "present"|Value("Handy_2") eq "present") {fhem("set Schalter on")}}
Wenn du Value("Handy_1") eq "present" ODER Value("Handy_2") eq "present" meinst müssen das 2x | sein:
define Handy_anwesenheit at +*00:00:03 {if ( ($hour < 22 && $hour > 7) && Value("Handy_1") eq "present" || Value("Handy_2") eq "present") {fhem("set Schalter on")}}
Ausserdem: Die ungeklammerte Mischung aus && und || führt nicht immer zum gewünschten Ergebnis. && bindet stärker als ||.
Der Code oben wird daher z.b. auch auslösen, wenn NUR Value("Handy_2") eq "present" true ist!
Genau genommen sagst du jetzt nämlich:
Löse aus wenn( Stunde kleiner 22 und Stunde grösser 7 und Handy1 = present) *ODER* Handy2 = present (!)
Vergleich mal diese Diskussion:
http://forum.fhem.de/index.php?t=msg&goto=71457&rid=33#msg_71457 (//forum.fhem.de/index.php?t=msg&goto=71457&rid=33#msg_71457)
Ja danke.
Hab jetzt beim 2. auch noch eine Zeit hinzugefügt
define Anwesenheit at +*00:00:05 {if ( ($hour < 22 && $hour > 7) && Value("Handy_1") eq "present" || ($hour < 22 && $hour > 7) && Value("Handy_2") eq "present") {fhem("set Schalter on")}}
Ich glaube das hätte man auch mit Klammern lösen können, Aber so geht's vermutlich auch.
Ich werde das morgen mal testen mit den Klammern.
Danke vorerst für deine Hilfe :)
War aber bestimmt nicht meine letzte Frage
Das mit der Klammer bekomm ich nicht hin.
Daher lasse ich es erstmal mit der Zeit bei beiden
ich würde auf
define Handy_anwesenheit at +*00:00:03 {if ( ($hour < 22 && $hour > 7) && (Value("Handy_1") eq "present" || Value("Handy_2") eq "present")) {fhem("set Schalter on")}}
tippen, sicher bin ich mir aber nicht.
Aber wenn das geht was du da hast, dann benutz es ruhig.
Jetzt hab ich aber ein weiteres Problem.
Es wird nun alle paar Sekunden überprüft ob jemand anwesend ist und auch wenn der Schalter schon auf ON ist wieder ein Befehl gesendet dieses einzuschalten.
Im Log sieht das so aus:
2013.04.28 13:47:53 2: IT set Schalter on
2013.04.28 13:47:55 2: IT set Schalter on
2013.04.28 13:48:00 2: IT set Schalter on
2013.04.28 13:48:05 2: IT set Schalter on
2013.04.28 13:48:10 2: IT set Schalter on
2013.04.28 13:48:15 2: IT set Schalter on
2013.04.28 13:48:20 2: IT set Schalter on
Wie kann verhindern dass jedes Fall der auf on gesetzt wird? Bzw. im umgekehrten Fall auf off.
Kann man noch einen Befehl einfügen der prüft ob das Ding schon auf ON bzw. OFF steht?
Edit: Geht wohl indem man folgendes noch hinzufügt:
&& Value("Schalter") eq "off"
Hallo,
ich habs leider nicht so mit Einzeiler aber ich versuchs mal:
define Handy_anwesenheit at +*00:00:03 {if ( ($hour < 22 && $hour > 7) && (Value("Handy_1") eq "present" || Value("Handy_2") eq "present")) {fhem("set Schalter on") if (Value("Schalter") eq "off")}}
Nun sollte beim Einschalten geprüft werden ob der Schalter auf off steht.
Wenn ja wird on gesendet, wenn bereits on wird nichts gemacht - hoffe ich.
Grüße
Edith: Was aber bedeutet das der Schalter niemals off-for-timer oder ähnliches als Status bekommen darf da das ja nicht eq off ist.
Hallo
Was bedeutet das off-for-timer?
Hallo,
naja das das Gerät einschaltet wenn die Zeit rum ist.
on-for-timer 20 = Gerät ist 20 Sekunden an
off-for-timer 20 = Gerät schaltet in 20 Sekunden ein oder anders gesagt Gerät ist für 20 Sekunden aus.
Evtl. war das ja jetzt ein blödes Beispiel und den off-for-timer gibt es garnicht (das hab ich jetzt nicht kontrolliert).
Mir hat aber on und on-for-timer schonmal das Schnippchen geschlagen und ich hab mich gewundert warum das Gerät nicht ausschaltet.
Klar - stand ja auf on-for-timer und nicht auf on.
Blöd gelaufen wenn vor Ablauf der Zeit ausgeschaltet werden soll und geprüft wird ob das Gerät on ist ^^
Grüße
Meine ersten "best practises" Tips:
a) Teste einfach:
fhem("set Schalter on") if (Value("Schalter") ne "on")
wenn Du den Schalter auf jeden Fall on setzen möchtest; ansonsten musst Du noch mehr testen, deshalb der folgende Tip:
b) Ich hatte bei meinen ersten Versuchen schon die Schn... voll von diesen langen OneLinern, in denen dann auch noch bestimmte Zeichen maskiert werden müssen. Daher bin ich ziemlich schnell dazu übergegangen,
define Handy_anwesenheit at +*00:00:03 {HandyAnwesenheit(...)}
zu schreiben und den eigentlichen PerlCode in 99_myUtils.pm unter
sub HandyAnwesenheit (??) # oder wieviele Parameter du auch immer brauchst
{...}
zu implementieren. Hat auch den Vorteil, dass du dir beliebige Hilfsroutinen schreiben und die in den unterschiedlichsten Funktionen benutzen kannst.
<F>
Hallo
Danke für die Antworten.
Das mit den 99_myUtils.pm muss ich mir mal ansehen.
Kenn mich ja leider noch nicht so gut aus mit dem ganzen Zeug hier :)
Zitatden off-for-timer gibt es garnicht
FS20 kann off-for-timer, HM nicht.
Speziell bei FS20 kann man mit off-for-timer durchaus Probleme lösen. Ich schalte damit z.b. meinen Brenner aus. Vorteil: Wenn der Befehl NICHT ankommt, bleibt die Heizung an. Das ist besser als wenn die Heizung ausgeht, aber morgens nicht wieder an... Super Mieser WAF! Und die Heizung ist im Keller und daher am Rand des Funkbereichs. Da off-for-timer i Aktor selber geschaltet wird heisst das: Wenn der Befehl zum abschalten ankommt, geht die Heizung auch wieder an, egal, ob danach die brutalste Funkstörung seit Menschengedenken losgeht. Wenn der Befehl nicht ankommt, geht die Heizung gar nicht erst aus.
define Handy_anwesenheit at +*00:00:03 {if ( ($hour < 22 && $hour > 7) && (Value("Handy_1") eq "present" || Value("Handy_2") eq "present")) {fhem("set Schalter on") if (Value("Schalter") eq "off")}}
Würde ich ja lieber so machen:
define Handy_anwesenheit at +*00:00:03 {if ( ($hour < 22 && $hour > 7) && (Value("Handy_1") eq "present" || Value("Handy_2") eq "present") && Value("Schalter") eq "off") {fhem("set Schalter on") if (Value("Schalter") eq "off")}}
Speziell mit && kann man ja locker beliebig viele Bedingungen verknüpfen. Um klammern muss man sich ja erst bei gleichzeitiger Verwendung von || Gedanken machen.
Zitat99_myUtils.pm
Ich hielt das auch für ne gute Idee, fand dann aber in der Praxis Debuggin in 2 Dateien und mehreren Stellen, die voneinander abhängen ziemlich unpraktisch. Das richtige Escapen viel mir leichter. Meistens... :-D
Ist sicher ne Geschmacksfrage.
Hallo,
hier
define Handy_anwesenheit at +*00:00:03 {if ( ($hour < 22 && $hour > 7) && (Value("Handy_1") eq "present" || Value("Handy_2") eq "present") && Value("Schalter") eq "off") {fhem("set Schalter on") if (Value("Schalter") eq "off")}}
solltest du dir eigentlich diesen Teil
if (Value("Schalter") eq "off")
sparen können da du ja vorher schon auf
&& Value("Schalter") eq "off")
prüfst.
Aber doppelt gemoppelt hält auch besser ;-)
Ist aber auch nur ne Vermutung von mir.
Grüße
Völlig korrekt.
Ich meint latürnich
define Handy_anwesenheit at +*00:00:03 {if ( ($hour < 22 && $hour > 7) && (Value("Handy_1") eq "present" || Value("Handy_2") eq "present") && Value("Schalter") eq "off") {fhem("set Schalter on")}}
Sehr nachlässig von mir.
OT
War kurz davor deswegen auf -1 zu drücken ;-)
Zitat von: Puschel74 schrieb am So, 28 April 2013 18:49Aber doppelt gemoppelt hält auch besser ;-)
Nicht wirklich: zweimal ist der Test falsch für den Fall, dass die Variable noch andere Werte als "on" und "off" annehmen kann und unbedingt auf "on" gesetzt werden soll. (Aber ich kenne den genauen Background nicht....) Und nur einen falschen Test berichtigen, würde nicht zum Erfolg führen.
<F>
Hallo,
Stimmt auch wieder.
Grüße
Danke erstmal.
Soweit scheint zumindest das nun zu funktionieren. Wie gut... das wird sich noch zeigen :)
ZitatWar kurz davor deswegen auf -1 zu drücken
Und das ZU RECHT mein Lieber. Solche Nachlässigkeiten müssten unnachgibigst geahndet werden.
Deswegen hab ich auch auf +1 geklickt ^^
Du näherst dich ja unaufhaltsam der 100-Punkte Marke ;-)
Ja, ich schrieb eben schon im Reputationsthread: Wenn das so weitergeht habe ich morgen 3-Stellig.
DANN ist aber final klar, das mit dem Reputationsystem was faul ist.
Aber ich schwöre, dich reisse ich mit in den Tod!(aka 3-stelligen Reputationsbereich) :-D
Hab dir dort schon geantwortet - du hast aber schon 100 Punkte
ZitatAber ich schwöre, dich reisse ich mit in den Tod!(aka 3-stelligen Reputationsbereich) :-D
da musste ich nun aber mal lachen - dafür gibt es noch einen Punkt ^^
Und nun hier aber wieder BTT
Den Rest gibts im Rep.Thread
Hallo
Kann es sein, dass die Presence und/oder at Funktion, eine höhere CPU Last der Fritzbox zu Folge haben?
Hallo
Ich hab jetzt noch 2 Fragen.
Kann man die PRESENCE abfrage irgendwie zu einer bestimmten Uhrzeit deaktivieren?
UND
Kann man irgendwie hinzufügen, dass wenn der Schalter manuell auf "OFF" gestellt wurde, dieser erst wieder automatisch auf ON schaltet wenn die beiden Handy's zuvor absent waren?
Hallo
Hab meinen letzten Punkt selber gelöst glaube ich :)
Und zwar folgendermaßen
define Boiler dummy
attr Boiler setList warm kalt
define Abwesenheit at +*00:05:00 {if (Value("Handy_1") eq "absent" && Value("Handy_2") eq "absent" && Value("Warmwasser") eq "on" && Value("Boiler") ne "kalt") { fhem("set Warmwasser off ;; set Boiler kalt")}}
define Anwesenheit at +*00:00:10 {if ( ($hour < 22 && $hour > 7) && Value("Warmwasser") eq "off" && Value("Boiler") ne "warm" && Value("Handy_1") eq "present" || ($hour < 22 && $hour > 7) && Value("Warmwasser") eq "off" && Value("Handy_2") eq "present") { fhem("set Warmwasser on ;; set Boiler warm")}}
define Warmwasser_AUS at *22:01:00 set Warmwasser off ;; set Boiler kalt
Damit scheint nun alles Automatisch zu funktionieren und man kann immer noch eingreifen oder, dass automatisch wieder etwas verändert wird.
Was ich aber noch nicht herausbekommen habe, wie man das PRESENCE für einen bestimmten Zeitraum deaktivieren kann :)