myUtils Funktion mit WGET... ich stehe auf dem Schlauch

Begonnen von sprudelverduenner, 19 September 2022, 21:38:38

Vorheriges Thema - Nächstes Thema

sprudelverduenner

Hallo FHEMler,

ich benötige bitte mal Euer Schwarmwissen.

Ich habe ein OLED Display an einem ESP12 angeschlossen - geflasht mit ESPEASY als Software.

Mit dem Befehl:http://IPdesESP/control?cmd=oled,zeile,spalte,text kann ich einen Text ans Display senden.

In der MyUtils habe ich eine Funktion definiert:sub displayhaustuer($$$) {
my ($row,$col,$text) = @_;
{ system("wget -q -O- 'http://192.168.1.105/control?cmd=oled,$row,$col,$text'"); }
}


Mit dem Befehldisplayhaustuer("5","6","Text2"); kann ich nun in die Zeile 5 an die Spalte 6 den Text Text2 darstellen.

Das hat auch sehr gut funktioniert bis ich die 4 Jahre alte Firmware des ESP aktualisiert habe.


Was ich schon herausgefunden habe: die Syntax des http-Befehls hat sich wohl geändert. der text sollte jetzt in " oder ' gesetzt werden - ansonsten kommt es zu Fehldarstellungen. Dass heisst der Befehl lautet nun:http://IPdesESP/control?cmd=oled,zeile,spalte,'text'

Jetzt die Frage: wie baue ich das in meine Funktion, oder meinem Befehl der auf meine Funktion verweist, ein??

Alles was ich bisher versucht habe funktionierte nicht...

Kann mir jemand auf die Sprünge helfen?

Vielen Dank vorab.
MfG Sprudelverduenner
FHEM @ RaspberryPi 3, HMLAN, HMUART + HMRS485, Homematic, ESPEasy @ Sonoff / Shelly / ESP8266, ZigBee @ CC2531
Echo Dot, Dreambox, Yamaha MusicCast, Logitech Hub, LW-12, LD382
FRITZ!Box 7590 AX, Mesh @ FRITZ!Repeater 2400, FRITZ!Fon, iPhone 13, iPad Air 5, AppleWatch 8

Otto123

Hi,

Idee - escapen/schützen:
{ system("wget -q -O- 'http://192.168.1.105/control?cmd=oled,$row,$col,\"$text\"'") }

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

Ist es so das man die " um $text escapen muss ? Ich wollte gerade den gleichen Vorschlag machen ohne zu escapen, wenn man aussen die einfachen nimmt.

TomLee

Nee, falsch und zu schnell gelesen,da ich auch gerade antworten wollte, so mein ich:

{ system('wget -q -O- "http://192.168.1.105/control?cmd=oled,$row,$col,"$text""') }

Otto123

Naja er hat schon beide Hochkommas im Einsatz. Eventuell geht auch:
{ system("wget -q -O- http://192.168.1.105/control?cmd=oled,$row,$col,'$text'") }
Ich bin immer wieder unsicher in welcher Schachtelung die Variablen aufgelöst werden, dieser Test hilft bei der shell :)
text=willi
echo "Der '$text' ist lustig"

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

MadMax-FHEM

So sollte gehen:


{ system("wget -q -O- \"http://192.168.1.105/control?cmd=oled,$row,$col,\"$text\"\"") }


Sofern das http im wget tatsächlich in Anführungszeichen muss...
...ansonsten kann auch 1x \" weg...

Oder das mit dem q bzw. qq?

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

TomLee

ZitatIch bin immer wieder unsicher in welcher Schachtelung die Variablen aufgelöst werden,

Das ne Variable in einfachen nicht aufgelöst wird, hab ich bisher aber verinnerlicht.

Mit q() oder qq() wär wohl die eleganteste Variante , da gibts bei mir aber immer noch ?, darum hab ichs erst gar nicht so vorgeschlagen.

Otto123

Zitat von: TomLee am 19 September 2022, 22:39:12
Das ne Variable in einfachen nicht aufgelöst wird, hab ich bisher aber verinnerlicht.
In meinem Beispiel oben wird die Variable in den einfachen aber aufgelöst - weil außen die doppelten sind :) es ist nicht immer ganz einfach ...
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

Zitates ist nicht immer ganz einfach ...

Oh ja  ::), ich frage mich aber jetzt warum du das im Terminal machst, das dann doch kein Perl, verhält sich das im Teminal immer gleich wie in Perl ?

Otto123

Hallo TomLee,

wohl etwas abgelenkt davon das es ein system Aufruf ist, der dann in der Shell landet :)
Aber klar die Variablen werden hier in Perl aufgelöst. Das Beispiel verhält sich aber gleich:
{my $text='Willi';;return "Der '$text' ist lustig."}

Ich meine der Aufruf sollte so funktionieren, ich denke das wget '..' ist überflüssig
system("wget -q -O- http://192.168.1.105/control?cmd=oled,$row,$col,'$text' ")

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

