/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.binding.ecobee.messages;
import static org.apache.commons.lang.StringUtils.join;
import java.util.Set;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.codehaus.jackson.annotate.JsonCreator;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.annotate.JsonValue;
/**
* The selection object defines the resources and information to return as part of a response. The selection is required
* in all requests however meaning of some selection fields is only meaningful to certain types of requests.
*
* <p>
* The <code>selectionType</code> parameter defines the type of selection to perform. The <code>selectionMatch</code>
* specifies the matching criteria for the type specified.
*
* <table>
* <tr>
* <td>Selection Type</td>
* <td>Account Type</td>
* <td>Selection Match Example</td>
* <td>Description</td>
* </tr>
* <tr>
* <td>registered</td>
* <td>Smart only.</td>
* <td>match is not used.</td>
* <td>When this is set the thermostats registered to the current user will be returned. This is only usable with Smart
* thermostats registered to a user. It does not work on EMS thermostats and may not be used by a Utility who is not the
* owner of thermostats.</td>
* </tr>
* <tr>
* <td>thermostats</td>
* <td>All accounts</td>
* <td>identifier1,identifier2,etc...</td>
* <td>Select only those thermostats listed in the CSV match criteria. No spaces in the CSV string. There is a limit of
* 25 identifiers per request.</td>
* </tr>
* <tr>
* <td>managementSet</td>
* <td>EMS/Utility only.</td>
* <td>/Toronto/Campus/BuildingA</td>
* <td>Selects all thermostats for a given management set defined by the Management/Utility account. This is only
* available to Management/Utility accounts. "/" is the root, represented by the "My Sets" set.</td>
* </tr>
* </table>
*
* @see <a href="https://www.ecobee.com/home/developer/api/documentation/v1/objects/Selection.shtml">Selection</a>
* @author John Cocula
* @author Ecobee
* @since 1.7.0
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class Selection extends AbstractMessagePart {
public static final String REGISTERED_WILDCARD = "*";
public static final String MANAGEMENT_SET_DELIMITER = "/";
private SelectionType selectionType;
private String selectionMatch;
private Boolean includeRuntime;
private Boolean includeExtendedRuntime;
private Boolean includeElectricity;
private Boolean includeSettings;
private Boolean includeLocation;
private Boolean includeProgram;
private Boolean includeEvents;
private Boolean includeDevice;
private Boolean includeTechnician;
private Boolean includeUtility;
private Boolean includeManagement;
private Boolean includeAlerts;
private Boolean includeWeather;
private Boolean includeHouseDetails;
private Boolean includeOemCfg;
private Boolean includeEquipmentStatus;
private Boolean includeNotificationSettings;
private Boolean includePrivacy;
private Boolean includeVersion;
private Boolean includeSensors;
/**
* The <code>SelectionType</code> defines the type of selection to perform.
*
* @see <a href="https://www.ecobee.com/home/developer/api/documentation/v1/objects/Selection.shtml">Selection
* Object</a>
* @author John Cocula
* @author Ecobee
*/
public static enum SelectionType {
/**
* No doc found.
*/
NONE("none"),
/**
* All accounts.
*
* <p>
* Select only those thermostats listed in the CSV match criteria. No spaces in the CSV string. There is a limit
* of 25 identifiers per request.
*/
THERMOSTATS("thermostats"),
/**
* Smart only.
*
* <p>
* When this is set the thermostats registered to the current user will be returned. This is only usable with
* Smart thermostats registered to a user. It does not work on EMS thermostats and may not be used by a Utility
* who is not the owner of thermostats.
*/
REGISTERED("registered"),
/**
* No doc found.
*/
USER("user"),
/**
* EMS/Utility only.
*
* <p>
* Selects all thermostats for a given management set defined by the Management/Utility account. This is only
* available to Management/Utility accounts. "/" is the root, represented by the "My Sets" set.
*/
MANAGEMENT_SET("managementSet");
private final String type;
private SelectionType(final String type) {
this.type = type;
}
@JsonCreator
public static SelectionType forValue(String v) {
for (SelectionType st : SelectionType.values()) {
if (st.type.equals(v)) {
return st;
}
}
throw new IllegalArgumentException("Invalid selection type: " + v);
}
@Override
@JsonValue
public String toString() {
return this.type;
}
}
/**
* Give a selectionMatch string, infer what kind of selectionType should be used.
*
* @param selectionMatch
* the match string to inspect
* @returns the selectionType to be used with the selectionMatch
*/
private SelectionType inferSelectionType(String selectionMatch) {
SelectionType selectionType;
if (REGISTERED_WILDCARD.equals(selectionMatch)) {
selectionType = SelectionType.REGISTERED;
} else if (selectionMatch.startsWith(MANAGEMENT_SET_DELIMITER)) {
selectionType = SelectionType.MANAGEMENT_SET;
} else {
selectionType = SelectionType.THERMOSTATS;
}
return selectionType;
}
/**
* Return <code>true</code> if the given string matches the known format for thermostat identifiers.
*
* @param thermostatIdentifier
* the string to test
* @return <code>true</code> if the given string matches the known format for thermostat identifiers.
*/
public static boolean isThermostatIdentifier(String thermostatIdentifier) {
return thermostatIdentifier.matches("[0-9]+");
}
/**
* Construct a Selection object using a single <code>selectionMatch</code>, and inferring the
* <code>selectionType</code> from the <code>selectionMatch</code>.
*
* @param selectionMatch
* based on the syntax, infer the selectionType
*/
public Selection(@JsonProperty("selectionMatch") final String selectionMatch) {
this.selectionType = inferSelectionType(selectionMatch);
this.selectionMatch = selectionMatch;
}
/**
* Construct a Selection object.
*
* @param selectionType
* the type of match data supplied.
* @param selectionMatch
*/
public Selection(@JsonProperty("selectionType") final SelectionType selectionType,
@JsonProperty("selectionMatch") final String selectionMatch) {
this.selectionType = selectionType;
this.selectionMatch = selectionMatch;
}
/**
* @return the type of match data supplied.
*/
@JsonProperty("selectionType")
public SelectionType getSelectionType() {
return this.selectionType;
}
/**
* @param selectionType
* the type of match data supplied.
*/
@JsonProperty("selectionType")
public void setSelectionType(final SelectionType selectionType) {
this.selectionType = selectionType;
}
/**
* @return the match data based on selectionType (e.g. a list of thermostat identifiers in the case of a
* selectionType of thermostats)
*/
@JsonProperty("selectionMatch")
public String getSelectionMatch() {
return this.selectionMatch;
}
/**
* @param selectionMatch
* the match data based on selectionType (e.g. a list of thermostat identifiers in the case of a
* <code>selectionType</code> of <code>"thermostats"</code>)
*/
@JsonProperty("selectionMatch")
public void setSelectionMatch(final String selectionMatch) {
this.selectionMatch = selectionMatch;
}
/**
* @param thermostatIdentifiers
* set a list of thermostat identifiers as the <code>selectionMatch</code> and set the
* <code>selectionType</code> to {@code SelectionType.THERMOSTATS}.
*/
public void setSelectionMatch(final Set<String> thermostatIdentifiers) {
this.selectionType = SelectionType.THERMOSTATS;
this.selectionMatch = join(thermostatIdentifiers, ',');
}
/**
* @return include the {@link Thermostat.Runtime} object. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeRuntime")
public Boolean getIncludeRuntime() {
return this.includeRuntime;
}
/**
* @return <code>true</code> if we would like runtime values returned from this Selection.
*/
public boolean includeRuntime() {
return (this.includeRuntime == null) ? false : this.includeRuntime;
}
/**
* @param includeRuntime
* include the thermostat {@link Thermostat.Runtime} object. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeRuntime")
public void setIncludeRuntime(final Boolean includeRuntime) {
this.includeRuntime = includeRuntime;
}
/**
* @return include the extended thermostat runtime object. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeExtendedRuntime")
public Boolean getIncludeExtendedRuntime() {
return this.includeExtendedRuntime;
}
/**
* @return <code>true</code> if we would like extended runtime values returned from this Selection.
*/
public boolean includeExtendedRuntime() {
return (this.includeExtendedRuntime == null) ? false : this.includeExtendedRuntime;
}
/**
* @param includeExtendedRuntime
* include the @{link Thermostat.ExtendedRuntime} object. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeExtendedRuntime")
public void setIncludeExtendedRuntime(final Boolean includeExtendedRuntime) {
this.includeExtendedRuntime = includeExtendedRuntime;
}
/**
* @return include the {@link Thermostat.Electricity} readings object. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeElectricity")
public Boolean getIncludeElectricity() {
return this.includeElectricity;
}
/**
* @return <code>true</code> if we would like electricity values returned from this Selection.
*/
public boolean includeElectricity() {
return (this.includeElectricity == null) ? false : this.includeElectricity;
}
/**
* @param includeElectricity
* include the {@link Thermostat.Electricity} readings object. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeElectricity")
public void setIncludeElectricity(final Boolean includeElectricity) {
this.includeElectricity = includeElectricity;
}
/**
* @return include the {@link Thermostat.Settings} object. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeSettings")
public Boolean getIncludeSettings() {
return this.includeSettings;
}
/**
* @return <code>true</code> if we would like settings values returned from this Selection.
*/
public boolean includeSettings() {
return (this.includeSettings == null) ? false : this.includeSettings;
}
/**
* @param includeSettings
* include the {@link Thermostat.Settings} object. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeSettings")
public void setIncludeSettings(final Boolean includeSettings) {
this.includeSettings = includeSettings;
}
/**
* @return include the {@link Thermostat.Location} object. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeLocation")
public Boolean getIncludeLocation() {
return this.includeLocation;
}
/**
* @return <code>true</code> if we would like location values returned from this Selection.
*/
public boolean includeLocation() {
return (this.includeLocation == null) ? false : this.includeLocation;
}
/**
* @param includeLocation
* include the {@link Thermostat.Location} object. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeLocation")
public void setIncludeLocation(final Boolean includeLocation) {
this.includeLocation = includeLocation;
}
/**
* @return include the {@link Thermostat.Program} object. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeProgram")
public Boolean getIncludeProgram() {
return this.includeProgram;
}
/**
* @return <code>true</code> if we would like program values returned from this Selection.
*/
public boolean includeProgram() {
return (this.includeProgram == null) ? false : this.includeProgram;
}
/**
* @param includeProgram
* include the {@link Thermostat.Program} object. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeProgram")
public void setIncludeProgram(final Boolean includeProgram) {
this.includeProgram = includeProgram;
}
/**
* @return include the {@link Thermostat.Event}s calendar objects. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeEvents")
public Boolean getIncludeEvents() {
return this.includeEvents;
}
/**
* @return <code>true</code> if we would like events returned from this Selection.
*/
public boolean includeEvents() {
return (this.includeEvents == null) ? false : this.includeEvents;
}
/**
* @param includeEvents
* include the {@link Thermostat.Event}s calendar objects. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeEvents")
public void setIncludeEvents(final Boolean includeEvents) {
this.includeEvents = includeEvents;
}
/**
* @return include the {@link Thermostat.Device} configuration objects. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeDevice")
public Boolean getIncludeDevice() {
return this.includeDevice;
}
/**
* @return <code>true</code> if we would like device values returned from this Selection.
*/
public boolean includeDevice() {
return (this.includeDevice == null) ? false : this.includeDevice;
}
/**
* @param includeDevice
* include the {@link Thermostat.Device} configuration objects. If not specified, defaults to false.
*/
@JsonProperty("includeDevice")
public void setIncludeDevice(final Boolean includeDevice) {
this.includeDevice = includeDevice;
}
/**
* @return include the {@link Thermostat.Technician} object. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeTechnician")
public Boolean getIncludeTechnician() {
return this.includeTechnician;
}
/**
* @return <code>true</code> if we would like technician values returned from this Selection.
*/
public boolean includeTechnician() {
return (this.includeTechnician == null) ? false : this.includeTechnician;
}
/**
* @param includeTechnician
* include the {@link Thermostat.Technician} object. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeTechnician")
public void setIncludeTechnician(final Boolean includeTechnician) {
this.includeTechnician = includeTechnician;
}
/**
* @return include the {@link Thermostat.Utility} company object. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeUtility")
public Boolean getIncludeUtility() {
return this.includeUtility;
}
/**
* @return <code>true</code> if we would like utility values returned from this Selection.
*/
public boolean includeUtility() {
return (this.includeUtility == null) ? false : this.includeUtility;
}
/**
* @param includeUtility
* include the {@link Thermostat.Utility} company object. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeUtility")
public void setIncludeUtility(final Boolean includeUtility) {
this.includeUtility = includeUtility;
}
/**
* @return include the {@link Thermostat.Management} company object. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeManagement")
public Boolean getIncludeManagement() {
return this.includeManagement;
}
/**
* @return <code>true</code> if we would like management values returned from this Selection.
*/
public boolean includeManagement() {
return (this.includeManagement == null) ? false : this.includeManagement;
}
/**
* @param includeManagement
* include the {@link Thermostat.Management} company object. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeManagement")
public void setIncludeManagement(final Boolean includeManagement) {
this.includeManagement = includeManagement;
}
/**
* @return include the unacknowledged {@link Thermostat.Alert} objects. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeAlerts")
public Boolean getIncludeAlerts() {
return this.includeAlerts;
}
/**
* @return <code>true</code> if we would like alerts returned from this Selection.
*/
public boolean includeAlerts() {
return (this.includeAlerts == null) ? false : this.includeAlerts;
}
/**
* @param includeAlerts
* include the unacknowledged {@link Thermostat.Alert} objects. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeAlerts")
public void setIncludeAlerts(final Boolean includeAlerts) {
this.includeAlerts = includeAlerts;
}
/**
* @return include the current {@link Thermostat.Weather} forecast object. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeWeather")
public Boolean getIncludeWeather() {
return this.includeWeather;
}
/**
* @return <code>true</code> if we would like weather returned from this Selection.
*/
public boolean includeWeather() {
return (this.includeWeather == null) ? false : this.includeWeather;
}
/**
* @param includeWeather
* include the current {@link Thermostat.Weather} forecast object. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeWeather")
public void setIncludeWeather(final Boolean includeWeather) {
this.includeWeather = includeWeather;
}
/**
* @return include the current {@link Thermostat.HouseDetails} object. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeHouseDetails")
public Boolean getIncludeHouseDetails() {
return this.includeHouseDetails;
}
/**
* @return <code>true</code> if we would like house details returned from this Selection.
*/
public boolean includeHouseDetails() {
return (this.includeHouseDetails == null) ? false : this.includeHouseDetails;
}
/**
* @param includeHouseDetails
* include the current {@link Thermostat.HouseDetails} object. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeHouseDetails")
public void setIncludeHouseDetails(final Boolean includeHouseDetails) {
this.includeHouseDetails = includeHouseDetails;
}
/**
* @return include the current thermostat OemCfg object. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeOemCfg")
public Boolean getIncludeOemCfg() {
return this.includeOemCfg;
}
/**
* @return <code>true</code> if we would like OemCfg values returned from this Selection.
*/
public boolean includeOemCfg() {
return (this.includeOemCfg == null) ? false : this.includeOemCfg;
}
/**
* @param includeOemCfg
* include the current thermostat OemCfg object. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeOemCfg")
public void setIncludeOemCfg(final Boolean includeOemCfg) {
this.includeOemCfg = includeOemCfg;
}
/**
* @return include the current thermostat equipment status information. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeEquipmentStatus")
public Boolean getIncludeEquipmentStatus() {
return this.includeEquipmentStatus;
}
/**
* @return <code>true</code> if we would like equipment status returned from this Selection.
*/
public boolean includeEquipmentStatus() {
return (this.includeEquipmentStatus == null) ? false : this.includeEquipmentStatus;
}
/**
* @param includeEquipmentStatus
* include the current thermostat equipment status information. If not specified, defaults to
* <code>false</code>.
*/
@JsonProperty("includeEquipmentStatus")
public void setIncludeEquipmentStatus(final Boolean includeEquipmentStatus) {
this.includeEquipmentStatus = includeEquipmentStatus;
}
/**
* @return include the current alert and reminders {@link Thermostat.NotificationSettings}. If not specified,
* defaults to <code>false</code>.
*/
@JsonProperty("includeNotificationSettings")
public Boolean getIncludeNotificationSettings() {
return this.includeNotificationSettings;
}
/**
* @return <code>true</code> if we would like notification settings returned from this Selection.
*/
public boolean includeNotificationSettings() {
return (this.includeNotificationSettings == null) ? false : this.includeNotificationSettings;
}
/**
* @param includeNotificationSettings
* include the current alert and reminders {@link Thermostat.NotificationSettings}. If not specified,
* defaults to <code>false</code>.
*/
@JsonProperty("includeNotificationSettings")
public void setIncludeNotificationSettings(final Boolean includeNotificationSettings) {
this.includeNotificationSettings = includeNotificationSettings;
}
/**
* @return include the current thermostat privacy settings. Note: access to this object is restricted to callers
* with implicit authentication, setting this value to true without proper credentials will result in an
* authentication exception.
*/
@JsonProperty("includePrivacy")
public Boolean getIncludePrivacy() {
return this.includePrivacy;
}
/**
* @return <code>true</code> if we would like privacy settings returned from this Selection.
*/
public boolean includePrivacy() {
return (this.includePrivacy == null) ? false : this.includePrivacy;
}
/**
* @param includePrivacy
* include the current thermostat privacy settings. Note: access to this object is restricted to callers
* with implicit authentication, setting this value to true without proper credentials will result in an
* authentication exception.
*/
@JsonProperty("includePrivacy")
public void setIncludePrivacy(final Boolean includePrivacy) {
this.includePrivacy = includePrivacy;
}
/**
* @return include the {@link Thermostat.Version}. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeVersion")
public Boolean getIncludeVersion() {
return this.includeVersion;
}
/**
* @return <code>true</code> if we would like version information returned from this Selection.
*/
public boolean includeVersion() {
return (this.includeVersion == null) ? false : this.includeVersion;
}
/**
* @param includeVersion
* include the {@link Thermostat.Version}. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeVersion")
public void setIncludeVersion(final Boolean includeVersion) {
this.includeVersion = includeVersion;
}
/**
* @return include the {@link Thermostat.RemoteSensor}s. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeSensors")
public Boolean getIncludeSensors() {
return this.includeSensors;
}
/**
* @return <code>true</code> if we would like remote sensor information returned from this Selection.
*/
public boolean includeSensors() {
return (this.includeSensors == null) ? false : this.includeSensors;
}
/**
* @param includeSensors
* include the {@link Thermostat.RemoteSensor}s. If not specified, defaults to <code>false</code>.
*/
@JsonProperty("includeSensors")
public void setIncludeSensors(final Boolean includeSensors) {
this.includeSensors = includeSensors;
}
@Override
public String toString() {
final ToStringBuilder builder = createToStringBuilder();
builder.appendSuper(super.toString());
builder.append("selectionType", this.selectionType);
builder.append("selectionMatch", this.selectionMatch);
builder.append("includeRuntime", this.includeRuntime);
builder.append("includeExtendedRuntime", this.includeExtendedRuntime);
builder.append("includeElectricity", this.includeElectricity);
builder.append("includeSettings", this.includeSettings);
builder.append("includeLocation", this.includeLocation);
builder.append("includeProgram", this.includeProgram);
builder.append("includeEvents", this.includeEvents);
builder.append("includeDevice", this.includeDevice);
builder.append("includeTechnician", this.includeTechnician);
builder.append("includeUtility", this.includeUtility);
builder.append("includeManagement", this.includeManagement);
builder.append("includeAlerts", this.includeAlerts);
builder.append("includeWeather", this.includeWeather);
builder.append("includeHouseDetails", this.includeHouseDetails);
builder.append("includeOemCfg", this.includeOemCfg);
builder.append("includeEquipmentStatus", this.includeEquipmentStatus);
builder.append("includeNotificationSettings", this.includeNotificationSettings);
builder.append("includePrivacy", this.includePrivacy);
builder.append("includeVersion", this.includeVersion);
builder.append("includeSensors", this.includeSensors);
return builder.toString();
}
}