]> git.basschouten.com Git - openhab-addons.git/commitdiff
[shelly] Various small fixes for BLU HT, Range Extender, Plus 10V, TRV set temp ...
authorMarkus Michels <markus7017@gmail.com>
Tue, 28 May 2024 19:48:56 +0000 (15:48 -0400)
committerGitHub <noreply@github.com>
Tue, 28 May 2024 19:48:56 +0000 (21:48 +0200)
* fixes ##16736, #16734, #16542, #16709, #16735

Signed-off-by: Markus Michels <markus7017@gmail.com>
bundles/org.openhab.binding.shelly/src/main/java/org/openhab/binding/shelly/internal/api/ShellyApiInterface.java
bundles/org.openhab.binding.shelly/src/main/java/org/openhab/binding/shelly/internal/api1/Shelly1HttpApi.java
bundles/org.openhab.binding.shelly/src/main/java/org/openhab/binding/shelly/internal/api2/Shelly2ApiRpc.java
bundles/org.openhab.binding.shelly/src/main/java/org/openhab/binding/shelly/internal/discovery/ShellyThingCreator.java
bundles/org.openhab.binding.shelly/src/main/java/org/openhab/binding/shelly/internal/handler/ShellyBaseHandler.java
bundles/org.openhab.binding.shelly/src/main/java/org/openhab/binding/shelly/internal/handler/ShellyComponents.java
bundles/org.openhab.binding.shelly/src/main/java/org/openhab/binding/shelly/internal/handler/ShellyRelayHandler.java
bundles/org.openhab.binding.shelly/src/main/java/org/openhab/binding/shelly/internal/provider/ShellyChannelDefinitions.java
bundles/org.openhab.binding.shelly/src/main/resources/OH-INF/config/config2.xml
bundles/org.openhab.binding.shelly/src/main/resources/scripts/oh-blu-scanner.js

index 72333350e98397fe47648211474508543ad783bd..bad011bd2e82e038b51084bd788e0a3667a0a624 100644 (file)
@@ -84,7 +84,7 @@ public interface ShellyApiInterface {
 
     void setValveMode(int id, boolean auto) throws ShellyApiException;
 
-    void setValveTemperature(int valveId, int value) throws ShellyApiException;
+    void setValveTemperature(int valveId, double value) throws ShellyApiException;
 
     void setValveProfile(int valveId, int value) throws ShellyApiException;
 
index 0151e29679f0f512981a3d4530f2b497a62f3c86..a83f22d2510c1c93fa4fd16c2e3aa7f423fdbeef 100644 (file)
@@ -272,7 +272,7 @@ public class Shelly1HttpApi extends ShellyHttpClient implements ShellyApiInterfa
     }
 
     @Override
