Verschoben: smappee lokale API mit HTTPMOD

Begonnen von wocken, 10 März 2016, 22:47:23

Vorheriges Thema - Nächstes Thema

wocken

Hallo Leute,

ich habe das Ziel, meinen Smappee Energiemonitor nur noch lokal zu betreiben, damit er seine Daten nicht mehr in die Cloud schickt. Dazu würde ich gerne http://192.168.x.xxx/gateway/apipublic/reportInstantaneousValues mit HTTPMOD abfragen. Ist auch alles kein Problem, RegExp funktioniert auch, man muss sich aber zuerst bei http://192.168.x.xxx/gateway/apipublic/logon mit einem Passwort (Standardpasswort "admin", kein Benutzername) anmelden. Ich habe schon herausgefunden, dass die logonseite die Anfrage "POST" erlaubt, ich bekomme aber immer die Meldung, dass das Passwort falsch ist.


define smappee HTTPMOD http://192.168.0.113/gateway/apipublic/logon 60
attr smappee getHeader01 Content-Type: application/json
attr smappee requestData {"post": "admin"}


Ich habe auch keine klare Aussage über die Syntax in requestData bzw. POST gefunden. Gibt es da einen Trick?

Danke im Voraus für Eure Hilfe

Viele Grüße

Jochen

wocken

Hallo, ich habe in der Zwischenzeit ziemlich viel probiert und komme nun wieder nicht mehr weiter. Ich habe mich nun nur auf den Login konzentriert. Hier nochmal die Fakten:

Burp Suite Log der POST-Anfrage:

POST /gateway/apipublic/logon HTTP/1.1
Host: 192.168.0.152
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/json
X-Requested-With: XMLHttpRequest
Referer: http://192.168.0.152/smappee.html
Content-Length: 5
Connection: close

admin


Antwort aus Burp Suite:

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Cache-Control: no-cache
Date: Mon, 28 Mar 2016 15:36:51 GMT
Accept-Ranges: bytes
Server: Restlet-Framework/2.0.14
Vary: Accept-Charset, Accept-Encoding, Accept-Language, Accept
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: *
Access-Control-Allow-Headers: X-Requested-With, Content-Type
Access-Control-Allow-Credentials: false
Access-Control-Max-Age: 60
Content-Length: 84
Connection: close

{"success":"Logon successful!","header":"Logon to the monitor portal successful..."}


HTTPMOD in fhem.cfg:

define smappeelogon HTTPMOD none 30
attr smappeelogon userattr get01Data get01Header1 get01Header2 get01Name get01URL verbose
attr smappeelogon get01Data {"POST" :{"admin"}}
attr smappeelogon get01Header1 Content-Type: application/json
attr smappeelogon get01Header2 Accept: */*
attr smappeelogon get01Name logon
attr smappeelogon get01URL http://192.168.0.152/gateway/apipublic/logon
attr smappeelogon verbose 5


Reading aus HTTPMOD:

HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8
Cache-Control: no-cache
Date: Mon, 28 Mar 2016 15:33:05 GMT
Accept-Ranges: bytes
Server: Restlet-Framework/2.0.14
Vary: Accept-Charset, Accept-Encoding, Accept-Language, Accept
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: *
Access-Control-Allow-Headers: X-Requested-With, Content-Type
Access-Control-Allow-Credentials: false
Access-Control-Max-Age: 60
Content-Length: 48
{"error":"Logon failed, wrong portal password!"}


Hat jemand eine Idee, wie ich das Wort "admin" noch an die Webseite übermitteln kann? Verstehe ich die Syntax von get01Data falsch?

Vielen Dank für Eure Hilfe!

Viele Grüße

Jochen

StefanStrobel

Hallo Jochen,

ein HTTP-Post Request enthält einen Daten-Teil. In Deiner Aufzeichnung ist das nur admin. Ein GET-Request dagegen hat keinen Daten-Anteil und würde den Wert z.B. als Query-String an die URL Anhängen.
Bei HTTPMOD wird automatisch ein POST-Request erzeigt, wenn Du ein Attribut wie requestData, getXXData o.ä. angibst.

attr smappeelogon get01Data {"POST" :{"admin"}}

würde den Text {"POST" :{"admin"}} als Datenteil schicken. Du möchtest jedoch nur admin haben.

Zudem soll das ganze ja automatisch passieren wenn ein Login nötig ist. Du solltest deshalb die sid... Attribute verwenden.
Allerdings scheint in Deiner Aufzeichnung noch eine Session ID o.ä. zu fehlen (oder die Entwickler schalten einfach nur Deine IP-Adresse frei, was recht gruselig wäre).

Schau doch Bitte mal die Anleitung zur Session-Verwaltung im Wiki an.

Gruss
    Stefan


wocken

#3
Hallo Stefan,

vielen Dank für den Hinweis! Der lokale Zugriff auf Smappee ist in der Tat gruselig, da die Eingabe des Passworts (Benutzernamen gibt es nicht) von irgend einer IP genügt, um Einstellungen vorzunehmen und Werte auszulesen. Session ID gibt es dann natürlich auch nicht.

attr smappeelogon get01Data admin

hat mich zum gewünschten Ergebnis gebracht. Dank FHEM und HTTPMOD kann ich aber nun Smappee in meinem FHEM-Netzwerk betreiben, welches keine Verbindung zum Internet hat. So kann ich in FHEM schön alles mitloggen und die Datenkrake bekommt nix ;-)

Viele Grüße

Jochen

_________________________________________
Edit:
Der Vollständigkeit halber der komplette code:

define smappee HTTPMOD http://192.168.0.152/gateway/apipublic/instantaneous 30
attr smappee userattr get01Data get01Header1 get01Header2 get01Name get01Poll:0,1 get01PollDelay get01PollDelay:0,1 get01URL reading01JSON reading01Name reading01OExpr reading02JSON reading02Name reading02OExpr reading03JSON reading03Name reading03OExpr reading04Name reading04OExpr requestData requestHeader1 requestHeader2
attr smappee get01Data admin
attr smappee get01Header1 Content-Type: application/json
attr smappee get01Header2 Accept: */*
attr smappee get01Name logon
attr smappee get01Poll 1
attr smappee get01PollDelay 300
attr smappee get01URL http://192.168.0.152/gateway/apipublic/logon
attr smappee reading01JSON 02_value
attr smappee reading01Name A
attr smappee reading01OExpr $val / 1000
attr smappee reading02JSON 05_value
attr smappee reading02Name B
attr smappee reading02OExpr $val / 1000
attr smappee reading03JSON 08_value
attr smappee reading03Name C
attr smappee reading03OExpr $val / 1000
attr smappee requestData loadInstantaneous
attr smappee requestHeader1 Content-Type: application/json
attr smappee requestHeader2 Accept: */*
attr smappee room smappee
attr smappee stateFormat {sprintf("%.0f W, %.0f W, %.0f W", ReadingsVal("smappee","A",0),ReadingsVal("smappee","B",0),ReadingsVal("smappee","C",0))}
attr smappee verbose 3
define Log_smappee FileLog /opt/fhem/log/smappee-%Y.log smappee:.*
attr Log_smappee room smappee
define weblink_smappee SVG Log_smappee:weblink_smappee:CURRENT
attr weblink_smappee plotsize 1000,350
attr weblink_smappee room smappee


Leider wird smappee nach ein bis zwei Tagen ohne Internet nervös, startet sich neu und sucht nach Netzwerken mit Internet. Das ist also keine Dauerlösung. Dann werde ich wohl doch selbst was auf Arduino-Basis basteln müssen...