[tapocontrol] add L610, L630 Spot and L930 LightStrip (#13814)

* fix color change bug*

Signed-off-by: Christian Wild <christian@wildclan.de>
pull/13904/head
Christian Wild 2022-12-10 16:53:30 +01:00 committed by GitHub
parent ad5facc2e5
commit 8d28085226
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 238 additions and 63 deletions

View File

@ -4,49 +4,21 @@ This binding adds support to control Tapo (Copyright © TP-Link Corporation Limi
## Supported Things
The following Tapo-Devices are supported
### P100/P105 SmartPlug (Wi-Fi)
* Power On/Off
* Wi-Fi signal (SignalStrength)
* On-Time (Time in seconds device is switched on)
### P110/P115 EnergyMonitoring SmartPlug (Wi-Fi)
* Power On/Off
* Wi-Fi signal (SignalStrength)
* On-Time (Time in seconds device is switched on)
* actual PowerUsage (Watt)
* today EnergyUsage (Wh)
* today Runtime (Time in seconds device was on today)
### L510(Series) dimmable SmartBulb (Wi-Fi)
* Light On/Off
* Brightnes (Dimmer) 0-100 %
* ColorTemperature (Number) 2500-6500 K
* Wi-Fi signal (SignalStrength)
* On-Time (Time in seconds device is switched on)
### L530(Series) MultiColor SmartBulb (Wi-Fi)
* Light On/Off
* Brightnes (Dimmer) 0-100 %
* ColorTemperature (Number) 2500-6500 K
* Color (Color)
* Wi-Fi signal (SignalStrength)
* On-Time (Time in seconds device is switched on)
### L900/L920 LED-LightStrip (Wi-Fi)
* Light On/Off
* Brightnes (Dimmer) 0-100 %
* ColorTemperature (Number) 2500-6500 K
* Color (Color)
* Wi-Fi signal (SignalStrength)
* On-Time (Time in seconds device is switched on)
The following Tapo-Devices are supported. For precise channel-description look at `channels-table` below
| DeviceType | ThingType | Description |
|------------------------------------|-------------|---------------------------------------------|
| SmartPlug (Wi-Fi) | P100 | Smart Socket |
| | P105 | Smart Mini Socket |
| EnergyMonitoring SmartPlug (Wi-Fi) | P110 | Energy Monitoring Smart Socket |
| | P115 | Energy Monitoring Mini Smart Socket |
| Dimmable SmartBulb (Wi-Fi) | L510 | Dimmable White-Light Smart-Bulb (E27) |
| | L610 | Dimmable White-Light Smart-Spot (GU10) |
| MultiColor SmartBulb (Wi-Fi) | L530 | Multicolor Smart-Bulb (E27) |
| | L630 | Multicolor Smart-Spot (GU10) |
| MultiColor LightStrip (Wi-Fi) | L900 | Multicolor RGB Dimmable LightStrip (5m) |
| | L920 | Multicolor RGB-IC ColorZone LightStrip (5m) |
| | L930 | Multicolor RGBW-IC 50-Zone LightStrip (5m) |
## Prerequisites
@ -91,17 +63,17 @@ The thing has the following configuration parameters:
All devices support some of the following channels:
| group | channel |type | description | things supporting this channel |
|-----------|----------------- |------------------------|------------------------------|------------------------------------------------|
| actuator | output | Switch | Power device on or off | P100, P105, P110, P115, L510, L530, L900, L920 |
| | brightness | Dimmer | Brightness 0-100% | L510, L530, L900 |
| | colorTemperature | Number | White-Color-Temp 2500-6500K | L510, L530, L900 |
| | color | Color | Color | L530, L900 |
| device | wifiSignal | system.signal-strength | WiFi-quality-level | P100, P105, P110, P115, L510, L530, L900, L920 |
| | onTime | Number:Time | seconds output is on | P100, P105, P110, P115, L510, L530, L900, L920 |
| energy | actualPower | Number:Power | actual Power (Watt) | P110, P115 |
| | todayEnergyUsage | Number:Energy | used energy today (Wh) | P110, P115 |
| | todayRuntime | Number:Time | seconds output was on today | P110, P115 |
| group | channel | type | description | things supporting this channel |
|-----------|----------------- |------------------------|------------------------------|------------------------------------------------------------------|
| actuator | output | Switch | Power device on or off | P100, P105, P110, P115, L510, L530, L610, L630, L900, L920, L930 |
| | brightness | Dimmer | Brightness 0-100% | L510, L530, L610, L630, L900 |
| | colorTemperature | Number | White-Color-Temp 2500-6500K | L510, L530, L610, L630, L900 |
| | color | Color | Color | L530, L630, L900 |
| device | wifiSignal | Number | WiFi-quality-level | P100, P105, P110, P115, L510, L530, L610, L630, L900, L920, L930 |
| | onTime | Number:Time | seconds output is on | P100, P105, P110, P115, L510, L530, L900, L920, L930 |
| energy | actualPower | Number:Power | actual Power (Watt) | P110, P115 |
| | todayEnergyUsage | Number:Energy | used energy today (Wh) | P110, P115 |
| | todayRuntime | Number:Time | seconds output was on today | P110, P115 |
## Channel Refresh

View File

@ -64,7 +64,7 @@ public class TapoDiscoveryService extends AbstractDiscoveryService implements Th
}
/**
* deactivate
* activate
*/
@Override
public void activate() {
@ -178,7 +178,7 @@ public class TapoDiscoveryService extends AbstractDiscoveryService implements Th
}
}
} catch (Exception e) {
logger.debug("error handlling CloudDevices", e);
logger.debug("error handling CloudDevices", e);
}
}