-    public void setValveTemperature(int valveId, int value) throws ShellyApiException {
+    public void setValveTemperature(int valveId, double value) throws ShellyApiException {
         httpRequest("/thermostat/" + valveId + "?target_t_enabled=1&target_t=" + value);
     }
 
index 662a01c7f4550994f63ff15518e7db3f351f5a85..3b440dbe63b7c9bfcab411ad0074a66459cb1644 100644 (file)
@@ -15,7 +15,7 @@ package org.openhab.binding.shelly.internal.api2;
 import static org.openhab.binding.shelly.internal.ShellyBindingConstants.*;
 import static org.openhab.binding.shelly.internal.api1.Shelly1ApiJsonDTO.*;
 import static org.openhab.binding.shelly.internal.api2.Shelly2ApiJsonDTO.*;
-import static org.openhab.binding.shelly.internal.discovery.ShellyThingCreator.THING_TYPE_SHELLYPRO2_RELAY_STR;
+import static org.openhab.binding.shelly.internal.discovery.ShellyThingCreator.*;
 import static org.openhab.binding.shelly.internal.util.ShellyUtils.*;
 
 import java.io.BufferedReader;
@@ -259,6 +259,8 @@ public class Shelly2ApiRpc extends Shelly2ApiClient implements ShellyApiInterfac
         // Mini PM has 1 meter, but no relay
         if (thingType.equals(THING_TYPE_SHELLYPRO2_RELAY_STR)) {
             profile.numMeters = 0;
+        } else if (thingType.equals(THING_TYPE_SHELLYPRO3EM_STR)) {
+            profile.numMeters = 3;
         } else if (dc.pm10 != null) {
             profile.numMeters = 1;
         } else if (dc.em0 != null) {
@@ -1101,7 +1103,7 @@ public class Shelly2ApiRpc extends Shelly2ApiClient implements ShellyApiInterfac
     }
 
     @Override
-    public void setValveTemperature(int valveId, int value) throws ShellyApiException {
+    public void setValveTemperature(int valveId, double value) throws ShellyApiException {
         throw new ShellyApiException("API call not implemented");
     }
 
index 5437a87a1c88c9f14e65dee011ce7e9296332b25..e3e4e681b983a558a7d0f270dc3ead551b4433cb 100644 (file)
@@ -83,7 +83,7 @@ public class ShellyThingCreator {
     public static final String SHELLYDT_PLUSSMOKE = "SNSN-0031Z";
     public static final String SHELLYDT_PLUSUNI = "SNSN-0043X";
     public static final String SHELLYDT_PLUSDIMMERUS = "SNDM-0013US";
-    public static final String SHELLYDT_PLUSDIMMER10V = "SNGW-0A11WW010";
+    public static final String SHELLYDT_PLUSDIMMER10V = "SNDM-00100WW";
     public static final String SHELLYDT_PLUSWALLDISPLAY = "SAWD-0A1XX10EU1";
 
     // Shelly Pro Series
index 52281c8ce5c457f233bd7ec311a7a75af1315b26..04d04cd445d2bbc7cf44484be4cb1de6872f4413 100755 (executable)
@@ -45,6 +45,7 @@ import org.openhab.binding.shelly.internal.api1.Shelly1CoapHandler;
 import org.openhab.binding.shelly.internal.api1.Shelly1CoapJSonDTO;
 import org.openhab.binding.shelly.internal.api1.Shelly1CoapServer;
 import org.openhab.binding.shelly.internal.api1.Shelly1HttpApi;
+import org.openhab.binding.shelly.internal.api2.Shelly2ApiJsonDTO;
 import org.openhab.binding.shelly.internal.api2.Shelly2ApiJsonDTO.Shelly2APClientList.Shelly2APClient;
 import org.openhab.binding.shelly.internal.api2.Shelly2ApiRpc;
 import org.openhab.binding.shelly.internal.api2.ShellyBluApi;
@@ -463,7 +464,7 @@ public abstract class ShellyBaseHandler extends BaseThingHandler
                     break;
                 case CHANNEL_CONTROL_SETTEMP:
                     logger.debug("{}: Set temperature to {}", thingName, command);
-                    api.setValveTemperature(0, getNumber(command).intValue());
+                    api.setValveTemperature(0, getNumber(command).doubleValue());
                     break;
                 case CHANNEL_CONTROL_POSITION:
                     logger.debug("{}: Set position to {}", thingName, command);
@@ -821,6 +822,10 @@ public abstract class ShellyBaseHandler extends BaseThingHandler
                 case SHELLY_WAKEUPT_POWERON:
                 case SHELLY_WAKEUPT_EXT_POWER:
                 case SHELLY_WAKEUPT_UNKNOWN:
+                case Shelly2ApiJsonDTO.SHELLY2_EVENT_OTASTART:
+                case Shelly2ApiJsonDTO.SHELLY2_EVENT_OTAPROGRESS:
+                case Shelly2ApiJsonDTO.SHELLY2_EVENT_OTADONE:
+                case SHELLY_EVENT_ROLLER_CALIB:
                     logger.debug("{}: {}", thingName, messages.get("event.filtered", event));
                 case ALARM_TYPE_NONE:
                     break;
@@ -1003,7 +1008,7 @@ public abstract class ShellyBaseHandler extends BaseThingHandler
                 String saddr = addr.getHostAddress();
                 if (!ip.equals(saddr)) {
                     logger.debug("{}: hostname {} resolved to IP address {}", thingName, config.deviceIp, saddr);
-                    config.deviceIp = saddr + (port.isEmpty() ? ip : ip + ":" + port);
+                    config.deviceIp = saddr + (port.isEmpty() ? "" : ":" + port);
                 }
             } catch (UnknownHostException e) {
                 logger.debug("{}: Unable to resolve hostname {}", thingName, config.deviceIp);
index 1d5a0cc133234c59105971ed33a68b8e4f44df0b..95f00e6539701eec81a6b6a269489d9d0e816026 100644 (file)
@@ -123,31 +123,6 @@ public class ShellyComponents {
                             getOpenClosed(getInteger(status.extSwitch.input0.input) == 1));
                 }
             }
-            if (status.extTemperature != null) {
-                // Shelly 1/1PM support up to 3 external sensors
-                // for whatever reason those are not represented as an array, but 3 elements
-                updated |= updateTempChannel(status.extTemperature.sensor1, thingHandler, CHANNEL_ESENSOR_TEMP1);
-                updated |= updateTempChannel(status.extTemperature.sensor2, thingHandler, CHANNEL_ESENSOR_TEMP2);
-                updated |= updateTempChannel(status.extTemperature.sensor3, thingHandler, CHANNEL_ESENSOR_TEMP3);
-                updated |= updateTempChannel(status.extTemperature.sensor4, thingHandler, CHANNEL_ESENSOR_TEMP4);
-                updated |= updateTempChannel(status.extTemperature.sensor5, thingHandler, CHANNEL_ESENSOR_TEMP5);
-            }
-            if ((status.extHumidity != null) && (status.extHumidity.sensor1 != null)) {
-                updated |= thingHandler.updateChannel(CHANNEL_GROUP_SENSOR, CHANNEL_ESENSOR_HUMIDITY,
-                        toQuantityType(getDouble(status.extHumidity.sensor1.hum), DIGITS_PERCENT, Units.PERCENT));
-            }
-            if ((status.extVoltage != null) && (status.extVoltage.sensor1 != null)) {
-                updated |= thingHandler.updateChannel(CHANNEL_GROUP_SENSOR, CHANNEL_ESENSOR_VOLTAGE,
-                        toQuantityType(getDouble(status.extVoltage.sensor1.voltage), 4, Units.VOLT));
-            }
-            if ((status.extDigitalInput != null) && (status.extDigitalInput.sensor1 != null)) {
-                updated |= thingHandler.updateChannel(CHANNEL_GROUP_SENSOR, CHANNEL_ESENSOR_DIGITALINPUT,
-                        getOnOff(status.extDigitalInput.sensor1.state));
-            }
-            if ((status.extAnalogInput != null) && (status.extAnalogInput.sensor1 != null)) {
-                updated |= thingHandler.updateChannel(CHANNEL_GROUP_SENSOR, CHANNEL_ESENSOR_ANALOGINPUT, toQuantityType(
-                        getDouble(status.extAnalogInput.sensor1.percent), DIGITS_PERCENT, Units.PERCENT));
-            }
 
             // Update Auto-ON/OFF timer
             updated |= thingHandler.updateChannel(groupName, CHANNEL_TIMER_AUTOON,
@@ -556,6 +531,34 @@ public class ShellyComponents {
                 thingHandler.updateChannel(CHANNEL_GROUP_SENSOR, CHANNEL_LAST_UPDATE, getTimestamp());
             }
         }
+
+        // Update Add-On channeƶs
+        if (status.extTemperature != null) {
+            // Shelly 1/1PM support up to 3 external sensors
+            // for whatever reason those are not represented as an array, but 3 elements
+            updated |= updateTempChannel(status.extTemperature.sensor1, thingHandler, CHANNEL_ESENSOR_TEMP1);
+            updated |= updateTempChannel(status.extTemperature.sensor2, thingHandler, CHANNEL_ESENSOR_TEMP2);
+            updated |= updateTempChannel(status.extTemperature.sensor3, thingHandler, CHANNEL_ESENSOR_TEMP3);
+            updated |= updateTempChannel(status.extTemperature.sensor4, thingHandler, CHANNEL_ESENSOR_TEMP4);
+            updated |= updateTempChannel(status.extTemperature.sensor5, thingHandler, CHANNEL_ESENSOR_TEMP5);
+        }
+        if ((status.extHumidity != null) && (status.extHumidity.sensor1 != null)) {
+            updated |= thingHandler.updateChannel(CHANNEL_GROUP_SENSOR, CHANNEL_ESENSOR_HUMIDITY,
+                    toQuantityType(getDouble(status.extHumidity.sensor1.hum), DIGITS_PERCENT, Units.PERCENT));
+        }
+        if ((status.extVoltage != null) && (status.extVoltage.sensor1 != null)) {
+            updated |= thingHandler.updateChannel(CHANNEL_GROUP_SENSOR, CHANNEL_ESENSOR_VOLTAGE,
+                    toQuantityType(getDouble(status.extVoltage.sensor1.voltage), 4, Units.VOLT));
+        }
+        if ((status.extDigitalInput != null) && (status.extDigitalInput.sensor1 != null)) {
+            updated |= thingHandler.updateChannel(CHANNEL_GROUP_SENSOR, CHANNEL_ESENSOR_DIGITALINPUT,
+                    getOnOff(status.extDigitalInput.sensor1.state));
+        }
+        if ((status.extAnalogInput != null) && (status.extAnalogInput.sensor1 != null)) {
+            updated |= thingHandler.updateChannel(CHANNEL_GROUP_SENSOR, CHANNEL_ESENSOR_ANALOGINPUT,
+                    toQuantityType(getDouble(status.extAnalogInput.sensor1.percent), DIGITS_PERCENT, Units.PERCENT));
+        }
+
         return updated;
     }
 
