[Gelöst] Wie kann man Variablen zusammensetzen?

Begonnen von mi.ke, 17 Februar 2018, 14:31:47

Vorheriges Thema - Nächstes Thema

mi.ke

Moin.

Leider hat die Suche nicht das gewünschte Ergebnis geliefert, vermutlich weil ich die Frage schlecht gestellt habe, deswegen die Bitte um Hilfe. Bestimmt ganz trivial, aber ichbekomm es halt nciht hin

Ich möchte bei notifys nicht über den Readingnamen gehen, sonder über die Variable $NAME.
So weit, so einfach.

Jetzt muss ich diese Variable aber zur weiteren Verarbeitung zusammensetzen.

Also z.B. $NAME

$NAME_etwashintendran
wasvornedran_$NAME
vorne_$NAME_hinten
$NAME_$ETC


$A = (ReadingsVal("text_$NAME","state","")- $DA);



Da gibt es doch bestimmt einen normierte Schreibweise?

Kann mir bitte jemand einen Tip geben?

Danke im Voraus

mi.ke
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

KernSani

Da würde ich mal nach sowas wie ,,perl concatenate" o.ä. googeln oder einfach einen Punkt (,,.") probieren...


Kurz, weil mobil...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

mi.ke

also was nicht geht (ich hatte natürlich vorher schon alles Mögliche probiert)

$A = (ReadingsVal("text_.$NAME","state","")- $DA);
$A = (ReadingsVal("text_ . $NAME","state","")- $DA);
$A = (ReadingsVal("text_."$NAME"","state","")- $DA);

FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

Otto123

#3
Hast Du mal probiert im notify?
{Log 1, "$EVENT $NAME Text_$NAME"}

Zitat$NAME_etwashintendran
wasvornedran_$NAME
vorne_$NAME_hinten
$NAME_$ETC
Das wirkt innerhalb von "" genauso so wie Du willst, wenn ich Dich richtig verstanden habe.

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

mi.ke

also was funktioniert ist, wenn VORHER alles definiert wird


my $vA = "vorher_";
my $nA = "_nacher";
my $A_NAME = "$vA$NAME$nA";
$A = (ReadingsVal("$A_NAME","state",""));


Was ich gesucht hatte war eine schreibweise, wie man Variablen und Text in EINEM String verheiraten kann.
Also in Etwas so:
"'vorher_'.$NAME.'_nacher'"
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

Otto123

Du hast mein Besipiel nicht probiert oder?
Probier mal dies in der FHEM Kommanozeile:
{"Zeit: $hour"} oder {my $a="Zeit: $hour";; return $a}

Es ist überall Perl, warum sollte das nicht gehen?

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

mi.ke

Dein Beispiel funktioniert, ja.
Danke dafür
Leider war Dein Beispiel nicht die Antwort auf meine Frage.

Denn
$A = (ReadingsVal("Text_$NAME","state",""));
funktioniert nicht.
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

Otto123

Die schönste Aussage: funktioniert nicht   :'(
Funktioniert getestet
{Log 1, ReadingsVal($NAME,"Text_".$NAME,"") }
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

mi.ke

Och Otto.

Schönste Aussage . . .
Natürlich funktioniert
$A = (ReadingsVal("Text_$NAME","state",""));nicht !!!

Von den 3 von Dir angebotenen Lösungen funkioniert die letzte, danke dafür, damit komm ich weiter.

Lieben Gruß
mi.ke
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

marvin78

Du solltest genauer arbeiten. Das was Otto schrieb funktioniert, weil es was anderes ist, als das von dir probierte. Dass er überhaupt so geduldig mit Leuten wie dir ist, ist aus deiner Sicht mit Dank zu quittieren, nicht mit patzigen Antworten. Demnächst postest du einfach Fehlermeldung und log und alles ist gut.

mi.ke

