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?
Vielleicht verstehe ich Dein Problem nicht richtig, aber in der Commandref steht doch alles drin:
ZitatZitat
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.
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.
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.
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.
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)
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.
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");
}
}