[plugwiseha] Add and enhance channels (#12349)

* Add two-channels, fix scene and docs

Signed-off-by: Leo Siepel <leosiepel@gmail.com>
This commit is contained in:
lsiepel
2022-02-23 23:52:07 +01:00
committed by GitHub
parent 2d54347b65
commit ea9d77ff71
12 changed files with 197 additions and 65 deletions

View File

@@ -85,10 +85,12 @@ public class PlugwiseHABindingConstants {
public static final String LOCATION_PROPERTY_FUNCTIONALITIES = "functionalities";
// List of all Channel IDs
public static final String ZONE_COOLING_CHANNEL = "coolingAllowed";
public static final String ZONE_SETPOINT_CHANNEL = "setpointTemperature";
public static final String ZONE_TEMPERATURE_CHANNEL = "temperature";
public static final String ZONE_PRESETSCENE_CHANNEL = "presetScene";
public static final String ZONE_PREHEAT_CHANNEL = "preHeat";
public static final String ZONE_REGULATION_CHANNEL = "regulationControl";
public static final String APPLIANCE_SETPOINT_CHANNEL = "setpointTemperature";
public static final String APPLIANCE_TEMPERATURE_CHANNEL = "temperature";

View File

@@ -322,17 +322,6 @@ public class PlugwiseHAController {
}
}
public void switchRelay(Appliance appliance, String state) throws PlugwiseHAException {
List<String> allowStates = Arrays.asList("on", "off");
if (allowStates.contains(state.toLowerCase())) {
if (state.toLowerCase().equals("on")) {
switchRelayOn(appliance);
} else {
switchRelayOff(appliance);
}
}
}
public void setPreHeating(Location location, Boolean state) throws PlugwiseHAException {
PlugwiseHAControllerRequest<Void> request = newRequest(Void.class);
Optional<ActuatorFunctionality> thermostat = location.getActuatorFunctionalities().getFunctionalityThermostat();
@@ -340,58 +329,73 @@ public class PlugwiseHAController {
request.setPath("/core/locations");
request.addPathParameter("id", String.format("%s/thermostat", location.getId()));
request.addPathParameter("id", String.format("%s", thermostat.get().getId()));
request.setBodyParameter(new ActuatorFunctionalityThermostat(state));
request.setBodyParameter(new ActuatorFunctionalityThermostat(state, null, null));
executeRequest(request);
}
public void switchRelayOn(Appliance appliance) throws PlugwiseHAException {
public void setAllowCooling(Location location, Boolean state) throws PlugwiseHAException {
PlugwiseHAControllerRequest<Void> request = newRequest(Void.class);
Optional<ActuatorFunctionality> thermostat = location.getActuatorFunctionalities().getFunctionalityThermostat();
request.setPath("/core/appliances");
request.addPathParameter("id", String.format("%s/relay", appliance.getId()));
request.setBodyParameter(new ActuatorFunctionalityRelay("on"));
request.setPath("/core/locations");
request.addPathParameter("id", String.format("%s/thermostat", location.getId()));
request.addPathParameter("id", String.format("%s", thermostat.get().getId()));
request.setBodyParameter(new ActuatorFunctionalityThermostat(null, state, null));
executeRequest(request);
}
public void switchRelayOff(Appliance appliance) throws PlugwiseHAException {
PlugwiseHAControllerRequest<Void> request = newRequest(Void.class);
request.setPath("/core/appliances");
request.addPathParameter("id", String.format("%s/relay", appliance.getId()));
request.setBodyParameter(new ActuatorFunctionalityRelay("off"));
executeRequest(request);
}
public void switchRelayLock(Appliance appliance, String state) throws PlugwiseHAException {
List<String> allowStates = Arrays.asList("on", "off");
if (allowStates.contains(state.toLowerCase())) {
if (state.toLowerCase().equals("on")) {
switchRelayLockOn(appliance);
} else {
switchRelayLockOff(appliance);
}
public void setRegulationControl(Location location, String state) throws PlugwiseHAException {
List<String> allowStates = Arrays.asList("active", "passive", "off");
if (!allowStates.contains(state.toLowerCase())) {
this.logger.warn("Trying to set the regulation control to an invalid state");
return;
}
}
public void switchRelayLockOff(Appliance appliance) throws PlugwiseHAException {
PlugwiseHAControllerRequest<Void> request = newRequest(Void.class);
Optional<ActuatorFunctionality> thermostat = location.getActuatorFunctionalities().getFunctionalityThermostat();
request.setPath("/core/appliances");
request.addPathParameter("id", String.format("%s/relay", appliance.getId()));
request.setBodyParameter(new ActuatorFunctionalityRelay(null, false));
request.setPath("/core/locations");
request.addPathParameter("id", String.format("%s/thermostat", location.getId()));
request.addPathParameter("id", String.format("%s", thermostat.get().getId()));
request.setBodyParameter(new ActuatorFunctionalityThermostat(null, null, state));
executeRequest(request);
}
public void switchRelayLockOn(Appliance appliance) throws PlugwiseHAException {
public void setRelay(Appliance appliance, Boolean state) throws PlugwiseHAException {
PlugwiseHAControllerRequest<Void> request = newRequest(Void.class);
request.setPath("/core/appliances");
request.addPathParameter("id", String.format("%s/relay", appliance.getId()));
request.setBodyParameter(new ActuatorFunctionalityRelay(null, true));
request.setBodyParameter(new ActuatorFunctionalityRelay(state ? "on" : "off"));
executeRequest(request);
}
public void setRelayLock(Appliance appliance, Boolean state) throws PlugwiseHAException {
PlugwiseHAControllerRequest<Void> request = newRequest(Void.class);
request.setPath("/core/appliances");
request.addPathParameter("id", String.format("%s/relay", appliance.getId()));
request.setBodyParameter(new ActuatorFunctionalityRelay(null, state));
executeRequest(request);
}
public void setPresetScene(Location location, String state) throws PlugwiseHAException {
List<String> allowStates = Arrays.asList("home", "asleep", "away", "vacation", "no_frost");
if (!allowStates.contains(state.toLowerCase())) {
this.logger.warn("Trying to set the preset scene to an invalid state");
return;
}
PlugwiseHAControllerRequest<Void> request = newRequest(Void.class);
request.setPath("/core/locations");
request.addPathParameter("id", String.format("%s", location.getId()));
request.setBodyParameter(new Location(state));
executeRequest(request);
}

View File

@@ -35,6 +35,15 @@ public class ActuatorFunctionalities extends PlugwiseHACollection<ActuatorFuncti
.map(Boolean::parseBoolean);
}
public Optional<String> getRegulationControl() {
return this.getFunctionalityThermostat().flatMap(ActuatorFunctionality::getRegulationControl);
}
public Optional<Boolean> getCoolingAllowed() {
return this.getFunctionalityThermostat().flatMap(ActuatorFunctionality::getCoolingAllowed)
.map(Boolean::parseBoolean);
}
public Optional<Boolean> getPreHeatState() {
return this.getFunctionalityThermostat().flatMap(ActuatorFunctionality::getPreHeatState)
.map(Boolean::parseBoolean);

View File

@@ -35,6 +35,12 @@ public class ActuatorFunctionality extends PlugwiseBaseModel implements Plugwise
private String resolution;
private String lock;
@XStreamAlias("regulation_control")
private String regulationControl;
@XStreamAlias("cooling_allowed")
private String coolingAllowed;
@XStreamAlias("preheating_allowed")
private String preHeat;
@@ -75,6 +81,14 @@ public class ActuatorFunctionality extends PlugwiseBaseModel implements Plugwise
return updatedDate;
}
public Optional<String> getRegulationControl() {
return Optional.ofNullable(regulationControl);
}
public Optional<String> getCoolingAllowed() {
return Optional.ofNullable(coolingAllowed);
}
public Optional<String> getPreHeatState() {
return Optional.ofNullable(preHeat);
}

View File

@@ -28,11 +28,22 @@ public class ActuatorFunctionalityThermostat extends ActuatorFunctionality {
@XStreamAlias("preheating_allowed")
private Boolean preheatingAllowed;
@SuppressWarnings("unused")
@XStreamAlias("cooling_allowed")
private Boolean coolingAllowed;
@SuppressWarnings("unused")
@XStreamAlias("regulation_control")
private String regulationControl;
public ActuatorFunctionalityThermostat(Double temperature) {
this.setpoint = temperature;
}
public ActuatorFunctionalityThermostat(Boolean preheatingAllowed) {
public ActuatorFunctionalityThermostat(Boolean preheatingAllowed, Boolean coolingAllowed,
String regulationControl) {
this.preheatingAllowed = preheatingAllowed;
this.coolingAllowed = coolingAllowed;
this.regulationControl = regulationControl;
}
}

View File

@@ -47,6 +47,10 @@ public class Location extends PlugwiseBaseModel implements PlugwiseComparableDat
@XStreamImplicit(itemFieldName = "actuator_functionality", keyFieldName = "type")
private ActuatorFunctionalities actuatorFunctionalities;
public Location(String presetScene) {
this.preset = presetScene;
}
public String getName() {
return name;
}
@@ -101,6 +105,14 @@ public class Location extends PlugwiseBaseModel implements PlugwiseComparableDat
return this.actuatorFunctionalities.getPreHeatState();
}
public Optional<Boolean> getCoolingAllowed() {
return this.actuatorFunctionalities.getCoolingAllowed();
}
public Optional<String> getRegulationControl() {
return this.actuatorFunctionalities.getRegulationControl();
}
public int applianceCount() {
if (this.locationAppliances == null) {
return 0;

View File

@@ -142,11 +142,7 @@ public class PlugwiseHAApplianceHandler extends PlugwiseHABaseHandler<Appliance,
case APPLIANCE_LOCK_CHANNEL:
if (command instanceof OnOffType) {
try {
if (command == OnOffType.ON) {
controller.switchRelayLockOn(entity);
} else {
controller.switchRelayLockOff(entity);
}
controller.setRelay(entity, (command == OnOffType.ON));
} catch (PlugwiseHAException e) {
logger.warn("Unable to switch relay lock {} for appliance '{}'", (State) command,
entity.getName());
@@ -173,11 +169,7 @@ public class PlugwiseHAApplianceHandler extends PlugwiseHABaseHandler<Appliance,
case APPLIANCE_POWER_CHANNEL:
if (command instanceof OnOffType) {
try {
if (command == OnOffType.ON) {
controller.switchRelayOn(entity);
} else {
controller.switchRelayOff(entity);
}
controller.setRelay(entity, command == OnOffType.ON);
} catch (PlugwiseHAException e) {
logger.warn("Unable to switch relay {} for appliance '{}'", (State) command, entity.getName());
}

View File

@@ -118,6 +118,16 @@ public class PlugwiseHAZoneHandler extends PlugwiseHABaseHandler<Location, Plugw
PlugwiseHAController controller = bridge.getController();
if (controller != null) {
switch (channelID) {
case ZONE_COOLING_CHANNEL:
if (command instanceof OnOffType) {
try {
controller.setAllowCooling(entity, command == OnOffType.ON);
} catch (PlugwiseHAException e) {
logger.warn("Unable to switch allow cooling {} for zone '{}'", (State) command,
entity.getName());
}
}
break;
case ZONE_SETPOINT_CHANNEL:
if (command instanceof QuantityType) {
Unit<Temperature> unit = entity.getSetpointTemperatureUnit().orElse(UNIT_CELSIUS)
@@ -143,6 +153,26 @@ public class PlugwiseHAZoneHandler extends PlugwiseHABaseHandler<Location, Plugw
}
}
break;
case ZONE_REGULATION_CHANNEL:
if (command instanceof StringType) {
try {
controller.setRegulationControl(entity, command.toString());
} catch (PlugwiseHAException e) {
logger.warn("Unable to switch regulation control {} for zone '{}'", (State) command,
entity.getName());
}
}
break;
case ZONE_PRESETSCENE_CHANNEL:
if (command instanceof StringType) {
try {
controller.setPresetScene(entity, command.toString());
} catch (PlugwiseHAException e) {
logger.warn("Unable to switch preset scene {} for zone '{}'", (State) command,
entity.getName());
}
}
break;
default:
logger.warn("Ignoring unsupported command = {} for channel = {}", command, channelUID);
}
@@ -153,8 +183,10 @@ public class PlugwiseHAZoneHandler extends PlugwiseHABaseHandler<Location, Plugw
private State getDefaultState(String channelID) {
State state = UnDefType.NULL;
switch (channelID) {
case ZONE_COOLING_CHANNEL:
case ZONE_PREHEAT_CHANNEL:
case ZONE_PRESETSCENE_CHANNEL:
case ZONE_REGULATION_CHANNEL:
case ZONE_SETPOINT_CHANNEL:
case ZONE_TEMPERATURE_CHANNEL:
state = UnDefType.NULL;
@@ -169,6 +201,12 @@ public class PlugwiseHAZoneHandler extends PlugwiseHABaseHandler<Location, Plugw
State state = getDefaultState(channelID);
switch (channelID) {
case ZONE_COOLING_CHANNEL:
Optional<Boolean> allowCoolingState = entity.getCoolingAllowed();
if (allowCoolingState.isPresent()) {
state = OnOffType.from(allowCoolingState.get());
}
break;
case ZONE_PREHEAT_CHANNEL:
Optional<Boolean> preHeatState = entity.getPreHeatState();
if (preHeatState.isPresent()) {
@@ -185,6 +223,9 @@ public class PlugwiseHAZoneHandler extends PlugwiseHABaseHandler<Location, Plugw
state = new QuantityType<Temperature>(entity.getSetpointTemperature().get(), unit);
}
break;
case ZONE_REGULATION_CHANNEL:
state = new StringType(entity.getRegulationControl().orElse(null));
break;
case ZONE_TEMPERATURE_CHANNEL:
if (entity.getTemperature().isPresent()) {
Unit<Temperature> unit = entity.getTemperatureUnit().orElse(UNIT_CELSIUS).equals(UNIT_CELSIUS)

View File

@@ -49,6 +49,8 @@ channel-type.plugwiseha.boilerTemperature.label = Boiler Temperature
channel-type.plugwiseha.boilerTemperature.description = Gets the temperature of this boiler
channel-type.plugwiseha.chState.label = Central Heating Active
channel-type.plugwiseha.chState.description = Is the boiler active for central heating, On or OFF
channel-type.plugwiseha.coolingAllowed.label = Cooling Allowed
channel-type.plugwiseha.coolingAllowed.description = Switch the cooling allowed of a zone ON or OFF
channel-type.plugwiseha.coolingState.label = Cooling State
channel-type.plugwiseha.coolingState.description = Is the boiler active for cooling, On or OFF
channel-type.plugwiseha.dhwComfortMode.label = Domestic Hot Water Comfort Mode
@@ -83,7 +85,17 @@ channel-type.plugwiseha.powerUsage.label = Power Usage
channel-type.plugwiseha.preHeat.label = Preheat
channel-type.plugwiseha.preHeat.description = Switch the preheating of a zone ON or OFF
channel-type.plugwiseha.presetScene.label = Preset Scene
channel-type.plugwiseha.presetScene.description = Gets the preset scene of the zone
channel-type.plugwiseha.presetScene.description = Gets or sets the preset scene of the zone
channel-type.plugwiseha.presetScene.state.option.home = Home
channel-type.plugwiseha.presetScene.state.option.asleep = A Sleep
channel-type.plugwiseha.presetScene.state.option.away = Away
channel-type.plugwiseha.presetScene.state.option.vacation = Vacation
channel-type.plugwiseha.presetScene.state.option.no_frost = No Frost
channel-type.plugwiseha.regulationControl.label = Regulation Control
channel-type.plugwiseha.regulationControl.description = Switch the regulation control of a zone to Active, Passive or Off
channel-type.plugwiseha.regulationControl.state.option.active = Active
channel-type.plugwiseha.regulationControl.state.option.passive = Passive
channel-type.plugwiseha.regulationControl.state.option.off = Off
channel-type.plugwiseha.setpointTemperature.label = Setpoint Temperature
channel-type.plugwiseha.setpointTemperature.description = Gets or sets the set point of this zone
channel-type.plugwiseha.temperature.label = Zone Temperature

View File

@@ -35,6 +35,27 @@
<category>switch</category>
</channel-type>
<channel-type id="coolingAllowed">
<item-type>Switch</item-type>
<label>Cooling Allowed</label>
<description>Switch the cooling allowed of a zone ON or OFF</description>
<category>switch</category>
</channel-type>
<channel-type id="regulationControl">
<item-type>String</item-type>
<label>Regulation Control</label>
<description>Switch the regulation control of a zone to Active, Passive or Off</description>
<category>switch</category>
<state>
<options>
<option value="active">Active</option>
<option value="passive">Passive</option>
<option value="off">Off</option>
</options>
</state>
</channel-type>
<channel-type id="power">
<item-type>Switch</item-type>
<label>Power</label>
@@ -178,9 +199,17 @@
<channel-type id="presetScene">
<item-type>String</item-type>
<label>Preset Scene</label>
<description>Gets the preset scene of the zone</description>
<description>Gets or sets the preset scene of the zone</description>
<category>heating</category>
<state readOnly="true"/>
<state>
<options>
<option value="home">Home</option>
<option value="asleep">A Sleep</option>
<option value="away">Away</option>
<option value="vacation">Vacation</option>
<option value="no_frost">No Frost</option>
</options>
</state>
</channel-type>
<channel-type id="valvePosition">

View File

@@ -58,6 +58,8 @@
<channel id="temperature" typeId="temperature"/>
<channel id="presetScene" typeId="presetScene"/>
<channel id="preHeat" typeId="preHeat"/>
<channel id="coolingAllowed" typeId="coolingAllowed"/>
<channel id="regulationControl" typeId="regulationControl"/>
</channels>
<representation-property>id</representation-property>