Zitat von: marvin78 am 17 Februar 2018, 18:21:44
Du solltest genauer arbeiten. Das was Otto schrieb funktioniert, weil es was anderes ist, als das von dir probierte. Dass er überhaupt so geduldig mit Leuten wie dir ist, ist aus deiner Sicht mit Dank zu quittieren, nicht mit patzigen Antworten. Demnächst postest du einfach Fehlermeldung und log und alles ist gut.

Normalerweise antworte ich nicht auf solche Troll Posts "Ihr seit alle undankbar"
Zähl mal, wie oft ich mich bedankt habe in diesem Thread.

Allerdings solltest Du Dich hinterfragen: "überhaupt so geduldig mit Leuten wie dir ist"

Und . . .
ach weisste, ich geb auf.

Schönes Wochenende

PS.
Otto, nochmal Danke




FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

marvin78

Dumm nur, dass du das Problem nicht verstanden hast und leider wieder kommst.

KernSani

Leute, haben wir Vollmond oder was? Holt doch alle mal tief Luft und entspannt euch.

@mi.ke: Ich gehe davon aus, dass du verstanden hast, dass eine Aussage "funktioniert nicht" relativ sinnlos ist, wenn keine näheren Angaben geliefert werden, was nicht funktioniert. Und - da hat Marvin recht - wenn dir jemand versucht zu helfen, ist es im Normalfall unklug, patzige Kommentare zu machen, sonst ist der Helfende ganz schnell weg.
@Marvin78: So sehr ich dein Fachwissen und deine Hilfsbereitschaft schätze, ist keinem damit geholfen, wenn hier schräg reingegrätscht und der TE "beschimpft" wird. Im Zweifelsfall wird sich Otto selbst zu helfen wissen.

Zusammenfassung: Habt euch alle lieb und tragt dazu bei, dass das Forum weiter seinen freundlichen und hilfsbereiten Charakter behält. Danke :-)
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

marvin78

Sorry, aber ich werde das bei Wiederholungstätern immer wieder so machen. Wenn es keinerlei Interesse daran gibt, Dinge zu verstehen, ist das die richtige Art und Weise. Wenn ich schimpfe, hört sich das anders an.

mi.ke

#14




Zitat von: marvin78 am 17 Februar 2018, 19:31:58
Sorry, aber ich werde das bei Wiederholungstätern immer wieder so machen. Wenn es keinerlei Interesse daran gibt, Dinge zu verstehen, ist das die richtige Art und Weise. Wenn ich schimpfe, hört sich das anders an.


. . . und genau das mit dem Wiederholungstäter nehm ich Dir extrem krumm.
Ich bin jetzt seit 6 Jahren hier an Board, hab mit Sicherheit mehr versucht zu helfen als gefragt.
Ich hab mehrere 1000 Stunden investiert, um mein eigenes Ding zu bauen und zu verstehen und nicht bei irgendeinem abzukupfern.
Ach weisste, ich muss mich hier gar mich rechtfertigen.
Lies lieber Du mal in Ruhe, bevor Du irgendjemanden angreiftst,


FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

Otto123

#15
Moin,

also ein letzter Versuch. Es gab von Dir drei Fragen:
Wie kann man Variablen zusammensetzen?
Da gibt es doch bestimmt einen normierte Schreibweise?
Kann mir bitte jemand einen Tip geben?

Die habe ich versucht zu beantworten. Und zwar nicht nur mit "Aussagen", sondern ich habe nebenbei alles auch getestet und Dir etwas nachvollziehbares geliefert.

Dein letzter Code:$A = (ReadingsVal("Text_$NAME","state",""));Mein letzer Code:{Log 1, ReadingsVal($NAME,"Text_".$NAME,"") }

Siehst Du den Unterschied zwischen "Text_$NAME" und "Text_".$NAME beim genauen Hinsehen?

Aber beide Schreibweisen sind, wie ich Dir in den anderen Beispielen nachvollziehbar gezeigt habe, die Antwort auf Deine erste Frage.
Die Antwort auf Deine zweite Frage lautet: Ja, aber - Es hängt von der genauen Anwendung ab. Leider!

