NEWS
Hilfe bei Gardena API
-
Die Gardena Rest API ist veröffentlicht.
https://developer.1689.cloud/apis
Kann mir Jemand helfen einen Login per Script oder Blockly zu realisieren und das JSON abzurufen ?
Es gibt zwar einen Adapter für Gardena, der ist aber nicht aktuell und holt mir auch zu viele Daten.
Im Grunde möchte ich nur Bewässerungsventile (4 Stück) an/aus schalten können, mehr brauche ich erstmal nicht.Ich scheitere schon daran...
Ich habe das schon versucht zu installieren oder node-fetch als Modul einzutragen, aber das scheint nicht richtig zu sein.
So kommen sofort Fehler.const fetch = require('node-fetch'); const { URLSearchParams } = require('url'); const username = 'xxx.xxx@xx.de'; const password = 'xxxxxx'; const appKey = 'xxxxxxx'; 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(); }
Die richtigen Anmeldedaten habe ich.
https://developer.1689.cloud/apis/Authentication+API#/readme
-
@dslraser welche Fehler? Normal muss das von der Config aus gehen.
-
@Jey-Cee sagte in Hilfe bei Gardena API:
welche Fehler?
javascript.0 2020-01-11 23:32:22.052 error (377) at Script.runInContext (vm.js:133:20) javascript.0 2020-01-11 23:32:22.052 error (377) at script.js.09_Unifi.Gardena:2:29 javascript.0 2020-01-11 23:32:22.052 error (377) TypeError: Cannot destructure property `URLSearchParams` of 'undefined' or 'null'. javascript.0 2020-01-11 23:32:22.052 error (377) ^ javascript.0 2020-01-11 23:32:22.052 error (377) const { URLSearchParams } = require('url'); javascript.0 2020-01-11 23:32:22.051 error (377) script.js.09_Unifi.Gardena: script.js.09_Unifi.Gardena:2 javascript.0 2020-01-11 23:32:22.051 error (377) at Script.runInContext (vm.js:133:20) javascript.0 2020-01-11 23:32:22.050 error (377) at script.js.09_Unifi.Gardena:2:29 javascript.0 2020-01-11 23:32:22.050 error (377) script.js.09_Unifi.Gardena: Error: Cannot find module '/opt/iobroker/node_modules/iobroker.javascript/lib/../../url'
-
@dslraser hast du das benötigte Modul im Javascript Adapter hinterlegt?
-
Diese Module habe ich im Javascript Adapter
-
@dslraser dann fehlt dort das 'url' Modul.
-
@J-A-R-V-I-S
okay, jetzt kommt schon mal kein Fehler mehr. Wie kann ich jetzt Daten abrufen ?
Dabei brauche ich Hilfe. -
@dslraser welche möchtest du denn abrufen?
-
@dslraser du musst die Funktion login Ausführen:
let token = login();
So bekommst du den Token in deine Variable.
-
@J-A-R-V-I-S
im Grund die von meinem Gateway bzw. vom Irrigation Control zur Bewässerung.https://developer.1689.cloud/apis/GARDENA+smart+system+API#/readme
-
@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"}