Skip to content

Commit

Permalink
[fronius] Added inverter power, battery state of charge and PV solar …
Browse files Browse the repository at this point in the history
…yield (openhab#10757)

* [fronius] add battery state of charge and PV yield.

Signed-off-by: THKDev <THKDev@users.noreply.github.com>

* [fronius] Actually constants should be all upper case. Words in labels should be capitalized (except prepositions and so on). Use %unit% placeholder.

Signed-off-by: THKDev <THKDev@users.noreply.github.com>

* [fronius] fixed checkstyle error; removed some warnings (eg. StringUtils)

Signed-off-by: THKDev <THKDev@users.noreply.github.com>

* Revert "[fronius] fixed checkstyle error; removed some warnings (eg. StringUtils)"

This reverts commit 73065c6

Signed-off-by: THKDev <THKDev@users.noreply.github.com>

* [fronius] fixed checkstyle error

Signed-off-by: THKDev <THKDev@users.noreply.github.com>

* [fronius] removed org.apache.commons.lang3.StringUtils

Signed-off-by: THKDev <THKDev@users.noreply.github.com>
  • Loading branch information
THKDev authored and frederictobiasc committed Oct 26, 2021
1 parent 7a6c765 commit 839afbb
Show file tree
Hide file tree
Showing 6 changed files with 253 additions and 135 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
*
* @author Thomas Rokohl - Initial contribution
* @author Peter Schraffl - Added device status and error status channels
* @author Thomas Kordelle - Added inverter power, battery state of charge and PV solar yield
*/
@NonNullByDefault
public class FroniusBindingConstants {
Expand All @@ -33,38 +34,53 @@ public class FroniusBindingConstants {
public static final ThingTypeUID THING_TYPE_METER = new ThingTypeUID(BINDING_ID, "meter");

// List of all Channel ids
public static final String InverterDataChannelDayEnergy = "inverterdatachanneldayenergy";
public static final String InverterDataChannelPac = "inverterdatachannelpac";
public static final String InverterDataChannelTotal = "inverterdatachanneltotal";
public static final String InverterDataChannelYear = "inverterdatachannelyear";
public static final String InverterDataChannelFac = "inverterdatachannelfac";
public static final String InverterDataChannelIac = "inverterdatachanneliac";
public static final String InverterDataChannelIdc = "inverterdatachannelidc";
public static final String InverterDataChannelUac = "inverterdatachanneluac";
public static final String InverterDataChannelUdc = "inverterdatachanneludc";
public static final String InverterDataChannelDeviceStatusErrorCode = "inverterdatadevicestatuserrorcode";
public static final String InverterDataChannelDeviceStatusStatusCode = "inverterdatadevicestatusstatuscode";
public static final String PowerFlowpGrid = "powerflowchannelpgrid";
public static final String PowerFlowpLoad = "powerflowchannelpload";
public static final String PowerFlowpAkku = "powerflowchannelpakku";
public static final String MeterModel = "model";
public static final String MeterSerial = "serial";
public static final String MeterEnable = "enable";
public static final String MeterLocation = "location";
public static final String MeterCurrentAcPhase1 = "currentacphase1";
public static final String MeterCurrentAcPhase2 = "currentacphase2";
public static final String MeterCurrentAcPhase3 = "currentacphase3";
public static final String MeterVoltageAcPhase1 = "voltageacphase1";
public static final String MeterVoltageAcPhase2 = "voltageacphase2";
public static final String MeterVoltageAcPhase3 = "voltageacphase3";
public static final String MeterPowerPhase1 = "powerrealphase1";
public static final String MeterPowerPhase2 = "powerrealphase2";
public static final String MeterPowerPhase3 = "powerrealphase3";
public static final String MeterPowerFactorPhase1 = "powerfactorphase1";
public static final String MeterPowerFactorPhase2 = "powerfactorphase2";
public static final String MeterPowerFactorPhase3 = "powerfactorphase3";
public static final String MeterEnergyRealSumConsumed = "energyrealsumconsumed";
public static final String MeterEnergyRealSumProduced = "energyrealsumproduced";
public static final String INVERTER_DATA_CHANNEL_DAY_ENERGY = "inverterdatachanneldayenergy";
public static final String INVERTER_DATA_CHANNEL_PAC = "inverterdatachannelpac";
public static final String INVERTER_DATA_CHANNEL_TOTAL = "inverterdatachanneltotal";
public static final String INVERTER_DATA_CHANNEL_YEAR = "inverterdatachannelyear";
public static final String INVERTER_DATA_CHANNEL_FAC = "inverterdatachannelfac";
public static final String INVERTER_DATA_CHANNEL_IAC = "inverterdatachanneliac";
public static final String INVERTER_DATA_CHANNEL_IDC = "inverterdatachannelidc";
public static final String INVERTER_DATA_CHANNEL_UAC = "inverterdatachanneluac";
public static final String INVERTER_DATA_CHANNEL_UDC = "inverterdatachanneludc";
public static final String INVERTER_DATA_CHANNEL_DEVICE_STATUS_ERROR_CODE = "inverterdatadevicestatuserrorcode";
public static final String INVERTER_DATA_CHANNEL_DEVICE_STATUS_STATUS_CODE = "inverterdatadevicestatusstatuscode";
public static final String POWER_FLOW_P_GRID = "powerflowchannelpgrid";
public static final String POWER_FLOW_P_LOAD = "powerflowchannelpload";
public static final String POWER_FLOW_P_AKKU = "powerflowchannelpakku";
public static final String POWER_FLOW_P_PV = "powerflowchannelppv";
public static final String METER_MODEL = "model";
public static final String METER_SERIAL = "serial";
public static final String METER_ENABLE = "enable";
public static final String METER_LOCATION = "location";
public static final String METER_CURRENT_AC_PHASE_1 = "currentacphase1";
public static final String METER_CURRENT_AC_PHASE_2 = "currentacphase2";
public static final String METER_CURRENT_AC_PHASE_3 = "currentacphase3";
public static final String METER_VOLTAGE_AC_PHASE_1 = "voltageacphase1";
public static final String METER_VOLTAGE_AC_PHASE_2 = "voltageacphase2";
public static final String METER_VOLTAGE_AC_PHASE_3 = "voltageacphase3";
public static final String METER_POWER_PHASE_1 = "powerrealphase1";
public static final String METER_POWER_PHASE_2 = "powerrealphase2";
public static final String METER_POWER_PHASE_3 = "powerrealphase3";
public static final String METER_POWER_FACTOR_PHASE_1 = "powerfactorphase1";
public static final String METER_POWER_FACTOR_PHASE_2 = "powerfactorphase2";
public static final String METER_POWER_FACTOR_PHASE_3 = "powerfactorphase3";
public static final String METER_ENERGY_REAL_SUM_CONSUMED = "energyrealsumconsumed";
public static final String METER_ENERGY_REAL_SUM_PRODUCED = "energyrealsumproduced";

/*
* part of POWERFLOW_REALTIME_DATA using Symo Gen24
* "Inverters" : {
* "1" : {
* "Battery_Mode" : "normal",
* "DT" : 1,
* "P" : 356,
* "SOC" : 95.199996948242188
* }
* },
*/
public static final String POWER_FLOW_INVERTER_1_POWER = "powerflowinverter1power";
public static final String POWER_FLOW_INVERTER_1_SOC = "powerflowinverter1soc";

// List of all Urls
public static final String INVERTER_REALTIME_DATA_URL = "http://%IP%/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=%DEVICEID%&DataCollection=CommonInverterData";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
* the "inverter" node of the JSON response
*
* @author Thomas Rokohl - Initial contribution
* @author Thomas Kordelle - Added inverter power, battery state of charge and PV solar yield
*/
public class PowerFlowRealtimeInverter {

Expand All @@ -32,6 +33,10 @@ public class PowerFlowRealtimeInverter {
private double eYear;
@SerializedName("E_Total")
private double eTotal;
@SerializedName("Battery_Mode")
private String batteryMode;
@SerializedName("SOC")
private double soc;

public double getDt() {
return dt;
Expand Down Expand Up @@ -72,4 +77,20 @@ public double geteTotal() {
public void seteTotal(double eTotal) {
this.eTotal = eTotal;
}

public String getBatteryMode() {
return batteryMode;
}

public void setBatteryMode(final String batteryMode) {
this.batteryMode = batteryMode;
}

public double getSoc() {
return soc;
}

public void setSoc(double soc) {
this.soc = soc;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
*
* @author Gerrit Beine - Initial contribution
* @author Thomas Rokohl - Refactoring to merge the concepts
* @author Thomas Kordelle - Added inverter power, battery state of charge and PV solar yield
*/
public abstract class FroniusBaseThingHandler extends BaseThingHandler {

Expand Down Expand Up @@ -198,7 +199,7 @@ protected <T extends BaseFroniusResponse> T collectDataFormUrl(Class<T> type, St
if (!resultOk) {
logger.debug("Error in fronius response: {}", errorMsg);
}
} catch (JsonSyntaxException e) {
} catch (JsonSyntaxException | NumberFormatException e) {
errorMsg = "Invalid JSON data received";
logger.debug("Error running fronius request: {}", e.getMessage());
} catch (IOException | IllegalStateException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@

import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.openhab.binding.fronius.internal.FroniusBaseDeviceConfiguration;
import org.openhab.binding.fronius.internal.FroniusBindingConstants;
import org.openhab.binding.fronius.internal.FroniusBridgeConfiguration;
Expand All @@ -23,18 +22,16 @@
import org.openhab.core.library.types.QuantityType;
import org.openhab.core.library.unit.Units;
import org.openhab.core.thing.Thing;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* The {@link FroniusMeterHandler} is responsible for updating the data, which are
* sent to one of the channels.
*
* @author Jimmy Tanagra - Initial contribution
* @author Thomas Kordelle - Actually constants should be all upper case.
*/
public class FroniusMeterHandler extends FroniusBaseThingHandler {

private final Logger logger = LoggerFactory.getLogger(FroniusMeterHandler.class);
private MeterRealtimeBodyDataDTO meterRealtimeBodyData;
private FroniusBaseDeviceConfiguration config;

Expand Down Expand Up @@ -72,42 +69,47 @@ protected Object getValue(String channelId) {
return null;
}

String[] fields = StringUtils.split(channelId, "#");
String fieldName = fields[0];
final String[] fields = channelId.split("#");
if (fields.length < 1) {
return null;
}
final String fieldName = fields[0];

switch (fieldName) {
case FroniusBindingConstants.MeterEnable:
case FroniusBindingConstants.METER_ENABLE:
return meterRealtimeBodyData.getEnable();
case FroniusBindingConstants.MeterLocation:
case FroniusBindingConstants.METER_LOCATION:
return meterRealtimeBodyData.getMeterLocationCurrent();
case FroniusBindingConstants.MeterCurrentAcPhase1:
return new QuantityType(meterRealtimeBodyData.getCurrentACPhase1(), Units.AMPERE);
case FroniusBindingConstants.MeterCurrentAcPhase2:
return new QuantityType(meterRealtimeBodyData.getCurrentACPhase2(), Units.AMPERE);
case FroniusBindingConstants.MeterCurrentAcPhase3:
return new QuantityType(meterRealtimeBodyData.getCurrentACPhase3(), Units.AMPERE);
case FroniusBindingConstants.MeterVoltageAcPhase1:
return new QuantityType(meterRealtimeBodyData.getVoltageACPhase1(), Units.VOLT);
case FroniusBindingConstants.MeterVoltageAcPhase2:
return new QuantityType(meterRealtimeBodyData.getVoltageACPhase2(), Units.VOLT);
case FroniusBindingConstants.MeterVoltageAcPhase3:
return new QuantityType(meterRealtimeBodyData.getVoltageACPhase3(), Units.VOLT);
case FroniusBindingConstants.MeterPowerPhase1:
return new QuantityType(meterRealtimeBodyData.getPowerRealPPhase1(), Units.WATT);
case FroniusBindingConstants.MeterPowerPhase2:
return new QuantityType(meterRealtimeBodyData.getPowerRealPPhase2(), Units.WATT);
case FroniusBindingConstants.MeterPowerPhase3:
return new QuantityType(meterRealtimeBodyData.getPowerRealPPhase3(), Units.WATT);
case FroniusBindingConstants.MeterPowerFactorPhase1:
case FroniusBindingConstants.METER_CURRENT_AC_PHASE_1:
return new QuantityType<>(meterRealtimeBodyData.getCurrentACPhase1(), Units.AMPERE);
case FroniusBindingConstants.METER_CURRENT_AC_PHASE_2:
return new QuantityType<>(meterRealtimeBodyData.getCurrentACPhase2(), Units.AMPERE);
case FroniusBindingConstants.METER_CURRENT_AC_PHASE_3:
return new QuantityType<>(meterRealtimeBodyData.getCurrentACPhase3(), Units.AMPERE);
case FroniusBindingConstants.METER_VOLTAGE_AC_PHASE_1:
return new QuantityType<>(meterRealtimeBodyData.getVoltageACPhase1(), Units.VOLT);
case FroniusBindingConstants.METER_VOLTAGE_AC_PHASE_2:
return new QuantityType<>(meterRealtimeBodyData.getVoltageACPhase2(), Units.VOLT);
case FroniusBindingConstants.METER_VOLTAGE_AC_PHASE_3:
return new QuantityType<>(meterRealtimeBodyData.getVoltageACPhase3(), Units.VOLT);
case FroniusBindingConstants.METER_POWER_PHASE_1:
return new QuantityType<>(meterRealtimeBodyData.getPowerRealPPhase1(), Units.WATT);
case FroniusBindingConstants.METER_POWER_PHASE_2:
return new QuantityType<>(meterRealtimeBodyData.getPowerRealPPhase2(), Units.WATT);
case FroniusBindingConstants.METER_POWER_PHASE_3:
return new QuantityType<>(meterRealtimeBodyData.getPowerRealPPhase3(), Units.WATT);
case FroniusBindingConstants.METER_POWER_FACTOR_PHASE_1:
return meterRealtimeBodyData.getPowerFactorPhase1();
case FroniusBindingConstants.MeterPowerFactorPhase2:
case FroniusBindingConstants.METER_POWER_FACTOR_PHASE_2:
return meterRealtimeBodyData.getPowerFactorPhase2();
case FroniusBindingConstants.MeterPowerFactorPhase3:
case FroniusBindingConstants.METER_POWER_FACTOR_PHASE_3:
return meterRealtimeBodyData.getPowerFactorPhase3();
case FroniusBindingConstants.MeterEnergyRealSumConsumed:
return new QuantityType(meterRealtimeBodyData.getEnergyRealWACSumConsumed(), Units.WATT_HOUR);
case FroniusBindingConstants.MeterEnergyRealSumProduced:
return new QuantityType(meterRealtimeBodyData.getEnergyRealWACSumProduced(), Units.WATT_HOUR);
case FroniusBindingConstants.METER_ENERGY_REAL_SUM_CONSUMED:
return new QuantityType<>(meterRealtimeBodyData.getEnergyRealWACSumConsumed(), Units.WATT_HOUR);
case FroniusBindingConstants.METER_ENERGY_REAL_SUM_PRODUCED:
return new QuantityType<>(meterRealtimeBodyData.getEnergyRealWACSumProduced(), Units.WATT_HOUR);
default:
break;
}

return null;
Expand All @@ -120,8 +122,8 @@ private void updateProperties() {

Map<String, String> properties = editProperties();

properties.put(FroniusBindingConstants.MeterModel, meterRealtimeBodyData.getDetails().getModel());
properties.put(FroniusBindingConstants.MeterSerial, meterRealtimeBodyData.getDetails().getSerial());
properties.put(FroniusBindingConstants.METER_MODEL, meterRealtimeBodyData.getDetails().getModel());
properties.put(FroniusBindingConstants.METER_SERIAL, meterRealtimeBodyData.getDetails().getSerial());

updateProperties(properties);
}
Expand All @@ -147,7 +149,8 @@ private void updateData(FroniusBridgeConfiguration bridgeConfiguration, FroniusB
* @return {MeterRealtimeResponse} the object representation of the json response
*/
private MeterRealtimeResponseDTO getMeterRealtimeData(String ip, int deviceId) {
String location = FroniusBindingConstants.METER_REALTIME_DATA_URL.replace("%IP%", StringUtils.trimToEmpty(ip));
String location = FroniusBindingConstants.METER_REALTIME_DATA_URL.replace("%IP%",
(ip != null ? ip.trim() : ""));
location = location.replace("%DEVICEID%", Integer.toString(deviceId));
return collectDataFormUrl(MeterRealtimeResponseDTO.class, location);
}
Expand Down
Loading

0 comments on commit 839afbb

Please sign in to comment.