Ich weiß das auch bloß nicht exakt, ich muss es testen. Deswegen war meine erste Antwort vielleicht nicht exakt auf Dein Anwendungsbeispiel zugeschnitten. Der Test mit ReadingsVal war etwas aufwendiger und ich habe etwas umständlich gedacht und mir erst Dummys und notify gebaut.
Aber eigentlich war ja die allererste Antwort von KernSani schon die richtige.  :D

Und die Kopie eine Fehlermeldung als Ergänzung zu "es funktioniert nicht" ist doch nicht zuviel verlangt. Man bekommt doch eine Fehlermeldung, wenn man das mit ReadingsVal falsch im Editor einträgt.

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

mi.ke

#16
Hi Otto,
danke das Du noch mal so genau auf das Thema eingegangen bist.

Zitat von: Otto123 am 18 Februar 2018, 07:58:19
Siehst Du den Unterschied zwischen "Text_$NAME" und "Text_".$NAME beim genauen Hinsehen?

Ich hatte ja geschrieben, dass diese Schreibweise eine gangbare Lösung ist.

Der Vorschlag von KernSani bezog sich, wie ich es verstanden hatten, auf die Punktierung.
Der Schlüssel scheint aber das unterschiedliche setzen der Anführungszeichen zu sein.

In Deinem "Zeit-Beispiel"  . . .
{"Zeit: $hour"}
. . . sind Text und und Variable innerhalb der Anführungszeichen. Und es funktioniert ja auch.
Beim lesen des Readings oder des Attributes muss die Variable aber anscheinend zwingend ausserhalb der " "  stehen und der Text wird maskiert.

Zusammenfassend:
Wie schon am Anfang des Thread erwähnt, können in solchen Fällen die Textbausteine in Variablen geschrieben werden. Dann lassen sie sich einfach hintereinander schreiben (mit und ohne Punkt)
my $vA = "vorher_";
my $nA = "_nacher";
my $A_NAME = "$vA$NAME$nA";
$A = (ReadingsVal("$A_NAME","state",""));


Wie jetzt gelernt, muss die Variable beim direkten verheiraten ausserhab der  " " stehen
$A = (ReadingsVal("vorher_".$NAME."_nachher","state",""));
und mit Punkt(en) maskiert werden.

Den Post lass ich bis heute Abend offen, falls inhaltlich etwas hinzuzufügen wäre. Dann schließ ich ihn als gelöst.

Vielen Dank an Otto und KernSani für die Unterstützung.

Cheers
mi.ke
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

CoolTux

Zitat von: mi.ke am 18 Februar 2018, 13:32:37
Wie jetzt gelernt, muss die Variable beim direkten verheiraten ausserhab der  " " stehen
$A = (ReadingsVal("vorher_".$NAME."_nachher","state",""));
und mit Punkt(en) maskiert werden.

Cheers
mi.ke

Der Punkt maskiert nicht, er verbindet.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Otto123

Ich nerv nochmal. ;D
Ich habe noch ein wenig recherchiert. Wenn ich das richtig verstanden habe, ist in Perl ist ja eigentlich bei Strings sowohl Interpolation als auch concatenation möglich.
Interpolation  -> my $a = "Hallo"; my $b = "$a Welt"
concatenation -> my $a = "Hallo"; my $b = $a." Welt"
$b enthält in beiden Fällen "Hallo Welt"

Deswegen noch meine Fragen in die Runde:
- Ist es so, dass die Pflicht zur Verwendung von concatenation quasi nur eine Einschränkung von ReadingsVal & Co ist?
- Oder liegt der Grund woanders?
- Muss man generell probieren wie es geht?
- Oder ist concatenation immer vorzuziehen?

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

uelpenich

Hallo,
ich bin sehr an diesem Thema interessiert und habe diesen Thread mehrfach rauf und runter gelesen, ohne jedoch alles zu verstehen. Ich habe gelernt, wie man mit verschiedenen Hilfskonstruktionen das Zusammensetzen von Zeichenketten und Variablenwerten bewerkstelligt. Ich bin aber überfordert, diese Beispiele konkret in eine Notify Definition einzusetzen.

