[gelöst] onClick | FW_cmd - call PERL sub with values -> perl-html-javascript

Begonnen von HomeAuto_User, 10 Mai 2019, 17:29:04

Vorheriges Thema - Nächstes Thema

HomeAuto_User

Hallo,

ich möchte eine Oberfläche erstellen wo ich via Klick bestimme Routinen in einem Modul starten kann.
In meinem HTML Code habe ich eine Variable welche ich mit dem Code fülle.

$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung()}&XHR=1\')\" value=\"Text\" %s/>";

Mit diesem Code springe ich direkt in meine Routine.

Nun würde ich gern aber dieser Routine mit Variablen übergeben und erziele kein Erfolg bisher.

Gedanklich müsste es ja so werden
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(Tag,Daten)}&XHR=1\')\" value=\"Text\" %s/>";
Leider geht dies nicht und ich erhalte Barewords ... strict subs

Bitte um Mithilfe  ???
MfG

EDIT Zusammenfassung vom Faden was kein Erfolg brachte:

$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung('".$var1."','".$var2."')}&XHR=1\')\" value=\"Text\" %s/>";
# -> SyntaxError: missing ) after argument list

$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(1,\\\"123e4\\\")}&XHR=1\')\" value=\"Text\" %s/>";
# -> SyntaxError: '' literal not terminated before end of script

$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(1,\"123e4\")}&XHR=1\')\" value=\"Text\" %s/>";
# -> string literal contains an unescaped line break

EDIT last:
Lösung auf der letzten Seite  ;)
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

amenomade

#1
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(".$variableTag.",".$variableDaten.")}&XHR=1\')\" value=\"Text\" %s/>";
Oder Schritt für Schritt zur Erklärung:
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(";
$buttons .= $variableTag;
$buttons .= ",";
$buttons .= $variableDaten;
$buttons .= ")}&XHR=1\')\" value=\"Text\" %s/>";


Aber ich verstehe nicht ganz, warum du diesen Fehler kriegst. Dafür wäre die genaue Fehlermeldung hilfreich. Nw. zeigt Perl genau wo das Problem steht.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

rudolfkoenig

Ist vermutlich die die gleiche Meldung, was man kreigt, wenn man in FHEM
{Entleerung(Tag,Daten)}
eingibt.

amenomade

Du meinst wegen Tag und Daten, oder wegen Leerzeichen vor und nach dem Fuktionsaufruf?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

HomeAuto_User

Zitat von: rudolfkoenig am 10 Mai 2019, 18:22:52
Ist vermutlich die die gleiche Meldung, was man kreigt, wenn man in FHEM
{Entleerung(Tag,Daten)}
eingibt.

Ja richtig, die Fehlermeldung.

Bareword "Tag" not allowed while "strict subs" in use at (eval 178572) line 1.
Bareword "Daten" not allowed while "strict subs" in use at (eval 178572) line 1.


Zitat von: amenomade am 10 Mai 2019, 18:26:59
Du meinst wegen Tag und Daten, oder wegen Leerzeichen vor und nach dem Fuktionsaufruf?

Ich meine den Funktionsaufruf damit die Variablen Tag und Daten übergeben werden können.
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

HomeAuto_User

#5
Wenn ich zum testen manuell in die Kommandozeile
{Entleerung('Tag')}
eingebe, so erhalte ich den Aufruf und die Übergabe.

Wenn ich dies aber in meine Zeile ergänze, so erhalte ich

fhem?detail=SIGNALduino_TOOL line 1:
SyntaxError: missing ) after argument list


Muss da etwas "anders" maskiert werden?

