]> git.basschouten.com Git - openhab-addons.git/blob
244540a289c780d18a5347228d0faefbb7a40ab8
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.gardena.internal.model.dto;
14
15 import static org.openhab.binding.gardena.internal.GardenaBindingConstants.*;
16
17 import java.util.Date;
18
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;
34
35 /**
36  * Represents a Gardena device.
37  *
38  * @author Gerhard Riegler - Initial contribution
39  */
40 public class Device {
41     private final Logger logger = LoggerFactory.getLogger(Device.class);
42
43     private static final transient String DEVICE_TYPE_PREFIX = "gardena smart";
44     public boolean active = true;
45     public String id;
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;
60
61     public Device(String id) {
62         this.id = id;
63     }
64
65     /**
66      * Evaluates the device type.
67      */
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(" ", "_");
76             } else {
77                 // workaround: we have to guess the device type, valves cannot be identified if modeType is wrong
78                 if (mower != null) {
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;
84                 }
85             }
86             if (deviceType == null) {
87                 logger.warn("Can't identify device with id {}, wrong modelType sent from the Gardena API", id);
88                 active = false;
89             }
90         }
91     }
92
93     /**
94      * Assigns the dataItem to the corresponding property.
95      */
96     public void setDataItem(DataItem<?> dataItem) throws GardenaException {
97         if (dataItem instanceof DeviceDataItem) {
98             // ignore
99         } else if (dataItem instanceof LocationDataItem locationDataItem) {
100             Location locationAttributes = locationDataItem.attributes;
101             if (locationAttributes != null) {
102                 location = locationAttributes.name;
103             }
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;
130             } else {
131                 throw new GardenaException("Unknown valveNumber in dataItem with id: " + dataItem.id);
132             }
133         } else {
134             throw new GardenaException("Unknown dataItem with id: " + dataItem.id);
135         }
136
137         if (common != null) {
138             CommonService attributes = common.attributes;
139             if (attributes != null) {
140                 attributes.lastUpdate.timestamp = new Date();
141             }
142             common.attributes = attributes;
143         }
144     }
145
146     @Override
147     public int hashCode() {
148         return id.hashCode();
149     }
150
151     @Override
152     public boolean equals(Object obj) {
153         if (obj == null || !(obj instanceof Device)) {
154             return false;
155         }
156         Device comp = (Device) obj;
157         return comp.id.equals(id);
158     }
159 }