Structur - nur Event "on" an ein Member schicken

Begonnen von ftsinuglarity, 01 Februar 2018, 10:32:30

Vorheriges Thema - Nächstes Thema

ftsinuglarity

Ist es möglich, das ich einem Strucktur Mitglied ausschließlich EIN Event schicke, egal ob ich die Strucktur ein oder ausschalte ?

Also etwa so:
define myStruct structure st_type_lights Lamp1  FB_Lamp1:on

FB_Lamp1 toggelt das Event "on".

ftsinuglarity

durchs schreiben kommt man oft selbst drauf:

FB_Lamp1:state:on

zumindest funktioniert das grad so. Ist das korrekt ?

rudolfkoenig

Ich weiss nicht genau, was du meinst, aber die Definition im ersten Beitrag ist falsch bzw. tut nicht das, was suggeriert wird.

Ein Strukturmitglied ist entweder ein FHEM-Geraetename, oder etwas, was per devspec zu eine Liste von Geraeten wird. Ich empfehle list, um mit devspec zu experimentieren. Achtung: die Mitgliedsliste wird in structure nur beim Anlegen/Loeschen/Umbenennen von Geraeten aktualisiert, nicht bei Statusaenderungen.

ftsinuglarity

Ah, ok. Danke Rudolf. So wie obem beschrieben funktionierts erstaunlicher weise, die verbundenen lampen schaltrn aber dennoch nocht immer wie sie sollen, also funktionierts nicht richtig.
Hatte eh etwas eher schräges vor und wollte einen dummy sparen. Ich baue grad alles neu auf, sa mein altes system gecrasht ist, umd wollte es do sauber wie möglich aufbauen.
So wie ich denke, hauts nicht hin...dann anders :)

ftsinuglarity

#4
Ich greife die Idee nochmal auf, weil es vielleicht nicht sooo abwegig ist.

Ich versuch mal kurz zu beschreiben was ich vorhatte:

Im Wohnzimmer habe ich eine Baumarktfernbedienung, mit der ich im FHEM Schaltungen auslöse. Nun reichen die 4 Tasten (jeweils on/off, also insg. acht Tasten) nicht aus.
Also habe ich über toggle die Tasten einzeln belegt. ZB. drücke ich auf die Taste 1 und schalte damit das helle Licht an. Drücke ich nochmals auf die Taste 1, togggelts und schaltet das helle Licht wieder aus.
Die 2. Taste (vormals einfach "off") habe ich genauso belegt, nur für "warmes" Licht. .. usw. Insgesamt kann ich so 8 Schaltungen aufrufen, nicht nur 4. Is ja mal was.
Hinter den Tasten liegt eine Struktur, die geschaltet wird. So schalte ich mit einer Taste mehrere Geräte gleichzeitig, was Sinn der Aktion war.

Da ich gerade alles neu aufbaue, und das so sauber wie möglich sein sollte, ohne >überflüssige< Dummys und so, habe ich das wie oben schon angedeutet versucht. Nähere Erklärung:
Wenn ich auf Taste 1 drücke, wird vom IT-Device der Fernbedienung im FHEM   das Event "on" durch ein Notify  an die Struktur "Wohnzimmer_helles_licht" geschickt.
Drücke ich zum nochmal auf Taste 1, wird durch das Notify getoggelt, und "off" an die Struktur übermittelt.
Bis hierhin funktioniert alles wie gewollt.
Schalte ich jetzt aber umgekehrt direkt die Struktur, sendet sie jeweils "on", und doofer Weise "off", wenn ich sie auschalte. Das Event "off" geht dann zum seinem Mitglied, der Fernbedienung. Nur ist "off" die 2. Taste, und die ist mit dem "warmen" Licht belegt. Also schaltet sich das ein - was ich nicht möchte.
Mitglied der Struktur ist die Fernbedienung eigentlich nur, damit sie auch den state "on" und "off" bekommt, wenn ich die Struktur von anderswo schalte. Den Dummy + Notify, der das bisher alles erledigt hat, wollte ich sparen... und damit alle gleichartigen Dummys. Je einfacher um so besser.

