FritzBox 7490 SmartHome Actoren über Internet auslesen

muellmann4

Neuer User
Mitglied seit
29 Mrz 2016
Beiträge
10
Punkte für Reaktionen
0
Punkte
1
Hallo!
Ich benötige Hilfe - ich versuche die diversen Actoren meiner FritzBox 7490 auszulesen.
Dies funktioniert innerhalb des Heimnetzes auch sehr gut - https://fritz.box/login_sid.lua liefern auswertbare Werte und ich erhalte auch eine device_list: etwa AIN 08761 0000001 (Wohnzimmer) Temperatur:(Temp:23.0C, Offset:0.0) ; AIN 08761 000002 (Wintergarten) Temperatur:(Temp:31.0C, Offset:0.0) ; [AIN - Nummer geändert].
Wenn ich den Versuch jedoch über einen WEB-Server (aus dem Internet) mit der öffentlichen IP der Fritzbox mache, so kann ich den XML-Strom der login_sid.lua nicht auslesen. Wenn ich es im Browser eingebe, dann schon - zumindest bekomme ich dort eine Challange angezeigt. Ich mache also irgendetwas falsch - nur was.
Dabei ist es auch egal ob ich mit
$xml = @simplexml_load_string($http_response);
arbeite oder mit
$Response = simplexml_load_file($datei);
bei der die gesamte Datei eingelesen wird...
Ich bekomme einfach keine Antwort.

Hat jemand schon einmal die login_sid.lua über das Internet ausgelesen und ein Beispiel?
ODER: Gibt es einen anderen Weg die DECT Actoren (mich interessiert hier die Temperatur in den einzelnen Räumen) über das Internet auszulesen?
Ich komme einfach nicht weiter und wäre für ein Beispiel dankbar.

Achja: Der benutzte Fritzbox-Benutzer ist natürlich für den Zugriff über das Internet freigegeben. Im Heimnetz funktioniert es auch gut - nur eben beim Zugriff über die öffentliche IP oder einen DynDNS-Namen bleibt beim "Automatismus des Lesens" der String in den die XML-Daten gelesen werden leer. Wirtzig: Rufe ich Seite im Browser auf, so erhalte ich den XML-Datenstrom ohne Probleme. Vielleicht gibt es ja auch noch einen anderen Weg an die Daten der SmartHome Actoren zu kommen - geht mit einer App ja schließlich auch...
Jemand eine Idee?
 
Zuletzt bearbeitet:
Hallo Tuxi70! Vielen Dank für den Hinweis. Es ist leider nicht ganz das was ich suche. Dein Link zeigt auf ein Thema, bei dem die Actoren mit dem Pi ausgelesen werden können. Das mach mein IIS im Heimnetz auch erfolgreich. Nun ist mein Ansatz aber folgender: Ich möchte keine Pi oder anderen Webserver im Heimnetz laufen haben - es reicht, dass die FirtzBox 7490 läuft. Meine Idealvorstellung: Ich schaffe es über eine Webseite im Internet (1&1 oder Strato) die FritzBox dazu zu bringen mir auf den Webseiten die Temperaturwerte der Actoren anzuzeigen - daher die Versuche mit der login_sid.lua ... ODER ich installiere auf der 7490 (Firmware 6.83) etwas, was es mir ermöglicht leichter an die Werte zu kommen (aber bitte keine komplett neue Firmware - bin froh hier wieder einigermaßen mit Erweiterungen wie frewe arbeiten zu können). Die Lösung vom Pi oder auch die mit dem IIS bei mir ist ja schön - so eine Funktion dann auf der Firtzbox - toll - das suche ich. Oder eben etwas billiger (aber vielleicht unmöglich) der Zugriff aus dem Internet auf die Firtzbox um per php die Actoren auszulesen. Wie schon beschrieben...
Noch ein anderer Tipp?
 
