[shelly] Various small fixes for BLU HT, Range Extender, Plus 10V, TRV set temp (#16746)

* fixes ##16736, #16734, #16542, #16709, #16735

Signed-off-by: Markus Michels <markus7017@gmail.com>
This commit is contained in:
Markus Michels 2024-05-28 15:48:56 -04:00 committed by GitHub
parent a4ad7b27b7
commit f79a2dd7f0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 62 additions and 40 deletions

View File

@ -84,7 +84,7 @@ public interface ShellyApiInterface {
void setValveMode(int id, boolean auto) throws ShellyApiException; 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; void setValveProfile(int valveId, int value) throws ShellyApiException;

View File

@ -272,7 +272,7 @@ public class Shelly1HttpApi extends ShellyHttpClient implements ShellyApiInterfa
} }
@Override @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); httpRequest("/thermostat/" + valveId + "?target_t_enabled=1&target_t=" + value);
} }

View 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.ShellyBindingConstants.*;
import static org.openhab.binding.shelly.internal.api1.Shelly1ApiJsonDTO.*; 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.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 static org.openhab.binding.shelly.internal.util.ShellyUtils.*;
import java.io.BufferedReader; import java.io.BufferedReader;
@ -259,6 +259,8 @@ public class Shelly2ApiRpc extends Shelly2ApiClient implements ShellyApiInterfac
// Mini PM has 1 meter, but no relay // Mini PM has 1 meter, but no relay
if (thingType.equals(THING_TYPE_SHELLYPRO2_RELAY_STR)) { if (thingType.equals(THING_TYPE_SHELLYPRO2_RELAY_STR)) {
profile.numMeters = 0; profile.numMeters = 0;
} else if (thingType.equals(THING_TYPE_SHELLYPRO3EM_STR)) {
profile.numMeters = 3;
} else if (dc.pm10 != null) { } else if (dc.pm10 != null) {
profile.numMeters = 1; profile.numMeters = 1;
} else if (dc.em0 != null) { } else if (dc.em0 != null) {
@ -1101,7 +1103,7 @@ public class Shelly2ApiRpc extends Shelly2ApiClient implements ShellyApiInterfac
} }
@Override @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"); throw new ShellyApiException("API call not implemented");
} }

View File

