Merge PR #392: Tuya: Add light device support

This commit is contained in:
Jenkins nymea 2021-02-26 10:28:07 +01:00
commit 2adb901536
5 changed files with 333 additions and 82 deletions

View File

@ -3,3 +3,12 @@
This plugin allows to make use of Tuya based devices through the Tuya cloud. This includes all the devices that work with the Smart Life app.
The plugin will allow logging in with the Smart Life app account and fetch all the devices connected to the Tuya/Smart Life cloud.
Currently supported devices:
* Smart plugs
* Lights [1]
* Roller shutters
[1] Please note, that light support is somewhat rudimentary as the Tuya cloud api does not allow integrating that very well.

View File

@ -49,15 +49,25 @@
const int queryInterval = 130;
const int discoveryInterval = 610;
QHash<ThingClassId, ParamTypeId> idParamTypeIdsMap = {
{tuyaClosableThingClassId, tuyaClosableThingIdParamTypeId},
{tuyaSwitchThingClassId, tuyaSwitchThingIdParamTypeId},
{tuyaLightThingClassId, tuyaLightThingIdParamTypeId}
};
QHash<ThingClassId, StateTypeId> connectedStateTypeIdsMap = {
{tuyaClosableThingClassId, tuyaClosableConnectedStateTypeId},
{tuyaSwitchThingClassId, tuyaSwitchConnectedStateTypeId},
{tuyaLightThingClassId, tuyaLightConnectedStateTypeId}
};
QHash<ActionTypeId, ThingClassId> powerStateTypeIdsMap = {
{tuyaSwitchThingClassId, tuyaSwitchPowerStateTypeId},
{tuyaLightThingClassId, tuyaLightPowerStateTypeId}
};
IntegrationPluginTuya::IntegrationPluginTuya(QObject *parent): IntegrationPlugin(parent)
{
m_devIdParamTypeIdsMap[tuyaClosableThingClassId] = tuyaClosableThingIdParamTypeId;
m_devIdParamTypeIdsMap[tuyaSwitchThingClassId] = tuyaSwitchThingIdParamTypeId;
m_connectedStateTypeIdsMap[tuyaClosableThingClassId] = tuyaClosableConnectedStateTypeId;
m_connectedStateTypeIdsMap[tuyaSwitchThingClassId] = tuyaSwitchConnectedStateTypeId;
m_powerStateTypeIdsMap[tuyaSwitchThingClassId] = tuyaSwitchPowerStateTypeId;
}
IntegrationPluginTuya::~IntegrationPluginTuya()
@ -236,19 +246,20 @@ void IntegrationPluginTuya::confirmPairing(ThingPairingInfo *info, const QString
void IntegrationPluginTuya::executeAction(ThingActionInfo *info)
{
if (info->action().actionTypeId() == tuyaSwitchPowerActionTypeId) {
bool on = info->action().param(tuyaSwitchPowerActionPowerParamTypeId).value().toBool();
QString devId = info->thing()->paramValue(tuyaSwitchThingIdParamTypeId).toString();
QString devId = info->thing()->paramValue(idParamTypeIdsMap.value(info->thing()->thingClassId())).toString();
if (powerStateTypeIdsMap.values().contains(info->action().actionTypeId())) {
bool on = info->action().paramValue(info->action().actionTypeId()).toBool();
controlTuyaSwitch(devId, "turnOnOff", on ? "1" : "0", info);
connect(info, &ThingActionInfo::finished, [info, on](){
if (info->status() == Thing::ThingErrorNoError) {
info->thing()->setStateValue(tuyaSwitchPowerStateTypeId, on);
info->thing()->setStateValue(powerStateTypeIdsMap.value(info->thing()->thingClassId()), on);
}
});
return;
}
if (info->thing()->thingClassId() == tuyaClosableThingClassId) {
QString devId = info->thing()->paramValue(tuyaClosableThingIdParamTypeId).toString();
if (info->action().actionTypeId() == tuyaClosableOpenActionTypeId) {
controlTuyaSwitch(devId, "turnOnOff", "1", info);
return;
@ -261,7 +272,45 @@ void IntegrationPluginTuya::executeAction(ThingActionInfo *info)
controlTuyaSwitch(devId, "startStop", "0", info);
return;
}
}
if (info->action().actionTypeId() == tuyaLightBrightnessActionTypeId) {
int brightness = info->action().paramValue(tuyaLightBrightnessActionBrightnessParamTypeId).toInt() * 10;
controlTuyaSwitch(devId, "brightnessSet", QString::number(qMax(10, brightness)), info);
connect(info, &ThingActionInfo::finished, [info, brightness](){
if (info->status() == Thing::ThingErrorNoError) {
info->thing()->setStateValue(tuyaLightBrightnessStateTypeId, brightness / 10);
}
});
return;
}
if (info->action().actionTypeId() == tuyaLightColorActionTypeId) {
QColor color = info->action().paramValue(tuyaLightColorActionColorParamTypeId).value<QColor>();
QVariantMap colorMap;
colorMap.insert("hue", color.hsvHue());
colorMap.insert("saturation", color.hsvSaturation());
colorMap.insert("brightness", qMax(10, info->thing()->stateValue(tuyaLightBrightnessStateTypeId).toInt() * 10));
controlTuyaSwitch(devId, "colorSet", colorMap, info);
connect(info, &ThingActionInfo::finished, [info, color](){
if (info->status() == Thing::ThingErrorNoError) {
info->thing()->setStateValue(tuyaLightColorStateTypeId, color);
}
});
return;
}
if (info->action().actionTypeId() == tuyaLightColorTemperatureActionTypeId) {
int ct = info->action().paramValue(tuyaLightColorTemperatureStateTypeId).toInt();
QVariantMap params;
params.insert("value", ct * 10);
controlTuyaSwitch(devId, "colorTemperatureSet", params, info);
connect(info, &ThingActionInfo::finished, [info, ct](){
if (info->status() == Thing::ThingErrorNoError) {
info->thing()->setStateValue(tuyaLightColorTemperatureStateTypeId, ct);
}
});
return;
}
Q_ASSERT_X(false, "tuyaplugin", "Unhandled action type " + info->action().actionTypeId().toByteArray());
}
@ -406,33 +455,50 @@ void IntegrationPluginTuya::updateChildDevices(Thing *thing)
QString name = deviceMap.value("name").toString();
if (devType == "switch") {
bool online = deviceMap.value("data").toMap().value("online").toBool();
bool state = deviceMap.value("data").toMap().value("state").toBool();
Thing *d = myThings().findByParams(ParamList() << Param(tuyaSwitchThingIdParamTypeId, id));
if (d) {
qCDebug(dcTuya()) << "Found existing Tuya switch" << d->name() << id << name << (online ? "online:" : "offline") << (state ? "on": "off");
d->setStateValue(tuyaSwitchConnectedStateTypeId, online);
d->setStateValue(tuyaSwitchPowerStateTypeId, state);
} else {
if (!d) {
qCDebug(dcTuya()) << "Found new Tuya switch" << id << name;
ThingDescriptor descriptor(tuyaSwitchThingClassId, name, QString(), thing->id());
descriptor.setParams(ParamList() << Param(tuyaSwitchThingIdParamTypeId, id));
unknownDevices.append(descriptor);
}
} else if (devType == "cover") {
bool online = deviceMap.value("data").toMap().value("online").toBool();
Thing *d = myThings().findByParams(ParamList() << Param(tuyaClosableThingIdParamTypeId, id));
if (d) {
qCDebug(dcTuya()) << "Found existing Tuya cover" << d->name() << id << name << (online ? "online" : "offline");
d->setStateValue(tuyaClosableConnectedStateTypeId, online);
} else {
bool online = deviceMap.value("data").toMap().value("online").toBool();
bool state = deviceMap.value("data").toMap().value("state").toBool();
qCDebug(dcTuya()) << "Found existing Tuya switch" << d->name() << id << name << (online ? "online:" : "offline") << (state ? "on": "off");
d->setStateValue(tuyaSwitchConnectedStateTypeId, online);
d->setStateValue(tuyaSwitchPowerStateTypeId, state);
}
} else if (devType == "cover") {
Thing *d = myThings().findByParams(ParamList() << Param(tuyaClosableThingIdParamTypeId, id));
if (!d) {
qCDebug(dcTuya()) << "Found new Tuya cover" << id << name;
ThingDescriptor descriptor(tuyaClosableThingClassId, name, QString(), thing->id());
descriptor.setParams(ParamList() << Param(tuyaClosableThingIdParamTypeId, id));
unknownDevices.append(descriptor);
} else {
bool online = deviceMap.value("data").toMap().value("online").toBool();
qCDebug(dcTuya()) << "Found existing Tuya cover" << d->name() << id << name << (online ? "online" : "offline");
d->setStateValue(tuyaClosableConnectedStateTypeId, online);
}
} else if (devType == "light") {
Thing *d = myThings().findByParams(ParamList() << Param(tuyaLightThingIdParamTypeId, id));
if (!d) {
qCDebug(dcTuya()) << "Found new color Tuya light" << id << name;
ThingDescriptor descriptor(tuyaLightThingClassId, name, QString(), thing->id());
descriptor.setParams(ParamList() << Param(tuyaLightThingIdParamTypeId, id));
unknownDevices.append(descriptor);
} else {
bool online = deviceMap.value("data").toMap().value("online").toBool();
bool state = deviceMap.value("data").toMap().value("state").toBool();
qCDebug(dcTuya()) << "Found existing Tuya color light" << d->name() << id << name << (online ? "online" : "offline");
int brightness = deviceMap.value("data").toMap().value("brightness").toInt() / 10; // Apparently the value in the tuya cloud is 10 - 1000
d->setStateValue(tuyaLightConnectedStateTypeId, online);
d->setStateValue(tuyaLightPowerStateTypeId, state);
d->setStateValue(tuyaLightBrightnessStateTypeId, brightness);
}
} else {
qCWarning(dcTuya()) << "Skipping unsupported thing type:" << devType;
qCWarning(dcTuya()) << "Please report this including the following data:\n" << qUtf8Printable(QJsonDocument::fromVariant(deviceVariant).toJson());
@ -451,7 +517,7 @@ void IntegrationPluginTuya::queryDevice(Thing *thing)
{
qCDebug(dcTuya()) << "Updating thing:" << thing;
QString devId = thing->paramValue(m_devIdParamTypeIdsMap.value(thing->thingClassId())).toString();
QString devId = thing->paramValue(idParamTypeIdsMap.value(thing->thingClassId())).toString();
pluginStorage()->beginGroup(thing->parentId().toString());
QString accesToken = pluginStorage()->value("accessToken").toString();
@ -510,15 +576,15 @@ void IntegrationPluginTuya::queryDevice(Thing *thing)
bool state = result.value("payload").toMap().value("data").toMap().value("state").toBool();
qCDebug(dcTuya()) << "Device" << thing->name() << "is online:" << connected << "on:" << state;
thing->setStateValue(m_connectedStateTypeIdsMap.value(thing->thingClassId()), connected);
thing->setStateValue(connectedStateTypeIdsMap.value(thing->thingClassId()), connected);
if (m_powerStateTypeIdsMap.contains(thing->thingClassId())) {
thing->setStateValue(m_powerStateTypeIdsMap.value(thing->thingClassId()), state);
if (powerStateTypeIdsMap.contains(thing->thingClassId())) {
thing->setStateValue(powerStateTypeIdsMap.value(thing->thingClassId()), state);
}
});
}
void IntegrationPluginTuya::controlTuyaSwitch(const QString &devId, const QString &command, const QString &value, ThingActionInfo *info)
void IntegrationPluginTuya::controlTuyaSwitch(const QString &devId, const QString &command, const QVariant &value, ThingActionInfo *info)
{
Thing *thing = info->thing();
Thing *parentDevice = myThings().findById(thing->parentId());
@ -550,6 +616,8 @@ void IntegrationPluginTuya::controlTuyaSwitch(const QString &devId, const QStrin
QJsonDocument jsonDoc = QJsonDocument::fromVariant(data);
qCDebug(dcTuya()) << "Controlling payload:" << qUtf8Printable(jsonDoc.toJson(QJsonDocument::Indented));
QNetworkReply *reply = hardwareManager()->networkManager()->post(request, jsonDoc.toJson(QJsonDocument::Compact));
connect(reply, &QNetworkReply::finished, [reply](){reply->deleteLater();});
connect(reply, &QNetworkReply::finished, info, [info, reply](){
@ -571,7 +639,7 @@ void IntegrationPluginTuya::controlTuyaSwitch(const QString &devId, const QStrin
QVariantMap dataMap = jsonDoc.toVariant().toMap();
bool success = dataMap.value("header").toMap().value("code").toString() == "SUCCESS";
if (!success) {
qCWarning(dcTuya()) << "Tuya response indicates an issue...";
qCWarning(dcTuya()) << "Tuya response indicates an issue:" << qUtf8Printable(jsonDoc.toJson(QJsonDocument::Indented));
info->finish(Thing::ThingErrorHardwareFailure);
return;
}

View File

@ -64,16 +64,12 @@ private:
void updateChildDevices(Thing *thing);
void queryDevice(Thing *thing);
void controlTuyaSwitch(const QString &devId, const QString &command, const QString &value, ThingActionInfo *info);
void controlTuyaSwitch(const QString &devId, const QString &command, const QVariant &value, ThingActionInfo *info);
QHash<ThingId, QTimer*> m_tokenExpiryTimers;
PluginTimer *m_pluginTimerQuery = nullptr;
PluginTimer *m_pluginTimerDiscovery = nullptr;
QHash<ThingClassId, ParamTypeId> m_devIdParamTypeIdsMap;
QHash<ThingClassId, StateTypeId> m_connectedStateTypeIdsMap;
QHash<ThingClassId, StateTypeId> m_powerStateTypeIdsMap;
QHash<Thing*, QList<Thing*>> m_pollQueue;
};

View File

@ -124,6 +124,79 @@
"displayName": "Stop"
}
]
},
{
"id": "6aaa67b5-b1ef-41e8-af72-0915e529b3c9",
"name": "tuyaLight",
"displayName": "Tuya color light",
"createMethods": ["auto"],
"interfaces": ["colorlight", "connectable"],
"paramTypes": [
{
"id": "7fda1e07-6e80-465a-8322-872d8ab42583",
"name": "id",
"displayName": "ID",
"type": "QString",
"defaultValue": ""
}
],
"stateTypes": [
{
"id": "6735b5eb-091b-4cad-aaa4-33ff76690e68",
"name": "connected",
"displayName": "Connected",
"displayNameEvent": "Connected changed",
"type": "bool",
"defaultValue": false,
"cached": false
},
{
"id": "5b2f7c3e-6701-447f-9158-53abb5e81395",
"name": "power",
"displayName": "Power",
"displayNameEvent": "Power changed",
"displayNameAction": "Set power",
"type": "bool",
"defaultValue": false,
"writable": true,
"ioType": "digitalOutput"
},
{
"id": "e2eba44d-73f9-43bc-97a3-ac4ff347b02c",
"name": "brightness",
"displayName": "Brightness",
"displayNameEvent": "Brightness changed",
"displayNameAction": "Set brightness",
"type": "int",
"minValue": 0,
"maxValue": 100,
"unit": "Percentage",
"defaultValue": "0",
"writable": true
},
{
"id": "7ccf9dc3-6b3f-4793-b0d5-3c97afb34cf0",
"name": "color",
"displayName": "Color",
"displayNameEvent": "Color changed",
"displayNameAction": "Set color",
"type": "QColor",
"defaultValue": "white",
"writable": true
},
{
"id": "8a07b6ca-3cb1-43f1-9b49-405349c2f146",
"name": "colorTemperature",
"displayName": "Color temperature",
"displayNameEvent": "Color temperature changed",
"displayNameAction": "Set color temperature",
"type": "int",
"minValue": 0,
"maxValue": 100,
"defaultValue": "50",
"writable": true
}
]
}
]
}

View File

@ -4,33 +4,33 @@
<context>
<name>IntegrationPluginTuya</name>
<message>
<location filename="../integrationplugintuya.cpp" line="93"/>
<location filename="../integrationplugintuya.cpp" line="113"/>
<source>Error authenticating to Tuya thing.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationplugintuya.cpp" line="136"/>
<location filename="../integrationplugintuya.cpp" line="176"/>
<source>Please enter username and password for your Tuya (Smart Life) account.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationplugintuya.cpp" line="164"/>
<location filename="../integrationplugintuya.cpp" line="172"/>
<location filename="../integrationplugintuya.cpp" line="204"/>
<location filename="../integrationplugintuya.cpp" line="212"/>
<source>Error communicating with Tuya server.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationplugintuya.cpp" line="183"/>
<location filename="../integrationplugintuya.cpp" line="223"/>
<source>Wrong username or password.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationplugintuya.cpp" line="440"/>
<location filename="../integrationplugintuya.cpp" line="626"/>
<source>Error connecting to Tuya switch.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationplugintuya.cpp" line="449"/>
<location filename="../integrationplugintuya.cpp" line="635"/>
<source>Received an unexpected reply from the Tuya switch.</source>
<translation type="unfinished"></translation>
</message>
@ -38,20 +38,80 @@
<context>
<name>tuya</name>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="50"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="80"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="83"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="86"/>
<source>Brightness</source>
<extracomment>The name of the ParamType (ThingClass: tuyaLight, ActionType: brightness, ID: {e2eba44d-73f9-43bc-97a3-ac4ff347b02c})
----------
The name of the ParamType (ThingClass: tuyaLight, EventType: brightness, ID: {e2eba44d-73f9-43bc-97a3-ac4ff347b02c})
----------
The name of the StateType ({e2eba44d-73f9-43bc-97a3-ac4ff347b02c}) of ThingClass tuyaLight</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="89"/>
<source>Brightness changed</source>
<extracomment>The name of the EventType ({e2eba44d-73f9-43bc-97a3-ac4ff347b02c}) of ThingClass tuyaLight</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="92"/>
<source>Close blinds</source>
<extracomment>The name of the ActionType ({f266ea4a-052f-466b-bf31-8c5c7e80a843}) of ThingClass tuyaClosable</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="53"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="56"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="59"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="62"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="65"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="68"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="95"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="98"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="101"/>
<source>Color</source>
<extracomment>The name of the ParamType (ThingClass: tuyaLight, ActionType: color, ID: {7ccf9dc3-6b3f-4793-b0d5-3c97afb34cf0})
----------
The name of the ParamType (ThingClass: tuyaLight, EventType: color, ID: {7ccf9dc3-6b3f-4793-b0d5-3c97afb34cf0})
----------
The name of the StateType ({7ccf9dc3-6b3f-4793-b0d5-3c97afb34cf0}) of ThingClass tuyaLight</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="104"/>
<source>Color changed</source>
<extracomment>The name of the EventType ({7ccf9dc3-6b3f-4793-b0d5-3c97afb34cf0}) of ThingClass tuyaLight</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="107"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="110"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="113"/>
<source>Color temperature</source>
<extracomment>The name of the ParamType (ThingClass: tuyaLight, ActionType: colorTemperature, ID: {8a07b6ca-3cb1-43f1-9b49-405349c2f146})
----------
The name of the ParamType (ThingClass: tuyaLight, EventType: colorTemperature, ID: {8a07b6ca-3cb1-43f1-9b49-405349c2f146})
----------
The name of the StateType ({8a07b6ca-3cb1-43f1-9b49-405349c2f146}) of ThingClass tuyaLight</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="116"/>
<source>Color temperature changed</source>
<extracomment>The name of the EventType ({8a07b6ca-3cb1-43f1-9b49-405349c2f146}) of ThingClass tuyaLight</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="119"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="122"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="125"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="128"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="131"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="134"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="137"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="140"/>
<source>Connected</source>
<extracomment>The name of the ParamType (ThingClass: tuyaClosable, EventType: connected, ID: {cf051676-3041-4e90-8c37-63e98412dfe8})
<extracomment>The name of the ParamType (ThingClass: tuyaLight, EventType: connected, ID: {6735b5eb-091b-4cad-aaa4-33ff76690e68})
----------
The name of the StateType ({6735b5eb-091b-4cad-aaa4-33ff76690e68}) of ThingClass tuyaLight
----------
The name of the ParamType (ThingClass: tuyaClosable, EventType: connected, ID: {cf051676-3041-4e90-8c37-63e98412dfe8})
----------
The name of the StateType ({cf051676-3041-4e90-8c37-63e98412dfe8}) of ThingClass tuyaClosable
----------
@ -65,11 +125,14 @@ The name of the StateType ({c844a23a-301b-4e6c-ba18-2926a38e6bf5}) of ThingClass
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="71"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="74"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="77"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="143"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="146"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="149"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="152"/>
<source>Connected changed</source>
<extracomment>The name of the EventType ({cf051676-3041-4e90-8c37-63e98412dfe8}) of ThingClass tuyaClosable
<extracomment>The name of the EventType ({6735b5eb-091b-4cad-aaa4-33ff76690e68}) of ThingClass tuyaLight
----------
The name of the EventType ({cf051676-3041-4e90-8c37-63e98412dfe8}) of ThingClass tuyaClosable
----------
The name of the EventType ({b5ac83c4-e1ff-4682-80f2-61cca097ed8f}) of ThingClass tuyaSwitch
----------
@ -77,17 +140,20 @@ The name of the EventType ({c844a23a-301b-4e6c-ba18-2926a38e6bf5}) of ThingClass
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="80"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="83"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="155"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="158"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="161"/>
<source>ID</source>
<extracomment>The name of the ParamType (ThingClass: tuyaClosable, Type: thing, ID: {b9b2bb1f-b44b-43d7-8bbb-e67cf1b5d0a0})
<extracomment>The name of the ParamType (ThingClass: tuyaLight, Type: thing, ID: {7fda1e07-6e80-465a-8322-872d8ab42583})
----------
The name of the ParamType (ThingClass: tuyaClosable, Type: thing, ID: {b9b2bb1f-b44b-43d7-8bbb-e67cf1b5d0a0})
----------
The name of the ParamType (ThingClass: tuyaSwitch, Type: thing, ID: {bfdb02b0-d12d-4385-a03d-d2c147c2aca2})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="86"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="89"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="164"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="167"/>
<source>Logged in</source>
<extracomment>The name of the ParamType (ThingClass: tuyaCloud, EventType: loggedIn, ID: {33e9d30c-c988-4cd4-8d39-ce84bcfa79c5})
----------
@ -95,23 +161,32 @@ The name of the StateType ({33e9d30c-c988-4cd4-8d39-ce84bcfa79c5}) of ThingClass
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="92"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="170"/>
<source>Logged in changed</source>
<extracomment>The name of the EventType ({33e9d30c-c988-4cd4-8d39-ce84bcfa79c5}) of ThingClass tuyaCloud</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="95"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="173"/>
<source>Open blinds</source>
<extracomment>The name of the ActionType ({f9f34515-670d-439e-851a-0bf82f867882}) of ThingClass tuyaClosable</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="98"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="101"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="104"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="176"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="179"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="182"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="185"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="188"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="191"/>
<source>Power</source>
<extracomment>The name of the ParamType (ThingClass: tuyaSwitch, ActionType: power, ID: {c84a703a-d1c7-491d-9507-5a69b217ac53})
<extracomment>The name of the ParamType (ThingClass: tuyaLight, ActionType: power, ID: {5b2f7c3e-6701-447f-9158-53abb5e81395})
----------
The name of the ParamType (ThingClass: tuyaLight, EventType: power, ID: {5b2f7c3e-6701-447f-9158-53abb5e81395})
----------
The name of the StateType ({5b2f7c3e-6701-447f-9158-53abb5e81395}) of ThingClass tuyaLight
----------
The name of the ParamType (ThingClass: tuyaSwitch, ActionType: power, ID: {c84a703a-d1c7-491d-9507-5a69b217ac53})
----------
The name of the ParamType (ThingClass: tuyaSwitch, EventType: power, ID: {c84a703a-d1c7-491d-9507-5a69b217ac53})
----------
@ -119,26 +194,50 @@ The name of the StateType ({c84a703a-d1c7-491d-9507-5a69b217ac53}) of ThingClass
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="107"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="194"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="197"/>
<source>Power changed</source>
<extracomment>The name of the EventType ({c84a703a-d1c7-491d-9507-5a69b217ac53}) of ThingClass tuyaSwitch</extracomment>
<extracomment>The name of the EventType ({5b2f7c3e-6701-447f-9158-53abb5e81395}) of ThingClass tuyaLight
----------
The name of the EventType ({c84a703a-d1c7-491d-9507-5a69b217ac53}) of ThingClass tuyaSwitch</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="110"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="200"/>
<source>Set brightness</source>
<extracomment>The name of the ActionType ({e2eba44d-73f9-43bc-97a3-ac4ff347b02c}) of ThingClass tuyaLight</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="203"/>
<source>Set color</source>
<extracomment>The name of the ActionType ({7ccf9dc3-6b3f-4793-b0d5-3c97afb34cf0}) of ThingClass tuyaLight</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="206"/>
<source>Set color temperature</source>
<extracomment>The name of the ActionType ({8a07b6ca-3cb1-43f1-9b49-405349c2f146}) of ThingClass tuyaLight</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="209"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="212"/>
<source>Set power</source>
<extracomment>The name of the ActionType ({c84a703a-d1c7-491d-9507-5a69b217ac53}) of ThingClass tuyaSwitch</extracomment>
<extracomment>The name of the ActionType ({5b2f7c3e-6701-447f-9158-53abb5e81395}) of ThingClass tuyaLight
----------
The name of the ActionType ({c84a703a-d1c7-491d-9507-5a69b217ac53}) of ThingClass tuyaSwitch</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="113"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="215"/>
<source>Stop</source>
<extracomment>The name of the ActionType ({8fc2ea7d-b945-41c8-bbda-820bdadc9e02}) of ThingClass tuyaClosable</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="116"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="119"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="218"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="221"/>
<source>Tuya</source>
<extracomment>The name of the vendor ({d5dd33a7-e5f6-48be-bdd9-1a1ec04152c9})
----------
@ -146,32 +245,38 @@ The name of the plugin tuya ({405643b3-22ec-4a36-9808-e8b1405b01c9})</extracomme
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="122"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="224"/>
<source>Tuya blinds</source>
<extracomment>The name of the ThingClass ({d4bb0170-596d-4904-8fd0-fd8e7ad39f72})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="125"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="227"/>
<source>Tuya cloud login</source>
<extracomment>The name of the ThingClass ({dd6dcd91-f667-45a5-9594-12b95f94337e})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="128"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="230"/>
<source>Tuya color light</source>
<extracomment>The name of the ThingClass ({6aaa67b5-b1ef-41e8-af72-0915e529b3c9})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="233"/>
<source>Tuya switch</source>
<extracomment>The name of the ThingClass ({393d7256-e792-4dca-adb5-b13750e05391})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="131"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="236"/>
<source>User changed</source>
<extracomment>The name of the EventType ({15bc38a7-0962-4f3b-a0b1-4f164958493b}) of ThingClass tuyaCloud</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="134"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="137"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="239"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="242"/>
<source>Username</source>
<extracomment>The name of the ParamType (ThingClass: tuyaCloud, EventType: userDisplayName, ID: {15bc38a7-0962-4f3b-a0b1-4f164958493b})
----------