Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern

Begonnen von TomLee, 10 Juli 2020, 12:34:40

Vorheriges Thema - Nächstes Thema

Beta-User

Nur um sicher zu gehen: starte mal neu oder lösche übergangsweise das M2D (dann wieder RAW erstellen sollte ok sein).

Sind die doppelten Events (dann noch) auch im Event-Monitor zu sehen?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Ich mag auch so eine Glaskugel wo kann man die bestellen ?



ZitatSind die doppelten Events (dann noch) auch im Event-Monitor zu sehen?

Aber hier lagst du falsch es gab/gibt (hab jetzt nachträglich (zum nachvollziehen) zwei Einträge in RL vorgenommen) keine doppelten Events im Eventmonitor mit zwei Einträgen.

2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube angle: 53.18
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube linkquality: 0
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube side: 0
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube action: tap
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube battery: 37
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube voltage: 2865
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube batterymV: 2865
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube action: tap
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube batteryPercent: 37
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube angle: 53.18
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube linkquality: 0
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube side: 0
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube batteryVoltage: 2.865
2021-02-26 14:36:52 echodevice OG_Echo_Wohnzimmer alarm_count: 0
2021-02-26 14:36:54 OWTHERM KG_Innensensor_RlaufHinterhaus temperature: 28.25
2021-02-26 14:36:54 OWTHERM KG_Innensensor_RlaufHinterhaus T: 28.25 °C ↓
2021-02-26 14:36:54 OWTHERM KG_Innensensor_RlaufHinterhaus old_temperature: 28.3125
2021-02-26 14:37:00 at at_wordclock wclocktime: Es ist 14 Uhr 37


DANKE

TomLee

Ich war der Meinung das es so einfach ist das ich es auch ohne zu fragen hinbekomme ::)

Sitz da jetzt schon Stunden dran mit allen mir erdenklichen Variationen von qq,Hochkommata und Verkettungen

defmod not_MQTT2_Cube notify MQTT2_Cube:action:.tap {cube($NAME,$EVENT,$EVTPART0,$EVTPART1,"EG_Echo_Kueche")}

setstate not_MQTT2_Cube 2021-02-27 11:56:04
setstate not_MQTT2_Cube 2021-02-26 19:26:05 state active


sub cube {
my $NAME = shift;
my $EVENT = shift;
my $EVTPART0 = shift;
my $EVTPART1 = shift;
my $echo = shift;
chop($EVTPART0);
my $sr = ReadingsNum($NAME,'side',0);
my $sound = fhem("set $echo sounds Glocken");
my $gzg = (system ('/opt/fhem/vouchergzg.sh &'));$sound;
#my $gzg1 = (system ('/opt/fhem/vouchergzg1.sh &'));$sound;

Log3(undef, 3, "Das ist $NAME, $EVENT, $EVTPART0, $EVTPART1");


my %sr2cmnd = (
'0' => "$gzg"
);
my $cmnd = $sr2cmnd{$sr};

return if !$cmnd;
return $cmnd;

}


Wie lautet die richtige Definition der Variablen $gzg/$gzg1 ?

Ist $gzg1 auskommentiert wird einmal beim Event tap vouchergzg.sh und $sound ausgeführt allerdings unabhängig vom Key (Reading side), es reicht also einfach nur der Aufruf der sub.

Nehm ich die Variablendefinition $gzg1 mit rein wird beim Event tap (und auch unabhängig vom Key) zweimal vouchergzg1.sh und einmal $sound ausgeführt ? ? ?

Was hab ich noch nicht verstanden, hat es was mit der Definition eines Systemaufruf in einer Variablen zu tun ?

edit:

mit if und einer IT-Fernbedienung klappt mein Vorhaben bisher problemlos so:

if ($NAME eq "FB_433_2_TasteC" && $EVENT eq "on")
{(system ('/opt/fhem/vouchergzg.sh &'));fhem("set EG_Echo_Kueche sounds Glocken")}

if ($NAME eq "FB_433_2_TasteC" && $EVENT eq "off")
{(system ('/opt/fhem/vouchergzg1.sh &'));fhem("set EG_Echo_Kueche sounds Glocken")}



Beta-User

Hmm, also für mich sieht das so aus, als könnte man das gar nicht auf diese Weise lösen...

Entweder du generierst
a) Text (qq) oder
b)  du weist einer Variablen
aa) den Wert eines auszuführenden Befehls
zu oder
bb) die Referenz auf Code