Meine Aufgabenstellung ist:
ich habe 8 1-Wire Thermometer, deren Temperaturwerte auf 8 Gruppenadressen ins KNX übertragen werden sollen.
Diese acht 1-Wire Thermometer sind wie folgendes Beispiel definiert:
define EG_HKV_RL_Bad OWTHERM DS18B20 0E3979A21903 300
setuuid EG_HKV_RL_Bad 5d8dbae6-f33f-4cb6-e9c6-c1fc76a2af96afa7
attr EG_HKV_RL_Bad IODev myOWFS
attr EG_HKV_RL_Bad event-on-update-reading state
attr EG_HKV_RL_Bad group EG_HKV
attr EG_HKV_RL_Bad model DS18B20
attr EG_HKV_RL_Bad room Erdgeschoss
attr EG_HKV_RL_Bad stateFormat {sprintf("%.1f",ReadingsVal($name,"temperature",0))."°C"}
attr EG_HKV_RL_Bad tempConv onkick
attr EG_HKV_RL_Bad tempHigh 73
attr EG_HKV_RL_Bad tempLow -1
attr EG_HKV_RL_Bad tempOffset -0.69
attr EG_HKV_RL_Bad tempUnit Celsius


Der reguläre Ausdruck im Suchmuster des Notify sowie die Variablen im Commandteil erlauben es mir, mit einem Notify mehrere Temperaturwerte an die KNX Gruppenadressen zu übertragen.

Die zugehörigen KNX Gruppenadressen habe ich so defniert:
define GA_EG_HKV_Bad KNX 2/6/1:dpt9.001:x2
setuuid GA_EG_HKV_Bad 5e384361-f33f-4cb6-7e03-d4c07a73a4926e00
attr GA_EG_HKV_Bad IODev knx
attr GA_EG_HKV_Bad group GA_EG_FBH
attr GA_EG_HKV_Bad room Erdgeschoss FBH,Erdgeschoss
attr GA_EG_HKV_Bad slider 18,1,30
attr GA_EG_HKV_Bad stateFormat {sprintf("%.1f",ReadingsVal($name,"x2-set",0))."°C"}
attr GA_EG_HKV_Bad webCmd state


Ich habe eine Lösung für das Problem "wasvornedran_$NAME" gefunden.
Deswegen haben die KNX Gruppenadressen etwas "vornedran" (EG_HKV_RL_Bad -> GA_EG_HKV_RL_Bad)

Mein Notify sieht so aus:
define EG_HKV_GA notify EG_HKV_.*T:.* set GA_$NAME $EVTPART1
setuuid EG_HKV_GA 5e384361-f33f-4cb6-0e97-116a28f403cec6f4
attr EG_HKV_GA group EG_FBH
attr EG_HKV_GA room Erdgeschoss FBH,Erdgeschoss


Alles funktioniert wie gewünscht.

Und nun zu meiner Frage:
Wenn ich aus taktischen Gründen meinen KNX-Devicenamen etwas anhängen will "$NAME_etwashintendran", wie muss ich dann den Command Teil im Notify schreiben?

PS: ich habe viel probiert und möglicherweise vor lauter Bäumen den Wald nicht gesehen. Das Problem liegt wohl daran, dass Perl die Variablennamen nicht nach hinten abgrenzt und daher nicht entscheiden kann, wo der Variablennamen aufhört und das "hintendran" beginnt. Die Unterscheidung zwischen "vornedran" und dem Variablennamen ist durch das Dollarzeichen gegeben.
Ich habe keinen Weg gefunden, den Command Teil wie in diesem Thread diskutiert mit "" . so zu formulieren, dass es funktioniert.

Christoph Morrison

