Merge PR #414: Simulation: Add a cleaning robot simulation

master
Jenkins nymea 2021-04-28 13:54:47 +02:00
commit a008cde5d2
5 changed files with 1594 additions and 25 deletions

View File

@ -73,7 +73,8 @@ void IntegrationPluginSimulation::setupThing(ThingSetupInfo *info)
thing->thingClassId() == fingerPrintSensorThingClassId ||
thing->thingClassId() == barcodeScannerThingClassId ||
thing->thingClassId() == contactSensorThingClassId ||
thing->thingClassId() == waterSensorThingClassId) {
thing->thingClassId() == waterSensorThingClassId ||
thing->thingClassId() == cleaningRobotThingClassId) {
m_simulationTimers.insert(thing, new QTimer(thing));
connect(m_simulationTimers[thing], &QTimer::timeout, this, &IntegrationPluginSimulation::simulationTimerTimeout);
}
@ -576,6 +577,48 @@ void IntegrationPluginSimulation::executeAction(ThingActionInfo *info)
}
}
if (thing->thingClassId() == cleaningRobotThingClassId) {
if (action.actionTypeId() == cleaningRobotStartCleaningActionTypeId) {
qCDebug(dcSimulation()) << "Starting to clean...";
thing->setStateValue(cleaningRobotRobotStateStateTypeId, "cleaning");
m_simulationTimers.value(thing)->stop();
info->finish(Thing::ThingErrorNoError);
return;
}
if (action.actionTypeId() == cleaningRobotPauseCleaningActionTypeId) {
qCDebug(dcSimulation()) << "Pausing...";
if (thing->stateValue(cleaningRobotRobotStateStateTypeId).toString() == "paused") {
thing->setStateValue(cleaningRobotRobotStateStateTypeId, "cleaning");
} else if (thing->stateValue(cleaningRobotRobotStateStateTypeId).toString() == "cleaning"){
thing->setStateValue(cleaningRobotRobotStateStateTypeId, "paused");
}
info->finish(Thing::ThingErrorNoError);
return;
}
if (action.actionTypeId() == cleaningRobotStopCleaningActionTypeId) {
qCDebug(dcSimulation()) << "Stopping.";
thing->setStateValue(cleaningRobotRobotStateStateTypeId, "stopped");
info->finish(Thing::ThingErrorNoError);
return;
}
if (action.actionTypeId() == cleaningRobotReturnToBaseActionTypeId) {
qCDebug(dcSimulation()) << "Returning to base...";
QString robotState = thing->stateValue(cleaningRobotRobotStateStateTypeId).toString();
if (robotState == "cleaning" || robotState == "paused" || robotState == "error") {
thing->setStateValue(cleaningRobotRobotStateStateTypeId, "traveling");
m_simulationTimers.value(thing)->start(5000);
}
info->finish(Thing::ThingErrorNoError);
return;
}
if (action.actionTypeId() == cleaningRobotSimulateErrorActionTypeId) {
thing->setStateValue(cleaningRobotRobotStateStateTypeId, "error");
thing->setStateValue(cleaningRobotErrorMessageStateTypeId, QT_TR_NOOP("Help me, I'm stuck!"));
info->finish(Thing::ThingErrorNoError);
return;
}
}
qCWarning(dcSimulation()) << "Unhandled thing class" << thing->thingClassId() << "for" << thing->name();
}
@ -719,8 +762,28 @@ void IntegrationPluginSimulation::onPluginTimer20Seconds()
thing->setProperty("lastUpdate", lastUpdate);
qreal consumptionKWH = 1.0 * currentPower * (1.0 * m_pluginTimer20Seconds->interval() / 1000 / 60 / 60) / 1000;
thing->setStateValue(solarPanelTotalEnergyProducedStateTypeId, thing->stateValue(solarPanelTotalEnergyProducedStateTypeId).toDouble() + consumptionKWH);
} else if (thing->thingClassId() == cleaningRobotThingClassId) {
QString robotState = thing->stateValue(cleaningRobotRobotStateStateTypeId).toString();
int batteryLevel = thing->stateValue(cleaningRobotBatteryLevelStateTypeId).toInt();
bool charging = false;
bool pluggedIn = false;
if (robotState == "cleaning") {
batteryLevel -= 1;
if (batteryLevel < 5) {
robotState = "traveling";
m_simulationTimers.value(thing)->start(5000);
}
} else if (robotState == "docked") {
batteryLevel = qMin(100, batteryLevel + 2);
charging = batteryLevel < 100;
pluggedIn = true;
}
thing->setStateValue(cleaningRobotRobotStateStateTypeId, robotState);
thing->setStateValue(cleaningRobotBatteryLevelStateTypeId, batteryLevel);
thing->setStateValue(cleaningRobotBatteryCriticalStateTypeId, batteryLevel < 10);
thing->setStateValue(cleaningRobotChargingStateTypeId, charging);
thing->setStateValue(cleaningRobotPluggedInStateTypeId, pluggedIn);
}
}
}
@ -853,5 +916,8 @@ void IntegrationPluginSimulation::simulationTimerTimeout()
} else if (thing->thingClassId() == waterSensorThingClassId) {
bool wet = qrand() > (RAND_MAX / 2);
thing->setStateValue(waterSensorWaterDetectedStateTypeId, wet);
} else if (thing->thingClassId() == cleaningRobotThingClassId) {
thing->setStateValue(cleaningRobotRobotStateStateTypeId, "docked");
}
}

