[gelöst] Aktor Doppel-Lichtschalter mit A0, AI,B0,BI - Subaufruf m.Parameter A0

Begonnen von AnBad, 14 November 2021, 19:47:27

Vorheriges Thema - Nächstes Thema

AnBad

Hallo,

ich habe diesen notifier erstellt:

dev_Lichtschalter3:.* {dev_Lichtschalter3_Aktionen_V21_11_14(je nach Akton: A0, AI, B0, BI als Parameter übergeben)}

Kann man den jeweiligen Schaltbefehl "A0, AI, B0 oder BI" als Parameter an die Sub weiterleiten? Ich habe es mit $EVENT und $NAME probiert. Aber irgendwie funktioniert das nicht.

Danke, und schönen Abend.

MadMax-FHEM

Ja, geht...

Post doch mal die Ausgabe des Eventmonitors.

Bzw. kannst du auch mal eine Logausgabe in das notify (statt notifier ;) ) einbauen:


define nSchalter notify dev_Lichtschalter3:.* {Log3(undef, 1, "nSchalter Event: $EVENT")}


Dann siehst du ja was kommt...

In $NAME steht das Auslösende Device (bei dir also wohl immer dev_Lichtschalter3)...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

AnBad

Guten Abend,

OK, hier die Eventeinträge:

wenn man auf die Taste rechts oben "B0" des Tasters drückt kommt die Meldung:

2021-11-15 17:47:56 EnOcean dev_Lichtschalter3 buttons: pressed
2021-11-15 17:47:56 EnOcean dev_Lichtschalter3 channelB: B0
2021-11-15 17:47:56 EnOcean dev_Lichtschalter3 B0
2021-11-15 17:47:56 EnOcean dev_Lichtschalter3 buttons: released


und wenn man z.B auf die Taste links unten "AI" des Tasters drückt kommt die Meldung:

2021-11-15 17:47:55 EnOcean dev_Lichtschalter3 buttons: pressed
2021-11-15 17:47:55 EnOcean dev_Lichtschalter3 channelA: AI
2021-11-15 17:47:55 EnOcean dev_Lichtschalter3 AI
2021-11-15 17:47:55 EnOcean dev_Lichtschalter3 buttons: released


Ich wollte jetzt erreichen, dass mir ein notify eine Sub aufruft, welche dann den Parameter A0, AI, B0, BI als Parameter weitergibt an die Sub in Abhängigkeit welche Taste eben bedient wurde. Grund ist, dass ich dann in der Sub die Aktion in Abhängigkeit des übergebenen Parameters schalten lassen möchte.

Anbieten würde sich die dritte Zeile jeweils, oder? Würde das mit Deinem Vorschlag:

Zitat{Log3(undef, 1, "nSchalter Event: $EVENT")}