EDIT: geht nicht:
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung('Data')}&XHR=1\')\" value=\"update\" %s/>";
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(\'Data\')}&XHR=1\')\" value=\"update\" %s/>";

EDIT2:
WIESO geht das aber das nicht?

$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd('/fhem?XHR=1&cmd.$name={Entleerung("."124".")}')\" value=\"update\" %s/>";
geht

$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd('/fhem?XHR=1&cmd.$name={Entleerung("."abc".")}')\" value=\"update\" %s/>";
geht NICHT  :o :'(

obwohl ich via Kommandozeile beides manuell übergeben kann?

@Rudi, hast du einen Tip diesbezüglich?

EDIT3:
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd('/fhem?XHR=1&cmd.$name={Entleerung(123e4)}')\" value=\"update\" %s/>";
führt im Code zu 1230000  >:( ???
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

amenomade

#6
Wäre gut wenn Du:
- das ganze zeigen würdest (und nicht nur eine Zeile von Code): wie sieht deine Funktion aus? Wo willst Du diese Zeile hinzufügen?
- die Fehlermeldungen bei jedem Versuch zeigen würdest. Du hast einmal von Barewords und einmal von "missing )" erwähnt. Was heisst jetzt "geht nicht" ?

Das $ vor name sollte noch escaped werden
Was ist übrigens $name

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

HomeAuto_User

#7
Hallo,
hier muss ein internet Fehler vorliegen welchen ich mit deinem Code nachvollziehen konnte.

Zitat von: amenomade am 10 Mai 2019, 17:45:07
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(".$variableTag.",".$variableDaten.")}&XHR=1\')\" value=\"Text\" %s/>";
Oder Schritt für Schritt zur Erklärung:
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(";
$buttons .= $variableTag;
$buttons .= ",";
$buttons .= $variableDaten;
$buttons .= ")}&XHR=1\')\" value=\"Text\" %s/>";


Aber ich verstehe nicht ganz, warum du diesen Fehler kriegst. Dafür wäre die genaue Fehlermeldung hilfreich. Nw. zeigt Perl genau wo das Problem steht.

Sobald ich anstatt Zahlen Buchstaben nehme kommt

2019.05.10 20:12:00 1: ERROR evaluating {Entleerung(2,egon)}: Bareword "egon" not allowed while "strict subs" in use at (eval 192471) line 1.

EDIT: CODE

my $variableTag = "1";
my $variableDaten = "ade";
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(".$variableTag.",".$variableDaten.")}&XHR=1\')\" value=\"Text\" %s/>";


FEHLER:
2019.05.10 20:16:40 1: ERROR evaluating {Entleerung(1,ade)}: Bareword "ade" not allowed while "strict subs" in use at (eval 193248) line 1.

Soory, hatte die Variante mit namen= zum testen ersetzt mit Bsp aus dem Internet, daher weicht der Code ab oben.  ::) Ich sehe dennoch nicht durch wo es zustande kommt.

EDIT TEST 2:
my $variableTag = "1";
my $variableDaten = "\ade";
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(".$variableTag.",".$variableDaten.")}&XHR=1\')\" value=\"Text\" %s/>";

$ret .= "<tr> <td colspan=\"5\" rowspan=\"1\"> <div>$buttons</div> </td></tr>";


Fehler:
2019.05.10 20:25:35 1: ERROR evaluating {Entleerung(1,de)}: Unrecognized character \x07; marked by <-- HERE after leerung(1,<-- HERE near column 15 at (eval 194646) line 1.
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

HomeAuto_User

SEHR KOMISCH wenn ich den Test auch mit Zahlen + Buchstaben vornehme...

my $variableTag = "1";
my $variableDaten = "123a4";
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(".$variableTag.",".$variableDaten.")}&XHR=1\')\" value=\"Text\" %s/>";

$ret .= "<tr> <td colspan=\"5\" rowspan=\"1\"> <div>$buttons</div> </td></tr>";
}

$ret .="</tbody></table>";


Fehler:
2019.05.10 20:33:26 1: PERL WARNING: Bareword found where operator expected at (eval 195917) line 1, near "123a4"
2019.05.10 20:33:26 3: eval: {Entleerung(1,123a4)}
2019.05.10 20:33:26 1: PERL WARNING: (Missing operator before a4?)
2019.05.10 20:33:26 3: eval: {Entleerung(1,123a4)}
2019.05.10 20:33:26 1: ERROR evaluating {Entleerung(1,123a4)}: syntax error at (eval 195917) line 1, near "123a4"


Bei reinen Zahlen klappt es. Kann ich ggf noch wo anders mit "eingreifen" um den Fehler einzugrenzen?
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

amenomade

Das ist nicht komisch, das ist normal. Es geht um Variabletypen und wie Perl damit umgeht, um etwas einen Typ zu geben.

Alle deine Fehler deuten auf dem Parameter womit du die Funktion Entleeren aufrufst.
2019.05.10 20:33:26 1: PERL WARNING: Bareword found where operator expected at (eval 195917) line 1, near "123a4"
2019.05.10 20:33:26 3: eval: {Entleerung(1,123a4)}

Er versucht 123a4 als Kalkulation zu verstehen, deswegen operator expected. Richtige Syntax wäre {Entleerung(1,"123a4")} damit er das als String versteht.

