Hallo zusammen,
ich habe zuhause einen Bereich der mit einer ip-Kamera überwacht wird. Nun möchte ich im Fall eines Ereignisses oder Alarm, automatisch angerufen werden.
Hierzu muss ich bei einem Anbieter eine bestimmte Url aufrufen. Der Aufruf funktioniert bei der Eingabe in jedem Webbrowser.
Nun bin ich dabei dies mittels fhem zu realisieren. Aber irgendwie bin ich dafür offensichtlich zu doof.
Ich habe in fhem ein dummy device namens Testschalter definiert, um den Aufruf mal zu testen. Wenn man diesen drückt soll die Url aufgerufen werden und mein Telefon soll klingeln.
dann per notify folgendes eingefügt:
define html_aufruf notify Testschalter:on { GetFileFromUrl("https://gateway.sms77.io/api/voice?u=username&p=passwort&to=4917112345678&text=Alarm") }
dann kommt folgende message im Log:
2017.06.11 13:51:06 3: html_aufruf return value: Unknown command GetFileFromUrl("https://gateway.sms77.io/api/voice?u=username&p=passwort&to=4917112345678&text=Alarm");, try help.
Was mach ich falsch? Ich bin am verzweifeln!
Vielen Dank vorab
Gruß
Raik
https://wiki.fhem.de/wiki/HttpUtils#GetFileFromURL
GetFileFromUrl != GetFileFromURL
Danke für die Antworten,
aber Hinweise auf Wiki ö.ä. hilft mir nicht weiter. Da habe ich schon zig mal geschaut. All das habe ich schon durch. 3 Tager googeln...und und und!
Deshalb frage ich doch hier weil ich ratlos bin !!!!!!!!
Hat denn niemand eine Lösung? Und zwar so als wäre ich 10 Jahre alt!!!!
Aber klar doch, als wärst Du zehn Jahre alt. Fällt ja nicht schwer.
Der Aufruf Deiner Sub lautet GetFileFromUrl, die Sub lautet aber tatsächlich GetFileFromURL
Also Du schreibst Url mit großem U und kleinem rl aber Du musst schreiben großes U großes R und großes L
Sollten noch Fragen sein bitte melde Dich, ich schicke dann meine 9 jährige mit der Fibel vorbei.
Aaaaahhhh jetzt ja!!!! Ich habs net gsehn ich habs net gsehn herrje!!
mit so kleinen Dingen kann man einen anscheinend glücklich machen :D
und schon kommt das nächste Problem. Es kommt jetzt zwar keine Fehlermeldung mehr im Log, aber das Tel klingelt immer noch nicht.
Ist es sicher dass die URL raus ging?
.... und nein ich habe mich da nicht vertippt...ich hab die funktionierende Zeile aus dem Browser kopiert.
Zitat
Die Funktion GetFileFromURL ruft die HTTP-URL auf und gibt als Funktionsergebnis den Seiteninhalt zurück.
Es wird also irgendwas anscheinend zurück gegeben. Dieses etwas könnte nun dazu dienen eine weitere Analyse zu machen.
Daher
my $response = GetFileFromURL...
Und $response einfach mal als Debug ausgeben lassen.
wie debugged man denn bei fhem?
Kann man irgendwie ein Textfeld generieren in dem die Ausgabe erscheint? Wenn alles funktioniert müssten drei Zahlen von der URL zurückgegeben werden.
Bitte net bös werden :) ich bin blutiger Anfänger in fhem und auch kein Informatiker. Ich versuchs nur irgendwie hinzukriegen
Zitat von: Raik am 11 Juni 2017, 18:16:44
wie debugged man denn bei fhem?
Kann man irgendwie ein Textfeld generieren in dem die Ausgabe erscheint? Wenn alles funktioniert müssten drei Zahlen von der URL zurückgegeben werden.
Bitte net bös werden :) ich bin blutiger Anfänger in fhem und auch kein Informatiker. Ich versuchs nur irgendwie hinzukriegen
Wenn Du mir zeigt das Du Dich bemühst werde ich nicht böse ;D
Du kannst entweder ein Log 1, $response; machen oder einfach main::Debug $response;
Sollte es nicht gehen bitte hier in sogenannten Codetags die Fehlermeldung Posten. Codetags ist in der Symbolleiste das Rautezeichen
Mein Kopf platzt.
Ich komme mit den Dollar Zeichen ($) und der Syntax irgendwie nicht zurecht.
Ich versuche gerade die Rückgabe der URL in eine Textdatei zu schreiben. Hierzu habe ich eine Routine "FileWrite" gefunden. Ich habs irgendwie mal geschafft, dass eine Datei namens "Rückgabe erzeugt wurde, aber leider ohne Inhalt.
Folgenden Code probiere ich gerade, kriegs aber nicht hin (Syntaxfehler).
define html_aufruf notify Testschalter:on { FileWrite("Rückgabe.txt, GetFileFromURL("https://gateway.sms77.io/api/voice?u=username&p=passwort&\to=491711234567&text=Alarm")"), }
Ich möchte sozusagen die Rückgabe aus dem URL Aufruf in die Datei "Rückgabe.txt" schreiben.
{ FileWrite("Rückgabe.txt, GetFileFromURL("https://gateway.sms77.io/api/voice?u=username&p=passwort&\to=491711234567&text=Alarm")"), }
1 - Du kannst nicht mehrere Zeichenkette mit den gleichen Delimiters
" ineinander schreiben. So wird es interpretiert:
Zitat{ FileWrite("Rückgabe.txt, GetFileFromURL("https://gateway.sms77.io/api/voice?u=username&p=passwort&\to=491711234567&text=Alarm")"), }
Die gesamte URL ist dann ein Syntax Error.
2 - Warum \ nach passwort& ?
3 - Warum , am Ende ?
Also...
1 - pass mal auf die Syntax auf
2 - warum machst Du nicht wie CoolTux gesagt hat ?
Zitatmy $response = GetFileFromURL...
und
Zitat
Log 1, $response
3 - Was ist die Fehlermeldung ?
Vermutlich wäre folgendes besser:
{ FileWrite("Rückgabe.txt, GetFileFromURL('https://gateway.sms77.io/api/voice?u=username&p=passwort&to=491711234567&text=Alarm')") }
Hi amenomade,
bei deinem letzten Vorschlag kommt zumindest keine Fehlermeldung mehr bzgl. Syntax. Leider kommt: "html_aufruf return value: Can't open /share/Web/fhem5.8/Rückgabe.txt..... no such file or directory".
Ich habe probiert solch Datei zuvor anzulegen...bringt aber nix. Wie gesagt ich bin absoluter Newbie...ich hab von Syntax keine Ahnung.
Zu deinen Fragen Nr 2 u. 3. ...mit den & und ?.... das stammt nicht von mir, das gehört zur zu aufrufenden URL, welche vom Provider, der dann mein Telefon anruft, vorgegeben ist. Im Browser funktionierts.
Ich hab mal folgenden Debug probiert, so ähnlich wie CoolTux gesagt hat.
define html_aufruf notify Testschalter:on { Debug => GetFileFromURL("https://gateway.sms77.io/api/voice?u=username&p=passwort&to=491711234567&text=Alarm") }
daraufhin kam folgende Meldung im Log: "html_aufruf return value: HASH(0x38410b0)"
Das ist doch der Rückgabewert...oder?? Und was bedeutet das jetzt?
mit "wget" habe ich es nun auch probiert. Folgender code:
define html_aufruf notify Testschalter:on { system("wget https://gateway.sms77.io/api/voice?u=username&p=passwort&to=491711234567&text=Alarm") }
Als return value kam:
html_aufruf return value: 256
wget ist doch sozusagen das gleiche wie ein Browser ohne GUI. Aber im Browser funktionierts...per wget nicht.
Ich bin am Ende. Ich will doch blos eine URL aufrufen !!! :'( :'( :'(
define html_aufruf notify Testschalter:on { my $response = GetFileFromURL ("https://gateway.sms77.io/api/voice?u=username&p=passwort&to=491711234567&text=Alarm");
main ::Debug "$response";
}
Bitte eins zu eins so übernehmen und im fhem.log schauen was ausgegeben wurde.
Ah so gibst du das ein :D
Folgende Ausgabe im Log:
2017.06.12 12:37:05 1: PERL WARNING: Use of uninitialized value $response in string at (eval 163) line 2.
2017.06.12 12:37:05 3: eval: my $TYPE='dummy';my $NAME='Testschalter';my $EVENT='on';my $EVTPART0='on';my $SELF='html_aufruf';{ my $response = GetFileFromURL ("https://gateway.sms77.io/api/voice?u=username&p=passwort&to=491711234567&text=Alarm");
main::Debug "$response";
}
2017.06.12 12:37:05 1: DEBUG>
Scheint wohl nichts zurück zu kommen. Und im Browser funktioniert genau dieser URL Aufruf?
Eventuell hat das was mit dem https zu tun. Aber dabin ich dann überfragt
Ja im Browser funktioniert das. Gerade nochmal ausprobiert.
Ich kann auch was einfaches aufrufen, also kein https...z.B. "http://www.google.de" .... dann kommt die gleiche Fehlermeldung.
Biste sicher dass die Syntax stimmt? Es kommt nämlich:
"PERL WARNING: Use of uninitialized value $response in string at (eval 200) line 1."
ZitatJa im Browser funktioniert das.
Wenn du in einem Browser testest, ist das ein Browser
auf dem gleichem Rechner wie FHEM ?
Wenn keine Rückgabe kommt kann auch die Variable $response nicht gefüllt werden. Nichts anderes sagt er dir da. $response uninitialized und der Grund ist das nichts zurück gegeben wird.
Ich muss mir das mal heute Abend in Ruhe anschauen.
@armenomade:
Ja, der selbe Rechner.
Ich habe es sogar auf zwei Systemen probiert. Einmal auf dem NAS, wo es letztlich laufen soll....und dann noch auf dem Windows PC.
Aufruf im Browser funktioniert...Aufruf per fhem nicht.
@CoolTux:
das wär cool ! :)))) ... ich wüsste auch gar nicht wie ich mich jemals dafür revanchieren kann
Wenn Du die selbe URL im Browser auf rufst, was genau kommt dann zurück. Also eine Seite wird dargestellt. Ist sie weiß oder steht was auf der Seite?
kann ich dir sagen:
es kommt eine komplett weisse Seite, oben links drei Zahlenwerte untereinander:
100
116988
0,1
dann ist alles ok und ich werde angerufen
Mach mal dann Rechtklick auf der Seite, dann Quelltext (Source code) hier kopieren.
Übrigens: was ist dein Ziel? Warum willst Du das unbedingt in einer Datei speichern? Möchtest Du keinen Wert extrahieren, und in FHEM nutzen? Dann wäre ein Blick auf HTTPMOD Wert.
Nein, es geht darum zu sehen ob der URL Aufruf in irgendeine Weise ein Response zurück gibt das man sehen kann ob es geklappt hat. Im Moment habe ich selbst Probleme damit. Ich wenn ich einfach nur heiße.de/ auf rufe, sollte ich als Response eigentlich den HTML Inhalt bekommen, so habe ich das jedenfalls verstanden. Mit curl klappt das super, aber mit GetFileFromURL bekomme ich keinerlei Response.
Ja, deswegen möchte ich den Inhalt der Webseite sehen. Einige FHEM Modulen (wie httpmod) suchen z.B. nach <body></body> tags. Wenn wir hier eine falsch formatierte Seite haben, kann es eine Erklärung sein.
Es ist ja kein Modul sondern eine Funktion und wenn man sich diese anschaut dann macht sie nichts weiter wie am Ende einer Aufrufkette ein HttpUtils_BlockingGet und gibt mir $data als $ret zurück
@amenomade:
anbei ein screenshot..wenn es dir weiterhilft. Unten ist dann der code.
Ansonsten... also was ich eigentlich nur will, ist diese URL aufrufen, damit ich dann angerufen werde. Nichts anderes. Ich muss nicht unbedingt ne Datei erstellen..oder Rückgabewerte erfragen, um damit weitere Dinge zu machen. Ich suche nur irgendwie einen Weg warum es aus FHEM nicht funktioniert. Wie gesagt, im Browser geht es immer! (siehe Screenshot)
Ziel ist, dass meine ip-Kamera dann an FHEM einen set Befehl schickt, und dadurch diese URL aufgerufen wird, um mich anzurufen. Der set Befehl aus der Kamera funktioniert schon. Leider kann die Kamera keinen HTTP request direkt machen.
Ganz ganz ganz schön wäre es natürlich wenn ich auch nicht diesen kostenpflichten Provider hätte, der mich dann annruft. Evtl ginge es ja direkt aus FHEM die Fritzbox anzutriggern, welche mich dann anruft. Aber dies soll jetzt (noch ;D) nicht das Thema sein.
@amenomade
Sagen wir es so, Du hattest den richtigen Riecher. ;D
Zu mindest bei Raik kann kein Rückgabewert kommen weil es im Body steckt. Für mich selbst bleibt die Frage wieso ich aber bei Heise nichts zurück bekomme. Und natürlich bleibt Raik sein Problem noch offen. ;D
Hab grad "wget" probiert.
Testschalter:on { system("wget https://gateway.sms77.io/api/voice?u=username&p=passwort&to=491711234567&text=Alarm") }
Zum ersten mal passiert was:
2017.06.12 20:06:40 3: html_aufruf return value: -1
--2017-06-12 20:06:40-- https://gateway.sms77.io/api/voice?u=username
Resolving gateway.sms77.io (gateway.sms77.io)... 134.119.22.64
Connecting to gateway.sms77.io (gateway.sms77.io)|134.119.22.64|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/plain]
Saving to: 'voice?u=username.2'
0K 102K=0s
2017-06-12 20:06:40 (102 KB/s) - 'voice?u=username.2' saved [3]
Was issen des jezz fürn Kauderwelsch?
Zitat von: CoolTux am 12 Juni 2017, 19:39:44
@amenomade
Sagen wir es so, Du hattest den richtigen Riecher. ;D
Zu mindest bei Raik kann kein Rückgabewert kommen weil es im Body steckt. Für mich selbst bleibt die Frage wieso ich aber bei Heise nichts zurück bekomme. Und natürlich bleibt Raik sein Problem noch offen. ;D
"Trailing Slash" vergessen?
{Debug GetFileFromURL("https://www.heise.de/")}
Gruß
Dan
Zitat von: DeeSPe am 12 Juni 2017, 20:14:57
"Trailing Slash" vergessen?
{Debug GetFileFromURL("https://www.heise.de/")}
Gruß
Dan
Hallo Dan und willkommen in unserer Show ;D
Nein. Den Slash habe ich definitiv gesetzt. Habe das ganze jetzt schon als myUtils Sub gemacht um mal zu schauen. Selbiges Ergebnis.
sub getUrl($) {
my $url = @_;
my $response = GetFileFromURL($url);
main::Debug $response;
}
Aufruf mit getUrl('https://www.heise.de/')
Ist bestimmt wieder irgendwas ganz kleines was ich übersehe.
hahaaaaaa......und was mein Problem betrifft..... ich habs geschafft die URL aufzurufen mit "curl" ....dann gings aber noch nicht weil in meiner URL so viele Steuerzeichen wie z.B die ? und &.
Diese hab ich dann gemäß Zeichentabelle ersetzt. Z.B. das ? als %3F usw.
Dann gings....mein Tel hat geklingelt. :) :) :) :) :) :)
Aaaaaber ob das jetzt die beste Lösung weiss ich jetzt nicht.
Gibt es einen Nachteil curl zu verwenden? Müllt es evtl irgend nen Speicher voll? Oder kann es sich aufhängen? Was ist wenn die Gegenseite der Server off ist?
Ist letztlich GetFileFromURL besser?
Wie wäre es mit HTTPMOD? Cooles Tool und liefert Eier, Milch und Wolle in einem.
Gesendet von iPad mit Tapatalk Pro
Kommt drauf an wie Du aufgerufen hast. Wenn Du es als System aufgerufen hast blockiert es FHEM. So lange die Gegenstelle vorhanden ist ist das kein Problem, wenn nicht blockiert FHEM so lange bis ein Timeout kommt.
Versuche mal bitte
fhem("\"curl http://www.heise.de/\"")
Oder erst gar nicht in die Perlebene gehen und gleich
Testschalter:on "curl http://www.heise.de/"
Zitat von: CoolTux am 12 Juni 2017, 20:49:20
Hallo Dan und willkommen in unserer Show ;D
Nein. Den Slash habe ich definitiv gesetzt. Habe das ganze jetzt schon als myUtils Sub gemacht um mal zu schauen. Selbiges Ergebnis.
sub getUrl($) {
my $url = @_;
my $response = GetFileFromURL($url);
main::Debug $response;
}
Aufruf mit getUrl('https://www.heise.de/')
Ist bestimmt wieder irgendwas ganz kleines was ich übersehe.
Ich bekomme mit:
{return GetFileFromURL("https://www.heise.de/")}
ordnungsgemäß den HTML Output im FHEM angezeigt.
Gruß
Dan
Also entweder habe ich mich verrannt gehabt oder ich werde alt. Ich habe Dein kopiert und das s von https weggenommen und siehe da mein Squidguard meldet sich und ich bekomme etwas zurück. Keine Ahnung wieso das vorher nicht ging.
Ich teste das morgen noch mal wenn ich nicht in meinem angeschirmten Netz bin und https Seiten aufrufen kann.
@CoolTux
Bei
Alarmlampe:on { system("curl http://www.heise.de/") }
kommt
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 178 100 178 0 0 5273 0 --:--:-- --:--:-- --:--:-- 5933
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
2017.06.12 21:23:15 3: html_aufruf return value: -1
Bei
Testschalter:on "curl http://www.heise.de/"
kommt
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 178 100 178 0 0 5222 0 --:--:-- --:--:-- --:--:-- 5933
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
Na siehste, zweite Version klappt also auch. Das machst jetzt einfach entsprechend mit Deiner URL. Also statt heise.de halt Deinen URL Aufruf
Ja und dann gibts keine Probleme in der Art wie du vorhin geschildert hast?
Korrekt. FHEM kümmert sich dann um den Rest und zwar nonBlocking. Kleine Einschränkung, das nonBlocking bezieht sich nur auf die Abfrage der Daten oder senden der URL in Deinem Fall. Ein DNS Aufruf welcher ja auch immer gemacht werden muss ist nicht nonBlocking. Aber das wäre jetzt zu viel des Guten.
Sagen wir einfach Dein Aufruf sollte dann funktionieren und zu 99.9 Prozent FHEM nicht blockieren.
Mich ärgert es aber trotzdem das es mit GetFileFromURL nicht geklappt hat. Jetzt mal ab vom Response hätte ja der Aufruf klappen müssen. >:(
Ja mich auch!!!
Habs nochmal probiert.... es kommt keine Fehlermeldung im Log....es kommt einfach gar nix. Aber das Tel klingelt nicht !!
naja.... sollte es mal einer rausfinden dann änder ichs :D
Ganz nebenbei... ich hab FHEM installiert...und die Anfängerfibel durchgemacht. U.a das Beispiel mit dem Schalter und der Lampe als dummy.
Es erschein in FHEM dann ein Lampensymbol bei der Lampe welches entsprechnd der Schalterstellung auf Grau oder gelb wechselt. Und zwar sofort nach dem Drücken des Schalters.
Seit geraumer Zeit ist das nicht mehr so. Ich muss immer die Seite aktualisieren damit die Symbole entsprechend leuchten.
Hast du ne Ahnung was das sein könnte? Muss ich jetzt FHEM neu installieren?
Das wird mit FHEM selbst nichts zu tun haben. Das kann Java Script Filter sein, Antivirensoftware oder Applicationsfirewall. Alles was Java Script blockiert.
Mach mal das selbe von einem Tablet oder Handy aus, da wird es dann gehen.
Naja... aber ich bin happy jetzt .....es funktioniert :)
Ich sag auf jeden Fall Tausend dank für den Einsatz! :)
Null Problemo. Hat mich ja auch interessiert und tut es immer noch.
Zitat von: Raik am 12 Juni 2017, 21:55:56
Ganz nebenbei... ich hab FHEM installiert...und die Anfängerfibel durchgemacht. U.a das Beispiel mit dem Schalter und der Lampe als dummy.
Es erschein in FHEM dann ein Lampensymbol bei der Lampe welches entsprechnd der Schalterstellung auf Grau oder gelb wechselt. Und zwar sofort nach dem Drücken des Schalters.
Seit geraumer Zeit ist das nicht mehr so. Ich muss immer die Seite aktualisieren damit die Symbole entsprechend leuchten.
Hast du ne Ahnung was das sein könnte? Muss ich jetzt FHEM neu installieren?
Eventuell das hier:
https://forum.fhem.de/index.php/topic,29909.msg632764.html#msg632764
Merci...habs auch grad gefunden ;-)
Heißt Du hast einen Reverseproxy? Sowas muss man schon mal erwähnen, oder habe ich das überlesen?
Nee, nix von all dem .... ich musste das Attribut longpoll im Fhemweb Web auf websocket stellen. Keine Ahnung wie sich das verstellt hat, ich wars nich..... aber jezz gehts
Zum System, ich hab en stink normales Qnap NAS wo Fhem drauf läuft und ne Fritzbox 7490
Zitat von: CoolTux am 12 Juni 2017, 22:25:25
Heißt Du hast einen Reverseproxy? Sowas muss man schon mal erwähnen, oder habe ich das überlesen?
Es gibt doch irgendwo etwas:
Zitat<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
Zitat von: amenomade am 12 Juni 2017, 22:35:38
Es gibt doch irgendwo etwas:
Ich würde ja behaupten das ist der Webserver von Heise ;D
Ja, kann sein
Das ist tatsächlich http://www.heise.de/, das ein Redirect auf https://www.heise.de/ macht.
Curl braucht aber nw. die -L Option, um solche Redirects zu folgen.
Jupp. Aber auf das umstellen auf websocket wäre ich nicht gekommen. Ich habe in meiner Standard Webinstanz zum Beispiel gar kein Attribut longpool stehen und es geht trotzdem.