]> git.basschouten.com Git - openhab-addons.git/commitdiff
[miio] Save last msgId and misc minor updates (#11464)
authorMarcel <marcel@verpaalen.com>
Sat, 30 Oct 2021 16:07:47 +0000 (18:07 +0200)
committerGitHub <noreply@github.com>
Sat, 30 Oct 2021 16:07:47 +0000 (18:07 +0200)
Signed-off-by: Marcel Verpaalen <marcel@verpaalen.com>
bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/MiIoCommand.java
bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/MiIoQuantiyTypes.java
bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/SavedDeviceInfoDTO.java [new file with mode: 0644]
bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/Utils.java
bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/basic/CommandParameterType.java
bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/cloud/CloudConnector.java
bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/cloud/MiCloudConnector.java
bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/handler/MiIoAbstractHandler.java

index f16df318f268d1d00876f689fc8c04dbd2b23a7d..b65294a91100f51f6d0a11f3d67ced5b8d9d7fa3 100644 (file)
@@ -30,6 +30,8 @@ public enum MiIoCommand {
     // Basic device commands
     GET_PROPERTY("get_prop"),
     GET_PROPERTIES("get_properties"),
+    GET_DEVICE_PROPERTY_EXP("get_device_prop_exp"),
+    GET_DEVICE_PROPERTY("get_device_prop"),
     GET_VALUE("get_value"),
     SET_PROPERTIES("set_properties"),
     SET_MODE_BASIC("set_mode"),
index 2cea22614a416b8fd53003eac7c80e340648fd5d..8cb3291d882f3c77a58fdf1844449b945f632895 100644 (file)
@@ -12,7 +12,7 @@
  */
 package org.openhab.binding.miio.internal;
 
-import static org.openhab.core.library.unit.MetricPrefix.MILLI;
+import static org.openhab.core.library.unit.MetricPrefix.*;
 
 import java.util.Arrays;
 import java.util.HashMap;
@@ -39,7 +39,8 @@ public enum MiIoQuantiyTypes {
     CELSIUS(SIUnits.CELSIUS, "C", "celcius"),
     FAHRENHEIT(ImperialUnits.FAHRENHEIT),
     KELVIN(Units.KELVIN, "K"),
-    PASCAL(SIUnits.PASCAL),
+    PASCAL(SIUnits.PASCAL, "pa"),
+    HPA(HECTO(SIUnits.PASCAL)),
     SECOND(Units.SECOND, "seconds"),
     MINUTE(Units.MINUTE, "minutes"),
     HOUR(Units.HOUR, "hours"),
diff --git a/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/SavedDeviceInfoDTO.java b/bundles/org.openhab.binding.miio/src/main/java/org/openhab/binding/miio/internal/SavedDeviceInfoDTO.java
new file mode 100644 (file)
index 0000000..4e580f6
--- /dev/null
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2010-2021 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.miio.internal;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+
+import com.google.gson.annotations.Expose;
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Storing last id to to be able to reconnect better after binding restart
+ *
+ * @author Marcel Verpaalen - Initial contribution
+ */
+@NonNullByDefault
+public class SavedDeviceInfoDTO {
+
+    @SerializedName("lastId")
+    @Expose
+    private int lastId = 0;
+    @SerializedName("deviceId")
+    @Expose
+    private String deviceId;
+
+    public SavedDeviceInfoDTO(int lastId, String deviceId) {
+        super();
+        this.lastId = lastId;
+        this.deviceId = deviceId;
+    }
+
+    public int getLastId() {
+        return lastId;
+    }
+
+    public void setLastId(int lastId) {
+        this.lastId = lastId;
+    }
+
+    public String getDeviceId() {
+        return deviceId;
+    }
+
+    public void setDeviceId(String deviceId) {
+        this.deviceId = deviceId;
+    }
+}
index bb7ec557cce7316d68fbf8cb9367119c4aae8c6f..95285888bad99f6133923f57e73e0866cfae2b19 100644 (file)
  */
 package org.openhab.binding.miio.internal;
 
+import static org.openhab.binding.miio.internal.MiIoBindingConstants.BINDING_USERDATA_PATH;
+
+import java.io.File;
+import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -21,6 +25,7 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.NoSuchFileException;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.slf4j.Logger;
 
 import com.google.gson.JsonElement;
 import com.google.gson.JsonIOException;
@@ -106,6 +111,27 @@ public final class Utils {
         }
     }
 
+    /**
+     * Saves string to file in userdata folder
+     *
+     * @param filename
+     * @param string with content
+     * @param logger
+     */
+    public static void saveToFile(String filename, String data, Logger logger) {
+        File folder = new File(BINDING_USERDATA_PATH);
+        if (!folder.exists()) {
+            folder.mkdirs();
+        }
+        File dataFile = new File(folder, filename);
+        try (FileWriter writer = new FileWriter(dataFile)) {
+            writer.write(data);
+            logger.debug("Saved to {}", dataFile.getAbsolutePath());
+        } catch (IOException e) {
+            logger.debug("Failed to write file '{}': {}", dataFile.getName(), e.getMessage());
+        }
+    }
+
     public static String minLengthString(String string, int length) {
         return String.format("%-" + length + "s", string);
     }
index 7a379a581dda9a84230247a25c9468885548def8..d448011d8af72472b899737e52daac8e7b10da33 100644 (file)
@@ -28,6 +28,8 @@ public enum CommandParameterType {
     ONOFFBOOL("onoffbool"),
     ONOFFBOOLSTRING("onoffboolstring"),
     ONOFFNUMBER("onoffnumber"),
+    OPENCLOSENUMBER("openclosenumber"),
+    OPENCLOSE("openclose"),
     STRING("string"),
     CUSTOMSTRING("customstring"),
     NUMBER("number"),
index 137c65774a1a6ab0dc3222059ff79ae2bfcfbd33..dab457b235ed6bbba3595c0c93b3d950c881f8f4 100644 (file)
@@ -136,7 +136,7 @@ public class CloudConnector {
         if (cl == null || !isConnected()) {
             throw new MiCloudException("Cannot execute request. Cloud service not available");
         }
-        return cl.request(urlPart, country, parameters);
+        return cl.request(urlPart.startsWith("/") ? urlPart : "/" + urlPart, country, parameters);
     }
 
     public @Nullable RawType getMap(String mapId, String country) throws MiCloudException {
index 38fb7143e02c78c5a26266282bf96260c9f1425f..7fe9140e788f9996c5afa1e6411f8ad502ed8122 100644 (file)
@@ -237,7 +237,7 @@ public class MiCloudConnector {
     public String getDeviceString(String country) {
         String resp;
         try {
-            resp = request("/home/device_list_page", country, "{\"getVirtualModel\":false,\"getHuamiDevices\":1}");
+            resp = request("/home/device_list_page", country, "{\"getVirtualModel\":true,\"getHuamiDevices\":1}");
             logger.trace("Get devices response: {}", resp);
             if (resp.length() > 2) {
                 CloudUtil.saveDeviceInfoFile(resp, country, logger);
index 2dcf5d54e3a0e529b1b237457f6a5d481e79aa6d..f2034f0eb375b4270eb4f6180e36c8f23fb7b9f7 100644 (file)
@@ -14,8 +14,11 @@ package org.openhab.binding.miio.internal.handler;
 
 import static org.openhab.binding.miio.internal.MiIoBindingConstants.*;
 
+import java.io.File;
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.net.URISyntaxException;
+import java.net.URL;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.util.HashMap;
@@ -39,6 +42,7 @@ import org.openhab.binding.miio.internal.MiIoInfoApDTO;
 import org.openhab.binding.miio.internal.MiIoInfoDTO;
 import org.openhab.binding.miio.internal.MiIoMessageListener;
 import org.openhab.binding.miio.internal.MiIoSendCommand;
+import org.openhab.binding.miio.internal.SavedDeviceInfoDTO;
 import org.openhab.binding.miio.internal.Utils;
 import org.openhab.binding.miio.internal.basic.MiIoDatabaseWatchService;
 import org.openhab.binding.miio.internal.cloud.CloudConnector;
@@ -62,6 +66,7 @@ import org.slf4j.LoggerFactory;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
 import com.google.gson.JsonPrimitive;
 import com.google.gson.JsonSyntaxException;
 
@@ -158,6 +163,17 @@ public abstract class MiIoAbstractHandler extends BaseThingHandler implements Mi
         isIdentified = false;
         deviceVariables.put(TIMESTAMP, Instant.now().getEpochSecond());
         deviceVariables.put(PROPERTY_DID, configuration.deviceId);
+        try {
+            URL url = new File(BINDING_USERDATA_PATH, "info_" + getThing().getUID().getId() + ".json").toURI().toURL();
+            SavedDeviceInfoDTO lastIdInfo = GSON.fromJson(Utils.convertFileToJSON(url), SavedDeviceInfoDTO.class);
+            if (lastIdInfo != null) {
+                lastId = lastIdInfo.getLastId();
+                logger.debug("Last Id set to {} for {}", lastId, getThing().getUID());
+            }
+        } catch (JsonParseException | IOException | URISyntaxException e) {
+            logger.debug("Could not read last connection id for {} : {}", getThing().getUID(), e.getMessage());
+        }
+
         miIoScheduler.schedule(this::initializeData, 1, TimeUnit.SECONDS);
         int pollingPeriod = configuration.refreshInterval;
         if (pollingPeriod > 0) {
@@ -221,6 +237,11 @@ public abstract class MiIoAbstractHandler extends BaseThingHandler implements Mi
             this.miioCom = null;
         }
         miIoScheduler.shutdownNow();
+        logger.debug("Last Id saved for {}: {} -> {} ", getThing().getUID(), lastId,
+                GSON.toJson(new SavedDeviceInfoDTO(lastId,
+                        (String) deviceVariables.getOrDefault(PROPERTY_DID, getThing().getUID().getId()))));
+        Utils.saveToFile("info_" + getThing().getUID().getId() + ".json", GSON.toJson(new SavedDeviceInfoDTO(lastId,
+                (String) deviceVariables.getOrDefault(PROPERTY_DID, getThing().getUID().getId()))), logger);
     }
 
     protected int sendCommand(MiIoCommand command) {
@@ -237,13 +258,11 @@ public abstract class MiIoAbstractHandler extends BaseThingHandler implements Mi
 
     /**
      * This is used to execute arbitrary commands by sending to the commands channel. Command parameters to be added
-     * between
-     * [] brackets. This to allow for unimplemented commands to be executed (e.g. get detailed historical cleaning
-     * records)
+     * between [] brackets. This to allow for unimplemented commands to be executed
      *
      * @param commandString command to be executed
      * @param cloud server to be used or empty string for direct sending to the device
-     * @return vacuum response
+     * @return message id
      */
     protected int sendCommand(String commandString, String cloudServer) {
         String command = commandString.trim();
@@ -284,7 +303,7 @@ public abstract class MiIoAbstractHandler extends BaseThingHandler implements Mi
         return 0;
     }
 
-    String getCloudServer() {
+    public String getCloudServer() {
         // This can be improved in the future with additional / more advanced options like e.g. directFirst which would
         // use direct communications and in case of failures fall back to cloud communication. For now we keep it
         // simple and only have the option for cloud or direct.