View File

@ -36,6 +36,8 @@
#include <QDateTime>
#include "extern-plugininfo.h"
class IntegrationPluginSimulation : public IntegrationPlugin
{
Q_OBJECT

View File

@ -1216,6 +1216,94 @@
"defaultValue": false
}
]
},
{
"id": "67bc68f1-8131-471f-9aa3-392284064ea2",
"name": "cleaningRobot",
"displayName": "Cleaning robot",
"createMethods": ["user"],
"interfaces": ["cleaningrobot", "battery"],
"stateTypes": [
{
"id": "ec324f2a-582b-4bd2-a2c8-03d5f20aa4f9",
"name": "robotState",
"displayName": "Robot state",
"displayNameEvent": "Robot state changed",
"type": "QString",
"possibleValues": ["docked", "cleaning", "paused", "traveling", "stopped", "error"],
"defaultValue": "docked"
},
{
"id": "71d0eff8-160a-4cff-a349-4beb40c33129",
"name": "errorMessage",
"displayName": "Robot error",
"displayNameEvent": "Robot error changed",
"type": "QString",
"defaultValue": ""
},
{
"id": "f68f35f8-85c9-49ca-8ac1-50579653704e",
"name": "batteryCritical",
"displayName": "Battery critical",
"displayNameEvent": "Battery entered or left critical state",
"type": "bool",
"defaultValue": false
},
{
"id": "e17a25db-1e32-479e-8802-7fab6b91b44f",
"name": "batteryLevel",
"displayName": "Battery level",
"displayNameEvent": "Battery level changed",
"type": "int",
"minValue": 0,
"maxValue": 100,
"unit": "Percentage",
"defaultValue": 50
},
{
"id": "f31930c5-0886-4152-9001-ae8e52f85b21",
"name": "charging",
"displayName": "Charging",
"displayNameEvent": "Started or stopped charging",
"type": "bool",
"defaultValue": true
},
{
"id": "f3b00428-9123-43a2-bc72-684e2eec692e",
"name": "pluggedIn",
"displayName": "Plugged in",
"displayNameEvent": "Plugged or unplugged",
"type": "bool",
"defaultValue": true
}
],
"actionTypes": [
{
"id": "4d12df39-e4d8-4dfe-aa8b-8c3dd5adb79b",
"name": "startCleaning",
"displayName": "Start cleaning"
},
{
"id": "22c5aab2-6348-4a60-93b9-d09779b2366b",
"name": "pauseCleaning",
"displayName": "Pause cleaning"
},
{
"id": "3c5c752b-429d-4749-9c69-89a6953bfd7d",
"name": "stopCleaning",
"displayName": "Stop cleaning"
},
{
"id": "8f6831fb-1335-48e5-8235-e235feadf2b7",
"name": "returnToBase",
"displayName": "Return to base"
},
{
"id": "da19677e-c04b-4114-a744-a14dee039c4f",
"name": "simulateError",
"displayName": "Simulate error"
}
]
}
]
}

File diff suppressed because it is too large Load Diff

View File