Was du hier versuchst, ist eine ziemlich seltsame Mischung von all dem mit Schwerpunkt auf b) aa) => der Code wird zum falschen Zeitpunkt ausgeführt...
Auf die Schnelle habe ich aber auch keine Lösung anzubieten, aber vielleicht hilft dir das erst mal weiter. Ansonsten ggf. mal die Code-Hash-Lookup-Tabelle im jüngsten RHASSPY-Code ansehen und mit der elsif-Kaskade vergleichen, die da vorher stand.

Edit: evtl als anonyme sub () in der Variablen....
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Otto123

Ich frage mal nach und formuliere es anders als Jörg:
Willst Du wirklich das
my $gzg = (system ('/opt/fhem/vouchergzg.sh &'));$sound;
oder wolltest Du eher das?
my $sound = "fhem(\"set $echo sounds Glocken\")";
my $gzg = "(system ('/opt/fhem/vouchergzg.sh &'));".$sound;


Dein funktionierender Code sieht eher so aus ;) als wolltest Du nur Strings kombinieren - aber in deinem Versuch schreibst Du Ergebnisse in die Variable.

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

my $sound = 'fhem("set $echo sounds Glocken")';

Wenn schon mit doppelten Hochkommata, mit einfachen wird die Variable $echo nicht aufgelöst.

my $gzg = '(system ('/opt/fhem/vouchergzg.sh &'));'.$sound;

Sobald Hochkommata um (system ('/opt/fhem/vouchergzg.sh &')) ins Spiel kommen klappt das nicht mehr.

Mit einfachen kommt die Meldung: Search pattern not terminated at ./FHEM/99_Remotes_myUtils.pm line 217.

Wenn man aussen einfache innen doppelte nimmt, kommt die Meldung nicht mehr. Der Systemaufruf aber auch nicht ausgeführt nur $sound

my $gzg = '(system ("/opt/fhem/vouchergzg.sh &"))'.$sound;

Mit doppelten aussen wird der Systemaufruf auch nicht ausgeführt, er klappt bloss ohne Hochkommata wird aber immer bei Aufruf der sub ausgeführt.

Sobald es zwei Variablen gibt (mit Systembefehl) wird immer die zweite Variable beim Aufruf der sub zweimal ausgeführt $sound nur einmal.

Ich brauche erstmal eine Pause.

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Otto123

Zitat von: TomLee am 27 Februar 2021, 14:19:59

Wenn schon mit doppelten Hochkommata, mit einfachen wird die Variable $echo nicht aufgelöst.

Ich brauche erstmal eine Pause.
sorry hatte nicht an alles gedacht. Habe #49 editiert, sollte so klappen. Du hast meine Frage nicht beantwortet, die war durchaus ernst gemeint. Ich habe wirklich nicht auf Anhieb verstanden,was das genaue Ziel. :-[
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



Zitat von: Beta-User am 27 Februar 2021, 14:37:54
Mobiles Stichwort für anonyme sub: trim30()
;)

Das sieht gut aus  :-*  ;D, aber noch nicht final getestet am Drucker (die .sh druckt eine .ps aus), sehe erstmal nur einen Druckauftrag in CUPS, sonst waren es immer zwei.

Bevor ich wieder runterlaufe  ;D mag ich zuvor noch wissen was es mit der Meldung auf sich hat und wie man sie vermeidet/was ich falsch definiert habe bei einem
{my $sound = fhem("set OG_Echo_Wohnzimmer sounds Glocken");;my $v = sub {return $_[0].';;'.$sound};;my $gzg = v((system ('/opt/fhem/vouchergzg.sh &')));;my $gzg1 = v((system ('/opt/fhem/vouchergzg1.sh &')));;$gzg1}

aus der Kommandozeile

Undefined subroutine &main::v called at (eval 118414) line 1.

Otto123

Du bist durch den Wind :)

my $v = sub {return $_[0].';;'.$sound} -> sub v {return $_[0].';;'.$sound}

Seit wann definiert man eine Sub mit my ?

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

Beta-User

...geht, "anonyme sub"...
Aber die Sytax ist anders, die Variable wird normal definiert, aber die eigentliche sub muss dann in brackets, nix mit concat (auf die Art)...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Otto, mit der Ausgabe bzw. der Definition der Variablen $sound gibts kein Problem, nur mit der des System-Befehl, der darf einfach nicht in Hochkommata sein, egal ob einfache oder doppelte, sonst wird er nicht ausgeführt.