funktionieren? Gibt es zu {Log3... eine Doku? Ich tue mir immer schwer hier auf dem FHEM-Server was zu finden.

Vielen Grüße, Danke

MadMax-FHEM

Log3 schreibt, wie der Name sagt, etwas nämlich $EVENT ins Log.
Wenn man weiß was in $EVENT steht, kann man weiter schauen, wie man übergibt und abfrägt...

Also bitte einfach mal machen und die zugehörigen Logeinträge posten...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

bartman121

es hat ja noch keiner verlinkt: wiki, das nachfolgende ist dort eigentlich gut erklärt ...


ungetestet, aber das matched auf "channel" und danach beliebige Zeichen... (dabei steht der . für ein beliebiges Zeichen und * für beliebige wiederholungen)

danach wird im fhem-standard die Variable $EVENT normal gesplittet und es entstehen $EVTPART0, $EVTPART1 und falls mehr Leerzeichen kommen, $EVTPART2 usw. ... $EVTPART2 wird es in deinem Fall nicht geben

define nSchalter notify dev_Lichtschalter3:channel.* {deine_sub($EVTPART1)}


Noch eine Frage, seit wann gibt es eigentlich die Readings im notify-device "triggeredByDev" und "triggeredByEvent", das ist unheimlich hilfreich, wenn man das Suchmuster optimieren will.

Grüße

Andreas

AnBad

Hallo,
hier der Logeintrag:

2021.11.16 20:32:52 1: nSchalter Event: buttons: pressed
2021.11.16 20:32:52 1: nSchalter Event: channelB: B0
2021.11.16 20:32:52 1: nSchalter Event: B0
2021.11.16 20:32:52 1: nSchalter Event: buttons: released


Ich würde für mein Anliegen eigentlich
2021.11.16 20:32:52 1: nSchalter Event: channelB: B0
benötigen, d.h. das "B0" zwecks Weitergabe an die Sub().

Wenn ich eine andere Taste betätige, dann kommt zum Beispiel dies:
2021.11.16 20:36:06 1: nSchalter Event: buttons: released
2021.11.16 20:36:19 1: nSchalter Event: buttons: pressed
2021.11.16 20:36:19 1: nSchalter Event: channelA: A0
2021.11.16 20:36:19 1: nSchalter Event: channelB: B0
2021.11.16 20:36:19 1: nSchalter Event: A0,B0
2021.11.16 20:36:19 1: nSchalter Event: buttons: released


Warum der Schalter auch B0 des channelB hier ausgibt, verstehe ich nicht. Da ich ja nur "A0" gedrückt hatte. Das macht er manchmal. Da steht dann als state: A0,B0. Das verstehe ich auch nicht.

Irgendwie komme ich nicht weiter.

MadMax-FHEM

Vielleicht weil du "aus versehen" beide erwischst?

Du kannst auch das notify mal abändern zu dev_Lichtschalter3:channel.* und dann $EVTPART1 per Log ausgeben oder gleich einbauen wie von bartman121 vorgeschlagen...

Gegen die "Doppel-Auslösung" musst du halt sehen was du da tun kannst...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Beta-User

Grenz doch das notify erst mal besser ein: Es soll getriggert werden, wenn genau zwei Zeichen als "state"-Event kommen:define nSchalter notify dev_Lichtschalter3:.. {deine_sub($EVENT)}

Wenn man den Namen des auslösenden Devices mit übergibt, geht das auch generischer für mehrere Taster:
define nSchalter notify dev_Lichtschalter.*:.. {deine_sub($NAME,$EVENT)}

Da hier nur 4 Varianten gegeben sind, würde ich das eher mit einer Perl-if Lösung erschlagen. Dann kann der Name der Zieldevices in der config bleiben und die Subs können generisch gestaltet werden, wenn sie überhaupt noch benötigt werden:
define nSchalter notify dev_Lichtschalter3:.. {
if ($EVENT eq 'A0') {
  return fhem('set Licht1 off');
}
if ($EVENT eq 'A1') {
  return fhem('set Licht1 on');
}
return fhem('set Licht1 discomode toggle') if $EVENT eq 'B0';
return myfunction0815($NAME,$EVENT);
}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

AnBad

Hallo,
ich habe es jetzt für mich in der Art gelöst, dass eine doif eine Sub aufruft und den kompletten Event an die Sub übergibt. Der Schaltbefehl A0, AI, B0 oder BI ermittle ich dann mittels Perl.

Im Gesamten hat mein Anliegen den Vorteil, dass ich praktisch für jeden Schalter,  Bewegungsmelder  usw. jeweils nur noch eine doif formulieren muss. In der Sub wird dann festgelegt, welches Gerät bei welchem Event und ggf. sonstigen Einschränkungen welchen Befehl oder Sub auslöst.

Was ich nicht hinbekommen habe, ist wie die doif den eigenen Namen an die Sub übergibt. $NAME steht ja für das auslösende Device. Vlt ersetze ich noch in der aufrufenden doif den Namen beispielsweise von "sw_FEEFA2A6_doif" zu "$NAME"."_doif". Dann wäre es für alle Schalter wirklich immer jeweils die gleiche doif zu erstellen.

define sw_FEF2E727_doif DOIF ([sw_FEF2E727:"^channel.*"]) (\
{sub_switchList_V21_11_21("sw_FEEFA2A6_doif", "$EVENT")}\
)


sub sub_switchList_V21_11_21($$) {
###################Aufgabe der Sub/Function: Switches und Events einer oder mehrer Aktionen zuordnen ############################

#------Übergabewert durch Sub
my ($doif_name, $Event) = @_;
my $Event = substr ($Event, 10, 2, "");
#------Variablen Deklarieren

#------Daten abfragen/ermitteln

#------Bearbeitung
    #A) sw_FEF2E727
    #--------------------------------------------------
if ($doif_name eq "schal_FEEFA2A6_doif") {
  if ($Event eq "A0") {
   sub_OnOffTimer_V21_11_19("$doif_name", "$Event", "devShelly25_1_0","5");
   #test();
  } elsif ($Event eq "B0") {
   
  } elsif ($Event eq "AI") {
   
  } elsif ($Event eq "BI") {
   
  };
}
    #B) sw_
    #--------------------------------------------------
    elsif ($doif_name eq "sw_") {

};

#C) XYZ
    #--------------------------------------------------
    #D) XYZ
    #--------------------------------------------------

#------Ausgabe

###########################ERGEBNIS################################
#### Ausgabevariable:
#### Veränderung der Arbeitsmappe: keine
#### sonstiges: ./.
###########################ERGEBNIS################################

};





MadMax-FHEM

Ich kenne DOIF zu wenig aber habe schon mal von $SELF gehört. Evtl. ist das der Name des DOIF...

Aber warum brauchst du den Namen des DOIF?

Der Name des auslösenden Devices ist doch ausreichend?

Also z.B. mit notify auf mehrere Schalter:


define nSchalter notify dev_Lichtschalter1:.*|dev_Lichtschalter2:.*|dev_Lichtschalter3:.* {meineSubFuerAlleSchalter($NAME, $EVENT)}


Und in der Sub dann je nach Schalter eben eas anderes tun...

Bzw. wenn dir schalter_DOIF_name helfen würde, dann sollte doch auch Schalter-Name alleine reichen?

Oder verstehe ich da was nicht?

Wenn die Namen von Schaltern, Aktoren usw. "klug" gewählt sind, dann kann man auch sehr "generisch" von Schalter auf Aktor etc. "schließen"...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

AnBad

Das mit:

define nSchalter notify dev_Lichtschalter1:.*|dev_Lichtschalter2:.*|dev_Lichtschalter3:.* {meineSubFuerAlleSchalter($NAME, $EVENT)}

ist schon mal eine geniale Lösung. Da muss man ja nur noch eine notify anlegen. Muss mal schauen, ob dass auch mit einer doif funktioniert. Ich hatte mich für doif entschieden, da dieses Modul mir "mächtiger" erschien als ein notify. Z. B gibts hier ja ein timeout zwischen den einzelnen cmds. Für denn Fall dass bei einem Device z.B. ein Zusatzbefehl mit Zeitverzögerung ausgeführt werden muss nach der eigentlichen Sub. Also zukunftssicherer.. ;-)

