NEWS
Hilfe bei Gardena API
-
@dslraser dann versuch mal folgendes mit deinen Daten.
const request = require('request'); function requestLocations(token, key) { const options = { url: 'https://api.smart.gardena.dev/v1/locations', method: 'GET', headers: { 'Authorization': 'Bearer ' + token, 'Authorization-Provider': 'husqvarna', 'X-Api-Key': key } } request(options, (error, response, body) => { console.log(body); }); }
-
@J-A-R-V-I-S
Das ist die andere Methode, oder ? -
@dslraser das wäre das Abfragen der Locations. Du kannst da natürlich auch eine Funktion draus machen. Habe es oben geändert.
-
@dslraser Die erste API ist für die Anmeldung, die Zweite zur Steuerung der Gardena Geräte. Du brauchst also beides.
In Zeile 8 muss der Token aus Skript eins rein. -
@Jey-Cee sagte in Hilfe bei Gardena API:
In Zeile 8 muss der Token aus Skript eins rein.
Den habe ich noch nicht und auch noch nicht genau verstanden wie ich den ins Log oder in eine Variable bekomme.
-
@Jey-Cee sagte in Hilfe bei Gardena API:
let token = login();
Damit bekommst du den Token. Und dann rufst du die zweite Funktion auf.
requestLocations(token, appKey);
Meine Funktion ist ungetestet, da ich dort keine Zugangsdaten habe. Laut der Doku sollte die Abfrage aber so vonstattengehen.
-
So ?
const fetch = require('node-fetch'); const { URLSearchParams } = require('url'); const username = 'xxx@xxx.de'; const password = 'xxxxx'; const appKey = 'xxxxx'; async function login() { const params = new URLSearchParams(); params.set('grant_type', 'password'); params.set('client_id', appKey); params.set('username', username); params.set('password', password); const res = await fetch('https://api.authentication.husqvarnagroup.dev/v1/oauth2/token', { method: 'POST', body: params }); if (!res.ok) { throw new Error(res.statusText); } return res.json(); } let token = login(); const request = require('request'); function requestLocations(token, key) { const options = { url: 'https://api.smart.gardena.dev/v1/locations', method: 'GET', headers: { 'Authorization': 'Bearer ' + token, 'Authorization-Provider': 'husqvarna', 'X-Api-Key': '6dc5b7d9-d426-4b58-84c8-c3733e08e9cb' } } request(options, (error, response, body) => { console.log(body); }); }
-
const fetch = require('node-fetch'); const { URLSearchParams } = require('url'); const request = require('request'); const username = 'xxx@xxx.de'; const password = 'xxxxx'; const appKey = 'xxxxx'; async function login() { const params = new URLSearchParams(); params.set('grant_type', 'password'); params.set('client_id', appKey); params.set('username', username); params.set('password', password); const res = await fetch('https://api.authentication.husqvarnagroup.dev/v1/oauth2/token', { method: 'POST', body: params }); if (!res.ok) { throw new Error(res.statusText); } return res.json(); } function requestLocations(token, key) { const options = { url: 'https://api.smart.gardena.dev/v1/locations', method: 'GET', headers: { 'Authorization': 'Bearer ' + token, 'Authorization-Provider': 'husqvarna', 'X-Api-Key': '6dc5b7d9-d426-4b58-84c8-c3733e08e9cb' } } request(options, (error, response, body) => { console.log(body); }); } let token = login(); requestLocations(token, appKey);
-
bzw. unten anders, da das sonst asyncron ausgeführt wird und du keinen Token erhälst:
let token = await login(); requestLocations(token, appKey);
das untere
async function getData(appKey) { let token = await login(); requestLocations(token, appKey); } getData(appKey);
-
@J-A-R-V-I-S
damit bekam ich{"message":"Forbidden"}
-
async function getData(appKey) { let token = await login(); requestLocations(token, appKey); } getData(appKey);
Damit habe ich nichts mehr im Log
-
@dslraser sagte in Hilfe bei Gardena API:
async function getData(appKey) {
dann bau mal bitte in dieser Funktion eine Consolenausgabe ein, die den Token ausgibt.
console.log(token);
und verwende sonst einmal in der anderen Ausgabe anstatt
body
response
. -
@J-A-R-V-I-S
kommt kein Token im Logconst fetch = require('node-fetch'); const { URLSearchParams } = require('url'); const request = require('request'); const username = 'xxx.xxx@xxx.de'; const password = 'xxx'; const appKey = 'xxx'; async function login() { const params = new URLSearchParams(); params.set('grant_type', 'password'); params.set('client_id', appKey); params.set('username', username); params.set('password', password); const res = await fetch('https://api.authentication.husqvarnagroup.dev/v1/oauth2/token', { method: 'POST', body: params }); if (!res.ok) { throw new Error(res.statusText); } return res.json(); } function requestLocations(token, key) { const options = { url: 'https://api.smart.gardena.dev/v1/locations', method: 'GET', headers: { 'Authorization': 'Bearer ' + token, 'Authorization-Provider': 'husqvarna', 'X-Api-Key': 'xxx' } } request(options, (error, response, body) => { console.log(response); }); } async function getData(appKey) { let token = await login(); requestLocations(token, appKey); console.log(token); } getData(appKey);
-
@dslraser probier einfach nur mal folgenden Code in einem eigenen Skrip aus:
const request = require('request'); const username = 'xxx@xxx.de'; const password = 'xxxxx'; const appKey = 'xxxxx'; const options = { url: 'https://api.authentication.husqvarnagroup.dev/v1/oauth2/token', method: 'POST', body: { grant_type: 'password', client_id: appKey, username: username, password: password } } request(options, (err, response, body) => { console.log(body); });
-
@J-A-R-V-I-S
damit schmiert es direkt abhost.iobroker 2020-01-12 00:33:15.420 error Caught by controller[1]: (node:1118) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js proce host.iobroker 2020-01-12 00:33:15.420 error Caught by controller[1]: (node:1118) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by r host.iobroker 2020-01-12 00:33:15.420 error Caught by controller[1]: (node:1118) UnhandledPromiseRejectionWarning: TypeError: URLSearchParams is not a constructor host.iobroker 2020-01-12 00:33:15.420 error Caught by controller[0]: at processImmediate (timers.js:658:5) host.iobroker 2020-01-12 00:33:15.420 error Caught by controller[0]: at tryOnImmediate (timers.js:676:5) host.iobroker 2020-01-12 00:33:15.420 error Caught by controller[0]: at runCallback (timers.js:705:18) host.iobroker 2020-01-12 00:33:15.420 error Caught by controller[0]: at Immediate.<anonymous> (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:578:7) host.iobroker 2020-01-12 00:33:15.420 error Caught by controller[0]: at end (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:549:18) host.iobroker 2020-01-12 00:33:15.419 error Caught by controller[0]: at Request.write (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:1500:27) host.iobroker 2020-01-12 00:33:15.419 error Caught by controller[0]: at ClientRequest.write (_http_outgoing.js:567:10) host.iobroker 2020-01-12 00:33:15.419 error Caught by controller[0]: at write_ (_http_outgoing.js:595:11) host.iobroker 2020-01-12 00:33:15.418 error Caught by controller[0]: TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be one of type string or Buffer. Received type object
-
@dslraser habe es ausgebessert:
const request = require('request'); const username = 'xxx@xxx.de'; const password = 'xxxxx'; const appKey = 'xxxxx'; const options = { url: 'https://api.authentication.husqvarnagroup.dev/v1/oauth2/token', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: JSON.stringify({ grant_type: 'password', client_id: appKey, username: username, password: password }) } request(options, (err, response, body) => { console.log(body); });
-
javascript.0 2020-01-12 00:37:36.398 info (1208) script.js.11_Gardena.Gardena1: {"error":"invalid_client","error_description":"Invalid client: cannot retrieve client credentials"}
-
Edit: morgen gehts weiter.....
-
@J-A-R-V-I-S
Edit: gelöscht -
Hier noch mal das bisherige Script, falls es jemand weiter verfolgen möchte. Ich werde wohl nicht damit weiter machen, obwohl jetzt die Anmeldung und auch der Abruf der Geräte soweit funktioniert.
const request = require('request'); const username = 'xxx.xxx@xxx.de'; const password = 'xxxxxxxxxx'; const appKey = 'xxxxxxxxxx'; const token = 'muss aus gelesen werden'; const user_id = 'kommt hier rein'; const refresh_token = 'wird auch erstellt und muss hier rein'; const options = { url: 'https://sg-api.dss.husqvarnagroup.net/sg-1/sessions', method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ 'sessions': { 'email': username, 'password': password } }) } //Locations abrufen request({ url: 'https://sg-api.dss.husqvarnagroup.net/sg-1/locations/?user_id=' + user_id, method: 'GET', headers: { 'Content-Type': 'application/json', 'X-Session': token }, }, (err, res, body) => { //console.log(body); }) //Devices abrufen request({ url: 'https://sg-api.dss.husqvarnagroup.net/sg-1/devices/?locationId=' + 'xxxxxxx', method: 'GET', headers: { 'Content-Type': 'application/json', 'X-Session': token } }, (err, res, body) => { //console.log(body); }) //Befehl an Device senden request({ url: 'https://sg-api.dss.husqvarnagroup.net/sg-1/devices/' + 'xxx' + '/abilities/valve/command?locationId=' + 'xxx', method: 'PUT', headers: { 'Content-Type': 'application/json', 'X-Session': token }, body: JSON.stringify({ 'name': 'stop_until_next_task' }) }, (err, res, body) => { //console.log(body); })