Ich hoffe das ist bis hier hin einigermaßen verständlich.

Meine Idee war, und da habe ich oben angesetzt, das die Struktur Wohnzimmer_helles_licht nur "on" senden kann, die Strukture Wohnzimmer_warmes_licht nur "off" (entspricht Taste 2 der FB)
Aus welchen Gründen auch immer, hat das dann so tatsächlich funktioniert:
FB_Lamp1:state:on
Vielen Dank für den Hinweis Rudi, das geht, wenn ich das richtig verstanden habe, nicht.
Es können jeweils nur Members als ganzes Gerät angesprochen werden, einzelne Events für spezielle Members lassen sich nicht rauspicken.

Effekt bei mir ist dann, das es zwar prinzipiell funktioniert, im Log auch zu sehen ist, das richtig getoggelt wird, das der Cul die richtigen Signale aussendet, die Struktur offensichtlich nur "on" sendet ... Nur schalten die Lampen nach Glück. Mal ja, mal nein. Irgendwas haut also nicht hin, denn direkt geschaltet funktionieren die Lampen gefühlte 90%.

Wieder so ne Sache, die ich nicht verstehe. Alles läuft richtig, nach Log werden die Signale rausgesandt ... also was zum Henker.....  die Struktur kommt anscheinend mit dem angehängten ..:state:on nicht so recht klar.

Wenn meine Vorstellung vielleicht auch von anderen benötigt wird, könnte das auf die Wunschliste.

define myStruct structure st_type_lights FB_Lamp1:on

ftsinuglarity

#5
Gelöst habe ich das ganze vorerst jetzt so, schien mir der direkteste Weg:

- gesteuert wird alles über eine Funktion und entsprechende Notify's.
- Dummy's, so wie ich das früher gelöst hatte, sind nicht nötig

# FB + Notify
defmod WZ_FB_1_Licht IT F0FFF0FFFF 0F F0
defmod nWZ_FB_1_Licht notify WZ_FB_1_Licht {\
    if($EVENT eq "on") {licht_wz("stWZ_Licht_Hell",1);;}\
    elsif($EVENT eq "off") {licht_wz("stWZ_Licht_Warm",1);;}\
}



# Struktur stWZ_Licht_Hell  + Notify
defmod stWZ_Licht_Hell structure st_type_lights  ...devices
defmod nstWZ_Licht_Hell notify stWZ_Licht_Hell {licht_wz("stWZ_Licht_Hell",0);;}



# Struktur stWZ_Licht_Warm + Notify
defmod stWZ_Licht_Warm structure st_type_lights ..devices
defmod nstWZ_Licht_Warm notify stWZ_Licht_Warm {licht_wz("stWZ_Licht_Warm",0);;}




# Funktion licht_wz() :

# Par1: stWZ_Licht_Warm|stWZ_Licht_Hell
# Par2: 0|1
sub licht_wz($$){
    my ($struct,$set) = @_;                    # struct-name | 0/1 set-structs
    my $co_device ="WZ_FB_1_Licht";            # zusätzlich zu setzendes Device
   
    # von FB / # Toggle Hell und Dunkel
    if($set eq "1") {toggle($struct);}

    # On
    if(Value("stWZ_Licht_Hell") eq "on" || Value("stWZ_Licht_Warm") eq "on")
    {fhem("setstate ".$co_device." on;");}
   
    # Off
    elsif(Value("stWZ_Licht_Hell") eq "off" && Value("stWZ_Licht_Warm") eq "off")             
    {fhem("setstate ".$co_device." off;");}
}   



# Toggle Funktion
sub toggle($) {
    my $dev = $_[0];
    if (Value($dev) eq "off") {fhem ("sleep 0.1;set ".$dev." on");    }
      else {fhem ("sleep 0.1;set ".$dev." off");}
}