|
|
|
@ -427,3 +427,169 @@ std::list<FBSmartHomeDevice> *FBSmartHome::GetDevices() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
* read data from device and fill out FBSmartHomeHZR structure
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
int FBSmartHome::GetHZR(std::string ain, FBSmartHomeHZR *hzr) {
|
|
|
|
|
|
|
|
std::string s;
|
|
|
|
|
|
|
|
FBSmartHomeDevice smd;
|
|
|
|
|
|
|
|
xmlDocPtr xmldoc;
|
|
|
|
|
|
|
|
xmlNodePtr xmlnode;
|
|
|
|
|
|
|
|
xmlAttrPtr xmlattr;
|
|
|
|
|
|
|
|
int len, i;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (hzr == NULL) return -1;
|
|
|
|
|
|
|
|
for (s = "", i = 0; i < (int)ain.length(); i++) {
|
|
|
|
|
|
|
|
if (ain[i] == ' ') s += "%20";
|
|
|
|
|
|
|
|
else s += ain[i];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// read device info
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// retrieve data
|
|
|
|
|
|
|
|
len = tcp.WebGetFile(hostname+"/webservices/homeautoswitch.lua?sid="+SID+"&switchcmd=getdeviceinfos&ain="+s, inbuffer, FB_BUFFER, NULL);
|
|
|
|
|
|
|
|
if (len > FB_BUFFER) len = FB_BUFFER;
|
|
|
|
|
|
|
|
else if (len < 0) {
|
|
|
|
|
|
|
|
fprintf (stderr, "%s:%d Error getting challenge from Fritzbox\n", __FILE__, __LINE__);
|
|
|
|
|
|
|
|
errno = EAI_FAIL;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
inbuffer[len] = '\0';
|
|
|
|
|
|
|
|
XMLPrepare(inbuffer, len, &xmldoc, &xmlnode);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// parse for SID and Challange
|
|
|
|
|
|
|
|
while (xmlnode) {
|
|
|
|
|
|
|
|
if ((!xmlStrcmp(xmlnode->name, (const xmlChar *)"device"))){
|
|
|
|
|
|
|
|
xmlNodePtr xmlchild = xmlnode->xmlChildrenNode;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmlattr = xmlnode->properties;
|
|
|
|
|
|
|
|
while (xmlattr) {
|
|
|
|
|
|
|
|
if (!xmlStrcmp(xmlattr->name, (const xmlChar *)"identifier"))
|
|
|
|
|
|
|
|
hzr->id = (char *) xmlNodeListGetString(xmldoc, xmlattr->children, 1);
|
|
|
|
|
|
|
|
xmlattr = xmlattr->next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
while (xmlchild) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// name
|
|
|
|
|
|
|
|
if (!xmlStrcmp(xmlchild->name, (const xmlChar *)"name"))
|
|
|
|
|
|
|
|
hzr->name = (char *) xmlNodeListGetString(xmldoc, xmlchild->children, 1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// temperatur
|
|
|
|
|
|
|
|
else if (!xmlStrcmp(xmlchild->name, (const xmlChar *)"temperature")) {
|
|
|
|
|
|
|
|
xmlNodePtr xmlc = xmlchild->children;
|
|
|
|
|
|
|
|
while(xmlc) {
|
|
|
|
|
|
|
|
if (!xmlStrcmp(xmlc->name, (const xmlChar *)"celsius")) {
|
|
|
|
|
|
|
|
hzr->temp = (atof ((char *) xmlNodeListGetString(xmldoc, xmlc->children, 1))) / 10.0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (!xmlStrcmp(xmlc->name, (const xmlChar *)"offset")) {
|
|
|
|
|
|
|
|
hzr->offset = atoi ((char *) xmlNodeListGetString(xmldoc, xmlc->children, 1));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmlc = xmlc->next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// hzr
|
|
|
|
|
|
|
|
else if (!xmlStrcmp(xmlchild->name, (const xmlChar *)"hkr")) {
|
|
|
|
|
|
|
|
xmlNodePtr xmlc = xmlchild->children;
|
|
|
|
|
|
|
|
while(xmlc) {
|
|
|
|
|
|
|
|
if (!xmlStrcmp(xmlc->name, (const xmlChar *)"tist")) {
|
|
|
|
|
|
|
|
hzr->temp_cur = atof ((char *) xmlNodeListGetString(xmldoc, xmlc->children, 1));
|
|
|
|
|
|
|
|
hzr->temp_cur = hzr->temp_cur / 2.0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (!xmlStrcmp(xmlc->name, (const xmlChar *)"tsoll")) {
|
|
|
|
|
|
|
|
hzr->temp_set = atof ((char *) xmlNodeListGetString(xmldoc, xmlc->children, 1));
|
|
|
|
|
|
|
|
hzr->temp_set = hzr->temp_set / 2.0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (!xmlStrcmp(xmlc->name, (const xmlChar *)"absenk")) {
|
|
|
|
|
|
|
|
hzr->temp_l = atof ((char *) xmlNodeListGetString(xmldoc, xmlc->children, 1));
|
|
|
|
|
|
|
|
hzr->temp_l = hzr->temp_l / 2.0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (!xmlStrcmp(xmlc->name, (const xmlChar *)"komfort")) {
|
|
|
|
|
|
|
|
hzr->temp_h = atof ((char *) xmlNodeListGetString(xmldoc, xmlc->children, 1));
|
|
|
|
|
|
|
|
hzr->temp_h = hzr->temp_h / 2.0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmlc = xmlc->next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmlchild = xmlchild->next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
xmlnode = xmlnode->next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
xmlFreeDoc(xmldoc);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// retrieve data
|
|
|
|
|
|
|
|
len = tcp.WebGetFile(hostname+"/webservices/homeautoswitch.lua?sid="+SID+"&switchcmd=getbasicdevicestats&ain="+s, inbuffer, FB_BUFFER, NULL);
|
|
|
|
|
|
|
|
if (len > FB_BUFFER) len = FB_BUFFER;
|
|
|
|
|
|
|
|
else if (len < 0) {
|
|
|
|
|
|
|
|
fprintf (stderr, "%s:%d Error getting challenge from Fritzbox\n", __FILE__, __LINE__);
|
|
|
|
|
|
|
|
errno = EAI_FAIL;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
inbuffer[len] = '\0';
|
|
|
|
|
|
|
|
XMLPrepare(inbuffer, len, &xmldoc, &xmlnode);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// parse for SID and Challange
|
|
|
|
|
|
|
|
while (xmlnode) {
|
|
|
|
|
|
|
|
if ((!xmlStrcmp(xmlnode->name, (const xmlChar *)"devicestats"))){
|
|
|
|
|
|
|
|
xmlNodePtr xmlchild = xmlnode->xmlChildrenNode;
|
|
|
|
|
|
|
|
std::string txt;
|
|
|
|
|
|
|
|
float f;
|
|
|
|
|
|
|
|
char *t;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (xmlchild) {
|
|
|
|
|
|
|
|
// temperatur
|
|
|
|
|
|
|
|
if (!xmlStrcmp(xmlchild->name, (const xmlChar *)"temperature")) {
|
|
|
|
|
|
|
|
xmlNodePtr xmlc = xmlchild->children;
|
|
|
|
|
|
|
|
int count = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while(xmlc) {
|
|
|
|
|
|
|
|
if (!xmlStrcmp(xmlc->name, (const xmlChar *)"stats")) {
|
|
|
|
|
|
|
|
xmlattr = xmlc->properties;
|
|
|
|
|
|
|
|
while (xmlattr) {
|
|
|
|
|
|
|
|
if (!xmlStrcmp(xmlattr->name, (const xmlChar *)"count"))
|
|
|
|
|
|
|
|
count = atoi((char *) xmlNodeListGetString(xmldoc, xmlattr->children, 1));
|
|
|
|
|
|
|
|
else if (!xmlStrcmp(xmlattr->name, (const xmlChar *)"grid"))
|
|
|
|
|
|
|
|
hzr-> statsgrid = atoi((char *) xmlNodeListGetString(xmldoc, xmlattr->children, 1));
|
|
|
|
|
|
|
|
xmlattr = xmlattr->next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
txt = ((char *) xmlNodeListGetString(xmldoc, xmlc->children, 1));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hzr->stats.clear();
|
|
|
|
|
|
|
|
t = (char*)txt.c_str();
|
|
|
|
|
|
|
|
for (int i = 0; t != NULL && i < count; i++) {
|
|
|
|
|
|
|
|
if (*t == ',') t++;
|
|
|
|
|
|
|
|
f = atoi (t);
|
|
|
|
|
|
|
|
hzr->stats.push_back(f);
|
|
|
|
|
|
|
|
t = strchr(t, ',');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
xmlc = xmlc->next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xmlchild = xmlchild->next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
xmlnode = xmlnode->next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
xmlFreeDoc(xmldoc);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|