|
|
|
|
@ -593,4 +593,215 @@ int FBSmartHome::GetHKR(std::string ain, FBSmartHomeHKR *hkr) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* switch device off = 0, on = 1 or toggle = 2
|
|
|
|
|
*/
|
|
|
|
|
int FBSmartHome::SimpleOnOff(std::string ain, int oot) {
|
|
|
|
|
std::string s;
|
|
|
|
|
int i, len;
|
|
|
|
|
|
|
|
|
|
if (ain.length() <= 0) return -1;
|
|
|
|
|
for (s = "", i = 0; i < (int)ain.length(); i++) {
|
|
|
|
|
if (ain[i] == ' ') s += "%20";
|
|
|
|
|
else s += ain[i];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// send switch on / off
|
|
|
|
|
len = tcp.WebGetFile(hostname+"/webservices/homeautoswitch.lua?sid="+SID+"&switchcmd=setsimpleonoff&ain="+s+"&onoff="+to_string(oot), 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';
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* set device level 0...255 (0-100%)
|
|
|
|
|
*/
|
|
|
|
|
int FBSmartHome::SetLevel(std::string ain, int level) {
|
|
|
|
|
std::string s;
|
|
|
|
|
int i, len;
|
|
|
|
|
|
|
|
|
|
if (ain.length() <= 0) return -1;
|
|
|
|
|
for (s = "", i = 0; i < (int)ain.length(); i++) {
|
|
|
|
|
if (ain[i] == ' ') s += "%20";
|
|
|
|
|
else s += ain[i];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// send switch on / off
|
|
|
|
|
len = tcp.WebGetFile(hostname+"/webservices/homeautoswitch.lua?sid="+SID+"&switchcmd=setlevel&ain="+s+"&level="+to_string(level), 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';
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::list<FBSmartHomeLightDefaults> *FBSmartHome::GetColorDefaults (std::string ain) {
|
|
|
|
|
std::list<FBSmartHomeLightDefaults> *lst = new std::list<FBSmartHomeLightDefaults>;
|
|
|
|
|
std::string cmd;
|
|
|
|
|
std::string s;
|
|
|
|
|
int i, len;
|
|
|
|
|
xmlDocPtr xmldoc;
|
|
|
|
|
xmlNodePtr xmlnode;
|
|
|
|
|
xmlAttrPtr xmlattr;
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// convert space char to %20 to be used in URLs
|
|
|
|
|
//
|
|
|
|
|
if (ain.length() <= 0) return lst;
|
|
|
|
|
for (s = "", i = 0; i < (int)ain.length(); i++) {
|
|
|
|
|
if (ain[i] == ' ') s += "%20";
|
|
|
|
|
else s += ain[i];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cmd = hostname+"/webservices/homeautoswitch.lua?sid="+SID+"&switchcmd=getcolordefaults&ain="+s;
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// send switch on / off
|
|
|
|
|
len = tcp.WebGetFile(cmd, 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 lst;
|
|
|
|
|
}
|
|
|
|
|
inbuffer[len] = '\0';
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// convert inbuffer to list of values
|
|
|
|
|
//
|
|
|
|
|
XMLPrepare(inbuffer, len, &xmldoc, &xmlnode);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// parse for SID and Challange
|
|
|
|
|
while (xmlnode) {
|
|
|
|
|
if ((!xmlStrcmp(xmlnode->name, (const xmlChar *)"colordefaults"))){
|
|
|
|
|
xmlNodePtr xmlchild = xmlnode->xmlChildrenNode;
|
|
|
|
|
std::string txt;
|
|
|
|
|
|
|
|
|
|
while (xmlchild) {
|
|
|
|
|
// hsdefaults
|
|
|
|
|
if (!xmlStrcmp(xmlchild->name, (const xmlChar *)"hsdefaults")) {
|
|
|
|
|
xmlNodePtr xmlhs = xmlchild->children;
|
|
|
|
|
|
|
|
|
|
while(xmlhs) {
|
|
|
|
|
if (!xmlStrcmp(xmlhs->name, (const xmlChar *)"hs")) {
|
|
|
|
|
xmlNodePtr xmlc = xmlhs->children;
|
|
|
|
|
|
|
|
|
|
while (xmlc) {
|
|
|
|
|
if (!xmlStrcmp(xmlc->name, (const xmlChar *)"color")) {
|
|
|
|
|
xmlattr = xmlc->properties;
|
|
|
|
|
FBSmartHomeLightDefaults def = { -1, -1, -1 };
|
|
|
|
|
while (xmlattr) {
|
|
|
|
|
if (!xmlStrcmp(xmlattr->name, (const xmlChar *)"hue"))
|
|
|
|
|
def.hue = atoi((char *) xmlNodeListGetString(xmldoc, xmlattr->children, 1));
|
|
|
|
|
else if (!xmlStrcmp(xmlattr->name, (const xmlChar *)"sat"))
|
|
|
|
|
def.sat = atoi((char *) xmlNodeListGetString(xmldoc, xmlattr->children, 1));
|
|
|
|
|
else if (!xmlStrcmp(xmlattr->name, (const xmlChar *)"val"))
|
|
|
|
|
def.val = atoi((char *) xmlNodeListGetString(xmldoc, xmlattr->children, 1));
|
|
|
|
|
xmlattr = xmlattr->next;
|
|
|
|
|
}
|
|
|
|
|
if (def.hue != -1) lst->push_back(def);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
xmlc = xmlc->next;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
xmlhs = xmlhs->next;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
xmlchild = xmlchild->next;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
xmlnode = xmlnode->next;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return lst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
int FBSmartHome::SetColor(std::string ain, int hue, int sat, int duration) {
|
|
|
|
|
std::list<FBSmartHomeLightDefaults> *defcolors = NULL;
|
|
|
|
|
std::list<FBSmartHomeLightDefaults>::iterator iter;
|
|
|
|
|
std::string s;
|
|
|
|
|
std::string cmd;
|
|
|
|
|
int i, len;
|
|
|
|
|
float delta;
|
|
|
|
|
struct {
|
|
|
|
|
float delta;
|
|
|
|
|
int hue;
|
|
|
|
|
int sat;
|
|
|
|
|
int val;
|
|
|
|
|
} selected_color;
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// convert space char to %20 to be used in URLs
|
|
|
|
|
//
|
|
|
|
|
if (ain.length() <= 0) return -1;
|
|
|
|
|
for (s = "", i = 0; i < (int)ain.length(); i++) {
|
|
|
|
|
if (ain[i] == ' ') s += "%20";
|
|
|
|
|
else s += ain[i];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// need to read defaults and round up to the next closest parameters
|
|
|
|
|
//
|
|
|
|
|
defcolors = GetColorDefaults(ain);
|
|
|
|
|
iter = defcolors->begin();
|
|
|
|
|
if (iter != defcolors->end()) {
|
|
|
|
|
selected_color.hue = iter->hue;
|
|
|
|
|
selected_color.sat = iter->sat;
|
|
|
|
|
selected_color.val = iter->val;
|
|
|
|
|
selected_color.delta = (iter->hue - hue) * (iter->hue - hue)
|
|
|
|
|
+ (iter->sat - sat) * (iter->hue - sat);
|
|
|
|
|
|
|
|
|
|
for (iter++; iter != defcolors->end(); iter++) {
|
|
|
|
|
delta = (iter->hue - hue) * (iter->hue - hue)
|
|
|
|
|
+ (iter->sat - sat) * (iter->hue - sat);
|
|
|
|
|
if (delta < selected_color.delta) {
|
|
|
|
|
selected_color.hue = iter->hue;
|
|
|
|
|
selected_color.sat = iter->sat;
|
|
|
|
|
selected_color.val = iter->val;
|
|
|
|
|
selected_color.delta = delta;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cmd = hostname+"/webservices/homeautoswitch.lua?sid="+SID+"&switchcmd=setcolor&ain="+s;
|
|
|
|
|
cmd += "&hue="+to_string(selected_color.hue)+"&saturation="+to_string(selected_color.sat)+"&duration="+to_string(duration);
|
|
|
|
|
|
|
|
|
|
printf ("%s:%d SetColor ain:'%s' hue,sat %d,%d selected hue,sat: %d,%d duration:%d\n", __FILE__, __LINE__, ain.c_str(),
|
|
|
|
|
hue, sat, selected_color.hue, selected_color.sat, duration);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// send switch on / off
|
|
|
|
|
len = tcp.WebGetFile(cmd, 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';
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|