Merge PR #215: Kostal: Switch to queued requests and add PIKO CI support

pull/219/head
jenkins 2025-09-11 14:25:44 +02:00
commit f053630cfc
2 changed files with 42 additions and 42 deletions

View File

@ -449,7 +449,7 @@ void IntegrationPluginKostal::setupKostalConnection(ThingSetupInfo *info)
if (meterThings.count() == 1) {
Thing *meterThing = meterThings.first();
// Power
// Current
meterThing->setStateValue(kostalMeterCurrentPhaseAStateTypeId, kostalConnection->powerMeterCurrentPhase1());
meterThing->setStateValue(kostalMeterCurrentPhaseBStateTypeId, kostalConnection->powerMeterCurrentPhase2());
meterThing->setStateValue(kostalMeterCurrentPhaseCStateTypeId, kostalConnection->powerMeterCurrentPhase3());
@ -459,19 +459,51 @@ void IntegrationPluginKostal::setupKostalConnection(ThingSetupInfo *info)
meterThing->setStateValue(kostalMeterVoltagePhaseBStateTypeId, kostalConnection->powerMeterVoltagePhase2());
meterThing->setStateValue(kostalMeterVoltagePhaseCStateTypeId, kostalConnection->powerMeterVoltagePhase3());
// Current
meterThing->setStateValue(kostalMeterCurrentPowerPhaseAStateTypeId, kostalConnection->powerMeterActivePowerPhase1());
meterThing->setStateValue(kostalMeterCurrentPowerPhaseBStateTypeId, kostalConnection->powerMeterActivePowerPhase2());
meterThing->setStateValue(kostalMeterCurrentPowerPhaseCStateTypeId, kostalConnection->powerMeterActivePowerPhase3());
meterThing->setStateValue(kostalMeterFrequencyStateTypeId, kostalConnection->gridFrequencyPowerMeter());
meterThing->setStateValue(kostalMeterTotalEnergyConsumedStateTypeId, kostalConnection->totalHomeConsumptionFromGrid() / 1000.0); // kWh
meterThing->setStateValue(kostalMeterTotalEnergyProducedStateTypeId, kostalConnection->totalEnergyAcToGrid() / 1000.0); // kWh
// Set the power as last value
// Note: there is a special case with the Kostal KSEM G2 meter, which communicates voltage and current, but no power data
// Therefore we have to calculate them on our own and set the states accordingly.
bool currentNotZero = kostalConnection->powerMeterCurrentPhase1() != 0 &&
kostalConnection->powerMeterCurrentPhase2() != 0 &&
kostalConnection->powerMeterCurrentPhase3() != 0;
bool voltageNotZero = kostalConnection->powerMeterVoltagePhase1() != 0 &&
kostalConnection->powerMeterVoltagePhase2() != 0 &&
kostalConnection->powerMeterVoltagePhase3() != 0;
bool powerZero = kostalConnection->powerMeterActivePowerPhase1() == 0 &&
kostalConnection->powerMeterActivePowerPhase2() == 0 &&
kostalConnection->powerMeterActivePowerPhase3() == 0 &&
kostalConnection->powerMeterTotalActivePower() == 0;
if (currentNotZero && voltageNotZero && powerZero) {
// P = U * I
float powerPhase1 = kostalConnection->powerMeterCurrentPhase1() * kostalConnection->powerMeterVoltagePhase1() * -1.0;
float powerPhase2 = kostalConnection->powerMeterCurrentPhase2() * kostalConnection->powerMeterVoltagePhase2() * -1.0;
float powerPhase3 = kostalConnection->powerMeterCurrentPhase3() * kostalConnection->powerMeterVoltagePhase3() * -1.0;
meterThing->setStateValue(kostalMeterCurrentPowerPhaseAStateTypeId, powerPhase1);
meterThing->setStateValue(kostalMeterCurrentPowerPhaseBStateTypeId, powerPhase2);
meterThing->setStateValue(kostalMeterCurrentPowerPhaseCStateTypeId, powerPhase3);
// Set the total power as last value
meterThing->setStateValue(kostalMeterCurrentPowerStateTypeId, powerPhase1 + powerPhase2 + powerPhase3);
} else {
// Power
meterThing->setStateValue(kostalMeterCurrentPowerPhaseAStateTypeId, kostalConnection->powerMeterActivePowerPhase1());
meterThing->setStateValue(kostalMeterCurrentPowerPhaseBStateTypeId, kostalConnection->powerMeterActivePowerPhase2());
meterThing->setStateValue(kostalMeterCurrentPowerPhaseCStateTypeId, kostalConnection->powerMeterActivePowerPhase3());
// Set the total power as last value
meterThing->setStateValue(kostalMeterCurrentPowerStateTypeId, kostalConnection->powerMeterTotalActivePower());
}
}
});
// Update registers

View File

@ -3,6 +3,8 @@
"protocol": "TCP",
"endianness": "LittleEndian",
"errorLimitUntilNotReachable": 20,
"queuedRequests": true,
"queuedRequestsDelay": 100,
"checkReachableRegister": "inverterState",
"enums": [
{
@ -740,40 +742,6 @@
}
],
"registers": [
{
"id": "bidirectionalConverterNumber",
"address": 30,
"size": 1,
"type": "uint16",
"readSchedule": "init",
"registerType": "holdingRegister",
"description": "Number of bidirectional converter",
"defaultValue": "0",
"access": "RO"
},
{
"id": "acPhasesNumber",
"address": 32,
"size": 1,
"type": "uint16",
"readSchedule": "init",
"registerType": "holdingRegister",
"description": "Number of bidirectional converter",
"defaultValue": "0",
"access": "RO"
},
{
"id": "numberPvStrings",
"address": 34,
"size": 1,
"type": "uint16",
"readSchedule": "init",
"registerType": "holdingRegister",
"description": "Number of PV strings",
"unit": "",
"defaultValue": "0",
"access": "RO"
},
{
"id": "inverterState",
"address": 56,