More work on aqhome-cgi.

This commit is contained in:
Martin Preuss
2025-10-09 20:19:04 +02:00
parent d0c8b3b284
commit 5a16117240
7 changed files with 95 additions and 43 deletions

2
0BUILD
View File

@@ -2,7 +2,7 @@
<gwbuild> <gwbuild>
<project name="aqhome" version="0.0.15" so_current="0" so_age="0" so_revision="15" write_config_h="TRUE"> <project name="aqhome" version="0.0.16" so_current="0" so_age="0" so_revision="16" write_config_h="TRUE">
<setVar name="package">$(project_name)</setVar> <setVar name="package">$(project_name)</setVar>
<setVar name="version"> <setVar name="version">
$(project_vmajor).$(project_vminor).$(project_vpatchlevel) $(project_vmajor).$(project_vminor).$(project_vpatchlevel)

View File

@@ -59,6 +59,8 @@ static void _writeValueListToTable(AQH_DATACLIENT *dc, const AQH_VALUE_LIST *val
static void _writeValueToTable(AQH_DATACLIENT *dc, const AQH_VALUE *value, GWEN_BUFFER *dbuf); static void _writeValueToTable(AQH_DATACLIENT *dc, const AQH_VALUE *value, GWEN_BUFFER *dbuf);
static void _addValueActionToForm(const AQH_VALUE *value, GWEN_BUFFER *dbuf); static void _addValueActionToForm(const AQH_VALUE *value, GWEN_BUFFER *dbuf);
static uint32_t _colorFromHexString(const char *s); static uint32_t _colorFromHexString(const char *s);
static uint32_t _htmlColorToValueRGBW(uint32_t colorIn);
static uint32_t _rgbwToHtmlColor(uint32_t colorIn);
static void _setRgbwData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue); static void _setRgbwData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
static void _setOnOffData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue); static void _setOnOffData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
static void _setOnOffAutoData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue); static void _setOnOffAutoData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
@@ -404,7 +406,8 @@ void _writeValueListToTable(AQH_DATACLIENT *dc, const AQH_VALUE_LIST *valueList,
value=AQH_Value_List_First(valueList); value=AQH_Value_List_First(valueList);
while(value) { while(value) {
_writeValueToTable(dc, value, dbuf); if (AQH_Value_GetModality(value)!=AQH_ValueModality_Stats)
_writeValueToTable(dc, value, dbuf);
value=AQH_Value_List_Next(value); value=AQH_Value_List_Next(value);
} }
GBAS(dbuf, GBAS(dbuf,
@@ -487,7 +490,6 @@ void _addValueActionToForm(const AQH_VALUE *value, GWEN_BUFFER *dbuf)
uint32_t _colorFromHexString(const char *s) uint32_t _colorFromHexString(const char *s)
{ {
uint32_t colorIn=0; uint32_t colorIn=0;
uint32_t colorOut;
while(*s && *s<33) while(*s && *s<33)
s++; s++;
@@ -505,7 +507,30 @@ uint32_t _colorFromHexString(const char *s)
} }
/* hex 00RRGGBB -> GGRRWWBB */ /* hex 00RRGGBB -> GGRRWWBB */
colorOut=(colorIn & 0x00ff0000) | ((colorIn & 0x00ff00)<<16) | (colorIn & 0x0000ff); //return _htmlColorToValueRGBW(colorIn);
return colorIn;
}
uint32_t _htmlColorToValueRGBW(uint32_t colorIn)
{
uint32_t colorOut;
/* hex 00RRGGBB -> GGRRWWBB */
/* RGBW GGRRWWBB GGRRWWBB GGRRWWBB */
/* html 00RRGGBB 00RRGGBB 00RRGGBB*/
colorOut=(colorIn & 0x00ff0000) | ((colorIn<<16) & 0xff000000) | (colorIn & 0x000000ff);
return colorOut;
}
uint32_t _rgbwToHtmlColor(uint32_t colorIn)
{
uint32_t colorOut;
/* RGBW GGRRWWBB GGRRWWBB GGRRWWBB */
/* hex 00RRGGBB 00RRGGBB 00RRGGBB*/
colorOut=(colorIn & 0x00ff0000) | ( (colorIn>>16) & 0x0000ff00) | (colorIn & 0x000000ff);
return colorOut; return colorOut;
} }
@@ -627,7 +652,20 @@ void _addLastValueToForm(AQH_DATACLIENT *dc, const AQH_VALUE *value, GWEN_BUFFER
DBG_ERROR(NULL, "Adding actor"); DBG_ERROR(NULL, "Adding actor");
switch(AQH_Value_GetModality(value)) { switch(AQH_Value_GetModality(value)) {
case AQH_ValueModality_RGBW: case AQH_ValueModality_RGBW:
GBAA(dbuf, "<input type=\"color\" name=\"%s\" value=\"#%08x\"/>", sValueName, (unsigned int) u.f); DBG_ERROR(NULL, "Color: %.f RGBW=%08x HTML=%08x, RGBW2=%08x",
u.f,
(uint32_t) (u.f),
_rgbwToHtmlColor(u.f),
_htmlColorToValueRGBW(_rgbwToHtmlColor(u.f)));
#if 1
GBAA(dbuf, "<input type=\"text\" name=\"%s\" value=\"#%08x\"/>", sValueName, (uint32_t) (u.f));
#else
GBAA(dbuf, "<input type=\"color\" name=\"%s\" value=\"#%08x\"/>#%08x (#%08x)",
sValueName,
_rgbwToHtmlColor((unsigned int) (u.f)),
_rgbwToHtmlColor((unsigned int) (u.f)),
(uint32_t) (u.f));
#endif
break; break;
case AQH_ValueModality_OnOff: case AQH_ValueModality_OnOff:
GBAA(dbuf, "<select name=\"%s\">" "<option value=\"unchanged\" >unchanged</option>", sValueName); GBAA(dbuf, "<select name=\"%s\">" "<option value=\"unchanged\" >unchanged</option>", sValueName);
@@ -643,7 +681,7 @@ void _addLastValueToForm(AQH_DATACLIENT *dc, const AQH_VALUE *value, GWEN_BUFFER
GBAS(dbuf, "</select>"); GBAS(dbuf, "</select>");
break; break;
default: default:
// GBAA(dbuf, "<input type=\"text\" name=\"%s\" value=\"%.2f\"/>", sValueName, u.f); // GBAA(dbuf, "<input type=\"text\" name=\"%s\" value=\"%.2f\"/>", sValueName, u.f);
GBAA(dbuf, "%.2f", u.f); GBAA(dbuf, "%.2f", u.f);
break; break;
} /* switch */ } /* switch */

View File

@@ -191,8 +191,18 @@ const char *_valueTranslatedForDriver(const AQHMQTT_VALUE *value, double valueDa
valueAsInt=(int) valueData; valueAsInt=(int) valueData;
t=AQHMQTT_Translation_List_GetByAqhValue(translationList, valueAsInt); t=AQHMQTT_Translation_List_GetByAqhValue(translationList, valueAsInt);
if (t) { if (t) {
return AQHMQTT_Translation_GetDriverValue(t); const char *s;
s=AQHMQTT_Translation_GetDriverValue(t);
DBG_ERROR(NULL, "Translated value %d to %s", valueAsInt, s);
return s;
} }
else {
DBG_ERROR(NULL, "No translation found for %d", valueAsInt);
}
}
else {
DBG_ERROR(NULL, "No translation list");
} }
return NULL; return NULL;

View File

@@ -62,6 +62,7 @@ static AQHMQTT_TRANSLATION *_readXmlTranslation(GWEN_XMLNODE *translationNode);
AQHMQTT_DEVICE_LIST *AQH_MqttLogServer_ReadDeviceFile(AQH_OBJECT *o, const char *sFilename) AQHMQTT_DEVICE_LIST *AQH_MqttLogServer_ReadDeviceFile(AQH_OBJECT *o, const char *sFilename)
{ {
DBG_ERROR(NULL, "Reading device file \"%s\"", sFilename);
if (o) { if (o) {
AQH_MQTTLOG_SERVER *xo; AQH_MQTTLOG_SERVER *xo;
@@ -390,13 +391,15 @@ AQHMQTT_VALUE_LIST *_readXmlValueList(GWEN_XMLNODE *parentNode)
AQHMQTT_VALUE *_readXmlValue(GWEN_XMLNODE *valueNode) AQHMQTT_VALUE *_readXmlValue(GWEN_XMLNODE *valueNode)
{ {
const char *sValueName;
AQHMQTT_VALUE *value; AQHMQTT_VALUE *value;
GWEN_XMLNODE *translationNode; GWEN_XMLNODE *translationNode;
const char *s; const char *s;
int i; int i;
sValueName=GWEN_XMLNode_GetProperty(valueNode, "name", NULL);
value=AQHMQTT_Value_new(); value=AQHMQTT_Value_new();
AQHMQTT_Value_SetName(value, GWEN_XMLNode_GetProperty(valueNode, "name", NULL)); AQHMQTT_Value_SetName(value, sValueName);
AQHMQTT_Value_SetValueUnits(value, GWEN_XMLNode_GetProperty(valueNode, "units", NULL)); AQHMQTT_Value_SetValueUnits(value, GWEN_XMLNode_GetProperty(valueNode, "units", NULL));
AQHMQTT_Value_SetPath(value, GWEN_XMLNode_GetProperty(valueNode, "path", NULL)); AQHMQTT_Value_SetPath(value, GWEN_XMLNode_GetProperty(valueNode, "path", NULL));
@@ -415,12 +418,12 @@ AQHMQTT_VALUE *_readXmlValue(GWEN_XMLNODE *valueNode)
translationList=_readXmlTranslationList(translationNode); translationList=_readXmlTranslationList(translationNode);
if (translationList) { if (translationList) {
DBG_INFO(NULL, "Translations read"); DBG_ERROR(NULL, "Translations read for value \"%s\"", sValueName);
AQHMQTT_Value_SetTranslationList(value, translationList); AQHMQTT_Value_SetTranslationList(value, translationList);
} }
} }
else { else {
DBG_INFO(NULL, "No <translations> element"); DBG_ERROR(NULL, "No <translations> element in value %s", sValueName);
} }
return value; return value;
@@ -440,7 +443,7 @@ AQHMQTT_TRANSLATION_LIST *_readXmlTranslationList(GWEN_XMLNODE *parentNode)
if (translation) if (translation)
AQHMQTT_Translation_List_Add(translation, translationList); AQHMQTT_Translation_List_Add(translation, translationList);
else { else {
DBG_INFO(NULL, "Error reading <translation> element"); DBG_ERROR(NULL, "Error reading <translation> element");
AQHMQTT_Translation_List_free(translationList); AQHMQTT_Translation_List_free(translationList);
return NULL; return NULL;
} }

View File

@@ -312,29 +312,10 @@ const char *_readValueAndProbablyRange(const char *s, uint64_t *ptrBitField, int
{ {
int v=0; int v=0;
if (*s=='#') { while(isdigit(*s)) {
while(*s) { v*=10;
unsigned char c; v+=(*s)-'0';
s++;
c=tolower(*s);
if ((c>='0' && c<='9') || (c>='a' && c<='f')) {
c-='0';
if (c>9)
c-=7;
v<<=4;
v+=c;
}
else
break;
s++;
}
}
else {
while(isdigit(*s)) {
v*=10;
v+=(*s)-'0';
s++;
}
} }
if (!_valueOkay(v, minValue, maxValue)) { if (!_valueOkay(v, minValue, maxValue)) {
DBG_INFO(NULL, "here"); DBG_INFO(NULL, "here");
@@ -368,13 +349,35 @@ const char *_readDouble(const char *s, double *ptrDouble)
while(*s && isspace(*s)) while(*s && isspace(*s))
s++; s++;
sStart=s; sStart=s;
while(*s && (isdigit(*s) || *s=='.' || *s=='+' || *s=='-')) if (*s=='#') {
s++; uint32_t v=0;
rv=GWEN_Text_StringToDouble(sStart, ptrDouble); s++;
if (rv<0) { while(*s) {
DBG_ERROR(NULL, "Error reading double: %d", rv); unsigned char c;
return NULL;
c=tolower(*s);
if ((c>='0' && c<='9') || (c>='a' && c<='f')) {
c-='0';
if (c>9)
c-=7;
v<<=4;
v+=c;
}
else
break;
s++;
}
*ptrDouble=(double) v;
}
else {
while(*s && (isdigit(*s) || *s=='.' || *s=='+' || *s=='-'))
s++;
rv=GWEN_Text_StringToDouble(sStart, ptrDouble);
if (rv<0) {
DBG_ERROR(NULL, "Error reading double: %d", rv);
return NULL;
}
} }
return s; return s;

View File

@@ -66,7 +66,7 @@ AQHREACT_UNIT *AqHomeReact_UnitValueSet_new(AQH_OBJECT *aqh)
param=AQHREACT_Param_new(); param=AQHREACT_Param_new();
AQHREACT_Param_SetName(param, AQHOMEREACT_UNIT_VALUESET_PARAM_VALUENAME); AQHREACT_Param_SetName(param, AQHOMEREACT_UNIT_VALUESET_PARAM_VALUENAME);
AQHREACT_Param_SetDataType(param, AQHREACT_DATAOBJECTTYPE_DOUBLE); AQHREACT_Param_SetDataType(param, AQHREACT_DATAOBJECTTYPE_STRING);
AQHREACT_Unit_AddParam(unit, param); AQHREACT_Unit_AddParam(unit, param);
return unit; return unit;
@@ -131,7 +131,6 @@ AQH_MESSAGE *_mkSetDataMsgDouble(AQH_OBJECT *brokerEndpoint, const char *sValueN
AQH_MESSAGE *msgOut; AQH_MESSAGE *msgOut;
AQH_VALUE *v; AQH_VALUE *v;
double data; double data;
int rv;
v=AQH_Value_new(); v=AQH_Value_new();
AQH_Value_SetNameForSystem(v, sValueName); AQH_Value_SetNameForSystem(v, sValueName);

View File

@@ -404,7 +404,6 @@ uint64_t *AQH_Storage_GetDataPoints(AQH_STORAGE *sto, uint64_t valueId, uint64_t
uint64_t *arrayPtr; uint64_t *arrayPtr;
uint64_t i; uint64_t i;
DBG_ERROR(NULL, "Requested %d entries", (int) maxDataPointsRequested);
df=_getDataFileByValueId(sto, valueId); df=_getDataFileByValueId(sto, valueId);
if (df==NULL) { if (df==NULL) {
DBG_ERROR(AQH_LOGDOMAIN, "No file for value id %lu", (unsigned long int) valueId); DBG_ERROR(AQH_LOGDOMAIN, "No file for value id %lu", (unsigned long int) valueId);