Zitat von: Otto123 am 19 Februar 2018, 09:09:59
Deswegen noch meine Fragen in die Runde:
- Ist es so, dass die Pflicht zur Verwendung von concatenation quasi nur eine Einschränkung von ReadingsVal & Co ist?
- Oder liegt der Grund woanders?
- Muss man generell probieren wie es geht?
- Oder ist concatenation immer vorzuziehen?

Gut dass uelpenich den Thread wiederbelebt hat  8)

Die Antwort ist 2 - der Grund liegt woanders. Es liegt im Beispiel von mi.ke daran, dass _ und der Variablenname zusammenhängen und der Perl-Interpreter dann nicht mehr identifizieren kann, wo die Variable aufhört. Folgende Beispiele verdeutlichen es - man achte auf Variante 0 und 1:


use v5.10;

my $var = "pedo";
say "Variante #0: ", "$var_mellon a minno";
say "Variante #0: ", "${var}_mellon a minno";
say "Variante #2: ", "$var mellon a minno";
say "Variante #3: ", $var . " mellon a minno";


ergibt:


Variante #0:  a minno
Variante #0: pedo_mellon a minno
Variante #2: pedo mellon a minno
Variante #3: pedo mellon a minno


In Variante 0 ist es dem Perl-Interpreter nicht möglich $var zu erkennen, da $var_mellon ein erkanntes Lexem ist, dem aber kein Speicherinhalt zugewiesen wurde.

Mit use warnings meckert der Interpreter dann auch:

Name "main::var_mellon" used only once: possible typo at scratch_2.pm line 5.
Use of uninitialized value $var_mellon in concatenation (.) or string at scratch_2.pm line 5.


Zu deiner Frage, uelpenich:
Zitat
Wenn ich aus taktischen Gründen meinen KNX-Devicenamen etwas anhängen will "$NAME_etwashintendran", wie muss ich dann den Command Teil im Notify schreiben?

$NAME_etwashintendran muss ${NAME}_etwashintendran heißen, dann klappt's auch mit dem Appendix.

Siehe auch:
Interpolating Functions and Expressions Within Strings



uelpenich

#21
Zitat$NAME_etwashintendran muss ${NAME}_etwashintendran heißen, dann klappt's auch mit dem Appendix.
Nachdem das {Klammern} des Variablen Namens gut funktioniert hat, wird es in der jetzigen Perl Version als "veraltet" gekennzeichnet mit tötlichem Ausgang ab Perl 5.30
Zitat2020.10.25 20:38:00 1: PERL WARNING: Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by <-- HERE in m/^(GA_${ <-- HERE NAME})$/ at fhem.pl line 1331.
2020.10.25 20:38:00 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.25 20:44:32 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.25 20:44:34 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.25 20:44:35 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.25 20:44:36 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.25 20:44:37 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.25 20:44:38 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.25 20:44:39 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.25 20:44:41 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.25 20:44:42 3: EG_HKV_GA return value: Please define GA_${NAME} first
Wie würde ein  "escaped left brace in regex" aussehen?

Otto123

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

uelpenich

Danke für die schnelle Antwort.
Es scheint nicht so einfach zu sein. Im Logfile tauchen dann folgende Fehlermeldungen auf:
2020.10.25 23:11:10 3: EG_HKV_GA return value: Please define GA_$\{NAME} first

Um den Zusammenhang darzustellen:
#
define GA_EG_HKV_VL_alles KNX 2/6/9:dpt9.001:x2
setuuid GA_EG_HKV_VL_alles 5e388825-f33f-4cb6-90f5-6788ebbb57e607a1
attr GA_EG_HKV_VL_alles IODev knx
attr GA_EG_HKV_VL_alles group GA_EG_FBH
attr GA_EG_HKV_VL_alles room Erdgeschoss FBH,Erdgeschoss
attr GA_EG_HKV_VL_alles webCmd state
attr GA_EG_HKV_VL_alles widgetOverride x2:slider,18,1,30
## attr GA_EG_HKV_VL_alles slider 18,1,30
## attr GA_EG_HKV_VL_alles stateFormat {sprintf("%.1f",ReadingsVal($name,"x2-set",0))."°C"}
#
# --------------------- Notify zum Befüllen der GAs ----------------------------------
#
#   etwasvornedran_${NAME}   ist veraltet und funktioniert nicht mehr
#   etwasvornedran_$NAME      funktioniert
#   $NAME_etwashintendran     eine Lösung wird gesucht, das Klammern des Variablennamen ${NAME} ist veraltet
#
define EG_HKV_GA notify EG_HKV_.*T:.* set GA_$NAME $EVTPART1
setuuid EG_HKV_GA 5e384361-f33f-4cb6-0e97-116a28f403cec6f4
attr EG_HKV_GA group EG_FBH
attr EG_HKV_GA room Erdgeschoss FBH,Erdgeschoss
#

