int json_copy_to_object(JsonNode * obj, JsonNode * object_or_array, int clobber) { JsonNode *node; if (obj->tag != JSON_OBJECT && obj->tag != JSON_ARRAY) return (FALSE); json_foreach(node, object_or_array) { if (!clobber & (json_find_member(obj, node->key) != NULL)) continue; /* Don't clobber existing keys */ if (obj->tag == JSON_OBJECT) { if (node->tag == JSON_STRING) json_append_member(obj, node->key, json_mkstring(node->string_)); else if (node->tag == JSON_NUMBER) json_append_member(obj, node->key, json_mknumber(node->number_)); else if (node->tag == JSON_BOOL) json_append_member(obj, node->key, json_mkbool(node->bool_)); else if (node->tag == JSON_NULL) json_append_member(obj, node->key, json_mknull()); else fprintf(stderr, "PANIC: unhandled JSON type %d\n", node->tag); } else if (obj->tag == JSON_ARRAY) { if (node->tag == JSON_STRING) json_append_element(obj, json_mkstring(node->string_)); if (node->tag == JSON_NUMBER) json_append_element(obj, json_mknumber(node->number_)); if (node->tag == JSON_BOOL) json_append_element(obj, json_mkbool(node->bool_)); if (node->tag == JSON_NULL) json_append_element(obj, json_mknull()); } } return (TRUE); }
void *events_clientize(void *param) { logprintf(LOG_STACK, "%s(...)", __FUNCTION__); unsigned int failures = 0; while(loop && failures <= 5) { struct ssdp_list_t *ssdp_list = NULL; int standalone = 0; settings_find_number("standalone", &standalone); if(ssdp_seek(&ssdp_list) == -1 || standalone == 1) { logprintf(LOG_DEBUG, "no pilight ssdp connections found"); char server[16] = "127.0.0.1"; if((sockfd = socket_connect(server, (unsigned short)socket_get_port())) == -1) { logprintf(LOG_DEBUG, "could not connect to pilight-daemon"); failures++; continue; } } else { if((sockfd = socket_connect(ssdp_list->ip, ssdp_list->port)) == -1) { logprintf(LOG_DEBUG, "could not connect to pilight-daemon"); failures++; continue; } } if(ssdp_list) { ssdp_free(ssdp_list); } struct JsonNode *jclient = json_mkobject(); struct JsonNode *joptions = json_mkobject(); json_append_member(jclient, "action", json_mkstring("identify")); json_append_member(joptions, "config", json_mknumber(1, 0)); json_append_member(jclient, "options", joptions); json_append_member(jclient, "media", json_mkstring("all")); char *out = json_stringify(jclient, NULL); socket_write(sockfd, out); json_free(out); json_delete(jclient); if(socket_read(sockfd, &recvBuff, 0) != 0 || strcmp(recvBuff, "{\"status\":\"success\"}") != 0) { failures++; continue; } failures = 0; while(loop) { if(socket_read(sockfd, &recvBuff, 0) != 0) { break; } else { events_queue(recvBuff); } } } if(recvBuff) { FREE(recvBuff); recvBuff = NULL; } socket_close(sockfd); return 0; }
int member_to_object(JsonNode *object, int flags, char *kv) { /* we expect key=value or key:value (boolean on last) */ char *p = strchr(kv, '='); char *q = strchr(kv, '@'); if (!p && !q) { return (-1); } if (p) { *p = 0; if (nested(flags, kv, p+1) == TRUE) return (0); json_append_member(object, kv, vnode(p+1, flags)); } else { *q = 0; if (nested(flags | FLAG_BOOLEAN, kv, q+1) == TRUE) return (0); json_append_member(object, kv, boolnode(q+1)); } return (0); }
static void createMessage(int id, int unit, double temperature, double humidity) { ninjablocks_weather->message = json_mkobject(); json_append_member(ninjablocks_weather->message, "id", json_mknumber(id, 0)); json_append_member(ninjablocks_weather->message, "unit", json_mknumber(unit, 0)); json_append_member(ninjablocks_weather->message, "temperature", json_mknumber(temperature/100, 2)); json_append_member(ninjablocks_weather->message, "humidity", json_mknumber(humidity, 0)); }
static JsonNode *line_to_location(char *line) { JsonNode *json, *o, *j; char *ghash; char tstamp[64], *bp; double lat, lon; long tst; snprintf(tstamp, 21, "%s", line); if ((bp = strchr(line, '{')) == NULL) return (NULL); if ((json = json_decode(bp)) == NULL) { return (NULL); } if ((j = json_find_member(json, "_type")) == NULL) { json_delete(json); return (NULL); } if (j->tag != JSON_STRING || strcmp(j->string_, "location") != 0) { json_delete(json); return (NULL); } o = json_mkobject(); if (json_copy_to_object(o, json, FALSE) == FALSE) { json_delete(o); json_delete(json); return (NULL); } json_delete(json); /* Done with this -- we've copied it. */ lat = lon = 0.0; if ((j = json_find_member(o, "lat")) != NULL) { lat = j->number_; } if ((j = json_find_member(o, "lon")) != NULL) { lon = j->number_; } if ((ghash = geohash_encode(lat, lon, geohash_prec())) != NULL) { json_append_member(o, "ghash", json_mkstring(ghash)); get_geo(o, ghash); free(ghash); } json_append_member(o, "isorcv", json_mkstring(tstamp)); tst = 0L; if ((j = json_find_member(o, "tst")) != NULL) { tst = j->number_; } json_append_member(o, "isotst", json_mkstring(isotime(tst))); return (o); }
void relayCreateMessage(int gpio, int state) { relay->message = json_mkobject(); json_append_member(relay->message, "gpio", json_mknumber(gpio)); if(state == 1) json_append_member(relay->message, "state", json_mkstring("on")); else json_append_member(relay->message, "state", json_mkstring("off")); }
static void createMessage(int id, int unit, int state) { arctech_screen_old->message = json_mkobject(); json_append_member(arctech_screen_old->message, "id", json_mknumber(id, 0)); json_append_member(arctech_screen_old->message, "unit", json_mknumber(unit, 0)); if(state == 1) json_append_member(arctech_screen_old->message, "state", json_mkstring("up")); else json_append_member(arctech_screen_old->message, "state", json_mkstring("down")); }
void genSwitchCreateMessage(int id, int state) { generic_switch->message = json_mkobject(); json_append_member(generic_switch->message, "id", json_mknumber(id)); if(state == 1) { json_append_member(generic_switch->message, "state", json_mkstring("on")); } else { json_append_member(generic_switch->message, "state", json_mkstring("off")); } }
void sartanoCreateMessage(int id, int unit, int state) { sartano.message = json_mkobject(); json_append_member(sartano.message, "id", json_mknumber(id)); json_append_member(sartano.message, "unit", json_mknumber(unit)); if(state == 1) json_append_member(sartano.message, "state", json_mkstring("on")); else json_append_member(sartano.message, "state", json_mkstring("off")); }
static void x10CreateMessage(char *id, int state) { x10->message = json_mkobject(); json_append_member(x10->message, "id", json_mkstring(id)); if(state == 0) { json_append_member(x10->message, "state", json_mkstring("on")); } else { json_append_member(x10->message, "state", json_mkstring("off")); } }
void clarusSwCreateMessage(char *id, int unit, int state) { clarus_switch->message = json_mkobject(); json_append_member(clarus_switch->message, "id", json_mkstring(id)); json_append_member(clarus_switch->message, "unit", json_mknumber(unit)); if(state == 2) json_append_member(clarus_switch->message, "state", json_mkstring("on")); else json_append_member(clarus_switch->message, "state", json_mkstring("off")); }
static void arctechSwOldCreateMessage(int id, int unit, int state) { arctech_switch_old->message = json_mkobject(); json_append_member(arctech_switch_old->message, "id", json_mknumber(id, 0)); json_append_member(arctech_switch_old->message, "unit", json_mknumber(unit, 0)); if(state == 1) json_append_member(arctech_switch_old->message, "state", json_mkstring("on")); else json_append_member(arctech_switch_old->message, "state", json_mkstring("off")); }
void conradRSLCnCreateMessage(int id, int state) { conrad_rsl_contact->message = json_mkobject(); json_append_member(conrad_rsl_contact->message, "id", json_mknumber(id)); if(state == 1) { json_append_member(conrad_rsl_contact->message, "state", json_mkstring("opened")); } else { json_append_member(conrad_rsl_contact->message, "state", json_mkstring("closed")); } }
static void parseCode(void) { int binary[RAW_LENGTH/2]; int temp1 = 0, temp2 = 0, temp3 = 0; int humi1 = 0, humi2 = 0; int id = 0, battery = 0; int channel = 0; int i = 0, x = 0; double humi_offset = 0.0, temp_offset = 0.0; double temperature = 0.0, humidity = 0.0; for(x=1;x<tfa->rawlen-2;x+=2) { if(tfa->raw[x] > AVG_PULSE_LENGTH*PULSE_MULTIPLIER) { binary[i++] = 1; } else { binary[i++] = 0; } } id = binToDecRev(binary, 2, 9); channel = binToDecRev(binary, 12, 13) + 1; temp1 = binToDecRev(binary, 14, 17); temp2 = binToDecRev(binary, 18, 21); temp3 = binToDecRev(binary, 22, 25); /* Convert F to C */ temperature = (int)((float)(((((temp3*256) + (temp2*16) + (temp1))*10) - 9000) - 3200) * ((float)5/(float)9)); humi1 = binToDecRev(binary, 26, 29); humi2 = binToDecRev(binary, 30, 33); humidity = ((humi1)+(humi2*16)); if(binToDecRev(binary, 34, 35) > 1) { battery = 0; } else { battery = 1; } struct settings_t *tmp = settings; while(tmp) { if(fabs(tmp->id-id) < EPSILON && fabs(tmp->channel-channel) < EPSILON) { humi_offset = tmp->humi; temp_offset = tmp->temp; break; } tmp = tmp->next; } temperature += temp_offset; humidity += humi_offset; tfa->message = json_mkobject(); json_append_member(tfa->message, "id", json_mknumber(id, 0)); json_append_member(tfa->message, "temperature", json_mknumber(temperature/100, 2)); json_append_member(tfa->message, "humidity", json_mknumber(humidity, 2)); json_append_member(tfa->message, "battery", json_mknumber(battery, 0)); json_append_member(tfa->message, "channel", json_mknumber(channel, 0)); }
static void selectremoteCreateMessage(int id, int state) { selectremote->message = json_mkobject(); json_append_member(selectremote->message, "id", json_mknumber(id, 0)); if(state == 1) { json_append_member(selectremote->message, "state", json_mkstring("on")); } else { json_append_member(selectremote->message, "state", json_mkstring("off")); } }
static void genScreenCreateMessage(int id, int state) { generic_screen->message = json_mkobject(); json_append_member(generic_screen->message, "id", json_mknumber(id)); if(state == 1) { json_append_member(generic_screen->message, "state", json_mkstring("up")); } else { json_append_member(generic_screen->message, "state", json_mkstring("down")); } }
static void rev3CreateMessage(int id, int unit, int state) { rev3_switch->message = json_mkobject(); json_append_member(rev3_switch->message, "id", json_mknumber(id)); json_append_member(rev3_switch->message, "unit", json_mknumber(unit)); if(state == 1) { json_append_member(rev3_switch->message, "state", json_mkstring("on")); } else { json_append_member(rev3_switch->message, "state", json_mkstring("off")); } }
static void elroHECreateMessage(int systemcode, int unitcode, int state) { elro_he->message = json_mkobject(); json_append_member(elro_he->message, "systemcode", json_mknumber(systemcode)); json_append_member(elro_he->message, "unitcode", json_mknumber(unitcode)); if(state == 0) { json_append_member(elro_he->message, "state", json_mkstring("on")); } else { json_append_member(elro_he->message, "state", json_mkstring("off")); } }
static void createMessage(int systemcode, int unitcode, int state) { pollin->message = json_mkobject(); json_append_member(pollin->message, "systemcode", json_mknumber(systemcode, 0)); json_append_member(pollin->message, "unitcode", json_mknumber(unitcode, 0)); if(state == 0) { json_append_member(pollin->message, "state", json_mkstring("on")); } else { json_append_member(pollin->message, "state", json_mkstring("off")); } }
void genWeatherCreateMessage(int id, int temperature, int humidity) { generic_weather->message = json_mkobject(); json_append_member(generic_weather->message, "id", json_mknumber(id)); if(temperature > -999) { json_append_member(generic_weather->message, "temperature", json_mknumber(temperature)); } if(humidity > -999) { json_append_member(generic_weather->message, "humidity", json_mknumber(humidity)); } }
static void createMessage(int systemcode, int programcode, int state) { rsl366->message = json_mkobject(); json_append_member(rsl366->message, "systemcode", json_mknumber(systemcode, 0)); json_append_member(rsl366->message, "programcode", json_mknumber(programcode, 0)); if(state == 1) { json_append_member(rsl366->message, "state", json_mkstring("on")); } else { json_append_member(rsl366->message, "state", json_mkstring("off")); } }
void impulsCreateMessage(int systemcode, int programcode, int state) { impuls->message = json_mkobject(); json_append_member(impuls->message, "systemcode", json_mknumber(systemcode)); json_append_member(impuls->message, "programcode", json_mknumber(programcode)); if(state == 1) { json_append_member(impuls->message, "state", json_mkstring("on")); } else { json_append_member(impuls->message, "state", json_mkstring("off")); } }
void arctechSwCreateMessage(int id, int unit, int state, int all) { arctech_switch.message = json_mkobject(); json_append_member(arctech_switch.message, "id", json_mknumber(id)); json_append_member(arctech_switch.message, "unit", json_mknumber(unit)); if(all == 1) json_append_member(arctech_switch.message, "all", json_mknumber(all)); if(state == 1) json_append_member(arctech_switch.message, "state", json_mkstring("on")); else json_append_member(arctech_switch.message, "state", json_mkstring("off")); }
static void createMessage(int id, int systemcode, int unit, int state) { daycom->message = json_mkobject(); json_append_member(daycom->message, "id", json_mknumber(id, 0)); json_append_member(daycom->message, "systemcode", json_mknumber(systemcode, 0)); json_append_member(daycom->message, "unit", json_mknumber(unit, 0)); if(state == 0) { json_append_member(daycom->message, "state", json_mkstring("on")); } else { json_append_member(daycom->message, "state", json_mkstring("off")); } }
int nested(int flags, char *key, char *value) { char *member = NULL, *bo, *bc; /* bracket open, close */ JsonNode *op; int found = FALSE; /* Check for geo[] or geo[lat] */ if ((bo = strchr(key, '[')) != NULL) { if (*(bo+1) == ']') { *bo = 0; } else if ((bc = strchr(bo + 1, ']')) == NULL) { fprintf(stderr, "missing closing bracket on %s\n", key); return (-1); } else { *bo = *bc = 0; member = bo + 1; } /* * key is now `geo' for both `geo[]` and `geo[lat]` * member is null for the former and "lat" for the latter. * Find an existing object in the pile for this member name * or create a new one if we don't have it. */ if ((op = json_find_member(pile, key)) != NULL) { found = TRUE; } else { op = (member == NULL) ? json_mkarray() : json_mkobject(); } if (member == NULL) { /* we're doing an array */ if (flags & FLAG_BOOLEAN) { json_append_element(op, boolnode(value)); } else { json_append_element(op, vnode(value, flags)); } } else { /* we're doing an object */ if (flags & FLAG_BOOLEAN) { json_append_member(op, member, boolnode(value)); } else { json_append_member(op, member, vnode(value, flags)); } } if (!found) { json_append_member(pile, key, op); } return (TRUE); } return (FALSE); }
static void cleverwattsCreateMessage(int id, int unit, int state, int all) { cleverwatts->message = json_mkobject(); json_append_member(cleverwatts->message, "id", json_mknumber(id)); if(all == 0) { json_append_member(cleverwatts->message, "all", json_mknumber(1)); } else { json_append_member(cleverwatts->message, "unit", json_mknumber(unit)); } if(state == 0) json_append_member(cleverwatts->message, "state", json_mkstring("on")); else json_append_member(cleverwatts->message, "state", json_mkstring("off")); }
static int registry_set_value_recursive(struct JsonNode *root, const char *key, void *value, int decimals, int type) { logprintf(LOG_STACK, "%s(...)", __FUNCTION__); char *sub = strstr(key, "."); char *buff = MALLOC(strlen(key)+1); strcpy(buff, key); if(sub != NULL) { int pos = sub-key; buff[pos] = '\0'; } struct JsonNode *member = json_find_member(root, buff); if(member != NULL) { if(member->tag == type) { if(type == JSON_NUMBER) { member->number_ = *(double *)value; member->decimals_ = decimals; } else if(type == JSON_STRING) { member->string_ = REALLOC(member->string_, strlen(value)+1); strcpy(member->string_, (char *)value); } FREE(buff); return 0; } else if(member->tag == JSON_OBJECT) { if(sub != NULL) { int pos = sub-key; strcpy(buff, &key[pos+1]); } int ret = registry_set_value_recursive(member, buff, value, decimals, type); FREE(buff); return ret; } } else if(sub != NULL) { member = json_mkobject(); json_append_member(root, buff, member); int pos = sub-key; strcpy(buff, &key[pos+1]); int ret = registry_set_value_recursive(member, buff, value, decimals, type); FREE(buff); return ret; } else { if(type == JSON_NUMBER) { json_append_member(root, buff, json_mknumber(*(double *)value, decimals)); } else if(type == JSON_STRING) { json_append_member(root, buff, json_mkstring(value)); } FREE(buff); return 0; } FREE(buff); return -1; }
void homeEasyOldCreateMessage(int systemcode, int unitcode, int state, int all) { home_easy_old->message = json_mkobject(); json_append_member(home_easy_old->message, "systemcode", json_mknumber(systemcode)); if(all == 1) { json_append_member(home_easy_old->message, "all", json_mknumber(all)); } else { json_append_member(home_easy_old->message, "unitcode", json_mknumber(unitcode)); } if(state == 0) { json_append_member(home_easy_old->message, "state", json_mkstring("on")); } else { json_append_member(home_easy_old->message, "state", json_mkstring("off")); } }
static void rc101CreateMessage(int id, int state, int unit, int all) { rc101->message = json_mkobject(); json_append_member(rc101->message, "id", json_mknumber(id, 0)); if(all == 1) { json_append_member(rc101->message, "all", json_mknumber(1, 0)); } else { json_append_member(rc101->message, "unit", json_mknumber(unit, 0)); } if(state == 1) { json_append_member(rc101->message, "state", json_mkstring("on")); } else { json_append_member(rc101->message, "state", json_mkstring("off")); } }
void arctechContactCreateMessage(int id, int unit, int state, int all) { arctech_contact->message = json_mkobject(); json_append_member(arctech_contact->message, "id", json_mknumber(id)); if(all == 1) { json_append_member(arctech_contact->message, "all", json_mknumber(all)); } else { json_append_member(arctech_contact->message, "unit", json_mknumber(unit)); } if(state == 1) { json_append_member(arctech_contact->message, "state", json_mkstring("opened")); } else { json_append_member(arctech_contact->message, "state", json_mkstring("closed")); } }