diff --git a/docs/Web-API.md b/docs/Web-API.md index cd640782..f772b05c 100644 --- a/docs/Web-API.md +++ b/docs/Web-API.md @@ -56,7 +56,7 @@ You can "talk" to the OpenDTU with a command line tool like `curl`. The output i ``` ~$ curl http://192.168.10.10/api/livedata/status -{"inverters":[{"serial":"11418186xxxx","name":"HM600","data_age":4,"reachable":true,"producing":true,"limit_relative":100,"limit_absolute":600,"0":{"Power":{"v":70.69999695,"u":"W","d":1},"Voltage":{"v":233,"u":"V","d":1},"Current":{"v":0.300000012,"u":"A","d":2},"Power DC":{"v":74,"u":"W","d":2},"YieldDay":{"v":23,"u":"Wh","d":2},"YieldTotal":{"v":150.5050049,"u":"kWh","d":2},"Frequency":{"v":50.02000046,"u":"Hz","d":2},"Temperature":{"v":8.300000191,"u":"°C","d":1},"PowerFactor":{"v":1,"u":"","d":3},"ReactivePower":{"v":0.100000001,"u":"var","d":1},"Efficiency":{"v":95.54053497,"u":"%","d":2}},"1":{"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":1,"u":"V","d":1},"Current":{"v":0.02,"u":"A","d":2},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":49.0320015,"u":"kWh","d":3},"Irradiation":{"v":0,"u":"%","d":2}},"2":{"Power":{"v":74,"u":"W","d":1},"Voltage":{"v":42.40000153,"u":"V","d":1},"Current":{"v":1.74000001,"u":"A","d":2},"YieldDay":{"v":23,"u":"Wh","d":0},"YieldTotal":{"v":101.4729996,"u":"kWh","d":3},"Irradiation":{"v":18.04878044,"u":"%","d":2}},"events":3},{"serial":"11418180xxxx","name":"HM800","data_age":11,"reachable":true,"producing":true,"limit_relative":100,"limit_absolute":800,"0":{"Power":{"v":70.09999847,"u":"W","d":1},"Voltage":{"v":233.1000061,"u":"V","d":1},"Current":{"v":0.300000012,"u":"A","d":2},"Power DC":{"v":73.59999847,"u":"W","d":2},"YieldDay":{"v":48,"u":"Wh","d":2},"YieldTotal":{"v":48.5399971,"u":"kWh","d":2},"Frequency":{"v":50.02000046,"u":"Hz","d":2},"Temperature":{"v":11.39999962,"u":"°C","d":1},"PowerFactor":{"v":1,"u":"","d":3},"ReactivePower":{"v":0.100000001,"u":"var","d":1},"Efficiency":{"v":95.24456024,"u":"%","d":2}},"1":{"Power":{"v":36.5,"u":"W","d":1},"Voltage":{"v":39.09999847,"u":"V","d":1},"Current":{"v":0.930000007,"u":"A","d":2},"YieldDay":{"v":31,"u":"Wh","d":0},"YieldTotal":{"v":4.301000118,"u":"kWh","d":3},"Irradiation":{"v":8.902439117,"u":"%","d":2}},"2":{"Power":{"v":37.09999847,"u":"W","d":1},"Voltage":{"v":40.79999924,"u":"V","d":1},"Current":{"v":0.910000026,"u":"A","d":2},"YieldDay":{"v":17,"u":"Wh","d":0},"YieldTotal":{"v":44.23899841,"u":"kWh","d":3},"Irradiation":{"v":9.048780441,"u":"%","d":2}},"events":1}],"total":{"Power":{"v":140.7999878,"u":"W","d":1},"YieldDay":{"v":71,"u":"Wh","d":0},"YieldTotal":{"v":199.0449982,"u":"kWh","d":2}}} +{"inverters":[{"serial":"11617160xxxx","name":"Meine Solaranlage","data_age":6983,"reachable":false,"producing":false,"limit_relative":0,"limit_absolute":-1,"AC":{"0":{"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"Power DC":{"v":0,"u":"W","d":1},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3},"Frequency":{"v":0,"u":"Hz","d":2},"PowerFactor":{"v":0,"u":"","d":3},"ReactivePower":{"v":0,"u":"var","d":1},"Efficiency":{"v":0,"u":"%","d":3}}},"DC":{"0":{"name":{"u":""},"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3},"Irradiation":{"v":0,"u":"%","d":3}},"1":{"name":{"u":""},"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3},"Irradiation":{"v":0,"u":"%","d":3}},"2":{"name":{"u":""},"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3},"Irradiation":{"v":0,"u":"%","d":3}},"3":{"name":{"u":""},"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3}}},"INV":{"0":{"Temperature":{"v":0,"u":"°C","d":1}}},"events":0},{"serial":"11417160xxxx","name":"test","data_age":6983,"reachable":false,"producing":false,"limit_relative":0,"limit_absolute":-1,"AC":{"0":{"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"Power DC":{"v":0,"u":"W","d":1},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3},"Frequency":{"v":0,"u":"Hz","d":2},"PowerFactor":{"v":0,"u":"","d":3},"ReactivePower":{"v":0,"u":"var","d":1},"Efficiency":{"v":0,"u":"%","d":3}}},"DC":{"0":{"name":{"u":"test 1"},"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3},"Irradiation":{"v":0,"u":"%","d":3}},"1":{"name":{"u":"test 2"},"Power":{"v":0,"u":"W","d":1},"Voltage":{"v":0,"u":"V","d":1},"Current":{"v":0,"u":"A","d":2},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":3},"Irradiation":{"v":0,"u":"%","d":3}}},"INV":{"0":{"Temperature":{"v":0,"u":"°C","d":1}}},"events":0}],"total":{"Power":{"v":0,"u":"W","d":1},"YieldDay":{"v":0,"u":"Wh","d":0},"YieldTotal":{"v":0,"u":"kWh","d":2}},"hints":{"time_sync":false,"radio_problem":false,"default_password":false}} ``` @@ -67,284 +67,382 @@ To enhance readability (and filter information) use the JSON command line proces { "inverters": [ { - "serial": "11418186xxxx", - "name": "HM600", - "data_age": 4, - "reachable": true, - "producing": true, - "limit_relative": 100, - "limit_absolute": 600, - "0": { - "Power": { - "v": 70.69999695, - "u": "W", - "d": 1 - }, - "Voltage": { - "v": 233, - "u": "V", - "d": 1 - }, - "Current": { - "v": 0.300000012, - "u": "A", - "d": 2 - }, - "Power DC": { - "v": 74, - "u": "W", - "d": 2 - }, - "YieldDay": { - "v": 23, - "u": "Wh", - "d": 2 - }, - "YieldTotal": { - "v": 150.5050049, - "u": "kWh", - "d": 2 - }, - "Frequency": { - "v": 50.02000046, - "u": "Hz", - "d": 2 - }, - "Temperature": { - "v": 8.300000191, - "u": "°C", - "d": 1 - }, - "PowerFactor": { - "v": 1, - "u": "", - "d": 3 - }, - "ReactivePower": { - "v": 0.100000001, - "u": "var", - "d": 1 - }, - "Efficiency": { - "v": 95.54053497, - "u": "%", - "d": 2 + "serial": "116171603546", + "name": "Meine Solaranlage", + "data_age": 7038, + "reachable": false, + "producing": false, + "limit_relative": 0, + "limit_absolute": -1, + "AC": { + "0": { + "Power": { + "v": 0, + "u": "W", + "d": 1 + }, + "Voltage": { + "v": 0, + "u": "V", + "d": 1 + }, + "Current": { + "v": 0, + "u": "A", + "d": 2 + }, + "Power DC": { + "v": 0, + "u": "W", + "d": 1 + }, + "YieldDay": { + "v": 0, + "u": "Wh", + "d": 0 + }, + "YieldTotal": { + "v": 0, + "u": "kWh", + "d": 3 + }, + "Frequency": { + "v": 0, + "u": "Hz", + "d": 2 + }, + "PowerFactor": { + "v": 0, + "u": "", + "d": 3 + }, + "ReactivePower": { + "v": 0, + "u": "var", + "d": 1 + }, + "Efficiency": { + "v": 0, + "u": "%", + "d": 3 + } } }, - "1": { - "Power": { - "v": 0, - "u": "W", - "d": 1 + "DC": { + "0": { + "name": { + "u": "" + }, + "Power": { + "v": 0, + "u": "W", + "d": 1 + }, + "Voltage": { + "v": 0, + "u": "V", + "d": 1 + }, + "Current": { + "v": 0, + "u": "A", + "d": 2 + }, + "YieldDay": { + "v": 0, + "u": "Wh", + "d": 0 + }, + "YieldTotal": { + "v": 0, + "u": "kWh", + "d": 3 + }, + "Irradiation": { + "v": 0, + "u": "%", + "d": 3 + } }, - "Voltage": { - "v": 1, - "u": "V", - "d": 1 + "1": { + "name": { + "u": "" + }, + "Power": { + "v": 0, + "u": "W", + "d": 1 + }, + "Voltage": { + "v": 0, + "u": "V", + "d": 1 + }, + "Current": { + "v": 0, + "u": "A", + "d": 2 + }, + "YieldDay": { + "v": 0, + "u": "Wh", + "d": 0 + }, + "YieldTotal": { + "v": 0, + "u": "kWh", + "d": 3 + }, + "Irradiation": { + "v": 0, + "u": "%", + "d": 3 + } }, - "Current": { - "v": 0.02, - "u": "A", - "d": 2 + "2": { + "name": { + "u": "" + }, + "Power": { + "v": 0, + "u": "W", + "d": 1 + }, + "Voltage": { + "v": 0, + "u": "V", + "d": 1 + }, + "Current": { + "v": 0, + "u": "A", + "d": 2 + }, + "YieldDay": { + "v": 0, + "u": "Wh", + "d": 0 + }, + "YieldTotal": { + "v": 0, + "u": "kWh", + "d": 3 + }, + "Irradiation": { + "v": 0, + "u": "%", + "d": 3 + } }, - "YieldDay": { - "v": 0, - "u": "Wh", - "d": 0 - }, - "YieldTotal": { - "v": 49.0320015, - "u": "kWh", - "d": 3 - }, - "Irradiation": { - "v": 0, - "u": "%", - "d": 2 + "3": { + "name": { + "u": "" + }, + "Power": { + "v": 0, + "u": "W", + "d": 1 + }, + "Voltage": { + "v": 0, + "u": "V", + "d": 1 + }, + "Current": { + "v": 0, + "u": "A", + "d": 2 + }, + "YieldDay": { + "v": 0, + "u": "Wh", + "d": 0 + }, + "YieldTotal": { + "v": 0, + "u": "kWh", + "d": 3 + } } }, - "2": { - "Power": { - "v": 74, - "u": "W", - "d": 1 - }, - "Voltage": { - "v": 42.40000153, - "u": "V", - "d": 1 - }, - "Current": { - "v": 1.74000001, - "u": "A", - "d": 2 - }, - "YieldDay": { - "v": 23, - "u": "Wh", - "d": 0 - }, - "YieldTotal": { - "v": 101.4729996, - "u": "kWh", - "d": 3 - }, - "Irradiation": { - "v": 18.04878044, - "u": "%", - "d": 2 + "INV": { + "0": { + "Temperature": { + "v": 0, + "u": "°C", + "d": 1 + } } }, - "events": 3 + "events": 0 }, { - "serial": "11418180xxxx", - "name": "HM800", - "data_age": 11, - "reachable": true, - "producing": true, - "limit_relative": 100, - "limit_absolute": 800, - "0": { - "Power": { - "v": 70.09999847, - "u": "W", - "d": 1 - }, - "Voltage": { - "v": 233.1000061, - "u": "V", - "d": 1 - }, - "Current": { - "v": 0.300000012, - "u": "A", - "d": 2 - }, - "Power DC": { - "v": 73.59999847, - "u": "W", - "d": 2 - }, - "YieldDay": { - "v": 48, - "u": "Wh", - "d": 2 - }, - "YieldTotal": { - "v": 48.5399971, - "u": "kWh", - "d": 2 - }, - "Frequency": { - "v": 50.02000046, - "u": "Hz", - "d": 2 - }, - "Temperature": { - "v": 11.39999962, - "u": "°C", - "d": 1 - }, - "PowerFactor": { - "v": 1, - "u": "", - "d": 3 - }, - "ReactivePower": { - "v": 0.100000001, - "u": "var", - "d": 1 - }, - "Efficiency": { - "v": 95.24456024, - "u": "%", - "d": 2 + "serial": "114171603548", + "name": "test", + "data_age": 7038, + "reachable": false, + "producing": false, + "limit_relative": 0, + "limit_absolute": -1, + "AC": { + "0": { + "Power": { + "v": 0, + "u": "W", + "d": 1 + }, + "Voltage": { + "v": 0, + "u": "V", + "d": 1 + }, + "Current": { + "v": 0, + "u": "A", + "d": 2 + }, + "Power DC": { + "v": 0, + "u": "W", + "d": 1 + }, + "YieldDay": { + "v": 0, + "u": "Wh", + "d": 0 + }, + "YieldTotal": { + "v": 0, + "u": "kWh", + "d": 3 + }, + "Frequency": { + "v": 0, + "u": "Hz", + "d": 2 + }, + "PowerFactor": { + "v": 0, + "u": "", + "d": 3 + }, + "ReactivePower": { + "v": 0, + "u": "var", + "d": 1 + }, + "Efficiency": { + "v": 0, + "u": "%", + "d": 3 + } } }, - "1": { - "Power": { - "v": 36.5, - "u": "W", - "d": 1 + "DC": { + "0": { + "name": { + "u": "test 1" + }, + "Power": { + "v": 0, + "u": "W", + "d": 1 + }, + "Voltage": { + "v": 0, + "u": "V", + "d": 1 + }, + "Current": { + "v": 0, + "u": "A", + "d": 2 + }, + "YieldDay": { + "v": 0, + "u": "Wh", + "d": 0 + }, + "YieldTotal": { + "v": 0, + "u": "kWh", + "d": 3 + }, + "Irradiation": { + "v": 0, + "u": "%", + "d": 3 + } }, - "Voltage": { - "v": 39.09999847, - "u": "V", - "d": 1 - }, - "Current": { - "v": 0.930000007, - "u": "A", - "d": 2 - }, - "YieldDay": { - "v": 31, - "u": "Wh", - "d": 0 - }, - "YieldTotal": { - "v": 4.301000118, - "u": "kWh", - "d": 3 - }, - "Irradiation": { - "v": 8.902439117, - "u": "%", - "d": 2 + "1": { + "name": { + "u": "test 2" + }, + "Power": { + "v": 0, + "u": "W", + "d": 1 + }, + "Voltage": { + "v": 0, + "u": "V", + "d": 1 + }, + "Current": { + "v": 0, + "u": "A", + "d": 2 + }, + "YieldDay": { + "v": 0, + "u": "Wh", + "d": 0 + }, + "YieldTotal": { + "v": 0, + "u": "kWh", + "d": 3 + }, + "Irradiation": { + "v": 0, + "u": "%", + "d": 3 + } } }, - "2": { - "Power": { - "v": 37.09999847, - "u": "W", - "d": 1 - }, - "Voltage": { - "v": 40.79999924, - "u": "V", - "d": 1 - }, - "Current": { - "v": 0.910000026, - "u": "A", - "d": 2 - }, - "YieldDay": { - "v": 17, - "u": "Wh", - "d": 0 - }, - "YieldTotal": { - "v": 44.23899841, - "u": "kWh", - "d": 3 - }, - "Irradiation": { - "v": 9.048780441, - "u": "%", - "d": 2 + "INV": { + "0": { + "Temperature": { + "v": 0, + "u": "°C", + "d": 1 + } } }, - "events": 1 + "events": 0 } ], "total": { "Power": { - "v": 140.7999878, + "v": 0, "u": "W", "d": 1 }, "YieldDay": { - "v": 71, + "v": 0, "u": "Wh", "d": 0 }, "YieldTotal": { - "v": 199.0449982, + "v": 0, "u": "kWh", "d": 2 } + }, + "hints": { + "time_sync": false, + "radio_problem": false, + "default_password": false } } ``` diff --git a/src/WebApi_ws_live.cpp b/src/WebApi_ws_live.cpp index 459197ec..fedc9fff 100644 --- a/src/WebApi_ws_live.cpp +++ b/src/WebApi_ws_live.cpp @@ -112,33 +112,33 @@ void WebApiWsLiveClass::generateJsonResponse(JsonVariant& root) // Loop all channels for (auto& t : inv->Statistics()->getChannelTypes()) { + JsonObject chanTypeObj = invObject.createNestedObject(inv->Statistics()->getChannelTypeName(t)); for (auto& c : inv->Statistics()->getChannelsByType(t)) { if (t == TYPE_DC) { INVERTER_CONFIG_T* inv_cfg = Configuration.getInverterConfig(inv->serial()); if (inv_cfg != nullptr) { - // TODO(tbnobody) - invObject[String(static_cast(c) + 1)][F("name")]["u"] = inv_cfg->channel[c].Name; + chanTypeObj[String(static_cast(c))][F("name")]["u"] = inv_cfg->channel[c].Name; } } - addField(invObject, i, inv, t, c, FLD_PAC); - addField(invObject, i, inv, t, c, FLD_UAC); - addField(invObject, i, inv, t, c, FLD_IAC); + addField(chanTypeObj, i, inv, t, c, FLD_PAC); + addField(chanTypeObj, i, inv, t, c, FLD_UAC); + addField(chanTypeObj, i, inv, t, c, FLD_IAC); if (t == TYPE_AC) { - addField(invObject, i, inv, t, c, FLD_PDC, F("Power DC")); + addField(chanTypeObj, i, inv, t, c, FLD_PDC, F("Power DC")); } else { - addField(invObject, i, inv, t, c, FLD_PDC); + addField(chanTypeObj, i, inv, t, c, FLD_PDC); } - addField(invObject, i, inv, t, c, FLD_UDC); - addField(invObject, i, inv, t, c, FLD_IDC); - addField(invObject, i, inv, t, c, FLD_YD); - addField(invObject, i, inv, t, c, FLD_YT); - addField(invObject, i, inv, t, c, FLD_F); - addField(invObject, i, inv, t, c, FLD_T); - addField(invObject, i, inv, t, c, FLD_PF); - addField(invObject, i, inv, t, c, FLD_PRA); - addField(invObject, i, inv, t, c, FLD_EFF); + addField(chanTypeObj, i, inv, t, c, FLD_UDC); + addField(chanTypeObj, i, inv, t, c, FLD_IDC); + addField(chanTypeObj, i, inv, t, c, FLD_YD); + addField(chanTypeObj, i, inv, t, c, FLD_YT); + addField(chanTypeObj, i, inv, t, c, FLD_F); + addField(chanTypeObj, i, inv, t, c, FLD_T); + addField(chanTypeObj, i, inv, t, c, FLD_PF); + addField(chanTypeObj, i, inv, t, c, FLD_PRA); + addField(chanTypeObj, i, inv, t, c, FLD_EFF); if (t == TYPE_DC && inv->Statistics()->getStringMaxPower(c) > 0) { - addField(invObject, i, inv, t, c, FLD_IRR); + addField(chanTypeObj, i, inv, t, c, FLD_IRR); } } } @@ -187,12 +187,7 @@ void WebApiWsLiveClass::addField(JsonObject& root, uint8_t idx, std::shared_ptr< chanName = topic; } String chanNum; - if (type == TYPE_DC) { - // TODO(tbnobody) - chanNum = static_cast(channel) + 1; - } else { - chanNum = channel; - } + chanNum = channel; root[chanNum][chanName]["v"] = inv->Statistics()->getChannelFieldValue(type, channel, fieldId); root[chanNum][chanName]["u"] = inv->Statistics()->getChannelFieldUnit(type, channel, fieldId); root[chanNum][chanName]["d"] = inv->Statistics()->getChannelFieldDigits(type, channel, fieldId); diff --git a/webapp/src/components/InverterChannelInfo.vue b/webapp/src/components/InverterChannelInfo.vue index 0025a3b8..d169f5a2 100644 --- a/webapp/src/components/InverterChannelInfo.vue +++ b/webapp/src/components/InverterChannelInfo.vue @@ -1,11 +1,21 @@ @@ -41,6 +51,7 @@ import { defineComponent, type PropType } from 'vue'; export default defineComponent({ props: { channelData: { type: Object as PropType, required: true }, + channelType: { type: String, required: true }, channelNumber: { type: Number, required: true }, }, }); diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index 4690c5ed..c63fa352 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -263,6 +263,7 @@ "inverterchannelinfo": { "String": "String {num}", "Phase": "Phase {num}", + "General": "Allgemein", "Property": "Eigenschaft", "Value": "Wert", "Unit": "Einheit" diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index 3fb93cd3..655a0560 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -263,6 +263,7 @@ "inverterchannelinfo": { "String": "String {num}", "Phase": "Phase {num}", + "General": "General", "Property": "Property", "Value": "Value", "Unit": "Unit" diff --git a/webapp/src/locales/fr.json b/webapp/src/locales/fr.json index 0d05ae5e..a5ecbc82 100644 --- a/webapp/src/locales/fr.json +++ b/webapp/src/locales/fr.json @@ -263,6 +263,7 @@ "inverterchannelinfo": { "String": "Ligne {num}", "Phase": "Phase {num}", + "General": "General", "Property": "Propriété", "Value": "Valeur", "Unit": "Unité" diff --git a/webapp/src/types/LiveDataStatus.ts b/webapp/src/types/LiveDataStatus.ts index f8702810..64292ebf 100644 --- a/webapp/src/types/LiveDataStatus.ts +++ b/webapp/src/types/LiveDataStatus.ts @@ -29,7 +29,9 @@ export interface Inverter { limit_relative: number; limit_absolute: number; events: number; - [key: number]: InverterStatistics; + AC: InverterStatistics[]; + DC: InverterStatistics[]; + INV: InverterStatistics[]; } export interface Total { diff --git a/webapp/src/views/HomeView.vue b/webapp/src/views/HomeView.vue index 51faf5ec..720013dd 100644 --- a/webapp/src/views/HomeView.vue +++ b/webapp/src/views/HomeView.vue @@ -92,11 +92,12 @@
-
-