BREAKING CHANGE: Web API!

In order to support multiple AC channels in future the WebAPI had to be changed. AC and DC channels are now grouped in a sub object containing the channels beginning with 0.
This commit is contained in:
Thomas Basler 2023-02-13 18:37:55 +01:00
parent ceaf08c1a0
commit 3b7aef63f8
8 changed files with 394 additions and 284 deletions

View File

@ -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 ~$ 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,83 +67,119 @@ To enhance readability (and filter information) use the JSON command line proces
{ {
"inverters": [ "inverters": [
{ {
"serial": "11418186xxxx", "serial": "116171603546",
"name": "HM600", "name": "Meine Solaranlage",
"data_age": 4, "data_age": 7038,
"reachable": true, "reachable": false,
"producing": true, "producing": false,
"limit_relative": 100, "limit_relative": 0,
"limit_absolute": 600, "limit_absolute": -1,
"AC": {
"0": { "0": {
"Power": { "Power": {
"v": 70.69999695, "v": 0,
"u": "W", "u": "W",
"d": 1 "d": 1
}, },
"Voltage": { "Voltage": {
"v": 233, "v": 0,
"u": "V", "u": "V",
"d": 1 "d": 1
}, },
"Current": { "Current": {
"v": 0.300000012, "v": 0,
"u": "A", "u": "A",
"d": 2 "d": 2
}, },
"Power DC": { "Power DC": {
"v": 74, "v": 0,
"u": "W", "u": "W",
"d": 2 "d": 1
}, },
"YieldDay": { "YieldDay": {
"v": 23, "v": 0,
"u": "Wh", "u": "Wh",
"d": 2 "d": 0
}, },
"YieldTotal": { "YieldTotal": {
"v": 150.5050049, "v": 0,
"u": "kWh", "u": "kWh",
"d": 2 "d": 3
}, },
"Frequency": { "Frequency": {
"v": 50.02000046, "v": 0,
"u": "Hz", "u": "Hz",
"d": 2 "d": 2
}, },
"Temperature": {
"v": 8.300000191,
"u": "°C",
"d": 1
},
"PowerFactor": { "PowerFactor": {
"v": 1, "v": 0,
"u": "", "u": "",
"d": 3 "d": 3
}, },
"ReactivePower": { "ReactivePower": {
"v": 0.100000001, "v": 0,
"u": "var", "u": "var",
"d": 1 "d": 1
}, },
"Efficiency": { "Efficiency": {
"v": 95.54053497, "v": 0,
"u": "%", "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 "d": 2
},
"YieldDay": {
"v": 0,
"u": "Wh",
"d": 0
},
"YieldTotal": {
"v": 0,
"u": "kWh",
"d": 3
},
"Irradiation": {
"v": 0,
"u": "%",
"d": 3
} }
}, },
"1": { "1": {
"name": {
"u": ""
},
"Power": { "Power": {
"v": 0, "v": 0,
"u": "W", "u": "W",
"d": 1 "d": 1
}, },
"Voltage": { "Voltage": {
"v": 1, "v": 0,
"u": "V", "u": "V",
"d": 1 "d": 1
}, },
"Current": { "Current": {
"v": 0.02, "v": 0,
"u": "A", "u": "A",
"d": 2 "d": 2
}, },
@ -153,198 +189,260 @@ To enhance readability (and filter information) use the JSON command line proces
"d": 0 "d": 0
}, },
"YieldTotal": { "YieldTotal": {
"v": 49.0320015, "v": 0,
"u": "kWh", "u": "kWh",
"d": 3 "d": 3
}, },
"Irradiation": { "Irradiation": {
"v": 0, "v": 0,
"u": "%", "u": "%",
"d": 2 "d": 3
} }
}, },
"2": { "2": {
"name": {
"u": ""
},
"Power": { "Power": {
"v": 74, "v": 0,
"u": "W", "u": "W",
"d": 1 "d": 1
}, },
"Voltage": { "Voltage": {
"v": 42.40000153, "v": 0,
"u": "V", "u": "V",
"d": 1 "d": 1
}, },
"Current": { "Current": {
"v": 1.74000001, "v": 0,
"u": "A", "u": "A",
"d": 2 "d": 2
}, },
"YieldDay": { "YieldDay": {
"v": 23, "v": 0,
"u": "Wh", "u": "Wh",
"d": 0 "d": 0
}, },
"YieldTotal": { "YieldTotal": {
"v": 101.4729996, "v": 0,
"u": "kWh", "u": "kWh",
"d": 3 "d": 3
}, },
"Irradiation": { "Irradiation": {
"v": 18.04878044, "v": 0,
"u": "%", "u": "%",
"d": 2 "d": 3
} }
}, },
"events": 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": "11418180xxxx", "serial": "114171603548",
"name": "HM800", "name": "test",
"data_age": 11, "data_age": 7038,
"reachable": true, "reachable": false,
"producing": true, "producing": false,
"limit_relative": 100, "limit_relative": 0,
"limit_absolute": 800, "limit_absolute": -1,
"AC": {
"0": { "0": {
"Power": { "Power": {
"v": 70.09999847, "v": 0,
"u": "W", "u": "W",
"d": 1 "d": 1
}, },
"Voltage": { "Voltage": {
"v": 233.1000061, "v": 0,
"u": "V", "u": "V",
"d": 1 "d": 1
}, },
"Current": { "Current": {
"v": 0.300000012, "v": 0,
"u": "A", "u": "A",
"d": 2 "d": 2
}, },
"Power DC": { "Power DC": {
"v": 73.59999847, "v": 0,
"u": "W", "u": "W",
"d": 2 "d": 1
}, },
"YieldDay": { "YieldDay": {
"v": 48, "v": 0,
"u": "Wh", "u": "Wh",
"d": 2 "d": 0
}, },
"YieldTotal": { "YieldTotal": {
"v": 48.5399971, "v": 0,
"u": "kWh", "u": "kWh",
"d": 2 "d": 3
}, },
"Frequency": { "Frequency": {
"v": 50.02000046, "v": 0,
"u": "Hz", "u": "Hz",
"d": 2 "d": 2
}, },
"Temperature": {
"v": 11.39999962,
"u": "°C",
"d": 1
},
"PowerFactor": { "PowerFactor": {
"v": 1, "v": 0,
"u": "", "u": "",
"d": 3 "d": 3
}, },
"ReactivePower": { "ReactivePower": {
"v": 0.100000001, "v": 0,
"u": "var", "u": "var",
"d": 1 "d": 1
}, },
"Efficiency": { "Efficiency": {
"v": 95.24456024, "v": 0,
"u": "%", "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 "d": 2
},
"YieldDay": {
"v": 0,
"u": "Wh",
"d": 0
},
"YieldTotal": {
"v": 0,
"u": "kWh",
"d": 3
},
"Irradiation": {
"v": 0,
"u": "%",
"d": 3
} }
}, },
"1": { "1": {
"name": {
"u": "test 2"
},
"Power": { "Power": {
"v": 36.5, "v": 0,
"u": "W", "u": "W",
"d": 1 "d": 1
}, },
"Voltage": { "Voltage": {
"v": 39.09999847, "v": 0,
"u": "V", "u": "V",
"d": 1 "d": 1
}, },
"Current": { "Current": {
"v": 0.930000007, "v": 0,
"u": "A", "u": "A",
"d": 2 "d": 2
}, },
"YieldDay": { "YieldDay": {
"v": 31, "v": 0,
"u": "Wh", "u": "Wh",
"d": 0 "d": 0
}, },
"YieldTotal": { "YieldTotal": {
"v": 4.301000118, "v": 0,
"u": "kWh", "u": "kWh",
"d": 3 "d": 3
}, },
"Irradiation": { "Irradiation": {
"v": 8.902439117, "v": 0,
"u": "%", "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 "d": 3
}, }
"Irradiation": {
"v": 9.048780441,
"u": "%",
"d": 2
} }
}, },
"events": 1 "INV": {
"0": {
"Temperature": {
"v": 0,
"u": "°C",
"d": 1
}
}
},
"events": 0
} }
], ],
"total": { "total": {
"Power": { "Power": {
"v": 140.7999878, "v": 0,
"u": "W", "u": "W",
"d": 1 "d": 1
}, },
"YieldDay": { "YieldDay": {
"v": 71, "v": 0,
"u": "Wh", "u": "Wh",
"d": 0 "d": 0
}, },
"YieldTotal": { "YieldTotal": {
"v": 199.0449982, "v": 0,
"u": "kWh", "u": "kWh",
"d": 2 "d": 2
} }
},
"hints": {
"time_sync": false,
"radio_problem": false,
"default_password": false
} }
} }
``` ```

