[TapoControl] Adding P300 to the list of supported equipments (#14364)
* Adding P300 to the list of supported equipments Signed-off-by: clinique <gael@lhopital.org>
This commit is contained in:
parent
bbb4c3e474
commit
7820c2daa2
@ -12,6 +12,7 @@ The following Tapo-Devices are supported. For precise channel-description look a
|
|||||||
| | P105 | Smart Mini Socket |
|
| | P105 | Smart Mini Socket |
|
||||||
| EnergyMonitoring SmartPlug (Wi-Fi) | P110 | Energy Monitoring Smart Socket |
|
| EnergyMonitoring SmartPlug (Wi-Fi) | P110 | Energy Monitoring Smart Socket |
|
||||||
| | P115 | Energy Monitoring Mini Smart Socket |
|
| | P115 | Energy Monitoring Mini Smart Socket |
|
||||||
|
| Power Strip (Wi-Fi) | P300 | Smart Wi-Fi Power Strip - 3 sockets |
|
||||||
| Dimmable SmartBulb (Wi-Fi) | L510 | Dimmable White-Light Smart-Bulb (E27) |
|
| Dimmable SmartBulb (Wi-Fi) | L510 | Dimmable White-Light Smart-Bulb (E27) |
|
||||||
| | L610 | Dimmable White-Light Smart-Spot (GU10) |
|
| | L610 | Dimmable White-Light Smart-Spot (GU10) |
|
||||||
| MultiColor SmartBulb (Wi-Fi) | L530 | Multicolor Smart-Bulb (E27) |
|
| MultiColor SmartBulb (Wi-Fi) | L530 | Multicolor Smart-Bulb (E27) |
|
||||||
@ -66,6 +67,9 @@ All devices support some of the following channels:
|
|||||||
| group | channel | type | description | things supporting this channel |
|
| 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 |
|
| actuator | output | Switch | Power device on or off | P100, P105, P110, P115, L510, L530, L610, L630, L900, L920, L930 |
|
||||||
|
| | output1 | Switch | Power socket 1 on or off | P300 |
|
||||||
|
| | output2 | Switch | Power socket 2 on or off | P300 |
|
||||||
|
| | output3 | Switch | Power socket 3 on or off | P300 |
|
||||||
| | brightness | Dimmer | Brightness 0-100% | L510, L530, L610, L630, L900 |
|
| | brightness | Dimmer | Brightness 0-100% | L510, L530, L610, L630, L900 |
|
||||||
| | colorTemperature | Number | White-Color-Temp 2500-6500K | L510, L530, L610, L630, L900 |
|
| | colorTemperature | Number | White-Color-Temp 2500-6500K | L510, L530, L610, L630, L900 |
|
||||||
| | color | Color | Color | L530, L630, L900 |
|
| | color | Color | Color | L530, L630, L900 |
|
||||||
@ -94,7 +98,7 @@ tapocontrol:L530:myTapoBridge:colorBulb "color-light" (tapocontrol:bri
|
|||||||
tapocontrol:L900:myTapoBridge:myLightStrip "light-strip" (tapocontrol:bridge:myTapoBridge) [ ipAddress="192.168.178.153", pollingInterval=30 ]
|
tapocontrol:L900:myTapoBridge:myLightStrip "light-strip" (tapocontrol:bridge:myTapoBridge) [ ipAddress="192.168.178.153", pollingInterval=30 ]
|
||||||
|
|
||||||
Bridge tapocontrol:bridge:secondBridgeExample "Cloud-Login" [ username="youtoo@anyprovider.com", password="verysecret" ] {
|
Bridge tapocontrol:bridge:secondBridgeExample "Cloud-Login" [ username="youtoo@anyprovider.com", password="verysecret" ] {
|
||||||
Thing tapocontrol:P110:secondBridgeExample:mySocket "My-Socket" [ ipAddress="192.168.101.51", pollingInterval=30 ]
|
Thing P110 mySocket "My-Socket" [ ipAddress="192.168.101.51", pollingInterval=30 ]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -15,22 +15,26 @@ package org.openhab.binding.tapocontrol.internal.api;
|
|||||||
import static org.openhab.binding.tapocontrol.internal.constants.TapoBindingSettings.*;
|
import static org.openhab.binding.tapocontrol.internal.constants.TapoBindingSettings.*;
|
||||||
import static org.openhab.binding.tapocontrol.internal.constants.TapoErrorConstants.*;
|
import static org.openhab.binding.tapocontrol.internal.constants.TapoErrorConstants.*;
|
||||||
import static org.openhab.binding.tapocontrol.internal.constants.TapoThingConstants.*;
|
import static org.openhab.binding.tapocontrol.internal.constants.TapoThingConstants.*;
|
||||||
import static org.openhab.binding.tapocontrol.internal.helpers.TapoUtils.*;
|
import static org.openhab.binding.tapocontrol.internal.helpers.TapoUtils.jsonObjectToInt;
|
||||||
|
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
import org.openhab.binding.tapocontrol.internal.device.TapoBridgeHandler;
|
import org.openhab.binding.tapocontrol.internal.device.TapoBridgeHandler;
|
||||||
import org.openhab.binding.tapocontrol.internal.device.TapoDevice;
|
import org.openhab.binding.tapocontrol.internal.device.TapoDevice;
|
||||||
import org.openhab.binding.tapocontrol.internal.helpers.PayloadBuilder;
|
import org.openhab.binding.tapocontrol.internal.helpers.PayloadBuilder;
|
||||||
import org.openhab.binding.tapocontrol.internal.helpers.TapoErrorHandler;
|
import org.openhab.binding.tapocontrol.internal.helpers.TapoErrorHandler;
|
||||||
|
import org.openhab.binding.tapocontrol.internal.structures.TapoChild;
|
||||||
|
import org.openhab.binding.tapocontrol.internal.structures.TapoChildData;
|
||||||
import org.openhab.binding.tapocontrol.internal.structures.TapoDeviceInfo;
|
import org.openhab.binding.tapocontrol.internal.structures.TapoDeviceInfo;
|
||||||
import org.openhab.binding.tapocontrol.internal.structures.TapoEnergyData;
|
import org.openhab.binding.tapocontrol.internal.structures.TapoEnergyData;
|
||||||
|
import org.openhab.binding.tapocontrol.internal.structures.TapoSubRequest;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,12 +45,12 @@ import com.google.gson.JsonObject;
|
|||||||
*/
|
*/
|
||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(TapoDeviceConnector.class);
|
private final Logger logger = LoggerFactory.getLogger(TapoDeviceConnector.class);
|
||||||
private final String uid;
|
|
||||||
private final TapoDevice device;
|
private TapoDeviceInfo deviceInfo = new TapoDeviceInfo();
|
||||||
private TapoDeviceInfo deviceInfo;
|
private TapoEnergyData energyData = new TapoEnergyData();
|
||||||
private TapoEnergyData energyData;
|
private TapoChildData childData = new TapoChildData();
|
||||||
private Gson gson;
|
|
||||||
private long lastQuery = 0L;
|
private long lastQuery = 0L;
|
||||||
private long lastSent = 0L;
|
private long lastSent = 0L;
|
||||||
private long lastLogin = 0L;
|
private long lastLogin = 0L;
|
||||||
@ -58,11 +62,6 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
*/
|
*/
|
||||||
public TapoDeviceConnector(TapoDevice device, TapoBridgeHandler bridgeThingHandler) {
|
public TapoDeviceConnector(TapoDevice device, TapoBridgeHandler bridgeThingHandler) {
|
||||||
super(device, bridgeThingHandler);
|
super(device, bridgeThingHandler);
|
||||||
this.device = device;
|
|
||||||
this.gson = new Gson();
|
|
||||||
this.deviceInfo = new TapoDeviceInfo();
|
|
||||||
this.energyData = new TapoEnergyData();
|
|
||||||
this.uid = device.getThingUID().getAsString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************
|
/***********************************
|
||||||
@ -111,7 +110,7 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* send custom command to device
|
* send custom command to device
|
||||||
*
|
*
|
||||||
* @param plBuilder Payloadbuilder with unencrypted payload
|
* @param plBuilder Payloadbuilder with unencrypted payload
|
||||||
*/
|
*/
|
||||||
public void sendCustomQuery(String queryMethod) {
|
public void sendCustomQuery(String queryMethod) {
|
||||||
@ -123,7 +122,7 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* send custom command to device
|
* send custom command to device
|
||||||
*
|
*
|
||||||
* @param plBuilder Payloadbuilder with unencrypted payload
|
* @param plBuilder Payloadbuilder with unencrypted payload
|
||||||
*/
|
*/
|
||||||
public void sendCustomPayload(PayloadBuilder plBuilder) {
|
public void sendCustomPayload(PayloadBuilder plBuilder) {
|
||||||
@ -159,6 +158,27 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* send "set_device_info" command to child's device
|
||||||
|
*
|
||||||
|
* @param index of the child
|
||||||
|
* @param childProperty to modify
|
||||||
|
* @param value for the property
|
||||||
|
*/
|
||||||
|
public void sendChildCommand(Integer index, String childProperty, Object value) {
|
||||||
|
long now = System.currentTimeMillis();
|
||||||
|
if (now > this.lastSent + TAPO_SEND_MIN_GAP_MS) {
|
||||||
|
this.lastSent = now;
|
||||||
|
getChild(index).ifPresent(child -> {
|
||||||
|
child.setDeviceOn(Boolean.valueOf((Boolean) value));
|
||||||
|
TapoSubRequest request = new TapoSubRequest(child.getDeviceId(), DEVICE_CMD_SETINFO, child);
|
||||||
|
sendSecurePasstrhroug(GSON.toJson(request), request.method());
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
logger.debug("({}) command not sent because of min_gap: {}", uid, now + " <- " + lastSent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* send multiple "set_device_info" commands to device
|
* send multiple "set_device_info" commands to device
|
||||||
*
|
*
|
||||||
@ -184,15 +204,16 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query Info from Device adn refresh deviceInfo
|
* Query Info from Device and refresh deviceInfo
|
||||||
*/
|
*/
|
||||||
public void queryInfo() {
|
public void queryInfo() {
|
||||||
queryInfo(false);
|
queryInfo(false);
|
||||||
|
queryChildDevices();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query Info from Device adn refresh deviceInfo
|
* Query Info from Device and refresh deviceInfo
|
||||||
*
|
*
|
||||||
* @param ignoreGap ignore gap to last query. query anyway
|
* @param ignoreGap ignore gap to last query. query anyway
|
||||||
*/
|
*/
|
||||||
public void queryInfo(boolean ignoreGap) {
|
public void queryInfo(boolean ignoreGap) {
|
||||||
@ -212,6 +233,21 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query Info from Child Devices and refresh deviceInfo
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void queryChildDevices() {
|
||||||
|
logger.trace("({}) DeviceConnetor_queryChildDevices from '{}'", uid, deviceURL);
|
||||||
|
|
||||||
|
/* create payload */
|
||||||
|
PayloadBuilder plBuilder = new PayloadBuilder();
|
||||||
|
plBuilder.method = DEVICE_CMD_CHILD_DEVICE_LIST;
|
||||||
|
String payload = plBuilder.getPayload();
|
||||||
|
|
||||||
|
sendSecurePasstrhroug(payload, DEVICE_CMD_CHILD_DEVICE_LIST);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get energy usage from device
|
* Get energy usage from device
|
||||||
*/
|
*/
|
||||||
@ -229,7 +265,7 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
/**
|
/**
|
||||||
* SEND SECUREPASSTHROUGH
|
* SEND SECUREPASSTHROUGH
|
||||||
* encprypt payload and send to device
|
* encprypt payload and send to device
|
||||||
*
|
*
|
||||||
* @param payload payload sent to device
|
* @param payload payload sent to device
|
||||||
* @param command command executed - this will handle result
|
* @param command command executed - this will handle result
|
||||||
*/
|
*/
|
||||||
@ -255,7 +291,7 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle SuccessResponse (setDeviceInfo)
|
* Handle SuccessResponse (setDeviceInfo)
|
||||||
*
|
*
|
||||||
* @param responseBody String with responseBody from device
|
* @param responseBody String with responseBody from device
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -270,9 +306,9 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* handle JsonResponse (getDeviceInfo)
|
* handle JsonResponse (getDeviceInfo)
|
||||||
*
|
*
|
||||||
* @param responseBody String with responseBody from device
|
* @param responseBody String with responseBody from device
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -290,7 +326,7 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* handle JsonResponse (getEnergyData)
|
* handle JsonResponse (getEnergyData)
|
||||||
*
|
*
|
||||||
* @param responseBody String with responseBody from device
|
* @param responseBody String with responseBody from device
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -305,9 +341,26 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
this.device.responsePasstrough(responseBody);
|
this.device.responsePasstrough(responseBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* handle JsonResponse (getChildDeviceList)
|
||||||
|
*
|
||||||
|
* @param responseBody String with responseBody from device
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void handleChildDevices(String responseBody) {
|
||||||
|
JsonObject jsnResult = getJsonFromResponse(responseBody);
|
||||||
|
if (jsnResult.has(CHILD_PROPERTY_START_INDEX)) {
|
||||||
|
this.childData = Objects.requireNonNull(GSON.fromJson(jsnResult, TapoChildData.class));
|
||||||
|
this.device.setChildData(childData);
|
||||||
|
} else {
|
||||||
|
this.childData = new TapoChildData();
|
||||||
|
}
|
||||||
|
this.device.responsePasstrough(responseBody);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* handle custom response
|
* handle custom response
|
||||||
*
|
*
|
||||||
* @param responseBody String with responseBody from device
|
* @param responseBody String with responseBody from device
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -317,7 +370,7 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* handle error
|
* handle error
|
||||||
*
|
*
|
||||||
* @param te TapoErrorHandler
|
* @param te TapoErrorHandler
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -327,18 +380,18 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* get Json from response
|
* get Json from response
|
||||||
*
|
*
|
||||||
* @param responseBody
|
* @param responseBody
|
||||||
* @return JsonObject with result
|
* @return JsonObject with result
|
||||||
*/
|
*/
|
||||||
private JsonObject getJsonFromResponse(String responseBody) {
|
private JsonObject getJsonFromResponse(String responseBody) {
|
||||||
JsonObject jsonObject = gson.fromJson(responseBody, JsonObject.class);
|
JsonObject jsonObject = GSON.fromJson(responseBody, JsonObject.class);
|
||||||
/* get errocode (0=success) */
|
/* get errocode (0=success) */
|
||||||
if (jsonObject != null) {
|
if (jsonObject != null) {
|
||||||
Integer errorCode = jsonObjectToInt(jsonObject, "error_code");
|
Integer errorCode = jsonObjectToInt(jsonObject, "error_code");
|
||||||
if (errorCode == 0) {
|
if (errorCode == 0) {
|
||||||
/* decrypt response */
|
/* decrypt response */
|
||||||
jsonObject = gson.fromJson(responseBody, JsonObject.class);
|
jsonObject = GSON.fromJson(responseBody, JsonObject.class);
|
||||||
logger.trace("({}) received result: {}", uid, responseBody);
|
logger.trace("({}) received result: {}", uid, responseBody);
|
||||||
if (jsonObject != null) {
|
if (jsonObject != null) {
|
||||||
/* return result if set / else request was successful */
|
/* return result if set / else request was successful */
|
||||||
@ -369,7 +422,7 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if device is online
|
* Check if device is online
|
||||||
*
|
*
|
||||||
* @return true if device is online
|
* @return true if device is online
|
||||||
*/
|
*/
|
||||||
public Boolean isOnline() {
|
public Boolean isOnline() {
|
||||||
@ -378,7 +431,7 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if device is online
|
* Check if device is online
|
||||||
*
|
*
|
||||||
* @param raiseError if true
|
* @param raiseError if true
|
||||||
* @return true if device is online
|
* @return true if device is online
|
||||||
*/
|
*/
|
||||||
@ -397,7 +450,7 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* IP-Adress
|
* IP-Adress
|
||||||
*
|
*
|
||||||
* @return String ipAdress
|
* @return String ipAdress
|
||||||
*/
|
*/
|
||||||
public String getIP() {
|
public String getIP() {
|
||||||
@ -406,7 +459,7 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* PING IP Adress
|
* PING IP Adress
|
||||||
*
|
*
|
||||||
* @return true if ping successfull
|
* @return true if ping successfull
|
||||||
*/
|
*/
|
||||||
public Boolean pingDevice() {
|
public Boolean pingDevice() {
|
||||||
@ -418,4 +471,8 @@ public class TapoDeviceConnector extends TapoDeviceHttpApi {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Optional<TapoChild> getChild(int position) {
|
||||||
|
return childData.getChildDeviceList().stream().filter(child -> child.getPosition() == position).findFirst();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,7 +36,9 @@ import org.openhab.binding.tapocontrol.internal.helpers.TapoErrorHandler;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.google.gson.FieldNamingPolicy;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -47,11 +49,15 @@ import com.google.gson.JsonObject;
|
|||||||
*/
|
*/
|
||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public class TapoDeviceHttpApi {
|
public class TapoDeviceHttpApi {
|
||||||
|
protected static final Gson GSON = new GsonBuilder()
|
||||||
|
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(TapoDeviceHttpApi.class);
|
private final Logger logger = LoggerFactory.getLogger(TapoDeviceHttpApi.class);
|
||||||
private final String uid;
|
|
||||||
private final TapoCipher tapoCipher;
|
private final TapoCipher tapoCipher;
|
||||||
private final TapoBridgeHandler bridge;
|
private final TapoBridgeHandler bridge;
|
||||||
private Gson gson;
|
protected final String uid;
|
||||||
|
protected final TapoDevice device;
|
||||||
|
|
||||||
private String token = "";
|
private String token = "";
|
||||||
private String cookie = "";
|
private String cookie = "";
|
||||||
protected String deviceURL = "";
|
protected String deviceURL = "";
|
||||||
@ -65,10 +71,9 @@ public class TapoDeviceHttpApi {
|
|||||||
public TapoDeviceHttpApi(TapoDevice device, TapoBridgeHandler bridgeThingHandler) {
|
public TapoDeviceHttpApi(TapoDevice device, TapoBridgeHandler bridgeThingHandler) {
|
||||||
this.bridge = bridgeThingHandler;
|
this.bridge = bridgeThingHandler;
|
||||||
this.tapoCipher = new TapoCipher();
|
this.tapoCipher = new TapoCipher();
|
||||||
this.gson = new Gson();
|
this.device = device;
|
||||||
this.uid = device.getThingUID().getAsString();
|
this.uid = device.getThingUID().getAsString();
|
||||||
String ipAddress = device.getIpAddress();
|
setDeviceURL(device.getIpAddress());
|
||||||
setDeviceURL(ipAddress);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************
|
/***********************************
|
||||||
@ -79,7 +84,7 @@ public class TapoDeviceHttpApi {
|
|||||||
************************************/
|
************************************/
|
||||||
/**
|
/**
|
||||||
* handle SuccessResponse (setDeviceInfo)
|
* handle SuccessResponse (setDeviceInfo)
|
||||||
*
|
*
|
||||||
* @param responseBody String with responseBody from device
|
* @param responseBody String with responseBody from device
|
||||||
*/
|
*/
|
||||||
protected void handleSuccessResponse(String responseBody) {
|
protected void handleSuccessResponse(String responseBody) {
|
||||||
@ -87,7 +92,7 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* handle JsonResponse (getDeviceInfo)
|
* handle JsonResponse (getDeviceInfo)
|
||||||
*
|
*
|
||||||
* @param responseBody String with responseBody from device
|
* @param responseBody String with responseBody from device
|
||||||
*/
|
*/
|
||||||
protected void handleDeviceResult(String responseBody) {
|
protected void handleDeviceResult(String responseBody) {
|
||||||
@ -95,7 +100,7 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* handle JsonResponse (getEnergyData)
|
* handle JsonResponse (getEnergyData)
|
||||||
*
|
*
|
||||||
* @param responseBody String with responseBody from device
|
* @param responseBody String with responseBody from device
|
||||||
*/
|
*/
|
||||||
protected void handleEnergyResult(String responseBody) {
|
protected void handleEnergyResult(String responseBody) {
|
||||||
@ -103,20 +108,35 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* handle custom response
|
* handle custom response
|
||||||
*
|
*
|
||||||
* @param responseBody String with responseBody from device
|
* @param responseBody String with responseBody from device
|
||||||
*/
|
*/
|
||||||
protected void handleCustomResponse(String responseBody) {
|
protected void handleCustomResponse(String responseBody) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* handle JsonResponse (getChildDevices)
|
||||||
|
*
|
||||||
|
* @param responseBody String with responseBody from device
|
||||||
|
*/
|
||||||
|
protected void handleChildDevices(String responseBody) {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* handle error
|
* handle error
|
||||||
*
|
*
|
||||||
* @param te TapoErrorHandler
|
* @param te TapoErrorHandler
|
||||||
*/
|
*/
|
||||||
protected void handleError(TapoErrorHandler tapoError) {
|
protected void handleError(TapoErrorHandler tapoError) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* refresh the list of child devices
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected void queryChildDevices() {
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************
|
/***********************************
|
||||||
*
|
*
|
||||||
* LOGIN FUNCTIONS
|
* LOGIN FUNCTIONS
|
||||||
@ -154,13 +174,13 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* return encrypted key from 'handshake' request
|
* return encrypted key from 'handshake' request
|
||||||
*
|
*
|
||||||
* @param response ContentResponse from "handshake" method
|
* @param response ContentResponse from "handshake" method
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private String getKeyFromResponse(ContentResponse response) {
|
private String getKeyFromResponse(ContentResponse response) {
|
||||||
String rBody = response.getContentAsString();
|
String rBody = response.getContentAsString();
|
||||||
JsonObject jsonObj = gson.fromJson(rBody, JsonObject.class);
|
JsonObject jsonObj = GSON.fromJson(rBody, JsonObject.class);
|
||||||
if (jsonObj != null) {
|
if (jsonObj != null) {
|
||||||
logger.trace("({}) received awnser: {}", uid, rBody);
|
logger.trace("({}) received awnser: {}", uid, rBody);
|
||||||
return jsonObjectToString(jsonObj.getAsJsonObject("result"), "key");
|
return jsonObjectToString(jsonObj.getAsJsonObject("result"), "key");
|
||||||
@ -173,7 +193,7 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* return cookie from 'handshake' request
|
* return cookie from 'handshake' request
|
||||||
*
|
*
|
||||||
* @param response ContentResponse from "handshake" metho
|
* @param response ContentResponse from "handshake" metho
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@ -191,7 +211,7 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Query Token from device
|
* Query Token from device
|
||||||
*
|
*
|
||||||
* @return String with token returned from device
|
* @return String with token returned from device
|
||||||
*/
|
*/
|
||||||
protected String queryToken() {
|
protected String queryToken() {
|
||||||
@ -223,7 +243,7 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* get Token from "login"-request
|
* get Token from "login"-request
|
||||||
*
|
*
|
||||||
* @param response
|
* @param response
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@ -236,7 +256,7 @@ public class TapoDeviceHttpApi {
|
|||||||
logger.trace("({}) received result: {}", uid, decryptedResponse);
|
logger.trace("({}) received result: {}", uid, decryptedResponse);
|
||||||
|
|
||||||
/* get errocode (0=success) */
|
/* get errocode (0=success) */
|
||||||
JsonObject jsonObject = gson.fromJson(decryptedResponse, JsonObject.class);
|
JsonObject jsonObject = GSON.fromJson(decryptedResponse, JsonObject.class);
|
||||||
if (jsonObject != null) {
|
if (jsonObject != null) {
|
||||||
Integer errorCode = jsonObjectToInt(jsonObject, "error_code", ERR_JSON_DECODE_FAIL);
|
Integer errorCode = jsonObjectToInt(jsonObject, "error_code", ERR_JSON_DECODE_FAIL);
|
||||||
if (errorCode == 0) {
|
if (errorCode == 0) {
|
||||||
@ -269,7 +289,7 @@ public class TapoDeviceHttpApi {
|
|||||||
************************************/
|
************************************/
|
||||||
/**
|
/**
|
||||||
* SEND SYNCHRON HTTP-REQUEST
|
* SEND SYNCHRON HTTP-REQUEST
|
||||||
*
|
*
|
||||||
* @param url url request is sent to
|
* @param url url request is sent to
|
||||||
* @param payload payload (String) to send
|
* @param payload payload (String) to send
|
||||||
* @return ContentResponse of request
|
* @return ContentResponse of request
|
||||||
@ -306,7 +326,7 @@ public class TapoDeviceHttpApi {
|
|||||||
/**
|
/**
|
||||||
* SEND ASYNCHRONOUS HTTP-REQUEST
|
* SEND ASYNCHRONOUS HTTP-REQUEST
|
||||||
* (don't wait for awnser with programm code)
|
* (don't wait for awnser with programm code)
|
||||||
*
|
*
|
||||||
* @param url string url request is sent to
|
* @param url string url request is sent to
|
||||||
* @param payload data-payload
|
* @param payload data-payload
|
||||||
* @param command command executed - this will handle RepsonseType
|
* @param command command executed - this will handle RepsonseType
|
||||||
@ -364,6 +384,9 @@ public class TapoDeviceHttpApi {
|
|||||||
case DEVICE_CMD_CUSTOM:
|
case DEVICE_CMD_CUSTOM:
|
||||||
handleCustomResponse(rBody);
|
handleCustomResponse(rBody);
|
||||||
break;
|
break;
|
||||||
|
case DEVICE_CMD_CHILD_DEVICE_LIST:
|
||||||
|
handleChildDevices(rBody);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
getErrorCode(rBody);
|
getErrorCode(rBody);
|
||||||
@ -378,7 +401,7 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* return error code from response
|
* return error code from response
|
||||||
*
|
*
|
||||||
* @param response
|
* @param response
|
||||||
* @return 0 if request was successfull
|
* @return 0 if request was successfull
|
||||||
*/
|
*/
|
||||||
@ -397,13 +420,13 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* return error code from responseBody
|
* return error code from responseBody
|
||||||
*
|
*
|
||||||
* @param responseBody
|
* @param responseBody
|
||||||
* @return 0 if request was successfull
|
* @return 0 if request was successfull
|
||||||
*/
|
*/
|
||||||
protected Integer getErrorCode(String responseBody) {
|
protected Integer getErrorCode(String responseBody) {
|
||||||
try {
|
try {
|
||||||
JsonObject jsonObject = gson.fromJson(responseBody, JsonObject.class);
|
JsonObject jsonObject = GSON.fromJson(responseBody, JsonObject.class);
|
||||||
/* get errocode (0=success) */
|
/* get errocode (0=success) */
|
||||||
Integer errorCode = jsonObjectToInt(jsonObject, "error_code", ERR_JSON_DECODE_FAIL);
|
Integer errorCode = jsonObjectToInt(jsonObject, "error_code", ERR_JSON_DECODE_FAIL);
|
||||||
if (errorCode == 0) {
|
if (errorCode == 0) {
|
||||||
@ -420,13 +443,13 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Check for JsonObject "errorcode" and if this is > 0 (no Error)
|
* Check for JsonObject "errorcode" and if this is > 0 (no Error)
|
||||||
*
|
*
|
||||||
* @param responseBody
|
* @param responseBody
|
||||||
* @return true if is js errorcode > 0; false if there is no "errorcode"
|
* @return true if is js errorcode > 0; false if there is no "errorcode"
|
||||||
*/
|
*/
|
||||||
protected Boolean hasErrorCode(String responseBody) {
|
protected Boolean hasErrorCode(String responseBody) {
|
||||||
if (isValidJson(responseBody)) {
|
if (isValidJson(responseBody)) {
|
||||||
JsonObject jsonObject = gson.fromJson(responseBody, JsonObject.class);
|
JsonObject jsonObject = GSON.fromJson(responseBody, JsonObject.class);
|
||||||
/* get errocode (0=success) */
|
/* get errocode (0=success) */
|
||||||
Integer errorCode = jsonObjectToInt(jsonObject, "error_code", ERR_JSON_DECODE_FAIL);
|
Integer errorCode = jsonObjectToInt(jsonObject, "error_code", ERR_JSON_DECODE_FAIL);
|
||||||
if (errorCode > 0) {
|
if (errorCode > 0) {
|
||||||
@ -457,13 +480,13 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Decrypt Response
|
* Decrypt Response
|
||||||
*
|
*
|
||||||
* @param responseBody encrypted string from response-body
|
* @param responseBody encrypted string from response-body
|
||||||
* @return String decrypted responseBody
|
* @return String decrypted responseBody
|
||||||
*/
|
*/
|
||||||
protected String decryptResponse(String responseBody) {
|
protected String decryptResponse(String responseBody) {
|
||||||
try {
|
try {
|
||||||
JsonObject jsonObject = gson.fromJson(responseBody, JsonObject.class);
|
JsonObject jsonObject = GSON.fromJson(responseBody, JsonObject.class);
|
||||||
if (jsonObject != null) {
|
if (jsonObject != null) {
|
||||||
String encryptedResponse = jsonObjectToString(jsonObject.getAsJsonObject("result"), "response");
|
String encryptedResponse = jsonObjectToString(jsonObject.getAsJsonObject("result"), "response");
|
||||||
return tapoCipher.decode(encryptedResponse);
|
return tapoCipher.decode(encryptedResponse);
|
||||||
@ -478,7 +501,7 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* encrypt payload
|
* encrypt payload
|
||||||
*
|
*
|
||||||
* @param payload
|
* @param payload
|
||||||
* @return encrypted payload
|
* @return encrypted payload
|
||||||
*/
|
*/
|
||||||
@ -507,7 +530,7 @@ public class TapoDeviceHttpApi {
|
|||||||
************************************/
|
************************************/
|
||||||
/**
|
/**
|
||||||
* Logged In
|
* Logged In
|
||||||
*
|
*
|
||||||
* @return true if logged in
|
* @return true if logged in
|
||||||
*/
|
*/
|
||||||
public Boolean loggedIn() {
|
public Boolean loggedIn() {
|
||||||
@ -516,7 +539,7 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Logged In
|
* Logged In
|
||||||
*
|
*
|
||||||
* @param raiseError if true
|
* @param raiseError if true
|
||||||
* @return true if logged in
|
* @return true if logged in
|
||||||
*/
|
*/
|
||||||
@ -540,7 +563,7 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set new ipAddress
|
* Set new ipAddress
|
||||||
*
|
*
|
||||||
* @param new ipAdress
|
* @param new ipAdress
|
||||||
*/
|
*/
|
||||||
public void setDeviceURL(String ipAddress) {
|
public void setDeviceURL(String ipAddress) {
|
||||||
@ -550,7 +573,7 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set new ipAdresss with token
|
* Set new ipAdresss with token
|
||||||
*
|
*
|
||||||
* @param ipAddress ipAddres of device
|
* @param ipAddress ipAddres of device
|
||||||
* @param token token from login-ressult
|
* @param token token from login-ressult
|
||||||
*/
|
*/
|
||||||
@ -561,7 +584,7 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set new token
|
* Set new token
|
||||||
*
|
*
|
||||||
* @param deviceURL
|
* @param deviceURL
|
||||||
* @param token
|
* @param token
|
||||||
*/
|
*/
|
||||||
@ -583,7 +606,7 @@ public class TapoDeviceHttpApi {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set new cookie
|
* Set new cookie
|
||||||
*
|
*
|
||||||
* @param cookie
|
* @param cookie
|
||||||
*/
|
*/
|
||||||
protected void setCookie(String cookie) {
|
protected void setCookie(String cookie) {
|
||||||
|
|||||||
@ -52,5 +52,8 @@ public class TapoBindingSettings {
|
|||||||
public static final String DEVICE_CMD_GETINFO = "get_device_info";
|
public static final String DEVICE_CMD_GETINFO = "get_device_info";
|
||||||
public static final String DEVICE_CMD_SETINFO = "set_device_info";
|
public static final String DEVICE_CMD_SETINFO = "set_device_info";
|
||||||
public static final String DEVICE_CMD_GETENERGY = "get_energy_usage";
|
public static final String DEVICE_CMD_GETENERGY = "get_energy_usage";
|
||||||
|
public static final String DEVICE_CMD_CHILD_DEVICE_LIST = "get_child_device_list";
|
||||||
|
public static final String DEVICE_CMD_CONTROL_CHILD = "control_child";
|
||||||
|
public static final String DEVICE_CMD_MULTIPLE_REQ = "multipleRequest";
|
||||||
public static final String DEVICE_CMD_CUSTOM = "custom_command";
|
public static final String DEVICE_CMD_CUSTOM = "custom_command";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.openhab.binding.tapocontrol.internal.constants;
|
package org.openhab.binding.tapocontrol.internal.constants;
|
||||||
|
|
||||||
import static org.openhab.binding.tapocontrol.internal.constants.TapoBindingSettings.*;
|
import static org.openhab.binding.tapocontrol.internal.constants.TapoBindingSettings.BINDING_ID;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -38,6 +38,7 @@ public class TapoThingConstants {
|
|||||||
public static final String DEVICE_P105 = "P105";
|
public static final String DEVICE_P105 = "P105";
|
||||||
public static final String DEVICE_P110 = "P110";
|
public static final String DEVICE_P110 = "P110";
|
||||||
public static final String DEVICE_P115 = "P115";
|
public static final String DEVICE_P115 = "P115";
|
||||||
|
public static final String DEVICE_P300 = "P300";
|
||||||
public static final String DEVICE_L510 = "L510";
|
public static final String DEVICE_L510 = "L510";
|
||||||
public static final String DEVICE_L530 = "L530";
|
public static final String DEVICE_L530 = "L530";
|
||||||
public static final String DEVICE_L610 = "L610";
|
public static final String DEVICE_L610 = "L610";
|
||||||
@ -50,6 +51,7 @@ public class TapoThingConstants {
|
|||||||
/*** LIST OF SUPPORTED DEVICE DESCRIPTIONS ***/
|
/*** LIST OF SUPPORTED DEVICE DESCRIPTIONS ***/
|
||||||
public static final String DEVICE_DESCRIPTION_BRIDGE = "TapoControl Cloud-Login";
|
public static final String DEVICE_DESCRIPTION_BRIDGE = "TapoControl Cloud-Login";
|
||||||
public static final String DEVICE_DESCRIPTION_SMART_PLUG = "SmartPlug";
|
public static final String DEVICE_DESCRIPTION_SMART_PLUG = "SmartPlug";
|
||||||
|
public static final String DEVICE_DESCRIPTION_POWER_STRIP = "PowerStrip";
|
||||||
public static final String DEVICE_DESCRIPTION_WHITE_BULB = "White-Light-Bulb";
|
public static final String DEVICE_DESCRIPTION_WHITE_BULB = "White-Light-Bulb";
|
||||||
public static final String DEVICE_DESCRIPTION_COLOR_BULB = "Color-Light-Bulb";
|
public static final String DEVICE_DESCRIPTION_COLOR_BULB = "Color-Light-Bulb";
|
||||||
public static final String DEVICE_DESCRIPTION_LIGHTSTRIP = "LightStrip";
|
public static final String DEVICE_DESCRIPTION_LIGHTSTRIP = "LightStrip";
|
||||||
@ -60,6 +62,7 @@ public class TapoThingConstants {
|
|||||||
public static final ThingTypeUID P105_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_P105);
|
public static final ThingTypeUID P105_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_P105);
|
||||||
public static final ThingTypeUID P110_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_P110);
|
public static final ThingTypeUID P110_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_P110);
|
||||||
public static final ThingTypeUID P115_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_P115);
|
public static final ThingTypeUID P115_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_P115);
|
||||||
|
public static final ThingTypeUID P300_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_P300);
|
||||||
public static final ThingTypeUID L510_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_L510);
|
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 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 L610_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE_L610);
|
||||||
@ -72,7 +75,7 @@ public class TapoThingConstants {
|
|||||||
/*** SET OF SUPPORTED UIDS ***/
|
/*** SET OF SUPPORTED UIDS ***/
|
||||||
public static final Set<ThingTypeUID> SUPPORTED_BRIDGE_UIDS = Set.of(BRIDGE_THING_TYPE);
|
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,
|
public static final Set<ThingTypeUID> SUPPORTED_SMART_PLUG_UIDS = Set.of(P100_THING_TYPE, P105_THING_TYPE,
|
||||||
P110_THING_TYPE, P115_THING_TYPE);
|
P110_THING_TYPE, P115_THING_TYPE, P300_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_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_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,
|
public static final Set<ThingTypeUID> SUPPORTED_LIGHT_STRIP_UIDS = Set.of(L900_THING_TYPE, L920_THING_TYPE,
|
||||||
@ -85,6 +88,9 @@ public class TapoThingConstants {
|
|||||||
/*** THINGS WITH ENERGY DATA ***/
|
/*** THINGS WITH ENERGY DATA ***/
|
||||||
public static final Set<ThingTypeUID> SUPPORTED_ENERGY_DATA_UIDS = Set.of(P110_THING_TYPE, P115_THING_TYPE);
|
public static final Set<ThingTypeUID> SUPPORTED_ENERGY_DATA_UIDS = Set.of(P110_THING_TYPE, P115_THING_TYPE);
|
||||||
|
|
||||||
|
/*** THINGS WITH CHILDS DATA ***/
|
||||||
|
public static final Set<ThingTypeUID> SUPPORTED_CHILDS_DATA_UIDS = Set.of(P300_THING_TYPE);
|
||||||
|
|
||||||
/*** THINGS WITH CHANNEL GROUPS ***/
|
/*** THINGS WITH CHANNEL GROUPS ***/
|
||||||
public static final Set<ThingTypeUID> CHANNEL_GROUP_THING_SET = Collections
|
public static final Set<ThingTypeUID> CHANNEL_GROUP_THING_SET = Collections
|
||||||
.unmodifiableSet(Stream
|
.unmodifiableSet(Stream
|
||||||
@ -146,6 +152,8 @@ public class TapoThingConstants {
|
|||||||
public static final String ENERGY_PROPERTY_PAST7D = "past7d";
|
public static final String ENERGY_PROPERTY_PAST7D = "past7d";
|
||||||
public static final String ENERGY_PROPERTY_PAST30D = "past30d";
|
public static final String ENERGY_PROPERTY_PAST30D = "past30d";
|
||||||
public static final String ENERGY_PROPERTY_PAST1Y = "past1y";
|
public static final String ENERGY_PROPERTY_PAST1Y = "past1y";
|
||||||
|
// childs management
|
||||||
|
public static final String CHILD_PROPERTY_START_INDEX = "start_index";
|
||||||
|
|
||||||
/*** DEVICE SETTINGS ***/
|
/*** DEVICE SETTINGS ***/
|
||||||
public static final Integer BULB_MIN_COLORTEMP = 2500;
|
public static final Integer BULB_MIN_COLORTEMP = 2500;
|
||||||
|
|||||||
@ -26,6 +26,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
|
|||||||
import org.eclipse.jdt.annotation.Nullable;
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
import org.openhab.binding.tapocontrol.internal.api.TapoDeviceConnector;
|
import org.openhab.binding.tapocontrol.internal.api.TapoDeviceConnector;
|
||||||
import org.openhab.binding.tapocontrol.internal.helpers.TapoErrorHandler;
|
import org.openhab.binding.tapocontrol.internal.helpers.TapoErrorHandler;
|
||||||
|
import org.openhab.binding.tapocontrol.internal.structures.TapoChildData;
|
||||||
import org.openhab.binding.tapocontrol.internal.structures.TapoDeviceConfiguration;
|
import org.openhab.binding.tapocontrol.internal.structures.TapoDeviceConfiguration;
|
||||||
import org.openhab.binding.tapocontrol.internal.structures.TapoDeviceInfo;
|
import org.openhab.binding.tapocontrol.internal.structures.TapoDeviceInfo;
|
||||||
import org.openhab.binding.tapocontrol.internal.structures.TapoEnergyData;
|
import org.openhab.binding.tapocontrol.internal.structures.TapoEnergyData;
|
||||||
@ -131,7 +132,7 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* CHECK SETTINGS
|
* CHECK SETTINGS
|
||||||
*
|
*
|
||||||
* @return TapoErrorHandler with configuration-errors
|
* @return TapoErrorHandler with configuration-errors
|
||||||
*/
|
*/
|
||||||
protected TapoErrorHandler checkSettings() {
|
protected TapoErrorHandler checkSettings() {
|
||||||
@ -203,7 +204,7 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Stop scheduler
|
* Stop scheduler
|
||||||
*
|
*
|
||||||
* @param scheduler ScheduledFeature<?> which schould be stopped
|
* @param scheduler ScheduledFeature<?> which schould be stopped
|
||||||
*/
|
*/
|
||||||
protected void stopScheduler(@Nullable ScheduledFuture<?> scheduler) {
|
protected void stopScheduler(@Nullable ScheduledFuture<?> scheduler) {
|
||||||
@ -228,7 +229,7 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
************************************/
|
************************************/
|
||||||
/**
|
/**
|
||||||
* return device Error
|
* return device Error
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public TapoErrorHandler getError() {
|
public TapoErrorHandler getError() {
|
||||||
@ -237,7 +238,7 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* set device error
|
* set device error
|
||||||
*
|
*
|
||||||
* @param tapoError TapoErrorHandler-Object
|
* @param tapoError TapoErrorHandler-Object
|
||||||
*/
|
*/
|
||||||
public void setError(TapoErrorHandler tapoError) {
|
public void setError(TapoErrorHandler tapoError) {
|
||||||
@ -253,7 +254,7 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
|
|
||||||
/***
|
/***
|
||||||
* Check if ThingType is model
|
* Check if ThingType is model
|
||||||
*
|
*
|
||||||
* @param model
|
* @param model
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@ -271,7 +272,7 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
/**
|
/**
|
||||||
* CHECK IF RECEIVED DATA ARE FROM THE EXPECTED DEVICE
|
* CHECK IF RECEIVED DATA ARE FROM THE EXPECTED DEVICE
|
||||||
* Compare MAC-Adress
|
* Compare MAC-Adress
|
||||||
*
|
*
|
||||||
* @param deviceInfo
|
* @param deviceInfo
|
||||||
* @return true if is the expected device
|
* @return true if is the expected device
|
||||||
*/
|
*/
|
||||||
@ -315,7 +316,7 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* query device Properties
|
* query device Properties
|
||||||
*
|
*
|
||||||
* @param ignoreGap ignore gap to last query. query anyway (force)
|
* @param ignoreGap ignore gap to last query. query anyway (force)
|
||||||
*/
|
*/
|
||||||
public void queryDeviceInfo(boolean ignoreGap) {
|
public void queryDeviceInfo(boolean ignoreGap) {
|
||||||
@ -326,6 +327,10 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
if (SUPPORTED_ENERGY_DATA_UIDS.contains(getThing().getThingTypeUID())) {
|
if (SUPPORTED_ENERGY_DATA_UIDS.contains(getThing().getThingTypeUID())) {
|
||||||
connector.getEnergyUsage();
|
connector.getEnergyUsage();
|
||||||
}
|
}
|
||||||
|
// query childs data
|
||||||
|
if (SUPPORTED_CHILDS_DATA_UIDS.contains(getThing().getThingTypeUID())) {
|
||||||
|
connector.queryChildDevices();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.debug("({}) tried to query DeviceInfo but not loggedIn", uid);
|
logger.debug("({}) tried to query DeviceInfo but not loggedIn", uid);
|
||||||
connect();
|
connect();
|
||||||
@ -334,7 +339,7 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* SET DEVICE INFOs to device
|
* SET DEVICE INFOs to device
|
||||||
*
|
*
|
||||||
* @param deviceInfo
|
* @param deviceInfo
|
||||||
*/
|
*/
|
||||||
public void setDeviceInfo(TapoDeviceInfo deviceInfo) {
|
public void setDeviceInfo(TapoDeviceInfo deviceInfo) {
|
||||||
@ -351,7 +356,7 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set Device EnergyData to device
|
* Set Device EnergyData to device
|
||||||
*
|
*
|
||||||
* @param energyData
|
* @param energyData
|
||||||
*/
|
*/
|
||||||
public void setEnergyData(TapoEnergyData energyData) {
|
public void setEnergyData(TapoEnergyData energyData) {
|
||||||
@ -363,9 +368,21 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
getTimeType(energyData.getTodayRuntime(), Units.MINUTE));
|
getTimeType(energyData.getTodayRuntime(), Units.MINUTE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Device Child data to device
|
||||||
|
*
|
||||||
|
* @param energyData
|
||||||
|
*/
|
||||||
|
public void setChildData(TapoChildData hostData) {
|
||||||
|
hostData.getChildDeviceList().forEach(child -> {
|
||||||
|
publishState(getChannelID(CHANNEL_GROUP_ACTUATOR, CHANNEL_OUTPUT + Integer.toString(child.getPosition())),
|
||||||
|
getOnOffType(child.getDeviceOn()));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle full responsebody received from connector
|
* Handle full responsebody received from connector
|
||||||
*
|
*
|
||||||
* @param responseBody
|
* @param responseBody
|
||||||
*/
|
*/
|
||||||
public void responsePasstrough(String responseBody) {
|
public void responsePasstrough(String responseBody) {
|
||||||
@ -373,10 +390,10 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* UPDATE PROPERTIES
|
* UPDATE PROPERTIES
|
||||||
*
|
*
|
||||||
* If only one property must be changed, there is also a convenient method
|
* If only one property must be changed, there is also a convenient method
|
||||||
* updateProperty(String name, String value).
|
* updateProperty(String name, String value).
|
||||||
*
|
*
|
||||||
* @param TapoDeviceInfo
|
* @param TapoDeviceInfo
|
||||||
*/
|
*/
|
||||||
protected void devicePropertiesChanged(TapoDeviceInfo deviceInfo) {
|
protected void devicePropertiesChanged(TapoDeviceInfo deviceInfo) {
|
||||||
@ -392,7 +409,7 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* update channel state
|
* update channel state
|
||||||
*
|
*
|
||||||
* @param channelID
|
* @param channelID
|
||||||
* @param value
|
* @param value
|
||||||
*/
|
*/
|
||||||
@ -408,7 +425,7 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Connect (login) to device
|
* Connect (login) to device
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public Boolean connect() {
|
public Boolean connect() {
|
||||||
deviceError.reset();
|
deviceError.reset();
|
||||||
@ -471,7 +488,7 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
************************************/
|
************************************/
|
||||||
/**
|
/**
|
||||||
* Get ChannelID including group
|
* Get ChannelID including group
|
||||||
*
|
*
|
||||||
* @param group String channel-group
|
* @param group String channel-group
|
||||||
* @param channel String channel-name
|
* @param channel String channel-name
|
||||||
* @return String channelID
|
* @return String channelID
|
||||||
@ -486,7 +503,7 @@ public abstract class TapoDevice extends BaseThingHandler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Channel from ChannelID
|
* Get Channel from ChannelID
|
||||||
*
|
*
|
||||||
* @param channelID String channelID
|
* @param channelID String channelID
|
||||||
* @return String channel-name
|
* @return String channel-name
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -37,7 +37,7 @@ public class TapoSmartPlug extends TapoDevice {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
* @param thing Thing object representing device
|
* @param thing Thing object representing device
|
||||||
*/
|
*/
|
||||||
public TapoSmartPlug(Thing thing) {
|
public TapoSmartPlug(Thing thing) {
|
||||||
@ -46,26 +46,30 @@ public class TapoSmartPlug extends TapoDevice {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* handle command sent to device
|
* handle command sent to device
|
||||||
*
|
*
|
||||||
* @param channelUID channelUID command is sent to
|
* @param channelUID channelUID command is sent to
|
||||||
* @param command command to be sent
|
* @param command command to be sent
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void handleCommand(ChannelUID channelUID, Command command) {
|
public void handleCommand(ChannelUID channelUID, Command command) {
|
||||||
Boolean refreshInfo = false;
|
boolean refreshInfo = false;
|
||||||
|
String id = channelUID.getIdWithoutGroup();
|
||||||
|
|
||||||
/* perform actions */
|
/* perform actions */
|
||||||
if (command instanceof RefreshType) {
|
if (command instanceof RefreshType) {
|
||||||
refreshInfo = true;
|
refreshInfo = true;
|
||||||
} else if (command == OnOffType.ON) {
|
} else if (command instanceof OnOffType) {
|
||||||
connector.sendDeviceCommand(DEVICE_PROPERTY_ON, true);
|
Boolean targetState = command == OnOffType.ON ? Boolean.TRUE : Boolean.FALSE;
|
||||||
refreshInfo = true;
|
if (CHANNEL_OUTPUT.equals(id)) { // Command is sent to the device output
|
||||||
} else if (command == OnOffType.OFF) {
|
connector.sendDeviceCommand(DEVICE_PROPERTY_ON, targetState);
|
||||||
connector.sendDeviceCommand(DEVICE_PROPERTY_ON, false);
|
refreshInfo = true;
|
||||||
refreshInfo = true;
|
} else if (id.startsWith(CHANNEL_OUTPUT)) { // Command is sent to a child's device output
|
||||||
|
Integer index = Integer.valueOf(id.replace(CHANNEL_OUTPUT, ""));
|
||||||
|
connector.sendChildCommand(index, DEVICE_PROPERTY_ON, targetState);
|
||||||
|
refreshInfo = true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.warn("({}) command type '{}' not supported for channel '{}'", uid, command.toString(),
|
logger.warn("({}) command type '{}' not supported for channel '{}'", uid, command, channelUID.getId());
|
||||||
channelUID.getId());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* refreshInfo */
|
/* refreshInfo */
|
||||||
@ -76,7 +80,7 @@ public class TapoSmartPlug extends TapoDevice {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* UPDATE PROPERTIES
|
* UPDATE PROPERTIES
|
||||||
*
|
*
|
||||||
* @param TapoDeviceInfo
|
* @param TapoDeviceInfo
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -55,7 +55,7 @@ public class PayloadBuilder {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get JSON Payload (STRING)
|
* Get JSON Payload (STRING)
|
||||||
*
|
*
|
||||||
* @return String JSON-Payload
|
* @return String JSON-Payload
|
||||||
*/
|
*/
|
||||||
public String getPayload() {
|
public String getPayload() {
|
||||||
@ -66,7 +66,7 @@ public class PayloadBuilder {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get JSON Payload (JSON-Object)
|
* Get JSON Payload (JSON-Object)
|
||||||
*
|
*
|
||||||
* @return JsonObject JSON-Payload
|
* @return JsonObject JSON-Payload
|
||||||
*/
|
*/
|
||||||
public JsonObject getJsonPayload() {
|
public JsonObject getJsonPayload() {
|
||||||
@ -87,6 +87,6 @@ public class PayloadBuilder {
|
|||||||
* remove all parameters
|
* remove all parameters
|
||||||
*/
|
*/
|
||||||
public void flushParameters(String command) {
|
public void flushParameters(String command) {
|
||||||
this.parameters = new JsonObject();
|
parameters = new JsonObject();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,140 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2010-2023 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.structures;
|
||||||
|
|
||||||
|
import static org.openhab.binding.tapocontrol.internal.constants.TapoBindingSettings.MAC_DIVISION_CHAR;
|
||||||
|
import static org.openhab.binding.tapocontrol.internal.helpers.TapoUtils.formatMac;
|
||||||
|
|
||||||
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tapo Child Device Information class
|
||||||
|
*
|
||||||
|
* @author Gaël L'hopital - Initial contribution
|
||||||
|
*/
|
||||||
|
@NonNullByDefault
|
||||||
|
public class TapoChild {
|
||||||
|
private String fwVer = "";
|
||||||
|
private String hwVer = "";
|
||||||
|
private String type = "";
|
||||||
|
private String model = "";
|
||||||
|
private String mac = "";
|
||||||
|
private String category = "";
|
||||||
|
private String deviceId = "";
|
||||||
|
private boolean overheatStatus = false;
|
||||||
|
private int bindCount = 0;
|
||||||
|
private long onTime = 0;
|
||||||
|
private int slotNumber = 0;
|
||||||
|
private int position = 0;
|
||||||
|
private String nickname = "";
|
||||||
|
private boolean deviceOn = false;
|
||||||
|
private String region = "";
|
||||||
|
|
||||||
|
/***********************************
|
||||||
|
*
|
||||||
|
* GET VALUES
|
||||||
|
*
|
||||||
|
************************************/
|
||||||
|
|
||||||
|
public String getFirmwareVersion() {
|
||||||
|
return fwVer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHardwareVersion() {
|
||||||
|
return hwVer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean isOff() {
|
||||||
|
return !deviceOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean isOn() {
|
||||||
|
return deviceOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMAC() {
|
||||||
|
return formatMac(mac, MAC_DIVISION_CHAR);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getModel() {
|
||||||
|
return model.replace(" Series", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNickname() {
|
||||||
|
return nickname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Number getOnTime() {
|
||||||
|
return onTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegion() {
|
||||||
|
return region;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRepresentationProperty() {
|
||||||
|
return getMAC();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSerial() {
|
||||||
|
return deviceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFwVer() {
|
||||||
|
return fwVer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHwVer() {
|
||||||
|
return hwVer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMac() {
|
||||||
|
return mac;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCategory() {
|
||||||
|
return category;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDeviceId() {
|
||||||
|
return deviceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getOverheatStatus() {
|
||||||
|
return overheatStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getBindCount() {
|
||||||
|
return bindCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getSlotNumber() {
|
||||||
|
return slotNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPosition() {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getDeviceOn() {
|
||||||
|
return deviceOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeviceOn(Boolean deviceOn) {
|
||||||
|
this.deviceOn = deviceOn;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2010-2023 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.structures;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tapo-Child Structure Class
|
||||||
|
*
|
||||||
|
* @author Gaël L'hopital - Initial contribution
|
||||||
|
*/
|
||||||
|
@NonNullByDefault
|
||||||
|
public class TapoChildData {
|
||||||
|
private int startIndex = 0;
|
||||||
|
private int sum = 0;
|
||||||
|
private List<TapoChild> childDeviceList = List.of();
|
||||||
|
|
||||||
|
public int getStartIndex() {
|
||||||
|
return startIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSum() {
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<TapoChild> getChildDeviceList() {
|
||||||
|
return childDeviceList;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2010-2023 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.structures;
|
||||||
|
|
||||||
|
import static org.openhab.binding.tapocontrol.internal.constants.TapoBindingSettings.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.SerializedName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@TapoSubRequest} holds data sent to device in order to act on a child
|
||||||
|
*
|
||||||
|
* @author Gaël L'hopital - Initial contribution
|
||||||
|
*/
|
||||||
|
@NonNullByDefault
|
||||||
|
public record TapoSubRequest(String method, Object params) {
|
||||||
|
private record ChildRequest(String device_id, @SerializedName("requestData") TapoSubRequest requestData) {
|
||||||
|
}
|
||||||
|
|
||||||
|
private record SubMultiple(List<TapoSubRequest> requests) {
|
||||||
|
|
||||||
|
private SubMultiple(String method, TapoChild params) {
|
||||||
|
this(List.of(new TapoSubRequest(method, params)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public TapoSubRequest(String deviceId, String method, TapoChild params) {
|
||||||
|
this(DEVICE_CMD_CONTROL_CHILD, new ChildRequest(deviceId,
|
||||||
|
new TapoSubRequest(DEVICE_CMD_MULTIPLE_REQ, new SubMultiple(method, params))));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -27,6 +27,8 @@ thing-type.tapocontrol.P110.label = P110 SmartPlug
|
|||||||
thing-type.tapocontrol.P110.description = Tapo Smart Monitoring Wifi Plug
|
thing-type.tapocontrol.P110.description = Tapo Smart Monitoring Wifi Plug
|
||||||
thing-type.tapocontrol.P115.label = P115 SmartPlug
|
thing-type.tapocontrol.P115.label = P115 SmartPlug
|
||||||
thing-type.tapocontrol.P115.description = Tapo Smart Monitoring Wifi Plug
|
thing-type.tapocontrol.P115.description = Tapo Smart Monitoring Wifi Plug
|
||||||
|
thing-type.tapocontrol.P300.label = P300 Power Strip
|
||||||
|
thing-type.tapocontrol.P300.description = Tapo Smart Wi-Fi Power Strip
|
||||||
thing-type.tapocontrol.bridge.label = Cloud-Login
|
thing-type.tapocontrol.bridge.label = Cloud-Login
|
||||||
thing-type.tapocontrol.bridge.description = Cloud Connector. Acts as device-bridge
|
thing-type.tapocontrol.bridge.description = Cloud Connector. Acts as device-bridge
|
||||||
|
|
||||||
@ -60,6 +62,14 @@ channel-group-type.tapocontrol.lightEffect.label = Lightning Effect
|
|||||||
channel-group-type.tapocontrol.lightEffect.description = Tapo Lightning Effects
|
channel-group-type.tapocontrol.lightEffect.description = Tapo Lightning Effects
|
||||||
channel-group-type.tapocontrol.lightStrip.label = Color Light Strip
|
channel-group-type.tapocontrol.lightStrip.label = Color Light Strip
|
||||||
channel-group-type.tapocontrol.lightStrip.description = Tapo Multicolor Smart Light Strip
|
channel-group-type.tapocontrol.lightStrip.description = Tapo Multicolor Smart Light Strip
|
||||||
|
channel-group-type.tapocontrol.powerStrip.label = SmartPlug
|
||||||
|
channel-group-type.tapocontrol.powerStrip.description = Tapo Smart Plug Power Outlet
|
||||||
|
channel-group-type.tapocontrol.powerStrip.channel.output1.label = Output Switch 1
|
||||||
|
channel-group-type.tapocontrol.powerStrip.channel.output1.description = Switches the power state on/off of the first socket
|
||||||
|
channel-group-type.tapocontrol.powerStrip.channel.output2.label = Output Switch 2
|
||||||
|
channel-group-type.tapocontrol.powerStrip.channel.output2.description = Switches the power state on/off of the second socket
|
||||||
|
channel-group-type.tapocontrol.powerStrip.channel.output3.label = Output Switch 3
|
||||||
|
channel-group-type.tapocontrol.powerStrip.channel.output3.description = Switches the power state on/off of the third socket
|
||||||
channel-group-type.tapocontrol.smartPlug.label = SmartPlug
|
channel-group-type.tapocontrol.smartPlug.label = SmartPlug
|
||||||
channel-group-type.tapocontrol.smartPlug.description = Tapo Smart Plug Power Outlet
|
channel-group-type.tapocontrol.smartPlug.description = Tapo Smart Plug Power Outlet
|
||||||
|
|
||||||
|
|||||||
@ -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">
|
||||||
|
|
||||||
|
<!-- P300 THING-TYPE (POWER STRIP) -->
|
||||||
|
<thing-type id="P300">
|
||||||
|
<supported-bridge-type-refs>
|
||||||
|
<bridge-type-ref id="bridge"/>
|
||||||
|
</supported-bridge-type-refs>
|
||||||
|
|
||||||
|
<label>P300 Power Strip</label>
|
||||||
|
<description>Tapo Smart Wi-Fi Power Strip</description>
|
||||||
|
<channel-groups>
|
||||||
|
<channel-group id="actuator" typeId="powerStrip"/>
|
||||||
|
<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>
|
||||||
@ -37,6 +37,25 @@
|
|||||||
</channels>
|
</channels>
|
||||||
</channel-group-type>
|
</channel-group-type>
|
||||||
|
|
||||||
|
<channel-group-type id="powerStrip">
|
||||||
|
<label>SmartPlug</label>
|
||||||
|
<description>Tapo Smart Plug Power Outlet</description>
|
||||||
|
<channels>
|
||||||
|
<channel id="output1" typeId="outputChannel">
|
||||||
|
<label>Output Switch 1</label>
|
||||||
|
<description>Switches the power state on/off of the first socket</description>
|
||||||
|
</channel>
|
||||||
|
<channel id="output2" typeId="outputChannel">
|
||||||
|
<label>Output Switch 2</label>
|
||||||
|
<description>Switches the power state on/off of the second socket</description>
|
||||||
|
</channel>
|
||||||
|
<channel id="output3" typeId="outputChannel">
|
||||||
|
<label>Output Switch 3</label>
|
||||||
|
<description>Switches the power state on/off of the third socket</description>
|
||||||
|
</channel>
|
||||||
|
</channels>
|
||||||
|
</channel-group-type>
|
||||||
|
|
||||||
<!--Light-Bulb Channel Type -->
|
<!--Light-Bulb Channel Type -->
|
||||||
<channel-group-type id="lightBulb">
|
<channel-group-type id="lightBulb">
|
||||||
<label>Light Bulb</label>
|
<label>Light Bulb</label>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user