NEWS
Rest-API adapter configuration für API Powerdog
-
@ht22
javascript Instanz Einstellungen öffnen -> Zusätzliche NPM Module anklicken und xmlrpx eintragen
-> Speichern und schliessen klicken -
@mcu
Vielen vielen Dank. Das scheint wohl zu funktionieren. Leider bin ich absolut nicht fit im script. Es scheint zu funktionieren nur leider habe ich keine Ahnung wie ich diese werte dann in Variablen bekomme um sie weiter zu verwenden und wo in dem iobroker Baum ich diese Daten dann finden kann. Wäre über Unterstützung sehr dankbar, da ich eigentlich nur einen einzelnen Zählerwert noch benötige aus dem Powerdog.
javascript.0 10:49:55.952 info Start JavaScript script.js.Powerdog (Javascript/js)
javascript.0 10:49:56.041 info script.js.Powerdog: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
javascript.0 10:49:56.064 info script.js.Powerdog: Info-Daten erhalten: {}
javascript.0 10:49:56.078 info script.js.Powerdog: Sensors-Daten erhalten: {}
javascript.0 10:49:56.079 info script.js.Powerdog: Counters-Daten erhalten: {} -
@ht22 Es kommen aber keine Daten. Welcher Port ist denn im Adapter eingegeben, auch 20000?
Log immer in Code-Tags -> </> anklicken und dann einfügen
javascript.0 10:49:55.952 info Start JavaScript script.js.Powerdog (Javascript/js) javascript.0 10:49:56.041 info script.js.Powerdog: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions javascript.0 10:49:56.064 info script.js.Powerdog: Info-Daten erhalten: {} javascript.0 10:49:56.078 info script.js.Powerdog: Sensors-Daten erhalten: {} javascript.0 10:49:56.079 info script.js.Powerdog: Counters-Daten erhalten: {}
const xmlrpc = require('xmlrpc'); // Konfigurationsvariablen für PowerDog const powerDogIp = '192.168.0.100'; // IP-Adresse des PowerDog-Geräts const powerDogPort = 20000; // Portnummer const apiKey = 'DEIN_API_KEY'; // Dein API-Schlüssel // Erstelle den XML-RPC-Client const client = xmlrpc.createClient({ host: powerDogIp, port: powerDogPort, path: '/' }); // Funktion zum Auslesen und Speichern von Daten function fetchPowerDogData(method, namespace) { client.methodCall(method, [apiKey], function(error, obj, reply) { if (error) { log(`Fehler beim Abrufen der ${namespace}-Daten: ${error}`, 'error'); } else { console.log(obj) } }); } // PowerDog-Informationen abrufen fetchPowerDogData('getPowerDogInfo', 'Info'); // Sensor-Daten abrufen fetchPowerDogData('getSensors', 'Sensors'); // Zähler-Daten abrufen fetchPowerDogData('getCounters', 'Counters');
Nimm mal erst dies Programm
-
@mcu
Danke. Leider kommt jetzt ein Fehler mit dem Passwort. Was hattest du gemeint bezüglich Port im Adapter? In welchem Adapter müsste der Port eingetragen werden. Bitte entschuldige die vielen Fragen, aber habe da leider gar keine Ahnung.1/5/2025, 7:30:36 PM.384 [info ]: javascript.0 (1854) Start JavaScript script.js.Powerdog (Javascript/js) 1/5/2025, 7:30:36 PM.447 [info ]: javascript.0 (1854) script.js.Powerdog: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 1/5/2025, 7:30:36 PM.470 [info ]: javascript.0 (1854) script.js.Powerdog: { ErrorCode: 401, ErrorString: 'Invalid Password', Reply: {} } 1/5/2025, 7:30:36 PM.473 [info ]: javascript.0 (1854) script.js.Powerdog: { ErrorCode: 401, ErrorString: 'Invalid Password', Reply: {} } 1/5/2025, 7:30:36 PM.481 [info ]: javascript.0 (1854) script.js.Powerdog: { ErrorCode: 401, ErrorString: 'Invalid Password', Reply: {} }
-
@mcu ```
Wenn ich einen anderen Port verwende (habe in einem Beitrag auch etwas von 80 gefunden) kommt folgende Fehlermeldung.1/5/2025, 7:46:30 PM.130 [info ]: javascript.0 (1854) Stopping script script.js.Powerdog 1/5/2025, 7:46:31 PM.863 [info ]: javascript.0 (1854) Start JavaScript script.js.Powerdog (Javascript/js) 1/5/2025, 7:46:31 PM.882 [info ]: javascript.0 (1854) script.js.Powerdog: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 1/5/2025, 7:46:31 PM.894 [error]: javascript.0 (1854) script.js.Powerdog: Fehler beim Abrufen der Sensors-Daten: Error: Unknown XML-RPC tag 'TITLE' 1/5/2025, 7:46:31 PM.921 [error]: javascript.0 (1854) script.js.Powerdog: Fehler beim Abrufen der Info-Daten: Error: Unknown XML-RPC tag 'TITLE' 1/5/2025, 7:46:31 PM.944 [error]: javascript.0 (1854) script.js.Powerdog: Fehler beim Abrufen der Counters-Daten: Error: Unknown XML-RPC tag 'TITLE' 1/5/2025, 7:47:21 PM.471 [info ]: javascript.0 (1854) Stopping script script.js.Powerdog
-
@ht22 Und der Adapter sagt auch
Invalid Password
?
Ist der API-KEY noch gültig?
Dort wird es auch so gemacht https://github.com/JoeDev002/iobroker.powerdog/blob/master/main.js#L57 -
Hallo @mcu vielen herzlichen Dank. Ich habe jetzt nochmals deinen ersten Code genommen und den API-KEY nochmal aktualisiert und jetzt spuckt er Werte aus. Ohne deine Unterstützung wäre ich nicht soweit gekommen. Da ich ja wie beschrieben nur einen Wert abgefragt benötige, wenn diese sich ändert, wäre jetzt die Frage wie ich den Code verschlanken könnte, damit nicht alle Werte abgefragt werden müssen und vorallem wie ich diesen Wert dann in eine Variable speichern könnte, welche ich dann in iobroker weiter verwenden kann z.B. in einer VIS. Es geht um diesen Wert:
"impulsecounter_1702364206":{"Current_Value":"154.879","Hardware":"Impulse","Key":"impulsecounter_1702364206","Last_Read_Average":"1248","Last_Usage":"104","LinearType":"counter","Max":"10000","Name":"Waermepumpe","Setable":"","Type":"Energy","Unit":"W","Unit_1000":"kW","Unit_1000000":"MW","Unit_Time_Add":"h","Valid":true}
1/6/2025, 12:16:41 PM.542 [info ]: javascript.0 (1854) script.js.Powerdog: Sensors-Daten erhalten: {"remotesensor_1702364038":{"Current_Value":"62","Hardware":"remotesensor","Key":"remotesensor_1702364038","Last_Read_Average":"0","Last_Usage":"0","LinearType":"sensor","Max":"100","Name":"Batterie-Ladezustand","Setable":"","Type":"Percent","Unit":"%","Unit_1000":"%","Unit_1000000":"%","Unit_Time_Add":"","Valid":true}} 1/6/2025, 12:16:41 PM.586 [info ]: javascript.0 (1854) script.js.Powerdog: Counters-Daten erhalten: {"arithmetic_1702364033":{"Current_Value":"1943","Hardware":"calculation","Key":"arithmetic_1702364033","Last_Read_Average":"0","Last_Usage":"0","LinearType":"counter","Max":"10000","Name":"Stromverbrauch Gesamt","Setable":"","Type":"Energy","Unit":"W","Unit_1000":"kW","Unit_1000000":"MW","Unit_Time_Add":"h","Valid":true},"arithmetic_1702364034":{"Current_Value":"1943","Hardware":"calculation","Key":"arithmetic_1702364034","Last_Read_Average":"0","Last_Usage":"0","LinearType":"counter","Max":"10000","Name":"Eigenverbrauch Gesamt","Setable":"","Type":"Energy","Unit":"W","Unit_1000":"kW","Unit_1000000":"MW","Unit_Time_Add":"h","Valid":true},"impulsecounter_1702364206":{"Current_Value":"154.879","Hardware":"Impulse","Key":"impulsecounter_1702364206","Last_Read_Average":"1248","Last_Usage":"104","LinearType":"counter","Max":"10000","Name":"Waermepumpe","Setable":"","Type":"Energy","Unit":"W","Unit_1000":"kW","Unit_1000000":"MW","Unit_Time_Add":"h","Valid":true},"modbustcpcounter_1702364034":{"Current_Value":"0","Hardware":"ModBusTCPIP_Counter","Key":"modbustcpcounter_1702364034","Last_Read_Average":"0","Last_Usage":"0","LinearType":"counter","Max":"5000","Name":"Netzbezug","Setable":"","Type":"Energy","Unit":"W","Unit_1000":"kW","Unit_1000000":"MW","Unit_Time_Add":"h","Valid":true},"modbustcpcounter_1702364035":{"Current_Value":"6","Hardware":"ModBusTCPIP_Counter","Key":"modbustcpcounter_1702364035","Last_Read_Average":"0","Last_Usage":"0","LinearType":"counter","Max":"10000","Name":"Netzeinspeisung","Setable":"","Type":"Energy","Unit":"W","Unit_1000":"kW","Unit_1000000":"MW","Unit_Time_Add":"h","Valid":true},"modbustcpcounter_1703183355":{"Current_Value":"0","Hardware":"ModBusTCPIP_Counter","Key":"modbustcpcounter_1703183355","Last_Read_Average":"0","Last_Usage":"0","LinearType":"counter","Max":"10000","Name":"wallbox","Setable":"","Type":"Energy","Unit":"W","Unit_1000":"kW","Unit_1000000":"MW","Unit_Time_Add":"h","Valid":true},"pv_global_1702364033":{"Current_Value":"1949","Hardware":"pv_global","Key":"pv_global_1702364033","Last_Read_Average":"2191","Last_Usage":"215","LinearType":"counter","Max":"17230","Name":"PV Erzeugung Gesamt","Setable":"","Type":"Energy","Unit":"W","Unit_1000":"kW","Unit_1000000":"MW","Unit_Time_Add":"h","Valid":true},"remotecounter_1702364039":{"Current_Value":"1304","Hardware":"remotecounter","Key":"remotecounter_1702364039","Last_Read_Average":"579.135","Last_Usage":"48.2612","LinearType":"counter","Max":"10000","Name":"Batterie-Laden","Setable":"","Type":"Energy","Unit":"W","Unit_1000":"kW","Unit_1000000":"MW","Unit_Time_Add":"h","Valid":true},"remotecounter_1702364040":{"Current_Value":"0","Hardware":"remotecounter","Key":"remotecounter_1702364040","Last_Read_Average":"700.308","Last_Usage":"58.359","LinearType":"counter","Max":"10000","Name":"Batterie-Entladen","Setable":"","Type":"Energy","Unit":"W","Unit_1000":"kW","Unit_1000000":"MW","Unit_Time_Add":"h","Valid":true}} 1/6/2025, 12:16:45 PM.912 [info ]: javascript.0 (1854) Stopping script script.js.Powerdog
-
@ht22 Info-Daten fehlen noch? Wenn da IDs und sowas drin stehen -> Wert unkenntlich machen XXXX, aber nicht den KEY
Beispiel: "Current_Value":"154.879" -> "KEY":"WERT"
Wenn dann setze ich alle Daten, die man jetzt bekommt in eine Struktur.
Wie sieht die beim Adapter aus?
WElche Strktur ist gewünscht?Da ich ja wie beschrieben nur einen Wert abgefragt benötige, wenn diese sich ändert
Änderung eines Wertes kann man erst feststellen, wenn er diese geholt hat. Also muss man in bestimmten Abständen die Werte holen, der Adapter macht es alle 5 Minuten.
Ändern sich die Zahlen am Ende vom KEY?
1702364033 -> Dienstag, 12. Dezember 2023 07:53:53 GMT+01:00
// ****************** // powerdog v1.0.0 // ****************** // Copyright ©MCU const xmlrpc = require('xmlrpc'); // Konfigurationsvariablen für PowerDog const powerDogIp = '192.168.0.100'; // IP-Adresse des PowerDog-Geräts const powerDogPort = 20000; // Portnummer const apiKey = 'DEIN_API_KEY'; // Dein API-Schlüssel let userDP = '0_userdata.0.powerdog.' // Erstelle den XML-RPC-Client const client = xmlrpc.createClient({ host: powerDogIp, port: powerDogPort, path: '/' }); function setData(data, namespace){ for (const key in data) { if (data.hasOwnProperty(key)) { const obj = data[key]; if (typeof obj === 'object') { for (const subKey in obj) { if (obj.hasOwnProperty(subKey)) { const value = obj[subKey]; const id = userDP + `${namespace}.${key}.${subKey}`; // Objekt erstellen, falls es nicht existiert createState(id, value, { name: subKey, type: typeof value, role: 'state' }); // Wert setzen if(existsState(id)){ setState(id, value, true); }else{ setTimeout(function(){ setState(id, value, true); },3000) } } } } } } } // Funktion zum Auslesen und Speichern von Daten function fetchPowerDogData(method, namespace) { client.methodCall(method, [apiKey], function (error, response) { if (error) { log(`Fehler beim Abrufen der ${namespace}-Daten: ${error}`, 'error'); } else if (response && response.Reply) { const data = response.Reply; // log(`${namespace}-Daten erhalten: ${JSON.stringify(data)}`, 'info'); // Daten im ioBroker speichern setData(data,namespace) } else { log(`Keine ${namespace}-Daten erhalten.`, 'warn'); } }); } // PowerDog-Informationen abrufen fetchPowerDogData('getPowerDogInfo', 'Info'); // Sensor-Daten abrufen fetchPowerDogData('getSensors', 'Sensors'); // Zähler-Daten abrufen fetchPowerDogData('getCounters', 'Counters'); schedule('*/05 * * * *', () => { // PowerDog-Informationen abrufen fetchPowerDogData('getPowerDogInfo', 'Info'); // Sensor-Daten abrufen fetchPowerDogData('getSensors', 'Sensors'); // Zähler-Daten abrufen fetchPowerDogData('getCounters', 'Counters'); })
-
Vielen Danke @mcu mit diesem Script bekomme ich die Werte endlich ausgelesen und kann sie direkt in einer VIS verwenden. Die Struktur passt auch schon im Iobroker. Was hattest du noch gemeint mit dem KEY? Macht es viel aus wenn Iobroker (läuft auf Raspberry Pi) alle Daten aller Zähler und Sensoren alle 5Min abfrägt? Ansonsten würde ich hier gar nichts mehr groß verändern müssen, oder?
-
@ht22 Nein, dass ist im ms Bereich.
Man müsste evtl nochmal ran, wenn die Zahlen sich in den Keys permanent ändern sollten.
Aber es hängt evtl mit der Erstinstallation vom Gerät zusammen.