Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
215 changes: 113 additions & 102 deletions bundles/org.openhab.binding.fronius/README.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
*/
package org.openhab.binding.fronius.internal;

import java.util.Map;
import java.util.Set;

import org.eclipse.jdt.annotation.NonNullByDefault;
Expand Down Expand Up @@ -40,38 +41,38 @@ public class FroniusBindingConstants {
public static final ThingTypeUID THING_TYPE_BATTERY = new ThingTypeUID(BINDING_ID, "battery");

// Inverter channels
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_IDC2 = "inverterdatachannelidc2";
public static final String INVERTER_DATA_CHANNEL_IDC3 = "inverterdatachannelidc3";
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_UDC2 = "inverterdatachanneludc2";
public static final String INVERTER_DATA_CHANNEL_UDC3 = "inverterdatachanneludc3";
public static final String INVERTER_DATA_CHANNEL_PDC = "inverterdatachannelpdc";
public static final String INVERTER_DATA_CHANNEL_PDC2 = "inverterdatachannelpdc2";
public static final String INVERTER_DATA_CHANNEL_PDC3 = "inverterdatachannelpdc3";
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 INVERTER_DATA_CHANNEL_DAY_ENERGY = "day-energy";
public static final String INVERTER_DATA_CHANNEL_PAC = "ac-power";
public static final String INVERTER_DATA_CHANNEL_TOTAL = "total-energy";
public static final String INVERTER_DATA_CHANNEL_YEAR = "year-energy";
public static final String INVERTER_DATA_CHANNEL_FAC = "ac-frequency";
public static final String INVERTER_DATA_CHANNEL_IAC = "ac-current";
public static final String INVERTER_DATA_CHANNEL_IDC = "dc-current";
public static final String INVERTER_DATA_CHANNEL_IDC2 = "dc-current-2";
public static final String INVERTER_DATA_CHANNEL_IDC3 = "dc-current-3";
public static final String INVERTER_DATA_CHANNEL_UAC = "ac-voltage";
public static final String INVERTER_DATA_CHANNEL_UDC = "dc-voltage";
public static final String INVERTER_DATA_CHANNEL_UDC2 = "dc-voltage-2";
public static final String INVERTER_DATA_CHANNEL_UDC3 = "dc-voltage-3";
public static final String INVERTER_DATA_CHANNEL_PDC = "dc-power";
public static final String INVERTER_DATA_CHANNEL_PDC2 = "dc-power-2";
public static final String INVERTER_DATA_CHANNEL_PDC3 = "dc-power-3";
public static final String INVERTER_DATA_CHANNEL_DEVICE_STATUS_ERROR_CODE = "error-code";
public static final String INVERTER_DATA_CHANNEL_DEVICE_STATUS_STATUS_CODE = "status-code";

// Power Flow channels
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 POWER_FLOW_AUTONOMY = "powerflowautonomy";
public static final String POWER_FLOW_SELF_CONSUMPTION = "powerflowselfconsumption";
public static final String POWER_FLOW_P_GRID = "grid-power";
public static final String POWER_FLOW_P_LOAD = "load-power";
public static final String POWER_FLOW_P_AKKU = "battery-power";
public static final String POWER_FLOW_P_PV = "solar-power";
public static final String POWER_FLOW_AUTONOMY = "autonomy";
public static final String POWER_FLOW_SELF_CONSUMPTION = "self-consumption";

public static final String POWER_FLOW_INVERTER_POWER = "powerflowinverterpower";
public static final String POWER_FLOW_INVERTER_SOC = "powerflowinvertersoc";
public static final String POWER_FLOW_INVERTER_POWER = "inverter-power";
public static final String POWER_FLOW_INVERTER_SOC = "battery-soc";

public static final String POWER_FLOW_BACKUP_MODE = "powerflowbackupmode";
public static final String POWER_FLOW_BATTERY_STANDBY = "powerflowbatterystandby";
public static final String POWER_FLOW_BACKUP_MODE = "backup-mode";
public static final String POWER_FLOW_BATTERY_STANDBY = "battery-standby";

// For backwards compatibility
public static final String POWER_FLOW_INVERTER_1_POWER = "powerflowinverter1power";
Expand All @@ -80,52 +81,105 @@ public class FroniusBindingConstants {
// Meter channels
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_SUM = "powerrealsum";
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";
public static final String METER_CURRENT_AC_PHASE_1 = "ac-current-phase-1";
public static final String METER_CURRENT_AC_PHASE_2 = "ac-current-phase-2";
public static final String METER_CURRENT_AC_PHASE_3 = "ac-current-phase-3";
public static final String METER_VOLTAGE_AC_PHASE_1 = "ac-voltage-phase-1";
public static final String METER_VOLTAGE_AC_PHASE_2 = "ac-voltage-phase-2";
public static final String METER_VOLTAGE_AC_PHASE_3 = "ac-voltage-phase-3";
public static final String METER_POWER_PHASE_1 = "real-power-phase-1";
public static final String METER_POWER_PHASE_2 = "real-power-phase-2";
public static final String METER_POWER_PHASE_3 = "real-power-phase-3";
public static final String METER_POWER_SUM = "real-power-sum";
public static final String METER_POWER_FACTOR_PHASE_1 = "power-factor-phase-1";
public static final String METER_POWER_FACTOR_PHASE_2 = "power-factor-phase-2";
public static final String METER_POWER_FACTOR_PHASE_3 = "power-factor-phase-3";
public static final String METER_ENERGY_REAL_SUM_CONSUMED = "real-energy-consumed";
public static final String METER_ENERGY_REAL_SUM_PRODUCED = "real-energy-produced";

// OhmPilot channels
public static final String OHMPILOT_POWER_REAL_SUM = "powerrealsum";
public static final String OHMPILOT_ENERGY_REAL_SUM_CONSUMED = "energyrealsumconsumed";
public static final String OHMPILOT_ENERGY_SENSOR_TEMPERATURE_CHANNEL_1 = "temperaturechannel1";
public static final String OHMPILOT_ERROR_CODE = "errorcode";
public static final String OHMPILOT_STATE_CODE = "statecode";
public static final String OHMPILOT_POWER_REAL_SUM = "real-power-sum";
public static final String OHMPILOT_ENERGY_REAL_SUM_CONSUMED = "real-energy-consumed";
public static final String OHMPILOT_ENERGY_SENSOR_TEMPERATURE_CHANNEL_1 = "temperature-1";
public static final String OHMPILOT_ERROR_CODE = "error-code";
public static final String OHMPILOT_STATE_CODE = "status-code";

// Battery channels
public static final String BATTERY_CAPACITY_MAXIMUM = "maximumCapacity";
public static final String BATTERY_DESIGNED_CAPACITY = "designedCapacity";
public static final String BATTERY_CURRENT_DC = "currentDc";
public static final String BATTERY_VOLTAGE_DC = "voltageDc";
public static final String BATTERY_CAPACITY_MAXIMUM = "maximum-capacity";
public static final String BATTERY_DESIGNED_CAPACITY = "designed-capacity";
public static final String BATTERY_CURRENT_DC = "dc-current";
public static final String BATTERY_VOLTAGE_DC = "dc-voltage";
public static final String BATTERY_STATE_OF_CHARGE = "soc";
public static final String BATTERY_STATUS_BATTERY_CELL = "status";
public static final String BATTERY_ENABLE = "enable";
public static final String BATTERY_TEMPERATURE_CELL = "temperature";
public static final String BATTERY_TIMESTAMP = "timestamp";

// Battery settings channels, provided through the inverter's config API
public static final String BATTERY_SOC_MIN_CHANNEL = "socMin";
public static final String BATTERY_SOC_MAX_CHANNEL = "socMax";
public static final String BATTERY_BACKUP_RESERVED_CHANNEL = "backupReservedCapacity";
public static final String BATTERY_BACKUP_CRITICAL_SOC_CHANNEL = "backupCriticalSoc";
public static final String BATTERY_CHARGE_FROM_GRID_CHANNEL = "chargeFromGrid";
public static final String BATTERY_SOC_MIN_CHANNEL = "soc-min";
public static final String BATTERY_SOC_MAX_CHANNEL = "soc-max";
public static final String BATTERY_BACKUP_RESERVED_CHANNEL = "backup-reserved-capacity";
public static final String BATTERY_BACKUP_CRITICAL_SOC_CHANNEL = "backup-critical-soc";
public static final String BATTERY_CHARGE_FROM_GRID_CHANNEL = "charge-from-grid";
public static final String BATTERY_CALIBRATION_CHANNEL = "calibration";
public static final String BATTERY_NIGHT_PRESERVATION_LIMIT_CHANNEL = "nightPreservationLimit";
public static final String BATTERY_NIGHT_PRESERVATION_LIMIT_CHANNEL = "night-preservation-limit";
public static final String BATTERY_MIN_CHARGE_POWER_CHANNEL = "min-charge-power";
public static final String BATTERY_MAX_CHARGE_POWER_CHANNEL = "max-charge-power";
public static final String BATTERY_MIN_DISCHARGE_POWER_CHANNEL = "min-discharge-power";
public static final String BATTERY_MAX_DISCHARGE_POWER_CHANNEL = "max-discharge-power";
public static final Set<String> BATTERY_TIME_OF_USE_CHANNELS = Set.of(BATTERY_MIN_CHARGE_POWER_CHANNEL,
BATTERY_MAX_CHARGE_POWER_CHANNEL, BATTERY_MIN_DISCHARGE_POWER_CHANNEL, BATTERY_MAX_DISCHARGE_POWER_CHANNEL);
public static final Set<String> BATTERY_SETTINGS_CHANNELS = Set.of(BATTERY_SOC_MIN_CHANNEL, BATTERY_SOC_MAX_CHANNEL,
BATTERY_BACKUP_RESERVED_CHANNEL, BATTERY_BACKUP_CRITICAL_SOC_CHANNEL, BATTERY_CHARGE_FROM_GRID_CHANNEL,
BATTERY_CALIBRATION_CHANNEL, BATTERY_NIGHT_PRESERVATION_LIMIT_CHANNEL);

/**
* Maps the ids of deprecated channels to the ids of the channels replacing them.
* The deprecated channels stay functional, so that existing setups keep working.
*/
public static final Map<String, String> DEPRECATED_CHANNEL_IDS = Map.ofEntries(
Map.entry("inverterdatachannelpac", INVERTER_DATA_CHANNEL_PAC),
Map.entry("inverterdatachannelpdc", INVERTER_DATA_CHANNEL_PDC),
Map.entry("inverterdatachannelpdc2", INVERTER_DATA_CHANNEL_PDC2),
Map.entry("inverterdatachannelpdc3", INVERTER_DATA_CHANNEL_PDC3),
Map.entry("inverterdatachanneldayenergy", INVERTER_DATA_CHANNEL_DAY_ENERGY),
Map.entry("inverterdatachanneltotal", INVERTER_DATA_CHANNEL_TOTAL),
Map.entry("inverterdatachannelyear", INVERTER_DATA_CHANNEL_YEAR),
Map.entry("inverterdatachannelfac", INVERTER_DATA_CHANNEL_FAC),
Map.entry("inverterdatachanneliac", INVERTER_DATA_CHANNEL_IAC),
Map.entry("inverterdatachannelidc", INVERTER_DATA_CHANNEL_IDC),
Map.entry("inverterdatachannelidc2", INVERTER_DATA_CHANNEL_IDC2),
Map.entry("inverterdatachannelidc3", INVERTER_DATA_CHANNEL_IDC3),
Map.entry("inverterdatachanneluac", INVERTER_DATA_CHANNEL_UAC),
Map.entry("inverterdatachanneludc", INVERTER_DATA_CHANNEL_UDC),
Map.entry("inverterdatachanneludc2", INVERTER_DATA_CHANNEL_UDC2),
Map.entry("inverterdatachanneludc3", INVERTER_DATA_CHANNEL_UDC3),
Map.entry("inverterdatadevicestatuserrorcode", INVERTER_DATA_CHANNEL_DEVICE_STATUS_ERROR_CODE),
Map.entry("inverterdatadevicestatusstatuscode", INVERTER_DATA_CHANNEL_DEVICE_STATUS_STATUS_CODE),
Map.entry("powerflowchannelpgrid", POWER_FLOW_P_GRID),
Map.entry("powerflowchannelpload", POWER_FLOW_P_LOAD),
Map.entry("powerflowchannelpakku", POWER_FLOW_P_AKKU), Map.entry("powerflowchannelppv", POWER_FLOW_P_PV),
Map.entry("powerflowautonomy", POWER_FLOW_AUTONOMY),
Map.entry("powerflowselfconsumption", POWER_FLOW_SELF_CONSUMPTION),
Map.entry("powerflowinverterpower", POWER_FLOW_INVERTER_POWER),
Map.entry("powerflowinvertersoc", POWER_FLOW_INVERTER_SOC),
Map.entry("maximumCapacity", BATTERY_CAPACITY_MAXIMUM),
Map.entry("designedCapacity", BATTERY_DESIGNED_CAPACITY), Map.entry("currentDc", BATTERY_CURRENT_DC),
Map.entry("voltageDc", BATTERY_VOLTAGE_DC), Map.entry("currentacphase1", METER_CURRENT_AC_PHASE_1),
Map.entry("currentacphase2", METER_CURRENT_AC_PHASE_2),
Map.entry("currentacphase3", METER_CURRENT_AC_PHASE_3),
Map.entry("voltageacphase1", METER_VOLTAGE_AC_PHASE_1),
Map.entry("voltageacphase2", METER_VOLTAGE_AC_PHASE_2),
Map.entry("voltageacphase3", METER_VOLTAGE_AC_PHASE_3), Map.entry("powerrealphase1", METER_POWER_PHASE_1),
Map.entry("powerrealphase2", METER_POWER_PHASE_2), Map.entry("powerrealphase3", METER_POWER_PHASE_3),
Map.entry("powerrealsum", METER_POWER_SUM), Map.entry("powerfactorphase1", METER_POWER_FACTOR_PHASE_1),
Map.entry("powerfactorphase2", METER_POWER_FACTOR_PHASE_2),
Map.entry("powerfactorphase3", METER_POWER_FACTOR_PHASE_3),
Map.entry("energyrealsumconsumed", METER_ENERGY_REAL_SUM_CONSUMED),
Map.entry("energyrealsumproduced", METER_ENERGY_REAL_SUM_PRODUCED),
Map.entry("temperaturechannel1", OHMPILOT_ENERGY_SENSOR_TEMPERATURE_CHANNEL_1),
Map.entry("statecode", OHMPILOT_STATE_CODE), Map.entry("errorcode", OHMPILOT_ERROR_CODE));

// List of all Urls
public static final String INVERTER_REALTIME_DATA_URL = "%SCHEME%://%IP%/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=%DEVICEID%&DataCollection=CommonInverterData";
public static final String INVERTER_INFO_URL = "%SCHEME%://%IP%/solar_api/v1/GetInverterInfo.cgi";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.openhab.binding.fronius.internal.api.FroniusCommunicationException;
import org.openhab.binding.fronius.internal.api.FroniusUnauthorizedException;
import org.openhab.binding.fronius.internal.api.dto.inverter.batterycontrol.ScheduleType;
import org.openhab.binding.fronius.internal.api.dto.inverter.batterycontrol.TimeOfUseRecord;
import org.openhab.binding.fronius.internal.handler.FroniusBatteryHandler;
import org.openhab.core.automation.annotation.ActionInput;
import org.openhab.core.automation.annotation.ActionOutput;
Expand Down Expand Up @@ -261,6 +262,25 @@ public static boolean setBackupReservedBatteryCapacity(ThingActions actions, Per
return toFroniusBatteryActions(actions).setBackupReservedBatteryCapacity(percent);
}

public static TimeOfUseRecord[] getTimeOfUseSchedules(ThingActions actions) {
return toFroniusBatteryActions(actions).getTimeOfUseSchedules();
}

@RuleAction(label = "@text/actions.get-time-of-use-schedules.label", description = "@text/actions.get-time-of-use-schedules.description")
public @ActionOutput(type = "org.openhab.binding.fronius.internal.api.dto.inverter.batterycontrol.TimeOfUseRecord[]", label = "Schedules") TimeOfUseRecord[] getTimeOfUseSchedules() {
FroniusBatteryControl batteryControl = getBatteryControl();
if (batteryControl != null) {
try {
return batteryControl.getTimeOfUse().records();
} catch (FroniusCommunicationException e) {
logger.warn("Failed to read time of use schedules", e);
} catch (FroniusUnauthorizedException e) {
logger.warn("Failed to read time of use schedules: Invalid username or password");
}
}
return new TimeOfUseRecord[0];
}

@Override
public void setThingHandler(@Nullable ThingHandler handler) {
if (handler instanceof FroniusBatteryHandler h) {
Expand Down
Loading
Loading