index 395cb4cf56c78a894a7959df525aef6e8c5c9b92..d45c95a15545e2aa85eb73bb222f2b45a08f8cb7 100644 (file)
@@ -298,7 +298,7 @@ public class ShellyRelayHandler extends ShellyBaseHandler {
 
     private void createRollerChannels(ShellyRollerStatus roller) {
         if (!areChannelsCreated()) {
-            updateChannelDefinitions(ShellyChannelDefinitions.createRollerChannels(getThing(), roller));
+            updateChannelDefinitions(ShellyChannelDefinitions.createRollerChannels(getThing(), profile, roller));
         }
     }
 
index b2ba9c94a25061a02679352bfd0c60b96223b510..a8e9f0aa3c035ae4b5cab406b893a4903a30745f 100644 (file)
@@ -369,6 +369,13 @@ public class ShellyChannelDefinitions {
             addChannel(thing, add, rs.autoOff != null, group, CHANNEL_TIMER_AUTOOFF);
         }
 
+        addAddonChannels(thing, profile, idx, add);
+
+        return add;
+    }
+
+    private static void addAddonChannels(final Thing thing, final ShellyDeviceProfile profile, int idx,
+            Map<String, Channel> add) {
         // Shelly 1/1PM and Plus 1/1PM Addon
         boolean addon = profile.settings.extSwitch != null && profile.settings.extSwitch.input0 != null
                 && idx == getInteger(profile.settings.extSwitch.input0.relayNum);
@@ -385,11 +392,10 @@ public class ShellyChannelDefinitions {
         }
         addChannel(thing, add, profile.status.extHumidity != null && profile.status.extHumidity.sensor1 != null,
                 CHGR_SENSOR, CHANNEL_ESENSOR_HUMIDITY);
+
         addChannel(thing, add, profile.status.extVoltage != null, CHGR_SENSOR, CHANNEL_ESENSOR_VOLTAGE);
         addChannel(thing, add, profile.status.extDigitalInput != null, CHGR_SENSOR, CHANNEL_ESENSOR_DIGITALINPUT);
         addChannel(thing, add, profile.status.extAnalogInput != null, CHGR_SENSOR, CHANNEL_ESENSOR_ANALOGINPUT);
-
-        return add;
     }
 
     public static Map<String, Channel> createDimmerChannels(final Thing thing, final ShellyDeviceProfile profile,
@@ -458,7 +464,8 @@ public class ShellyChannelDefinitions {
         return add;
     }
 
-    public static Map<String, Channel> createRollerChannels(Thing thing, final ShellyRollerStatus roller) {
+    public static Map<String, Channel> createRollerChannels(final Thing thing, final ShellyDeviceProfile profile,
+            final ShellyRollerStatus roller) {
         Map<String, Channel> add = new LinkedHashMap<>();
         addChannel(thing, add, true, CHGR_ROLLER, CHANNEL_ROL_CONTROL_CONTROL);
         addChannel(thing, add, true, CHGR_ROLLER, CHANNEL_ROL_CONTROL_STATE);
@@ -474,6 +481,9 @@ public class ShellyChannelDefinitions {
                 addChannel(thing, add, roller.currentPos != null, CHGR_ROLLER, CHANNEL_ROL_CONTROL_FAV);
             }
         }
+
+        addAddonChannels(thing, profile, 0, add);
+
         return add;
     }
 
index 24fbbef7511fcc63ede948cebaca6c4b14371f7e..e24c68d7c509056a5e4300393e28b7b10b44b12d 100644 (file)
@@ -29,7 +29,7 @@
                <parameter name="enableRangeExtender" type="boolean" required="false">
                        <label>@text/thing-type.config.shelly.enableRangeExtender.label</label>
                        <description>@text/thing-type.config.shelly.enableRangeExtender.description</description>
-                       <default>true</default>
+                       <default>false</default>
                </parameter>
        </config-description>
 
index d5c670efa502a3753c62edd811290f444b97d290..9d774ec240fe677ca98077b3c6fb835a3771f856 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This script uses the BLE scan functionality in scripting to pass scan results to openHAB
  * Supported BLU Devices: BLU Button 1, BLU Door/Window, BLU Motion, BLU H&T
- * Version 0.3
+ * Version 0.4
  */
 
 let ALLTERCO_DEVICE_NAME_PREFIX = ["SBBT", "SBDW", "SBMO", "SBHT"];
@@ -33,15 +33,17 @@ BTH[0x05] = { n: "Illuminance", t: uint24, f: 0.01 };
 BTH[0x08] = { n: "Dewpoint", t: int16, f: 0.01 };
 BTH[0x12] = { n: "Co2", t: uint16 };
 BTH[0x14] = { n: "Moisture16", t: uint16, f: 0.01 };
-BTH[0x14] = { n: "Moisture8", t: uint8 };
 BTH[0x1a] = { n: "Door", t: uint8 };
 BTH[0x20] = { n: "Moisture", t: uint8 };
 BTH[0x21] = { n: "Motion", t: uint8 };
 BTH[0x2d] = { n: "Window", t: uint8 };
+BTH[0x2e] = { n: "Humidity", t: uint8 };
+BTH[0x2f] = { n: "Moisture8", t: uint8 };
 BTH[0x3a] = { n: "Button", t: uint8 };
 BTH[0x3f] = { n: "Rotation", t: int16, f: 0.1 };
 BTH[0x43] = { n: "Current", t: uint16, f: 0.1 };
-BTH[0x43] = { n: "UVIndex", t: uint8 };
+BTH[0x45] = { n: "Temperature", t: int16, f: 0.1 };
+BTH[0x46] = { n: "UVIndex", t: uint8 };
 BTH[0x51] = { n: "Acceleration", t: uint16, f: 0.1 };
 
 function getByteSize(type) {