FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Terabyte am 27 April 2013, 18:10:45

Titel: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 27 April 2013, 18:10:45
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
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: UliM am 27 April 2013, 18:50:05
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
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 27 April 2013, 19:01:27
Hallo

Bei der Version mit dem Dummy bekomme ich leider folgende Fehlermeldung

Unknown command $state, try help Unknown command fhem("set, try help
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: UliM am 27 April 2013, 19:15:12
Hi,
Hmm - Versuch mal nen anderen Variablennamen, zB $daheim :)
$state ist mglw ne Standardvariable in fhem...
Gruß Uli
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 27 April 2013, 19:34:15
Leider selbe Fehlermedung

Unknown command $daheim, try help Unknown command fhem("set, try help
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Zrrronggg! am 27 April 2013, 19:53:27
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)
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 27 April 2013, 20:15:19
Hallo

Würde das nicht bedeuten, dass erst um 00:03Uhr der Status überprüft wird?
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Zrrronggg! am 27 April 2013, 20:22:14
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")}}
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 27 April 2013, 20:56:56
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
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Zrrronggg! am 27 April 2013, 21:40:34
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.


Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 27 April 2013, 21:54:05
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
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 27 April 2013, 22:12:26
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
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Zrrronggg! am 27 April 2013, 22:31:44
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)
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 27 April 2013, 22:40:53
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")}}
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Zrrronggg! am 27 April 2013, 22:52:10
Ich glaube das hätte man auch mit Klammern lösen können, Aber so geht's vermutlich auch.
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 27 April 2013, 22:59:46
Ich werde das morgen mal testen mit den Klammern.

Danke vorerst für deine Hilfe :)

War aber bestimmt nicht meine letzte Frage
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 28 April 2013, 12:48:48
Das mit der Klammer bekomm ich nicht hin.

Daher lasse ich es erstmal mit der Zeit bei beiden
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Zrrronggg! am 28 April 2013, 13:25:58
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.
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 28 April 2013, 13:51:35
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"
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Puschel74 am 28 April 2013, 14:24:52
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.
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 28 April 2013, 14:39:46
Hallo

Was bedeutet das off-for-timer?
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Puschel74 am 28 April 2013, 14:44:07
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
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: fritz am 28 April 2013, 14:44:58
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>

Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 28 April 2013, 15:14:31
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 :)
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Zrrronggg! am 28 April 2013, 18:44:37
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.
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Puschel74 am 28 April 2013, 18:49:42
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
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Zrrronggg! am 28 April 2013, 18:55:45
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.
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Puschel74 am 28 April 2013, 18:59:32
OT
War kurz davor deswegen auf -1 zu drücken ;-)
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: fritz am 28 April 2013, 19:00:49
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>
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Puschel74 am 28 April 2013, 19:02:00
Hallo,

Stimmt auch wieder.

Grüße
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 28 April 2013, 19:13:32
Danke erstmal.

Soweit scheint zumindest das nun zu funktionieren. Wie gut... das wird sich noch zeigen :)
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Zrrronggg! am 28 April 2013, 19:22:07
ZitatWar kurz davor deswegen auf -1 zu drücken

Und das ZU RECHT mein Lieber. Solche Nachlässigkeiten müssten unnachgibigst  geahndet werden.

Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Puschel74 am 28 April 2013, 19:30:26
Deswegen hab ich auch auf +1 geklickt ^^
Du näherst dich ja unaufhaltsam der 100-Punkte Marke ;-)
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Zrrronggg! am 28 April 2013, 19:39:54
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
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Puschel74 am 28 April 2013, 19:41:58
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
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 29 April 2013, 18:08:37
Hallo

Kann es sein, dass die Presence und/oder at Funktion, eine höhere CPU Last der Fritzbox zu Folge haben?
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 01 Mai 2013, 08:10:06
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?
Titel: Aw: "Und" Verknüpfung bei Befehlen
Beitrag von: Terabyte am 01 Mai 2013, 15:08:46
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 :)