FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: sprudelverduenner am 19 September 2022, 21:38:38

Titel: myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: sprudelverduenner am 19 September 2022, 21:38:38
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
Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: Otto123 am 19 September 2022, 22:00:37
Hi,

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

Gruß Otto
Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: TomLee am 19 September 2022, 22:05:33
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.
Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: TomLee am 19 September 2022, 22:17:35
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""') }
Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: Otto123 am 19 September 2022, 22:22:02
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"

Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: MadMax-FHEM am 19 September 2022, 22:32:13
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
Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: TomLee am 19 September 2022, 22:39:12
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.
Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: Otto123 am 19 September 2022, 23:04:04
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 ...
Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: TomLee am 19 September 2022, 23:30:53
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 ?
Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: Otto123 am 20 September 2022, 09:11:44
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
Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: betateilchen am 20 September 2022, 09:20:28
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.
Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: sprudelverduenner am 20 September 2022, 22:30:01
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
Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: betateilchen am 21 September 2022, 00:56:49
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.
Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: sprudelverduenner am 21 September 2022, 07:15:40
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
Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: Otto123 am 21 September 2022, 09:32:32
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
Titel: Antw:myUtils Funktion mit WGET... ich stehe auf dem Schlauch
Beitrag von: betateilchen am 21 September 2022, 12:41:42
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'");