Den Namen der doif, ja Du hast recht, den braucht man eigentlich nicht. Ich habe mir aber eine kleine Sub geschrieben, welche mir z.B. bei 1xTastendruck ein Licht für zehn Minuten anschalten, bei 2xTastendruch zwanzig Minuten usw. Hier habe ich einen Speicherort für eine Variable gebraucht "Tastendruckanzahl". Und diese habe ich dann jeweils in die doif geschrieben. Ich müsste das umschreiben, dass die Variable in das Device geschrieben wird. Nach 5 Sekunden setzt mir ein at_ die Tastendruckzahl auf Null. Weiß nicht, ob das alles die Toplösung ist, ich als Noob fands ganz gut.

Vielen Dank und guten Nacht!1


MadMax-FHEM

Mächtiger, mag sein.

Was mich etwas "stört"/"irritiert" ist das Mischen zwischen DOIF-Syntax (die ähnlich "Programmieren" ist) und dann Parametrisieren per Attibuten, was ebenfalls die Logik ("Programmierung") beeinflusst...
...und wenn ich dann eh DOIF Perl nutze: warum nicht einfach gleich Perl ;)

Egal.

Aber das was du willst geht auch mit einem notify ganz einfach:


sub meineSub()
{
  fhem(set Device1 Befehl1; sleep 10; set Device2 Befehl2");
}


Aber wenn du DOIF besser findest, nimm das ;)