Sowas
{my $sound = fhem("set EG_Echo_Kueche sounds Glocken");;my $gzg = (system ("/opt/fhem/vouchergzg.sh &"));;$gzg .= qq(;;$sound);;my $gzg1 = (system ('/opt/fhem/vouchergzg1.sh &'));;$gzg1 .= qq(;;$sound);;$gzg}


aus der Kommandozeile hat mir nochmal diese Aussage bestätigt:

ZitatSobald es zwei Variablen gibt (mit Systembefehl) wird immer die zweite Variable beim Aufruf der sub zweimal ausgeführt $sound nur einmal.

Obwohl $gzg als Rückgabewert dasteht wird $gzg1 zweimal ausgeführt und $sound einmal.

TomLee

Zitat von: Otto123 am 27 Februar 2021, 15:53:06

Seit wann definiert man eine Sub mit my ?


War hier in devstateIcon kurzzeitig auch so.

Zitat von: Beta-User am 27 Februar 2021, 16:01:47
...geht, "anonyme sub"...
Aber die Sytax ist anders, die Variable wird normal definiert, aber die eigentliche sub muss dann in brackets, nix mit concat (auf die Art)...


Dann muss ich nochmal weiterlesen.


Otto123

Zitat von: Beta-User am 27 Februar 2021, 16:01:47
...geht, "anonyme sub"...
Aber die Sytax ist anders, die Variable wird normal definiert, aber die eigentliche sub muss dann in brackets, nix mit concat (auf die Art)...
ich mache ja mit um zu lernen :)

Du meinst den Ausdruck?
"(system ('/opt/fhem/vouchergzg.sh &'));"
Eventuell ist final der größte Fehler, dass außen ein Klammer ist.
"system ('/opt/fhem/vouchergzg.sh &');"
Der String in der system() Klammer muss sein.

Du willst doch zwei Strings verknüpfen? Also:
$String1='willi'
$String1.' ist lustig'

Oder liege ich falsch?

Dieser Ausdruck schreibt das Ergebnis des fhem() in die Variable und nicht den Befehl an sich.
my $sound = fhem("set EG_Echo_Kueche sounds Glocken");

Der Set Befehl liefert sicher nichts zurück, die Variable enthält anschließend nichts?

Welcher der beiden Ausdrücke in der Kommandozeile liefert das zurück, was Du erwartest?
{my $sound = fhem("set EG_Echo_Kueche sounds Glocken");;return $sound}
{my $sound = "fhem(\"set EG_Echo_Kueche sounds Glocken\")";;return $sound}
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

ZitatDu willst doch zwei Strings verknüpfen? Also:
$String1='willi'
$String1.' ist lustig'

Oder liege ich falsch?

Ich meine ja, so hab ich es ursprünglich auch verstanden.

Nur hat die Praxis gezeigt das es scheinbar nicht so ist. siehe unten.

Zitat von: Otto123 am 27 Februar 2021, 16:29:42
Welcher der beiden Ausdrücke in der Kommandozeile liefert das zurück, was Du erwartest?
{my $sound = fhem("set EG_Echo_Kueche sounds Glocken");;return $sound}
{my $sound = "fhem(\"set EG_Echo_Kueche sounds Glocken\")";;return $sound}

Ich würde sagen um die Variablen aneinander zu ketten bräuchte ich die zweite Variante.
Warum aber escapen und nicht einfach qq nehmen ?

Um zu verdeutlichen das es nicht so ist wie du mAn. vermutest nochmal ein Beispiel erstmal nur mit einer Variablen und deinen Vorschlägen:

sub cube {
my $NAME = shift;
my $EVENT = shift;
my $EVTPART0 = shift;
my $EVTPART1 = shift;
my $echo = shift;
chop($EVTPART0);
my $sr = ReadingsNum($NAME,'side',0);
my $sound = "fhem(\"set $echo sounds Glocken\")";
my $gzg = "system ('/opt/fhem/vouchergzg.sh &');".$sound;

Log3(undef, 3, "Das ist $NAME, $EVENT, $EVTPART0, $EVTPART1");

my %sr2cmnd = (
'0' => "$gzg"
);
my $cmnd = $sr2cmnd{$sr};

return if !$cmnd;
return $cmnd;

}


Im Log steht dann :

2021.02.27 17:28:27 3: Das ist MQTT2_Cube, action: tap, action, tap
2021.02.27 17:28:27 3: not_MQTT2_Cube return value: system ('/opt/fhem/vouchergzg.sh &');fhem("set OG_Echo_Wohnzimmer sounds Glocken")


Die beiden Befehle werden also "ausgeschrieben" und nicht ausgeführt.