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. 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. 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 queryInterval = 130;
const int discoveryInterval = 610; 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) 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() IntegrationPluginTuya::~IntegrationPluginTuya()
@ -236,19 +246,20 @@ void IntegrationPluginTuya::confirmPairing(ThingPairingInfo *info, const QString
void IntegrationPluginTuya::executeAction(ThingActionInfo *info) void IntegrationPluginTuya::executeAction(ThingActionInfo *info)
{ {
if (info->action().actionTypeId() == tuyaSwitchPowerActionTypeId) { QString devId = info->thing()->paramValue(idParamTypeIdsMap.value(info->thing()->thingClassId())).toString();
bool on = info->action().param(tuyaSwitchPowerActionPowerParamTypeId).value().toBool();
QString devId = info->thing()->paramValue(tuyaSwitchThingIdParamTypeId).toString(); if (powerStateTypeIdsMap.values().contains(info->action().actionTypeId())) {
bool on = info->action().paramValue(info->action().actionTypeId()).toBool();
controlTuyaSwitch(devId, "turnOnOff", on ? "1" : "0", info); controlTuyaSwitch(devId, "turnOnOff", on ? "1" : "0", info);
connect(info, &ThingActionInfo::finished, [info, on](){ connect(info, &ThingActionInfo::finished, [info, on](){
if (info->status() == Thing::ThingErrorNoError) { if (info->status() == Thing::ThingErrorNoError) {
info->thing()->setStateValue(tuyaSwitchPowerStateTypeId, on); info->thing()->setStateValue(powerStateTypeIdsMap.value(info->thing()->thingClassId()), on);
} }
}); });
return; return;
} }
if (info->thing()->thingClassId() == tuyaClosableThingClassId) { if (info->thing()->thingClassId() == tuyaClosableThingClassId) {
QString devId = info->thing()->paramValue(tuyaClosableThingIdParamTypeId).toString();
if (info->action().actionTypeId() == tuyaClosableOpenActionTypeId) { if (info->action().actionTypeId() == tuyaClosableOpenActionTypeId) {
controlTuyaSwitch(devId, "turnOnOff", "1", info); controlTuyaSwitch(devId, "turnOnOff", "1", info);
return; return;
@ -261,7 +272,45 @@ void IntegrationPluginTuya::executeAction(ThingActionInfo *info)
controlTuyaSwitch(devId, "startStop", "0", info); controlTuyaSwitch(devId, "startStop", "0", info);
return; 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()); 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(); QString name = deviceMap.value("name").toString();
if (devType == "switch") { 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)); Thing *d = myThings().findByParams(ParamList() << Param(tuyaSwitchThingIdParamTypeId, id));
if (d) { 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 {
qCDebug(dcTuya()) << "Found new Tuya switch" << id << name; qCDebug(dcTuya()) << "Found new Tuya switch" << id << name;
ThingDescriptor descriptor(tuyaSwitchThingClassId, name, QString(), thing->id()); ThingDescriptor descriptor(tuyaSwitchThingClassId, name, QString(), thing->id());
descriptor.setParams(ParamList() << Param(tuyaSwitchThingIdParamTypeId, id)); descriptor.setParams(ParamList() << Param(tuyaSwitchThingIdParamTypeId, id));
unknownDevices.append(descriptor); 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 { } 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; qCDebug(dcTuya()) << "Found new Tuya cover" << id << name;
ThingDescriptor descriptor(tuyaClosableThingClassId, name, QString(), thing->id()); ThingDescriptor descriptor(tuyaClosableThingClassId, name, QString(), thing->id());
descriptor.setParams(ParamList() << Param(tuyaClosableThingIdParamTypeId, id)); descriptor.setParams(ParamList() << Param(tuyaClosableThingIdParamTypeId, id));
unknownDevices.append(descriptor); 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 { } else {
qCWarning(dcTuya()) << "Skipping unsupported thing type:" << devType; qCWarning(dcTuya()) << "Skipping unsupported thing type:" << devType;
qCWarning(dcTuya()) << "Please report this including the following data:\n" << qUtf8Printable(QJsonDocument::fromVariant(deviceVariant).toJson()); 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; 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()); pluginStorage()->beginGroup(thing->parentId().toString());
QString accesToken = pluginStorage()->value("accessToken").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(); bool state = result.value("payload").toMap().value("data").toMap().value("state").toBool();
qCDebug(dcTuya()) << "Device" << thing->name() << "is online:" << connected << "on:" << state; 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())) { if (powerStateTypeIdsMap.contains(thing->thingClassId())) {
thing->setStateValue(m_powerStateTypeIdsMap.value(thing->thingClassId()), state); 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 *thing = info->thing();
Thing *parentDevice = myThings().findById(thing->parentId()); Thing *parentDevice = myThings().findById(thing->parentId());
@ -550,6 +616,8 @@ void IntegrationPluginTuya::controlTuyaSwitch(const QString &devId, const QStrin
QJsonDocument jsonDoc = QJsonDocument::fromVariant(data); QJsonDocument jsonDoc = QJsonDocument::fromVariant(data);
qCDebug(dcTuya()) << "Controlling payload:" << qUtf8Printable(jsonDoc.toJson(QJsonDocument::Indented));
QNetworkReply *reply = hardwareManager()->networkManager()->post(request, jsonDoc.toJson(QJsonDocument::Compact)); QNetworkReply *reply = hardwareManager()->networkManager()->post(request, jsonDoc.toJson(QJsonDocument::Compact));
connect(reply, &QNetworkReply::finished, [reply](){reply->deleteLater();}); connect(reply, &QNetworkReply::finished, [reply](){reply->deleteLater();});
connect(reply, &QNetworkReply::finished, info, [info, reply](){ connect(reply, &QNetworkReply::finished, info, [info, reply](){
@ -571,7 +639,7 @@ void IntegrationPluginTuya::controlTuyaSwitch(const QString &devId, const QStrin
QVariantMap dataMap = jsonDoc.toVariant().toMap(); QVariantMap dataMap = jsonDoc.toVariant().toMap();
bool success = dataMap.value("header").toMap().value("code").toString() == "SUCCESS"; bool success = dataMap.value("header").toMap().value("code").toString() == "SUCCESS";
if (!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); info->finish(Thing::ThingErrorHardwareFailure);
return; return;
} }

View File

@ -64,16 +64,12 @@ private:
void updateChildDevices(Thing *thing); void updateChildDevices(Thing *thing);
void queryDevice(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; QHash<ThingId, QTimer*> m_tokenExpiryTimers;
PluginTimer *m_pluginTimerQuery = nullptr; PluginTimer *m_pluginTimerQuery = nullptr;
PluginTimer *m_pluginTimerDiscovery = 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; QHash<Thing*, QList<Thing*>> m_pollQueue;
}; };

View File

@ -124,6 +124,79 @@
"displayName": "Stop" "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> <context>
<name>IntegrationPluginTuya</name> <name>IntegrationPluginTuya</name>
<message> <message>
<location filename="../integrationplugintuya.cpp" line="93"/> <location filename="../integrationplugintuya.cpp" line="113"/>
<source>Error authenticating to Tuya thing.</source> <source>Error authenticating to Tuya thing.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Please enter username and password for your Tuya (Smart Life) account.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../integrationplugintuya.cpp" line="164"/> <location filename="../integrationplugintuya.cpp" line="204"/>
<location filename="../integrationplugintuya.cpp" line="172"/> <location filename="../integrationplugintuya.cpp" line="212"/>
<source>Error communicating with Tuya server.</source> <source>Error communicating with Tuya server.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../integrationplugintuya.cpp" line="183"/> <location filename="../integrationplugintuya.cpp" line="223"/>
<source>Wrong username or password.</source> <source>Wrong username or password.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../integrationplugintuya.cpp" line="440"/> <location filename="../integrationplugintuya.cpp" line="626"/>
<source>Error connecting to Tuya switch.</source> <source>Error connecting to Tuya switch.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../integrationplugintuya.cpp" line="449"/> <location filename="../integrationplugintuya.cpp" line="635"/>
<source>Received an unexpected reply from the Tuya switch.</source> <source>Received an unexpected reply from the Tuya switch.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -38,20 +38,80 @@
<context> <context>
<name>tuya</name> <name>tuya</name>
<message> <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> <source>Close blinds</source>
<extracomment>The name of the ActionType ({f266ea4a-052f-466b-bf31-8c5c7e80a843}) of ThingClass tuyaClosable</extracomment> <extracomment>The name of the ActionType ({f266ea4a-052f-466b-bf31-8c5c7e80a843}) of ThingClass tuyaClosable</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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="95"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="56"/> <location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="98"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="59"/> <location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="101"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="62"/> <source>Color</source>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="65"/> <extracomment>The name of the ParamType (ThingClass: tuyaLight, ActionType: color, ID: {7ccf9dc3-6b3f-4793-b0d5-3c97afb34cf0})
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="68"/> ----------
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> <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 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> <translation type="unfinished"></translation>
</message> </message>
<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="143"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="74"/> <location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="146"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="77"/> <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> <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 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> <translation type="unfinished"></translation>
</message> </message>
<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="155"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="83"/> <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> <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> The name of the ParamType (ThingClass: tuyaSwitch, Type: thing, ID: {bfdb02b0-d12d-4385-a03d-d2c147c2aca2})</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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="164"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="89"/> <location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="167"/>
<source>Logged in</source> <source>Logged in</source>
<extracomment>The name of the ParamType (ThingClass: tuyaCloud, EventType: loggedIn, ID: {33e9d30c-c988-4cd4-8d39-ce84bcfa79c5}) <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> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Logged in changed</source>
<extracomment>The name of the EventType ({33e9d30c-c988-4cd4-8d39-ce84bcfa79c5}) of ThingClass tuyaCloud</extracomment> <extracomment>The name of the EventType ({33e9d30c-c988-4cd4-8d39-ce84bcfa79c5}) of ThingClass tuyaCloud</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Open blinds</source>
<extracomment>The name of the ActionType ({f9f34515-670d-439e-851a-0bf82f867882}) of ThingClass tuyaClosable</extracomment> <extracomment>The name of the ActionType ({f9f34515-670d-439e-851a-0bf82f867882}) of ThingClass tuyaClosable</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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="176"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="101"/> <location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="179"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="104"/> <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> <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}) 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> <translation type="unfinished"></translation>
</message> </message>
<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> <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> <translation type="unfinished"></translation>
</message> </message>
<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> <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> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Stop</source>
<extracomment>The name of the ActionType ({8fc2ea7d-b945-41c8-bbda-820bdadc9e02}) of ThingClass tuyaClosable</extracomment> <extracomment>The name of the ActionType ({8fc2ea7d-b945-41c8-bbda-820bdadc9e02}) of ThingClass tuyaClosable</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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="218"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="119"/> <location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="221"/>
<source>Tuya</source> <source>Tuya</source>
<extracomment>The name of the vendor ({d5dd33a7-e5f6-48be-bdd9-1a1ec04152c9}) <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> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Tuya blinds</source>
<extracomment>The name of the ThingClass ({d4bb0170-596d-4904-8fd0-fd8e7ad39f72})</extracomment> <extracomment>The name of the ThingClass ({d4bb0170-596d-4904-8fd0-fd8e7ad39f72})</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Tuya cloud login</source>
<extracomment>The name of the ThingClass ({dd6dcd91-f667-45a5-9594-12b95f94337e})</extracomment> <extracomment>The name of the ThingClass ({dd6dcd91-f667-45a5-9594-12b95f94337e})</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Tuya switch</source>
<extracomment>The name of the ThingClass ({393d7256-e792-4dca-adb5-b13750e05391})</extracomment> <extracomment>The name of the ThingClass ({393d7256-e792-4dca-adb5-b13750e05391})</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>User changed</source>
<extracomment>The name of the EventType ({15bc38a7-0962-4f3b-a0b1-4f164958493b}) of ThingClass tuyaCloud</extracomment> <extracomment>The name of the EventType ({15bc38a7-0962-4f3b-a0b1-4f164958493b}) of ThingClass tuyaCloud</extracomment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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="239"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="137"/> <location filename="../../../build-nymea-plugins-Desktop-Debug/tuya/plugininfo.h" line="242"/>
<source>Username</source> <source>Username</source>
<extracomment>The name of the ParamType (ThingClass: tuyaCloud, EventType: userDisplayName, ID: {15bc38a7-0962-4f3b-a0b1-4f164958493b}) <extracomment>The name of the ParamType (ThingClass: tuyaCloud, EventType: userDisplayName, ID: {15bc38a7-0962-4f3b-a0b1-4f164958493b})
---------- ----------