Simulation: Add a cleaning robot simulated thing
This commit is contained in:
parent
e3704ab6f1
commit
e6a0fee2aa
@ -73,7 +73,8 @@ void IntegrationPluginSimulation::setupThing(ThingSetupInfo *info)
|
|||||||
thing->thingClassId() == fingerPrintSensorThingClassId ||
|
thing->thingClassId() == fingerPrintSensorThingClassId ||
|
||||||
thing->thingClassId() == barcodeScannerThingClassId ||
|
thing->thingClassId() == barcodeScannerThingClassId ||
|
||||||
thing->thingClassId() == contactSensorThingClassId ||
|
thing->thingClassId() == contactSensorThingClassId ||
|
||||||
thing->thingClassId() == waterSensorThingClassId) {
|
thing->thingClassId() == waterSensorThingClassId ||
|
||||||
|
thing->thingClassId() == cleaningRobotThingClassId) {
|
||||||
m_simulationTimers.insert(thing, new QTimer(thing));
|
m_simulationTimers.insert(thing, new QTimer(thing));
|
||||||
connect(m_simulationTimers[thing], &QTimer::timeout, this, &IntegrationPluginSimulation::simulationTimerTimeout);
|
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();
|
qCWarning(dcSimulation()) << "Unhandled thing class" << thing->thingClassId() << "for" << thing->name();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -719,8 +762,28 @@ void IntegrationPluginSimulation::onPluginTimer20Seconds()
|
|||||||
thing->setProperty("lastUpdate", lastUpdate);
|
thing->setProperty("lastUpdate", lastUpdate);
|
||||||
qreal consumptionKWH = 1.0 * currentPower * (1.0 * m_pluginTimer20Seconds->interval() / 1000 / 60 / 60) / 1000;
|
qreal consumptionKWH = 1.0 * currentPower * (1.0 * m_pluginTimer20Seconds->interval() / 1000 / 60 / 60) / 1000;
|
||||||
thing->setStateValue(solarPanelTotalEnergyProducedStateTypeId, thing->stateValue(solarPanelTotalEnergyProducedStateTypeId).toDouble() + consumptionKWH);
|
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) {
|
} else if (thing->thingClassId() == waterSensorThingClassId) {
|
||||||
bool wet = qrand() > (RAND_MAX / 2);
|
bool wet = qrand() > (RAND_MAX / 2);
|
||||||
thing->setStateValue(waterSensorWaterDetectedStateTypeId, wet);
|
thing->setStateValue(waterSensorWaterDetectedStateTypeId, wet);
|
||||||
|
} else if (thing->thingClassId() == cleaningRobotThingClassId) {
|
||||||
|
thing->setStateValue(cleaningRobotRobotStateStateTypeId, "docked");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,6 +36,8 @@
|
|||||||
|
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
|
||||||
|
#include "extern-plugininfo.h"
|
||||||
|
|
||||||
class IntegrationPluginSimulation : public IntegrationPlugin
|
class IntegrationPluginSimulation : public IntegrationPlugin
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|||||||
@ -1216,6 +1216,94 @@
|
|||||||
"defaultValue": false
|
"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"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user