]> git.basschouten.com Git - openhab-addons.git/commitdiff
[amazonechocontrol] HandlerThermostatController (#9212)
authorSven Killig <sven@killig.de>
Sat, 5 Dec 2020 16:20:17 +0000 (17:20 +0100)
committerGitHub <noreply@github.com>
Sat, 5 Dec 2020 16:20:17 +0000 (17:20 +0100)
* HandlerThermostatController

Signed-off-by: Sven Killig <sven@killig.de>
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/Constants.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerThermostatController.java [new file with mode: 0644]

index dcc16059f26a7a47096fd806568a44b18fdaeed9..e7287194ef29c2ce03e99fcaf2120b190e73e6c7 100644 (file)
@@ -40,7 +40,12 @@ import java.util.Objects;
 import java.util.Random;
 import java.util.Scanner;
 import java.util.Set;
-import java.util.concurrent.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.regex.Matcher;
@@ -102,11 +107,19 @@ import org.openhab.binding.amazonechocontrol.internal.jsons.JsonWakeWords.WakeWo
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonWebSiteCookie;
 import org.openhab.binding.amazonechocontrol.internal.jsons.SmartHomeBaseDevice;
 import org.openhab.core.common.ThreadPoolManager;
+import org.openhab.core.library.types.QuantityType;
+import org.openhab.core.library.unit.SIUnits;
 import org.openhab.core.util.HexUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.gson.*;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSyntaxException;
 
 /**
  * The {@link Connection} is responsible for the connection to the amazon server
@@ -1155,7 +1168,11 @@ public class Connection {
         JsonObject parameters = new JsonObject();
         parameters.addProperty("action", action);
         if (property != null) {
-            if (value instanceof Boolean) {
+            if (value instanceof QuantityType<?>) {
+                parameters.addProperty(property + ".value", ((QuantityType<?>) value).floatValue());
+                parameters.addProperty(property + ".scale",
+                        ((QuantityType<?>) value).getUnit().equals(SIUnits.CELSIUS) ? "celsius" : "fahrenheit");
+            } else if (value instanceof Boolean) {
                 parameters.addProperty(property, (boolean) value);
             } else if (value instanceof String) {
                 parameters.addProperty(property, (String) value);
index 8e18cf91465fe970d35ddd53568f666d7f5e07b7..8f227c26e482fc8aa6995f5fd9f03b6a6a849683 100644 (file)
@@ -36,6 +36,7 @@ public class Constants {
         HANDLER_FACTORY.put(HandlerSecurityPanelController.INTERFACE, HandlerSecurityPanelController::new);
         HANDLER_FACTORY.put(HandlerAcousticEventSensor.INTERFACE, HandlerAcousticEventSensor::new);
         HANDLER_FACTORY.put(HandlerTemperatureSensor.INTERFACE, HandlerTemperatureSensor::new);
+        HANDLER_FACTORY.put(HandlerThermostatController.INTERFACE, HandlerThermostatController::new);
         HANDLER_FACTORY.put(HandlerPercentageController.INTERFACE, HandlerPercentageController::new);
         HANDLER_FACTORY.put(HandlerPowerLevelController.INTERFACE, HandlerPowerLevelController::new);
     }
diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerThermostatController.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerThermostatController.java
new file mode 100644 (file)
index 0000000..3b97a09
--- /dev/null
@@ -0,0 +1,105 @@
+/**
+ * Copyright (c) 2010-2020 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amazonechocontrol.internal.smarthome;
+
+import static org.openhab.binding.amazonechocontrol.internal.smarthome.Constants.*;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Locale;
+
+import javax.measure.quantity.Temperature;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
+import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
+import org.openhab.core.library.types.QuantityType;
+import org.openhab.core.library.unit.ImperialUnits;
+import org.openhab.core.library.unit.SIUnits;
+import org.openhab.core.types.Command;
+import org.openhab.core.types.StateDescription;
+import org.openhab.core.types.UnDefType;
+
+import com.google.gson.JsonObject;
+
+/**
+ * The {@link HandlerThermostatController} is responsible for the Alexa.ThermostatControllerInterface
+ *
+ * @author Sven Killig - Initial contribution
+ */
+@NonNullByDefault
+public class HandlerThermostatController extends HandlerBase {
+    // Interface
+    public static final String INTERFACE = "Alexa.ThermostatController";
+    // Channel definitions
+    private static final ChannelInfo TARGET_SETPOINT = new ChannelInfo("targetSetpoint" /* propertyName */ ,
+            "targetSetpoint" /* ChannelId */, CHANNEL_TYPE_TEMPERATURE /* Channel Type */ ,
+            ITEM_TYPE_NUMBER_TEMPERATURE /* Item Type */);
+
+    @Override
+    public String[] getSupportedInterface() {
+        return new String[] { INTERFACE };
+    }
+
+    @Override
+    protected ChannelInfo @Nullable [] findChannelInfos(SmartHomeCapability capability, String property) {
+        if (TARGET_SETPOINT.propertyName.equals(property)) {
+            return new ChannelInfo[] { TARGET_SETPOINT };
+        }
+        return null;
+    }
+
+    @Override
+    public void updateChannels(String interfaceName, List<JsonObject> stateList, UpdateChannelResult result) {
+        QuantityType<Temperature> temperatureValue = null;
+        for (JsonObject state : stateList) {
+            if (TARGET_SETPOINT.propertyName.equals(state.get("name").getAsString())) {
+                JsonObject value = state.get("value").getAsJsonObject();
+                // For groups take the first
+                if (temperatureValue == null) {
+                    float temperature = value.get("value").getAsFloat();
+                    String scale = value.get("scale").getAsString().toUpperCase();
+                    if ("CELSIUS".equals(scale)) {
+                        temperatureValue = new QuantityType<Temperature>(temperature, SIUnits.CELSIUS);
+                    } else {
+                        temperatureValue = new QuantityType<Temperature>(temperature, ImperialUnits.FAHRENHEIT);
+                    }
+                }
+            }
+        }
+        updateState(TARGET_SETPOINT.channelId, temperatureValue == null ? UnDefType.UNDEF : temperatureValue);
+    }
+
+    @Override
+    public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
+            SmartHomeCapability[] capabilties, String channelId, Command command)
+            throws IOException, InterruptedException {
+        if (channelId.equals(TARGET_SETPOINT.channelId)) {
+            if (containsCapabilityProperty(capabilties, TARGET_SETPOINT.propertyName)) {
+                if (command instanceof QuantityType) {
+                    connection.smartHomeCommand(entityId, "setTargetTemperature", "targetTemperature", command);
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public @Nullable StateDescription findStateDescription(String channelId, StateDescription originalStateDescription,
+            @Nullable Locale locale) {
+        return null;
+    }
+}