Die Informationen sind ja etwas schmal ... z.B. fehlt vollkommen, wie und womit Du nun von dem erwähnten Server aus auf die Box zugreifst (wenn das kein Browser ist, in dem es ja nach Deiner Schilderung dann auch wieder klappt).

Da kann man dann nur "raten" und liegt damit trotzdem fast immer daneben ... die Liste der denkbaren Fehler ist lang.

Als erstes würde ich mal die Flags beim Aufbau der TLS-Verbindung prüfen (je nach Abstraktionsgrad der verwendeten Sprache/Bibliothek kommt man damit normalerweise nicht in Berührung - nach #1 würde ich in Richtung PHP tippen, aber das ist deutlich zu wenig "Text" für eine sichere Bestimmung der Umgebung), denn das Zertifikat Deiner FRITZ!Box ist ja sicherlich "self-signed" und daran stirbt dann eine TLS-Verbindung (die sich hinter dem "load" verbirgt, wenn da mit einer HTTPS-URL von irgendwoher geladen werden soll) bereits, wenn sie das Zertifikat mit wirklich strikten Einstellungen bewertet.

Jedenfalls wäre der einfachste Test der FRITZ!Box ja ein Aufruf mit "wget" nach dem folgenden Schema:
Code:
# wget --no-check-certificate -q -O - https://192.168.xxx.yyy:zzz/login_sid.lua
<?xml version="1.0" encoding="utf-8"?><SessionInfo><SID>0000000000000000</SID><Challenge>00adee68</Challenge><BlockTime>0</BlockTime><Rights></Rights></SessionInfo>
(das ist tatsächlich bei mir auch das WAN-Interface einer 7490 mit 113.06.88-45942, auch wenn das mit der Adresse nicht so aussieht) und wenn dabei (dank "--no-check-certificate") eine XML-Struktur kommt, dann hast Du Deinen Fehler bereits (mit hoher Wahrscheinlichkeit) gefunden.
 
Da ich alleinstehende Person nur eine zwei Zimmerwohnung und vier Comet-DECT Aktoren habe, nutze ich mein Smartphone, womit ich sämtliche Smarthomeaktoren auch von Unterwegs schalten kann.
 

Anhänge

  • Screenshot_20170816-065827.png
    Screenshot_20170816-065827.png
    615.8 KB · Aufrufe: 50
Hallo PeterPawn!
Vielen Dank für Deine Anregung.
Wenn ich folgendes versuche:
Aufruf im Browser: http://[meinWEBserver_im_Internet]/Test.php
und
Test.php
diesen Inhalt hat:
<?php
exec("wget --no-check-certificate -q -O - https://[DynDNS der FritzBox]:[Port-der-FritzBox]/login_sid.lua");
?>
so erhalte ich kein Ergebnis - also leere Webseite.

Wenn ich im Browser direkt in die URL eintippe:
https://[DynDNS der FritzBox]:[Port-der-FritzBox]/login_sid.lua
erhalte ich den xml-Strom angezeigt...

PHP-Version ist 7.1...

Deine Vermutung ist übrigens richtig:
Das Zertifikat der FRITZ!Box ist "self-signed".
Wenn ich das wget ohne das "--no-check-certificate" benutze, so erhalte ich gleiches Ergebnis - leere Webseite - also keine Ausgabe...
Achja... ob ich beim wget dann Hochkommata oder Anführungszeichen benutze ist ebenfalls egal...

Da drehe ich mich also noch im Kreis...
Den Ansatz (auf den mich Dein Ansatz gebracht hat) es mal mit cURL zu versuchen, muss ich noch probieren... mal sehen...

Wenn jemand noch eine Idee hat... nur zu! Danke!
 
Ich würde die von dir gesuchten Informationen im Heimnetz von einem Server aufbereiten lassen, und bei Bedarf aus dem Internet einen Upload der generierten Seite Anstossen.

Könntest auch nochmal schauen ob die exec Funktion überhaupt aktiviert ist in deiner php.ini.

Ansonsten schau mal hier http://php.net/manual/en/function.file-get-contents.php wofür du allerdings "allow_url_fopen" aktivieren musst.

Allerdings geht das ganze mit cURL besser und sicherer, dazu eventuell mal hier einlesen http://php.net/manual/en/function.curl-setopt.php

Viel Erfolg!

Edit: Du hattest noch nach einem eventuell ganz anderen Weg gefragt, wie wäre es mit VPN zur Box aus dem Internet ? :)
 