@ -7,6 +7,10 @@
<source>Fingerprint could not be scanned. Please try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Help me, I&apos;m stuck!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Simulation</name>
@ -47,8 +51,6 @@ The name of the EventType ({b7ff029d-f3a6-4b47-978a-ac1a581aac0f}) of ThingClass
----------
The name of the EventType ({9faaffe5-6a76-47d2-a14a-550f60390245}) of ThingClass colorBulb
----------
The name of the EventType ({94a7d50c-df3b-4590-a89e-9dae40ad84fa}) of ThingClass thermostat
----------
The name of the EventType ({b786029d-f3a6-4b47-978a-ac1a581aac0f}) of ThingClass evCharger
----------
The name of the EventType ({e1910c53-a6bc-434b-9caa-0d08e214c122}) of ThingClass heating
@ -64,8 +66,6 @@ The name of the ActionType ({b7ff029d-f3a6-4b47-978a-ac1a581aac0f}) of ThingClas
----------
The name of the ActionType ({9faaffe5-6a76-47d2-a14a-550f60390245}) of ThingClass colorBulb
----------
The name of the ActionType ({94a7d50c-df3b-4590-a89e-9dae40ad84fa}) of ThingClass thermostat
----------
The name of the ActionType ({b786029d-f3a6-4b47-978a-ac1a581aac0f}) of ThingClass evCharger
----------
The name of the ActionType ({e1910c53-a6bc-434b-9caa-0d08e214c122}) of ThingClass heating
@ -96,7 +96,9 @@ The name of the EventType ({10c735fd-7b81-484a-a148-76ea0da840f0}) of ThingClass
</message>
<message>
<source>Battery level changed</source>
<extracomment>The name of the EventType ({4979b1a8-7f1e-4b65-9c35-187045c42a8f}) of ThingClass contactSensor
<extracomment>The name of the EventType ({e17a25db-1e32-479e-8802-7fab6b91b44f}) of ThingClass cleaningRobot
----------
The name of the EventType ({4979b1a8-7f1e-4b65-9c35-187045c42a8f}) of ThingClass contactSensor
----------
The name of the EventType ({6a7ecb09-135c-4be2-8c36-f2a71711ea05}) of ThingClass gardenSensor
----------
@ -160,8 +162,12 @@ The name of the EventType ({e66aba37-2647-4b6b-8740-d59eb98d846c}) of ThingClass
<source>Open</source>
<extracomment>The name of the ActionType ({17860291-f3a6-4b47-978a-ac1a581aac0f}) of ThingClass rollerShutter
----------
The name of the ActionType ({20259935-c39b-42d3-888b-ffdb98800a8d}) of ThingClass simpleShutter
----------
The name of the ActionType ({508c8f1b-aa1d-43d8-badb-0c9d219025b3}) of ThingClass extendedAwning
----------
The name of the ActionType ({4347b46b-4048-4f3a-b45d-71d99c15c30d}) of ThingClass venetianBlind
----------
The name of the ActionType ({b4379ab7-5fc2-45b6-8214-5855b040ee1a}) of ThingClass extendedBlind
----------
The name of the ActionType ({06b99eb1-c3b6-4bea-95cf-690078297206}) of ThingClass simpleBlind
@ -171,12 +177,16 @@ The name of the ActionType ({1786029d-f3a6-4b47-978a-ac1a581aac0f}) of ThingClas
</message>
<message>
<source>Stop</source>
<extracomment>The name of the ActionType ({2786029d-f3a6-4b47-978a-ac1a581aac0f}) of ThingClass garageGate</extracomment>
<extracomment>The name of the ActionType ({7c310908-75ee-47b2-b2c1-90b85eed4694}) of ThingClass simpleShutter
----------
The name of the ActionType ({2786029d-f3a6-4b47-978a-ac1a581aac0f}) of ThingClass garageGate</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Close</source>
<extracomment>The name of the ActionType ({3786029d-f3a6-4b47-978a-ac1a581aac0f}) of ThingClass garageGate</extracomment>
<extracomment>The name of the ActionType ({b1f9b62a-1987-4d2b-af88-e64710cbf626}) of ThingClass simpleShutter
----------
The name of the ActionType ({3786029d-f3a6-4b47-978a-ac1a581aac0f}) of ThingClass garageGate</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
@ -190,6 +200,8 @@ The name of the ActionType ({1786029d-f3a6-4b47-978a-ac1a581aac0f}) of ThingClas
----------
The name of the ActionType ({41fdeba2-8d2f-46ce-8f2d-b8c31bdf90ff}) of ThingClass extendedAwning
----------
The name of the ActionType ({06be8ad4-24e5-4c03-9502-cda165a01bc4}) of ThingClass venetianBlind
----------
The name of the ActionType ({fd63d8bf-ffde-4343-bbdc-1645c94017dc}) of ThingClass extendedBlind
----------
The name of the ActionType ({7f1bdeef-a57c-4b82-80ad-e3e31f16027f}) of ThingClass simpleBlind</extracomment>
@ -201,6 +213,8 @@ The name of the ActionType ({7f1bdeef-a57c-4b82-80ad-e3e31f16027f}) of ThingClas
----------
The name of the ActionType ({79ec0271-5361-4f0f-a458-bf22e570c9ac}) of ThingClass extendedAwning
----------
The name of the ActionType ({61cadeae-810e-43f5-a6b5-e85fcaefde9c}) of ThingClass venetianBlind
----------
The name of the ActionType ({316c17e6-01a8-45c4-921d-7773b2d441a4}) of ThingClass extendedBlind
----------
The name of the ActionType ({0c55d32d-c916-472b-a03e-66fe7115e85d}) of ThingClass simpleBlind</extracomment>
@ -296,11 +310,6 @@ The name of the ParamType (ThingClass: temperatureSensor, EventType: batteryLeve
The name of the StateType ({45c0de32-b519-47d7-9f82-e5f09d1542d4}) of ThingClass temperatureSensor</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Charging amount changed</source>
<extracomment>The name of the EventType ({c977e60a-e820-4647-addb-cf0b39732ffb}) of ThingClass battery</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Max charging power changed</source>
<extracomment>The name of the EventType ({bdf328a6-eebc-4b67-8165-551bc21e9be6}) of ThingClass battery</extracomment>
@ -344,12 +353,6 @@ The name of the ParamType (ThingClass: colorBulb, EventType: power, ID: {9faaffe
----------
The name of the StateType ({9faaffe5-6a76-47d2-a14a-550f60390245}) of ThingClass colorBulb
----------
The name of the ParamType (ThingClass: thermostat, ActionType: power, ID: {94a7d50c-df3b-4590-a89e-9dae40ad84fa})
----------
The name of the ParamType (ThingClass: thermostat, EventType: power, ID: {94a7d50c-df3b-4590-a89e-9dae40ad84fa})
----------
The name of the StateType ({94a7d50c-df3b-4590-a89e-9dae40ad84fa}) of ThingClass thermostat
----------
The name of the ParamType (ThingClass: evCharger, ActionType: power, ID: {b786029d-f3a6-4b47-978a-ac1a581aac0f})
----------
The name of the ParamType (ThingClass: evCharger, EventType: power, ID: {b786029d-f3a6-4b47-978a-ac1a581aac0f})
@ -447,7 +450,11 @@ The name of the StateType ({10c735fd-7b81-484a-a148-76ea0da840f0}) of ThingClass
</message>
<message>
<source>Battery critical</source>
<extracomment>The name of the ParamType (ThingClass: contactSensor, EventType: batteryCritical, ID: {8d87413f-b625-4b77-aa95-2029b4bfb741})
<extracomment>The name of the ParamType (ThingClass: cleaningRobot, EventType: batteryCritical, ID: {f68f35f8-85c9-49ca-8ac1-50579653704e})
----------
The name of the StateType ({f68f35f8-85c9-49ca-8ac1-50579653704e}) of ThingClass cleaningRobot
----------
The name of the ParamType (ThingClass: contactSensor, EventType: batteryCritical, ID: {8d87413f-b625-4b77-aa95-2029b4bfb741})
----------
The name of the StateType ({8d87413f-b625-4b77-aa95-2029b4bfb741}) of ThingClass contactSensor
----------
@ -493,7 +500,7 @@ The name of the StateType ({e66aba37-2647-4b6b-8740-d59eb98d846c}) of ThingClass
----------
The name of the StateType ({47a16375-1027-42cc-82d3-56cbfdb1193c}) of ThingClass heatingRod
----------
The name of the ParamType (ThingClass: motionDetector, EventType: active, ID: {5ab00bfc-7345-44a2-90d4-852c810e59ec})
The name of the ParamType (ThingClass: motionDetector, EventType: isPresent, ID: {5ab00bfc-7345-44a2-90d4-852c810e59ec})
----------
The name of the StateType ({5ab00bfc-7345-44a2-90d4-852c810e59ec}) of ThingClass motionDetector</extracomment>
<translation type="unfinished"></translation>
@ -551,14 +558,22 @@ The name of the StateType ({be0291ff-6041-433b-9121-a30ca4426b22}) of ThingClass
</message>
<message>
<source>Battery level</source>
<extracomment>The name of the ParamType (ThingClass: battery, EventType: batteryLevel, ID: {30fd9fd9-1a6b-4698-93ac-6b2a1ba18500})
<extracomment>The name of the ParamType (ThingClass: cleaningRobot, EventType: batteryLevel, ID: {e17a25db-1e32-479e-8802-7fab6b91b44f})
----------
The name of the StateType ({e17a25db-1e32-479e-8802-7fab6b91b44f}) of ThingClass cleaningRobot
----------
The name of the ParamType (ThingClass: battery, EventType: batteryLevel, ID: {30fd9fd9-1a6b-4698-93ac-6b2a1ba18500})
----------
The name of the StateType ({30fd9fd9-1a6b-4698-93ac-6b2a1ba18500}) of ThingClass battery</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Charging</source>
<extracomment>The name of the ParamType (ThingClass: battery, EventType: charging, ID: {c977e60a-e820-4647-addb-cf0b39732ffb})
<extracomment>The name of the ParamType (ThingClass: cleaningRobot, EventType: charging, ID: {f31930c5-0886-4152-9001-ae8e52f85b21})
----------
The name of the StateType ({f31930c5-0886-4152-9001-ae8e52f85b21}) of ThingClass cleaningRobot
----------
The name of the ParamType (ThingClass: battery, EventType: charging, ID: {c977e60a-e820-4647-addb-cf0b39732ffb})
----------
The name of the StateType ({c977e60a-e820-4647-addb-cf0b39732ffb}) of ThingClass battery</extracomment>
<translation type="unfinished"></translation>
@ -680,6 +695,8 @@ The name of the StateType ({46543561-2690-4072-a6a3-795e1c4f49a8}) of ThingClass
----------
The name of the EventType ({e4c92da3-da3e-40ea-907f-a93283426789}) of ThingClass extendedAwning
----------
The name of the EventType ({16453cde-15c9-4133-a4fd-7da76735778c}) of ThingClass venetianBlind
----------
The name of the EventType ({18fc257c-6b7b-472c-b52a-acd4ba405bf2}) of ThingClass extendedBlind</extracomment>
<translation type="unfinished"></translation>
</message>
@ -697,6 +714,12 @@ The name of the ParamType (ThingClass: extendedAwning, EventType: percentage, ID
----------
The name of the StateType ({e4c92da3-da3e-40ea-907f-a93283426789}) of ThingClass extendedAwning
----------
The name of the ParamType (ThingClass: venetianBlind, ActionType: percentage, ID: {16453cde-15c9-4133-a4fd-7da76735778c})
----------
The name of the ParamType (ThingClass: venetianBlind, EventType: percentage, ID: {16453cde-15c9-4133-a4fd-7da76735778c})
----------
The name of the StateType ({16453cde-15c9-4133-a4fd-7da76735778c}) of ThingClass venetianBlind
----------
The name of the ParamType (ThingClass: extendedBlind, ActionType: percentage, ID: {18fc257c-6b7b-472c-b52a-acd4ba405bf2})
----------
The name of the ParamType (ThingClass: extendedBlind, EventType: percentage, ID: {18fc257c-6b7b-472c-b52a-acd4ba405bf2})
@ -710,6 +733,8 @@ The name of the StateType ({18fc257c-6b7b-472c-b52a-acd4ba405bf2}) of ThingClass
----------
The name of the EventType ({b2a888b3-c526-410f-bafc-9d6dc459dbf8}) of ThingClass extendedAwning
----------
The name of the EventType ({9dedaf04-3570-403e-b083-ec59dd08981a}) of ThingClass venetianBlind
----------
The name of the EventType ({83559182-f3db-4a4a-8c70-d5fb3ceb57de}) of ThingClass extendedBlind</extracomment>
<translation type="unfinished"></translation>
</message>
@ -735,6 +760,8 @@ The name of the StateType ({b2a888b3-c526-410f-bafc-9d6dc459dbf8}) of ThingClass
----------
The name of the ActionType ({e4c92da3-da3e-40ea-907f-a93283426789}) of ThingClass extendedAwning
----------
The name of the ActionType ({16453cde-15c9-4133-a4fd-7da76735778c}) of ThingClass venetianBlind
----------
The name of the ActionType ({18fc257c-6b7b-472c-b52a-acd4ba405bf2}) of ThingClass extendedBlind</extracomment>
<translation type="unfinished"></translation>
</message>
@ -905,7 +932,11 @@ The name of the StateType ({49388b11-8076-4698-8091-5c5f5762fd08}) of ThingClass
</message>
<message>
<source>moving</source>
<extracomment>The name of the ParamType (ThingClass: extendedBlind, EventType: moving, ID: {83559182-f3db-4a4a-8c70-d5fb3ceb57de})
<extracomment>The name of the ParamType (ThingClass: venetianBlind, EventType: moving, ID: {9dedaf04-3570-403e-b083-ec59dd08981a})
----------
The name of the StateType ({9dedaf04-3570-403e-b083-ec59dd08981a}) of ThingClass venetianBlind
----------
The name of the ParamType (ThingClass: extendedBlind, EventType: moving, ID: {83559182-f3db-4a4a-8c70-d5fb3ceb57de})
----------
The name of the StateType ({83559182-f3db-4a4a-8c70-d5fb3ceb57de}) of ThingClass extendedBlind</extracomment>
<translation type="unfinished"></translation>
@ -997,5 +1028,180 @@ The name of the StateType ({bb02bb10-a933-4833-8a1d-40dda41691b2}) of ThingClass
<extracomment>The name of the ThingClass ({14f6c41c-b1ba-4d83-b1b2-d764a62c8eed})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Angle</source>
<extracomment>The name of the ParamType (ThingClass: venetianBlind, ActionType: angle, ID: {fe3c802d-253f-4594-b64c-14a8870d9828})
----------
The name of the ParamType (ThingClass: venetianBlind, EventType: angle, ID: {fe3c802d-253f-4594-b64c-14a8870d9828})
----------
The name of the StateType ({fe3c802d-253f-4594-b64c-14a8870d9828}) of ThingClass venetianBlind</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Angle changed</source>
<extracomment>The name of the EventType ({fe3c802d-253f-4594-b64c-14a8870d9828}) of ThingClass venetianBlind</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Battery entered or left critical state</source>
<extracomment>The name of the EventType ({f68f35f8-85c9-49ca-8ac1-50579653704e}) of ThingClass cleaningRobot</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Charging changed</source>
<extracomment>The name of the EventType ({c977e60a-e820-4647-addb-cf0b39732ffb}) of ThingClass battery</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cleaning robot</source>
<extracomment>The name of the ThingClass ({67bc68f1-8131-471f-9aa3-392284064ea2})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cooling on</source>
<extracomment>The name of the ParamType (ThingClass: thermostat, EventType: coolingOn, ID: {4c696205-392a-45ed-aab5-3b7f97ddf286})
----------
The name of the StateType ({4c696205-392a-45ed-aab5-3b7f97ddf286}) of ThingClass thermostat</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cooling turned on/off</source>
<extracomment>The name of the EventType ({4c696205-392a-45ed-aab5-3b7f97ddf286}) of ThingClass thermostat</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current temperature</source>
<extracomment>The name of the ParamType (ThingClass: thermostat, EventType: temperature, ID: {f3df52f0-ee1d-4163-a7b5-95d8f22b8841})
----------
The name of the StateType ({f3df52f0-ee1d-4163-a7b5-95d8f22b8841}) of ThingClass thermostat</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current temperature changed</source>
<extracomment>The name of the EventType ({f3df52f0-ee1d-4163-a7b5-95d8f22b8841}) of ThingClass thermostat</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Heating on</source>
<extracomment>The name of the ParamType (ThingClass: thermostat, EventType: heatingOn, ID: {94a7d50c-df3b-4590-a89e-9dae40ad84fa})
----------
The name of the StateType ({94a7d50c-df3b-4590-a89e-9dae40ad84fa}) of ThingClass thermostat</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Heating turned on/off</source>
<extracomment>The name of the EventType ({94a7d50c-df3b-4590-a89e-9dae40ad84fa}) of ThingClass thermostat</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Last seen</source>
<extracomment>The name of the ParamType (ThingClass: motionDetector, EventType: lastSeenTime, ID: {17874952-a1ab-467f-9786-29ffe3196a8c})
----------
The name of the StateType ({17874952-a1ab-467f-9786-29ffe3196a8c}) of ThingClass motionDetector</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Last seen changed</source>
<extracomment>The name of the EventType ({17874952-a1ab-467f-9786-29ffe3196a8c}) of ThingClass motionDetector</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Pause cleaning</source>
<extracomment>The name of the ActionType ({22c5aab2-6348-4a60-93b9-d09779b2366b}) of ThingClass cleaningRobot</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Plugged in</source>
<extracomment>The name of the ParamType (ThingClass: cleaningRobot, EventType: pluggedIn, ID: {f3b00428-9123-43a2-bc72-684e2eec692e})
----------
The name of the StateType ({f3b00428-9123-43a2-bc72-684e2eec692e}) of ThingClass cleaningRobot</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Plugged or unplugged</source>
<extracomment>The name of the EventType ({f3b00428-9123-43a2-bc72-684e2eec692e}) of ThingClass cleaningRobot</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Return to base</source>
<extracomment>The name of the ActionType ({8f6831fb-1335-48e5-8235-e235feadf2b7}) of ThingClass cleaningRobot</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Robot error</source>
<extracomment>The name of the ParamType (ThingClass: cleaningRobot, EventType: errorMessage, ID: {71d0eff8-160a-4cff-a349-4beb40c33129})
----------
The name of the StateType ({71d0eff8-160a-4cff-a349-4beb40c33129}) of ThingClass cleaningRobot</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Robot error changed</source>
<extracomment>The name of the EventType ({71d0eff8-160a-4cff-a349-4beb40c33129}) of ThingClass cleaningRobot</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Robot state</source>
<extracomment>The name of the ParamType (ThingClass: cleaningRobot, EventType: robotState, ID: {ec324f2a-582b-4bd2-a2c8-03d5f20aa4f9})
----------
The name of the StateType ({ec324f2a-582b-4bd2-a2c8-03d5f20aa4f9}) of ThingClass cleaningRobot</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Robot state changed</source>
<extracomment>The name of the EventType ({ec324f2a-582b-4bd2-a2c8-03d5f20aa4f9}) of ThingClass cleaningRobot</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set angle</source>
<extracomment>The name of the ActionType ({fe3c802d-253f-4594-b64c-14a8870d9828}) of ThingClass venetianBlind</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Simple roller shutter</source>
<extracomment>The name of the ThingClass ({5f4e3fc9-afb1-45d0-86a2-8713d5894aee})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Simulate error</source>
<extracomment>The name of the ActionType ({da19677e-c04b-4114-a744-a14dee039c4f}) of ThingClass cleaningRobot</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Start cleaning</source>
<extracomment>The name of the ActionType ({4d12df39-e4d8-4dfe-aa8b-8c3dd5adb79b}) of ThingClass cleaningRobot</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Started or stopped charging</source>
<extracomment>The name of the EventType ({f31930c5-0886-4152-9001-ae8e52f85b21}) of ThingClass cleaningRobot</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stop cleaning</source>
<extracomment>The name of the ActionType ({3c5c752b-429d-4749-9c69-89a6953bfd7d}) of ThingClass cleaningRobot</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Venetian blind</source>
<extracomment>The name of the ThingClass ({38757fee-ac55-403e-be53-bad5b97364c1})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Water detected</source>
<extracomment>The name of the EventType ({764cbbbf-6a5c-4265-9424-fc9e6dd86fda}) of ThingClass waterSensor</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Water sensor</source>
<extracomment>The name of the ThingClass ({088aa0cb-61e8-46b6-b99d-699a29fd79c7})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<source>Wet</source>
<extracomment>The name of the ParamType (ThingClass: waterSensor, EventType: waterDetected, ID: {764cbbbf-6a5c-4265-9424-fc9e6dd86fda})
----------
The name of the StateType ({764cbbbf-6a5c-4265-9424-fc9e6dd86fda}) of ThingClass waterSensor</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
</TS>