View File

@ -40,8 +40,11 @@ public class TapoThingConstants {
public static final String DEVICE_P115 = "P115";
public static final String DEVICE_L510 = "L510";
public static final String DEVICE_L530 = "L530";
public static final String DEVICE_L610 = "L610";
public static final String DEVICE_L630 = "L630";
public static final String DEVICE_L900 = "L900";
public static final String DEVICE_L920 = "L920";
public static final String DEVICE_L930 = "L930";
public static final String DEVICE_UNIVERSAL = "Test_Device";
/*** LIST OF SUPPORTED DEVICE DESCRIPTIONS ***/
@ -59,17 +62,21 @@ public class TapoThingConstants {
public static final ThingTypeUID P115_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_P115);
public static final ThingTypeUID L510_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_L510);
public static final ThingTypeUID L530_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_L530);
public static final ThingTypeUID L610_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_L610);
public static final ThingTypeUID L630_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_L630);
public static final ThingTypeUID L900_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_L900);
public static final ThingTypeUID L920_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_L920);
public static final ThingTypeUID L930_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_L930);
public static final ThingTypeUID UNIVERSAL_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_UNIVERSAL);
/*** SET OF SUPPORTED UIDS ***/
public static final Set<ThingTypeUID> SUPPORTED_BRIDGE_UIDS = Set.of(BRIDGE_THING_TYPE);
public static final Set<ThingTypeUID> SUPPORTED_SMART_PLUG_UIDS = Set.of(P100_THING_TYPE, P105_THING_TYPE,
P110_THING_TYPE, P115_THING_TYPE);
public static final Set<ThingTypeUID> SUPPORTED_WHITE_BULB_UIDS = Set.of(L510_THING_TYPE);
public static final Set<ThingTypeUID> SUPPORTED_COLOR_BULB_UIDS = Set.of(L530_THING_TYPE);
public static final Set<ThingTypeUID> SUPPORTED_LIGHT_STRIP_UIDS = Set.of(L900_THING_TYPE, L920_THING_TYPE);
public static final Set<ThingTypeUID> SUPPORTED_WHITE_BULB_UIDS = Set.of(L510_THING_TYPE, L610_THING_TYPE);
public static final Set<ThingTypeUID> SUPPORTED_COLOR_BULB_UIDS = Set.of(L530_THING_TYPE, L630_THING_TYPE);
public static final Set<ThingTypeUID> SUPPORTED_LIGHT_STRIP_UIDS = Set.of(L900_THING_TYPE, L920_THING_TYPE,
L930_THING_TYPE);
public static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Collections
.unmodifiableSet(Stream
.of(SUPPORTED_BRIDGE_UIDS, SUPPORTED_SMART_PLUG_UIDS, SUPPORTED_WHITE_BULB_UIDS,

View File

@ -259,6 +259,8 @@ public class TapoBridgeHandler extends BaseBridgeHandler {
if (config.cloudDiscovery) {
logger.trace("{} discover devicelist from cloud", this.uid);
deviceList = getDeviceListCloud();
} else {
logger.info("{} Discovery disabled in bridge settings ", this.uid);
}
return deviceList;
}

View File

@ -127,9 +127,9 @@ public class TapoSmartBulb extends TapoDevice {
protected void setColor(HSBType command) {
HashMap<String, Object> newState = new HashMap<>();
newState.put(DEVICE_PROPERTY_ON, true);
newState.put(DEVICE_PROPERTY_HUE, command.getHue());
newState.put(DEVICE_PROPERTY_SATURATION, command.getSaturation());
newState.put(DEVICE_PROPERTY_BRIGHTNES, command.getBrightness());
newState.put(DEVICE_PROPERTY_HUE, command.getHue().intValue());
newState.put(DEVICE_PROPERTY_SATURATION, command.getSaturation().intValue());
newState.put(DEVICE_PROPERTY_BRIGHTNES, command.getBrightness().intValue());
connector.sendDeviceCommands(newState);
}

View File

@ -9,10 +9,16 @@ thing-type.tapocontrol.L510.label = L510 Series White-Bulb
thing-type.tapocontrol.L510.description = Tapo Smart dimmable White-Light-Bulb
thing-type.tapocontrol.L530.label = L530 Series Color-Bulb
thing-type.tapocontrol.L530.description = Tapo Smart Multicolor Light-Bulb
thing-type.tapocontrol.L610.label = L610 Series White-Spot
thing-type.tapocontrol.L610.description = Tapo Smart dimmable White-Light-Spot
thing-type.tapocontrol.L630.label = L630 Series Color-Spot
thing-type.tapocontrol.L630.description = Tapo Smart Multicolor Light-Spot
thing-type.tapocontrol.L900.label = L900 LightStrip
thing-type.tapocontrol.L900.description = Tapo Smart LED-Lightstrip
thing-type.tapocontrol.L920.label = L920 LightStrip
thing-type.tapocontrol.L920.description = Tapo Smart Multicolor LED-Lightstrip
thing-type.tapocontrol.L930.label = L930 LightStrip
thing-type.tapocontrol.L930.description = Tapo Smart Multicolor LED-Lightstrip with ZoneControl
thing-type.tapocontrol.P100.label = P100 SmartPlug
thing-type.tapocontrol.P100.description = Tapo Smart Wifi Plug
thing-type.tapocontrol.P105.label = P105 SmartPlug
@ -44,6 +50,8 @@ channel-group-type.tapocontrol.colorBulb.label = Color Light Bulb
channel-group-type.tapocontrol.colorBulb.description = Tapo Multicolor Smart Light Bulb
channel-group-type.tapocontrol.deviceState.label = Device State
channel-group-type.tapocontrol.deviceState.description = Information about the device
channel-group-type.tapocontrol.deviceStateS.label = Device State
channel-group-type.tapocontrol.deviceStateS.description = Information about the device
channel-group-type.tapocontrol.energyMonitor.label = Energy Usage
channel-group-type.tapocontrol.energyMonitor.description = Energy and Power usage
channel-group-type.tapocontrol.lightBulb.label = Light Bulb

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<thing:thing-descriptions bindingId="tapocontrol"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0"
xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd">
<!-- L610 THING-TYPE (WHITE-LIGHT-BULB) -->
<thing-type id="L610">
<supported-bridge-type-refs>
<bridge-type-ref id="bridge"/>
</supported-bridge-type-refs>
<label>L610 Series White-Spot</label>
<description>Tapo Smart dimmable White-Light-Spot</description>
<channel-groups>
<channel-group id="actuator" typeId="lightBulb"/>
<channel-group id="device" typeId="deviceStateS"/>
</channel-groups>
<representation-property>macAddress</representation-property>
<config-description-ref uri="thing-type:tapo:device"/>
</thing-type>
</thing:thing-descriptions>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<thing:thing-descriptions bindingId="tapocontrol"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0"
xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd">
<!-- L630 THING-TYPE (COLOR-LIGHT-BULB) -->
<thing-type id="L630">
<supported-bridge-type-refs>
<bridge-type-ref id="bridge"/>
</supported-bridge-type-refs>
<label>L630 Series Color-Spot</label>
<description>Tapo Smart Multicolor Light-Spot</description>
<channel-groups>
<channel-group id="actuator" typeId="colorBulb"/>
<channel-group id="device" typeId="deviceStateS"/>
</channel-groups>
<representation-property>macAddress</representation-property>
<config-description-ref uri="thing-type:tapo:device"/>
</thing-type>
</thing:thing-descriptions>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<thing:thing-descriptions bindingId="tapocontrol"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0"
xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd">
<!-- L930 THING-TYPE (Multicolor LED-Lightstrip) -->
<thing-type id="L930">
<supported-bridge-type-refs>
<bridge-type-ref id="bridge"/>
</supported-bridge-type-refs>
<label>L930 LightStrip</label>
<description>Tapo Smart Multicolor LED-Lightstrip with ZoneControl</description>
<channel-groups>
<channel-group id="actuator" typeId="lightStrip"/>
<channel-group id="device" typeId="deviceState"/>
</channel-groups>
<representation-property>macAddress</representation-property>
<config-description-ref uri="thing-type:tapo:device"/>
</thing-type>
</thing:thing-descriptions>

View File

@ -7,7 +7,7 @@
<!-- ############################### CHANNEL-GROUPS ############################### -->
<!-- CHANNEL GROUP TYPES -->
<!--Device-Statuss Channel Type -->
<!--Device-Status Channel Type -->
<channel-group-type id="deviceState">
<label>Device State</label>
<description>Information about the device</description>
@ -18,6 +18,16 @@
</channels>
</channel-group-type>
<!--Device-Status Channel Type (Small) -->
<channel-group-type id="deviceStateS">
<label>Device State</label>
<description>Information about the device</description>
<channels>
<channel id="wifiSignal" typeId="system.signal-strength"/>
<channel id="overheated" typeId="overheated"/>
</channels>
</channel-group-type>
<!--Actor Channel Type -->
<channel-group-type id="smartPlug">
<label>SmartPlug</label>

View File

@ -64,7 +64,7 @@ public class TapoDiscoveryService extends AbstractDiscoveryService implements Th
}
/**
* deactivate
* activate
*/
@Override
public void activate() {

View File

@ -0,0 +1,107 @@
/**
* Copyright (c) 2010-2022 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.tapocontrol.internal.api;
import static org.openhab.binding.tapocontrol.internal.constants.TapoThingConstants.*;
import java.util.Dictionary;
import java.util.Set;
import javax.jmdns.ServiceInfo;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.config.discovery.DiscoveryResult;
import org.openhab.core.config.discovery.DiscoveryService;
import org.openhab.core.config.discovery.mdns.MDNSDiscoveryParticipant;
import org.openhab.core.thing.ThingTypeUID;
import org.openhab.core.thing.ThingUID;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Modified;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Handler class for TAPO Smart Home thing discovery over mDNS
*
* @author Christian Wild - Initial contribution
*/
@Component(configurationPid = "discovery.tapocontrol")
@NonNullByDefault
public class TapoMDNS implements MDNSDiscoveryParticipant {
private final Logger logger = LoggerFactory.getLogger(TapoMDNS.class);
private boolean isAutoDiscoveryEnabled = true;
@Activate
protected void activate(ComponentContext componentContext) {
activateOrModifyService(componentContext);
}
@Modified
protected void modified(ComponentContext componentContext) {
activateOrModifyService(componentContext);
}
private void activateOrModifyService(ComponentContext componentContext) {
Dictionary<String, @Nullable Object> properties = componentContext.getProperties();
String autoDiscoveryPropertyValue = (String) properties
.get(DiscoveryService.CONFIG_PROPERTY_BACKGROUND_DISCOVERY);
if (autoDiscoveryPropertyValue != null && !autoDiscoveryPropertyValue.isBlank()) {
isAutoDiscoveryEnabled = Boolean.valueOf(autoDiscoveryPropertyValue);
}
}
@Override
public Set<ThingTypeUID> getSupportedThingTypeUIDs() {
return SUPPORTED_THING_TYPES_UIDS;
}
@Override
public String getServiceType() {
return "NULL";
}
@Override
public @Nullable ThingUID getThingUID(ServiceInfo service) {
ThingTypeUID thingTypeUID = getThingType(service);
if (thingTypeUID != null) {
String id = service.getPropertyString(PROPERTY_FAMILY); // device id
return new ThingUID(thingTypeUID, id);
}
return null;
}
private @Nullable ThingTypeUID getThingType(final ServiceInfo service) {
String model = service.getPropertyString(PROPERTY_FAMILY); // model
logger.debug("found Type: {}", model);
if (model == null) {
return null;
}
return L510_THING_TYPE;
}
@Override
public @Nullable DiscoveryResult createResult(ServiceInfo service) {
if (isAutoDiscoveryEnabled) {
ThingUID uid = getThingUID(service);
if (uid != null) {
String host = service.getHostAddresses()[0];
int port = service.getPort();
logger.debug("device Found: {} {}", host, port);
}
}
return null;
}
}