From 05d8179a554c7bc7765b057844c5b8e710f40b8c Mon Sep 17 00:00:00 2001 From: Bruce Eckstein Date: Thu, 18 Nov 2021 08:43:13 -0500 Subject: [PATCH] LWT detection and support --- garadget/integrationplugingaradget.cpp | 28 +++++++++++++++++++------ garadget/integrationplugingaradget.json | 9 ++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/garadget/integrationplugingaradget.cpp b/garadget/integrationplugingaradget.cpp index ab0533b1..3105cdda 100644 --- a/garadget/integrationplugingaradget.cpp +++ b/garadget/integrationplugingaradget.cpp @@ -42,8 +42,7 @@ void IntegrationPluginGaradget::setupThing(ThingSetupInfo *info) { Thing *thing = info->thing(); - QString device = thing->paramValue(garadgetThingDeviceNameParamTypeId).toString(); - + thing->setStateValue(garadgetLWTStateTypeId,false); MqttClient *client = nullptr; client = hardwareManager()->mqttProvider()->createInternalClient(thing->id().toString()); m_mqttClients.insert(thing, client); @@ -72,16 +71,15 @@ void IntegrationPluginGaradget::postSetupThing(Thing *thing) connect(m_pluginTimer, &PluginTimer::timeout, this, [=](){ m_statuscounter[thing] += 1; foreach (Thing *thing, myThings()) { - if ((m_lastActivityTimeStamps[thing].msecsTo(QDateTime::currentDateTime()) > 2000 * updatetime) && (thing->stateValue(garadgetConnectedStateTypeId).toBool() == true)) { + if ((thing->stateValue(garadgetLWTStateTypeId) == false) && (m_lastActivityTimeStamps[thing].msecsTo(QDateTime::currentDateTime()) > 2000 * updatetime) && (thing->stateValue(garadgetConnectedStateTypeId).toBool() == true)) { qCDebug(dcGaradget) << "disconnect device" << thing->paramValue(garadgetThingDeviceNameParamTypeId).toString(); thing->setStateValue(garadgetConnectedStateTypeId, false); } - if ( (thing->stateValue(garadgetConnectedStateTypeId).toBool() == true) || m_statuscounter[thing] > lwtupdatetime) { + if ( ((thing->stateValue(garadgetLWTStateTypeId) == false) && (thing->stateValue(garadgetConnectedStateTypeId).toBool() == true)) || m_statuscounter[thing] > lwtupdatetime) { m_mqttClients.value(thing)->publish("garadget/" + thing->paramValue(garadgetThingDeviceNameParamTypeId).toString() + "/command", "get-status"); } } if (m_statuscounter[thing] > lwtupdatetime) { - qCDebug(dcGaradget) << "reset statusCounter" << m_statuscounter; m_statuscounter[thing] = 1; } }); @@ -213,7 +211,7 @@ void IntegrationPluginGaradget::publishReceived(const QString &topic, const QByt } if (topic.endsWith("/status")) { if (thing->stateValue(garadgetConnectedStateTypeId) == false) { - qCDebug(dcGaradget) << "Setting" << thing->paramValue(garadgetThingDeviceNameParamTypeId).toString() << "to connected" ; + qCDebug(dcGaradget) << "Setting" << thing->paramValue(garadgetThingDeviceNameParamTypeId).toString() << "to Online" ; thing->setStateValue(garadgetConnectedStateTypeId, true); } m_lastActivityTimeStamps[thing] = QDateTime::currentDateTime(); @@ -255,4 +253,22 @@ void IntegrationPluginGaradget::publishReceived(const QString &topic, const QByt qCDebug(dcGaradget) << thing->paramValue(garadgetThingDeviceNameParamTypeId).toString() << "Detected change of Broker msg - set connected to false"; } } + if (topic.endsWith("/LWT")){ + if (payload.contains("Online") or payload.contains("Offline")) { + thing->setStateValue(garadgetLWTStateTypeId,true); + qCDebug(dcGaradget()) << "enabling LWT functionality" << thing->stateValue(garadgetLWTStateTypeId); + } + if (payload.contains("Online")) { + if (thing->stateValue(garadgetConnectedStateTypeId) == false) { + qCDebug(dcGaradget) << "Setting" << thing->paramValue(garadgetThingDeviceNameParamTypeId).toString() << "to Online" ; + thing->setStateValue(garadgetConnectedStateTypeId, true); + } + } + if (payload.contains("Offline")) { + if (thing->stateValue(garadgetConnectedStateTypeId) == true) { + qCDebug(dcGaradget) << "Setting" << thing->paramValue(garadgetThingDeviceNameParamTypeId).toString() << "to Offline" ; + thing->setStateValue(garadgetConnectedStateTypeId, false); + } + } + } } diff --git a/garadget/integrationplugingaradget.json b/garadget/integrationplugingaradget.json index 54d35d2b..04589fec 100644 --- a/garadget/integrationplugingaradget.json +++ b/garadget/integrationplugingaradget.json @@ -42,6 +42,15 @@ } ], "stateTypes": [ + { + "id": "3338c7af-89a0-4db3-aaa4-a01a276396d0", + "name": "LWT", + "displayName": "LWT Support", + "displayNameEvent": "LWT Support", + "type": "bool", + "defaultValue": false, + "writable": false + }, { "id": "a3d7e6eb-82d0-47ee-b95f-4dde931eb7e2", "name": "connected",