notify mit disabledAfterTrigger

Begonnen von TomLee, 29 Juli 2020, 16:44:33

Vorheriges Thema - Nächstes Thema

amenomade

Weil das {if }nach sleep kommt musst Du innerhalb des if die Semikola 2x verdoppeln... also 4.
defmod FB_433_2_TasteC_notify_1 notify FB_433_2_TasteC:off sleep 3;;{if (InternalVal("$NAME","EACH_INDEX","") eq "1")\
{system("/opt/fhem/voucher.sh &");;;;delete($defs{FB_433_2_TasteC}{EACH_INDEX})}\
else {system("/opt/fhem/voucherx.sh &");;;;delete($defs{FB_433_2_TasteC}{EACH_INDEX})}}
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

TomLee

#16
Ja, super sieht gut aus.

Für morgen liegt an herauszufinden weshalb jetzt bei 2 Tastendrücken die voucherx.sh zweimal gedruckt wird, die voucher.sh wird wie vorgesehen nur einmal gedruckt.

2020.07.29 22:48:46 3: sduino IT: FB_433_2_TasteC off->off
2020.07.29 22:48:46 3: Das ist FB_433_2_TasteC off off
2020.07.29 22:48:49 2: After sleep: 1
2020.07.29 22:50:15 3: sduino IT_set: FB_433_2_TasteC off
2020.07.29 22:50:15 3: Das ist FB_433_2_TasteC off off
2020.07.29 22:50:16 3: sduino IT_set: FB_433_2_TasteC off
2020.07.29 22:50:16 3: Das ist FB_433_2_TasteC off off
2020.07.29 22:50:18 2: After sleep: 2
2020.07.29 22:51:43 3: sduino IT_set: FB_433_2_TasteC off
2020.07.29 22:51:43 3: Das ist FB_433_2_TasteC off off
2020.07.29 22:51:44 3: sduino IT_set: FB_433_2_TasteC off
2020.07.29 22:51:44 3: Das ist FB_433_2_TasteC off off
2020.07.29 22:51:46 2: After sleep: 2
2020.07.29 22:53:16 3: sduino IT_set: FB_433_2_TasteC off
2020.07.29 22:53:16 3: Das ist FB_433_2_TasteC off off
2020.07.29 22:53:20 2: After sleep: 1


DANKE

TomLee

Habs.

