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;
}
@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);
}
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;
// 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) {
}
@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");
}
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
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;
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);
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;
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);
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,
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;
}
private void createRollerChannels(ShellyRollerStatus roller) {
if (!areChannelsCreated()) {
- updateChannelDefinitions(ShellyChannelDefinitions.createRollerChannels(getThing(), roller));
+ updateChannelDefinitions(ShellyChannelDefinitions.createRollerChannels(getThing(), profile, roller));
}
}
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);
}
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,
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);
addChannel(thing, add, roller.currentPos != null, CHGR_ROLLER, CHANNEL_ROL_CONTROL_FAV);
}
}
+
+ addAddonChannels(thing, profile, 0, add);
+
return add;
}
<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>
/*
* 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"];
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) {