betateilchen

Warum eigentlich den Umweg über wget und das Betriebssystem, wenn FHEM eine interne Funktion für solche Aufgaben mitbringt?

Im einfachsten Fall erledigt
GetFileFromURL(<url>)
die Aufgabe perfekt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

sprudelverduenner

Vielen lieben Dank für die ganzen Antworten und Anregungen.

Ich habe das nun für mich folgendermaßen gelöst:
Ich habe die Variable mit dem Sonderzeichen %27 ergänzt - das Sonderzeichen entspricht dem '.

Komplett sieht das bei mir nun so aus:sub displayhaustuer($$$) {
my ($row,$col,$text) = @_;
        $text = "%27".$text."%27";
{ system("wget -q -O- 'http://192.168.1.105/control?cmd=oled,$row,$col,$text'"); }
}


Wenn ich das nächste Mal Zeit habe schaue ich mir mal den Tipp von Betateilchen an ... sein Vorschlag hört sich vernünftig an, wenn es eine interne Funktion in FHEM gibt...

Beste Grüße,
Sprudelverduenner
FHEM @ RaspberryPi 3, HMLAN, HMUART + HMRS485, Homematic, ESPEasy @ Sonoff / Shelly / ESP8266, ZigBee @ CC2531
Echo Dot, Dreambox, Yamaha MusicCast, Logitech Hub, LW-12, LD382
FRITZ!Box 7590 AX, Mesh @ FRITZ!Repeater 2400, FRITZ!Fon, iPhone 13, iPad Air 5, AppleWatch 8

betateilchen

#12
Zitat von: sprudelverduenner am 20 September 2022, 22:30:01

$text = "%27".$text."%27";


Warum so kompliziert?

$text = "'$text'";

tut es doch auch?

Zitat von: sprudelverduenner am 20 September 2022, 22:30:01
Wenn ich das nächste Mal Zeit habe schaue ich mir mal den Tipp von Betateilchen an

Da gibts nicht viel anzuschauen, einfach machen  8)

GetFileFromURL("http://192.168.1.105/control?cmd=oled,$row,$col,$text");

Übrigens verstehe ich auch nicht, warum Du um den Aufruf von system() nochmal geschweifte Klammern gesetzt hast. Du bist doch an der Stelle schon in perl unterwegs, da ist das völlig überflüssig.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

sprudelverduenner

Hallo Betateilchen,

ich bin für jeden Tipp dankbar.

Warum ich noch zusätzlich geschweifte Klammern gesetzt habe?
Nun Perl ist nicht meine Muttersprache.
Ein Teil meines Codes kommt durch Recherche zusammen - wahrscheinlich auch durch teilweise fehlerhafte Recherche.
Und wenn mein Code wie gewünscht zu funktionieren scheint, dann bin ich froh das es so ist und frage mich nicht mehr, ob es nicht ganz richtig ist.

Tipps nehme ich aber entgegen und probiere es auch dann gleich.

Und ich habe gerade bei mir nochmal verglichen:
$text = "%27".$text."%27";
führt bei mir zum gewünschten Ergebnis.
$text = "'$text'";
führt bei mir zum fehlerhaften Ergebnis.

GetFileFromURL("http://192.168.1.105/control?cmd=oled,$row,$col,$text"); habe ich tatsächlich gestern nochmal ausprobiert.
Wenn die den Befehl änderer so dass ich das Display damit ein oder ausschalten kann... dann funktioniert diese Syntax auch bei mir.
Sobald ich allerdings wieder TEXT darstellen möchte habe ich mit der Syntax wieder mein ursprüngliches Problem.

Ich werde heute Abend mal beide oben genannten Anregungen gleichzeitig verwenden - vielleicht bekomme ich ja dann auch deinen Weg ans Laufen.

Die geschweiften Klammern habe ich eben mal aus meinem Code entfern - es funktioniert weiterhin. Hierfür schon einmal DANKE.

Beste Grüße,
Sprudelverduenner
FHEM @ RaspberryPi 3, HMLAN, HMUART + HMRS485, Homematic, ESPEasy @ Sonoff / Shelly / ESP8266, ZigBee @ CC2531
Echo Dot, Dreambox, Yamaha MusicCast, Logitech Hub, LW-12, LD382
FRITZ!Box 7590 AX, Mesh @ FRITZ!Repeater 2400, FRITZ!Fon, iPhone 13, iPad Air 5, AppleWatch 8

Otto123

#14
Moin,

eventuell macht es Sinn den Text komplett in url zu encodieren (das tust Du teilweise mit den %27) . Sonst kann es sein, das auch andere Sonderzeichen in deinem Text nicht ankommen.
FHEM hat in den HttpUtils die Funktion urlEncode() die das erledigt. Beispiel für die FHEM Kommandozeile:
{my $text='Bärbel';;return urlEncode("Die '$text' ist lustig.")}
Kannst Du ja auch einfach Umlaute oder andere Zeichen mal testen.

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