AHA-HTTP-Interface

boy-deloxe

Neuer User
Mitglied seit
9 Dez 2006
Beiträge
14
Punkte für Reaktionen
0
Punkte
1
Hallo,

ich habe mich mal in das Thema AHA eingearbeitet.

Als Hardware habe ich eine FB 7330SL & eine DECT 200 im Einsatz.

Ich habe mittels C# ein kleines Programm erstellt, welches mir über einen HTTP request die Werte der DECT 200 auslesen soll, wie sie in der .pdf-Datei von AVM beschrieben sind. Das klappt soweit auch alles wunderbar. Jedoch gibt es 2 Probleme:

1. Kommando 'gettemperature'

Dieses Kommando liefert keinen Wert zurück. Über 'getdevicelistinfos' erhalte ich jedoch alle Werte, unter anderem auch die Temperatur, welche ich dann manuell parsen könnte und weiterverarbeiten könnte. Warum erzeugt mir das Kommando 'gettemperature' diesen Wert nicht?

2. Probleme mit https

In der .pdf-Datei wird beschrieben, dass man den request über https absenden soll. Die Verwendung von z.B. folgender URL

https://fritz.box/webservices/homeautoswitch.lua?ain=087657804227&switchcmd=getdevicelistinfos&sid=<SID>

liefert jedoch bei keinen Kommandos Werte zurück. Ich habe dazu Testweise die URL über einen Browser aufgerufen mit gültiger SID, der zeigt jedoch nach kurzer Zeit ebenfalls nur Verbindung fehlgeschlagen an. Auch ein Anfügen vom https Port brachte kein Erfolg.

Vielen Dank im Voraus!
 
Zuletzt bearbeitet:
Das ist - zumindest in Punkt 1 - schnell erklärt ... die Funktion ist vermutlich einfach noch nicht implementiert.

Das ganze Interface beruht ja auf einer (lesbaren) Lua-Datei im Webinterface. Wenn man das für eine 7490 mit 06.36-Labor ansieht:
Code:
# grep switchcmd /usr/www/avm/webservices/homeautoswitch.lua
if box.get.ain and box.get.switchcmd then
if (box.get.switchcmd == "getswitchstate") then
elseif (box.get.switchcmd == "getswitchmode") then
elseif (box.get.switchcmd == "getswitchpresent") then
elseif (box.get.switchcmd == "getswitchpower") then
elseif (box.get.switchcmd == "getswitchname") then
elseif (box.get.switchcmd == "getswitchenergy") then
elseif (box.get.switchcmd == "gettemperature") then
elseif (box.get.switchcmd == "gethkrtsoll") then
elseif (box.get.switchcmd == "gethkrkomfort") then
elseif (box.get.switchcmd == "gethkrabsenk") then
elseif (box.get.switchcmd == "setswitchon") then
elseif (box.get.switchcmd == "setswitchoff") then
elseif (box.get.switchcmd == "sethkrtsoll") and box.get.param then
elseif (box.get.switchcmd == "setswitchtoggle") then
elseif (box.get.switchcmd == "getswitchlist") then
elseif (box.get.switchcmd == "getdevicelistinfos") then
if box.get.switchcmd then
if (box.get.switchcmd == "getswitchlist") then
elseif (box.get.switchcmd == "getdevicelistinfos") then
sieht man einen deutlichen Unterschied zur Version 06.30 bei derselben Box:
Code:
# grep switchcmd /usr/www/avm/webservices/homeautoswitch.lua
if box.get.ain and box.get.switchcmd then
if (box.get.switchcmd == "getswitchstate") then
elseif (box.get.switchcmd == "getswitchmode") then
elseif (box.get.switchcmd == "getswitchpresent") then
elseif (box.get.switchcmd == "getswitchpower") then
elseif (box.get.switchcmd == "getswitchname") then
elseif (box.get.switchcmd == "getswitchenergy") then
elseif (box.get.switchcmd == "setswitchon") then
elseif (box.get.switchcmd == "setswitchoff") then
elseif (box.get.switchcmd == "setswitchtoggle") then
elseif (box.get.switchcmd == "getswitchlist") then
elseif (box.get.switchcmd == "getdevicelistinfos") then
if box.get.switchcmd then
if (box.get.switchcmd == "getswitchlist") then
elseif (box.get.switchcmd == "getdevicelistinfos") then
Wie der Satz in der AVM-PDF-Datei "Für die Schnittstellenversion 1.08 wird FRITZ!OS ab Version 6.35 benötigt." (Kapitel 1, letzter Satz) also zu interpretieren ist, kannst Du anhand der "Nachschau" in Deiner eigenen Firmware-Version (die Du ohnehin nicht erwähnt hast) ermitteln.

