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.
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
Nö, das @ wird von FHEM nach "Squeezebox" übersetzt - das ist das Problem.
Ausgeführt wird richtig.
Trotzdem Danke...
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
:-( leider nix...
"usr" und "pwd" sind Klartext.
Vielleicht fällt dir ja noch etwas ein?!
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
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
Versuch mal bitte
my $server="http://usr:pwd\@192.168.1.60:9002"
also mit Backslash vor dem "@".
Gruß
Thomas
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
\@ 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.
Naja, in der commandref steht:
ZitatTo use % or @ in the text itself, use the double mode (%% or @@).
beim E-Mail funktionierts ja auch einwandfrei?!
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
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!
;)
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.
Aber $Event & Co. bringt ihn doch nicht weiter, weil er doch genau das "@"-Zeichen braucht für eine gültige URL.
Gruß
Thomas
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
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ß!
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
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
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