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.sensibo.internal.model;
15 import java.util.Arrays;
16 import java.util.Collections;
17 import java.util.HashMap;
18 import java.util.List;
20 import java.util.Optional;
22 import javax.measure.Unit;
23 import javax.measure.quantity.Temperature;
25 import org.apache.commons.lang3.StringUtils;
26 import org.eclipse.jdt.annotation.NonNullByDefault;
27 import org.openhab.binding.sensibo.internal.SensiboTemperatureUnitConverter;
28 import org.openhab.binding.sensibo.internal.dto.poddetails.ModeCapabilityDTO;
29 import org.openhab.binding.sensibo.internal.dto.poddetails.PodDetailsDTO;
30 import org.openhab.binding.sensibo.internal.dto.poddetails.TemperatureDTO;
31 import org.openhab.core.thing.Thing;
34 * The {@link SensiboSky} represents a Sensibo Sky unit
36 * @author Arne Seime - Initial contribution
39 public class SensiboSky extends Pod {
40 private final String macAddress;
41 private final String firmwareVersion;
42 private final String firmwareType;
43 private final String serialNumber;
44 private final String productModel;
45 private final String roomName;
46 private final Unit<Temperature> temperatureUnit;
47 private final String originalTemperatureUnit;
48 private final Double temperature;
49 private final Double humidity;
50 private final boolean alive;
51 private final Map<String, ModeCapabilityDTO> remoteCapabilities;
52 private Schedule[] schedules = new Schedule[0];
53 private Optional<AcState> acState = Optional.empty();
54 private Optional<Timer> timer = Optional.empty();
56 public SensiboSky(final PodDetailsDTO dto) {
58 this.macAddress = StringUtils.remove(dto.macAddress, ':');
59 this.firmwareVersion = dto.firmwareVersion;
60 this.firmwareType = dto.firmwareType;
61 this.serialNumber = dto.serialNumber;
62 this.originalTemperatureUnit = dto.temperatureUnit;
63 this.temperatureUnit = SensiboTemperatureUnitConverter.parseFromSensiboFormat(dto.temperatureUnit);
64 this.productModel = dto.productModel;
66 if (dto.acState != null) {
67 this.acState = Optional.of(new AcState(dto.acState));
70 if (dto.timer != null) {
71 this.timer = Optional.of(new Timer(dto.timer));
74 this.temperature = dto.lastMeasurement.temperature;
75 this.humidity = dto.lastMeasurement.humidity;
77 this.alive = dto.isAlive();
78 if (dto.getRemoteCapabilities() != null) {
79 this.remoteCapabilities = dto.getRemoteCapabilities();
81 this.remoteCapabilities = new HashMap<>();
83 this.roomName = dto.getRoomName();
85 if (dto.schedules != null) {
86 schedules = Arrays.stream(dto.schedules).map(Schedule::new).toArray(Schedule[]::new);
90 public String getOriginalTemperatureUnit() {
91 return originalTemperatureUnit;
94 public String getRoomName() {
98 public Schedule[] getSchedules() {
102 public String getMacAddress() {
106 public String getFirmwareVersion() {
107 return firmwareVersion;
110 public String getFirmwareType() {
114 public String getSerialNumber() {
118 public Unit<Temperature> getTemperatureUnit() {
119 return temperatureUnit;
122 public String getProductModel() {
126 public Optional<AcState> getAcState() {
130 public String getProductName() {
131 switch (productModel) {
133 return String.format("Sensibo Sky %s", roomName);
135 return String.format("%s %s", productModel, roomName);
139 public Double getTemperature() {
143 public Double getHumidity() {
147 public boolean isAlive() {
151 public Map<String, ModeCapabilityDTO> getRemoteCapabilities() {
152 return remoteCapabilities;
155 public Optional<ModeCapabilityDTO> getCurrentModeCapabilities() {
156 if (acState.isPresent() && acState.get().getMode() != null) {
157 return Optional.ofNullable(remoteCapabilities.get(acState.get().getMode()));
159 return Optional.empty();
163 public List<Integer> getTargetTemperatures() {
164 Optional<ModeCapabilityDTO> currentModeCapabilities = getCurrentModeCapabilities();
165 if (currentModeCapabilities.isPresent()) {
166 TemperatureDTO selectedTemperatureRange = currentModeCapabilities.get().temperatures
167 .get(originalTemperatureUnit);
168 if (selectedTemperatureRange != null) {
169 return selectedTemperatureRange.validValues;
172 return Collections.emptyList();
176 * @param newAcState an updated ac state
178 public void updateAcState(AcState newAcState) {
179 this.acState = Optional.of(newAcState);
182 public Optional<Timer> getTimer() {
186 public Map<String, String> getThingProperties() {
187 final Map<String, String> properties = new HashMap<>();
188 properties.put(Thing.PROPERTY_VENDOR, "Sensibo");
189 properties.put("podId", id);
190 properties.put(Thing.PROPERTY_MAC_ADDRESS, macAddress);
191 properties.put(Thing.PROPERTY_SERIAL_NUMBER, serialNumber);
192 properties.put(Thing.PROPERTY_MODEL_ID, productModel);
193 properties.put(Thing.PROPERTY_FIRMWARE_VERSION, firmwareVersion);
194 properties.put("firmwareType", firmwareType);