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
Hi,
Idee - escapen/schützen:
{ system("wget -q -O- 'http://192.168.1.105/control?cmd=oled,$row,$col,\"$text\"'") }
Gruß Otto
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.
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""') }
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"
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
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.
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 ...
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 ?
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
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.
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
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.
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
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
Zitat von: sprudelverduenner am 21 September 2022, 07:15:40
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.
Erstens ist das kein Befehl, sondern ein Funktionsaufruf.
Zweitens war ich davon ausgegangen, dass Du den Rest Deiner Funktion - inklusive der Bearbeitung von $text - so verwendest wie bisher.
Ohne $text vorher zu konvertieren, kannst folgendes probieren (ungetestet):
GetFileFromURL("http://192.168.1.105/control?cmd=oled,$row,$col,'$text'");