2019.05.10 20:12:00 1: ERROR evaluating {Entleerung(2,egon)}: Bareword "egon" not allowed while "strict subs" in use at (eval 192471) line 1.Er versteht egon als Bareword, da die richtige Syntax {Entleerung(2,"egon")} sein sollte.
Genau das gleiche mit
2019.05.10 20:16:40 1: ERROR evaluating {Entleerung(1,ade)}: Bareword "ade" not allowed while "strict subs" in use at (eval 193248) line 1.

ZitatBei reinen Zahlen klappt es
Ja, weil ein Zahl... ein Zahl ist. Da braucht er nichts zu interpretieren

Also: hör auf wild zu testen, und denk mal nach. Wo sind deine Strings, wo fangen die an, wo enden sie, wie sind sie verschachtelt, mit welchen Deliminer (single oder double quotes), was wird escaped.

Wie soll das finale HTML Code aussehen?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Wenn deine Variable nicht immer numerisch sind, sondern auch alphanumerisch sein können, und es am Ende so aussehen muss:
<INPUT type="reset" onclick="FW_cmd(FW_root+'?cmd={Entleerung("1","123a4")}&XHR=1')" value="Text" %s/>

Dann sollte folgendes Code funktionieren:
{
$var1 = 1;
$var2 = "123a4";
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(\"".$var1."\",\"".$var2."\")}&XHR=1\')\" value=\"Text\" %s/>";;
}

Wenn var1 immer numerisch ist, kannst Du dir die enspr. escaped double quotes sparen. Musst aber nicht.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

HomeAuto_User

Zitat von: amenomade am 10 Mai 2019, 23:19:12
....

Dann sollte folgendes Code funktionieren:
{
$var1 = 1;
$var2 = "123a4";
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(\"".$var1."\",\"".$var2."\")}&XHR=1\')\" value=\"Text\" %s/>";;
}

Wenn var1 immer numerisch ist, kannst Du dir die enspr. escaped double quotes sparen. Musst aber nicht.

bringt mir folgendes

fhem?detail=SIGNALduino_TOOL line 1:
SyntaxError: '' string literal contains an unescaped line break
   ::) :'(
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

amenomade

Kann man bitte ein "list SIGNALduino_TOOL" sehen?
Du hast immer noch nicht erwähnt WO Du dieses Code nutzen möchtest.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

HomeAuto_User

#13
Zitat von: amenomade am 11 Mai 2019, 00:33:53
Kann man bitte ein "list SIGNALduino_TOOL" sehen?

Hier hast du das List von dem Modul wo ich es hereingenommen hatte zum testen.

Internals:
   FUUID      5c44efd0-f33f-08a5-fbb9-57b647266a77e9ae
   NAME       SIGNALduino_TOOL
   NR         561
   NTFY_ORDER 50-SIGNALduino_TOOL
   STATE      RAWMSG dispatched
   TYPE       SIGNALduino_TOOL
   Version    2019-05-09
   dispatchDevice ABS700_79
   dispatchDeviceTime 2019-05-11 00:33:22
   dispatchOption from SD_Device_ProtocolList.json
   dispatchSTATE T: 3.3
   OLDREADINGS:
   READINGS:
     2019-05-11 00:33:22   cmd_raw         D=110001001111000000111000001100000000
     2019-05-11 00:33:22   cmd_sendMSG     set sduino_dummy sendMSG s4F038300#R5
     2019-05-11 00:33:22   decoded_Protocol_ID 0
     2019-05-11 00:33:22   last_DMSG       s4F038300
     2019-05-11 00:33:22   last_MSG        MS;P1=-7949;P2=492;P3=-1978;P4=-3970;D=21232423232424242423232323232324242423232323232424;CP=2;SP=1;R=245;O;
     2019-05-11 00:33:22   message_dispatched 1
     2019-05-11 00:33:22   message_to_module CUL_TCM97001
     2019-05-11 00:33:22   state           RAWMSG dispatched
   helper:
     NTFY_SEARCH_Time 2019-05-11 00:33:22
     NTFY_SEARCH_Value s4F038300
Attributes:
   DispatchMax 100
   DispatchModule -
   Dummyname  sduino_dummy
   Filename_export SIGNALduino_TOOL_output.txt
   Filename_input SIGNALduino_TOOL_input.txt
   Path       ./SD_TOOL/
   StartString MU;
   cmdIcon    START:remotecontrol/black_btn_PS3Start Dispatch_RAWMSG_last:remotecontrol/black_btn_BACKDroid
   room       SIGNALduino_un
   userattr   DispatchModule:-,CUL_EM,CUL_FHTTK,CUL_TCM.txt,CUL_TCM97001,CUL_TX,CUL_WS,Dooya,FHT,FLAMINGO,FS10,FS20,Hideki,IT,OREGON,RFXX10REC,SD_BELL,SD_BELL.txt,SD_Keeloq,SD_Keeloq.txt,SD_RSL.txt,SD_UT,SD_UT.txt,SD_Unknown.txt,SD_WS,SD_WS.txt,SD_WS07,SD_WS09,SD_WS_Maverick,SOMFY
   verbose    3
   webCmd     START:Dispatch_RAWMSG_last


EDIT:
Ich habe nun das ganze mal fix in ein kleines Beispiel hereingenommen wo nur der Code drin ist.
Vielleicht kannst du da mal dies bei dir testen und somit die Umsetzung von mir nachempfinden wo der Fehler liegt bei mir.

Fehler wie bekannt: fhem?detail=123 line 1:
SyntaxError: '' string literal contains an unescaped line break


ZitatDu hast immer noch nicht erwähnt WO Du dieses Code nutzen möchtest.
-> siehe Beispielcode im Anhang.

Im Voraus schon einmal danke  8)
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet

HomeAuto_User

#14
Hallo,

@amenomade

Ich habe getestet und komme zu einem sehr komischen Verhalten was ich versuche herauszubekommen.
Wenn ich das BeiSpielModul welches ich hier nochmal anhänge, nutze, so klappt es.

Wenn ich diesen Code in mein anderes Modul einarbeite, so klappt dieser nur wenn ich "Zahlen" nutze obwohl die Zeile kopiert wurde.
Gibt es eine bestimmte Reihenfolge welche eingehalten werden muss oder wieso erhalte ich ausgerechnet dort dann den Fehler
Bareword "Modulname" not allowed while "strict subs" in use at (eval 898)  ::) :o

Kann es durch Copy&Paste oder durch eine andere Funktion oder Funktionsaufruf dadurch gehindert werden?

EDIT:
SO soll es aussehn {Entleerung(1,"test")}

Da ist die Variante um Zahlen weiterzugeben

$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(";
$buttons .= $var1;
$buttons .= ",";
$buttons .= $var2;  # zahl
$buttons .= ")}&XHR=1\')\" value=\"update_Data\" %s/>";


Sobald ich nun Texte nutzen möchte, wäre doch nach deiner Aussage dies dazu zu nutzen:
$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(";
$buttons .= $var1;
$buttons .= ",";         ### Komma wie in Kommandozeile
$buttons .= "\"";         ### maskierung
$buttons .= $var2;   ### text
$buttons .= "\"";         ### maskierung
$buttons .= ")}&XHR=1\')\" value=\"update_Data\" %s/>";


geht aber nicht leider!

SyntaxError: '' string literal contains an unescaped line break

EDIT 2:

Sobald ich irgendeine Maskierung in den Zeilen hinzufügen möchte kommt der Fehler. So im Anhang funktioniert er aber soabld ich Variable 2 als Text maskieren möchte schlägt es fehl.
my $var1 = 1;
my $var2 = 2;

$buttons = "<INPUT type=\"reset\" onclick=\"FW_cmd(FW_root+\'?cmd={Entleerung(";
$buttons .= $var1; # variable 1 Zahl
$buttons .= ","; # Trennung
$buttons .= ""; # eventuelles Zwischenzeichen - Maskierung
$buttons .= $var2; # variable 2
$buttons .= ""; # eventuelles Zwischenzeichen - Maskierung
$buttons .= ")}&XHR=1\')\" value=\"update_Data\" %s/>";

Log3 $name, 3, "$name: TEST -> ".$buttons;
$ret .= "<tr> <td colspan=\"5\" rowspan=\"1\" align=\"center\"> <div>$buttons</div> </td></tr>";
"Developer" heißt nicht, das man alles wissen kann!
- FHEM v5.9 | Rasberry PI 3
- radino CC1101 433Mhz (SIGNALduino)| - radino CC1101 868Mhz (CUL) | nano 433Mhz (SIGNALduino) - Sensoren: purer Dschungel querbeet