Zuletzt bearbeitet:
Hallo achsoistdas!

Das wäre in meinen Augen auch wohl der beste Ansatz:
"Ich würde die von dir gesuchten Informationen im Heimnetz von einem Server aufbereiten lassen, und bei Bedarf aus dem Internet einen Upload der generierten Seite Anstossen."

Ich habe meine FritzBox 7490 vor einiger Zeit mit modfs geimpft... und dann 6.83 drauf gebracht...
Mir steht auch ein rc.user zur Verfügung, welches es mir erlaubt dann entsprechende Erweiterungen zu nutzen und anzustarten, wenn die FritzBox neu gestartet wird.
So starte ich auch meinen Frewe Client, der mir die Daten meiner Wetterstation an den Webserver im Internet liefert.
Toll wäre es, wenn ich nun auch die Daten (Temperaturwerte) der Actoren des SmartHome auf die Webseite liefern könnte.
Nur bin ich bisher noch nicht auf einen Lösungsansatz gekommen, der mir das bewerkstelligen könnte...

Den cURL-Ansatz will ich - wie schon gesagt - auch noch verfolgen...

Danke für den Tipp... vielleicht findet sich ja noch jemand, der vor ähnlichem Problem gestanden hat und ein Beispiel liefern kann...
 
Solange sich die Update-Frequenz für die Meßwerte im Rahmen hält (auch die Aktoren werden sicherlich nicht jede Sekunde mit der DECT-Basis kommunizieren und neue Werte senden), schafft das eine 7490 noch locker "nebenbei" - man könnte also problemlos dort einen Prozess laufen lassen, der im vorgesehenen Intervall die Daten sammelt und dann per HTTP-Request (man kann ja auch einen POST-Request ausführen lassen, geht notfalls mit "nc" und einer normalen Shell auch problemlos, gibt mehrere Beispiele) diese Daten (meinetwegen als XML) an den Server sendet.

Der kann das dann auch gleich zum Anlaß nehmen, eine (temporäre) statische Seite zu generieren (ggf. zusätzlich zur Speicherung in einer DB, wenn man "Datenhaltung" betreiben will), denn nur bei der Einlieferung neuer Daten kann sich da ja etwas ändern.

Damit braucht auch der Server die Seite nicht dynamisch generieren (zumindest nicht den Teil mit den Daten aus der Ferne) und man spart sich bei wiederholten Abrufen so einer Seite innerhalb eines Aktualisierungsintervalls dann auch noch doppelten Aufwand für den Server.

Auch das "Triggern" für das Update der generierten Seite ist dann geklärt, das stößt die FRITZ!Box an ... und auch die Fehlerbehandlung auf dem Server wird stark vereinfacht, da es den Fall, daß die FRITZ!Box auf eine Anfrage des Servers nicht reagiert (z.B. weil sie gerade neu startet oder eine neue Adresse gekriegt hat und nun erst das DynDNS zu aktualisieren ist, usw., usf.), dann einfach nicht geben kann. Wenn die FRITZ!Box mal den Server nicht erreichen kann, fällt eben eine Aktualisierung aus.

Ich mache das schon seit Jahren so, daß ich an den im FRITZ!OS konfigurieren DynDNS-Server (der auch noch mein eigener ist und mit einer passenden Software für das Update arbeitet) im Abstand von 5 Minuten einen einfachen HTTP-GET-Request als "heartbeat signal" sende, damit der Monitoring-Server spätestens nach 5 Minuten mitkriegt, wenn irgendwo eine FRITZ!Box keine Internetverbindung mehr hat.

