FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Jogi am 17 Februar 2017, 12:17:10

Titel: Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: Jogi am 17 Februar 2017, 12:17:10
Hallo,
das ist vielleicht eine Frage, bei der manch einer schmunzelt, ich weiß aber nicht wie es geht.

FHEM hat ja sehr viele Funktionen und Zusatzmodule. Bei manchem habe ich das Gefühl, dass es für eine Aufgabe gleich mehrere Möglichkeiten zur Realisierung gibt. Manche sind kompliziert, andere einfacher. Ich mag es gerne einfach.
Daher meine Frage:
Wie kann ich eine Und-Verknüpfung am einfachsten (!) realisieren?
Beispiel:
Lampe1 soll nur einschalten, wenn Schalter1 und Schalter2 eingeschaltet sind.
Wenn einer der beiden Schalter aus ist, soll die Lampe wieder ausschalten.

Vielen Dank für Tipps.

Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: franky08 am 17 Februar 2017, 12:33:34
So auf die Schnelle:
{if ((Value("Schalter1" eq "on")) && (Value("Schalter2") eq "on")) {
fhem "set Lampe on";
} else {
fhem "set Lampe off";
}
}
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: Otto123 am 17 Februar 2017, 12:35:20
Hi,

Für die Raw Def als komplettes Testscenario:
define T_Aktor1 dummy
define T_Aktor2 dummy
attr T_Aktor[1-2] webCmd on:off
define T_Lampe1 dummy
defmod T_di_Aktor DOIF ([T_Aktor1] eq "on" and [T_Aktor2] eq "on" )(set T_Lampe1 on) DOELSE (set T_Lampe1 off)
attr T_.* room Test


Dazu noch Franky's korrigierte :) notify Variante:
defmod T_nty_Aktor notify T_Aktor[1,2]:(on|off) {if ((Value("T_Aktor1") eq "on") && (Value("T_Aktor2") eq "on")) {fhem "set T_Lampe1 on"} else {fhem "set T_Lampe1 off"}}
attr T_nty_Aktor room Test


Gruß Otto
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: franky08 am 17 Februar 2017, 12:37:05
Und wieder ein DOIF Jünger...  ;)

VG
Frank
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: Beta-User am 17 Februar 2017, 12:44:08
@Frank: Du hättest ihm auch wirklich einen copy-paste-code für ein notify mit alternativen Eingangsbedingungen liefern sollen  ;).

Wollte noch structure in den Raum werfen, macht aber m.E. erst richtig Sinn, wenn es ein paar mehr Schalter sind, auf deren Zustand reagiert werden soll...

Gruß, Beta-User
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: Otto123 am 17 Februar 2017, 12:55:36
Hab meinen Post oben noch erweitert ums notify :)

Und hier noch mit IFdefmod T_nty_AktorIF notify T_Aktor[1,2]:(on|off) IF ((Value("T_Aktor1") eq "on") && (Value("T_Aktor2") eq "on")) (set T_Lampe1 on) ELSE (set T_Lampe1 off)
attr T_nty_AktorIF room Test


Die Frage ist jetzt, was ist einfacher  ;D ;D ;D

Gruß Otto
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: betateilchen am 17 Februar 2017, 13:03:13
wo sind die Taliban, wenn man sie mal braucht...
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: Otto123 am 17 Februar 2017, 13:07:01
Zitat von: betateilchen am 17 Februar 2017, 13:03:13
wo sind die Taliban, wenn man sie mal braucht...
Was hab ich falsch gemacht?  ::)
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: Beta-User am 17 Februar 2017, 13:13:59
Zitat von: Otto123 am 17 Februar 2017, 13:07:01
Was hab ich falsch gemacht?  ::)
Der Religionsbezug kam von woanders her ;).

Aber ausgepeitscht oder schlimmeres wird hier niemand, von daher war die Reaktion mit der anderen Backe schon ok ;D ;D ;D ;D.

Aber mal abgesehen von den nicht zur Sache gehörenden Kommentaren könnte man den Post m.E. gut als "Entscheide-Selbst"-Post für den Sticky-Anfängerbereich nehmen; es fehlt nur die ausformulierte structure-Variante, oder fällt sonst noch jemand was ein ;)? Wobei structure eher dann Vorteile bringt, wenn man sie auch schalten will und nicht nur einen Zustand von meheren Geräten zusammenfassen.
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: betateilchen am 17 Februar 2017, 14:12:10
Für die eingangs gestellte Anforderung ist die structure tatsächlich die beste Wahl.

In meinem Arbeitszimmer habe ich drei Homematic Schaltaktoren


Daraus ergibt sich die Anforderung, dass der switch immer dann eingeschaltet sein, muss, wenn mindestens eine der Hardwarekomponenten (Drucker und PC) eingeschaltet ist. Sind beide aus, kann auch der Switch ausgeschaltet werden.

