FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Dragonfly am 10 April 2013, 18:16:34

Titel: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Dragonfly am 10 April 2013, 18:16:34
Folgender Code:
define Squeezebox_ntfy notify (Squeezebox:.*) {\
    my $v=Value("Squeezebox");;\
    my $server="http://usr:pwd@192.168.1.60:9002";;\
    my $player="&player=00:04:20:2B:5B:4E";;\
    GetFileFromURL "" . $server . "/status.html?p0=play" . $player . "" if ($v eq "on");;\
  }


Leider funktionierts nicht wegen dem @ in der Url (auch nicht mit 2) - weiß jemand wie man das umgehen kann?

Danke schonmal.
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Rohan am 10 April 2013, 23:01:27
Hallo Drachenfliege,

Zitat von: Dragonfly schrieb am Mi, 10 April 2013 18:16
    GetFileFromURL "" . $server . "/status.html?p0=play" . $player . "" if ($v eq "on");;\
  }


Warum setzt du das "if ($v..." ans Ende? Normalerweise sagt man doch: wenn, dann ...

also


if (...) {
  mache folgendes
}


Kann das der Grund sein?

Gruß
Thomas
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Dragonfly am 11 April 2013, 07:02:56
Nö, das @ wird von FHEM nach "Squeezebox" übersetzt - das ist das Problem.
Ausgeführt wird richtig.

Trotzdem Danke...
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Rohan am 11 April 2013, 08:16:56
Schreib doch mal

my $server="http://usr:pwd".'@192.168.1.60:9002'

statt

my $server="http://usr:pwd@192.168.1.60:9002"

dann sollte (ungetestet) keine Ersetzung erfolgen (wobei ich davon ausgehe, dass "usr" und "pwd" nur Platzhalter für Variablen sind).