Wie geschrieben, wenn die Namen deiner Devices "klug" gewählt sind, dann geht es auch einfach(er) und auch mittels DOIF verm. ganz einfach:


define nSchalter notify dev_Lichtschalter.*:.* {meineSubFuerAlleSchalter($NAME, $EVENT)}


wäre ein Aufruf für alles was Schalter...... heißt 8)

Du kannst doch auch in DOIF entweder per Regex alle Schalter die du "einfangen" willst angeben oder auch einzeln als Trigger nutzen, so wie ich in meinem notify in der Antwort zuvor...

Viel Erfolg, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

AnBad

Hi,
das Mischen von doif-Logik und Pearl-Logik hat den Grund:

Ich habe einen Strommesser. Wenn ich per command Daten vom Strommesser abfrage, dann dauert es ein Moment bis die Abfrage zum Strommesser und dann die Daten vom Strommesser in FHEM landen. Wenn ich die Daten dann in Perl verarbeiten will, ist Perl mit der Routine bereits fertig, und hinterher kommen die aktuellen Daten erst an.
Dies konnte ich nur mit einer Doif umgehen. Abfragen/Senden Daten, wait, Starte Sub().

Deswegen habe ich eher zu Doif tendiert, als zu einem Notify.

Das mit sleep kenne ich. Habe ich mit meinem Strommess-Problem so nicht genutzt. Vlt. probiere ich das irgendwann einmal.

Vielen Dank für Deine sehr hilfreichen Tipps.
vg


bartman121

schön, dass du eine Lösung gefunden hast, aber einen unschönen Beigeschmack hat das schon ....


wenn es solche Besonderheiten gibt, warum erzählst du davon nichts? Alle Helfenden wurden quasi sinnlos in die falsche Richtung geschickt ...

Grundsätzlich entfernst du dich mit DOIF leider unnötig vom Standard, FHEM ist und bleibt Ereignisbasiert (EVENT-basiert), dein unnützes Konstrukt mit einer Wartezeit funktioniert sicherlich, aber ist totaler Quatsch, sinnvoll wäre es beim Drücken des Schalters, mittels notify das Auslesen anzustoßen. Wenn die werte dann verfügbar sind, gibt es einen neuen Event auf den du mit einem Notify reagierst. Und mit ReadingsVal den zuletzt gedrückten Schalter abfragst.

Die wartezeit hat zwei Nachteile:
1. Die muss länger gewählt werden als die Durschnittliche Zeit bis zum Erhalt der werte
2. Es kann u.U. dazu kommen, dass die werte trotz ausreichender wartezeit nicht zur Verfügung stehen.

Aber gut, ich benutze selbst kein DOIF.

Viele Grüße

AnBad

Hallo,
hier ging es um die Frage: Wie lese ich ein (Teil-)Event aus.

Und nicht warum ich mich für "Doif" aufgrund eines alten Problems entschieden hatte. Das hatte ich jetzt nur angesprochen, weil Mad-Max gefragt hatte.

Ich hoffe, ich konnte den Beigeschmack beseitigen.

Und bitte, ich habe jetzt erst mit dem Programmieren, also auch mit Perl, angefangen. Das ist mit 50 gar nicht so einfach. Finde, ich kann schon ein bißl was aber finde halt nicht immer gleich den richtigen Weg. By the way, mit dem Event abschicken und neuen Event abwarten und dann notify starten, auf die Idee bin ich nicht gekommen. Werde ich mal probieren. Danke dafür.