View File

@ -112,33 +112,33 @@ void WebApiWsLiveClass::generateJsonResponse(JsonVariant& root)
// Loop all channels // Loop all channels
for (auto& t : inv->Statistics()->getChannelTypes()) { for (auto& t : inv->Statistics()->getChannelTypes()) {
JsonObject chanTypeObj = invObject.createNestedObject(inv->Statistics()->getChannelTypeName(t));
for (auto& c : inv->Statistics()->getChannelsByType(t)) { for (auto& c : inv->Statistics()->getChannelsByType(t)) {
if (t == TYPE_DC) { if (t == TYPE_DC) {
INVERTER_CONFIG_T* inv_cfg = Configuration.getInverterConfig(inv->serial()); INVERTER_CONFIG_T* inv_cfg = Configuration.getInverterConfig(inv->serial());
if (inv_cfg != nullptr) { if (inv_cfg != nullptr) {
// TODO(tbnobody) chanTypeObj[String(static_cast<uint8_t>(c))][F("name")]["u"] = inv_cfg->channel[c].Name;
invObject[String(static_cast<uint8_t>(c) + 1)][F("name")]["u"] = inv_cfg->channel[c].Name;
} }
} }
addField(invObject, i, inv, t, c, FLD_PAC); addField(chanTypeObj, i, inv, t, c, FLD_PAC);
addField(invObject, i, inv, t, c, FLD_UAC); addField(chanTypeObj, i, inv, t, c, FLD_UAC);
addField(invObject, i, inv, t, c, FLD_IAC); addField(chanTypeObj, i, inv, t, c, FLD_IAC);
if (t == TYPE_AC) { 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 { } 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(chanTypeObj, i, inv, t, c, FLD_UDC);
addField(invObject, i, inv, t, c, FLD_IDC); addField(chanTypeObj, i, inv, t, c, FLD_IDC);
addField(invObject, i, inv, t, c, FLD_YD); addField(chanTypeObj, i, inv, t, c, FLD_YD);
addField(invObject, i, inv, t, c, FLD_YT); addField(chanTypeObj, i, inv, t, c, FLD_YT);
addField(invObject, i, inv, t, c, FLD_F); addField(chanTypeObj, i, inv, t, c, FLD_F);
addField(invObject, i, inv, t, c, FLD_T); addField(chanTypeObj, i, inv, t, c, FLD_T);
addField(invObject, i, inv, t, c, FLD_PF); addField(chanTypeObj, i, inv, t, c, FLD_PF);
addField(invObject, i, inv, t, c, FLD_PRA); addField(chanTypeObj, i, inv, t, c, FLD_PRA);
addField(invObject, i, inv, t, c, FLD_EFF); addField(chanTypeObj, i, inv, t, c, FLD_EFF);
if (t == TYPE_DC && inv->Statistics()->getStringMaxPower(c) > 0) { 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; chanName = topic;
} }
String chanNum; String chanNum;
if (type == TYPE_DC) {
// TODO(tbnobody)
chanNum = static_cast<uint8_t>(channel) + 1;
} else {
chanNum = channel; chanNum = channel;
}
root[chanNum][chanName]["v"] = inv->Statistics()->getChannelFieldValue(type, channel, fieldId); root[chanNum][chanName]["v"] = inv->Statistics()->getChannelFieldValue(type, channel, fieldId);
root[chanNum][chanName]["u"] = inv->Statistics()->getChannelFieldUnit(type, channel, fieldId); root[chanNum][chanName]["u"] = inv->Statistics()->getChannelFieldUnit(type, channel, fieldId);
root[chanNum][chanName]["d"] = inv->Statistics()->getChannelFieldDigits(type, channel, fieldId); root[chanNum][chanName]["d"] = inv->Statistics()->getChannelFieldDigits(type, channel, fieldId);

View File

@ -1,11 +1,21 @@
<template> <template>
<div class="card" :class="{ 'border-info': channelNumber == 0 }"> <div class="card" :class="{
<div v-if="channelNumber >= 1" class="card-header"> 'border-info': channelType == 'AC',
<template v-if="channelData.name.u != ''">{{ channelData.name.u }}</template> 'border-secondary': channelType == 'INV'
<template v-else>{{ $t('inverterchannelinfo.String', { num: channelNumber }) }}</template> }">
<div v-if="channelType == 'INV'" class="card-header text-bg-secondary">
{{ $t('inverterchannelinfo.General') }}
</div> </div>
<div v-if="channelNumber == 0" class="card-header text-bg-info">
{{ $t('inverterchannelinfo.Phase', { num: channelNumber + 1 }) }}</div> <div v-if="channelType == 'DC'" class="card-header">
<template v-if="channelData.name.u != ''">{{ channelData.name.u }}</template>
<template v-else>{{ $t('inverterchannelinfo.String', { num: channelNumber + 1 }) }}</template>
</div>
<div v-if="channelType == 'AC'" class="card-header text-bg-info">
{{ $t('inverterchannelinfo.Phase', { num: channelNumber + 1 }) }}
</div>
<div class="card-body"> <div class="card-body">
<table class="table table-striped table-hover"> <table class="table table-striped table-hover">
<thead> <thead>
@ -41,6 +51,7 @@ import { defineComponent, type PropType } from 'vue';
export default defineComponent({ export default defineComponent({
props: { props: {
channelData: { type: Object as PropType<InverterStatistics>, required: true }, channelData: { type: Object as PropType<InverterStatistics>, required: true },
channelType: { type: String, required: true },
channelNumber: { type: Number, required: true }, channelNumber: { type: Number, required: true },
}, },
}); });

View File

@ -263,6 +263,7 @@
"inverterchannelinfo": { "inverterchannelinfo": {
"String": "String {num}", "String": "String {num}",
"Phase": "Phase {num}", "Phase": "Phase {num}",
"General": "Allgemein",
"Property": "Eigenschaft", "Property": "Eigenschaft",
"Value": "Wert", "Value": "Wert",
"Unit": "Einheit" "Unit": "Einheit"

View File

@ -263,6 +263,7 @@
"inverterchannelinfo": { "inverterchannelinfo": {
"String": "String {num}", "String": "String {num}",
"Phase": "Phase {num}", "Phase": "Phase {num}",
"General": "General",
"Property": "Property", "Property": "Property",
"Value": "Value", "Value": "Value",
"Unit": "Unit" "Unit": "Unit"

View File

@ -263,6 +263,7 @@
"inverterchannelinfo": { "inverterchannelinfo": {
"String": "Ligne {num}", "String": "Ligne {num}",
"Phase": "Phase {num}", "Phase": "Phase {num}",
"General": "General",
"Property": "Propriété", "Property": "Propriété",
"Value": "Valeur", "Value": "Valeur",
"Unit": "Unité" "Unit": "Unité"

View File

@ -29,7 +29,9 @@ export interface Inverter {
limit_relative: number; limit_relative: number;
limit_absolute: number; limit_absolute: number;
events: number; events: number;
[key: number]: InverterStatistics; AC: InverterStatistics[];
DC: InverterStatistics[];
INV: InverterStatistics[];
} }
export interface Total { export interface Total {

View File

@ -92,11 +92,12 @@
</div> </div>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="row flex-row-reverse flex-wrap-reverse align-items-end g-3"> <div class="row flex-row-reverse flex-wrap-reverse g-3">
<template v-for="channel in 5" :key="channel"> <template v-for="chanType in [{obj: inverter.INV, name: 'INV'}, {obj: inverter.AC, name: 'AC'}, {obj: inverter.DC, name: 'DC'}].reverse()">
<div v-if="inverter[channel - 1]" :class="`col order-${5 - channel}`"> <div v-for="channel in Object.keys(chanType.obj).sort().reverse().map(x=>+x)" :key="channel" class="col">
<InverterChannelInfo :channelData="inverter[channel - 1]" <InverterChannelInfo :channelData="chanType.obj[channel]"
:channelNumber="channel - 1" /> :channelType="chanType.name"
:channelNumber="channel" />
</div> </div>
</template> </template>
</div> </div>