Zum Problem mit dem HTTPS-Zugriff würde ich die Vermutung wagen, daß Du externen HTTPS-Zugriff aktiviert hast (dafür braucht's notfalls auch nur eine (Android-)App, die von extern zugreifen will) und dann gilt bei einem HTTPS-Zugriff aus dem LAN (leider) ebenfalls dieser von extern verwendete Port (bisher jedenfalls, ich hoffe stark, daß AVM das ändert oder zumindest einstellbar macht). Deine Beschreibung klingt jedenfalls nach "timeout".
 
habe gerade mal nachgesehen, bis zur FW 31xxx ist "gettemperature" noch im LUA-Code homeautoswitch.lua enthalten:

Code:
# grep switchcmd F*/usr/www/avm/webservices/homeautoswitch.lua| grep gettemperature
FB7490-06.30
FB7490-06.36-31504/usr/www/avm/webservices/homeautoswitch.lua:elseif (box.get.switchcmd == "gettemperature") then
FB7490-06.36-31540/usr/www/avm/webservices/homeautoswitch.lua:elseif (box.get.switchcmd == "gettemperature") then

FB7490-06.36-31629/usr/www/avm/webservices/homeautoswitch.lua:elseif (box.get.switchcmd == "gettemperature") then
FB7490-06.36-31656/usr/www/avm/webservices/homeautoswitch.lua:elseif (box.get.switchcmd == "gettemperature") then
FB7490-06.36-31687/usr/www/avm/webservices/homeautoswitch.lua:elseif (box.get.switchcmd == "gettemperature") then
FB7490-06.36-31739/usr/www/avm/webservices/homeautoswitch.lua:elseif (box.get.switchcmd == "gettemperature") then
FB7490-06.36-31822/usr/www/avm/webservices/homeautoswitch.lua:elseif (box.get.switchcmd == "gettemperature") then

LG Riverhopper

EDIT: Korrektur eingefügt, irgendwie waren nicht alle Images nicht ausgepackt, daher war grep-output unvollständig,
nach Ausführen von extract_06.36_filesystem sieht alles OK aus.
 
Zuletzt bearbeitet:
Ich weiß nicht genau, wonach Du da "grep"st ... bei einer frisch ausgepackten 113.06.36-31739
Code:
# grep export etc/version
export FIRMWARE_VERSION=${CONFIG_VERSION_MAJOR}.06.36
export FIRMWARE_SUBVERSION="-31739"
export FIRMWARE_DATE="05.11.2015 12:56:05"
ist das gettemperature bei mir in Zeile 600 in der homeautoswitch.lua (im avm-Zweig zumindest) immer noch vorhanden:
Code:
# grep switchcmd usr/www/avm/webservices/homeautoswitch.lua
577:if box.get.ain and box.get.switchcmd then
582:if (box.get.switchcmd == "getswitchstate") then
585:elseif (box.get.switchcmd == "getswitchmode") then
588:elseif (box.get.switchcmd == "getswitchpresent") then
591:elseif (box.get.switchcmd == "getswitchpower") then
594:elseif (box.get.switchcmd == "getswitchname") then
597:elseif (box.get.switchcmd == "getswitchenergy") then
[COLOR="#FF0000"]600:elseif (box.get.switchcmd == "gettemperature") then[/COLOR]
603:elseif (box.get.switchcmd == "gethkrtsoll") then
606:elseif (box.get.switchcmd == "gethkrkomfort") then
609:elseif (box.get.switchcmd == "gethkrabsenk") then
612:elseif (box.get.switchcmd == "setswitchon") then
615:elseif (box.get.switchcmd == "setswitchoff") then
618:elseif (box.get.switchcmd == "sethkrtsoll") and box.get.param then
621:elseif (box.get.switchcmd == "setswitchtoggle") then
624:elseif (box.get.switchcmd == "getswitchlist") then
627:elseif (box.get.switchcmd == "getdevicelistinfos") then
635:if box.get.switchcmd then
636:if (box.get.switchcmd == "getswitchlist") then
639:elseif (box.get.switchcmd == "getdevicelistinfos") then
... hatte ich aber auch vorher schon geprüft und oben eigentlich schreiben wollen, das war ja die Ausgabe des "grep switchcmd" am "lebenden Objekt" - die wirklich aktuelle Version (mea culpa, ich hätte ordentliche Nummern anstelle dieses blöden "aktuell" verwenden sollen, kann der nächste gerne als Beleg für "ungenügende Versionsangaben" heranziehen) habe ich noch gar nicht geladen.

EDIT: Außer in der jüngeren 31687 aus Deiner Liste (die habe ich nicht entpackt im firmware-Verzeichnis vorliegen), haben bei mir auch die anderen Vorgängerversionen das "gettemperature" dort, wo es offenbar hingehört:
Code:
grep -n switchcmd ./*/usr/www/avm/webservices/homeautoswitch.lua | grep gettemp
./113.06.35-30804/usr/www/avm/webservices/homeautoswitch.lua:600:elseif (box.get.switchcmd == "gettemperature") then
./113.06.35-30987/usr/www/avm/webservices/homeautoswitch.lua:600:elseif (box.get.switchcmd == "gettemperature") then
./113.06.35-31050/usr/www/avm/webservices/homeautoswitch.lua:600:elseif (box.get.switchcmd == "gettemperature") then
./113.06.35-bkaivers-build_8052-30999M/usr/www/avm/webservices/homeautoswitch.lua:600:elseif (box.get.switchcmd == "gettemperature") then
./113.06.36-31135/usr/www/avm/webservices/homeautoswitch.lua:600:elseif (box.get.switchcmd == "gettemperature") then
./113.06.36-31410/usr/www/avm/webservices/homeautoswitch.lua:600:elseif (box.get.switchcmd == "gettemperature") then
./113.06.36-31504/usr/www/avm/webservices/homeautoswitch.lua:600:elseif (box.get.switchcmd == "gettemperature") then
./113.06.36-31540/usr/www/avm/webservices/homeautoswitch.lua:600:elseif (box.get.switchcmd == "gettemperature") then
./113.06.36-31629/usr/www/avm/webservices/homeautoswitch.lua:600:elseif (box.get.switchcmd == "gettemperature") then
./113.06.36-31656/usr/www/avm/webservices/homeautoswitch.lua:600:elseif (box.get.switchcmd == "gettemperature") then
./113.06.36-31739/usr/www/avm/webservices/homeautoswitch.lua:600:elseif (box.get.switchcmd == "gettemperature") then
Ich würde spontan darauf tippen, daß bei Dir die Datei in den anderen Verzeichnissen schlicht fehlte.
 
Zuletzt bearbeitet:
Hallo PeterPawn,
Du hast Recht, irgendwie waren hier nicht alle FW.images ausgepackt;
nach Ausführen von extract_06.36_filesystem sieht alles OK aus, habe #3 soeben angepasst.

LG Riverhopper
 
Yep ... bitte auch nicht falsch verstehen, wenn da mal eine Antwort nicht auf Anhieb in aller Ausführlichkeit und richtig "freundlich" erfolgt.

Ich begrüße es sehr, wenn jemand mitdenkt und eigene Anstrengungen zur Untersuchung/zum Nachstellen von irgendwelchen Behauptungen unternimmt und so etwas auch mal hinterfragt - das ist mir persönlich lieber als "blinde Gefolgschaft" mit dem Hinweis "geht nicht" am Ende.

Aber es ist nicht immer sofort die Zeit für eine umfassende Antwort vorhanden (zumal ich nach solchen Hinweisen natürlich selbst noch einmal prüfe, bevor ich etwas Falsches schreibe) - da kann die erste Reaktion schon mal etwas "kurz angebunden" ausfallen.
 
Zuerst mal Danke für die superschnellen und guten Antworten!

Ich verwende FRITZ!OS 06.30 und damit trifft das von PeterPawn vollkommen zu, dass die Funktion schlicht und einfach nicht implementiert ist.

Zu der Geschichte mit dem HTTPS:

Ich habe den request einmal erneut mit angehängtem Port ausgeführt und siehe da: es funktioniert!

Um eventuell anderen Leuten noch die Chance bei Problemen mit einer Verwendung in C# Programmen zu geben:

Den Port entnimmt man den FB-Einstellungen und erhält somit eine URL die wie folgt aussieht: https://fritz.box:<PORT>/webservices/homeautoswitch.lua?ain=<AIN>&switchcmd=<CMD>&sid=<SID>

Durch die https-Verbindung, muss das von der der FB erstellte Zertifikat als vertrauenswürdig eingestuft werden. Da gibt es nun verschiedene Möglichkeiten.
Um eine einfache und schnelle Lösung zu zeigen, muss VOR dem request folgende Code-Zeile erzeugt werden:

Code:
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Hierdurch werden alle Zertifikatanfragen schlicht im bypass umgangen. Dies kann je nach Anwendung nachtürlich nicht erwünscht sein, sodass eine vertrauensvolle Einstufung z.B. durch client-seitige Hinterlegung des Zertifikats zu erfolgen hat.

Ich bedanke mich und wünsche ein schönes Wochenende!
 
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.