/**
* 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.nest.internal.messages;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 Structure Java Bean represents a Nest structure.
*
* @see <a href="https://developer.nest.com/documentation/api-reference">API Reference</a>
* @author John Cocula
* @since 1.7.0
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class Structure extends AbstractMessagePart implements DataModelElement {
/**
* Describes the Structure state; see the Away Guide for more information.
*
* @see <a href="https://developer.nest.com/documentation/cloud/structure-guide">Structure state</a>
* @see <a href="https://developer.nest.com/documentation/cloud/away-guide">Away Guide</a>
* @see <a href="https://developer.nest.com/documentation/cloud/api-overview#away">API Overview</a>
*/
public static enum AwayState {
HOME("home"),
AWAY("away"),
AUTO_AWAY("auto-away"), // deprecated by Oct 2016 API update
UNKNOWN("unknown");
private final String state;
private AwayState(String state) {
this.state = state;
}
@JsonValue
public String value() {
return state;
}
@JsonCreator
public static AwayState forValue(String v) {
for (AwayState s : AwayState.values()) {
if (s.state.equals(v)) {
return s;
}
}
throw new IllegalArgumentException("Invalid state: " + v);
}
@Override
public String toString() {
return this.state;
}
}
public static class ETA {
String trip_id; // Unique identifier for this ETA instance
Date estimated_arrival_window_begin; // Beginning time of the estimated arrival window
Date estimated_arrival_window_end; // End time of the estimated arrival window
/**
* @return the trip_id
*/
@JsonProperty("trip_id")
public String getTrip_id() {
return this.trip_id;
}
/**
* @param trip_id
* the trip_id to set
*/
@JsonProperty("trip_id")
public void setTrip_id(String trip_id) {
this.trip_id = trip_id;
}
/**
* @return the estimated_arrival_window_begin
*/
@JsonProperty("estimated_arrival_window_begin")
public Date getEstimated_arrival_window_begin() {
return this.estimated_arrival_window_begin;
}
/**
* @param estimated_arrival_window_begin
* the estimated_arrival_window_begin to set
*/
@JsonProperty("estimated_arrival_window_begin")
public void setEstimated_arrival_window_begin(Date estimated_arrival_window_begin) {
this.estimated_arrival_window_begin = estimated_arrival_window_begin;
}
/**
* @return the estimated_arrival_window_end
*/
@JsonProperty("estimated_arrival_window_end")
public Date getEstimated_arrival_window_end() {
return this.estimated_arrival_window_end;
}
/**
* @param estimated_arrival_window_end
* the estimated_arrival_window_end to set
*/
@JsonProperty("estimated_arrival_window_end")
public void setEstimated_arrival_window_end(Date estimated_arrival_window_end) {
this.estimated_arrival_window_end = estimated_arrival_window_end;
}
}
private String structure_id;
@JsonProperty("thermostats")
private List<String> thermostat_id_list;
private Map<String, Thermostat> thermostats_by_name;
@JsonProperty("smoke_co_alarms")
private List<String> smoke_co_alarm_id_list;
private Map<String, SmokeCOAlarm> smoke_co_alarms_by_name;
@JsonProperty("cameras")
private List<String> camera_id_list;
private Map<String, Camera> cameras_by_name;
private AwayState away;
private String name;
private String country_code;
private String postal_code;
private Date peak_period_start_time;
private Date peak_period_end_time;
private String time_zone;
private ETA eta;
private Date eta_begin;
private Boolean rhr_enrollment;
private AlarmState co_alarm_state;
private AlarmState smoke_alarm_state;
public Structure(@JsonProperty("structure_id") String structure_id) {
this.structure_id = structure_id;
}
/**
* @return the structure_id
*/
@JsonProperty("structure_id")
public String getStructure_id() {
return this.structure_id;
}
/**
* @return the thermostats
*/
@JsonProperty("thermostats")
public List<String> getThermostat_id_list() {
return this.thermostat_id_list;
}
public Map<String, Thermostat> getThermostats() {
return this.thermostats_by_name;
}
public void setThermostats_by_name(Map<String, Thermostat> thermostats_by_name) {
this.thermostats_by_name = thermostats_by_name;
}
/**
* @return the smoke_co_alarms
*/
@JsonProperty("smoke_co_alarms")
public List<String> getSmoke_co_alarm_id_list() {
return this.smoke_co_alarm_id_list;
}
public Map<String, SmokeCOAlarm> getSmoke_co_alarms() {
return this.smoke_co_alarms_by_name;
}
public void setSmoke_co_alarms_by_name(Map<String, SmokeCOAlarm> smoke_co_alarms_by_name) {
this.smoke_co_alarms_by_name = smoke_co_alarms_by_name;
}
/**
* @return the cameras
*/
@JsonProperty("cameras")
public List<String> getCamera_id_list() {
return this.camera_id_list;
}
public Map<String, Camera> getCameras() {
return this.cameras_by_name;
}
public void setCameras_by_name(Map<String, Camera> cameras_by_name) {
this.cameras_by_name = cameras_by_name;
}
/**
* @return the away state
*/
@JsonProperty("away")
public AwayState getAway() {
return this.away;
}
/**
* @param away
* the away to set
*/
@JsonProperty("away")
public void setAway(AwayState away) {
this.away = away;
}
/**
* @return the name
*/
@JsonProperty("name")
public String getName() {
return this.name;
}
/**
* Set the structure name
*/
@JsonProperty("name")
public void setName(String name) {
this.name = name;
}
/**
* @return the country_code
*/
@JsonProperty("country_code")
public String getCountry_code() {
return this.country_code;
}
/**
* @return the postal_code
*/
@JsonProperty("postal_code")
public String getPostal_code() {
return this.postal_code;
}
/**
* @return the peak_period_start_time
*/
@JsonProperty("peak_period_start_time")
public Date getPeak_period_start_time() {
return this.peak_period_start_time;
}
/**
* @return the peak_period_end_time
*/
@JsonProperty("peak_period_end_time")
public Date getPeak_period_end_time() {
return this.peak_period_end_time;
}
/**
* @return the time_zone
*/
@JsonProperty("time_zone")
public String getTime_zone() {
return this.time_zone;
}
/**
* @return the eta
*/
@JsonProperty("eta")
public ETA getEta() {
return this.eta;
}
/**
* Set the eta.
*/
@JsonProperty("eta")
public void setEta(ETA eta) {
this.eta = eta;
}
/**
* Read the timestamp of the earliest expected time of arrival (eta). Used to trigger actions or events.
*/
@JsonProperty("eta_begin")
public Date getEta_begin() {
return eta_begin;
}
/**
* Rush Hour Rewards enrollment status.
*/
@JsonProperty("rhr_enrollment")
public Boolean getRhr_enrollment() {
return rhr_enrollment;
}
/**
* @return CO alarm status
*/
@JsonProperty("co_alarm_state")
public AlarmState getCo_alarm_state() {
return this.co_alarm_state;
}
/**
* @return Smoke alarm status
*/
@JsonProperty("smoke_alarm_state")
public AlarmState getSmoke_alarm_state() {
return this.smoke_alarm_state;
}
/**
* This method creates maps to device objects, using the list of device IDs that were deserialized from JSON.
*/
@Override
public void sync(DataModel dataModel) {
// Build named-based maps from ID-based maps
this.thermostats_by_name = new HashMap<String, Thermostat>();
if (this.thermostat_id_list != null) {
for (String id : this.thermostat_id_list) {
if (dataModel.getDevices() != null && dataModel.getDevices().getThermostats_by_id() != null) {
Thermostat th = dataModel.getDevices().getThermostats_by_id().get(id);
if (th != null) {
this.thermostats_by_name.put(th.getName(), th);
}
}
}
}
this.smoke_co_alarms_by_name = new HashMap<String, SmokeCOAlarm>();
if (this.smoke_co_alarm_id_list != null) {
for (String id : this.smoke_co_alarm_id_list) {
if (dataModel.getDevices() != null && dataModel.getDevices().getSmoke_co_alarms_by_id() != null) {
SmokeCOAlarm sm = dataModel.getDevices().getSmoke_co_alarms_by_id().get(id);
if (sm != null) {
this.smoke_co_alarms_by_name.put(sm.getName(), sm);
}
}
}
}
this.cameras_by_name = new HashMap<String, Camera>();
if (this.camera_id_list != null) {
for (String id : this.camera_id_list) {
if (dataModel.getDevices() != null && dataModel.getDevices().getCameras_by_id() != null) {
Camera cam = dataModel.getDevices().getCameras_by_id().get(id);
if (cam != null) {
this.cameras_by_name.put(cam.getName(), cam);
}
}
}
}
}
@Override
public String toString() {
final ToStringBuilder builder = createToStringBuilder();
builder.appendSuper(super.toString());
builder.append("structure_id", this.structure_id);
builder.append("thermostats", this.thermostat_id_list);
builder.append("smoke_co_alarms", this.smoke_co_alarm_id_list);
builder.append("cameras", this.camera_id_list);
builder.append("away", this.away);
builder.append("name", this.name);
builder.append("country_code", this.country_code);
builder.append("postal_code", this.postal_code);
builder.append("peak_period_start_time", this.peak_period_start_time);
builder.append("peak_period_end_time", this.peak_period_end_time);
builder.append("time_zone", this.time_zone);
builder.append("eta", this.eta);
builder.append("eta_begin", this.eta_begin);
builder.append("rhr_enrollment", this.rhr_enrollment);
builder.append("co_alarm_state", this.co_alarm_state);
builder.append("smoke_alarm_state", this.smoke_alarm_state);
return builder.toString();
}
}