### Backyard Channels
-| backyardAirTemp | Number:Temperature | Backyard air temp sensor reading | R |
-|-----------------|--------------------|----------------------------------|:-:|
-| backyardStatus | String | Backyard status | R |
-| backyardState | String | Backyard state | R |
-| backyardAlarm1 | String | Backyard alarm #1 | R |
-| backyardAlarm2 | String | Backyard alarm #2 | R |
-| backyardAlarm3 | String | Backyard alarm #3 | R |
-| backyardAlarm4 | String | Backyard alarm #4 | R |
-| backyardAlarm5 | String | Backyard alarm #5 | R |
+| Channel Type ID | Item Type | Description | Read Write |
+|-----------------|--------------------|----------------------------------|:----------:|
+| backyardAirTemp | Number:Temperature | Backyard air temp sensor reading | R |
+| backyardStatus | String | Backyard status | R |
+| backyardState | String | Backyard state | R |
+| backyardAlarm1 | String | Backyard alarm #1 | R |
+| backyardAlarm2 | String | Backyard alarm #2 | R |
+| backyardAlarm3 | String | Backyard alarm #3 | R |
+| backyardAlarm4 | String | Backyard alarm #4 | R |
+| backyardAlarm5 | String | Backyard alarm #5 | R |
### Body of Water Channels
|---------------------|----------------------|------------------------|:----------:|
| filterEnable | Switch | Filter enable | R/W |
| filterValvePosition | String | Filter valve position | R |
-| filterSpeed | Number:Dimensionless | Filter speed in % | R/W |
+| filterSpeedPercent | Number:Dimensionless | Filter speed in % | R/W |
+| filterSpeedRpm | Number | Filter speed in RPM | R/W |
+| filterSpeedSelect | String | Filter speed presets | R/W |
| filterState | String | Filter state | R |
| filterLastSpeed | Number:Dimensionless | Filter last speed in % | R |
| Channel Type ID | Item Type | Description | Read Write |
|-----------------|-----------|---------------|:----------:|
-| heaterState | Number | Heater state | R |
+| heaterState | String | Heater state | R |
| heaterEnable | Switch | Heater enable | R |
### Pump Channels
-| Channel Type ID | Item Type | Description | Read Write |
-|-----------------|----------------------|-----------------|:----------:|
-| pumpEnable | Switch | Pump enable | R |
-| pumpSpeed | Number:Dimensionless | Pump speed in % | R |
+| Channel Type ID | Item Type | Description | Read Write |
+|------------------|----------------------|----------------------|:----------:|
+| pumpEnable | Switch | Pump enable | R/W |
+| pumpSpeedPercent | Number:Dimensionless | Pump speed in % | R/W |
+| pumpSpeedRpm | Number | Pump speed in RPM | R/W |
+| pumpSpeedSelect | String | Pump speed presets | R/W |
+| pumpState | String | Pump state | R |
+| pumpLastSpeed | Number:Dimensionless | Pump last speed in % | R |
### Relay Channels
| Channel Type ID | Item Type | Description | Read Write |
|-----------------------|--------------------|-------------------------|:----------:|
-| heaterEnable | Number | Heater enable | R |
+| heaterEnable | Switch | Heater enable | R |
| heaterCurrentSetpoint | Number:Temperature | Heater Current Setpoint | R/W |
## Full Example
After installing the binding, you will need to manually add the Hayward Connection thing and enter your credentials.
-All pool items can be autmatically discovered by scanning the bridge
+All pool items can be automatically discovered by scanning the bridge.
Goto the inbox and add the things.
-
-### demo.items:
-
-```text
-Group gPool "Pool" ["Location"]
-
-Group gHaywardChlorinator "Hayward Chlorinator" (gPool) ["Equipment"]
-Switch HaywardChlorinator_Power "Power" (gHaywardChlorinator) ["Point"] { channel="haywardomnilogic:chlorinator:3766402f00:34:chlorEnable" }
-String HaywardChlorinator_OperatingMode "Operating Mode" (gHaywardChlorinator) ["Point"] { channel="haywardomnilogic:chlorinator:3766402f00:34:chlorOperatingMode" }
-Number:Dimensionless HaywardChlorinator_SaltOutput "Salt Output (%)" (gHaywardChlorinator) ["Point"] { channel="haywardomnilogic:chlorinator:3766402f00:34:chlorTimedPercent" }
-String HaywardChlorinator_scMode "scMode" (gHaywardChlorinator) ["Point"] { channel="haywardomnilogic:chlorinator:3766402f00:34:chlorScMode" }
-Number HaywardChlorinator_ChlorinatorError "Chlorinator Error" (gHaywardChlorinator) ["Point"] { channel="haywardomnilogic:chlorinator:3766402f00:34:chlorError" }
-String HaywardChlorinator_ChlorinatorAlert "Chlorinator Alert" (gHaywardChlorinator) ["Point"] { channel="haywardomnilogic:chlorinator:3766402f00:34:chlorAlert" }
-Number:Dimensionless HaywardChlorinator_AverageSaltLevel "Average Salt Level" (gHaywardChlorinator) ["Point"] { channel="haywardomnilogic:chlorinator:3766402f00:34:chlorAvgSaltLevel" }
-Number:Dimensionless HaywardChlorinator_InstantSaltLevel "Instant Salt Level" (gHaywardChlorinator) ["Point"] { channel="haywardomnilogic:chlorinator:3766402f00:34:chlorInstantSaltLevel" }
-Number HaywardChlorinator_Status "Status" (gHaywardChlorinator) ["Point"] { channel="haywardomnilogic:chlorinator:3766402f00:34:chlorStatus" }
-
-
-Group gHaywardBackyard "Hayward Backyard" (gPool) ["Equipment"]
-Number:Temperature HaywardBackyard_AirTemp "Air Temp" (gHaywardBackyard) ["Point"] { channel="haywardomnilogic:backyard:3766402f00:35940:backyardAirTemp" }
-String HaywardBackyard_Status "Status" (gHaywardBackyard) ["Point"] { channel="haywardomnilogic:backyard:3766402f00:35940:backyardStatus" }
-String HaywardBackyard_State "State" (gHaywardBackyard) ["Point"] { channel="haywardomnilogic:backyard:3766402f00:35940:backyardState" }
-String HaywardBackyard_BackyardAlarm1 "Alarm" (gHaywardBackyard) ["Point"] { channel="haywardomnilogic:backyard:3766402f00:35940:backyardAlarm1" }
-String HaywardBackyard_BackyardAlarm2 "Alarm" (gHaywardBackyard) ["Point"] { channel="haywardomnilogic:backyard:3766402f00:35940:backyardAlarm2" }
-String HaywardBackyard_BackyardAlarm3 "Alarm" (gHaywardBackyard) ["Point"] { channel="haywardomnilogic:backyard:3766402f00:35940:backyardAlarm3" }
-String HaywardBackyard_BackyardAlarm4 "Alarm" (gHaywardBackyard) ["Point"] { channel="haywardomnilogic:backyard:3766402f00:35940:backyardAlarm4" }
-String HaywardBackyard_BackyardAlarm5 "Alarm" (gHaywardBackyard) ["Point"] { channel="haywardomnilogic:backyard:3766402f00:35940:backyardAlarm5" }
-
-Group gHaywardGas "Hayward Gas" (gPool) ["Equipment"]
-Number HaywardGas_HeaterState "Heater State" (gHaywardGas) ["Point"] { channel="haywardomnilogic:heater:3766402f00:33:heaterState" }
-Switch HaywardGas_HeaterEnable "Heater Enable" (gHaywardGas) ["Point"] { channel="haywardomnilogic:heater:3766402f00:33:heaterEnable" }
-
-Group gHaywardJets "Hayward Jets" (gPool) ["Equipment"]
-Switch HaywardJets_Power "Power" (gHaywardJets) ["Point"] { channel="haywardomnilogic:relay:3766402f00:37:relayState" }
-
-Group gHaywardPool "Hayward Pool" (gPool) ["Equipment"]
-Switch HaywardPool_FlowSensor "Flow Sensor" (gHaywardPool) ["Point"] { channel="haywardomnilogic:bow:3766402f00:30:bowFlow" }
-Number:Temperature HaywardPool_WaterTemp "Water Temp" (gHaywardPool) ["Point"] { channel="haywardomnilogic:bow:3766402f00:30:bowWaterTemp" }
-
-Group gHaywardPoolLight "Hayward Pool Light" (gPool) ["Equipment"]
-Switch HaywardPoolLight_Power "Power" (gHaywardPoolLight) ["Point"] { channel="haywardomnilogic:colorlogic:3766402f00:38:colorLogicLightEnable" }
-String HaywardPoolLight_LightState "Light State" (gHaywardPoolLight) ["Point"] { channel="haywardomnilogic:colorlogic:3766402f00:38:colorLogicLightState" }
-String HaywardPoolLight_CurrentShow "Current Show" (gHaywardPoolLight) ["Point"] { channel="haywardomnilogic:colorlogic:3766402f00:38:colorLogicLightCurrentShow" }
-
-```
-
public static final String CHANNEL_BOW_WATERTEMP = "bowWaterTemp";
public static final String CHANNEL_BOW_FLOW = "bowFlow";
+ public static final String PROPERTY_BOW_TYPE = "type";
+ public static final String PROPERTY_BOW_SHAREDTYPE = "sharedType";
+ public static final String PROPERTY_BOW_SHAREDPRIORITY = "sharedPriority";
+ public static final String PROPERTY_BOW_SHAREDEQUIPID = "sharedEquipmentSystemID";
+ public static final String PROPERTY_BOW_SUPPORTSSPILLOVER = "supportsSpillover";
+ public static final String PROPERTY_BOW_SIZEINGALLONS = "sizeInGallons";
+
// List of all Channel ids (chlorinator)
public static final String CHANNEL_CHLORINATOR_ENABLE = "chlorEnable";
public static final String CHANNEL_CHLORINATOR_OPERATINGMODE = "chlorOperatingMode";
public static final String CHANNEL_CHLORINATOR_INSTANTSALTLEVEL = "chlorInstantSaltLevel";
public static final String CHANNEL_CHLORINATOR_STATUS = "chlorStatus";
+ public static final String PROPERTY_CHLORINATOR_SHAREDTYPE = "chlorSharedType";
+ public static final String PROPERTY_CHLORINATOR_MODE = "chlorMode";
+ public static final String PROPERTY_CHLORINATOR_CELLTYPE = "cellType";
+ public static final String PROPERTY_CHLORINATOR_DISPENSERTYPE = "dispenserType";
+
// List of all Channel ids (colorlogic)
public static final String CHANNEL_COLORLOGIC_ENABLE = "colorLogicLightEnable";
public static final String CHANNEL_COLORLOGIC_LIGHTSTATE = "colorLogicLightState";
public static final String CHANNEL_COLORLOGIC_CURRENTSHOW = "colorLogicLightCurrentShow";
+ public static final String PROPERTY_COLORLOGIC_TYPE = "colorlogicType";
+
// List of all Channel ids (filter)
public static final String CHANNEL_FILTER_ENABLE = "filterEnable";
public static final String CHANNEL_FILTER_VALVEPOSITION = "filterValvePosition";
- public static final String CHANNEL_FILTER_SPEED = "filterSpeed";
+ public static final String CHANNEL_FILTER_SPEEDPERCENT = "filterSpeedPercent";
+ public static final String CHANNEL_FILTER_SPEEDRPM = "filterSpeedRpm";
+ public static final String CHANNEL_FILTER_SPEEDSELECT = "filterSpeedSelect";
public static final String CHANNEL_FILTER_STATE = "filterState";
public static final String CHANNEL_FILTER_LASTSPEED = "filterLastSpeed";
- public static final String PROPERTY_FILTER_MINPUMPSPEED = "Min Pump Percent";
- public static final String PROPERTY_FILTER_MAXPUMPSPEED = "Max Pump Percent";
- public static final String PROPERTY_FILTER_MINPUMPRPM = "Min Pump RPM";
- public static final String PROPERTY_FILTER_MAXPUMPRPM = "Max Pump RPM";
+ public static final String PROPERTY_FILTER_SHAREDTYPE = "filterSharedType";
+ public static final String PROPERTY_FILTER_FILTERTYPE = "filterType";
+ public static final String PROPERTY_FILTER_PRIMINGENABLED = "primingEnabled";
+ public static final String PROPERTY_FILTER_MINSPEED = "minFilterPercent";
+ public static final String PROPERTY_FILTER_MAXSPEED = "maxFilterPercent";
+ public static final String PROPERTY_FILTER_MINRPM = "minFilterRPM";
+ public static final String PROPERTY_FILTER_MAXRPM = "maxFilterRPM";
+ public static final String PROPERTY_FILTER_LOWSPEED = "lowFilterSpeed";
+ public static final String PROPERTY_FILTER_MEDSPEED = "mediumFilterSpeed";
+ public static final String PROPERTY_FILTER_HIGHSPEED = "highFilterSpeed";
+ public static final String PROPERTY_FILTER_CUSTOMSPEED = "customFilterSpeed";
+ public static final String PROPERTY_FILTER_FREEZEPROTECTOVERRIDEINTERVAL = "freezeProtectOverrideInterval";
// List of all Channel ids (heater)
public static final String CHANNEL_HEATER_STATE = "heaterState";
public static final String CHANNEL_HEATER_TEMP = "heaterTemp";
public static final String CHANNEL_HEATER_ENABLE = "heaterEnable";
+ public static final String PROPERTY_HEATER_TYPE = "type";
+ public static final String PROPERTY_HEATER_HEATERTYPE = "heaterType";
+ public static final String PROPERTY_HEATER_SHAREDEQUIPID = "sharedEquipmentSystemID";
+
// List of all Channel ids (pump)
public static final String CHANNEL_PUMP_ENABLE = "pumpEnable";
- public static final String CHANNEL_PUMP_SPEED = "pumpSpeed";
-
- public static final String PROPERTY_PUMP_MINPUMPSPEED = "Min Pump Speed";
- public static final String PROPERTY_PUMP_MAXPUMPSPEED = "Min Pump Speed";
- public static final String PROPERTY_PUMP_MINPUMPRPM = "Min Pump RPM";
- public static final String PROPERTY_PUMP_MAXPUMPRPM = "Max Pump RPM";
+ public static final String CHANNEL_PUMP_SPEEDPERCENT = "pumpSpeedPercent";
+ public static final String CHANNEL_PUMP_SPEEDRPM = "pumpSpeedRpm";
+ public static final String CHANNEL_PUMP_SPEEDSELECT = "pumpSpeedSelect";
+ public static final String CHANNEL_PUMP_STATE = "pumpState";
+ public static final String CHANNEL_PUMP_LASTSPEED = "pumpLastSpeed";
+
+ public static final String PROPERTY_PUMP_TYPE = "pumpType";
+ public static final String PROPERTY_PUMP_FUNCTION = "pumpFunction";
+ public static final String PROPERTY_PUMP_PRIMINGENABLED = "pumpPrimingEnabled";
+ public static final String PROPERTY_PUMP_MINSPEED = "minPumpPercent";
+ public static final String PROPERTY_PUMP_MAXSPEED = "maxPumpPercent";
+ public static final String PROPERTY_PUMP_MINRPM = "minPumpRPM";
+ public static final String PROPERTY_PUMP_MAXRPM = "maxPumpRPM";
+ public static final String PROPERTY_PUMP_LOWSPEED = "lowPumpSpeed";
+ public static final String PROPERTY_PUMP_MEDSPEED = "mediumPumpSpeed";
+ public static final String PROPERTY_PUMP_HIGHSPEED = "highPumpSpeed";
+ public static final String PROPERTY_PUMP_CUSTOMSPEED = "customPumpSpeed";
// List of all Channel ids (relay)
public static final String CHANNEL_RELAY_STATE = "relayState";
+ public static final String PROPERTY_RELAY_TYPE = "relayType";
+ public static final String PROPERTY_RELAY_FUNCTION = "relayFunction";
+
// List of all Channel ids (sensor)
public static final String CHANNEL_SENSOR_DATA = "sensorData";
+ public static final String PROPERTY_SENSOR_TYPE = "sensorType";
+ public static final String PROPERTY_SENSOR_UNITS = "sensorUnits";
+
// List of all Channel ids (virtualHeater)
public static final String CHANNEL_VIRTUALHEATER_CURRENTSETPOINT = "virtualHeaterCurrentSetpoint";
public static final String CHANNEL_VIRTUALHEATER_ENABLE = "virtualHeaterEnable";
+ public static final String PROPERTY_VIRTUALHEATER_SHAREDTYPE = "sharedType";
+ public static final String PROPERTY_VIRTUALHEATER_MINSETTABLEWATERTEMP = "minSettableWaterTemp";
+ public static final String PROPERTY_VIRTUALHEATER_MAXSETTABLEWATERTEMP = "maxSettableWaterTemp";
+ public static final String PROPERTY_VIRTUALHEATER_MAXWATERTEMP = "maxWaterTemp";
+
// The properties associated with all things
- public static final String PROPERTY_SYSTEM_ID = "Property system ID";
- public static final String PROPERTY_TYPE = "propertyType";
- public static final String PROPERTY_BOWNAME = "BOW Name";
- public static final String PROPERTY_BOWID = "BOW ID";
+ public static final String PROPERTY_SYSTEM_ID = "systemID";
+ public static final String PROPERTY_TYPE = "thingType";
+ public static final String PROPERTY_BOWNAME = "bowName";
+ public static final String PROPERTY_BOWID = "bowID";
// Hayward Command html
public static final String COMMAND_PARAMETERS = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Request>";
--- /dev/null
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.haywardomnilogic.internal;
+
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.core.events.EventPublisher;
+import org.openhab.core.thing.Channel;
+import org.openhab.core.thing.ChannelUID;
+import org.openhab.core.thing.binding.BaseDynamicStateDescriptionProvider;
+import org.openhab.core.thing.events.ThingEventFactory;
+import org.openhab.core.thing.i18n.ChannelTypeI18nLocalizationService;
+import org.openhab.core.thing.link.ItemChannelLinkRegistry;
+import org.openhab.core.thing.type.DynamicStateDescriptionProvider;
+import org.openhab.core.types.StateDescription;
+import org.openhab.core.types.StateDescriptionFragment;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+
+/**
+ * Dynamic provider of state options for {@link HueBridgeHandler} while leaving other state description fields as
+ * original.
+ *
+ * @author Matt Myers - Initial contribution
+ */
+@Component(service = { DynamicStateDescriptionProvider.class, HaywardDynamicStateDescriptionProvider.class })
+@NonNullByDefault
+public class HaywardDynamicStateDescriptionProvider extends BaseDynamicStateDescriptionProvider {
+
+ private final Map<ChannelUID, StateDescriptionFragment> stateDescriptionFragments = new ConcurrentHashMap<>();
+
+ @Activate
+ public HaywardDynamicStateDescriptionProvider(final @Reference EventPublisher eventPublisher, //
+ final @Reference ItemChannelLinkRegistry itemChannelLinkRegistry, //
+ final @Reference ChannelTypeI18nLocalizationService channelTypeI18nLocalizationService) {
+ this.eventPublisher = eventPublisher;
+ this.itemChannelLinkRegistry = itemChannelLinkRegistry;
+ this.channelTypeI18nLocalizationService = channelTypeI18nLocalizationService;
+ }
+
+ public void setStateDescriptionFragment(ChannelUID channelUID, StateDescriptionFragment stateDescriptionFragment) {
+ StateDescriptionFragment oldStateDescriptionFragment = stateDescriptionFragments.get(channelUID);
+ if (!stateDescriptionFragment.equals(oldStateDescriptionFragment)) {
+ stateDescriptionFragments.put(channelUID, stateDescriptionFragment);
+ postEvent(ThingEventFactory.createChannelDescriptionChangedEvent(channelUID,
+ itemChannelLinkRegistry != null ? itemChannelLinkRegistry.getLinkedItemNames(channelUID) : Set.of(),
+ stateDescriptionFragment, oldStateDescriptionFragment));
+ }
+ }
+
+ @Override
+ public @Nullable StateDescription getStateDescription(Channel channel,
+ @Nullable StateDescription originalStateDescription, @Nullable Locale locale) {
+ StateDescriptionFragment stateDescriptionFragment = stateDescriptionFragments.get(channel.getUID());
+ return stateDescriptionFragment != null ? stateDescriptionFragment.toStateDescription()
+ : super.getStateDescription(channel, originalStateDescription, locale);
+ }
+}
import org.openhab.binding.haywardomnilogic.internal.handler.HaywardColorLogicHandler;
import org.openhab.binding.haywardomnilogic.internal.handler.HaywardFilterHandler;
import org.openhab.binding.haywardomnilogic.internal.handler.HaywardHeaterHandler;
+import org.openhab.binding.haywardomnilogic.internal.handler.HaywardPumpHandler;
import org.openhab.binding.haywardomnilogic.internal.handler.HaywardRelayHandler;
-import org.openhab.binding.haywardomnilogic.internal.handler.HaywardSensorHandler;
import org.openhab.binding.haywardomnilogic.internal.handler.HaywardVirtualHeaterHandler;
import org.openhab.core.io.net.http.HttpClientFactory;
import org.openhab.core.thing.Bridge;
private static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Collections.unmodifiableSet(
Stream.concat(BRIDGE_THING_TYPES_UIDS.stream(), THING_TYPES_UIDS.stream()).collect(Collectors.toSet()));
+ private final HaywardDynamicStateDescriptionProvider stateDescriptionProvider;
private final HttpClient httpClient;
@Override
}
@Activate
- public HaywardHandlerFactory(@Reference HttpClientFactory httpClientFactory) {
+ public HaywardHandlerFactory(final @Reference HaywardDynamicStateDescriptionProvider stateDescriptionProvider,
+ @Reference HttpClientFactory httpClientFactory) {
+ this.stateDescriptionProvider = stateDescriptionProvider;
this.httpClient = httpClientFactory.getCommonHttpClient();
}
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
if (thingTypeUID.equals(HaywardBindingConstants.THING_TYPE_BRIDGE)) {
- return new HaywardBridgeHandler((Bridge) thing, httpClient);
+ return new HaywardBridgeHandler(stateDescriptionProvider, (Bridge) thing, httpClient);
}
if (thingTypeUID.equals(HaywardBindingConstants.THING_TYPE_BACKYARD)) {
return new HaywardBackyardHandler(thing);
if (thingTypeUID.equals(HaywardBindingConstants.THING_TYPE_HEATER)) {
return new HaywardHeaterHandler(thing);
}
+ if (thingTypeUID.equals(HaywardBindingConstants.THING_TYPE_PUMP)) {
+ return new HaywardPumpHandler(thing);
+ }
if (thingTypeUID.equals(HaywardBindingConstants.THING_TYPE_RELAY)) {
return new HaywardRelayHandler(thing);
- }
- if (thingTypeUID.equals(HaywardBindingConstants.THING_TYPE_SENSOR)) {
- return new HaywardSensorHandler(thing);
+
}
if (thingTypeUID.equals(HaywardBindingConstants.THING_TYPE_VIRTUALHEATER)) {
return new HaywardVirtualHeaterHandler(thing);
package org.openhab.binding.haywardomnilogic.internal;
+import java.util.HashMap;
+import java.util.Map;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.binding.haywardomnilogic.internal.handler.HaywardBridgeHandler;
import org.openhab.core.library.types.DecimalType;
public abstract void getTelemetry(String xmlResponse) throws HaywardException;
+ public void setStateDescriptions() throws HaywardException {
+ }
+
public State toState(String type, String channelID, String value) throws NumberFormatException {
switch (type) {
case "Number":
return Integer.parseInt(value) > 0 ? OnOffType.ON : OnOffType.OFF;
case "Number:Dimensionless":
switch (channelID) {
- case "chlorTimedPercent":
- case "filterSpeed":
- case "pumpSpeed":
- case "filterLastSpeed":
- return new QuantityType<>(Integer.parseInt(value), Units.PERCENT);
- case "chlorAvgSaltLevel":
- case "chlorInstantSaltLevel":
+ case HaywardBindingConstants.CHANNEL_CHLORINATOR_AVGSALTLEVEL:
+ return new QuantityType<>(Integer.parseInt(value), Units.PARTS_PER_MILLION);
+ case HaywardBindingConstants.CHANNEL_CHLORINATOR_INSTANTSALTLEVEL:
return new QuantityType<>(Integer.parseInt(value), Units.PARTS_PER_MILLION);
+ case HaywardBindingConstants.CHANNEL_CHLORINATOR_TIMEDPERCENT:
+ return new QuantityType<>(Integer.parseInt(value), Units.PERCENT);
+ case HaywardBindingConstants.CHANNEL_FILTER_LASTSPEED:
+ return new QuantityType<>(Integer.parseInt(value), Units.PERCENT);
+ case HaywardBindingConstants.CHANNEL_FILTER_SPEEDPERCENT:
+ return new QuantityType<>(Integer.parseInt(value), Units.PERCENT);
+ case HaywardBindingConstants.CHANNEL_FILTER_SPEEDRPM:
+ case HaywardBindingConstants.CHANNEL_PUMP_LASTSPEED:
+ return new QuantityType<>(Integer.parseInt(value), Units.PERCENT);
+ case HaywardBindingConstants.CHANNEL_PUMP_SPEEDPERCENT:
+ return new QuantityType<>(Integer.parseInt(value), Units.PERCENT);
+ case HaywardBindingConstants.CHANNEL_PUMP_SPEEDRPM:
}
return StringType.valueOf(value);
case "Number:Temperature":
}
}
- public void updateData(String channelID, String data) {
+ public Map<String, State> updateData(String channelID, String data) {
+ Map<String, State> channelStates = new HashMap<>();
Channel chan = getThing().getChannel(channelID);
if (chan != null) {
String acceptedItemType = chan.getAcceptedItemType();
if (acceptedItemType != null) {
State state = toState(acceptedItemType, channelID, data);
updateState(chan.getUID(), state);
+ channelStates.put(channelID, state);
}
}
+ return channelStates;
}
}
systemIDs = bridgehandler.evaluateXPath("//Body-of-water/System-Id/text()", xmlResponse);
names = bridgehandler.evaluateXPath("//Body-of-water/Name/text()", xmlResponse);
+ final List<String> bowProperty1 = bridgehandler.evaluateXPath("//Body-of-water/Type/text()", xmlResponse);
+ final List<String> bowProperty2 = bridgehandler.evaluateXPath("//Body-of-water/Shared-Type/text()",
+ xmlResponse);
+ final List<String> bowProperty3 = bridgehandler.evaluateXPath("//Body-of-water/Shared-Priority/text()",
+ xmlResponse);
+ final List<String> bowProperty4 = bridgehandler
+ .evaluateXPath("//Body-of-water/Shared-Equipment-System-ID/text()", xmlResponse);
+ final List<String> bowProperty5 = bridgehandler.evaluateXPath("//Body-of-water/Supports-Spillover/text()",
+ xmlResponse);
+ final List<String> bowProperty6 = bridgehandler.evaluateXPath("//Body-of-water/Size-In-Gallons/text()",
+ xmlResponse);
+
for (int i = 0; i < systemIDs.size(); i++) {
bowProperties.put(HaywardBindingConstants.PROPERTY_TYPE, HaywardTypeToRequest.BOW);
bowProperties.put(HaywardBindingConstants.PROPERTY_SYSTEM_ID, systemIDs.get(i));
+ bowProperties.put(HaywardBindingConstants.PROPERTY_BOW_TYPE, bowProperty1.get(i));
+ bowProperties.put(HaywardBindingConstants.PROPERTY_BOW_SHAREDTYPE, bowProperty2.get(i));
+ bowProperties.put(HaywardBindingConstants.PROPERTY_BOW_SHAREDPRIORITY, bowProperty3.get(i));
+ bowProperties.put(HaywardBindingConstants.PROPERTY_BOW_SHAREDEQUIPID, bowProperty4.get(i));
+ bowProperties.put(HaywardBindingConstants.PROPERTY_BOW_SUPPORTSSPILLOVER, bowProperty5.get(i));
+ bowProperties.put(HaywardBindingConstants.PROPERTY_BOW_SIZEINGALLONS, bowProperty6.get(i));
onDeviceDiscovered(HaywardBindingConstants.THING_TYPE_BOW, names.get(i), bowProperties);
}
// Find Chlorinators
+ final List<String> chlorinatorProperty1 = bridgehandler
+ .evaluateXPath("//Body-of-water/Chlorinator/Shared-Type/text()", xmlResponse);
+ final List<String> chlorinatorProperty2 = bridgehandler.evaluateXPath("//Body-of-water/Chlorinator/Mode/text()",
+ xmlResponse);
+ final List<String> chlorinatorProperty3 = bridgehandler
+ .evaluateXPath("//Body-of-water/Chlorinator/Cell-Type/text()", xmlResponse);
+ final List<String> chlorinatorProperty4 = bridgehandler
+ .evaluateXPath("//Body-of-water/Chlorinator/Dispenser-Type/text()", xmlResponse);
+
discoverDevices(bridgehandler, xmlResponse, "Chlorinator", HaywardTypeToRequest.CHLORINATOR,
- HaywardBindingConstants.THING_TYPE_CHLORINATOR, null);
+ HaywardBindingConstants.THING_TYPE_CHLORINATOR, (props, i) -> {
+ props.put(HaywardBindingConstants.PROPERTY_CHLORINATOR_SHAREDTYPE, chlorinatorProperty1.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_CHLORINATOR_MODE, chlorinatorProperty2.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_CHLORINATOR_CELLTYPE, chlorinatorProperty3.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_CHLORINATOR_DISPENSERTYPE, chlorinatorProperty4.get(i));
+ });
// Find ColorLogic Lights
+ final List<String> colorLogicProperty1 = bridgehandler.evaluateXPath("//Backyard//ColorLogic-Light/Type/text()",
+ xmlResponse);
+
discoverDevices(bridgehandler, xmlResponse, "ColorLogic-Light", HaywardTypeToRequest.COLORLOGIC,
- HaywardBindingConstants.THING_TYPE_COLORLOGIC, null);
+ HaywardBindingConstants.THING_TYPE_COLORLOGIC, (props, i) -> {
+ props.put(HaywardBindingConstants.PROPERTY_COLORLOGIC_TYPE, colorLogicProperty1.get(i));
+ });
// Find Filters
- final List<String> filterProperty1 = bridgehandler.evaluateXPath("//Filter/Min-Pump-Speed/text()", xmlResponse);
- final List<String> filterProperty2 = bridgehandler.evaluateXPath("//Filter/Max-Pump-Speed/text()", xmlResponse);
- final List<String> filterProperty3 = bridgehandler.evaluateXPath("//Filter/Min-Pump-RPM/text()", xmlResponse);
- final List<String> filterProperty4 = bridgehandler.evaluateXPath("//Filter/Max-Pump-RPM/text()", xmlResponse);
+ final List<String> filterProperty1 = bridgehandler.evaluateXPath("//Body-of-water/Filter/Shared-Type/text()",
+ xmlResponse);
+ final List<String> filterProperty2 = bridgehandler.evaluateXPath("//Body-of-water/Filter/Filter-Type/text()",
+ xmlResponse);
+ final List<String> filterProperty3 = bridgehandler
+ .evaluateXPath("//Body-of-water/Filter/Priming-Enabled/text()", xmlResponse);
+ final List<String> filterProperty4 = bridgehandler.evaluateXPath("//Body-of-water/Filter/Min-Pump-Speed/text()",
+ xmlResponse);
+ final List<String> filterProperty5 = bridgehandler.evaluateXPath("//Body-of-water/Filter/Max-Pump-Speed/text()",
+ xmlResponse);
+ final List<String> filterProperty6 = bridgehandler.evaluateXPath("//Body-of-water/Filter/Min-Pump-RPM/text()",
+ xmlResponse);
+ final List<String> filterProperty7 = bridgehandler.evaluateXPath("//Body-of-water/Filter/Max-Pump-RPM/text()",
+ xmlResponse);
+ final List<String> filterProperty8 = bridgehandler
+ .evaluateXPath("//Body-of-water/Filter/Vsp-Low-Pump-Speed/text()", xmlResponse);
+ final List<String> filterProperty9 = bridgehandler
+ .evaluateXPath("//Body-of-water/Filter/Vsp-Medium-Pump-Speed/text()", xmlResponse);
+ final List<String> filterProperty10 = bridgehandler
+ .evaluateXPath("//Body-of-water/Filter/Vsp-High-Pump-Speed/text()", xmlResponse);
+ final List<String> filterProperty11 = bridgehandler
+ .evaluateXPath("//Body-of-water/Filter/Vsp-Custom-Pump-Speed/text()", xmlResponse);
+ final List<String> filterProperty12 = bridgehandler
+ .evaluateXPath("//Body-of-water/Filter/Freeze-Protect-Override-Interval/text()", xmlResponse);
discoverDevices(bridgehandler, xmlResponse, "Filter", HaywardTypeToRequest.FILTER,
HaywardBindingConstants.THING_TYPE_FILTER, (props, i) -> {
- props.put(HaywardBindingConstants.PROPERTY_FILTER_MINPUMPSPEED, filterProperty1.get(i));
- props.put(HaywardBindingConstants.PROPERTY_FILTER_MAXPUMPSPEED, filterProperty2.get(i));
- props.put(HaywardBindingConstants.PROPERTY_FILTER_MINPUMPRPM, filterProperty3.get(i));
- props.put(HaywardBindingConstants.PROPERTY_FILTER_MAXPUMPRPM, filterProperty4.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_FILTER_SHAREDTYPE, filterProperty1.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_FILTER_FILTERTYPE, filterProperty2.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_FILTER_PRIMINGENABLED, filterProperty3.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_FILTER_MINSPEED, filterProperty4.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_FILTER_MAXSPEED, filterProperty5.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_FILTER_MINRPM, filterProperty6.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_FILTER_MAXRPM, filterProperty7.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_FILTER_LOWSPEED, filterProperty8.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_FILTER_MEDSPEED, filterProperty9.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_FILTER_HIGHSPEED, filterProperty10.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_FILTER_CUSTOMSPEED, filterProperty11.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_FILTER_FREEZEPROTECTOVERRIDEINTERVAL,
+ filterProperty12.get(i));
});
// Find Heaters
+ final List<String> heaterProperty1 = bridgehandler
+ .evaluateXPath("//Body-of-water/Heater/Operation/Heater-Equipment/Type/text()", xmlResponse);
+ final List<String> heaterProperty2 = bridgehandler
+ .evaluateXPath("//Body-of-water/Heater/Operation/Heater-Equipment/Heater-Type/text()", xmlResponse);
+ final List<String> heaterProperty3 = bridgehandler.evaluateXPath(
+ "//Body-of-water/Heater/Operation/Heater-Equipment/Shared-Equipment-System-ID/text()", xmlResponse);
+
discoverDevices(bridgehandler, xmlResponse, "Heater-Equipment", HaywardTypeToRequest.HEATER,
- HaywardBindingConstants.THING_TYPE_HEATER, null);
+ HaywardBindingConstants.THING_TYPE_HEATER, (props, i) -> {
+ props.put(HaywardBindingConstants.PROPERTY_HEATER_TYPE, heaterProperty1.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_HEATER_HEATERTYPE, heaterProperty2.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_HEATER_SHAREDEQUIPID, heaterProperty3.get(i));
+ });
// Find Pumps
- final List<String> pumpProperty1 = bridgehandler.evaluateXPath("//Pump/Min-Pump-Speed/text()", xmlResponse);
- final List<String> pumpProperty2 = bridgehandler.evaluateXPath("//Pump/Max-Pump-Speed/text()", xmlResponse);
- final List<String> pumpProperty3 = bridgehandler.evaluateXPath("//Pump/Min-Pump-RPM/text()", xmlResponse);
- final List<String> pumpProperty4 = bridgehandler.evaluateXPath("//Pump/Max-Pump-RPM/text()", xmlResponse);
+ final List<String> pumpProperty1 = bridgehandler.evaluateXPath("//Body-of-water/Pump/Type/text()", xmlResponse);
+ final List<String> pumpProperty2 = bridgehandler.evaluateXPath("//Body-of-water/Pump/Function/text()",
+ xmlResponse);
+ final List<String> pumpProperty3 = bridgehandler.evaluateXPath("//Body-of-water/Pump/Priming-Enabled/text()",
+ xmlResponse);
+ final List<String> pumpProperty4 = bridgehandler.evaluateXPath("//Body-of-water/Pump/Min-Pump-Speed/text()",
+ xmlResponse);
+ final List<String> pumpProperty5 = bridgehandler.evaluateXPath("//Body-of-water/Pump/Max-Pump-Speed/text()",
+ xmlResponse);
+ final List<String> pumpProperty6 = bridgehandler.evaluateXPath("//Body-of-water/Pump/Min-Pump-RPM/text()",
+ xmlResponse);
+ final List<String> pumpProperty7 = bridgehandler.evaluateXPath("//Body-of-water/Pump/Max-Pump-RPM/text()",
+ xmlResponse);
+ final List<String> pumpProperty8 = bridgehandler.evaluateXPath("//Body-of-water/Pump/Vsp-Low-Pump-Speed/text()",
+ xmlResponse);
+ final List<String> pumpProperty9 = bridgehandler
+ .evaluateXPath("//Body-of-water/Pump/Vsp-Medium-Pump-Speed/text()", xmlResponse);
+ final List<String> pumpProperty10 = bridgehandler
+ .evaluateXPath("//Body-of-water/Pump/Vsp-High-Pump-Speed/text()", xmlResponse);
+ final List<String> pumpProperty11 = bridgehandler
+ .evaluateXPath("//Body-of-water/Pump/Vsp-Custom-Pump-Speed/text()", xmlResponse);
discoverDevices(bridgehandler, xmlResponse, "Pump", HaywardTypeToRequest.PUMP,
- HaywardBindingConstants.THING_TYPE_FILTER, (props, i) -> {
- props.put(HaywardBindingConstants.PROPERTY_FILTER_MINPUMPSPEED, pumpProperty1.get(i));
- props.put(HaywardBindingConstants.PROPERTY_FILTER_MAXPUMPSPEED, pumpProperty2.get(i));
- props.put(HaywardBindingConstants.PROPERTY_FILTER_MINPUMPRPM, pumpProperty3.get(i));
- props.put(HaywardBindingConstants.PROPERTY_FILTER_MAXPUMPRPM, pumpProperty4.get(i));
+ HaywardBindingConstants.THING_TYPE_PUMP, (props, i) -> {
+ props.put(HaywardBindingConstants.PROPERTY_PUMP_TYPE, pumpProperty1.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_PUMP_FUNCTION, pumpProperty2.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_PUMP_PRIMINGENABLED, pumpProperty3.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_PUMP_MINSPEED, pumpProperty4.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_PUMP_MAXSPEED, pumpProperty5.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_PUMP_MINRPM, pumpProperty6.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_PUMP_MAXRPM, pumpProperty7.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_PUMP_LOWSPEED, pumpProperty8.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_PUMP_MEDSPEED, pumpProperty9.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_PUMP_HIGHSPEED, pumpProperty10.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_PUMP_CUSTOMSPEED, pumpProperty11.get(i));
});
// Find Relays
+ final List<String> relayProperty1 = bridgehandler.evaluateXPath("//Backyard//Relay/Type/text()", xmlResponse);
+ final List<String> relayProperty2 = bridgehandler.evaluateXPath("//Backyard//Relay/Function/text()",
+ xmlResponse);
+
discoverDevices(bridgehandler, xmlResponse, "Relay", HaywardTypeToRequest.RELAY,
- HaywardBindingConstants.THING_TYPE_RELAY, null);
+ HaywardBindingConstants.THING_TYPE_RELAY, (props, i) -> {
+ props.put(HaywardBindingConstants.PROPERTY_RELAY_TYPE, relayProperty1.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_RELAY_FUNCTION, relayProperty2.get(i));
+ });
// Find Virtual Heaters
- discoverDevices(bridgehandler, xmlResponse, "Heater", HaywardTypeToRequest.VIRTUALHEATER,
- HaywardBindingConstants.THING_TYPE_VIRTUALHEATER, null);
+ final List<String> virtualHeaterProperty1 = bridgehandler
+ .evaluateXPath("//Body-of-water/Heater/Shared-Type/text()", xmlResponse);
+ final List<String> virtualHeaterProperty2 = bridgehandler
+ .evaluateXPath("//Body-of-water/Heater/Min-Settable-Water-Temp/text()", xmlResponse);
+ final List<String> virtualHeaterProperty3 = bridgehandler
+ .evaluateXPath("//Body-of-water/Heater/Max-Settable-Water-Temp/text()", xmlResponse);
+ final List<String> virtualHeaterProperty4 = bridgehandler
+ .evaluateXPath("//Body-of-water/Heater/Max-Water-Temp/text()", xmlResponse);
- // Find Sensors
- discoverDevices(bridgehandler, xmlResponse, "Sensor", HaywardTypeToRequest.SENSOR,
- HaywardBindingConstants.THING_TYPE_SENSOR, null);
+ discoverDevices(bridgehandler, xmlResponse, "Heater", HaywardTypeToRequest.VIRTUALHEATER,
+ HaywardBindingConstants.THING_TYPE_VIRTUALHEATER, (props, i) -> {
+ props.put(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_SHAREDTYPE, virtualHeaterProperty1.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MINSETTABLEWATERTEMP,
+ virtualHeaterProperty2.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MAXSETTABLEWATERTEMP,
+ virtualHeaterProperty3.get(i));
+ props.put(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MAXWATERTEMP,
+ virtualHeaterProperty4.get(i));
+ });
}
private void discoverDevices(HaywardBridgeHandler bridgehandler, String xmlResponse, String xmlSearchTerm,
HaywardTypeToRequest type, ThingTypeUID thingType,
@Nullable BiConsumer<Map<String, Object>, Integer> additionalPropertyConsumer) {
- List<String> systemIDs = bridgehandler.evaluateXPath("//" + xmlSearchTerm + "/System-Id/text()", xmlResponse);
+ List<String> systemIDs = bridgehandler.evaluateXPath("//Backyard//" + xmlSearchTerm + "/System-Id/text()",
+ xmlResponse);
List<String> names;
// Set Virtual Heater Name
names = new ArrayList<>(systemIDs);
Collections.fill(names, "Heater");
} else {
- names = bridgehandler.evaluateXPath("//" + xmlSearchTerm + "/Name/text()", xmlResponse);
+ names = bridgehandler.evaluateXPath("//Backyard//" + xmlSearchTerm + "/Name/text()", xmlResponse);
}
for (int i = 0; i < systemIDs.size(); i++) {
List<String> bowName = bridgehandler.evaluateXPath(
"//*[System-Id=" + systemIDs.get(i) + "]/ancestor::Body-of-water/Name/text()", xmlResponse);
- // skip system sensors with no BOW
- if (bowID.isEmpty()) {
- continue;
- }
-
Map<String, Object> properties = new HashMap<>();
properties.put(HaywardBindingConstants.PROPERTY_TYPE, type);
properties.put(HaywardBindingConstants.PROPERTY_SYSTEM_ID, systemIDs.get(i));
- properties.put(HaywardBindingConstants.PROPERTY_BOWID, bowID.get(0));
- properties.put(HaywardBindingConstants.PROPERTY_BOWNAME, bowName.get(0));
+
+ if (!bowID.isEmpty()) {
+ properties.put(HaywardBindingConstants.PROPERTY_BOWID, bowID.get(0));
+ } else {
+ // Set BOWID = 0 for backyard items
+ properties.put(HaywardBindingConstants.PROPERTY_BOWID, "0");
+ }
+
+ if (!bowName.isEmpty()) {
+ properties.put(HaywardBindingConstants.PROPERTY_BOWNAME, bowName.get(0));
+ } else {
+ // Set BOWNAME = Backyard for backyard items
+ properties.put(HaywardBindingConstants.PROPERTY_BOWNAME, "Backyard");
+ }
+
if (additionalPropertyConsumer != null) {
additionalPropertyConsumer.accept(properties, i);
}
+
onDeviceDiscovered(thingType, names.get(i), properties);
}
}
import org.eclipse.jetty.http.HttpVersion;
import org.openhab.binding.haywardomnilogic.internal.HaywardAccount;
import org.openhab.binding.haywardomnilogic.internal.HaywardBindingConstants;
+import org.openhab.binding.haywardomnilogic.internal.HaywardDynamicStateDescriptionProvider;
import org.openhab.binding.haywardomnilogic.internal.HaywardException;
import org.openhab.binding.haywardomnilogic.internal.HaywardThingHandler;
import org.openhab.binding.haywardomnilogic.internal.HaywardTypeToRequest;
import org.openhab.binding.haywardomnilogic.internal.discovery.HaywardDiscoveryService;
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.thing.Bridge;
+import org.openhab.core.thing.Channel;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatus;
import org.openhab.core.thing.binding.BaseBridgeHandler;
import org.openhab.core.thing.binding.ThingHandlerService;
import org.openhab.core.types.Command;
+import org.openhab.core.types.StateDescriptionFragment;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.NodeList;
@NonNullByDefault
public class HaywardBridgeHandler extends BaseBridgeHandler {
private final Logger logger = LoggerFactory.getLogger(HaywardBridgeHandler.class);
+ private final HaywardDynamicStateDescriptionProvider stateDescriptionProvider;
private final HttpClient httpClient;
private @Nullable ScheduledFuture<?> initializeFuture;
private @Nullable ScheduledFuture<?> pollTelemetryFuture;
return Collections.singleton(HaywardDiscoveryService.class);
}
- public HaywardBridgeHandler(Bridge bridge, HttpClient httpClient) {
+ public HaywardBridgeHandler(HaywardDynamicStateDescriptionProvider stateDescriptionProvider, Bridge bridge,
+ HttpClient httpClient) {
super(bridge);
this.httpClient = httpClient;
+ this.stateDescriptionProvider = stateDescriptionProvider;
}
@Override
return;
}
+ if (logger.isTraceEnabled()) {
+ if (!(getApiDef())) {
+ updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
+ "Unable to getApiDef from Hayward's server");
+ clearPolling(pollTelemetryFuture);
+ clearPolling(pollAlarmsFuture);
+ commFailureCount = 50;
+ initPolling(60);
+ return;
+ }
+ }
+
if (this.thing.getStatus() != ThingStatus.ONLINE) {
updateStatus(ThingStatus.ONLINE);
}
public synchronized boolean getApiDef() throws HaywardException, InterruptedException {
String xmlResponse;
- // *****getConfig from Hayward server
+ // *****getApiDef from Hayward server
String urlParameters = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Request><Name>GetAPIDef</Name><Parameters>"
+ "<Parameter name=\"Token\" dataType=\"String\">" + account.token + "</Parameter>"
+ "<Parameter name=\"MspSystemID\" dataType=\"int\">" + account.mspSystemID + "</Parameter>;"
String xmlResponse = httpXmlResponse(urlParameters);
- // Debug: Inject xml file for testing
- // String path =
- // "C:/Users/Controls/openhab-2-5-x/git/openhab-addons/bundles/org.openhab.binding.haywardomnilogic/getConfig.xml";
- // xmlResponse = new String(Files.readAllBytes(Paths.get(path)));
-
if (xmlResponse.isEmpty()) {
logger.debug("Hayward Connection thing: requestConfig XML response was null");
return "Fail";
return e.getMethodName();
}
+ void updateChannelStateDescriptionFragment(Channel channel, StateDescriptionFragment descriptionFragment) {
+ ChannelUID channelId = channel.getUID();
+ stateDescriptionProvider.setStateDescriptionFragment(channelId, descriptionFragment);
+ }
+
public int convertCommand(Command command) {
if (command == OnOffType.ON) {
return 1;
*/
package org.openhab.binding.haywardomnilogic.internal.handler;
+import java.math.BigDecimal;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.binding.haywardomnilogic.internal.HaywardBindingConstants;
import org.openhab.binding.haywardomnilogic.internal.HaywardThingHandler;
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.thing.Bridge;
+import org.openhab.core.thing.Channel;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatus;
import org.openhab.core.thing.ThingStatusDetail;
import org.openhab.core.types.Command;
import org.openhab.core.types.RefreshType;
+import org.openhab.core.types.State;
+import org.openhab.core.types.StateDescriptionFragment;
+import org.openhab.core.types.StateDescriptionFragmentBuilder;
+import org.openhab.core.types.StateOption;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@NonNullByDefault
public class HaywardFilterHandler extends HaywardThingHandler {
private final Logger logger = LoggerFactory.getLogger(HaywardFilterHandler.class);
+ private Map<String, State> channelStates = new HashMap<>();
public HaywardFilterHandler(Thing thing) {
super(thing);
@Override
public void initialize() {
- updateStatus(ThingStatus.ONLINE);
+ try {
+ setStateDescriptions();
+ updateStatus(ThingStatus.ONLINE);
+ } catch (HaywardException e) {
+ updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR,
+ "Unable to set FilterHandler StateDescriptions");
+ }
+ }
+
+ @Override
+ public void setStateDescriptions() throws HaywardException {
+ List<StateOption> options = new ArrayList<>();
+ String option;
+
+ Bridge bridge = getBridge();
+ if (bridge != null) {
+ HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
+ if (bridgehandler != null) {
+ // Set Filter Speed % min and max speeds
+ Channel ch = thing.getChannel(HaywardBindingConstants.CHANNEL_FILTER_SPEEDPERCENT);
+ if (ch != null) {
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withMinimum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MINSPEED)))
+ .withMaximum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MAXSPEED)))
+ .build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
+ }
+
+ // Set Filter Speed RPM min and max speeds
+ ch = thing.getChannel(HaywardBindingConstants.CHANNEL_FILTER_SPEEDRPM);
+ if (ch != null) {
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withMinimum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MINRPM)))
+ .withMaximum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MAXRPM)))
+ .build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
+ }
+
+ // Set Filter Speed States
+ ch = thing.getChannel(HaywardBindingConstants.CHANNEL_FILTER_SPEEDSELECT);
+ if (ch != null) {
+ options.add(new StateOption("0", "Off"));
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_LOWSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "Low"));
+ }
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MEDSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "Medium"));
+ }
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_HIGHSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "High"));
+ }
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_CUSTOMSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "Custom"));
+ }
+
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withOptions(options).build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
+ }
+ }
+ }
}
@Override
data = bridgehandler.evaluateXPath("//Filter/@valvePosition", xmlResponse);
updateData(HaywardBindingConstants.CHANNEL_FILTER_VALVEPOSITION, data.get(i));
- // Speed
+ // Speed percent
data = bridgehandler.evaluateXPath("//Filter/@filterSpeed", xmlResponse);
- updateData(HaywardBindingConstants.CHANNEL_FILTER_SPEED, data.get(i));
+ updateData(HaywardBindingConstants.CHANNEL_FILTER_SPEEDPERCENT, data.get(i));
+
+ // Speed rpm
+ String filterMaxRpm = getThing().getProperties()
+ .get(HaywardBindingConstants.PROPERTY_FILTER_MAXRPM);
+ if (filterMaxRpm != null) {
+ Integer rpmSpeed = (Integer.parseInt(data.get(i))) * (Integer.parseInt(filterMaxRpm)) / 100;
+ updateData(HaywardBindingConstants.CHANNEL_FILTER_SPEEDRPM, rpmSpeed.toString());
+ }
if (data.get(i).equals("0")) {
updateData(HaywardBindingConstants.CHANNEL_FILTER_ENABLE, "0");
updateData(HaywardBindingConstants.CHANNEL_FILTER_ENABLE, "1");
}
+ // Speed Select
+ data = bridgehandler.evaluateXPath("//Filter/@filterSpeed", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_FILTER_SPEEDSELECT, data.get(i));
+
// State
data = bridgehandler.evaluateXPath("//Filter/@filterState", xmlResponse);
updateData(HaywardBindingConstants.CHANNEL_FILTER_STATE, data.get(i));
// lastSpeed
data = bridgehandler.evaluateXPath("//Filter/@lastSpeed", xmlResponse);
updateData(HaywardBindingConstants.CHANNEL_FILTER_LASTSPEED, data.get(i));
+ channelStates.putAll(updateData(HaywardBindingConstants.CHANNEL_FILTER_LASTSPEED, data.get(i)));
}
}
this.updateStatus(ThingStatus.ONLINE);
String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
+ String filterMinSpeed = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MINSPEED);
+ String filterMaxSpeed = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MAXSPEED);
+ String filterMaxRpm = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_FILTER_MAXRPM);
Bridge bridge = getBridge();
if (bridge != null) {
switch (channelUID.getId()) {
case HaywardBindingConstants.CHANNEL_FILTER_ENABLE:
if (command == OnOffType.ON) {
- cmdString = "100";
+ cmdString = channelStates.get(HaywardBindingConstants.CHANNEL_FILTER_LASTSPEED)
+ .format("%d");
} else {
cmdString = "0";
}
break;
- case HaywardBindingConstants.CHANNEL_FILTER_SPEED:
+ case HaywardBindingConstants.CHANNEL_FILTER_SPEEDPERCENT:
+ if (filterMinSpeed != null && filterMaxSpeed != null) {
+ if (Integer.parseInt(cmdString) > 0
+ && Integer.parseInt(cmdString) < Integer.parseInt(filterMinSpeed)) {
+ cmdString = filterMinSpeed;
+ } else if (Integer.parseInt(cmdString) > Integer.parseInt(filterMaxSpeed)) {
+ cmdString = filterMaxSpeed;
+ }
+ }
+ break;
+ case HaywardBindingConstants.CHANNEL_FILTER_SPEEDRPM:
+ // Convert cmdString from RPM to Percent
+ if (filterMaxRpm != null && filterMaxSpeed != null && filterMinSpeed != null) {
+ cmdString = Integer
+ .toString((Integer.parseInt(cmdString) * 100 / Integer.parseInt(filterMaxRpm)));
+ if (Integer.parseInt(cmdString) > 0
+ && Integer.parseInt(cmdString) < Integer.parseInt(filterMinSpeed)) {
+ cmdString = filterMinSpeed;
+ } else if (Integer.parseInt(cmdString) > Integer.parseInt(filterMaxSpeed)) {
+ cmdString = filterMaxSpeed;
+ }
+ }
+ break;
+ case HaywardBindingConstants.CHANNEL_FILTER_SPEEDSELECT:
break;
default:
logger.warn("haywardCommand Unsupported type {}", channelUID);
--- /dev/null
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.haywardomnilogic.internal.handler;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.openhab.binding.haywardomnilogic.internal.HaywardBindingConstants;
+import org.openhab.binding.haywardomnilogic.internal.HaywardException;
+import org.openhab.binding.haywardomnilogic.internal.HaywardThingHandler;
+import org.openhab.core.library.types.OnOffType;
+import org.openhab.core.thing.Bridge;
+import org.openhab.core.thing.Channel;
+import org.openhab.core.thing.ChannelUID;
+import org.openhab.core.thing.Thing;
+import org.openhab.core.thing.ThingStatus;
+import org.openhab.core.thing.ThingStatusDetail;
+import org.openhab.core.types.Command;
+import org.openhab.core.types.RefreshType;
+import org.openhab.core.types.State;
+import org.openhab.core.types.StateDescriptionFragment;
+import org.openhab.core.types.StateDescriptionFragmentBuilder;
+import org.openhab.core.types.StateOption;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The Pump Handler
+ *
+ * @author Matt Myers - Initial contribution
+ */
+@NonNullByDefault
+public class HaywardPumpHandler extends HaywardThingHandler {
+ private final Logger logger = LoggerFactory.getLogger(HaywardPumpHandler.class);
+ private Map<String, State> channelStates = new HashMap<>();
+
+ public HaywardPumpHandler(Thing thing) {
+ super(thing);
+ }
+
+ @Override
+ public void initialize() {
+ try {
+ setStateDescriptions();
+ updateStatus(ThingStatus.ONLINE);
+ } catch (HaywardException e) {
+ updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR,
+ "Unable to setPumpHandler StateDescriptions");
+ }
+ }
+
+ @Override
+ public void setStateDescriptions() throws HaywardException {
+ List<StateOption> options = new ArrayList<>();
+ String option;
+
+ Bridge bridge = getBridge();
+ if (bridge != null) {
+ HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
+ if (bridgehandler != null) {
+ // Set Pump % min and max speeds
+ Channel ch = thing.getChannel(HaywardBindingConstants.CHANNEL_PUMP_SPEEDPERCENT);
+ if (ch != null) {
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withMinimum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MINSPEED)))
+ .withMaximum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MAXSPEED)))
+ .build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
+ }
+
+ // Set Pump Speed RPM min and max speeds
+ ch = thing.getChannel(HaywardBindingConstants.CHANNEL_PUMP_SPEEDRPM);
+ if (ch != null) {
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withMinimum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MINRPM)))
+ .withMaximum(new BigDecimal(
+ getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MAXRPM)))
+ .build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
+ }
+
+ // Set Pump Speed States
+ ch = thing.getChannel(HaywardBindingConstants.CHANNEL_PUMP_SPEEDSELECT);
+ if (ch != null) {
+ options.add(new StateOption("0", "Off"));
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_LOWSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "Low"));
+ }
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MEDSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "Medium"));
+ }
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_HIGHSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "High"));
+ }
+ option = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_CUSTOMSPEED);
+ if (option != null) {
+ options.add(new StateOption(option, "Custom"));
+ }
+
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withOptions(options).build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void getTelemetry(String xmlResponse) throws HaywardException {
+ List<String> systemIDs = new ArrayList<>();
+ List<String> data = new ArrayList<>();
+
+ Bridge bridge = getBridge();
+ if (bridge != null) {
+ HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
+ if (bridgehandler != null) {
+ systemIDs = bridgehandler.evaluateXPath("//Pump/@systemId", xmlResponse);
+ String thingSystemID = getThing().getUID().getId();
+ for (int i = 0; i < systemIDs.size(); i++) {
+ if (systemIDs.get(i).equals(thingSystemID)) {
+ // Speed percent
+ data = bridgehandler.evaluateXPath("//Pump/@pumpSpeed", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_PUMP_SPEEDPERCENT, data.get(i));
+
+ // Speed rpm
+ String pumpMaxRpm = getThing().getProperties()
+ .get(HaywardBindingConstants.PROPERTY_PUMP_MAXRPM);
+ if (pumpMaxRpm != null) {
+ Integer rpmSpeed = (Integer.parseInt(data.get(i))) * (Integer.parseInt(pumpMaxRpm)) / 100;
+ updateData(HaywardBindingConstants.CHANNEL_PUMP_SPEEDRPM, rpmSpeed.toString());
+ }
+
+ if (data.get(i).equals("0")) {
+ updateData(HaywardBindingConstants.CHANNEL_PUMP_ENABLE, "0");
+ } else {
+ updateData(HaywardBindingConstants.CHANNEL_PUMP_ENABLE, "1");
+ }
+
+ // Speed Select
+ data = bridgehandler.evaluateXPath("//Pump/@pumpSpeed", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_PUMP_SPEEDSELECT, data.get(i));
+
+ // State
+ data = bridgehandler.evaluateXPath("//Pump/@pumpState", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_PUMP_STATE, data.get(i));
+
+ // lastSpeed
+ data = bridgehandler.evaluateXPath("//Pump/@lastSpeed", xmlResponse);
+ updateData(HaywardBindingConstants.CHANNEL_PUMP_LASTSPEED, data.get(i));
+ channelStates.putAll(updateData(HaywardBindingConstants.CHANNEL_PUMP_LASTSPEED, data.get(i)));
+ }
+ }
+ this.updateStatus(ThingStatus.ONLINE);
+ } else {
+ this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
+ }
+ }
+ }
+
+ @Override
+ public void handleCommand(ChannelUID channelUID, Command command) {
+ if ((command instanceof RefreshType)) {
+ return;
+ }
+
+ String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
+ String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
+ String pumpMinSpeed = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MINSPEED);
+ String pumpMaxSpeed = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MAXSPEED);
+ String pumpMaxRpm = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_PUMP_MAXRPM);
+
+ Bridge bridge = getBridge();
+ if (bridge != null) {
+ HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
+ if (bridgehandler != null) {
+ String cmdString = this.cmdToString(command);
+ try {
+ switch (channelUID.getId()) {
+ case HaywardBindingConstants.CHANNEL_PUMP_ENABLE:
+ if (command == OnOffType.ON) {
+ cmdString = channelStates.get(HaywardBindingConstants.CHANNEL_PUMP_LASTSPEED)
+ .format("%d");
+ } else {
+ cmdString = "0";
+ }
+ break;
+ case HaywardBindingConstants.CHANNEL_PUMP_SPEEDPERCENT:
+ if (pumpMinSpeed != null && pumpMaxSpeed != null) {
+ if (Integer.parseInt(cmdString) > 0
+ && Integer.parseInt(cmdString) < Integer.parseInt(pumpMinSpeed)) {
+ cmdString = pumpMinSpeed;
+ } else if (Integer.parseInt(cmdString) > Integer.parseInt(pumpMaxSpeed)) {
+ cmdString = pumpMaxSpeed;
+ }
+ }
+ case HaywardBindingConstants.CHANNEL_PUMP_SPEEDRPM:
+ // Convert cmdString from RPM to Percent
+ if (pumpMaxRpm != null && pumpMaxSpeed != null && pumpMinSpeed != null) {
+ cmdString = Integer
+ .toString((Integer.parseInt(cmdString) * 100 / Integer.parseInt(pumpMaxSpeed)));
+ if (Integer.parseInt(cmdString) > 0
+ && Integer.parseInt(cmdString) < Integer.parseInt(pumpMinSpeed)) {
+ cmdString = pumpMinSpeed;
+ } else if (Integer.parseInt(cmdString) > Integer.parseInt(pumpMaxSpeed)) {
+ cmdString = pumpMaxSpeed;
+ }
+ }
+ break;
+ case HaywardBindingConstants.CHANNEL_PUMP_SPEEDSELECT:
+ break;
+ default:
+ logger.warn("haywardCommand Unsupported type {}", channelUID);
+ return;
+ }
+
+ String cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
+ + "<Name>SetUIEquipmentCmd</Name><Parameters>"
+ + "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
+ + "</Parameter>" + "<Parameter name=\"MspSystemID\" dataType=\"int\">"
+ + bridgehandler.account.mspSystemID + "</Parameter>"
+ + "<Parameter name=\"PoolID\" dataType=\"int\">" + poolID + "</Parameter>"
+ + "<Parameter name=\"EquipmentID\" dataType=\"int\">" + systemID + "</Parameter>"
+ + "<Parameter name=\"IsOn\" dataType=\"int\">" + cmdString + "</Parameter>"
+ + HaywardBindingConstants.COMMAND_SCHEDULE + "</Parameters></Request>";
+
+ // *****Send Command to Hayward server
+ String xmlResponse = bridgehandler.httpXmlResponse(cmdURL);
+ String status = bridgehandler.evaluateXPath("//Parameter[@name='Status']/text()", xmlResponse)
+ .get(0);
+
+ if (!("0".equals(status))) {
+ logger.debug("haywardCommand XML response: {}", xmlResponse);
+ return;
+ }
+ } catch (HaywardException e) {
+ logger.debug("Unable to send command to Hayward's server {}:{}:{}",
+ bridgehandler.config.endpointUrl, bridgehandler.config.username, e.getMessage());
+ } catch (InterruptedException e) {
+ return;
+ }
+ this.updateStatus(ThingStatus.ONLINE);
+ } else {
+ this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
+ }
+ }
+ }
+}
+++ /dev/null
-/**
- * Copyright (c) 2010-2021 Contributors to the openHAB project
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- */
-package org.openhab.binding.haywardomnilogic.internal.handler;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.openhab.binding.haywardomnilogic.internal.HaywardBindingConstants;
-import org.openhab.binding.haywardomnilogic.internal.HaywardException;
-import org.openhab.binding.haywardomnilogic.internal.HaywardThingHandler;
-import org.openhab.core.thing.Bridge;
-import org.openhab.core.thing.Thing;
-import org.openhab.core.thing.ThingStatus;
-import org.openhab.core.thing.ThingStatusDetail;
-
-/**
- * The Sensor Handler
- *
- * @author Matt Myers - Initial contribution
- */
-@NonNullByDefault
-public class HaywardSensorHandler extends HaywardThingHandler {
-
- public HaywardSensorHandler(Thing thing) {
- super(thing);
- }
-
- @Override
- public void getTelemetry(String xmlResponse) throws HaywardException {
- List<String> systemIDs = new ArrayList<>();
- List<String> data = new ArrayList<>();
-
- Bridge bridge = getBridge();
- if (bridge != null) {
- HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
- if (bridgehandler != null) {
- systemIDs = bridgehandler.evaluateXPath("//Sensor/@systemId", xmlResponse);
- data = bridgehandler.evaluateXPath("//Sensor/@relayState", xmlResponse);
- String thingSystemID = getThing().getUID().getId();
- for (int i = 0; i < systemIDs.size(); i++) {
- if (systemIDs.get(i).equals(thingSystemID)) {
- updateData(HaywardBindingConstants.CHANNEL_RELAY_STATE, data.get(i));
- }
- }
- this.updateStatus(ThingStatus.ONLINE);
- } else {
- this.updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_UNINITIALIZED);
- }
- }
- }
-}
*/
package org.openhab.binding.haywardomnilogic.internal.handler;
+import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import org.openhab.binding.haywardomnilogic.internal.HaywardThingHandler;
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.thing.Bridge;
+import org.openhab.core.thing.Channel;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatus;
import org.openhab.core.thing.ThingStatusDetail;
import org.openhab.core.types.Command;
import org.openhab.core.types.RefreshType;
+import org.openhab.core.types.StateDescriptionFragment;
+import org.openhab.core.types.StateDescriptionFragmentBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
super(thing);
}
+ @Override
+ public void initialize() {
+ try {
+ setStateDescriptions();
+ updateStatus(ThingStatus.ONLINE);
+ } catch (HaywardException e) {
+ updateStatus(ThingStatus.OFFLINE);
+ }
+ }
+
+ @Override
+ public void setStateDescriptions() throws HaywardException {
+ Bridge bridge = getBridge();
+ if (bridge != null) {
+ HaywardBridgeHandler bridgehandler = (HaywardBridgeHandler) bridge.getHandler();
+ if (bridgehandler != null) {
+ // Set heater min and max speeds
+ Channel ch = thing.getChannel(HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT);
+ if (ch != null) {
+ StateDescriptionFragment stateDescriptionFragment = StateDescriptionFragmentBuilder.create()
+ .withMinimum(new BigDecimal(getThing().getProperties()
+ .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MINSETTABLEWATERTEMP)))
+ .withMaximum(new BigDecimal(getThing().getProperties()
+ .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MAXSETTABLEWATERTEMP)))
+ .build();
+ bridgehandler.updateChannelStateDescriptionFragment(ch, stateDescriptionFragment);
+ }
+ }
+ }
+ }
+
@Override
public void getTelemetry(String xmlResponse) throws HaywardException {
List<String> systemIDs = new ArrayList<>();
String systemID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_SYSTEM_ID);
String poolID = getThing().getProperties().get(HaywardBindingConstants.PROPERTY_BOWID);
+ String heaterMinSetTemp = getThing().getProperties()
+ .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MINSETTABLEWATERTEMP);
+ String heaterMaxSetTemp = getThing().getProperties()
+ .get(HaywardBindingConstants.PROPERTY_VIRTUALHEATER_MAXSETTABLEWATERTEMP);
Bridge bridge = getBridge();
if (bridge != null) {
break;
case HaywardBindingConstants.CHANNEL_VIRTUALHEATER_CURRENTSETPOINT:
+ if (heaterMinSetTemp != null && heaterMaxSetTemp != null) {
+ if (Integer.parseInt(cmdString) < Integer.parseInt(heaterMinSetTemp)) {
+ cmdString = heaterMinSetTemp;
+ } else if (Integer.parseInt(cmdString) > Integer.parseInt(heaterMaxSetTemp)) {
+ cmdString = heaterMaxSetTemp;
+ }
+ }
+
cmdURL = HaywardBindingConstants.COMMAND_PARAMETERS
+ "<Name>SetUIHeaterCmd</Name><Parameters>"
+ "<Parameter name=\"Token\" dataType=\"String\">" + bridgehandler.account.token
</channels>
<properties>
- <property name="Vendor">Hayward</property>
+ <property name="vendor">Hayward</property>
</properties>
<representation-property>systemID</representation-property>
</channels>
<properties>
- <property name="Vendor">Hayward</property>
+ <property name="vendor">Hayward</property>
+ <property name="type"></property>
+ <property name="sharedType"></property>
+ <property name="sharedPriority"></property>
+ <property name="sharedEquipmentSystemID"></property>
+ <property name="supportsSpillover"></property>
+ <property name="sizeInGallons"></property>
+
</properties>
<representation-property>systemID</representation-property>
</channels>
<properties>
- <property name="Vendor">Hayward</property>
+ <property name="vendor">Hayward</property>
+ <property name="chlorSharedType"></property>
+ <property name="chlorMode"></property>
+ <property name="cellType"></property>
+ <property name="dispenserType"></property>
</properties>
<representation-property>systemID</representation-property>
</channels>
<properties>
- <property name="Vendor">Hayward</property>
+ <property name="vendor">Hayward</property>
+ <property name="colorlogicType"></property>
</properties>
<representation-property>systemID</representation-property>
<channels>
<channel id="filterEnable" typeId="system.power"/>
<channel id="filterValvePosition" typeId="valvePosition"/>
- <channel id="filterSpeed" typeId="filterSpeed"/>
+ <channel id="filterSpeedPercent" typeId="filterSpeedPercent"/>
+ <channel id="filterSpeedRpm" typeId="filterSpeedRpm"/>
+ <channel id="filterSpeedSelect" typeId="filterSpeedSelect"/>
<channel id="filterState" typeId="filterState"/>
<channel id="filterLastSpeed" typeId="filterLastSpeed"/>
</channels>
<properties>
- <property name="Vendor">Hayward</property>
- <property name="Min Pump Percent"></property>
- <property name="Max Pump Percent"></property>
- <property name="Min Pump RPM"></property>
- <property name="Max Pump RPM"></property>
+ <property name="vendor">Hayward</property>
+ <property name="filterSharedType"></property>
+ <property name="filterType"></property>
+ <property name="primingEnabled"></property>
+ <property name="minFilterPercent"></property>
+ <property name="maxFilterPercent"></property>
+ <property name="minFilterRPM"></property>
+ <property name="maxFilterRPM"></property>
+ <property name="lowFilterSpeed"></property>
+ <property name="mediumFilterSpeed"></property>
+ <property name="highFilterSpeed"></property>
+ <property name="customFilterSpeed"></property>
+ <property name="freezeProtectOverrideInterval"></property>
</properties>
<representation-property>systemID</representation-property>
</state>
</channel-type>
- <channel-type id="filterSpeed">
+ <channel-type id="filterSpeedPercent">
<item-type>Number:Dimensionless</item-type>
- <label>Filter Speed</label>
- <description>Filter Speed in %</description>
- <state min="0" max="100" step="1.0" pattern="%d %unit%" readOnly="false"/>
+ <label>Filter Speed %</label>
+ <description>Filter Speed (%)</description>
+ <state min="0" max="100" step="5" pattern="%d %unit%" readOnly="false"/>
+ </channel-type>
+
+ <channel-type id="filterSpeedRpm">
+ <item-type>Number</item-type>
+ <label>Filter Speed RPM</label>
+ <description>Filter Speed (RPM)</description>
+ <state min="0" max="3600" step="200" pattern="%d" readOnly="false"/>
+ </channel-type>
+
+ <channel-type id="filterSpeedSelect">
+ <item-type>String</item-type>
+ <label>Filter Speed States</label>
+ <description>Filter Speed States</description>
+ <state readOnly="false">
+ <options>
+ <option value="0">Off</option>
+ <option value="33">Low</option>
+ <option value="66">Medium</option>
+ <option value="100">High</option>
+ <option value="100">Custom</option>
+ </options>
+ </state>
</channel-type>
<channel-type id="filterState">
<channel-type id="filterLastSpeed">
<item-type>Number:Dimensionless</item-type>
<label>Last Speed</label>
- <description>Last Speed</description>
+ <description>Last Speed (%)</description>
<state pattern="%d %unit%" readOnly="true"/>
</channel-type>
</channels>
<properties>
- <property name="Vendor">Hayward</property>
+ <property name="vendor">Hayward</property>
+ <property name="type"></property>
+ <property name="heaterType"></property>
+ <property name="sharedEquipmentSystemID"></property>
</properties>
<representation-property>systemID</representation-property>
</thing-type>
<channel-type id="state">
- <item-type>Number</item-type>
+ <item-type>String</item-type>
<label>Heater State</label>
<description>Heater State</description>
- <state readOnly="true"/>
+ <state readOnly="true">
+ <options>
+ <option value="0">Off</option>
+ <option value="1">Heating</option>
+ <option value="2">Paused</option>
+ </options>
+ </state>
</channel-type>
<channel-type id="enable">
<description>Pump</description>
<channels>
<channel id="pumpEnable" typeId="system.power"/>
- <channel id="pumpSpeed" typeId="pumpSpeed"/>
+ <channel id="pumpSpeedPercent" typeId="pumpSpeedPercent"/>
+ <channel id="pumpSpeedRpm" typeId="pumpSpeedRpm"/>
+ <channel id="pumpSpeedSelect" typeId="pumpSpeedSelect"/>
+ <channel id="pumpState" typeId="pumpState"/>
+ <channel id="pumpLastSpeed" typeId="pumpLastSpeed"/>
</channels>
<properties>
- <property name="Vendor">Hayward</property>
- <property name="Min Pump Percent"></property>
- <property name="Max Pump Percent"></property>
- <property name="Min Pump RPM"></property>
- <property name="Max Pump RPM"></property>
+ <property name="vendor">Hayward</property>
+ <property name="pumpType"></property>
+ <property name="pumpFunction"></property>
+ <property name="pumpPrimingEnabled"></property>
+ <property name="minPumpPercent"></property>
+ <property name="maxPumpPercent"></property>
+ <property name="minPumpRPM"></property>
+ <property name="maxPumpRPM"></property>
+ <property name="lowPumpSpeed"></property>
+ <property name="mediumPumpSpeed"></property>
+ <property name="highPumpSpeed"></property>
+ <property name="customPumpSpeed"></property>
</properties>
<representation-property>systemID</representation-property>
</thing-type>
- <channel-type id="pumpSpeed">
+ <channel-type id="pumpSpeedPercent">
<item-type>Number:Dimensionless</item-type>
- <label>Pump Speed in %</label>
- <description>Pump Speed</description>
- <state min="0" max="100" step="1.0" pattern="%d %unit%" readOnly="false"/>
+ <label>Pump Speed %</label>
+ <description>Pump Speed (%)</description>
+ <state min="0" max="100" step="1" pattern="%d %unit%" readOnly="false"/>
+ </channel-type>
+
+ <channel-type id="pumpSpeedRpm">
+ <item-type>Number:Dimensionless</item-type>
+ <label>Pump Speed RPM</label>
+ <description>Pump Speed (RPM)</description>
+ <state min="0" max="3600" step="200" pattern="%d" readOnly="false"/>
+ </channel-type>
+
+ <channel-type id="pumpSpeedSelect">
+ <item-type>String</item-type>
+ <label>Pump Speed States</label>
+ <description>Pump Speed States</description>
+ <state readOnly="false">
+ <options>
+ <option value="0">Off</option>
+ <option value="33">Low</option>
+ <option value="66">Medium</option>
+ <option value="100">High</option>
+ <option value="100">Custom</option>
+ </options>
+ </state>
+ </channel-type>
+
+ <channel-type id="pumpState">
+ <item-type>String</item-type>
+ <label>Pump State</label>
+ <description>Pump State</description>
+ <state readOnly="true">
+ <options>
+ <option value="0">Off</option>
+ <option value="1">Running</option>
+ <option value="2">Priming</option>
+ <option value="3">Waiting to Turn Off</option>
+ <option value="4">Waiting to Turn Off Manual</option>
+ <option value="5">Heater Extend</option>
+ <option value="6">Heater Cool Down</option>
+ <option value="7">Suspended</option>
+ <option value="8">CSAD Extend</option>
+ <option value="9">Superchlorinate</option>
+ <option value="10">Force Priming</option>
+ <option value="11">Waiting for Pump to Turn Off</option>
+ </options>
+ </state>
+ </channel-type>
+
+ <channel-type id="pumpLastSpeed">
+ <item-type>Number:Dimensionless</item-type>
+ <label>Last Speed</label>
+ <description>Last Speed (%)</description>
+ <state pattern="%d %unit%" readOnly="true"/>
</channel-type>
</thing:thing-descriptions>
</channels>
<properties>
- <property name="Vendor">Hayward</property>
+ <property name="vendor">Hayward</property>
+ <property name="relayType"></property>
+ <property name="relayFunction"></property>
</properties>
<representation-property>systemID</representation-property>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<thing:thing-descriptions bindingId="haywardomnilogic"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0"
- xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd">
-
- <thing-type id="sensor" listed="false">
- <supported-bridge-type-refs>
- <bridge-type-ref id="bridge"/>
- </supported-bridge-type-refs>
-
- <label>Sensor</label>
- <description>Sensor</description>
- <channels>
- <channel id="sensorData" typeId="data"/>
- </channels>
-
- <properties>
- <property name="Vendor">Hayward</property>
- </properties>
- <representation-property>systemID</representation-property>
-
- </thing-type>
-
- <channel-type id="bow">
- <item-type>Number</item-type>
- <label>Body of Water</label>
- <description>The Body of Water ID</description>
- <state readOnly="true"/>
- </channel-type>
-
- <channel-type id="data">
- <item-type>Number</item-type>
- <label>Data</label>
- <description>Sensor Data</description>
- <state readOnly="true"/>
- </channel-type>
-
-</thing:thing-descriptions>
</channels>
<properties>
- <property name="Vendor">Hayward</property>
+ <property name="vendor">Hayward</property>
+ <property name="sharedType"></property>
+ <property name="minSettableWaterTemp"></property>
+ <property name="maxSettableWaterTemp"></property>
+ <property name="maxWaterTemp"></property>
</properties>
<representation-property>systemID</representation-property>
</thing-type>