NEWS
Heizungswerte einer UVR1611 via CMI mittels JSON anlegen & refreshen
-
Hallo,
ich bin noch kompletter ioBroker Anfänger und in Java-Script nicht wirklich zu viel bewandert.
Was ich bis jetzt aus Foren Beiträgen gelesen habe, vermute ich aber, dass es zum Auslesen der Heizungswerte meiner UVR1611 (mittels CMI V1.28.1) nicht dumm wäre.
Die meisten älteren Versuche die UVR Daten zu bekommen gehen über das parsen der Webschnittstelle. Seit letztem Jahr aber kann man aber problemlos ein JSON formatiertes Ergebnis via http request bekommen. Ein request für "Eingänge - In", einen für "Ausgänge - Out" & Network analog/digital "Na,Nd"
Beschreibung von der Technischen Alternative:
Beispiel request: In, Out, Network anlog & digital
http://user:password@192.168.31.99/INCL ... =I,O,Na,Nd
Ergebnis:
{ "Header": { "Version": 3, "Device": "80", "Timestamp": 1519813410 }, "Data": { "Inputs": [ { "Number": 1, "AD": "A", "Value": { "Value": 51.2, "Unit": "1" } }, { "Number": 2, "AD": "A", "Value": { "Value": 48.5, "Unit": "1" } }, { "Number": 3, "AD": "A", "Value": { "Value": -12.3, "Unit": "1" } }, { "Number": 4, "AD": "A", "Value": { "Value": 26.9, "Unit": "1" } }, { "Number": 5, "AD": "A", "Value": { "Value": 32.1, "Unit": "1" } }, { "Number": 6, "AD": "A", "Value": { "Value": 32.5, "Unit": "1" } }, { "Number": 7, "AD": "A", "Value": { "Value": 34.8, "Unit": "1" } }, { "Number": 8, "AD": "A", "Value": { "Value": 57.3, "Unit": "1" } }, { "Number": 9, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 10, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 11, "AD": "A", "Value": { "Value": 28.6, "Unit": "1" } }, { "Number": 12, "AD": "A", "Value": { "Value": 17.3, "Unit": "1" } }, { "Number": 13, "AD": "A", "Value": { "Value": 15.2, "Unit": "1" } }, { "Number": 14, "AD": "A", "Value": { "Value": 62.8, "Unit": "1" } }, { "Number": 15, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 16, "AD": "D", "Value": { "Value": 0, "Unit": "43" } } ], "Outputs": [ { "Number": 1, "AD": "A", "Value": { "State": 1, "Value": 30, "Unit": "0" } }, { "Number": 2, "AD": "A", "Value": { "State": 1, "Value": 30, "Unit": "0" } }, { "Number": 3, "AD": "D", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 4, "AD": "D", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 5, "AD": "D", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 6, "AD": "A", "Value": { "State": 0, "Value": 0, "Unit": "0" } }, { "Number": 7, "AD": "A", "Value": { "State": 0, "Value": 0, "Unit": "0" } }, { "Number": 8, "AD": "D", "Value": { "Value": 1, "Unit": "0" } }, { "Number": 9, "AD": "D", "Value": { "Value": 1, "Unit": "0" } }, { "Number": 10, "AD": "D", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 11, "AD": "D", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 12, "AD": "D", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 13, "AD": "D", "Value": { "Value": 0, "Unit": "0" } } ], "Network Analog": [ { "Number": 1, "AD": "A", "Value": { "Value": 37, "Unit": "1" } }, { "Number": 2, "AD": "A", "Value": { "Value": 26.7, "Unit": "1" } }, { "Number": 3, "AD": "A", "Value": { "Value": 1601, "Unit": "3" } }, { "Number": 4, "AD": "A", "Value": { "Value": 46.6, "Unit": "1" } }, { "Number": 5, "AD": "A", "Value": { "Value": 38.5, "Unit": "1" } }, { "Number": 6, "AD": "A", "Value": { "Value": 0, "Unit": "3" } }, { "Number": 7, "AD": "A", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 8, "AD": "A", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 9, "AD": "A", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 10, "AD": "A", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 11, "AD": "A", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 12, "AD": "A", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 13, "AD": "A", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 14, "AD": "A", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 15, "AD": "A", "Value": { "Value": 0, "Unit": "0" } }, { "Number": 16, "AD": "D", "Value": { "Value": 0, "Unit": "43" } } ], "Network Digital": [ { "Number": 1, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 2, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 3, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 4, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 5, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 6, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 7, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 8, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 9, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 10, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 11, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 12, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 13, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 14, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 15, "AD": "D", "Value": { "Value": 0, "Unit": "43" } }, { "Number": 16, "AD": "D", "Value": { "Value": 0, "Unit": "43" } } ] }, "Status": "OK", "Status code": 0 }
Unit 0 = keine Einheit / digital
Unit 1 = °C
Unit 3 = l/h (Durchfluss)
Unit 43 = ?
Wisst ihr ob schon jemand dafür was geschrieben hat (Adapter oder Skript)?
Wie parse ich das am einfachsten und lege irgendwo im ioBroker diese Sensorik an?
Danke für Infos oder etwas Hilfe!
Patxi
-
Jetzt bin ich schon etwas weiter.
Allerdings habe ich noch Probleme mit den Boolean/State Kanälen.
Im JSON sind es 0 Werte und wie bekomme ich das im Java Script gescheit hin, daß sie auf true/false gesetzt werden?
var urlCMI = 'http://user:password@192.168.31.99/INCLUDE/api.cgi?jsonnode=1&jsonparam=I'; //,O,Na,Nd var forecreation = false; // Default: false. true: Datenpunkte werden überschrieben (wenn z.B. Bezeichnungen geändert wurden) var request = require("request"); var myJson = {}; var path = "UVR1611."; var pathIn = "Inputs."; //var pathOut = "Outputs."; //var pathNa = "Network Analog."; //var pathNd = "Network Digital."; var idIn01 = path + pathIn + "In01_A"; var idIn02 = path + pathIn + "In02_A"; var idIn03 = path + pathIn + "In03_A"; var idIn04 = path + pathIn + "In04_A"; var idIn05 = path + pathIn + "In05_A"; var idIn06 = path + pathIn + "In06_A"; var idIn07 = path + pathIn + "In07_A"; var idIn08 = path + pathIn + "In08_A"; var idIn09 = path + pathIn + "In09_D"; var idIn10 = path + pathIn + "In10_D"; var idIn11 = path + pathIn + "In11_A"; var idIn12 = path + pathIn + "In12_A"; var idIn13 = path + pathIn + "In13_A"; var idIn14 = path + pathIn + "In14_A"; //var idIn15 = path + pathIn + "In15_D"; var idIn16 = path + pathIn + "In16_D"; createState(idIn01, 0, forecreation, { name: 'T Solar Kollektor 1', desc: 'Solar Kollektor T1', type: 'number', role: 'value.temperature', unit: '°C'}); createState(idIn02, 0, forecreation, { name: 'T Solar Kollektor 2', desc: 'Solar Kollektor T2', type: 'number', role: 'value.temperature', unit: '°C'}); createState(idIn03, 0, forecreation, { name: 'T Aussen', desc: 'Aussen-Temperatur', type: 'number', role: 'value.temperature', unit: '°C'}); createState(idIn04, 0, forecreation, { name: 'T Speicher unten', desc: 'Puffer-Temperatur unten', type: 'number', role: 'value.temperature', unit: '°C'}); createState(idIn05, 0, forecreation, { name: 'T Speicher unten/mitte',desc: 'Puffer-Temperatur mitte 1',type: 'number', role: 'value.temperature', unit: '°C'}); createState(idIn06, 0, forecreation, { name: 'T Speicher mitte', desc: 'Puffer-Temperatur mitte 2',type: 'number', role: 'value.temperature', unit: '°C'}); createState(idIn07, 0, forecreation, { name: 'T Speicher mitte/oben', desc: 'Puffer-Temperatur mitte 3',type: 'number', role: 'value.temperature', unit: '°C'}); createState(idIn08, 0, forecreation, { name: 'T Speicher oben', desc: 'Puffer-Temperatur oben', type: 'number', role: 'value.temperature', unit: '°C'}); createState(idIn09, 0, forecreation, { name: 'Heizkreis 2', desc: 'Heizkreis 2', type: 'boolean',role: 'switch', def: false}); createState(idIn10, 0, forecreation, { name: 'Freigabe Elektr', desc: 'Freigabe Elektr', type: 'boolean',role: 'switch', def: false}); createState(idIn11, 0, forecreation, { name: 'T Ruecklauf WW', desc: 'Warmwasser Ruecklauf T', type: 'number', role: 'value.temperature', unit: '°C'}); createState(idIn12, 0, forecreation, { name: 'T Heizkreis VL 1', desc: 'Heizkreis-Temperatur VL1', type: 'number', role: 'value.temperature', unit: '°C'}); createState(idIn13, 0, forecreation, { name: 'T Heizraum', desc: 'Heizraum-Temperatur', type: 'number', role: 'value.temperature', unit: '°C'}); createState(idIn14, 0, forecreation, { name: 'T Holzkessel VL', desc: 'Holzkessel-Temperatur VL', type: 'number', role: 'value.temperature', unit: '°C'}); //createState(idIn15,0, forecreation, { name: 'T Speicher oben', desc: 'Puffer-Temperatur oben', type: 'number', role: 'value.temperature', unit: '°C'}); createState(idIn16, 0, forecreation, { name: 'Stroemungs-Schalter', desc: 'Stroemungs-Schalter', type: 'boolean',role: 'switch', def: false}); function parseJson(text) { if (text === "") return {}; try { json = JSON.parse(text); } catch (ex) { json = {}; } if(!json) json = {}; return json; } function readJson(url, callback) { request(url, function (err, state, body){ if (body) { var json = parseJson(body); callback(null, json); } else { var error = "(" + err + ") ERROR request from: " + url; log(error, "warn"); callback(error, null); } }); } function main() { readJson(urlCMI, function(err,json) { if(!err) { myJson = json; log("Version: " + myJson.Header.Version,"info"); log("Device: " + myJson.Header.Device,"info"); log("In01: " + myJson.Data.Inputs[0].Value.Value,"info"); log("In02: " + myJson.Data.Inputs[1].Value.Value,"info"); log("In03: " + myJson.Data.Inputs[2].Value.Value,"info"); log("In04: " + myJson.Data.Inputs[3].Value.Value,"info"); log("In05: " + myJson.Data.Inputs[4].Value.Value,"info"); log("In06: " + myJson.Data.Inputs[5].Value.Value,"info"); log("In07: " + myJson.Data.Inputs[6].Value.Value,"info"); log("In08: " + myJson.Data.Inputs[7].Value.Value,"info"); log("In09: " + myJson.Data.Inputs[8].Value.Value,"info"); log("In10: " + myJson.Data.Inputs[9].Value.Value,"info"); log("In11: " + myJson.Data.Inputs[10].Value.Value,"info"); log("In12: " + myJson.Data.Inputs[11].Value.Value,"info"); log("In13: " + myJson.Data.Inputs[12].Value.Value,"info"); log("In14: " + myJson.Data.Inputs[13].Value.Value,"info"); //log("In15: " + myJson.Data.Inputs[14].Value.Value,"info"); log("In16: " + myJson.Data.Inputs[15].Value.Value,"info"); setState(idIn01 ,parseFloat(myJson.Data.Inputs[0].Value.Value)); setState(idIn02 ,parseFloat(myJson.Data.Inputs[1].Value.Value)); setState(idIn03 ,parseFloat(myJson.Data.Inputs[2].Value.Value)); setState(idIn04 ,parseFloat(myJson.Data.Inputs[3].Value.Value)); setState(idIn05 ,parseFloat(myJson.Data.Inputs[4].Value.Value)); setState(idIn06 ,parseFloat(myJson.Data.Inputs[5].Value.Value)); setState(idIn07 ,parseFloat(myJson.Data.Inputs[6].Value.Value)); setState(idIn08 ,parseFloat(myJson.Data.Inputs[7].Value.Value)); setState(idIn09 ,!!parseInt(myJson.Data.Inputs[8].Value.Value)); setState(idIn10 ,!!parseInt(myJson.Data.Inputs[9].Value.Value)); setState(idIn11 ,parseFloat(myJson.Data.Inputs[10].Value.Value)); setState(idIn12 ,parseFloat(myJson.Data.Inputs[11].Value.Value)); setState(idIn13 ,parseFloat(myJson.Data.Inputs[12].Value.Value)); setState(idIn14 ,parseFloat(myJson.Data.Inputs[13].Value.Value)); // setState(idIn15 ,!!parseInt(myJson.Data.Inputs[14].Value.Value)); setState(idIn16 ,!!parseInt(myJson.Data.Inputs[15].Value.Value)); } else { log("Error reading JSON from CMI-UVR1611\. No data!","warn"); myJson = {}; } }); } schedule("*/5 * * * *", function () { // poll every 5 minutes main(); }); // poll values at startup setTimeout(main,2000);
–---
Ich vermute dass doch einige Leute die UVR1611 und CMI haben dürften und genau dieses auch brauchen könnten.
Ich wundere mich warum ich noch nichts diesbzgl. gefunden habe.
Eingreifen in die Steuerung der UVR funktioniert ja einscheinend auch durch einen http request (falls man von ioBroker was auslösen will).
Für jede Hilfe bin ich dankbar!
-
wie geht man mit den Boolean Werten um und wie kann man das Script noch besser gestalten?
-
wie geht man mit den Boolean Werten um `
Versuche es mal mitsetState(idIn09 ,!!parseInt(myJson.Data.Inputs[8].Value.Value));
-
danke! das scheint zu klappen.
Ich habe das o.g. Skript gleich mal angepasst.