2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.gardena.internal.model.dto;
15 import static org.openhab.binding.gardena.internal.GardenaBindingConstants.*;
17 import java.util.Date;
19 import org.openhab.binding.gardena.internal.exception.GardenaException;
20 import org.openhab.binding.gardena.internal.model.dto.api.CommonService;
21 import org.openhab.binding.gardena.internal.model.dto.api.CommonServiceDataItem;
22 import org.openhab.binding.gardena.internal.model.dto.api.DataItem;
23 import org.openhab.binding.gardena.internal.model.dto.api.DeviceDataItem;
24 import org.openhab.binding.gardena.internal.model.dto.api.Location;
25 import org.openhab.binding.gardena.internal.model.dto.api.LocationDataItem;
26 import org.openhab.binding.gardena.internal.model.dto.api.MowerServiceDataItem;
27 import org.openhab.binding.gardena.internal.model.dto.api.PowerSocketServiceDataItem;
28 import org.openhab.binding.gardena.internal.model.dto.api.SensorServiceDataItem;
29 import org.openhab.binding.gardena.internal.model.dto.api.ValveServiceDataItem;
30 import org.openhab.binding.gardena.internal.model.dto.api.ValveSetServiceDataItem;
31 import org.openhab.binding.gardena.internal.util.StringUtils;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
36 * Represents a Gardena device.
38 * @author Gerhard Riegler - Initial contribution
41 private final Logger logger = LoggerFactory.getLogger(Device.class);
43 private static final transient String DEVICE_TYPE_PREFIX = "gardena smart";
44 public boolean active = true;
46 public String deviceType;
47 public String location;
48 public CommonServiceDataItem common;
49 public MowerServiceDataItem mower;
50 public PowerSocketServiceDataItem powerSocket;
51 public SensorServiceDataItem sensor;
52 public ValveServiceDataItem valve;
53 public ValveServiceDataItem valveOne;
54 public ValveServiceDataItem valveTwo;
55 public ValveServiceDataItem valveThree;
56 public ValveServiceDataItem valveFour;
57 public ValveServiceDataItem valveFive;
58 public ValveServiceDataItem valveSix;
59 public ValveSetServiceDataItem valveSet;
61 public Device(String id) {
66 * Evaluates the device type.
68 public void evaluateDeviceType() {
69 if (deviceType == null) {
70 CommonService commonServiceAttributes = common.attributes;
71 if (commonServiceAttributes != null
72 && commonServiceAttributes.modelType.value.toLowerCase().startsWith(DEVICE_TYPE_PREFIX)) {
73 String modelType = commonServiceAttributes.modelType.value.toLowerCase();
74 modelType = modelType.substring(14);
75 deviceType = modelType.replace(" ", "_");
77 // workaround: we have to guess the device type, valves cannot be identified if modeType is wrong
79 deviceType = DEVICE_TYPE_MOWER;
80 } else if (powerSocket != null) {
81 deviceType = DEVICE_TYPE_POWER;
82 } else if (sensor != null) {
83 deviceType = DEVICE_TYPE_SENSOR;
86 if (deviceType == null) {
87 logger.warn("Can't identify device with id {}, wrong modelType sent from the Gardena API", id);
94 * Assigns the dataItem to the corresponding property.
96 public void setDataItem(DataItem<?> dataItem) throws GardenaException {
97 if (dataItem instanceof DeviceDataItem) {
99 } else if (dataItem instanceof LocationDataItem locationDataItem) {
100 Location locationAttributes = locationDataItem.attributes;
101 if (locationAttributes != null) {
102 location = locationAttributes.name;
104 } else if (dataItem instanceof CommonServiceDataItem commonServiceItem) {
105 common = commonServiceItem;
106 } else if (dataItem instanceof MowerServiceDataItem mowerServiceItemm) {
107 mower = mowerServiceItemm;
108 } else if (dataItem instanceof PowerSocketServiceDataItem powerSocketItem) {
109 powerSocket = powerSocketItem;
110 } else if (dataItem instanceof SensorServiceDataItem sensorServiceItem) {
111 sensor = sensorServiceItem;
112 } else if (dataItem instanceof ValveSetServiceDataItem valveSetServiceItem) {
113 valveSet = valveSetServiceItem;
114 } else if (dataItem instanceof ValveServiceDataItem valveServiceItem) {
115 String valveNumber = StringUtils.substringAfterLast(dataItem.id, ":");
116 if ("".equals(valveNumber) || "wc".equals(valveNumber) || "0".equals(valveNumber)) {
117 valve = valveServiceItem;
118 } else if ("1".equals(valveNumber)) {
119 valveOne = valveServiceItem;
120 } else if ("2".equals(valveNumber)) {
121 valveTwo = valveServiceItem;
122 } else if ("3".equals(valveNumber)) {
123 valveThree = valveServiceItem;
124 } else if ("4".equals(valveNumber)) {
125 valveFour = valveServiceItem;
126 } else if ("5".equals(valveNumber)) {
127 valveFive = valveServiceItem;
128 } else if ("6".equals(valveNumber)) {
129 valveSix = valveServiceItem;
131 throw new GardenaException("Unknown valveNumber in dataItem with id: " + dataItem.id);
134 throw new GardenaException("Unknown dataItem with id: " + dataItem.id);
137 if (common != null) {
138 CommonService attributes = common.attributes;
139 if (attributes != null) {
140 attributes.lastUpdate.timestamp = new Date();
142 common.attributes = attributes;
147 public int hashCode() {
148 return id.hashCode();
152 public boolean equals(Object obj) {
153 if (obj == null || !(obj instanceof Device)) {
156 Device comp = (Device) obj;
157 return comp.id.equals(id);