Das Skript zum Start dieses Services steht im GitHub-Repo ... allerdings hat es in der dort veröffentlichten Form (die auf regelmäßiges Triggern durch die AVM-Firmware setzt anstatt auf eine Schleife mit "sleep") ein Problem, wenn der "multid" aus irgendeinem Grund neu gestartet wird (das kann auch ein Netzwerk-Ereignis in der FRITZ!Box sein) und man muß es am besten beim Wechsel des Online-Status der Box immer wieder neu starten - ist die Box aus irgendeinem Grund offline, macht es ja aber ohnehin keinen Sinn, das laufen zu lassen und für dieses "onlinechanged" gibt es ja bereits bei AVM die notwendige Infrastruktur in der Firmware.
 
Vielen Dank für die Hinweise! Leider weiß ich noch nicht wie es mir jetzt konkret helfen soll... der Link auf das Skript im GitHub ist o.k. - nur ist mein Problem ja nicht direkt auf meinen Webserver von der Fritzbox zuzugreifen oder zu wissen, wie die öffentliche Adresse meines Webservers oder der Fritzbox ist.
Mein Problem ist: Wie kann ich mit einem kleinen Programm, welches ich auf der Fritzbox installiere dann eine z. B. XML-Datei dort bereitstellen (mit den Temperaturdaten meiner Actoren aus dem Heimnetz) und auf meinen Webserver transportieren um dann meinetwegen dort die Daten zu haben und auszulesen... schöner wäre es natürlich die Daten in die SQL-DB dort schreiben zu können... aber gut... hier fehlen mir einfach Beispiele (wie schon gesagt)... oder ich habe etwas in den Hinweisen überlesen...
 
Das Skript sollte Dir einen Weg aufzeigen, wie man in der FRITZ!Box eine zyklische Datenübertragung zu einem Server im Internet realisieren kann ... denn nichts anderes ist das dort alle fünf Minuten ausgeführte "wget"-Kommando. An welchen Server das nun konkret geht und ob Du den aus der "ar7.cfg" liest oder nicht, hat doch damit gar nichts zu tun.

Ich hingegen verstehe (abseits des mit "start_alive.sh" gezeigten Weges und das ist auch nur ein denkbarer von vielen) nicht, was nun Dein Problem ist.

Du wirst doch den Status der Aktoren auf der FRITZ!Box mit irgendeinem Shell-Skript (oder dreist einem eigenen Programm, wenn Du das hinkriegst, denn da brauchst Du ja i.d.R. etwas für ein Cross-Compile) abfragen (notfalls über das Lua-Interface, einen Link zum dazugehörigen IPPF-Thread müßte ich selbst erst suchen), daraus eine Datei erstellen und diese dann mittels "nc", "wget", "curl" (oder was auch immer, selbst FTP wäre eine Option mit dem schon bei AVM vorhandenen Applet "ftpput", wenn Du beim "modfs" nicht auch die erweiterte BusyBox hast integrieren lassen - wobei "curl" bisher der einzige "Vorschlag" ist, der in der erweiterten BusyBox nicht enthalten wäre) an Deinen Webserver übertragen können - das ist ja (wie Du selbst schreibst) nicht Dein Problem.

Wenn Du hingegen auf der Suche nach einer "schlüsselfertigen" Lösung bist, wie Du von einer FRITZ!Box aus auf sicherem Weg (ohne eigene PHP-Programmierung - auch hier gilt aber wieder, daß Du auf dem Server ja nehmen kannst, was Du willst) irgendwelche Daten in eine Datenbank schreiben kannst, dann wirst Du Dich wohl noch weiter umschauen müssen - wobei sich da dann vermutlich eine richtige Monitoring-Software auf dem Server anbieten würde - z.B. Icinga oder der "Vater" Nagios.

