NEWS
eine funktion für http-Get
-
ich habe einen Feinstaubsensor (Luftdaten.info) bei dem ich die Daten als JSON-String mit Hilfe von http Get abfrage.
Es kommt aber öfter mal zum timeout: script.js.common.Messwerte.Feinstaub: httpGet(url=http://192.168.178.30/data.json, error=timeout of 3000ms exceeded). Das timeout habe ich schon mehrfach erhöht - das bringt nicht viel.
Daher will ich die http-Get-Abftrage in eine Schleife einbauen, die durchläuft, bis der Status-Code = 200 ist.
Dazu habe ich sie http-Get-Abftrage in eine function eingebaut:
Das Problem entsteht, wenn ich den JSON-String auswerten will. Der Programmablauf ist immer schon fertig, bevor die Antwort vom http-Get eintrifft. Ich erhalte ergebnis: undefined. Ich müsste also eine Abfrage machen, die so lange pausiert, bis die http-get Anfrage beendet ist. Ich komm aber nicht drauf wie ich das umsetzen kann.
Weiss hier jemand Rat? -
@andreas-9 sagte in eine funktion für http-Get:
ich habe einen Feinstaubsensor (Luftdaten.info) bei dem ich die Daten als JSON-String mit Hilfe von http Get abfrage.
Warum nutzt Du nicht meinen Adapter? https://github.com/klein0r/ioBroker.luftdaten
-
@andreas-9 sagte in eine funktion für http-Get:
Das Problem entsteht, wenn ich den JSON-String auswerten will. Der Programmablauf ist immer schon fertig, bevor die Antwort vom http-Get eintrifft. Ich erhalte ergebnis: undefined.
Das liegt daran, dass das intern mit Callbacks realisiert wird. Blockly gibt eine Funktion als Parameter an httpGet und sagt: "Wenn Du fertig bist, ruf das hier auf." Das restliche Programm läuft natürlich dann weiter (genau wie Dein Rückgabewert der Funktion).
Du musst also das Ergebnis innerhalb der Callback-Funktion auswerten (oder auf JavaScript wechseln - dann mit Promises und async/await beschäftigen).
-
@haus-automatisierung said in eine funktion für http-Get:
@andreas-9 sagte in eine funktion für http-Get:
ich habe einen Feinstaubsensor (Luftdaten.info) bei dem ich die Daten als JSON-String mit Hilfe von http Get abfrage.
Warum nutzt Du nicht meinen Adapter? https://github.com/klein0r/ioBroker.luftdaten
@haus-automatisierung said in eine funktion für http-Get:
@andreas-9 sagte in eine funktion für http-Get:
ich habe einen Feinstaubsensor (Luftdaten.info) bei dem ich die Daten als JSON-String mit Hilfe von http Get abfrage.
Warum nutzt Du nicht meinen Adapter? https://github.com/klein0r/ioBroker.luftdaten
Weil ich nichts davon gewusst habe...
Ich probiere den aber gleich mal aus!!!
Vielen Dank, ich melde mich dann noch mal. -
@haus-automatisierung said in eine funktion für http-Get:
Warum nutzt Du nicht meinen Adapter? https://github.com/klein0r/ioBroker.luftdaten
Na das scheint ja supergut zu funktionieren!
Ich habe auch gleich was zu meckern: Der Sensor liefert ja auch standardmäßig den Taupunkt.
Leider wird dieser in keinem der Protokolle übertragen.
Das wäre mein Wunsch: Es wäre sicherlich nicht aufwändig, beim nächsten Update den Taupunkt mit zu übertragen.
Nochmals vielen Dank!!! -
@haus-automatisierung sagte in eine funktion für http-Get:
@andreas-9 sagte in eine funktion für http-Get:
Das Problem entsteht, wenn ich den JSON-String auswerten will. Der Programmablauf ist immer schon fertig, bevor die Antwort vom http-Get eintrifft. Ich erhalte ergebnis: undefined.
Das liegt daran, dass das intern mit Callbacks realisiert wird. Blockly gibt eine Funktion als Parameter an httpGet und sagt: "Wenn Du fertig bist, ruf das hier auf." Das restliche Programm läuft natürlich dann weiter (genau wie Dein Rückgabewert der Funktion).
Du musst also das Ergebnis innerhalb der Callback-Funktion auswerten (oder auf JavaScript wechseln - dann mit Promises und async/await beschäftigen).
Oder das Ergebnis in der funktion in einen Datenpunkt schreiben und dann einen eigenen Trigger auf diesen Datenpunkt zur Auswertung nutzen (das geht dann auch in Blockly)
-
@haus-automatisierung
Der Luftdaten-Adapter schreibt alle 10 Minuten ins Log:luftdaten.0 2025-07-31 15:40:03.851 info Terminated (NO_ERROR): Without reason luftdaten.0 2025-07-31 15:40:03.593 info starting. Version 4.0.0 in /opt/iobroker/node_modules/iobroker.luftdaten, node: v20.19.1, js-controller: 7.0.6
Kann ich das irgendwie vermeiden?
-
@andreas-9
Du kannst das Loglevel eines Adapters ändern,
dazu oben die Expertenansicht anklicken, den Adapter aufklappen und dann auf den Stift neben dem Loglevel gehen:
Wenn du den auf Warnung stellst, wird alles niedriger als das nicht geloggt:
-
@bananajoe said in eine funktion für http-Get:
Expertenansicht anklicken, den Adapter aufklappen und dann auf den Stift neben dem Logle
Danke!
Ich habe trotzdem noch eine Frage: a) Im Menü Instanzen kann man die Zeitplanung für Luftdaten einstellen. Dann wird der Adapter per Cronjob z.B. alle 5 Min gestartet. Man kann nicht "nichts" eintragen, dann kommt eine Fehlermeldung.
b) zusätzlich gibt es die Möglichkeit unter Objects/Luftdaten das Intervall einzustellen:
Das scheint aber gar keine Wirkung zu haben.
Ich habe jetzt in beiden Fällen 5 Min bzw. 300000 eingetragen.Wozu ist der Punkt Intervall gedacht und warum kann ich unter Instanzen/Luftdaten den Cron nicht löschen? (Geht bei anderen Adaptern auch. Einmal gestartet laufen die dann eben durch...)
Vielen Dank schon mal! -
@andreas-9 sagte in eine funktion für http-Get:
Man kann nicht "nichts" eintragen, dann kommt eine Fehlermeldung.
Warum sollte man das auch tun? Das ist ja ein "Schedule-Adapter". Der wird nach dem Zeitplan gestartet, macht seine Aufgaben und beendet sich dann wieder selbst. Da läuft keine Instanz dauerhaft (wie bei einem Daemon-Adapter). Grundlagen anschauen. Dadurch kommt auch der Eintrag im Log zustande.
@andreas-9 sagte in eine funktion für http-Get:
b) zusätzlich gibt es die Möglichkeit unter Objects/Luftdaten das Intervall einzustellen:
Das scheint aber gar keine Wirkung zu haben.
Ich habe jetzt in beiden Fällen 5 Min bzw. 300000 eingetragen.Das Schloss da vorne zeigt Dir, dass das ein Readonly-Datenpunkt ist und Du als Anwender da nichts reinschreiben solltest und dieser nur gelesen werden sollte. Mach mal den Expertenmodus aus...
Keine Ahnung woher dieser Wert genau kommt. Hat jedenfalls nichts damit zu tun, wie oft der ioBroker die Daten vom Sensor holt. Das macht ja der oben genannte Zeitplan.
-
@andreas-9 sagte in eine funktion für http-Get:
Es wäre sicherlich nicht aufwändig, beim nächsten Update den Taupunkt mit zu übertragen.
Zeig mal im JSON wo diese Info steht. Das hattest ja eh schonmal manuell abgerufen.
-
@haus-automatisierung said in eine funktion für http-Get:
Zeig mal im JSON wo diese Info steht. Das hattest ja eh schonmal manuell abgerufen.
Ja genau das ist ja das Problem. Der Wert für Taupunkt ist nicht im JSON-Text vom Luftdaten-Sensor enthalten.
Ich habe mal die Taupunkt-Formel in Blockly umgesetzt und rechne mir den Wert im IOBroker aus. Das ist wohl die selbe Formel, die auch der Luftdaten-Sensor verwendet. Dieser gibt den Taupunkt zwar auf dem Web-Interface bei Aktuelle Werte als "BME280 Taupunkt 14.5 °C" aus - aber er sendet ihn nicht.
Ja da bist du vielleicht doch nicht die richtige Adresse, wenn ich mir das mal richtig überlege...
Aber vielen Dank für deine Nachfrage!
Das mit dem Zeitplan habe ich jetzt auch verstanden.