More work on aqhome-cgi.
This commit is contained in:
2
0BUILD
2
0BUILD
@@ -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)
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user