auslösendes Device ermitteln [gelöst.?]

Begonnen von Brandenburger, 13 August 2021, 13:46:33

Vorheriges Thema - Nächstes Thema

Brandenburger

Hi,

zu einer einfachen Frage finde ich keine Antwort und im Moment auch keine Info in WIKI und cref.

Wie lautet die Variable zum auslosenden Device in Notify bzw. DOIF?

Folgendes Notify:define Lampe1_notify notify Schalter1 set Lampe1 $EVENT
Soweit ist alles klar, wenn auf Schalter1 geklickt wird, ändert sich der Status von Lampe1.

Jetzt möchte ich ein Event aus einem Kalender erzeugen, welches mit Hilfe von Kalender_notify mit "set Schalter1 on" geschieht.

Nun zur eigentlichen Frage: Wie kann in Lampe1_notify entweder Kalender oder Kalender_notify als auslösendes Device ermitteln?

eki

Vielleicht verstehe ich Dein Problem nicht richtig, aber in der Commandref steht doch alles drin:

Zitat
Zitat
in the command section you can access the event:

    The variable $EVENT will contain the complete event, e.g. measured-temp: 21.7 (Celsius)
    $EVTPART0,$EVTPART1,$EVTPART2,etc contain the space separated event parts (e.g. $EVTPART0="measured-temp:", $EVTPART1="21.7", $EVTPART2="(Celsius)". This data is available as a local variable in perl, as environment variable for shell scripts, and will be textually replaced for FHEM commands.
    $NAME and $TYPE contain the name and type of the device triggering the event, e.g. myFht and FHT


Wie die EVTPARTs aussehen, kannst Du am besten sehen, wenn Du mal in den Eventmonitor schaust, während solche events einlaufen.

Brandenburger

In dem Fall ($NAME) würde Schalter1 ausgegeben.
Das Device, das den Stein ins rollen gebracht hat, ist aber Kalender.

Der Plan ist, dass im Lampe1_notify ausgewertet werden soll, ob einfach auf Schalter1 geklickt wurde oder ob die Aktion vom Kalender ausging.

Sollte der Kalender der Ursprung sein, möchte ich noch einige Bedingungen prüfen.

betateilchen

Zitat von: Brandenburger am 13 August 2021, 14:41:46
Sollte der Kalender der Ursprung sein, möchte ich noch einige Bedingungen prüfen.

nimm ein zweites notify.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Brandenburger

#4
Danke für Eure Unterstützung.
Daran habe ich auch schon gedacht, jedoch möchte ich auch den Status von Schalter1 ändern.

Wenn es eine solche Variable nicht gibt, muss das zweite notify auch Schalter1 schalten ohne dort ein Event auszulösen. Das sollte ja zu machen sein.

Also - vielen Dank nochmals.

eki

Das geht aus meiner Sicht nicht direkt. Du baust ja, soweit ich verstehe eine Kette von Events (erst Kalender, dann Schalter). Woher soll das Schalter Event noch wissen, wer "set Schalter on" generiert hat.
Was Du machen könntest, wäre im Kalender_Notify ein Reading ("setreading Schalter1 triggeredev Kalender" oder so) zu setzen, und das dann im Schalter notify auszuwerten (nach der Auswertung musst Du das wieder auf einen Leerstring setzen für die nächste Runde)

Brandenburger

#6
Etwas unkonventionell habe ich die set-Anweisung erweitert.
Das Kalenderdevice setzt jetzt "set Schalter1 on $NAME" ab.
Das Dummy schaltet und gibt das Event an Lampe1_notify weiter.
In der Ansicht wird für das devStateIcon "on" erkannt.attr Schalter1 devStateIcon off:message_attention@grey on:message_attention@yellow
Das Notify für die Lampe sieht jetzt so aus:define Lampe1_notify notify Schalter1 { my ($devState,$primDev) = split(' ',$EVENT); if ($primDev ne "Kalender"){fhem("set Lampe1 $devState")}else{fhem("setreading Lampe1 primDev $primDev")}}

Es funktioniert wie erhofft, birgt aber bestimmt Stolperfallen, welche ich nicht kenne.

FHEMAN

Eine saubere Lösung dafür wünsche ich mir auch.
Ich habe dafür folgende halbwegs generische "Krücke" seit Jahren im Einsatz. (Achtung, der CMDALIAS wertet im Kommando auch -force aus, ansonsten wird nur bei abweichendem STATE geschaltet)

setex .* AS {
my @EVENTS;
my $FILTER = ":FILTER=STATE!=$EVTPART1";
if ($EVTPART1 =~ /-force/i) {
$EVTPART1 =~ s/-force//i;
$FILTER = "";
}
if ($EVTPART0 =~ /,/) {
$EVTPART0 =~ s/,/|/g;
$EVTPART0 = "NAME=$EVTPART0";
}
# my $trig = $EVENT;
# $trig =~ s/.*\W(\w)/$1/;

if($EVTPART1 =~ /(on|off)-(for-timer|till)/) {
@EVENTS = split(/\s+/, $EVENT, 4);
my $trigger = (@EVENTS > 3) ? $EVENTS[3] : "0";
fhem("setreading $EVTPART0 trigger $trigger");
# bei on-for-timer X Y soll keine STATE Pruefung stattfinden, da oft vorher das Device oft on ist
fhem("sleep 0.01;set $EVTPART0 $EVTPART1 " . $EVENTS[2]);
} else {
@EVENTS = split(/\s+/, $EVENT, 3);
my $trigger = (@EVENTS > 2) ? $EVENTS[2] : "0";
fhem("setreading $EVTPART0 trigger $trigger");
fhem("sleep 0.01;set $EVTPART0$FILTER $EVTPART1");
}
}
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB