diff --git a/libnymea-core/integrations/python/pythingactioninfo.h b/libnymea-core/integrations/python/pythingactioninfo.h index 7c62a421..6dd90aa8 100644 --- a/libnymea-core/integrations/python/pythingactioninfo.h +++ b/libnymea-core/integrations/python/pythingactioninfo.h @@ -72,7 +72,7 @@ static PyObject * PyThingActionInfo_finish(PyThingActionInfo* self, PyObject* ar char *message = nullptr; if (!PyArg_ParseTuple(args, "i|s", &status, &message)) { - PyErr_SetString(PyExc_TypeError, "Invalid arguments in finish call. Expected: finish(ThingError, message = \"\""); + PyErr_SetString(PyExc_TypeError, "Invalid arguments in finish call. Expected: finish(ThingError, message = \"\")"); return nullptr; } @@ -86,6 +86,27 @@ static PyObject * PyThingActionInfo_finish(PyThingActionInfo* self, PyObject* ar Py_RETURN_NONE; } +static PyObject * PyThingActionInfo_paramValue(PyThingActionInfo* self, PyObject* args) { + char *paramTypeIdStr = nullptr; + if (!PyArg_ParseTuple(args, "s", ¶mTypeIdStr)) { + PyErr_SetString(PyExc_TypeError, "Invalid arguments in paramValue call. Expected: paramValue(paramTypeId)"); + return nullptr; + } + + ParamTypeId paramTypeId = ParamTypeId(paramTypeIdStr); + for (int i = 0; i < PyTuple_Size(self->pyParams); i++) { + PyParam *pyParam = reinterpret_cast(PyTuple_GetItem(self->pyParams, i)); + // We're intentionally converting both ids to QUuid here in order to be more flexible with different UUID notations + ParamTypeId ptid = StateTypeId(PyUnicode_AsUTF8AndSize(pyParam->pyParamTypeId, nullptr)); + if (ptid == paramTypeId) { + Py_INCREF(pyParam->pyValue); + return pyParam->pyValue; + } + } + qCWarning(dcPythonIntegrations()) << "No such ParamTypeId in action params" << paramTypeId; + Py_RETURN_NONE; +}; + static PyMemberDef PyThingActionInfo_members[] = { {"thing", T_OBJECT_EX, offsetof(PyThingActionInfo, pyThing), 0, "Thing this action is for"}, {"actionTypeId", T_OBJECT_EX, offsetof(PyThingActionInfo, pyActionTypeId), 0, "The action type id for this action"}, @@ -95,6 +116,7 @@ static PyMemberDef PyThingActionInfo_members[] = { static PyMethodDef PyThingActionInfo_methods[] = { { "finish", (PyCFunction)PyThingActionInfo_finish, METH_VARARGS, "finish an action" }, + { "paramValue", (PyCFunction)PyThingActionInfo_paramValue, METH_VARARGS, "Get an actions param value"}, {nullptr, nullptr, 0, nullptr} // sentinel }; diff --git a/libnymea-core/integrations/python/pyutils.h b/libnymea-core/integrations/python/pyutils.h index f18bbd19..5e24a232 100644 --- a/libnymea-core/integrations/python/pyutils.h +++ b/libnymea-core/integrations/python/pyutils.h @@ -66,7 +66,8 @@ QVariant PyObjectToQVariant(PyObject *pyObject) return QVariant(PyObject_IsTrue(pyObject)); } - Q_ASSERT_X(false, "pyutils.h", QString("Unhandled data type in conversion PyObject to QVariant: %1").arg(pyObject->ob_type->tp_name).toUtf8()); + Q_ASSERT_X(false, "pyutils.h", QString("Unhandled data type in converting PyObject to QVariant: %1").arg(pyObject->ob_type->tp_name).toUtf8()); + qCWarning(dcPythonIntegrations()) << QString("Unhandled data type in converting PyObject to QVariant: %1").arg(pyObject->ob_type->tp_name).toUtf8(); return QVariant(); } diff --git a/plugins/pymock/integrationpluginpymock.py b/plugins/pymock/integrationpluginpymock.py index 31ef8c7c..e16199c2 100644 --- a/plugins/pymock/integrationpluginpymock.py +++ b/plugins/pymock/integrationpluginpymock.py @@ -112,8 +112,11 @@ def postSetupThing(thing): logger.log("Setting 1 value:", thing.setting(pyMockDiscoveryPairingSettingsSetting1ParamTypeId)) -async def executeAction(info): - logger.log("executeAction for", info.thing.name, info.actionTypeId, "with params", info.params[0].value) +def executeAction(info): + logger.log("executeAction for", info.thing.name, info.actionTypeId, "with params", info.params) + paramValueByIndex = info.params[0].value + paramValueById = info.paramValue(pyMockAction1ActionParam1ParamTypeId) + logger.log("Param by index:", paramValueByIndex, "by ID:", paramValueById) info.finish(nymea.ThingErrorNoError)