Dazu sind PC und Drucker in einer structure zusammengefaßt. Immer wenn ein event von der structure kommt, wird per notify geprüft, ob der event "off" ist. In diesem Fall sind beide Geräte aus und das notify schaltet den Switch ab. In allen anderen events wird (bzw. bleibt) der Switch angeschaltet.
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: Otto123 am 17 Februar 2017, 14:40:13
Das wäre dann so?
defmod T_st_Aktor structure Switch T_Aktor1 T_Aktor2
attr T_st_Aktor clientstate_behavior relative
attr T_st_Aktor clientstate_priority on|on off|off
attr T_st_Aktor event-on-change-reading state
attr T_st_Aktor room Test

defmod T_nty_AktorST notify T_st_Aktor:(on|off) set T_Lampe1 $EVENT
attr T_nty_AktorST room Test

PC -> Aktor1
Netzwerkdrucker -> Aktor2
Switch -> Lampe1
Sozusagen als Fertigfutter - mal ganz Ausnahmsweise  8)
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: Jogi am 17 Februar 2017, 15:01:04
Vielen Dank für Eure umfangreichen Antworten. Da sollte doch etwas für mich dabei sein!
Danke!
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: betateilchen am 17 Februar 2017, 16:33:24
Zitat von: Otto123 am 17 Februar 2017, 14:40:13
Das wäre dann so?

Nein. Dein notify würde nicht korrekt funktionieren. Eine structure hat nicht nur on|off sondern auch noch undefined.

on und off würden nur auftreten, wenn beide Geräte den gleichen Zustand haben. Wenn aber nur ein Gerät eingeschaltet ist, meldet die structure "undefined".

Deshalb hatte ich extra geschrieben:

Zitat von: betateilchen am 17 Februar 2017, 14:12:10
wird per notify geprüft, ob der event "off" ist. In diesem Fall sind beide Geräte aus und das notify schaltet den Switch ab. In allen anderen events wird (bzw. bleibt) der Switch angeschaltet.
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: Thorsten Pferdekaemper am 17 Februar 2017, 16:45:51
Zitat von: betateilchen am 17 Februar 2017, 16:33:24
Nein. Dein notify würde nicht korrekt funktionieren. Eine structure hat nicht nur on|off sondern auch noch undefined.
Kommt das nicht noch so ein bisschen auf clientstate_behavior und clientstate_priority an?
Gruß,
   Thorsten
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: Otto123 am 17 Februar 2017, 16:52:23
Also ich habe es natürlich getestet und für die gestellte Aufgabe funktioniert es prima. Die structure hat nie undefined wenn die beiden Aktoren nur on und off kennen wegen
attr T_st_Aktor clientstate_priority on|on off|off
Zitaton und off würden nur auftreten, wenn beide Geräte den gleichen Zustand haben. Wenn aber nur ein Gerät eingeschaltet ist, meldet die structure "undefined".
Der Fall tritt wegen den beiden Attributen nicht ein!
Wenn beide Aktoren noch einen anderen Zustand haben dann ok. Dürfte aber nicht vorkommen. Zumindest wird dann einfach nichts gemacht.
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: betateilchen am 17 Februar 2017, 16:54:23
Ich wollte es EINFACH und verständlich erklärt haben. Und in einer einfachen Erklärung gibt es kein clientstate_priority und clientstate_behavior.

Aber manche Leute müssen offenbar aus allem eine Wissenschaft machen...
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: Otto123 am 17 Februar 2017, 17:02:44
Und wie sieht Dein notify aus?  :D
Titel: Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: betateilchen am 17 Februar 2017, 19:07:29
Das notify triggert auf die structure und ruft eine Funktion auf


st_az1:.* { myAz($NAME,$EVENT) }



sub myAz($$) {
   my ($dev,$evt) = @_;
   if($evt eq 'off') {
   fhem("set az_switch off");
   } else {
    fhem("set az_switch on");
   }
   return;
}


Ich bevorzuge immer ausgelagerte Funktionen.
Titel: GELÖST! Antw:Anfängerfrage: Wie macht man eine einfache Und-Verknüpfung?
Beitrag von: Jogi am 19 Februar 2017, 14:54:26
Zitat von: Otto123 am 17 Februar 2017, 12:35:20
Hi,

Für die Raw Def als komplettes Testscenario:
define T_Aktor1 dummy
define T_Aktor2 dummy
attr T_Aktor[1-2] webCmd on:off
define T_Lampe1 dummy
defmod T_di_Aktor DOIF ([T_Aktor1] eq "on" and [T_Aktor2] eq "on" )(set T_Lampe1 on) DOELSE (set T_Lampe1 off)
attr T_.* room Test


Dazu noch Franky's korrigierte :) notify Variante:
defmod T_nty_Aktor notify T_Aktor[1,2]:(on|off) {if ((Value("T_Aktor1") eq "on") && (Value("T_Aktor2") eq "on")) {fhem "set T_Lampe1 on"} else {fhem "set T_Lampe1 off"}}
attr T_nty_Aktor room Test


Gruß Otto

Vielen Dank, das hat funktioniert!!!