diff --git a/apps/aqhome-react/aqhome_react.c b/apps/aqhome-react/aqhome_react.c
index 67d9891..d422cc5 100644
--- a/apps/aqhome-react/aqhome_react.c
+++ b/apps/aqhome-react/aqhome_react.c
@@ -216,6 +216,36 @@ double AqHomeReact_GetDoubleValue(AQHOME_REACT *aqh, const char *path, int idx,
+int AqHomeReact_SetIntValue(AQHOME_REACT *aqh, const char *path, int value)
+{
+ if (aqh && aqh->localVars && path && *path) {
+ int rv;
+ uint64_t timestamp;
+
+ timestamp=(uint64_t) time(NULL);
+ rv=AQH_Vars_SetIntValue(aqh->localVars, AQH_VARS_PATHFLAGS_OVERWRITE_VARS, path, value);
+ if (rv<0) {
+ DBG_INFO(NULL, "here (%d)", rv);
+ return rv;
+ }
+ AqHomeReact_UnitVarChanges_IntVarUpdated(aqh->localVarChangeUnit, path, timestamp, value);
+ return 0;
+ }
+ return GWEN_ERROR_INVALID;
+}
+
+
+
+int AqHomeReact_GetIntValue(AQHOME_REACT *aqh, const char *path, int idx, int defaultValue)
+{
+ if (aqh && aqh->localVars && path && *path) {
+ return AQH_Vars_GetIntValue(aqh->localVars, path, idx, defaultValue);
+ }
+ return defaultValue;
+}
+
+
+
AQHREACT_UNIT *AqHomeReact_CreateUnitByName(AQHOME_REACT *aqh, const char *unitType)
{
/* this does not include u_timer and u_varchanges, because those are only created once globally in init.c */
diff --git a/apps/aqhome-react/aqhome_react.h b/apps/aqhome-react/aqhome_react.h
index fca8f2d..61034a1 100644
--- a/apps/aqhome-react/aqhome_react.h
+++ b/apps/aqhome-react/aqhome_react.h
@@ -51,5 +51,9 @@ const char *AqHomeReact_GetCharValue(AQHOME_REACT *aqh, const char *path, int id
int AqHomeReact_SetDoubleValue(AQHOME_REACT *aqh, const char *path, double value);
double AqHomeReact_GetDoubleValue(AQHOME_REACT *aqh, const char *path, int idx, double defaultValue);
+int AqHomeReact_SetIntValue(AQHOME_REACT *aqh, const char *path, int value);
+int AqHomeReact_GetIntValue(AQHOME_REACT *aqh, const char *path, int idx, int defaultValue);
+
+
#endif
diff --git a/apps/aqhome-react/examples/001-tvlight.xml b/apps/aqhome-react/examples/001-tvlight.xml
index 9bf1f48..4fb7aa8 100644
--- a/apps/aqhome-react/examples/001-tvlight.xml
+++ b/apps/aqhome-react/examples/001-tvlight.xml
@@ -44,12 +44,12 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/apps/aqhome-react/types/dataobject.c b/apps/aqhome-react/types/dataobject.c
index 5cb675f..091dd00 100644
--- a/apps/aqhome-react/types/dataobject.c
+++ b/apps/aqhome-react/types/dataobject.c
@@ -68,6 +68,7 @@ AQHREACT_DATAOBJECT *AQHREACT_DataObject_dup(const AQHREACT_DATAOBJECT *origObje
dataObject->timestamp=origObject->timestamp;
dataObject->dataType=origObject->dataType;
dataObject->doubleData=origObject->doubleData;
+ dataObject->intData=origObject->intData;
AQHREACT_DataObject_SetStringData(dataObject, origObject->stringData);
return dataObject;
}
@@ -188,11 +189,27 @@ void AQHREACT_DataObject_SetStringData(AQHREACT_DATAOBJECT *dataObject, const ch
+int AQHREACT_DataObject_GetIntData(const AQHREACT_DATAOBJECT *dataObject)
+{
+ return dataObject?(dataObject->intData):0;
+}
+
+
+
+void AQHREACT_DataObject_SetIntData(AQHREACT_DATAOBJECT *dataObject, int i)
+{
+ if (dataObject)
+ dataObject->intData=i;
+}
+
+
+
const char *AQHREACT_DataObjectType_toString(int t)
{
switch(t) {
case AQHREACT_DATAOBJECTTYPE_DOUBLE: return "double";
case AQHREACT_DATAOBJECTTYPE_STRING: return "string";
+ case AQHREACT_DATAOBJECTTYPE_INT: return "int";
default: return "unknown";
}
}
@@ -206,6 +223,8 @@ int AQHREACT_DataObjectType_fromString(const char *s)
return AQHREACT_DATAOBJECTTYPE_DOUBLE;
else if (strcasecmp(s, "string")==0)
return AQHREACT_DATAOBJECTTYPE_STRING;
+ else if (strcasecmp(s, "int")==0)
+ return AQHREACT_DATAOBJECTTYPE_INT;
}
return AQHREACT_DATAOBJECTTYPE_UNKNOWN;
@@ -230,6 +249,9 @@ void AQHREACT_DataObject_Dump(const AQHREACT_DATAOBJECT *dataObject, GWEN_BUFFER
case AQHREACT_DATAOBJECTTYPE_STRING:
GWEN_Buffer_AppendArgs(buf, "%s (STRING) [%s]\n", AQHREACT_DataObject_GetStringData(dataObject), sVarSystemId?sVarSystemId:"");
break;
+ case AQHREACT_DATAOBJECTTYPE_INT:
+ GWEN_Buffer_AppendArgs(buf, "%d (INT) [%s]\n", AQHREACT_DataObject_GetIntData(dataObject), sVarSystemId?sVarSystemId:"");
+ break;
default:
break;
}
diff --git a/apps/aqhome-react/types/dataobject.h b/apps/aqhome-react/types/dataobject.h
index 9ef08d7..03e7c31 100644
--- a/apps/aqhome-react/types/dataobject.h
+++ b/apps/aqhome-react/types/dataobject.h
@@ -20,7 +20,8 @@ GWEN_LIST_FUNCTION_DEFS(AQHREACT_DATAOBJECT, AQHREACT_DataObject)
enum {
AQHREACT_DATAOBJECTTYPE_UNKNOWN=0,
AQHREACT_DATAOBJECTTYPE_DOUBLE,
- AQHREACT_DATAOBJECTTYPE_STRING
+ AQHREACT_DATAOBJECTTYPE_STRING,
+ AQHREACT_DATAOBJECTTYPE_INT
};
@@ -55,6 +56,9 @@ void AQHREACT_DataObject_SetDoubleData(AQHREACT_DATAOBJECT *dataObject, double i
const char *AQHREACT_DataObject_GetStringData(const AQHREACT_DATAOBJECT *dataObject);
void AQHREACT_DataObject_SetStringData(AQHREACT_DATAOBJECT *dataObject, const char *s);
+int AQHREACT_DataObject_GetIntData(const AQHREACT_DATAOBJECT *dataObject);
+void AQHREACT_DataObject_SetIntData(AQHREACT_DATAOBJECT *dataObject, int i);
+
void AQHREACT_DataObject_Dump(const AQHREACT_DATAOBJECT *dataObject, GWEN_BUFFER *buf, int indent);
diff --git a/apps/aqhome-react/types/dataobject_p.h b/apps/aqhome-react/types/dataobject_p.h
index 0f1e906..556b2ca 100644
--- a/apps/aqhome-react/types/dataobject_p.h
+++ b/apps/aqhome-react/types/dataobject_p.h
@@ -23,6 +23,7 @@ struct AQHREACT_DATAOBJECT {
uint64_t timestamp;
int dataType;
double doubleData;
+ int intData;
char *stringData;
};
diff --git a/apps/aqhome-react/units/u_varchanges.c b/apps/aqhome-react/units/u_varchanges.c
index 13dfb09..7f2a462 100644
--- a/apps/aqhome-react/units/u_varchanges.c
+++ b/apps/aqhome-react/units/u_varchanges.c
@@ -11,7 +11,6 @@
#endif
#include "./u_varchanges.h"
-#include "./u_passthrough.h"
#include
@@ -20,10 +19,29 @@
AQHREACT_UNIT *AqHomeReact_UnitVarChanges_new(AQHOME_REACT *aqh)
{
AQHREACT_UNIT *unit;
+ AQHREACT_PORT *port;
- unit=AqHomeReact_UnitPassthrough_new(aqh);
+ unit=AQHREACT_Unit_new(aqh);
AQHREACT_Unit_SetTypeName(unit, "varchanges");
- AQHREACT_Unit_SetDescription(unit, "Propagates changes of values on the data server");
+ AQHREACT_Unit_SetDescription(unit, "Propagates changes of values (server or local)");
+
+ port=AQHREACT_Port_new();
+ AQHREACT_Port_SetName(port, "intOutput");
+ AQHREACT_Port_SetIdForUnit(port, AQHOMEREACT_UNIT_VARCHANGES_OUTSLOT_OUTINT);
+ AQHREACT_Port_SetDataType(port, AQHREACT_DATAOBJECTTYPE_INT);
+ AQHREACT_Unit_AddOutputPort(unit, port);
+
+ port=AQHREACT_Port_new();
+ AQHREACT_Port_SetName(port, "doubleOutput");
+ AQHREACT_Port_SetIdForUnit(port, AQHOMEREACT_UNIT_VARCHANGES_OUTSLOT_OUTDOUBLE);
+ AQHREACT_Port_SetDataType(port, AQHREACT_DATAOBJECTTYPE_DOUBLE);
+ AQHREACT_Unit_AddOutputPort(unit, port);
+
+ port=AQHREACT_Port_new();
+ AQHREACT_Port_SetName(port, "stringOutput");
+ AQHREACT_Port_SetIdForUnit(port, AQHOMEREACT_UNIT_VARCHANGES_OUTSLOT_OUTSTRING);
+ AQHREACT_Port_SetDataType(port, AQHREACT_DATAOBJECTTYPE_STRING);
+ AQHREACT_Unit_AddOutputPort(unit, port);
return unit;
}
@@ -34,7 +52,7 @@ void AqHomeReact_UnitVarChanges_ValueUpdated(AQHREACT_UNIT *unit, const AQH_VALU
{
AQHREACT_PORT *outputPort;
- outputPort=AQHREACT_Unit_GetOutputPortByIdForUnit(unit, AQHOMEREACT_UNIT_PASSTHROUGH_OUTSLOT_OUTPUT);
+ outputPort=AQHREACT_Unit_GetOutputPortByIdForUnit(unit, AQHOMEREACT_UNIT_VARCHANGES_OUTSLOT_OUTDOUBLE);
if (outputPort) {
AQHREACT_DATAOBJECT *dataObject;
@@ -56,7 +74,7 @@ void AqHomeReact_UnitVarChanges_DoubleVarUpdated(AQHREACT_UNIT *unit, const char
{
AQHREACT_PORT *outputPort;
- outputPort=AQHREACT_Unit_GetOutputPortByIdForUnit(unit, AQHOMEREACT_UNIT_PASSTHROUGH_OUTSLOT_OUTPUT);
+ outputPort=AQHREACT_Unit_GetOutputPortByIdForUnit(unit, AQHOMEREACT_UNIT_VARCHANGES_OUTSLOT_OUTDOUBLE);
if (outputPort) {
AQHREACT_DATAOBJECT *dataObject;
@@ -77,7 +95,7 @@ void AqHomeReact_UnitVarChanges_StringVarUpdated(AQHREACT_UNIT *unit, const char
{
AQHREACT_PORT *outputPort;
- outputPort=AQHREACT_Unit_GetOutputPortByIdForUnit(unit, AQHOMEREACT_UNIT_PASSTHROUGH_OUTSLOT_OUTPUT);
+ outputPort=AQHREACT_Unit_GetOutputPortByIdForUnit(unit, AQHOMEREACT_UNIT_VARCHANGES_OUTSLOT_OUTSTRING);
if (outputPort) {
AQHREACT_DATAOBJECT *dataObject;
@@ -94,6 +112,28 @@ void AqHomeReact_UnitVarChanges_StringVarUpdated(AQHREACT_UNIT *unit, const char
+void AqHomeReact_UnitVarChanges_IntVarUpdated(AQHREACT_UNIT *unit, const char *varName, uint64_t timestamp, int data)
+{
+ AQHREACT_PORT *outputPort;
+
+ outputPort=AQHREACT_Unit_GetOutputPortByIdForUnit(unit, AQHOMEREACT_UNIT_VARCHANGES_OUTSLOT_OUTINT);
+ if (outputPort) {
+ AQHREACT_DATAOBJECT *dataObject;
+
+ DBG_DEBUG(NULL, "Variable \"%s\" changed (int)", varName);
+ dataObject=AQHREACT_DataObject_new();
+ AQHREACT_DataObject_SetDataType(dataObject, AQHREACT_DATAOBJECTTYPE_INT);
+ AQHREACT_DataObject_SetTimestamp(dataObject, timestamp);
+ AQHREACT_DataObject_SetIntData(dataObject, data);
+ AQHREACT_DataObject_SetSystemValueId(dataObject, varName);
+ AQHREACT_Unit_OutputData(unit, outputPort, dataObject);
+ AQHREACT_DataObject_free(dataObject);
+ }
+}
+
+
+
+
diff --git a/apps/aqhome-react/units/u_varchanges.h b/apps/aqhome-react/units/u_varchanges.h
index 80b6cd76..b61190c 100644
--- a/apps/aqhome-react/units/u_varchanges.h
+++ b/apps/aqhome-react/units/u_varchanges.h
@@ -16,6 +16,12 @@
#include "aqhome/data/value.h"
+#define AQHOMEREACT_UNIT_VARCHANGES_OUTSLOT_OUTINT 0
+#define AQHOMEREACT_UNIT_VARCHANGES_OUTSLOT_OUTDOUBLE 1
+#define AQHOMEREACT_UNIT_VARCHANGES_OUTSLOT_OUTSTRING 2
+
+
+
AQHREACT_UNIT *AqHomeReact_UnitVarChanges_new(AQHOME_REACT *aqh);
/**
@@ -34,6 +40,12 @@ void AqHomeReact_UnitVarChanges_DoubleVarUpdated(AQHREACT_UNIT *unit, const char
void AqHomeReact_UnitVarChanges_StringVarUpdated(AQHREACT_UNIT *unit, const char *varName, uint64_t timestamp, const char *data);
+/**
+ * Called from AqHomeReact when a local variable changed (see @ref AqHomeReact_SetIntValue).
+ */
+void AqHomeReact_UnitVarChanges_IntVarUpdated(AQHREACT_UNIT *unit, const char *varName, uint64_t timestamp, int data);
+
+
#endif