Gruß
Thomas
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Dragonfly am 11 April 2013, 08:29:44
:-( leider nix...

"usr" und "pwd" sind Klartext.

Vielleicht fällt dir ja noch etwas ein?!
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Rohan am 11 April 2013, 08:48:22
Zitat von: Dragonfly schrieb am Do, 11 April 2013 08:29:-( leider nix...

wenig hilfreich. Man kann sich das dann auch ausgeben lassen, notfalls per log-Befehl.

ZitatVielleicht fällt dir ja noch etwas ein?!

Ja, wenn ich hier ein Test-(Fhem-)System vor mit hätte.

Gruß
Thomas
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Dragonfly am 11 April 2013, 09:13:54
Naja, im Log steht nicht viel - @ wird immer übersetzt - mit deiner Version und "abgeänderter" Varianten von dieser ("syntax error" oder "malformed or unsupported URL").
Der einzige unterschied war bei @@ - da kam das raus:
http://usr:pwd.168.1.60:9002 (usr:pwd.168.1.60:9002) anstatt von http://usr:pwdSqueezebox192.168.1.60:9002 (usr:pwdSqueezebox192.168.1.60:9002)

LG Tom
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Rohan am 11 April 2013, 09:18:17
Versuch mal bitte

my $server="http://usr:pwd\@192.168.1.60:9002"

also mit Backslash vor dem "@".

Gruß
Thomas
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: TeeVau am 11 April 2013, 09:21:07
Hilft dir nicht die Änderung bezüglich @ und % zu $EVENT bzw. $NAME?
Guck mal in die commandref zu notify

Zitatin the command section you can access the event:
The variable $EVENT will contain the complete event, e.g. measured-temp: 21.7 (Celsius)
$EVTPART0,$EVTPART1,$EVTPART2,etc contain the space separated event parts (e.g. $EVTPART0="measured-temp:", $EVTPART1="21.7", $EVTPART2="(Celsius)". This data is available as a local variable in perl, as environment variable for shell scripts, and will be textually replaced for FHEM commands.
$NAME contains the device triggering the event, e.g. myFht
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Dragonfly am 11 April 2013, 10:21:57
\@ bringt das gleiche wie @ alleine.

$server in $NAME zu ändern (my $NAME="http://usr:pwd@192.168.1.60:9002 (usr:pwd@192.168.1.60:9002)") hatte den selben Effekt wie @@ -> Ergebnis: http://usr:pwd.168.1.60:9002 (usr:pwd.168.1.60:9002) also "@192" wird bei beiden Varianten entfernt.
Genauer einlesen kann ich mich da erst später...
... morgen kommt der Verputzer und ich darf noch vorbereiten :)

Danke nochmals für die Unterstützung.
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Dragonfly am 11 April 2013, 10:41:35
Naja, in der commandref steht:
ZitatTo use % or @ in the text itself, use the double mode (%% or @@).
beim E-Mail funktionierts ja auch einwandfrei?!
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Rohan am 11 April 2013, 11:12:23
Fuktioniert denn:

define Squeezebox_ntfy notify (Squeezebox:.*) {\
    my $v=Value("Squeezebox");;\
    my $player="&player=00:04:20:2B:5B:4E";;\
    GetFileFromURL "" . 'http://usr:pwd@192.168.1.60:9002' . "/status.html?p0=play" . $player . "" if ($v eq "on");;\
  }


oder

define Squeezebox_ntfy notify (Squeezebox:.*) {\
    my $v=Value("Squeezebox");;\
    my $player="&player=00:04:20:2B:5B:4E";;\
    GetFileFromURL "" . "http://usr:pwd@@192.168.1.60:9002" . "/status.html?p0=play" . $player . "" if ($v eq "on");;\
  }


Ansonsten bliebe noch die Auslagerung in eine sub in 99_myUtils, da hat dann Fhem weniger "Einfluss" auf den Code. So wie in deinem define ist es zwar auch Perl-Code, der aber von Fhem vorgefiltert an Perl übergeben/durchgereicht wird.

Ich warte immer noch auf einen Perl-Meister, der irgendwann ein Erbarmen mit uns Novizen hat ;)

Edith ergänzt dazu:


my $foo = "Foo";
my $bar = "Bar";
my $str = $foo.$bar;

print $str;
print "\n";
 
=> Ergibt: FooBar

my $foo = "Fo\@o";
my $bar = "Bar";
my $str = $foo.$bar;

print $str;
print "\n";
 
=> Ergibt: Fo@oBar

my $foo = "Fo@o";
my $bar = "Bar";
my $str = $foo.$bar;

print $str;
print "\n";
 
=> Ergibt: FoBar

my $foo = 'Fo@o';
my $bar = "Bar";
my $str = $foo.$bar;

print $str;
print "\n";
 
=> Ergibt: Fo@oBar


Gruß
Thomas
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Dragonfly am 11 April 2013, 11:34:42
bei der 1. Variante wird überstzt, bei der 2. abgeschnitten.


my $foo = 'Fo@o';
my $bar = "Bar";
my $str = $foo.$bar;

print $str;
print "\n";
 
=> Ergibt: Fo@oBar

sollte ja dann so sein:
define Squeezebox_ntfy notify (Squeezebox:.*) {\
    my $v=Value("Squeezebox");;\
    my $server='http://usr:pwd@192.168.1.60:9002';;\
    my $player="&player=00:04:20:2B:5B:4E";;\
    if ($v eq "on") {GetFileFromURL "" . $server . "/status.html?p0=play" . $player . ""};;\
    }

Was schon wieder eine Übersetzung bewirkt.

Wobei
define Squeezebox_ntfy notify (Squeezebox:.*) {\
    my $v=Value("Squeezebox");;\
    my $server='http://usr:pwd@192.168.1.60:9002';;\
    my $player="&player=00:04:20:2B:5B:4E";;\
    if ($v eq "on") {GetFileFromURL "' . $server . '/status.html?p0=play" . $player . ""};;\
    }

die Url verhaut.

Da hilft nur eins - Ruuudi !
Das kann ich recht gut - mein Mechaniker und sogar der Tischler von mir heißen so - und die wissen immer Rat!

;)
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: TeeVau am 11 April 2013, 12:08:41
Zitat von: Dragonfly schrieb am Do, 11 April 2013 10:41Naja, in der commandref steht:
ZitatTo use % or @ in the text itself, use the double mode (%% or @@).
beim E-Mail funktionierts ja auch einwandfrei?!


Das mag ja sein, dass das drin steht. Hilft aber augenscheinlich nicht. Und ich denke mal, du möchtest fertig werden, oder? :-)

In der commandref steht auch:
ZitatNote: the following is deprecated and will be removed in a future release. The described replacement is attempted if none of the above variables ($NAME/$EVENT/etc) found in the command.
@ und % wird, irgendwann mal, abgeschafft. Mit $EVENT und $NAME wärst du also etwas Zukunftssicherer. Die Entscheidung bleibt natürlich bei dir.
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Rohan am 11 April 2013, 12:10:45
Aber $Event & Co. bringt ihn doch nicht weiter, weil er doch genau das "@"-Zeichen braucht für eine gültige URL.

Gruß
Thomas
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Rohan am 11 April 2013, 20:27:05
Hi,

ich editiere jetzt bewusst nicht meinen letzten Beitrag, damit der TO auch eine Nachricht bekommt:

ich habe es gerade mal (reduziert) in der fhem.cfg nachgestellt.


define Squeezebox dummy
define Squeezebox_ntfy notify Squeezebox:.* {\
  my $server='http://usr:pwd@@192.168.1.60:9002';;\
  Log 3, "$server";;\
}


