[shelly] Fix initialization of BLU Motion device (#17053)

* Fixes #17052 (caused by inproper initialization of the profile flags for
BLU devices in general and for BLU Motion another one)

Signed-off-by: Markus Michels <markus7017@gmail.com>
This commit is contained in:
Markus Michels 2024-07-17 00:47:05 +02:00 committed by GitHub
parent 30fa2d2533
commit b123863d59
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 32 additions and 15 deletions

View File

@ -28,12 +28,15 @@ Also check out the [Shelly Manager](doc/ShellyManager.md), which
The binding supports both hardware generations
- Generation 1: The original Shelly devices like the Shelly 1, Shelly 2.5, Shelly Flood etc.
- Generation 2: Plus / Pro series of devices
- Generation 2+3: Plus / Pro series of devices
- Shelly Plus Mini: Shelly Plus devices in compact format (Gen 2+3)
- Shelly BLU: Bluetooth based series of devices
The binding provides the same feature set across all devices as good as possible and depending on device specific features.
`Note:` Using BLU devices or the Plus/Pro Range Extender mode require some additional configuration steps.
See section [Discovery](#discovery) for details.
### Generation 1
| thing-type | Model | Vendor ID |
@ -159,12 +162,15 @@ In this case autoCoIoT should be disabled, CoIoT events will not work, because t
## Firmware
The binding requires firmware version 1.8.2 or newer for generation 1 to enable all features, version 1.9.2+ is recommended. Generation 2 devices require 0.10.2 or newer, the Plus HT at least 0.11.0.
`Generation 1`: The binding requires firmware version 1.9.2 or newer to enable all features.
`Generation 2+3` Those Shelly devices require firmware version 1.0.0 or newer (1.10.0+ is recommended).
`Shelly BLU deries`: Use the Shelly App to update to 1.0+ version of the firmware.
Some of the features are enabled dynamically or are not available depending on device type and firmware release.
The Web UI of the Shelly device displays the current firmware version under Settings:Firmware and shows an update option when a newer version is available.
The current firmware version is reported in the Thing Properties.
A dedicated channel (device#updateAvailable) indicates the availability of a newer firmware.
A dedicated channel indicates the availability of a newer firmware (`device#updateAvailable`, not available for BLU devices).
Use the device's Web UI or the Shelly App to perform the update.
Check [Advanced Users](doc/AdvancedUsers.md) for information how to update your device.
@ -183,7 +189,7 @@ They periodically announce their presence, which is used by the binding to find
Sometimes you need to run the manual discovery multiple times until you see all your devices.
`Important for Generation 1 Devices`:
It's recommended to enable CoIoT in the device settings for faster response times (event driven rather than polling).
It's strongly recommended to enable CoIoT in the device settings for faster response times (event driven rather than polling).
Open the device's Web UI, section "COIOT settings" and select "Enable COCIOT".
It's recommended to switch the Shelly devices to CoAP peer mode if you have only your openHAB system controlling the device.
This allows routing the CoIoT/CoAP messages across multiple IP subnets without special network setup required.
@ -193,12 +199,12 @@ Keep Multicast mode if you have multiple hosts, which should receive the CoAP up
### Discovery of BLU Devices
The BLU devices use Bluetooth Low Energy (BLE).
The binding can't communicate directly with the device, but the Plus/Pro series with firmware 0.14.1 or newer could be used as a gateway.
The binding automatically installs a script on the Shelly Device (oh-blu-scanner), which forwards the BLU events to the binding using the WebSocket channel.
The binding can't communicate directly with the device, so a Shelly Plus/Pro device is required with enabled Bluetooth to use those devices as a hub.
The binding automatically installs a script on the Shelly Device (oh-blu-scanner.js), which forwards the BLU events to the binding.
Follow these steps to add the Shelly BLU Device to openHAB
- Make sure a Shelly is near by the BLU device, enable Bluetooh on this device (**disabling** the 'Bluetooth Gateway' mode in the Shelly app/UI is recommended)
- Make sure a Shelly is near by the BLU device, enable Bluetooh on this device (**disable the 'Bluetooth Gateway' mode** in the Shelly app/UI is recommended)
- Add this thing to openHAB, make sure thing gets online
- Enable "BLU Gateway Support" in the thing configuration of the Shelly device acting as gateway.
- Now press the button on your BLU device, this wakes up the device and the script forwards this event to the binding
@ -207,12 +213,18 @@ Follow these steps to add the Shelly BLU Device to openHAB
- Click the device button again, the binding gets another event and creates the channels and thing changes status to ONLINE
- Finally link the channels to the equipment in the model
Note: During initialization the script 'oh-blu-scanner.js' gets installed and activated on the Shelly Gateway device.
`Note`:
- During initialization the script 'oh-blu-scanner.js' gets installed and activated on the Shelly Gateway device.
- Shelly BLU Motion: It may take some time until channels like Lux show up.
Try moving the device to force status updates.
Every time an event is received sensors#lastUpdate and channels are updated with the reported values.
device#wifiSignal indicates the Bluetooth signal strength and gets updated when the device sends an event.
`device#wifiSignal` indicates the Bluetooth signal strength and gets updated when the device sends an event.
The binding supports multiple Shelly Plus/Pro as gateway devices unless they are added as thing and are ONLINE.
In this scenario the channel `device#gatewayDevice` will report the last hub device, which forwarded a status update.
### Password Protected Devices

View File

@ -236,8 +236,9 @@ public class ShellyDeviceProfile {
isSensor = isHT || isFlood || isDW || isSmoke || isGas || isButton || isUNI || isMotion || isSense || isTRV
|| isWall;
hasBattery = isHT || isFlood || isDW || isSmoke || isButton || isMotion || isTRV;
alwaysOn = !hasBattery || isMotion || isSense; // true means: device is reachable all the time (no sleep mode)
hasBattery = isHT || isFlood || isDW || isSmoke || isButton || isMotion || isTRV || isBlu;
alwaysOn = !hasBattery || (isMotion && !isBlu) || isSense; // true means: device is reachable all the time (no
// sleep mode)
}
public void updateFromStatus(ShellySettingsStatus status) {

View File

@ -293,8 +293,11 @@ public abstract class ShellyBaseHandler extends BaseThingHandler
cache.clear();
resetStats();
logger.debug("{}: Start initializing for thing {}, type {}, IP address {}, Gen2: {}, CoIoT: {}", thingName,
getThing().getLabel(), thingType, config.deviceAddress, gen2, config.eventsCoIoT);
profile.initFromThingType(thingType);
logger.debug(
"{}: Start initializing for thing {}, type {}, Device address {}, Gen2: {}, isBlu: {}, alwaysOn: {}, hasBattery: {}, CoIoT: {}",
thingName, getThing().getLabel(), thingType, config.deviceAddress.toUpperCase(), gen2, profile.isBlu,
profile.alwaysOn, profile.hasBattery, config.eventsCoIoT);
if (config.deviceAddress.isEmpty()) {
setThingOffline(ThingStatusDetail.CONFIGURATION_ERROR, "config-status.error.missing-device-address");
return false;
@ -308,7 +311,6 @@ public abstract class ShellyBaseHandler extends BaseThingHandler
// Gen 1 only: Setup CoAP listener to we get the CoAP message, which triggers initialization even the thing
// could not be fully initialized here. In this case the CoAP messages triggers auto-initialization (like the
// Action URL does when enabled)
profile.initFromThingType(thingType);
if (coap != null && config.eventsCoIoT && !profile.alwaysOn) {
coap.start(thingName, config);
}

View File

@ -339,12 +339,14 @@ public class ShellyChannelDefinitions {
addChannel(thing, add,
profile.status.uptime != null && (!profile.hasBattery || profile.isMotion || profile.isTRV), CHGR_DEVST,
CHANNEL_DEVST_UPTIME);
addChannel(thing, add, true, CHGR_DEVST, CHANNEL_DEVST_UPDATE);
addChannel(thing, add, true, CHGR_DEVST, CHANNEL_DEVST_HEARTBEAT);
addChannel(thing, add, profile.settings.ledPowerDisable != null, CHGR_DEVST, CHANNEL_LED_POWER_DISABLE);
addChannel(thing, add, profile.settings.ledStatusDisable != null, CHGR_DEVST, CHANNEL_LED_STATUS_DISABLE); // WiFi
addChannel(thing, add, profile.settings.calibrated != null, CHGR_DEVST, CHANNEL_DEVST_CALIBRATED);
if (!profile.isBlu) { // currently not supported for BLU devices
addChannel(thing, add, true, CHGR_DEVST, CHANNEL_DEVST_UPDATE);
}
return add;
}