Otto123

Ich bin nicht so der Perlexperte - aber ich lese die Warnung irgendwie anders.

Erstmal sollte der Code so noch funktionieren.
Dein Code ist kein regex, aber die Warnung bezieht sich auf ein regex - eventuell ist das ein sekundärer Effekt?
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

CoolTux

Mich würde die komplette Fehlermeldung interessieren

Zitat von: uelpenich am 25 Oktober 2020, 22:18:20
2020.10.25 21:22:01 1: PERL WARNING: Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by <-- HERE in m/^(GA_${ <-- HERE NAME})$/ at fhem.pl lin

da fehlt die Zeilennummer an Ende.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Otto123

Beim wiederholten lesen fällt mir auf: steht denn irgendwo, dass der FHEM Interpreter anstatt set GA_$NAME $EVTPART1 set GA_${NAME} $EVTPART1 verarbeiten kann (muss)?

Sollte man da nicht besser gleich auf Perl Ebene wechseln?
{my $dev="GA_${NAME}";;fhem("set $dev  $EVTPART1")}
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

uelpenich

Zitatda fehlt die Zeilennummer an Ende.
Ich habe oben die Zeilennummer und die Folgezeilen nachgetragen.

ZitatErstmal sollte der Code so noch funktionieren.
Dein Code ist kein regex, aber die Warnung bezieht sich auf ein regex - eventuell ist das ein sekundärer Effekt?
Der Code funktioniert nicht mehr, das kann man an den folgenden Fehlermeldungen sehen:
Zitat2020.10.25 20:38:00 3: EG_HKV_GA return value: Please define GA_${NAME} first
Ich lese diese Fehlermeldung so, dass die Variable nicht mehr evaluiert wird.

ZitatBeim wiederholten lesen fällt mir auf: steht denn irgendwo, dass der FHEM Interpreter anstatt set GA_$NAME $EVTPART1 set GA_${NAME} $EVTPART1 verarbeiten kann (muss)?
Die Notation der Variablen war ein Vorschlag von Christoph Morrison weiter oben
(https://forum.fhem.de/index.php/topic,84511.msg1020936.html#msg1020936)
Das hat bis zum letzten Update (apt-get update) funktioniert.

Christoph Morrison

Schätze mal uelpenich hat nicht die letzte Version der fhem.pl.

In einer älteren Version steht dort:
if (($op eq  "=" && $val =~ m/$lre/s) ||

Glaskugel: devspec2array macht aus GA_${NAME} ein Regex und da sind die Klammern nicht escaped.

Otto123

Ihr müsst meine Anmerkung nicht ernst nehmen, aber sie ist gut gemeint ;)

Wenn etwas funktioniert obwohl es nicht in der Doku steht, kann es sich auch um einen Fehler handeln.
Bei Softwareentwicklung gilt: Es besteht kein Rechtsanspruch auf die Beibehaltung von Fehlern.

Es existiert eine einfache und dokumentierte Lösung. Also warum das Pferd rückwärts reiten?

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

Christoph Morrison

Zitat von: Otto123 am 26 Oktober 2020, 23:00:33
Ihr müsst meine Anmerkung nicht ernst nehmen, aber sie ist gut gemeint ;)

