NEWS
Daten aus Fronius Solarweb auslesen
-
Gen24 und Solarweb
Hallo zusammen.
Da der Gen24 ja über die lokale xml API nicht die Tages/Monats und Jahreswerte liefert und deren Berechnungen mit Sourceanalytics zu ungenau sind (ausserdem sind manche Werte nicht verfügbar), habe ich die Solarweb App mal abgehört und ein Script geschrieben, dass die aktuellen Tages/Monats/Jahres/Totalwerte der Verbräuche abfragt.Falls ihr eine Version vor dem 10. Jan 2021 nutzt, bitte noch mal den gesamten Solarweb Ordner löschen.
Ich musste zu viele Anpassungen vornehmen um alles in die Ordnerstruktur zu bekommen.Ihr müsst die Solarweb Zugangsdaten und die PV-ID (aus dem Browser ersichtlich) einfügen und das Blockly starten.
Totalwerte und Tages/Monats/Jahres-Werte des dem aktuellen Jahr werden sofort geladen.
Bereits vergangene Wochentage der aktuellen Woche können mit einem Button nachgeladen werden.Vergangene Werte werden entweder zum Ende der Periode (Tag/Woche/Monat/Jahr) geladen oder manuell über den Button.
Um 0:00 jeden Tag/Woche/Monat/Jahr werden die Vordaten zurückgesetzt und neu befüllt, sobald Solarweb Daten zur Verfügung stellt.
Die Daten im "Previous" Ordner werden auch um 0:00 der neuen Periode zurückgesetzt, aber erst um 2:00 mit den Daten aus Solarweb aktualisiert.
Manchmal liefert der Wechselrichter erst nach Mitternacht die letzten Tagesdaten an Solarweb und damit hier nicht - wie mit Sourceanalytix - beim Tagesübergang Fehler entstehen, werden diese Werte erst um 2:00 abgefragt.Außerdem kann man durch das manuelle Nachladen, sofort auf Vorjahresdaten zugreifen und muss nicht erst ein Jahr abwarten. Sollte das abfragen von alten Werten mal nicht funktionieren, bitte nach einer Minute nochmal testen.
Laut Solarweb-API müssten alle Vergangenheitswerte auch als Nicht-Premium-Kunde funktionieren.
Lediglich beim Forecast erhalten Basic-Nutzer einen Hinweis im Log, das kein Premium vorhanden ist.Änderungsprotokoll:
12. Jan 2021
Änderung: Umlaute korrigiert, Forecast Wertrundung korrigiert, Premium-Fehlermeldung als Info und nicht als Error
Einfach Blockly austauschen - Datenpunkte bleiben identisch, wenn ihr das Script vom 10.Jan 2021 genutzt habt-
März 2022:
Fehlerbehebung: Annual Month wurde monatlich zurückgesetzt, statt jährlich.
Änderung: Ohne Premium Account erfolgt beim Forecast nur noch eine Loginfo und keine Warnung mehr -
September 2023
Fehlerbehebung Forecast Today.
Fronius hat die API geändert und auch vergangene Tagesdaten dazuaddiert. Fehler behoben, in dem ich nur noch ab der aktuellen Uhrzeit abfrage. -
März 2024
Fehler beim Periodenwechsel behoben (Fehlermeldung im Log bzgl Booleanwert der mit Number beschrieben wird)
Optimierung der Forcastabfrage -
Mai 2024
Library von Request auf Axios umgestellt, damit der Javascript-Adapter keine Fehler mehr berichtet.
@strobelix
Hallo Strobelix,ich kann, auch nach langem recherchieren, das Blockly Script (Solarweb abfrage Blockly 17-09-2023.txt) nach dem Import nicht speichern, d.h. nach dem Import werden die Blöcke und Funktionen angezeigt, werden aber beim Speichern gelöscht.
IoBroker Admin: v6.13.16
Skript Adapter: zuerst 7.1.6 und dann 7.8.0 von npm haben das gleiche Verhalten
Node: v18.17.1Sind eventuell etwaige Zusatzpakte einzubinden oder sonstige Parameter zu setzen?
Danke & lg
-
-
@strobelix
Hallo Strobelix,ich kann, auch nach langem recherchieren, das Blockly Script (Solarweb abfrage Blockly 17-09-2023.txt) nach dem Import nicht speichern, d.h. nach dem Import werden die Blöcke und Funktionen angezeigt, werden aber beim Speichern gelöscht.
IoBroker Admin: v6.13.16
Skript Adapter: zuerst 7.1.6 und dann 7.8.0 von npm haben das gleiche Verhalten
Node: v18.17.1Sind eventuell etwaige Zusatzpakte einzubinden oder sonstige Parameter zu setzen?
Danke & lg
@donalfredo70 Das hatte ich auch mal. Aber nicht nur bei diesem Script. Habe den JS Adapter bzw Iobroker neu gestartet dann ging es.
-
@donalfredo70 Das hatte ich auch mal. Aber nicht nur bei diesem Script. Habe den JS Adapter bzw Iobroker neu gestartet dann ging es.
@TimoWald
Danke für den Tip, das Problem hat sich leider damit nicht gelöst. Habe zusätzlich noch alle Pakete, angefangen von proxmox, Containern bis zu den Adaptern aktualisiert und neu gestartet. Interessant ist, das sich andere Blockly Exporte (z.B. https://www.smarthome-tricks.de/download/3378/) importieren und speichern lassen. -
@TimoWald
Danke für den Tip, das Problem hat sich leider damit nicht gelöst. Habe zusätzlich noch alle Pakete, angefangen von proxmox, Containern bis zu den Adaptern aktualisiert und neu gestartet. Interessant ist, das sich andere Blockly Exporte (z.B. https://www.smarthome-tricks.de/download/3378/) importieren und speichern lassen.Ich habe immer Warnmeldungen von javascript.0 im log wenn Tages oder Monatswerte abgerufen werden.
You are assigning a number to the state "0_userdata.0.Solarweb.Previous.01_Day.Vergangene_Tageswerte_abrufen" which expects a boolean. Please fix your code to use a boolean or change the state type to number. This warning might become an error in future versions.Der state type wurde im Script dem Objekt so zugewiesen
var https = require("https"); var request = require("request"); var data = JSON.stringify({userId: Mail, password: Pass}); var options = { url: 'https://swqapi.solarweb.com/iam/jwt', headers: { 'AccessKeyId':'FKIAFFB3D0986CF24CBDBF580755A9F38769', 'AccessKeyValue': 'ab5563fb-ff0a-43d0-a526-c07a4d0b03aa', 'Content-Type': 'application/json' }, body: data, }; function callback(error, response, body) { var result = JSON.parse(body); if (response.statusCode ==200) { token = result.jwtToken; console.log("Solarweb Token erstellt"); createState("0_userdata.0.Solarweb.Current.02_Weekdays.Aktuelle_Wochentagwerte_abrufen", {name: "Aktuelle Wochentagwerte abrufen", type: 'boolean', role: 'button', read: true, write: true, desc: "Manuell erzeugt",def:false}, function () {}) createState("0_userdata.0.Solarweb.Current.05_Annual_Months.Aktuelle_Einzelmonatswerte_abrufen", {name: "Aktuelle Einzelmonatswerte abrufen", type: 'boolean', role: 'button', read: true, write: true, desc: "Manuell erzeugt",def:false}, function () {}) createState("0_userdata.0.Solarweb.Previous.01_Day.Vergangene_Tageswerte_abrufen", {name: "Vergangene Tageswerte abrufen", type: 'boolean', role: 'button', read: true, write: true, desc: "Manuell erzeugt",def:false}, function () {}){ "common": { "name": "Vergangene Tageswerte abrufen", "type": "boolean", "role": "button", "read": true, "write": true, "desc": "Manuell erzeugt", "def": false }, "native": {}, "type": "state", "_id": "0_userdata.0.Solarweb.Previous.01_Day.Vergangene_Tageswerte_abrufen", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" }, "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1709374264274 }Leider weiss ich jetzt nicht, wo ich den Hebel ansetzen soll.
Von wo aus wird dieser Wert geschrieben?
Soll ich im Objekt den type manuell auf number setzen? -
Ich habe immer Warnmeldungen von javascript.0 im log wenn Tages oder Monatswerte abgerufen werden.
You are assigning a number to the state "0_userdata.0.Solarweb.Previous.01_Day.Vergangene_Tageswerte_abrufen" which expects a boolean. Please fix your code to use a boolean or change the state type to number. This warning might become an error in future versions.Der state type wurde im Script dem Objekt so zugewiesen
var https = require("https"); var request = require("request"); var data = JSON.stringify({userId: Mail, password: Pass}); var options = { url: 'https://swqapi.solarweb.com/iam/jwt', headers: { 'AccessKeyId':'FKIAFFB3D0986CF24CBDBF580755A9F38769', 'AccessKeyValue': 'ab5563fb-ff0a-43d0-a526-c07a4d0b03aa', 'Content-Type': 'application/json' }, body: data, }; function callback(error, response, body) { var result = JSON.parse(body); if (response.statusCode ==200) { token = result.jwtToken; console.log("Solarweb Token erstellt"); createState("0_userdata.0.Solarweb.Current.02_Weekdays.Aktuelle_Wochentagwerte_abrufen", {name: "Aktuelle Wochentagwerte abrufen", type: 'boolean', role: 'button', read: true, write: true, desc: "Manuell erzeugt",def:false}, function () {}) createState("0_userdata.0.Solarweb.Current.05_Annual_Months.Aktuelle_Einzelmonatswerte_abrufen", {name: "Aktuelle Einzelmonatswerte abrufen", type: 'boolean', role: 'button', read: true, write: true, desc: "Manuell erzeugt",def:false}, function () {}) createState("0_userdata.0.Solarweb.Previous.01_Day.Vergangene_Tageswerte_abrufen", {name: "Vergangene Tageswerte abrufen", type: 'boolean', role: 'button', read: true, write: true, desc: "Manuell erzeugt",def:false}, function () {}){ "common": { "name": "Vergangene Tageswerte abrufen", "type": "boolean", "role": "button", "read": true, "write": true, "desc": "Manuell erzeugt", "def": false }, "native": {}, "type": "state", "_id": "0_userdata.0.Solarweb.Previous.01_Day.Vergangene_Tageswerte_abrufen", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" }, "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1709374264274 }Leider weiss ich jetzt nicht, wo ich den Hebel ansetzen soll.
Von wo aus wird dieser Wert geschrieben?
Soll ich im Objekt den type manuell auf number setzen? -
Kann es sein, dass es einen Unterschied macht ob es Solarweb Premium oder der einfache Zugang ist?
-
Ich habe immer Warnmeldungen von javascript.0 im log wenn Tages oder Monatswerte abgerufen werden.
You are assigning a number to the state "0_userdata.0.Solarweb.Previous.01_Day.Vergangene_Tageswerte_abrufen" which expects a boolean. Please fix your code to use a boolean or change the state type to number. This warning might become an error in future versions.Der state type wurde im Script dem Objekt so zugewiesen
var https = require("https"); var request = require("request"); var data = JSON.stringify({userId: Mail, password: Pass}); var options = { url: 'https://swqapi.solarweb.com/iam/jwt', headers: { 'AccessKeyId':'FKIAFFB3D0986CF24CBDBF580755A9F38769', 'AccessKeyValue': 'ab5563fb-ff0a-43d0-a526-c07a4d0b03aa', 'Content-Type': 'application/json' }, body: data, }; function callback(error, response, body) { var result = JSON.parse(body); if (response.statusCode ==200) { token = result.jwtToken; console.log("Solarweb Token erstellt"); createState("0_userdata.0.Solarweb.Current.02_Weekdays.Aktuelle_Wochentagwerte_abrufen", {name: "Aktuelle Wochentagwerte abrufen", type: 'boolean', role: 'button', read: true, write: true, desc: "Manuell erzeugt",def:false}, function () {}) createState("0_userdata.0.Solarweb.Current.05_Annual_Months.Aktuelle_Einzelmonatswerte_abrufen", {name: "Aktuelle Einzelmonatswerte abrufen", type: 'boolean', role: 'button', read: true, write: true, desc: "Manuell erzeugt",def:false}, function () {}) createState("0_userdata.0.Solarweb.Previous.01_Day.Vergangene_Tageswerte_abrufen", {name: "Vergangene Tageswerte abrufen", type: 'boolean', role: 'button', read: true, write: true, desc: "Manuell erzeugt",def:false}, function () {}){ "common": { "name": "Vergangene Tageswerte abrufen", "type": "boolean", "role": "button", "read": true, "write": true, "desc": "Manuell erzeugt", "def": false }, "native": {}, "type": "state", "_id": "0_userdata.0.Solarweb.Previous.01_Day.Vergangene_Tageswerte_abrufen", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" }, "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1709374264274 }Leider weiss ich jetzt nicht, wo ich den Hebel ansetzen soll.
Von wo aus wird dieser Wert geschrieben?
Soll ich im Objekt den type manuell auf number setzen?@snopy_16 ich hab mir das gerade angesehen suche den Fehler
Ich habe das gerade auch bei mir im Log entdecktSo ich habe den Fehler gefunden!
Beim Tages/Montas/Jahrewechsel werden ja die jeweiligen Werte alle auf 0 gesetzt.
Da sich der Datenpunkt "0_userdata.0.Solarweb.Previous.01_Day.Vergangene_Tageswerte_abrufen" auch in dem Ordner befindet, wird dieser auch auf 0 gesetzt.Ich schau mal wie ich diesen Datenpunkt ausschließen kann.
-
Ich habe immer Warnmeldungen von javascript.0 im log wenn Tages oder Monatswerte abgerufen werden.
You are assigning a number to the state "0_userdata.0.Solarweb.Previous.01_Day.Vergangene_Tageswerte_abrufen" which expects a boolean. Please fix your code to use a boolean or change the state type to number. This warning might become an error in future versions.Der state type wurde im Script dem Objekt so zugewiesen
var https = require("https"); var request = require("request"); var data = JSON.stringify({userId: Mail, password: Pass}); var options = { url: 'https://swqapi.solarweb.com/iam/jwt', headers: { 'AccessKeyId':'FKIAFFB3D0986CF24CBDBF580755A9F38769', 'AccessKeyValue': 'ab5563fb-ff0a-43d0-a526-c07a4d0b03aa', 'Content-Type': 'application/json' }, body: data, }; function callback(error, response, body) { var result = JSON.parse(body); if (response.statusCode ==200) { token = result.jwtToken; console.log("Solarweb Token erstellt"); createState("0_userdata.0.Solarweb.Current.02_Weekdays.Aktuelle_Wochentagwerte_abrufen", {name: "Aktuelle Wochentagwerte abrufen", type: 'boolean', role: 'button', read: true, write: true, desc: "Manuell erzeugt",def:false}, function () {}) createState("0_userdata.0.Solarweb.Current.05_Annual_Months.Aktuelle_Einzelmonatswerte_abrufen", {name: "Aktuelle Einzelmonatswerte abrufen", type: 'boolean', role: 'button', read: true, write: true, desc: "Manuell erzeugt",def:false}, function () {}) createState("0_userdata.0.Solarweb.Previous.01_Day.Vergangene_Tageswerte_abrufen", {name: "Vergangene Tageswerte abrufen", type: 'boolean', role: 'button', read: true, write: true, desc: "Manuell erzeugt",def:false}, function () {}){ "common": { "name": "Vergangene Tageswerte abrufen", "type": "boolean", "role": "button", "read": true, "write": true, "desc": "Manuell erzeugt", "def": false }, "native": {}, "type": "state", "_id": "0_userdata.0.Solarweb.Previous.01_Day.Vergangene_Tageswerte_abrufen", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" }, "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1709374264274 }Leider weiss ich jetzt nicht, wo ich den Hebel ansetzen soll.
Von wo aus wird dieser Wert geschrieben?
Soll ich im Objekt den type manuell auf number setzen?@snopy_16
Fehler behoben!
Im ersten Beitrag ist ein neues Blockly das auch eine Optimierung der Forcastwerte enthält.Wer die Änderung manuell machen möchte, muss in allen Funktionen die ein "reset" enthalten folgendes anpassen:
Hier am Beispiel "Tag reset":
Es muss am Ende des Datenpunkts noch ein ".*" hinzugefügt werden, damit nur die Werte in den Ordnern resettet werdenalt:
var ids = $('0_userdata.0.Solarweb.*.01_Day.*'); ids.each (function(id,i){ setState(id, 0, true) })neu:
var ids = $('0_userdata.0.Solarweb.*.01_Day.*.*'); ids.each (function(id,i){ setState(id, 0, true) }) -
@snopy_16
Fehler behoben!
Im ersten Beitrag ist ein neues Blockly das auch eine Optimierung der Forcastwerte enthält.Wer die Änderung manuell machen möchte, muss in allen Funktionen die ein "reset" enthalten folgendes anpassen:
Hier am Beispiel "Tag reset":
Es muss am Ende des Datenpunkts noch ein ".*" hinzugefügt werden, damit nur die Werte in den Ordnern resettet werdenalt:
var ids = $('0_userdata.0.Solarweb.*.01_Day.*'); ids.each (function(id,i){ setState(id, 0, true) })neu:
var ids = $('0_userdata.0.Solarweb.*.01_Day.*.*'); ids.each (function(id,i){ setState(id, 0, true) })@strobelix
Herzlichen Dank - funktioniert :+1: :blush: -
Hallo,
danke für das Skript, nutze es schon sehr lange!Ich bekomme hin und wieder folgende beiden Fehlermeldungen oft bei mehreren Abfragen hintereinander.
Heute zum Beispiel bei den Abfragen zwischen 13:30 und 15:30.Request error: Error: getaddrinfo ENOTFOUND swqapi.solarweb.com Error in request callback: SyntaxError: Unexpected token u in JSON at position 0MOD-EDIT: Code in code-tags gesetzt!
-
Hallo,
danke für das Skript, nutze es schon sehr lange!Ich bekomme hin und wieder folgende beiden Fehlermeldungen oft bei mehreren Abfragen hintereinander.
Heute zum Beispiel bei den Abfragen zwischen 13:30 und 15:30.Request error: Error: getaddrinfo ENOTFOUND swqapi.solarweb.com Error in request callback: SyntaxError: Unexpected token u in JSON at position 0MOD-EDIT: Code in code-tags gesetzt!
-
Hallo, ich habe das Script installiert aber irgendwie stimmen die Tageswerte nicht.
zB im Moment bekomme ich über die App
Produktion 35,15 kWhIn den Datenpunkten des Scripts:
EnergyProductionTotal 0Das geht auch über mehrere Tags so und ich habe keine Ahnung was ich falsch mache...
-
@puckthefly Ich habs nochmal deinstalliert und neu installiert, zum x.mal und jetzt scheint es zu funktionieren. Keine Ahnung warum das so ist...
Im Log bekomme ich allerdings diese Meldung:
javascript.0
2024-05-04 16:05:06.009 warn script.js.Eigene_Gruppe.Solarweb: request package is deprecated - please use httpGet (or a stable lib like axios) instead!Muss ich etwas machen oder kann ich das ignorieren?
-
Hallo, nach dem Update des javascript Adapters auf Version 8.1.1 erscheint in den Protokollen eine Warning:
script.js.common.Energie.Solarweb_Abfrage: request package is deprecated - please use httpGet (or a stable lib like axios) instead!
Wie kann ich das beheben bzw. abstellen?
Grüsse Andi
-
Hallo, nach dem Update des javascript Adapters auf Version 8.1.1 erscheint in den Protokollen eine Warning:
script.js.common.Energie.Solarweb_Abfrage: request package is deprecated - please use httpGet (or a stable lib like axios) instead!
Wie kann ich das beheben bzw. abstellen?
Grüsse Andi
@andi-t-0 sagte in Daten aus Fronius Solarweb auslesen:
Wie kann ich das beheben bzw. abstellen?
Indem du die Dependency 'request' aus dem AdapterCode heraus operierst und duch z. B. axios ersetzt. Wäre aber eher ein Thema für den Adapter-Maintainer.
-
Hallo, nach dem Update des javascript Adapters auf Version 8.1.1 erscheint in den Protokollen eine Warning:
script.js.common.Energie.Solarweb_Abfrage: request package is deprecated - please use httpGet (or a stable lib like axios) instead!
Wie kann ich das beheben bzw. abstellen?
Grüsse Andi
-
Fehler behoben:
"request package is deprecated - please use httpGet (or a stable lib like axios) instead!"
Axios als neue Library verwendet, das Blockly ist im ersten Beitrag zum Download bereit
Danke! was ist jetzt der beste weg, das script upzudaten? möchte meine bisherigen einstellungen behalten...