NEWS
JSON File Auswerten
-
Ich brächte bitte etwas Hilfe mit der Auswertung eines Json file welches bei mir am FTP Server liegt.
Situation: Ich habe einen Fronius Wechselrichter, und den Fronius Adapter installiert, der funktioniert auch perfekt, allerdings gibt es einen Wert welchen ich mit dem Adapter nicht bekomme, der kann nur mittles Fonius-Push Service auf einen FTP Server gepusht werden. Das habe ich auch schon eingerichtet, es wird alle 10 sec. ein file auf meinen FTP Server geschrieben, Beispiel file ist hier angehängt (digital_out.txt):
Jetzt brauche ich von diesem file eigentlich nur einen Status/Wert abfragen (habe ihn rot markiert weiter unten) und diesen möchte ich dann gerne visualisieren.
{
"pin 0" : {
"direction" : "out",
"function" : "SystemOperationalManagementGranted",
"set" : false,
"type" : "DIGITAL"
},
"pin 1" : {
"direction" : "out",
"function" : "EMRS_OUTPUT_1",
"set" : false,
"type" : "DIGITAL"
Leider hab ich keine Ahnung wie ich das am Besten anstelle, vielleicht hat jemand eine Idee.
Vielen Dank!
3139_digital_out.txt -
I
Leider hab ich keine Ahnung wie ich das am Besten anstelle, vielleicht hat jemand eine Idee. `
Wenn Du die Datei auf Deinem ioBroker Server übertragen kannst versuche mal dieses Skript:
!
var pfad = "fronius" + "."; var cronStr = "*/1 * * * *"; // wie of soll die Datei abgefragt werden var abfragePin1 = "cat /tmp/digital_out.txt"; //hier den Pfad und den Dateinamen ! var forceCreation = false; ! var datenpunkte = { 'pin1': { "init":false, "common": { name: 'Wert Pin 1', desc: 'Wert Pin 1', type: 'boolean', unit: '', role: 'value' } } }; ! function createDp() { var name; var init; var common; for (var dp in datenpunkte) { name = pfad + dp; init = datenpunkte[dp].init; common = datenpunkte[dp].common; createState(name, init , forceCreation, common); } } ! // Average Load mit uptime auslesen function getData() { exec(abfragePin1, function(err, stdout, stderr) { if (err) { log(err); return; } var json = JSON.parse(stdout); log(stdout); log(json["pin 1"].set); setState(pfad + 'pin1',json["pin 1"].set); }); } ! // regelmässige Wiederholungen // ----------------------------------------------------------------------------- schedule(cronStr, getData); ! // main // ----------------------------------------------------------------------------- function main() { getData(); } ! // Start Skript: // ----------------------------------------------------------------------------- ! createDp(); setTimeout(main, 500); !
Dazu muss ioBroker auf einem Linux laufen (wg. dem Kommando cat).
Der Pfad und Dateiname muss Deinen Werten entsprechend angepasst werden:
var abfragePin1 = "cat /tmp/digital_out.txt"; //hier den Pfad und den Dateinamen
-
das ist schon mal ein guter Ansatz, ich muss mir jettz überlegen wie ich von meinem Fronius WR die Datei auf meinen iobroker bekomme. Der läuft auf einer Synology im docker. Wenn ich dort einen FTP service zum laufen bringe dann könnte ich das file direkt in den iobroker schreiben. Ob das "cat" command bei dieser Version läuft muss ich erst schauen, ich werde weiter berichten,
danke schon mal inzwischen für die Hilfe.
-
Wenn ich dort einen FTP service zum laufen bringe dann könnte ich das file direkt in den iobroker schreiben. `
Kannst Du nicht das Verzeichnis von Deinem FTP Server mounten?
Dann könntest Du den Pfad angeben.
-
Wenn ich dort einen FTP service zum laufen bringe dann könnte ich das file direkt in den iobroker schreiben. `
Kannst Du nicht das Verzeichnis von Deinem FTP Server mounten?
Dann könntest Du den Pfad angeben. `
ja denke schon nur weiss ich noch nicht wie ich das im iobroker terminal mache…
-
file auf meinen FTP Server geschrieben `
Ist die Datei dann auch per HTTP erreichbar oder ist das ein reiner FTP-Server? Falls ersteres kannst du mit dem request-Modul die Datei in regelmäßigen Abständen abrufen und dann auslesen. -
file auf meinen FTP Server geschrieben
Ist die Datei dann auch per HTTP erreichbar oder ist das ein reiner FTP-Server? Falls ersteres kannst du mit dem request-Modul die Datei in regelmäßigen Abständen abrufen und dann auslesen.
Leider ist die Datei nicht per HTTP erreichbar, ich werde aber noch schauen ob ich es irgendwie schaffe diese per HTTP zur Verfügung zu stellen
-
file auf meinen FTP Server geschrieben
Ist die Datei dann auch per HTTP erreichbarso jetzt ist die Datei auch per HTTP erreichbar, jetzt bräuchte ich nur noch Hilfe mit dem request-modul. Wie muss ich das konfigurieren bzw. wie kann ich meine Datei dann per HTTP abfragen?
habe folgende URL wo ich mein file angezeigt bekomme: 192.168.1.33/files/digital_out.json
bekomme dann dieses file angezeigt, und möchte da eigentlich nur den teil in Rot markeirt abfragen:
{
"pin 0" : {
"direction" : "out",
"function" : "SystemOperationalManagementGranted",
"set" : false,
"type" : "DIGITAL"
},
"pin 1" : {
"direction" : "out",
"function" : "EMRS_OUTPUT_1",
"set" : true,
"type" : "DIGITAL"
},
"pin 2" : {
"direction" : "in",
"function" : "EVU_INPUT_1",
"set" : false,
"type" : "DIGITAL"
},
"pin 3" : {
"direction" : "in",
"function" : "EVU_INPUT_2",
"set" : false,
"type" : "DIGITAL"
},
"pin 4" : {
"direction" : "in",
"function" : "SystemOperationalManagementRequest",
"set" : false,
"type" : "DIGITAL"
},
"pin 5" : {
"direction" : "in",
"function" : "SystemOperationalManagementAcknowledge",
"set" : false,
"type" : "DIGITAL"
},
"pin 6" : {
"direction" : "in",
"function" : "EVU_INPUT_5",
"set" : false,
"type" : "DIGITAL"
},
"pin 7" : {
"direction" : "in",
"function" : "EVU_INPUT_6",
"set" : false,
"type" : "DIGITAL"
},
"pin 8" : {
"direction" : "in",
"function" : "EVU_INPUT_7",
"set" : false,
"type" : "DIGITAL"
},
"pin 9" : {
"direction" : "in",
"function" : "EVU_INPUT_8",
"set" : false,
"type" : "DIGITAL"
}
}
-
jetzt bräuchte ich nur noch Hilfe mit dem request-modul. Wie muss ich das konfigurieren bzw. wie kann ich meine Datei dann per HTTP abfragen? `
Du brauchst den JavaScript-Adapter und trägst in dessen Konfiguration bei "zusätliche Module" request ein.Hier findest du Dokumentation dazu: https://github.com/request/request
Der einfachste Fall, der für dich ausreichen sollte steht ganz oben. Baue ein neues Skript (nicht unter global!):
var request = require('request'); // Diese Funktion immer ausführen, wenn du neue Daten abrufen willst, z.b. per schedule: request('!!!hier die URL hin!!!', function (error, response, body) { if (error) { log("Fehler aufgetreten: " + error); } else { var json = JSON.parse(body); // Daten aus json auswerten (siehe anderes Skript in diesem Thread) } });
-
Etwa so
var request = require('request'); var url = '...'; createState('Wechselrichter.pin1.set', false, { type: 'boolean', read: true, write: true }); function wr() { request(url, function(error,response, body) { if(error) log('Fehler request: ' + error, 'error'); else { var obj = JSON.parse(body); setState('Wechselrichter.pin1.set', obj['pin 1'].set); // Wert von Pin 1: set in Datenpunkt } }); } schedule('*/1 * * * *', wr); // jede Minute
-
und trägst in dessen Konfiguration bei "zusätliche Module" request ein. `
Das ist nicht erforderlich, denn 'request' ist schon im JS-Adapter installiert. -
@ALLE
Vielen Dank für eure Hilfe. Funktioniert perfekt jetzt, hab wieder etwas dazugelernt
LG
Duke