@ -83,7 +83,7 @@ public class ShellyThingCreator {
public static final String SHELLYDT_PLUSSMOKE = "SNSN-0031Z"; public static final String SHELLYDT_PLUSSMOKE = "SNSN-0031Z";
public static final String SHELLYDT_PLUSUNI = "SNSN-0043X"; public static final String SHELLYDT_PLUSUNI = "SNSN-0043X";
public static final String SHELLYDT_PLUSDIMMERUS = "SNDM-0013US"; 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"; public static final String SHELLYDT_PLUSWALLDISPLAY = "SAWD-0A1XX10EU1";
// Shelly Pro Series // Shelly Pro Series

View File

@ -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.Shelly1CoapJSonDTO;
import org.openhab.binding.shelly.internal.api1.Shelly1CoapServer; import org.openhab.binding.shelly.internal.api1.Shelly1CoapServer;
import org.openhab.binding.shelly.internal.api1.Shelly1HttpApi; 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.Shelly2ApiJsonDTO.Shelly2APClientList.Shelly2APClient;
import org.openhab.binding.shelly.internal.api2.Shelly2ApiRpc; import org.openhab.binding.shelly.internal.api2.Shelly2ApiRpc;
import org.openhab.binding.shelly.internal.api2.ShellyBluApi; import org.openhab.binding.shelly.internal.api2.ShellyBluApi;
@ -463,7 +464,7 @@ public abstract class ShellyBaseHandler extends BaseThingHandler
break; break;
case CHANNEL_CONTROL_SETTEMP: case CHANNEL_CONTROL_SETTEMP:
logger.debug("{}: Set temperature to {}", thingName, command); logger.debug("{}: Set temperature to {}", thingName, command);
api.setValveTemperature(0, getNumber(command).intValue()); api.setValveTemperature(0, getNumber(command).doubleValue());
break; break;
case CHANNEL_CONTROL_POSITION: case CHANNEL_CONTROL_POSITION:
logger.debug("{}: Set position to {}", thingName, command); logger.debug("{}: Set position to {}", thingName, command);
@ -821,6 +822,10 @@ public abstract class ShellyBaseHandler extends BaseThingHandler
case SHELLY_WAKEUPT_POWERON: case SHELLY_WAKEUPT_POWERON:
case SHELLY_WAKEUPT_EXT_POWER: case SHELLY_WAKEUPT_EXT_POWER:
case SHELLY_WAKEUPT_UNKNOWN: 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)); logger.debug("{}: {}", thingName, messages.get("event.filtered", event));
case ALARM_TYPE_NONE: case ALARM_TYPE_NONE:
break; break;
@ -1003,7 +1008,7 @@ public abstract class ShellyBaseHandler extends BaseThingHandler
String saddr = addr.getHostAddress(); String saddr = addr.getHostAddress();
if (!ip.equals(saddr)) { if (!ip.equals(saddr)) {
logger.debug("{}: hostname {} resolved to IP address {}", thingName, config.deviceIp, 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) { } catch (UnknownHostException e) {
logger.debug("{}: Unable to resolve hostname {}", thingName, config.deviceIp); logger.debug("{}: Unable to resolve hostname {}", thingName, config.deviceIp);

View File

@ -123,31 +123,6 @@ public class ShellyComponents {
getOpenClosed(getInteger(status.extSwitch.input0.input) == 1)); 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 // Update Auto-ON/OFF timer
updated |= thingHandler.updateChannel(groupName, CHANNEL_TIMER_AUTOON, updated |= thingHandler.updateChannel(groupName, CHANNEL_TIMER_AUTOON,
@ -556,6 +531,34 @@ public class ShellyComponents {
thingHandler.updateChannel(CHANNEL_GROUP_SENSOR, CHANNEL_LAST_UPDATE, getTimestamp()); 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; return updated;
} }

View File

@ -298,7 +298,7 @@ public class ShellyRelayHandler extends ShellyBaseHandler {
private void createRollerChannels(ShellyRollerStatus roller) { private void createRollerChannels(ShellyRollerStatus roller) {
if (!areChannelsCreated()) { if (!areChannelsCreated()) {
updateChannelDefinitions(ShellyChannelDefinitions.createRollerChannels(getThing(), roller)); updateChannelDefinitions(ShellyChannelDefinitions.createRollerChannels(getThing(), profile, roller));
} }
} }

View File

@ -369,6 +369,13 @@ public class ShellyChannelDefinitions {
addChannel(thing, add, rs.autoOff != null, group, CHANNEL_TIMER_AUTOOFF); 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 // Shelly 1/1PM and Plus 1/1PM Addon
boolean addon = profile.settings.extSwitch != null && profile.settings.extSwitch.input0 != null boolean addon = profile.settings.extSwitch != null && profile.settings.extSwitch.input0 != null
&& idx == getInteger(profile.settings.extSwitch.input0.relayNum); && 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, addChannel(thing, add, profile.status.extHumidity != null && profile.status.extHumidity.sensor1 != null,
CHGR_SENSOR, CHANNEL_ESENSOR_HUMIDITY); CHGR_SENSOR, CHANNEL_ESENSOR_HUMIDITY);
addChannel(thing, add, profile.status.extVoltage != null, CHGR_SENSOR, CHANNEL_ESENSOR_VOLTAGE); 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.extDigitalInput != null, CHGR_SENSOR, CHANNEL_ESENSOR_DIGITALINPUT);
addChannel(thing, add, profile.status.extAnalogInput != null, CHGR_SENSOR, CHANNEL_ESENSOR_ANALOGINPUT); 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, public static Map<String, Channel> createDimmerChannels(final Thing thing, final ShellyDeviceProfile profile,
@ -458,7 +464,8 @@ public class ShellyChannelDefinitions {
return add; 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<>(); 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_CONTROL);
addChannel(thing, add, true, CHGR_ROLLER, CHANNEL_ROL_CONTROL_STATE); 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); addChannel(thing, add, roller.currentPos != null, CHGR_ROLLER, CHANNEL_ROL_CONTROL_FAV);
} }
} }
addAddonChannels(thing, profile, 0, add);
return add; return add;
} }

View File

@ -29,7 +29,7 @@
<parameter name="enableRangeExtender" type="boolean" required="false"> <parameter name="enableRangeExtender" type="boolean" required="false">
<label>@text/thing-type.config.shelly.enableRangeExtender.label</label> <label>@text/thing-type.config.shelly.enableRangeExtender.label</label>
<description>@text/thing-type.config.shelly.enableRangeExtender.description</description> <description>@text/thing-type.config.shelly.enableRangeExtender.description</description>
<default>true</default> <default>false</default>
</parameter> </parameter>
</config-description> </config-description>

View File

@ -1,7 +1,7 @@
/* /*
* This script uses the BLE scan functionality in scripting to pass scan results to openHAB * 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 * 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"]; 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[0x08] = { n: "Dewpoint", t: int16, f: 0.01 };
BTH[0x12] = { n: "Co2", t: uint16 }; BTH[0x12] = { n: "Co2", t: uint16 };
BTH[0x14] = { n: "Moisture16", t: uint16, f: 0.01 }; BTH[0x14] = { n: "Moisture16", t: uint16, f: 0.01 };
BTH[0x14] = { n: "Moisture8", t: uint8 };
BTH[0x1a] = { n: "Door", t: uint8 }; BTH[0x1a] = { n: "Door", t: uint8 };
BTH[0x20] = { n: "Moisture", t: uint8 }; BTH[0x20] = { n: "Moisture", t: uint8 };
BTH[0x21] = { n: "Motion", t: uint8 }; BTH[0x21] = { n: "Motion", t: uint8 };
BTH[0x2d] = { n: "Window", 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[0x3a] = { n: "Button", t: uint8 };
BTH[0x3f] = { n: "Rotation", t: int16, f: 0.1 }; BTH[0x3f] = { n: "Rotation", t: int16, f: 0.1 };
BTH[0x43] = { n: "Current", t: uint16, 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 }; BTH[0x51] = { n: "Acceleration", t: uint16, f: 0.1 };
function getByteSize(type) { function getByteSize(type) {