Im Fhem-Logfile erscheint nach "trigger Squeezebox on" folgende Ausgabe:

2013.04.11 20:21:09 3: http://usr:pwd@192.168.1.60:9002

Das ist doch mM genau das, was der TO möchte, oder?

Und nun?

Gruß
Thomas
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Dragonfly am 11 April 2013, 21:46:57
Habs jetzt auch - Aufgrund der Fo@oBar Theorie habe ich das 2. @ nicht reingemacht.

So gehts jetzt richtig:
define Squeezebox_ntfy notify (Squeezebox:.*) {\
    my $v=Value("Squeezebox");;\
    my $server='http://usr:pwd@@192.168.1.60:9002';;\
    my $player="&player=00:04:20:2B:5B:4E";;\
    if ($v eq "on") {GetFileFromURL "" . $server . "/status.html?p0=play" . $player . ""};;\
    }


Danke - Freude groß!
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: Rohan am 11 April 2013, 22:01:01
Hi,

Zitat von: Dragonfly schrieb am Do, 11 April 2013 21:46Aufgrund der Fo@oBar Theorie habe ich das 2. @ nicht reingemacht.

Das ist keine Theorie, sondern getestet (allerdings "reines" Perl). Ich erkläre es mir so, dass der "String" eingeschlossen von '' (wo nix ersetzt wird) übergeben wird an eine weitere String-Zuweisung in "", wo dann das "@" maskiert sein muss.

Aber: Hauptsache, et lüppt ;)

Gruß
Thomas
Titel: Aw: GetFileFromURL mit Benutzeranmeldung
Beitrag von: TeeVau am 12 April 2013, 08:39:16
Zitat von: Rohan schrieb am Do, 11 April 2013 12:10Aber $Event & Co. bringt ihn doch nicht weiter, weil er doch genau das "@"-Zeichen braucht für eine gültige URL.

Gruß
Thomas
Mist, Sorry. Du hast natürlich recht. Ich war auf dem völlig falschen Dampfer. Tut mir leid für die Verwirrung
Titel: Antw:GetFileFromURL mit Benutzeranmeldung
Beitrag von: Mr_Tembo am 05 Februar 2016, 20:56:39
Hallo zusammen,

ich klinke mich hier auch einmal ein, denn ich bin auf einen weiteren Fehler gestoßen:

Passwort und Benutzer wurde ja oben gelöst. Bei mir ist zusätzlich ein anderer Port erforderlich. Und Hier ist das Problem. Lass ich den Webserver auf Standard 80 funktioniert es mit dem Zugriff. Ist es aber ein anderer Port, wie der Standard 80 - in diesem Beispiel die 88 - dann funktioniert es nicht, den er macht einen Redirekt zu Port 80 und übernimmt nicht den angegebenen Port.

Der Source-Code sieht wie folgt aus (klappt perfekt solang ich den Schalter-Webserver auf Port 80 laufen haben:

define AQ_SchalterLED dummy
attr AQ_SchalterLED setList off on
attr AQ_SchalterLED room 2.00_Schalter
define AQ_SchalterLED_ntfy notify (AQ_SchalterLED:.*) {\
    my $v=Value("AQ_SchalterLED");;\
    my $server='http://usr:pass@@192.168.123.223:88';;\
    my $mode="actor";;\
   my $type="switch";;\
   my $id = "7";;\
    if ($v eq "on") {GetFileFromURL "" . $server . "/xml?mode=" . $mode . "&type=" . $type . "&id=" . $id . "&action=1" . ""} else {GetFileFromURL "" . $server . "/xml?mode=" . $mode . "&type=" . $type . "&id=" . $id . "&action=0" . ""};;\
   }

Der LOG Eintrag wie folgt:

2016.02.05 20:49:24 4: HttpUtils url=http://usr:pass@@192.168.123.223:88/xml?mode=actor&type=switch&id=7&action=0
2016.02.05 20:49:24 4: http://usr:pass@@192.168.123.223:88/xml?mode=actor&type=switch&id=7&action=0: HTTP response code 301
2016.02.05 20:49:24 4: HttpUtils http://usr:pass@@192.168.123.223:88/xml?mode=actor&type=switch&id=7&action=0: Redirect to http://192.168.123.223/xml/?mode=actor&type=switch&id=7&action=0
2016.02.05 20:49:24 4: HttpUtils url=http://192.168.123.223/xml/?mode=actor&type=switch&id=7&action=0
2016.02.05 20:49:24 4: CustomGetFileFromURL http://192.168.123.223/xml/?mode=actor&type=switch&id=7&action=0: Can't connect(1) to http://192.168.123.223:80: IO::Socket::INET: connect: Verbindungsaufbau abgelehnt

Hat jemand eine Idee.

Grüße Michael