Da hast Du dann auch gleich noch eine (rudimentäre) Visualisierung und wenn die FRITZ!Box als "externer Sensor" betrachtet wird, hast Du auch gleich die Infrastruktur zum Verwalten von Alarmen, usw. - irgendwie fehlen aber immer noch Angaben zu Deinen Kenntnissen und den zur Verfügung stehenden Werkzeugen.

Ich verstehe nämlich auch nicht, warum Du das "wget" zum Testen in eine PHP-Datei einbettest, anstatt es direkt auf der Kommandozeile einzugeben (der Test mit einem Browser ist da wenig aussagekräftig, weil der wohl kaum die PHP-Bibliotheken benutzt und auch ansonsten ein Browser eher damit "rechnet", daß da mal ein "self-signed certificate" auftaucht und das auch ordentlich behandelt). Wenn der Grund dafür sein sollte, daß Du gar nicht wirklich einen eigenen Server hast und das nur irgendein vServer oder sogar nur Webspace mit PHP-Zugriff ist, dann bin ich allerdings raus ... das ist immer Gefrickel und der Betreiber gibt die Möglichkeiten (und Einschränkungen) vor.

Um noch einmal auf den Browser und den Test mit "exec" im PHP zurückzukommen ... ohne die Info, daß die Abfrage aus der PHP-Seite tatsächlich auch bei der FRITZ!Box ankommt, beantwortet wird und "nur" die XML-Daten nicht im PHP ankommen (aber auf dem Server schon), ist dieser Test leider auch ziemlich wertlos. Wenn da nicht einmal das "exec" klappen sollte (mithin "wget" nicht aufgerufen wird), braucht man gar nicht erst weiter in Richtung FRITZ!Box schauen. Und bei Deinem Test der URL im Browser sollte DIch dieser eigentlich darauf aufmerksam gemacht haben, daß die FRITZ!Box auch ihm ein selbstsigniertes Zertifikat vorgelegt hat ... der merkt sich das halt nur (wenn man ihn läßt) und fragt dann nicht erneut, solange sich das Zertifikat (für die URL) nicht ändert. Spätestens beim Aufruf über die IP-Adresse (die ja wohl auch dynamisch ist bei der Box) müßte das aber wieder von vorne beginnen ... so ein Test mit dem Browser kann also nur zeigen, daß/ob es prinzipiell geht, liefert aber von sich aus keinen weiteren Hinweis, warum es im PHP nicht klappt.

Aber das ist (zumindest aus meiner Sicht) ja ohnehin die falsche Richtung der Kommunikation - wo ich die Vorteile der anderen Richtung sehe, habe ich schon aufgeschrieben und Nachteile fallen mir nicht ein, weil eine nicht funktionierende FRITZ!Box (die dann halt nicht von sich aus senden kann) auch nicht reagieren wird, wenn die Initiative vom Server ausgeht. Spätestens wenn das mehr als eine FRITZ!Box als Client wird, zahlt sich die andere Richtung der Kommunikation ohnehin aus.
 
schau mal hier rein: click (muss ja nicht von einem pi sein)
 
Guten Abend! Ich wollte mich mal für die vielen Hinweise bedanken. Habe es auch hinbekommen - cURL mit curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false ); war der richtige Ansatz weil "file_get_contents" bei mir kein Ergebnis lieferte. Weiterhin musste ich mb_convert_encoding ersetzen mit "iconv("UTF-8", "UTF-16LE", $xyz)"... aber dann bin ich an meine FritzBox über https von meinem öffentlichen Webserver gekommen und konnte dann auch die von cURL gelieferten Daten mit simplexml_load_string in einen verwendbaren String schreiben, den ich ganz normal behandeln konnte. Damit habe ich nun die Temperaturen meiner Aktoren auf meiner Webseite.
Danke!
 
@muellman4: Würdest Du deinen php Quellcode mit einer Dokumentation oder Anleitung/Beschreibung hier der Allgemeinheit zur Verfügung stellen wollen? Ich denke, daß an dem Thema bestimmt einige Interesse haben.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.