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.16" so_current="0" so_age="0" so_revision="16" write_config_h="TRUE">
|
<project name="aqhome" version="0.0.17" so_current="0" so_age="0" so_revision="17" 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)
|
||||||
|
|||||||
@@ -54,7 +54,8 @@
|
|||||||
mdevices.h
|
mdevices.h
|
||||||
mdevices_init.h
|
mdevices_init.h
|
||||||
mdevices_index.h
|
mdevices_index.h
|
||||||
mdevices_values.h
|
mdevices_valuestable.h
|
||||||
|
mdevices_valuesgraph.h
|
||||||
mdevices_value.h
|
mdevices_value.h
|
||||||
mdevices_setdata.h
|
mdevices_setdata.h
|
||||||
mdevices_vgraph.h
|
mdevices_vgraph.h
|
||||||
@@ -71,7 +72,8 @@
|
|||||||
mdevices.c
|
mdevices.c
|
||||||
mdevices_init.c
|
mdevices_init.c
|
||||||
mdevices_index.c
|
mdevices_index.c
|
||||||
mdevices_values.c
|
mdevices_valuestable.c
|
||||||
|
mdevices_valuesgraph.c
|
||||||
mdevices_value.c
|
mdevices_value.c
|
||||||
mdevices_setdata.c
|
mdevices_setdata.c
|
||||||
mdevices_vgraph.c
|
mdevices_vgraph.c
|
||||||
|
|||||||
@@ -14,7 +14,8 @@
|
|||||||
#include "./mdevices.h"
|
#include "./mdevices.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/modules/devices/mdevices_index.h"
|
#include "aqhome-cgi/modules/devices/mdevices_index.h"
|
||||||
#include "aqhome-cgi/modules/devices/mdevices_values.h"
|
#include "aqhome-cgi/modules/devices/mdevices_valuestable.h"
|
||||||
|
#include "aqhome-cgi/modules/devices/mdevices_valuesgraph.h"
|
||||||
#include "aqhome-cgi/modules/devices/mdevices_value.h"
|
#include "aqhome-cgi/modules/devices/mdevices_value.h"
|
||||||
#include "aqhome-cgi/modules/devices/mdevices_setdata.h"
|
#include "aqhome-cgi/modules/devices/mdevices_setdata.h"
|
||||||
#include "aqhome-cgi/modules/devices/mdevices_vgraph.h"
|
#include "aqhome-cgi/modules/devices/mdevices_vgraph.h"
|
||||||
@@ -50,7 +51,8 @@ static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION
|
|||||||
static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
|
static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
|
||||||
|
|
||||||
static void _handleRqIndexGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqIndexGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqValuesGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqValuesTableGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
|
static void _handleRqValuesGraphGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqValueGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqValueGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqSetDataPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqSetDataPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqGraphGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqGraphGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
@@ -67,7 +69,8 @@ static void _addLastValueToForm(AQH_DATACLIENT *dc, const AQH_VALUE *value, GWEN
|
|||||||
|
|
||||||
static AQH_MODSERVICE_HANDLER_ENTRY _requestTable[]={
|
static AQH_MODSERVICE_HANDLER_ENTRY _requestTable[]={
|
||||||
{"index.html", AQCGI_REQUEST_METHOD_GET, P_DEVICEREAD, _handleRqIndexGet},
|
{"index.html", AQCGI_REQUEST_METHOD_GET, P_DEVICEREAD, _handleRqIndexGet},
|
||||||
{"values.html", AQCGI_REQUEST_METHOD_GET, P_DEVICEREAD | P_VALUEREAD, _handleRqValuesGet},
|
{"vtable.html", AQCGI_REQUEST_METHOD_GET, P_DEVICEREAD | P_VALUEREAD, _handleRqValuesTableGet},
|
||||||
|
{"vgraph.html", AQCGI_REQUEST_METHOD_GET, P_DEVICEREAD | P_VALUEREAD, _handleRqValuesGraphGet},
|
||||||
{"value.html", AQCGI_REQUEST_METHOD_GET, P_DEVICEREAD | P_VALUEREAD, _handleRqValueGet},
|
{"value.html", AQCGI_REQUEST_METHOD_GET, P_DEVICEREAD | P_VALUEREAD, _handleRqValueGet},
|
||||||
{"setdata.html", AQCGI_REQUEST_METHOD_POST, P_VALUEWRITE, _handleRqSetDataPost},
|
{"setdata.html", AQCGI_REQUEST_METHOD_POST, P_VALUEWRITE, _handleRqSetDataPost},
|
||||||
{"graph.html", AQCGI_REQUEST_METHOD_GET, P_DEVICEREAD | P_VALUEREAD, _handleRqGraphGet},
|
{"graph.html", AQCGI_REQUEST_METHOD_GET, P_DEVICEREAD | P_VALUEREAD, _handleRqGraphGet},
|
||||||
@@ -112,9 +115,16 @@ void _handleRqIndexGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, G
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqValuesGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqValuesTableGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunValues, dbuf);
|
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunValuesAsTable, dbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void _handleRqValuesGraphGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
|
{
|
||||||
|
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunValuesAsGraph, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -300,4 +310,37 @@ void _addLastValueToForm(AQH_DATACLIENT *dc, const AQH_VALUE *value, GWEN_BUFFER
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
AQH_VALUE *AQH_ModDevices_GetValueForDevice(AQH_DATACLIENT *dc, const char *sDeviceName, const char *sValueName)
|
||||||
|
{
|
||||||
|
AQH_VALUE_LIST *valueList;
|
||||||
|
|
||||||
|
valueList=AQH_DataClient_GetValues(dc, sDeviceName, 0);
|
||||||
|
if (valueList) {
|
||||||
|
AQH_VALUE *value;
|
||||||
|
|
||||||
|
value=AQH_Value_List_First(valueList);
|
||||||
|
while(value) {
|
||||||
|
const char *s;
|
||||||
|
|
||||||
|
s=AQH_Value_GetName(value);
|
||||||
|
if (s && *s && strcasecmp(s, sValueName)==0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
value=AQH_Value_List_Next(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value) {
|
||||||
|
AQH_Value_List_Del(value);
|
||||||
|
AQH_Value_List_free(valueList);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
AQH_Value_List_free(valueList);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,10 @@
|
|||||||
#define AQH_MODDEVICES_PERMS_VALUESET 0x100
|
#define AQH_MODDEVICES_PERMS_VALUESET 0x100
|
||||||
|
|
||||||
|
|
||||||
|
#define AQH_MODDEVICES_GRAPH_WIDTH 640
|
||||||
|
#define AQH_MODDEVICES_GRAPH_HEIGHT 480
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDevices_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder);
|
void AQH_ModDevices_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder);
|
||||||
int AQH_ModDevices_Create(AQH_SERVICE *sv);
|
int AQH_ModDevices_Create(AQH_SERVICE *sv);
|
||||||
@@ -41,6 +45,8 @@ uint32_t AQH_ModDevices_ColorFromHexString(const char *s);
|
|||||||
uint32_t AQH_ModDevices_HtmlColorToValueRGBW(uint32_t colorIn);
|
uint32_t AQH_ModDevices_HtmlColorToValueRGBW(uint32_t colorIn);
|
||||||
uint32_t AQH_ModDevices_RgbwToHtmlColor(uint32_t colorIn);
|
uint32_t AQH_ModDevices_RgbwToHtmlColor(uint32_t colorIn);
|
||||||
|
|
||||||
|
AQH_VALUE *AQH_ModDevices_GetValueForDevice(AQH_DATACLIENT *dc, const char *sDeviceName, const char *sValueName);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,8 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static void _addLinkForDevice(const char *page, const char *sDevice, const char *action, const char *imgName, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------------------------------
|
||||||
@@ -67,6 +69,7 @@ void AQH_ModDevices_RunIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sess
|
|||||||
"<th>Room</th>"
|
"<th>Room</th>"
|
||||||
"<th>Location</th>"
|
"<th>Location</th>"
|
||||||
"<th>Description</th>"
|
"<th>Description</th>"
|
||||||
|
"<th>Actions</th>"
|
||||||
"</tr>\n"
|
"</tr>\n"
|
||||||
"</thead>\n"
|
"</thead>\n"
|
||||||
"<tbody>\n");
|
"<tbody>\n");
|
||||||
@@ -74,17 +77,12 @@ void AQH_ModDevices_RunIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sess
|
|||||||
device=AQH_Device_List_First(deviceList);
|
device=AQH_Device_List_First(deviceList);
|
||||||
while(device) {
|
while(device) {
|
||||||
const char *s;
|
const char *s;
|
||||||
|
const char *sDevice;
|
||||||
|
|
||||||
GBAA(dbuf, "<tr>");
|
GBAA(dbuf, "<tr>");
|
||||||
/* name for system */
|
/* name for system */
|
||||||
s=AQH_Device_GetNameForSystem(device);
|
sDevice=AQH_Device_GetNameForSystem(device);
|
||||||
if (perms & AQH_MODDEVICES_PERMS_VALUEREAD) {
|
GBAA(dbuf,"<td>%s</td>", sDevice?sDevice:"");
|
||||||
GBAS(dbuf,"<td><a href=\"values.html?device=");
|
|
||||||
GWEN_Text_EscapeToBufferTolerant(s, dbuf);
|
|
||||||
GBAA(dbuf,"\">%s</a></td>", s?s:"");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
GBAA(dbuf,"<td>%s</td>", s?s:"");
|
|
||||||
/* room */
|
/* room */
|
||||||
s=AQH_Device_GetRoomName(device);
|
s=AQH_Device_GetRoomName(device);
|
||||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||||
@@ -95,6 +93,14 @@ void AQH_ModDevices_RunIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sess
|
|||||||
s=AQH_Device_GetDescription(device);
|
s=AQH_Device_GetDescription(device);
|
||||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||||
|
|
||||||
|
GBAS(dbuf, "<td>");
|
||||||
|
if (perms & AQH_MODDEVICES_PERMS_VALUEREAD) {
|
||||||
|
_addLinkForDevice("vtable.html", sDevice, "table view", "/pics/document-table.png", dbuf);
|
||||||
|
_addLinkForDevice("vgraph.html", sDevice, "graph view", "/pics/graph.png", dbuf);
|
||||||
|
// TODO: add edit link
|
||||||
|
}
|
||||||
|
GBAS(dbuf, "</td>");
|
||||||
|
|
||||||
GBAA(dbuf, "</tr>");
|
GBAA(dbuf, "</tr>");
|
||||||
device=AQH_Device_List_Next(device);
|
device=AQH_Device_List_Next(device);
|
||||||
}
|
}
|
||||||
@@ -107,4 +113,15 @@ void AQH_ModDevices_RunIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sess
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void _addLinkForDevice(const char *page, const char *sDevice, const char *action, const char *imgName, GWEN_BUFFER *dbuf)
|
||||||
|
{
|
||||||
|
GBAA(dbuf,"<a href=\"%s?device=", page);
|
||||||
|
GWEN_Text_EscapeToBufferTolerant(sDevice, dbuf);
|
||||||
|
GBAS(dbuf,"\">");
|
||||||
|
GBAA(dbuf,"<img src=\"%s\" alt=\"action\" />", imgName);
|
||||||
|
GBAS(dbuf,"</a>");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ void AQH_ModDevices_RunSetData(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *se
|
|||||||
GWEN_DB_NODE *dbPost;
|
GWEN_DB_NODE *dbPost;
|
||||||
const char *sDeviceName;
|
const char *sDeviceName;
|
||||||
const char *sValueName;
|
const char *sValueName;
|
||||||
AQH_VALUE_LIST *valueList;
|
const AQH_VALUE *value;
|
||||||
|
|
||||||
/* sample data */
|
/* sample data */
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
@@ -61,33 +61,25 @@ void AQH_ModDevices_RunSetData(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *se
|
|||||||
sDeviceName=dbPost?GWEN_DB_GetCharValue(dbPost, "device", 0, NULL):NULL;
|
sDeviceName=dbPost?GWEN_DB_GetCharValue(dbPost, "device", 0, NULL):NULL;
|
||||||
sValueName=dbPost?GWEN_DB_GetCharValue(dbPost, "value", 0, NULL):NULL;
|
sValueName=dbPost?GWEN_DB_GetCharValue(dbPost, "value", 0, NULL):NULL;
|
||||||
DBG_ERROR(NULL, "Device=[%s], value=[%s]", sDeviceName?sDeviceName:"", sValueName?sValueName:"");
|
DBG_ERROR(NULL, "Device=[%s], value=[%s]", sDeviceName?sDeviceName:"", sValueName?sValueName:"");
|
||||||
valueList=sDeviceName?AQH_DataClient_GetValues(dc, sDeviceName, 0):NULL;
|
|
||||||
if (valueList && AQH_Value_List_GetCount(valueList)) {
|
|
||||||
const AQH_VALUE *value;
|
|
||||||
|
|
||||||
value=AQH_Value_List_First(valueList);
|
value=AQH_ModDevices_GetValueForDevice(dc, sDeviceName, sValueName);
|
||||||
while(value) {
|
if(value && AQH_Value_GetValueType(value)==AQH_ValueType_Actor) {
|
||||||
if (AQH_Value_GetValueType(value)==AQH_ValueType_Actor) {
|
const char *sValueName;
|
||||||
const char *sValueName;
|
const char *sValue;
|
||||||
const char *sValue;
|
|
||||||
|
|
||||||
sValueName=AQH_Value_GetName(value);
|
sValueName=AQH_Value_GetName(value);
|
||||||
sValue=GWEN_DB_GetCharValue(dbPost, sValueName, 0, NULL);
|
sValue=GWEN_DB_GetCharValue(dbPost, sValueName, 0, NULL);
|
||||||
if (sValueName && *sValueName) {
|
if (sValueName && *sValueName) {
|
||||||
DBG_ERROR(NULL, "Setting value %s to %s", sValueName?sValueName:"no name", sValue?sValue:"no value");
|
DBG_ERROR(NULL, "Setting value %s to %s", sValueName?sValueName:"no name", sValue?sValue:"no value");
|
||||||
switch(AQH_Value_GetModality(value)) {
|
switch(AQH_Value_GetModality(value)) {
|
||||||
case AQH_ValueModality_RGBW: _setRgbwData(dc, value, sValue); break;
|
case AQH_ValueModality_RGBW: _setRgbwData(dc, value, sValue); break;
|
||||||
case AQH_ValueModality_OnOff: _setOnOffData(dc, value, sValue); break;
|
case AQH_ValueModality_OnOff: _setOnOffData(dc, value, sValue); break;
|
||||||
case AQH_ValueModality_OnOffAuto: _setOnOffAutoData(dc, value, sValue); break;
|
case AQH_ValueModality_OnOffAuto: _setOnOffAutoData(dc, value, sValue); break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
} /* switch */
|
} /* switch */
|
||||||
} /* if (sValueName) */
|
} /* if (sValueName) */
|
||||||
}
|
|
||||||
value=AQH_Value_List_Next(value);
|
|
||||||
} /* while */
|
|
||||||
}
|
}
|
||||||
AQH_Value_List_free(valueList);
|
|
||||||
|
|
||||||
if (sDeviceName && *sDeviceName) {
|
if (sDeviceName && *sDeviceName) {
|
||||||
GWEN_BUFFER *pbuf;
|
GWEN_BUFFER *pbuf;
|
||||||
|
|||||||
125
apps/aqhome-cgi/modules/devices/mdevices_valuesgraph.c
Normal file
125
apps/aqhome-cgi/modules/devices/mdevices_valuesgraph.c
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* This file is part of the project AqHome.
|
||||||
|
* AqHome (c) by 2025 Martin Preuss, all rights reserved.
|
||||||
|
*
|
||||||
|
* The license for this file can be found in the file COPYING which you
|
||||||
|
* should have received along with this file.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include "./mdevices_valuesgraph.h"
|
||||||
|
#include "./mdevices_index.h"
|
||||||
|
|
||||||
|
#include "aqhome-cgi/service/module.h"
|
||||||
|
#include "aqhome-cgi/modules/mdataclient.h"
|
||||||
|
|
||||||
|
#include <gwenhywfar/debug.h>
|
||||||
|
#include <gwenhywfar/timestamp.h>
|
||||||
|
#include <gwenhywfar/text.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------------------------------
|
||||||
|
* defs and enums
|
||||||
|
* ------------------------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define GBAS GWEN_Buffer_AppendString
|
||||||
|
#define GBAA GWEN_Buffer_AppendArgs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------------------------------
|
||||||
|
* forward declarations
|
||||||
|
* ------------------------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void _writeValueListToTable(const char *sDeviceName, const AQH_VALUE_LIST *valueList, GWEN_BUFFER *dbuf);
|
||||||
|
static void _writeValueToTable(const char *sDeviceName, const AQH_VALUE *value, GWEN_BUFFER *dbuf);
|
||||||
|
static void _addGraphLink(const char *sDeviceName, const char *sValueName, const char *sPeriod, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------------------------------
|
||||||
|
* code
|
||||||
|
* ------------------------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
void AQH_ModDevices_RunValuesAsGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
||||||
|
{
|
||||||
|
GWEN_DB_NODE *dbQuery;
|
||||||
|
const char *sDeviceName;
|
||||||
|
|
||||||
|
dbQuery=AQCGI_Request_GetDbQuery(rq);
|
||||||
|
sDeviceName=GWEN_DB_GetCharValue(dbQuery, "device", 0, NULL);
|
||||||
|
if (!(sDeviceName && *sDeviceName))
|
||||||
|
AQH_ModDevices_RunIndex(m, rq, session, dc, dbuf);
|
||||||
|
else {
|
||||||
|
AQH_VALUE_LIST *valueList;
|
||||||
|
|
||||||
|
valueList=AQH_DataClient_GetValues(dc, sDeviceName, 0);
|
||||||
|
if (valueList && AQH_Value_List_GetCount(valueList)) {
|
||||||
|
|
||||||
|
GBAA(dbuf,"<h1>Values for Device %s</h1>\n", sDeviceName);
|
||||||
|
_writeValueListToTable(sDeviceName, valueList, dbuf);
|
||||||
|
GBAS(dbuf, "\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
GBAS(dbuf,"<p>No values.</p>\n");
|
||||||
|
}
|
||||||
|
AQH_Value_List_free(valueList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void _writeValueListToTable(const char *sDeviceName, const AQH_VALUE_LIST *valueList, GWEN_BUFFER *dbuf)
|
||||||
|
{
|
||||||
|
const AQH_VALUE *value;
|
||||||
|
|
||||||
|
GBAS(dbuf, "<table>\n");
|
||||||
|
|
||||||
|
|
||||||
|
value=AQH_Value_List_First(valueList);
|
||||||
|
while(value) {
|
||||||
|
if (AQH_Value_GetValueType(value)==AQH_ValueType_Sensor)
|
||||||
|
_writeValueToTable(sDeviceName, value, dbuf);
|
||||||
|
value=AQH_Value_List_Next(value);
|
||||||
|
}
|
||||||
|
GBAS(dbuf, "</table>\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void _writeValueToTable(const char *sDeviceName, const AQH_VALUE *value, GWEN_BUFFER *dbuf)
|
||||||
|
{
|
||||||
|
const char *sValueName;
|
||||||
|
|
||||||
|
/* name */
|
||||||
|
sValueName=AQH_Value_GetName(value);
|
||||||
|
|
||||||
|
GBAS(dbuf, "<tr><td>");
|
||||||
|
_addGraphLink(sDeviceName, sValueName, "1d", dbuf);
|
||||||
|
GBAS(dbuf, "</td><td>");
|
||||||
|
_addGraphLink(sDeviceName, sValueName, "1w", dbuf);
|
||||||
|
GBAS(dbuf, "</td></tr>\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void _addGraphLink(const char *sDeviceName, const char *sValueName, const char *sPeriod, GWEN_BUFFER *dbuf)
|
||||||
|
{
|
||||||
|
GBAS(dbuf, "<img src=\"graph.html?device=");
|
||||||
|
GWEN_Text_EscapeToBufferTolerant(sDeviceName, dbuf);
|
||||||
|
GBAS(dbuf, "&value=");
|
||||||
|
GWEN_Text_EscapeToBufferTolerant(sValueName, dbuf);
|
||||||
|
GBAA(dbuf, "&period=%s\"", sPeriod);
|
||||||
|
GBAA(dbuf, " alt=\"%s\" width=\"%d\" height=\"%d\"", sValueName, AQH_MODDEVICES_GRAPH_WIDTH, AQH_MODDEVICES_GRAPH_HEIGHT);
|
||||||
|
GBAS(dbuf, "/>");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -6,8 +6,8 @@
|
|||||||
* should have received along with this file.
|
* should have received along with this file.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef AQHOME_CGI_MDEVICES_VALUES_H
|
#ifndef AQHOME_CGI_MDEVICES_VALUESGRAPH_H
|
||||||
#define AQHOME_CGI_MDEVICES_VALUES_H
|
#define AQHOME_CGI_MDEVICES_VALUESGRAPH_H
|
||||||
|
|
||||||
|
|
||||||
#include "aqhome-cgi/modules/devices/mdevices.h"
|
#include "aqhome-cgi/modules/devices/mdevices.h"
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDevices_RunValues(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
void AQH_ModDevices_RunValuesAsGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include "./mdevices_values.h"
|
#include "./mdevices_valuestable.h"
|
||||||
#include "./mdevices_index.h"
|
#include "./mdevices_index.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
#include "aqhome-cgi/service/module.h"
|
||||||
@@ -47,7 +47,7 @@ static void _writeValueToTable(const char *sDeviceName, const AQH_VALUE *value,
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModDevices_RunValues(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
void AQH_ModDevices_RunValuesAsTable(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
GWEN_DB_NODE *dbQuery;
|
GWEN_DB_NODE *dbQuery;
|
||||||
const char *sDeviceName;
|
const char *sDeviceName;
|
||||||
27
apps/aqhome-cgi/modules/devices/mdevices_valuestable.h
Normal file
27
apps/aqhome-cgi/modules/devices/mdevices_valuestable.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* This file is part of the project AqHome.
|
||||||
|
* AqHome (c) by 2025 Martin Preuss, all rights reserved.
|
||||||
|
*
|
||||||
|
* The license for this file can be found in the file COPYING which you
|
||||||
|
* should have received along with this file.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef AQHOME_CGI_MDEVICES_VALUESTABLE_H
|
||||||
|
#define AQHOME_CGI_MDEVICES_VALUESTABLE_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "aqhome-cgi/modules/devices/mdevices.h"
|
||||||
|
|
||||||
|
#include "aqhome/aqhome.h"
|
||||||
|
#include "aqhome/dataclient/client.h"
|
||||||
|
|
||||||
|
#include <aqcgi/request.h>
|
||||||
|
|
||||||
|
#include <gwenhywfar/buffer.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void AQH_ModDevices_RunValuesAsTable(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -41,6 +41,7 @@
|
|||||||
#define GBAA GWEN_Buffer_AppendArgs
|
#define GBAA GWEN_Buffer_AppendArgs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
VALUEGRAPH_PERIOD_4H=1,
|
VALUEGRAPH_PERIOD_4H=1,
|
||||||
VALUEGRAPH_PERIOD_1D,
|
VALUEGRAPH_PERIOD_1D,
|
||||||
@@ -74,7 +75,6 @@ static int _getAcceptedAgeForPeriod(int period);
|
|||||||
static void _mkPathForValueAndPeriod(AQH_MODULE *m, const AQH_VALUE *v, int pPeriod, GWEN_BUFFER *dbuf);
|
static void _mkPathForValueAndPeriod(AQH_MODULE *m, const AQH_VALUE *v, int pPeriod, GWEN_BUFFER *dbuf);
|
||||||
static uint64_t _getStartTimeForPeriod(int period);
|
static uint64_t _getStartTimeForPeriod(int period);
|
||||||
static const char *_getModifiersForPeriod(int period);
|
static const char *_getModifiersForPeriod(int period);
|
||||||
static AQH_VALUE *_getValue(AQH_DATACLIENT *dc, const char *sDeviceName, const char *sValueName);
|
|
||||||
|
|
||||||
static AQDG_GRAPH_DATAPAIR_LIST *_requestDataPairList(AQH_DATACLIENT *dc, const char *valueName,
|
static AQDG_GRAPH_DATAPAIR_LIST *_requestDataPairList(AQH_DATACLIENT *dc, const char *valueName,
|
||||||
uint64_t tsBegin, uint64_t tsEnd, uint64_t num);
|
uint64_t tsBegin, uint64_t tsEnd, uint64_t num);
|
||||||
@@ -138,7 +138,7 @@ void _runGraphValueWithArgs(AQH_MODULE *m,
|
|||||||
sDeviceName?sDeviceName:"<empty>", sValueName?sValueName:"<empty>",
|
sDeviceName?sDeviceName:"<empty>", sValueName?sValueName:"<empty>",
|
||||||
sPeriod?sPeriod:"<empty>");
|
sPeriod?sPeriod:"<empty>");
|
||||||
|
|
||||||
value=_getValue(dc, sDeviceName, sValueName);
|
value=AQH_ModDevices_GetValueForDevice(dc, sDeviceName, sValueName);
|
||||||
if (value) {
|
if (value) {
|
||||||
GWEN_BUFFER *fbuf;
|
GWEN_BUFFER *fbuf;
|
||||||
int rv;
|
int rv;
|
||||||
@@ -154,7 +154,7 @@ void _runGraphValueWithArgs(AQH_MODULE *m,
|
|||||||
2,
|
2,
|
||||||
AQH_ValueModality_toString(AQH_Value_GetModality(value)),
|
AQH_ValueModality_toString(AQH_Value_GetModality(value)),
|
||||||
GWEN_Buffer_GetStart(fbuf),
|
GWEN_Buffer_GetStart(fbuf),
|
||||||
640, 480,
|
AQH_MODDEVICES_GRAPH_WIDTH, AQH_MODDEVICES_GRAPH_HEIGHT,
|
||||||
100000);
|
100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,8 +270,8 @@ AQDG_GRAPH *_mkGraphObjectWithTitle(const char *graphTitle, int period, int prec
|
|||||||
switch(period) {
|
switch(period) {
|
||||||
case VALUEGRAPH_PERIOD_4H: s="last 4 hours"; break;
|
case VALUEGRAPH_PERIOD_4H: s="last 4 hours"; break;
|
||||||
case VALUEGRAPH_PERIOD_1D: s="last 24 hours"; break;
|
case VALUEGRAPH_PERIOD_1D: s="last 24 hours"; break;
|
||||||
case VALUEGRAPH_PERIOD_1W: s="last week"; break;
|
case VALUEGRAPH_PERIOD_1W: s="last 7 days"; break;
|
||||||
case VALUEGRAPH_PERIOD_1M: s="last month"; break;
|
case VALUEGRAPH_PERIOD_1M: s="last 30 days"; break;
|
||||||
default: s="last 24 hours"; break;
|
default: s="last 24 hours"; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -352,7 +352,7 @@ const char *_getModifiersForPeriod(int period)
|
|||||||
/* period */
|
/* period */
|
||||||
switch(period) {
|
switch(period) {
|
||||||
case VALUEGRAPH_PERIOD_4H: return "La5";
|
case VALUEGRAPH_PERIOD_4H: return "La5";
|
||||||
case VALUEGRAPH_PERIOD_1D: return "La15";
|
case VALUEGRAPH_PERIOD_1D: return "La30";
|
||||||
case VALUEGRAPH_PERIOD_1W: return "La240";
|
case VALUEGRAPH_PERIOD_1W: return "La240";
|
||||||
case VALUEGRAPH_PERIOD_1M: return "La480";
|
case VALUEGRAPH_PERIOD_1M: return "La480";
|
||||||
default: return "La15";
|
default: return "La15";
|
||||||
@@ -376,39 +376,6 @@ int _getAcceptedAgeForPeriod(int period)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_VALUE *_getValue(AQH_DATACLIENT *dc, const char *sDeviceName, const char *sValueName)
|
|
||||||
{
|
|
||||||
AQH_VALUE_LIST *valueList;
|
|
||||||
|
|
||||||
valueList=AQH_DataClient_GetValues(dc, sDeviceName, 0);
|
|
||||||
if (valueList) {
|
|
||||||
AQH_VALUE *value;
|
|
||||||
|
|
||||||
value=AQH_Value_List_First(valueList);
|
|
||||||
while(value) {
|
|
||||||
const char *s;
|
|
||||||
|
|
||||||
s=AQH_Value_GetName(value);
|
|
||||||
if (s && *s && strcasecmp(s, sValueName)==0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
value=AQH_Value_List_Next(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value) {
|
|
||||||
AQH_Value_List_Del(value);
|
|
||||||
AQH_Value_List_free(valueList);
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
AQH_Value_List_free(valueList);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQDG_GRAPH_DATAPAIR_LIST *_requestDataPairList(AQH_DATACLIENT *dc, const char *valueName,
|
AQDG_GRAPH_DATAPAIR_LIST *_requestDataPairList(AQH_DATACLIENT *dc, const char *valueName,
|
||||||
uint64_t tsBegin, uint64_t tsEnd, uint64_t num)
|
uint64_t tsBegin, uint64_t tsEnd, uint64_t num)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user