Das notify merkt sich auch die Events die während dem dem sleep 3 (... sleep 3;;{if (I...) stattfanden, wird die Taste x mal betätigt wird auch x-mal ausgedruckt.

Abhilfe schafft ein disabledAfterTrigger 3  :)




Danke für die Hilfe mit dem if.

Und was das angeht ist mir jetzt immer noch nicht klar wie man das "kurze" if beim Namen nennt.

Einfach ternärer Operator, ternärer Operator if, bedingter Operator, bedingtes Operator if ? ? ?


Beta-User

if ist für mich  einfach (Perl-) if...

Und das notify merkt sich auch nichts, das setzt einfach ein unbenanntes sleep ab. Die Alternative zu "disabledAfterTrigger wäre, benannte sleep zu verwenden:A sleep with an <id> will replace a sleep with the same <id> and can be canceled by cancel. When called in a notify/at/etc, then nonempty return values of the following commands are logged to the global logfile with loglevel 2.
If quiet is specified, then skip this logging.

Hätte also indirekt dieselbe Folge, wie wenn du ein defmot-at absetzen würdest...
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

TomLee

Kann solange darüber nachdenken wie ich möchte, komm nicht drauf, wie mach ich das mit dem sleep dann in einer MyUtils ?
Hab noch nichts ausprobiert, nur philosophiert, ich kann doch nicht einfach ein fhem("sleep 3") ohne darauffolgenden Befehl machen nach if ($NAME eq "FB_433_2_TasteD" && $EVENT eq "off") ?

Oder Ist der Perl-Code {if (InternalVal("$NAME","EACH... dann der "darauffolgende Befehl", so hab ich es zumindest im notify verstanden ?


   if ($NAME eq "FB_433_2_TasteD" && $EVENT eq "off") {
if (InternalVal("$NAME","EACH_INDEX","") eq "1")
{system("/opt/fhem/voucher.sh &");delete($defs{$NAME}{EACH_INDEX})}
else {
system("/opt/fhem/voucherx.sh &");delete($defs{$NAME}{EACH_INDEX})}}


Hier das notify nochmal:

defmod FB_433_2_TasteC_notify_1 notify FB_433_2_TasteC:off sleep 3;;{if (InternalVal("$NAME","EACH_INDEX","") eq "1")\
{system("/opt/fhem/voucher.sh &");;;;delete($defs{$NAME}{EACH_INDEX})}\
else {system("/opt/fhem/voucherx.sh &");;;;delete($defs{$NAME}{EACH_INDEX})}}
attr FB_433_2_TasteC_notify_1 disabledAfterTrigger 3

setstate FB_433_2_TasteC_notify_1 2020-08-24 13:25:20
setstate FB_433_2_TasteC_notify_1 2020-08-23 16:53:01 state active

Beta-User

Korrekt, auch wenn du das "sleep" in einen fhem-Aufruf verpackst, MUSS danach ein Befehl kommen. Sollte also ggf. so aussehen:
fhem("sleep 3;;..")
Allerdings ist das m.E. "von hinten durch die Brust"... Denn eigentlich willst du einen InternalTimer definieren, und damit kannst du auch gleich direkt das machen, was
CommandSleep in fhem.pl tut, ohne das erst umständlich in fhem-Aufrufe zu verpacken (ok, die Syntax und die Vorgehensweis ist anders, aber das war es dann auch. Muß man halt - wie vieles andere auch - einmalig verstanden haben.)
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

Otto123

Hi,

abgesehen davon was Beta-User schreibt und ich mit dem Konstrukt $defs() nicht viel anfangen kann:
Rudi warnt davor FHEM Kommandotypen zu  mischen - auch wenn es funktioniert. Siehe hier.

Der Fall sleep x;{Perlcode} bildet aus meiner Sicht da eine Ausnahme die funktioniert, da FHEM aus dem sleep x ein at mit dem Befehl {Perlcode} macht. Ich verwende das öfters mal.
Am Ende wird es durch {fhem("sleep x;;{Perlcode}")} nicht anders.

Dein notify sieht nicht schlecht aus, auch wenn ich nicht verstehe was es tun soll :)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

#22
ZitatDein notify sieht nicht schlecht aus, auch wenn ich nicht verstehe was es tun soll :)

Dir kann ich gleich antworten, die "Beate" muss noch warten bis ich das verarbeitet habe.  ;D

Es gibt noch ein weiteres (ausgelagertes) notify , so in der Art (hat sich heute an den Tasten und Readingnamen was geändert im Vergleich zu oben):

Auszug aus der myUtils (Taste C off ist jetzt D on):

   if ($NAME eq "FB_433_2_TasteD" && $EVENT eq "on")
{Each($NAME, ReadingsVal($NAME,"count","0"));fhem("set EG_Echo_Kueche sounds Glocken")}


Es werden bei einem oder zwei Tasten-Betätigungen innerhalb von 3 Sekunden jeweils andere Scripts aufgerufen.

Beim ersten Tastendruck wird ein voucher mit Überschrift der SSID mittig einer A6 Seite ausgedruckt, beim zweiten Tastendruck zwei voucher mit Überschrift der SSID, jeweils mittig der A6 Seite oben und unten.

So in der Art ( wie gesagt hat sich heute einiges geändert) sieht das eine Script aus:

#!/bin/bash
voucher=$(perl fhem.pl 7072 "{ReadingsVal('Unifi','voucher_7d1x','unknown')}");
IFS=',' arr=($voucher);
sed -i 's/^\/Courier.*$/\/Courier findfont 20 scalefont setfont 70 290 moveto (SSID: '"${arr[0]}"') show 75 270 moveto ('"${arr[1]}"') show  70 85 moveto (SSID: '"${arr[0]}"') show 75 65 moveto ('"${arr[2]}"') show showpage/' /opt/fhem/voucherx.ps;
lpr -P HL-2035 -o media=Custom.95x138mm /opt/fhem/voucherx.ps;


So die dazugehörige .ps (unrelevant sieht man ja was sed oben macht):

%!
/Courier findfont 20 scalefont setfont 70 290 moveto (SSID: Gast1) show 75 270 moveto (1687752668) show  70 85 moveto (SSID: Gast1) show 75 65 moveto (1319214911) show showpage


So das andere Script:

#!/bin/bash
voucher=$(perl fhem.pl 7072 "get Unifi voucher 7d1x");
voucherssid=$(perl fhem.pl 7072 "{ReadingsVal('Unifi','voucher_7d1x','unknown')}");
IFS=',' arr=($voucherssid);
sed -i 's/^\/Courier.*$/\/Courier findfont 20 scalefont setfont 70 195 moveto (SSID: '"${arr[0]}"') show  75 170 moveto ('"$voucher"') show showpage/' /opt/fhem/voucher.ps;
lpr -P HL-2035 -o media=Custom.95x138mm /opt/fhem/voucher.ps;


Die dazugehörige .ps ( ebenfalls unrelevant wie oben):

%!
/Courier findfont 20 scalefont setfont 70 195 moveto (SSID: Gast1) show  75 170 moveto (1319214911) show showpage


Ich hab kein Problem, ich will nur das eine notify auslagern.



TomLee

Also das klappt so wie von euch auch bestätigt, hätt ich es doch einfach vorher mal ausprobiert.

my $NAME = shift;
{fhem('sleep 3;{if (InternalVal("$NAME","EACH_INDEX","") eq "1")
{system("/opt/fhem/voucher21.sh &");;delete($defs{$NAME}{EACH_INDEX})}
else
{system("/opt/fhem/voucher21x.sh &");;delete($defs{$NAME}{EACH_INDEX})}}')}
}


Was den InternalTimer angeht, mein ich den zweiten Parameter halbwegs verstanden zu haben, beim dritten brauchts noch Zeit.