From 785f4799210ede72978c82554b6781a896eca72e Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 15 Sep 2025 18:05:39 +0200 Subject: [PATCH] aqhome-data: update value info when new data arrives. --- apps/aqhome-data/server.c | 95 ++++++++++++++++++++++++++++++--------- 1 file changed, 75 insertions(+), 20 deletions(-) diff --git a/apps/aqhome-data/server.c b/apps/aqhome-data/server.c index 9ce0d3c..1613cc2 100644 --- a/apps/aqhome-data/server.c +++ b/apps/aqhome-data/server.c @@ -79,6 +79,8 @@ static int _handleNewClient(AQH_OBJECT *o, AQH_OBJECT *clientEndpoint); static int _handleClientDown(AQH_OBJECT *o, AQH_OBJECT *clientEndpoint); static void _handleMsgsFromClient(AQH_OBJECT *o, AQHOME_SERVER *xo, AQH_OBJECT *ep); static void _handleMsgFromClient(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg); +static void _createValue(AQHOME_SERVER *xo, AQH_OBJECT *epDriver, const char *deviceName, const AQH_VALUE *valueTemplate); +static void _updateValue(AQHOME_SERVER *xo, AQH_VALUE *v, const char *deviceName, const AQH_VALUE *valueTemplate); static AQH_DEVICE *_getOrCreateDeviceForDriver(AQHOME_SERVER *xo, AQH_OBJECT *epDriver, const char *deviceName); static int _createPidFile(const char *pidFilename); static int _readArgs(int argc, char **argv, GWEN_DB_NODE *dbArgs); @@ -652,32 +654,16 @@ AQH_VALUE *AqHomeDataServer_GetOrCreateValueForDriverWithTemplate(AQH_OBJECT *o, v=AQH_Storage_GetValueByNameForSystem(xo->storage, GWEN_Buffer_GetStart(buf)); if (v==NULL) { - if (AQH_Endpoint_GetPermissions(epDriver) & AQH_ENDPOINT_PERMS_ADDVALUE) { - AQH_DEVICE *device; - - DBG_INFO(AQH_LOGDOMAIN, "Creating value \"%s\"", GWEN_Buffer_GetStart(buf)); - device=(deviceName && *deviceName)?_getOrCreateDeviceForDriver(xo, epDriver, deviceName):NULL; - - v=AQH_Value_new(); - AQH_Value_SetDriver(v, serviceName); - AQH_Value_SetName(v, AQH_Value_GetName(valueTemplate)); - AQH_Value_SetNameForSystem(v, GWEN_Buffer_GetStart(buf)); - AQH_Value_SetValueUnits(v, AQH_Value_GetValueUnits(valueTemplate)); - AQH_Value_SetValueType(v, AQH_Value_GetValueType(valueTemplate)); - AQH_Value_SetModality(v, AQH_Value_GetModality(valueTemplate)); - AQH_Value_SetTimestampCreation(v, (uint64_t) time(NULL)); - if (device) { - AQH_Value_SetDeviceNameForSystem(v, AQH_Device_GetNameForSystem(device)); - AQH_Value_SetDeviceName(v, AQH_Device_GetName(device)); - } - AQH_Storage_AddValue(xo->storage, v); - } + if (AQH_Endpoint_GetPermissions(epDriver) & AQH_ENDPOINT_PERMS_ADDVALUE) + _createValue(xo, epDriver, GWEN_Buffer_GetStart(buf), valueTemplate); else { DBG_ERROR(AQH_LOGDOMAIN, "No permissions to create value \"%s\"", GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); return NULL; } } + else + _updateValue(xo, v, GWEN_Buffer_GetStart(buf), valueTemplate); GWEN_Buffer_free(buf); return v; } @@ -686,6 +672,75 @@ AQH_VALUE *AqHomeDataServer_GetOrCreateValueForDriverWithTemplate(AQH_OBJECT *o, +void _createValue(AQHOME_SERVER *xo, AQH_OBJECT *epDriver, const char *deviceName, const AQH_VALUE *valueTemplate) +{ + AQH_DEVICE *device; + const char *serviceName; + AQH_VALUE *v; + + DBG_INFO(AQH_LOGDOMAIN, "Creating value \"%s\"", deviceName); + serviceName=AQH_Endpoint_GetServiceName(epDriver); + device=(deviceName && *deviceName)?_getOrCreateDeviceForDriver(xo, epDriver, deviceName):NULL; + + v=AQH_Value_new(); + AQH_Value_SetDriver(v, serviceName); + AQH_Value_SetName(v, AQH_Value_GetName(valueTemplate)); + AQH_Value_SetNameForSystem(v, deviceName); + AQH_Value_SetValueUnits(v, AQH_Value_GetValueUnits(valueTemplate)); + AQH_Value_SetValueType(v, AQH_Value_GetValueType(valueTemplate)); + AQH_Value_SetModality(v, AQH_Value_GetModality(valueTemplate)); + AQH_Value_SetTimestampCreation(v, (uint64_t) time(NULL)); + if (device) { + AQH_Value_SetDeviceNameForSystem(v, AQH_Device_GetNameForSystem(device)); + AQH_Value_SetDeviceName(v, AQH_Device_GetName(device)); + } + AQH_Storage_AddValue(xo->storage, v); +} + + + +void _updateValue(AQHOME_SERVER *xo, AQH_VALUE *value, const char *deviceName, const AQH_VALUE *valueTemplate) +{ + int chg=0; + const char *s1; + const char *s2; + int i1; + int i2; + + DBG_INFO(AQH_LOGDOMAIN, "Updating value \"%s\"", deviceName); + s1=AQH_Value_GetValueUnits(valueTemplate); + s2=AQH_Value_GetValueUnits(value); + if (s1 && *s1) { + if (!(s2 && *s2) || (strcasecmp(s1, s2)!=0)) { + AQH_Value_SetValueUnits(value, s1); + chg=1; + } + } + + i1=AQH_Value_GetValueType(valueTemplate); + i2=AQH_Value_GetValueType(value); + if (i1!=AQH_ValueDataType_Unknown) { + if (i1!=i2) { + AQH_Value_SetValueType(value, i1); + chg=1; + } + } + + i1=AQH_Value_GetModality(valueTemplate); + i2=AQH_Value_GetModality(value); + if (i1!=AQH_ValueModality_Unknown) { + if (i1!=i2) { + AQH_Value_SetModality(value, i1); + chg=1; + } + } + + if (chg) + AQH_Storage_AddRuntimeFlags(xo->storage, AQH_STORAGE_RTFLAGS_MODIFIED); +} + + + AQH_DEVICE *_getOrCreateDeviceForDriver(AQHOME_SERVER *xo, AQH_OBJECT *epDriver, const char *deviceName) { const char *serviceName;