NEWS
Helium API per GET abrufen (incl. User-Agent)
-
Ich möchte über die Helium (eine IOT Kryptowährung) API per GET Befehl Daten abrufen.
Leider muss man einen User-Agent mitschicken, um Daten zu erhalten, ansonsten erhält man eine Fehlermeldung zurück.Leider ist es weder per Blockly-Get noch per Systeminfo Adapter möglich, einen User-Agenten mit zu senden.
Ich versuche nun schon seit 3 Stunden per Axios ein JS Skript zu erstellen. Allerdings habe ich Probleme mit dem Auslesen des JSON. Ich erhalte immer ein leeres Array in der Ausgabe. Ich möchte nur auf einen spezifischen Wert des JSON zugreifen, in diesem Fall "data.total".Kann mir jemand behilflich sein? Ich bin schon so nahe am Ziel, aber bekomme einfach keine Ausgabe, um damit einen Datenpunkt zu steuern
var axios = require("axios"); var v_url = 'https://api.helium.io/v1/hotspots/1121Hotr17f9qgYCayKUCmVRN2TVwESM2GpaDe88KYMD5EgmqjKJ/rewards/sum/?max_time=2029-01-01T00:00:01Z&min_time=2021-01-01T00:00:01Z' const options = { method: 'GET', url: v_url, headers: {'User-Agent': 'Mozilla/5.0.'} }; axios.request(options).then(function (response) { var obj = JSON.parse(response.data); console.log(obj.data.total); }).catch(function (error) { console.error(error); }); '{"time":{"start":"00:00","end":"24:00","mode":"hours","interval":1},"period":{"days":1}}'
-
var axios = require("axios"); var v_url = 'https://api.helium.io/v1/hotspots/1121Hotr17f9qgYCayKUCmVRN2TVwESM2GpaDe88KYMD5EgmqjKJ/rewards/sum/?max_time=2029-01-01T00:00:01Z&min_time=2021-01-01T00:00:01Z' async function test() { log((await getData()).total); } async function getData() { try { let res = await axios.get(v_url, { headers: { 'User-Agent': 'Mozilla/5.0.' } }); return res.data.data; } catch (e) { log(e) } } test();
-
@fastfoot Danke, läuft perfekt!
Was war denn letztendlich das Problem in meinem Skript? -
@iobroker-lover ich würde auch gerne Hotspot Daten auslesen. Hat du da mittlerweile ein umfangreicheres Script wo alle Daten geloggt werden?
-
Ich melde auch großes Interesse an
-
Hallo,
Kann es villeicht jemand erklären?
Ich würde gerne die Erträge von meinem Hotspot in einen datenpunkt schreiben
-
was meinst du mit erklären?
axios ist eine bibliothek, mit der man http-abfragen machen kann und alles mögliche im detail vorgeben kann.
Beschreibung von axios: https://github.com/axios/axioswelche vorgaben man machen muss hängt dann von der konkreten api-beschreibung des anbieters ab.
je nachdem was man machen will gibt es verschiedenene methoden
hier wirt die http-get methode verwendet(der standard bei http wenn du daten abrufst)
dazu benötigst du eine url.
im ersten post siehst du einen langen string, eine intrnetadresse, mit irgendwelchen daten dran. das muss dir aber der anbieter geben oder er muss anweisungen haben, wie man diese url bildet. darin verbirgt sich (entweder in klarschrift oder wie hier verschlüsselt, was du genau abrufen willst.)
wenn du eine api beschreibung hier verlinken kannst, kann man dir weiterhelfen.im obigen problem ging es nur darum, das der user-agent mit angegeben werden soll und es aber zuerst nicht richtig funktioniert hat
-
@oliverio said in Helium API per GET abrufen (incl. User-Agent):
was meinst du mit erklären?
axios ist eine bibliothek, mit der man http-abfragen machen kann und alles mögliche im detail vorgeben kann.
Beschreibung von axios: https://github.com/axios/axioswelche vorgaben man machen muss hängt dann von der konkreten api-beschreibung des anbieters ab.
je nachdem was man machen will gibt es verschiedenene methoden
hier wirt die http-get methode verwendet(der standard bei http wenn du daten abrufst)
dazu benötigst du eine url.
im ersten post siehst du einen langen string, eine intrnetadresse, mit irgendwelchen daten dran. das muss dir aber der anbieter geben oder er muss anweisungen haben, wie man diese url bildet. darin verbirgt sich (entweder in klarschrift oder wie hier verschlüsselt, was du genau abrufen willst.)
wenn du eine api beschreibung hier verlinken kannst, kann man dir weiterhelfen.im obigen problem ging es nur darum, das der user-agent mit angegeben werden soll und es aber zuerst nicht richtig funktioniert hat
Hallo oliverio,
danke für deine Antwort,das Problem ist immer wenn man nicht weiß wo man hin will.
ich hab das Script jetzt mal an meine bedürfnisse angepasst im log erscheinen die werte auch braf, ich würde sie gerne in einen Datenpunkt schreiben, bekomme es aber absolut nicht hin.var axios = require("axios"); var v_url = 'https://api.helium.io/v1/hotspots/112gJzabaVykY8hvNgZcgSU2pJ5YkjHi7QUST9i9ugtofoXQfkEc/rewards/sum/?max_time=2029-01-01T00:00:01Z&min_time=2021-01-01T00:00:01Z' async function test() { log((await getData()).total); log((await getData()).stddev); log((await getData()).avg); } async function getData() { try { let res = await axios.get(v_url, { headers: { 'User-Agent': 'Mozilla/5.0.' } }); return res.data.data; } catch (e) { log(e) } } test();
angezigt im log wird dann
14:36:40.520 info javascript.0 (24320) script.js.common.HNT#: registered 0 subscriptions and 0 schedules 14:36:40.678 info javascript.0 (24320) script.js.common.HNT#: 0.2599506 14:36:40.737 info javascript.0 (24320) script.js.common.HNT#: 0.017530848148 14:36:40.799 info javascript.0 (24320) script.js.common.HNT#: 0.02166255
-
@oliverio
Hallo oliverio,
danke für deine Antwort,das Problem ist immer wenn man nicht weiß wo man hin will.
ich hab das Skript jetzt mal an meine Bedürfnisse angepasst im log erscheinen die werte auch brav, ich würde sie gerne in einen Datenpunkt schreiben, bekomme es aber absolut nicht hin.var axios = require("axios"); var v_url = 'https://api.helium.io/v1/hotspots/112gJzabaVykY8hvNgZcgSU2pJ5YkjHi7QUST9i9ugtofoXQfkEc/rewards/sum/?max_time=2029-01-01T00:00:01Z&min_time=2021-01-01T00:00:01Z' async function test() { log((await getData()).total); log((await getData()).stddev); log((await getData()).avg); } async function getData() { try { let res = await axios.get(v_url, { headers: { 'User-Agent': 'Mozilla/5.0.' } }); return res.data.data; } catch (e) { log(e) } } test();
angezeigt im log wird dann
-
@stephan-sporbert
du musst dann auch den Befehl verwenden, der es in einen Datenpunkt schreibt.
der datenpunkt muss zuvor angelegt werden. am besten Number
und der datenpunktname dann bei dp anpassen.var dp = "javascript.0.test"; var axios = require("axios"); var v_url = 'https://api.helium.io/v1/hotspots/112gJzabaVykY8hvNgZcgSU2pJ5YkjHi7QUST9i9ugtofoXQfkEc/rewards/sum/?max_time=2029-01-01T00:00:01Z&min_time=2021-01-01T00:00:01Z' async function test() { log((await getData()).total); } async function writeValue() { setState(dp,(await getData()).total); } async function getData() { try { let res = await axios.get(v_url, { headers: { 'User-Agent': 'Mozilla/5.0.' } }); return res.data.data; } catch (e) { log(e) } } //test(); writeValue();
wenn du mehr wie einen Wert schreiben möchtest, dann würde ich dein Skript ebenfalls noch ein wenig anpassen. Da so 3 Anfragen an den Server rausgehen, obwohl du jedesmal die gleichen Daten erhälst
-
@oliverio
Wahnsinn, danke!
mal sehen ob ich das hin bekomme, ich hab noch nie mit Javascript gearbeitet -
var dp1 = "javascript.0.test1"; var dp2 = "javascript.0.test2"; var axios = require("axios"); var v_url = 'https://api.helium.io/v1/hotspots/112gJzabaVykY8hvNgZcgSU2pJ5YkjHi7QUST9i9ugtofoXQfkEc/rewards/sum/?max_time=2029-01-01T00:00:01Z&min_time=2021-01-01T00:00:01Z' async function test() { var data = await getData(); log(data.total); log(data.stddev); } async function writeValue() { var data = await getData(); log(data); setState(dp1,data.total); setState(dp2,data.stddev); } async function getData() { try { let res = await axios.get(v_url, { headers: { 'User-Agent': 'Mozilla/5.0.' } }); return res.data.data; } catch (e) { log(e) } } //test(); writeValue();
-
@oliverio
Klasse, es funktioniert.Ich danke dir von Herzen
wenn ich das jetzt aller 30minausführen will
// Alle 30 Minunten das skript ausführen schedule('*/30 * * * *', javascript.0.test);
oder bin ich absolut auf dem Holzweg?
-
@stephan-sporbert
nicht ganz,
musste selbst nachschauen, da ich kein schedule aktuell verwende und auch nicht mit asyncdas unten angegebene schedule ruft immer zur 0ten und zur 30igsten Minute die Funktion auf. Für andere Werte kannst du den assistenten im Skripteditor verwenden (uhrenicon oben rechts)
müsste aber wie folgt funktionieren
var dp1 = "javascript.0.test1"; var dp2 = "javascript.0.test2"; var axios = require("axios"); var v_url = 'https://api.helium.io/v1/hotspots/112gJzabaVykY8hvNgZcgSU2pJ5YkjHi7QUST9i9ugtofoXQfkEc/rewards/sum/?max_time=2029-01-01T00:00:01Z&min_time=2021-01-01T00:00:01Z' async function writeValue() { var data = await getData(); log(data); setState(dp1,data.total); setState(dp2,data.stddev); } async function getData() { try { let res = await axios.get(v_url, { headers: { 'User-Agent': 'Mozilla/5.0.' } }); return res.data.data; } catch (e) { log(e) } } schedule('*/30 * * * *',function() { writeValue(); });
-
-
Hier lässt sich die API Dokumentation übrigens finden
-
Erstmal vielen Dank für eure Vorarbeit. Das hat mir schon mal weitergeholfen.
Ich möchte gerne die Rewards der letzten 24h, 7 Tage & 30 Tage auslesen und das in das o.g. Skript einbauen.Laut API kann ich das wie folgt abfragen
https://api.helium.io/v1/hotspots/HOTSPOT_ID/rewards/sum/?min_time=-1%20day https://api.helium.io/v1/hotspots/HOTSPOT_ID/rewards/sum/?min_time=-7%20day https://api.helium.io/v1/hotspots/HOTSPOT_ID/rewards/sum/?min_time=-30%20day
Ich könnte das o.g. Skript auch drei mal kopieren und den Link tauschen, aber ich schätze, das geht auch so, dass alle vier Links in einem Skript abgefragt werden, leider habe ich davon keine Ahnung. Kann mir hierbei jemand helfen?
Gruß Markus
-
ich habe dir den code ein wenig umgestellt.
jetzt kannst du einfach die funktion writeValueOverview kopieren
neu einfügen, einen neuen Namen geben und die Parameter
konfigurieren.
Befasse dich mal mit jeder einzelnen Zeile, dann wirst du auch das extrahieren der Daten aus einem JSON-Objekt gut hinbekommen.
Im vorliegenden Beispiel erhälst du ein javascriptobjekt zurück.
dieses objekt hat sogenannte properties oder eigenschaften.
das sind eigentlich nix anderes wie variable, die zusammengefasst sind.
daher kannst du total mit
data.total
und die standardabweichung mit
data.stddev
adressieren.
die struktur ist aber je api aufruf anders und du musst in der doku nachschauen oder, das was da auf der console ausgegeben wird.Problem bei rewards ist, das da eine Liste zurückkommt und nicht ein einzelner Wert
Return the last 7 days of rewards bucketed by day
Was willst du mit der Liste machen?
var axios = require("axios"); async function writeValueOverview() { var dp1 = "javascript.0.test1"; var dp2 = "javascript.0.test2"; var v_url = 'https://api.helium.io/v1/hotspots/112gJzabaVykY8hvNgZcgSU2pJ5YkjHi7QUST9i9ugtofoXQfkEc/rewards/sum/?max_time=2029-01-01T00:00:01Z&min_time=2021-01-01T00:00:01Z' var data = await getData(url); //abruf der daten log(data); // ausgabe des ergebnisses auf der debug-console setState(dp1,data.total); // schreiben der summe in datenpunkt setState(dp2,data.stddev); // schreiben der standardabweichung in datenpunkt } async function writeValueReward1() { var dp1 = "javascript.0.reward1"; var url = 'https://api.helium.io/v1/hotspots/HOTSPOT_ID/rewards/sum/?min_time=-1%20day' var data = await getData(url); //abruf der daten log(data); // ausgabe des ergebnisses auf der debug-console setState(dp1,data.??); // schreiben des rewards in datenpunkt } async function writeValueReward2() { var dp1 = "javascript.0.reward2"; var url = 'https://api.helium.io/v1/hotspots/HOTSPOT_ID/rewards/sum/?min_time=-7%20day' var data = await getData(url); //abruf der daten log(data); // ausgabe des ergebnisses auf der debug-console setState(dp1,data.??); // schreiben des rewards in datenpunk datenpunkt } async function getData(url) { try { let res = await axios.get(url, { headers: { 'User-Agent': 'Mozilla/5.0.' } }); return res.data.data; } catch (e) { log(e) } } schedule('*/30 * * * *',function() { writeValueOverview(); writeValueReward1(); writeValueReward2(); });
-
@oliverio
Vielen Dank.
Im Grunde möchte ich nur vier Datenobjekte mit Daten füttern:-
Walletguthaben
-
HNT letzte 24h
-
HNT letzte 7 Tage
-
HNT letzte 30 Tage
Bei meinen urls nutze ich die Bucketfunktion nicht, sondern bekomme nur eine Zeile wo ich dann den data.total Wert abgreifen kann.
Ich habe gestern ein wenig rum getestet und festgestellt, dass sich das Skript (oder API oder was auch immer ) bei zu vielen gleichzeitigen Abrufen verschluckt und der Wert data.total dann bei einem der Datenpunkte (variiert meist) nicht ausgelesen werden kann. Manchmal geht es gut, und man bekommt alle vier Daten ausgelesen, häufig waren es aber nur 3. Daher habe ich einen Timeout eingebaut. Damit funktioniert es zuverlässig.
Zum Testen habe ich als Basis dein erstes Skript genutzt, aber auch dein zuletzt gepostetes Skript für meine Bedürfnisse angepasst.Skript1
Skript2
Bei beiden funktioniert das Auslesen gut, allerdings bekomme ich jeweils drei Fehlerzeilen angezeigt, die ich (wahrscheinlich aus fehlendem Basiswissen) nicht behoben bekomme:
17.8.2022, 09:48:06.431 [info ]: javascript.0 (1151) Start javascript script.js.Allgemein.Crypto.Helium.TrendyGunmetalHare 17.8.2022, 09:48:06.479 [info ]: javascript.0 (1151) script.js.Allgemein.Crypto.Helium.TrendyGunmetalHare: registered 0 subscriptions and 1 schedule 17.8.2022, 09:48:06.481 [error]: javascript.0 (1151) script.js.Allgemein.Crypto.Helium.TrendyGunmetalHare: ReferenceError: writeValue1 is not defined 17.8.2022, 09:48:06.481 [error]: javascript.0 (1151) at script.js.Allgemein.Crypto.Helium.TrendyGunmetalHare:69:1 17.8.2022, 09:48:06.481 [error]: javascript.0 (1151) at script.js.Allgemein.Crypto.Helium.TrendyGunmetalHare:73:3 17.8.2022, 09:48:07.658 [info ]: javascript.0 (1151) script.js.Allgemein.Crypto.Helium.TrendyGunmetalHare: {'total':1.39006203,'sum':139006203,'stddev':0.0096834757243116,'min':0,'median':0.00827458,'max':0,'avg':0.013113792735849056} 17.8.2022, 09:48:08.582 [info ]: javascript.0 (1151) script.js.Allgemein.Crypto.Helium.TrendyGunmetalHare: {'total':0.02237045,'sum':2237045,'stddev':0.0026280645619987,'min':0,'median':0.00729542,'max':0,'avg':0.007456816666666667} 17.8.2022, 09:48:09.582 [info ]: javascript.0 (1151) script.js.Allgemein.Crypto.Helium.TrendyGunmetalHare: {'total':0.26189041,'sum':26189041,'stddev':0.0094876854151907,'min':0,'median':0.00765452,'max':0,'avg':0.011386539565217391} 17.8.2022, 09:48:10.577 [info ]: javascript.0 (1151) script.js.Allgemein.Crypto.Helium.TrendyGunmetalHare: {'total':0.8288541,'sum':82885410,'stddev':0.0096992973232438,'min':0,'median':0.00748039,'max':0,'avg':0.012558395454545455}
Könntest du mir hierbei nochmal unter die Arme greifen?
Besten Dank -
-
@unbekannt
Probiere es erst Mal.mit meiner LösungDie fehlerm Ladung ist eigentlich selbst erklärend.
Die Funktion mit diesem Namen wurde nie definiert
Die Folgezeilen sind der stacktrace für diesen Fehler