Wenn etwas funktioniert obwohl es nicht in der Doku steht, kann es sich auch um einen Fehler handeln.
Bei Softwareentwicklung gilt: Es besteht kein Rechtsanspruch auf die Beibehaltung von Fehlern.

Ich sehe nicht, wieso das eine Sache des FHEM-Interpreters sein sollte. Der "Fehler" (das Warning) entstand ja durch eine Änderung am Perl-Interpreter in Vorgriff auf 5.30, nicht am Parsing von devspec2array.

Zitat von: Otto123 am 26 Oktober 2020, 23:00:33
Es existiert eine einfache und dokumentierte Lösung. Also warum das Pferd rückwärts reiten?

Es gibt mehr als einen Weg ein Pferd zu reiten ;-)
Aber ja, deinen Weg wäre ich auch gegangen.

Otto123

Naja, das mit dem Warning verstehe ich auch noch nicht: ein Warning verhindert normal nicht die Ausführung.
Aber es gibt die Fehlermeldung (Please define GA_${NAME} first) die verhindert dann die Ausführung. Sagt aber eigentlich, das FHEM mit GA_${NAME} nix anfangen kann?
In der Doku steht man kann $NAME verwenden, dass man auch ${NAME} verwenden kann steht da nicht. Kann sein ich bin ein Erbsenzähler :)
Aber manche Sachen baut Rudi ja auch bewusst ein und dokumentiert sie erstmal nicht ;)
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

uelpenich

ZitatSchätze mal uelpenich hat nicht die letzte Version der fhem.pl.
Nach einem fhem update ist die Warnung einige Zeilen höher gewandert:
2020.10.26 23:22:43 1: PERL WARNING: Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by <-- HERE in m/^(GA_${ <-- HERE NAME})$/ at fhem.pl line 1323.
2020.10.26 23:22:43 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.26 23:22:44 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.26 23:22:44 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.26 23:22:45 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.26 23:22:47 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.26 23:22:48 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.26 23:22:49 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.26 23:22:50 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.26 23:22:51 3: EG_HKV_GA return value: Please define GA_${NAME} first
2020.10.26 23:22:52 3: EG_HKV_GA return value: Please define GA_${NAME} first


ZitatWenn etwas funktioniert obwohl es nicht in der Doku steht, kann es sich auch um einen Fehler handeln.
Ich mag auch keine "undocumented features".
ZitatEs existiert eine einfache und dokumentierte Lösung.
Es tut mir leid, in diesem Thread habe ich die einfache und dokumentierte Lösung nicht gesehen.
ZitatAlso warum das Pferd rückwärts reiten?
Mir ist nicht aufgefallen, dass ich verkehrt auf dem Pferd sitze.

ZitatIn der Doku steht man kann $NAME verwenden, dass man auch ${NAME} verwenden kann steht da nicht. Kann sein ich bin ein Erbsenzähler
Noch einmal zurück auf meine ursprüngliche Fragestellung.
Es geht um zwei Fälle: wasvornedran_$NAME und $NAME_etwashintendran
wasvornedran_$NAME funktioniert.
$NAME_etwashintendran kann nicht funktionieren, da Perl nicht wissen kann, wo der Variablenname aufhört und _etwashintendran anfängt. Der Lösungsvorschlag ist die Klammerung ${NAME}_etwashintendran
Zitat$NAME_etwashintendran muss ${NAME}_etwashintendran heißen, dann klappt's auch mit dem Appendix.
Ich habe nie ausprobiert, ob ${NAME}_etwashintendran funktioniert.

Aus ${NAME}_etwashintendran habe ich geschlossen, dass auch wasvornedran_${NAME} funktionieren sollte. Liege ich falsch mit meiner Folgerung? Ist Perl so unübersichtlich, dass nur ${NAME}_etwashintendran und wasvornedran_$NAME funktionieren?

Otto123

ZitatEs tut mir leid, in diesem Thread habe ich die einfache und dokumentierte Lösung nicht gesehen.
mein Vorschlag stand in #26
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