NEWS
JSON aus diesem Link - Ist das machbar ? MELCLOUD
-
Hallo zusammen,
ich würde gerne ein Javascript haben was mir Geräte aus Melcloud anzeigt und ich würde dann gerne die geräte ansprechen. Es gibt zwar einen Adapter für Homebridge der auch funktioniert, aber ich denke es wäre schöner wenn ich direkt Objekte hätte die ich ansprechen kann ...
Ich habe noch nicht viel zu dem Thema aber es ist ein Anfang. Die Frage ist jetzt ob es überhaupt so machbar ist. Ich habe diese französische Dokument gefunden:
http://mgeek.fr/blog/un-peu-de-reverse-engineering-sur-melcloud
So wie es aussieht muss es da was geben. z.B für den Login:
URL : https://app.melcloud.com/Mitsubishi.Wifi.Client/Login/ClientLogin
Méthode : POST
Retour : JSONParamètres :
AppVersion: 1.7.1.0,
Language: 7,
CaptchaChallenge: null,
CaptchaResponse: null,
Persist: true,
Email: votrelogin@email.com,
Password: monmotdepasseenclairWenn man aber den Login Link einfach nur so aufruft kommt man normal im web raus und bekommt eine Fehlermeldung das es die Seite nicht gibt.
Interessanter sieht das hier aus, es handelt sich um die Abfrage der Geräte, warscheinlich nach dem Login:
URL : https://app.melcloud.com/Mitsubishi.Wifi.Client/User/ListDevices
Méthode : GET
Retour : JSONEn-tête : X-MitsContextKey: XXXXXXXXXXXXXX
Rufe ich die URL auf kommt reine Rückmeldung:
{ Success: false, ErrorMessage: ""}Da klappt schon mal was, aber es gibt kein JSON zurück.
Wenn es möglich ist ein Java Script zu schreiben was die entsprechende JSON zurückliefert, wer kann dabei helfen ? Ich habe leider keine Ahnung ...
Kann jemand helfen ? Ich würde das gerne machen, hab keinen Plan, will aber was dadurch lernen ... Also wer Lust und Zeit hat ... Bitte - gerne
Viele Grüße,
Marc -
Ich habe folgendes noch gefunden - Aber das kann ich ja auch nicht auf dem IOBroker laufen lassen. Aber vielleicht hilft es weiter ?
email = 'test@test.com' password = '123456' https = require('ssl.https') json = require('json') ltn12 = require('ltn12') function encodepost(t) local res = {} local esc = require('socket.url').escape for k, v in pairs(t) do res[ #res + 1 ] = esc(k) .. '=' .. esc(v) end return table.concat(res, '&') end function login(email, password) local url = 'https://app.melcloud.com/Mitsubishi.Wifi.Client/Login/ClientLogin' local data = encodepost({ AppVersion = '1.9.3.0', Language = '7', CaptchaChallenge = '', CaptchaResponse = '', Persist = 'true', Email = email, Password = password, }) local res, code = https.request(url, data) if res then resp = json.pdecode(res) if type(resp) ~= 'table' then return nil, 'failed to decode reply data' elseif resp.ErrorId ~= json.null then return nil, 'cloud login failed' else return resp.LoginData.ContextKey end else return nil, 'login request failed' end end function getdevices(key) local url = 'https://app.melcloud.com/Mitsubishi.Wifi.Client/User/ListDevices' local tbl = {} local res, code = https.request({ url = url, headers = { ['X-MitsContextKey'] = key }, sink = ltn12.sink.table(tbl), }) if res then local data = table.concat(tbl) return json.pdecode(data) else return nil, 'get devices request failed' end end key, err = login(email, password) if key then items, err = getdevices(key) if items then for _, item in ipairs(items) do local devs = item.Structure.Devices for _, dev in ipairs(devs) do log(dev) end end else log(err) end else log(err) end
-
Hallo zusammen,
hat wirklich niemand eine Idee ?
@paul53 - Hey Paul, Du weißt doch so gut wie alles
Viele Grüße,
Marc -
@meicker sagte:
Paul, Du weißt doch so gut wie alles
Danke für die Lorbeeren, aber so ist es leider nicht (französisch verstehe ich auch nicht). Ich kann Dich nur auf das bereits im Javascript-Adapter enthaltene Modul request verweisen. Du findest dazu auch einige Beispiele im Forum.
P.S. Ich verwende grundsätzlich keine Lösungen auf Cloud-Basis, folglich kenne ich mich damit nicht aus.
-
@paul53
Du bekommst gerne die Lorbeeren Du hast mir bisher immer den richtigen Weg zeigen können Request schaue ich mir mal an. Vielleicht hilft es ja. DankeViele grüße,
Marc -
@paul53
Warum funktioniert eigentlich das script nicht was ich da oben gepostet habe ? Das wirft einen Fehler aus ... ist das nicht schon irgendwie ein Anfang der für iobroker umgestrickt werden müsste ?vg
Marc -
@meicker sagte:
Warum funktioniert eigentlich das script nicht was ich da oben gepostet habe ?
Weil das kein Javascript ist.
-
@paul53
Argument -
-
@meicker kannste damit vielleicht was anfangen? response.body bleibt leer, da ich keine Geräte habe die in der App registriert werden können.
@paul53 siehst du auf Anhieb was, wie man das "Script" besser schreiben könnte? Bin ja auch noch am lernen.
LogIn(); function LogIn () { var url = "https://app.melcloud.com/Mitsubishi.Wifi.Client/Login/ClientLogin"; var form = { AppVersion: "1.9.3.0", CaptchaChallenge: "", CaptchaResponse: "", Email: "hier deine email aus der Registrierung", Language: "4", //hier kann man Zahlen für verschiedene Sprachen eingeben eingeben --> keine Übersicht gefunden Password: "hier dein Passwort", Persist: "true" }; var method = "post"; request({ url: url, form: form, method: method }, function (error, response) { if (!error && response.statusCode == 200) { log('Device_statusCode: ' + response.statusCode); let obj = JSON.parse(response.body); log('ContextKey: ' + obj.LoginData.ContextKey); let ContextKey = obj.LoginData.ContextKey; getDevices (ContextKey); } else { log('Geräteabfrage fehlgeschlagen ==> StatusCode: ' + response.statusCode); log('Geräteabfrage fehlgeschlagen ==> Error: ' + error); } }); } function getDevices(ContextKey) { var url = "https://app.melcloud.com/Mitsubishi.Wifi.Client/User/ListDevices"; var method = "get"; request({ url: url, method: method, headers: {"X-MitsContextKey" : ContextKey} }, function(error, response) { if (!error && response.statusCode == 200) { log('Device_statusCode: ' + response.statusCode); log('response: ' + JSON.stringify(response)); } else { log('Geräteabfrage fehlgeschlagen ==> StatusCode: ' + response.statusCode); log('Geräteabfrage fehlgeschlagen ==> Error: ' + error); } }); }
-
-
@paul53 sagte in JSON aus diesem Link - Ist das machbar ? MELCLOUD:
@Lenny-CB sagte:
keine Übersicht gefunden
man man man, du hast deine Augen auch überall oder kannst einfach Google besser bedienen als ich. -
@Lenny-CB sagte:
function (error, response) {
an die Callback-Funktion von request() werden doch 3 Parameter übergeben ?
request(options, function (error, response, body) {
wobei das gewünschte Ergebnis in body übergeben wird.
-
@paul53 sagte in JSON aus diesem Link - Ist das machbar ? MELCLOUD:
wobei das gewünschte Ergebnis in body übergeben wird.
stimmt, da habe ich mich wohl von deinem Homebridge-Link verleiten lassen. Das war die Grundlage meiner "Script-Schmiererei".
Was wäre hier richtiger? Es aus dem body oder aus dem response zu nehmen? (steht ja in beidem drin) -
@Lenny-CB sagt:
body oder aus dem response zu nehmen? (steht ja in beidem drin)
Wenn das Ergebnis sowohl in body als auch in response.body übergeben wird, ist es egal, wie man es macht (die Variante mit response.body war mir nicht geläufig).
-
@paul53 naja sagen wir mal so, ich bin ja der letzte der sagen kann ob es eine Variante ist oder nicht. Bei response kam ein JSON raus in dem ein body mit dem gesuchten Ausdruck enthalten war. Dann habe ich das da "raus gefummelt" und nicht weiter im "richtigen" body geschaut.
Mal schauen was @meicker draus macht. -
@Lenny-CB
ich bin gar nicht so weit das ich bei euch mitreden könnte Ich könnte aus einer fast funktionierenden Lösung was umbauen aber selber bekomme ich das leider nicht hin. Für Melcloud bin ich jetzt einen anderen Weg gegangen und habe mit die Daten über Openhab reingeholt. Schöner wäre es natürlich wenn man das mit Java hinbekommen würde und richtig schick wäre ein Adapter. Aber ich kann da, außer das ich die Hardware habe zum testen, nicht weiter helfen ... Leider ... Ich würde es so gerne können ...vg Marc