diff -r 420bf5caf53e -r ccb9f24d0fe9 bmsd/nodes.c --- a/bmsd/nodes.c Tue May 19 22:48:59 2020 +0200 +++ b/bmsd/nodes.c Wed May 20 21:49:09 2020 +0200 @@ -294,12 +294,14 @@ sys_ispindel_list *tmpi; time_t now = time(NULL); char *msg = NULL; + bool report = false; for (tmpn = nodes; tmpn; tmpn = tmpn->next) { // if (debug) // printf("%-20s online %s %ld %d\n", tmpn->node, tmpn->online ? "yes":"no ", tmpn->lastseen, tmpn->interval); if (tmpn->online && ((now - tmpn->lastseen) > (tmpn->interval * 2 + 5))) { // 2 times interval + 5 seconds syslog(LOG_NOTICE, "Timeout node `%s/%s' after %ld seconds", tmpn->group_id, tmpn->node, (now - tmpn->lastseen)); + report = true; tmpn->online = false; node_mysql_death(tmpn->node); msg = xstrcpy((char *)"{\"node\":\""); @@ -370,6 +372,93 @@ } } } + + if (report) + status_change(); } + +void status_change(void) +{ + sys_node_list *tmpn; + sys_fermenter_list *tmpf; + sys_co2meter_list *tmpc; + sys_ispindel_list *tmpi; + char *msg = NULL; + bool comma = false; + + msg = xstrcpy((char *)"{\"status\":{\"nodes\":["); + + for (tmpn = nodes; tmpn; tmpn = tmpn->next) { + if (comma) + msg = xstrcat(msg, (char *)","); + comma = true; + msg = xstrcat(msg, (char *)"{\"uuid\":\""); + msg = xstrcat(msg, tmpn->uuid); + msg = xstrcat(msg, (char *)"\",\"node\":\""); + msg = xstrcat(msg, tmpn->node); + msg = xstrcat(msg, (char *)"\",\"online\":"); + msg = xstrcat(msg, (tmpn->online) ? (char *)"1":(char *)"0"); + msg = xstrcat(msg, (char *)"}"); + } + + msg = xstrcat(msg, (char *)"],\"fermenters\":["); + comma = false; + for (tmpf = fermenters; tmpf; tmpf = tmpf->next) { + if (comma) + msg = xstrcat(msg, (char *)","); + comma = true; + msg = xstrcat(msg, (char *)"{\"uuid\":\""); + msg = xstrcat(msg, tmpf->uuid); + msg = xstrcat(msg, (char *)"\",\"node\":\""); + msg = xstrcat(msg, tmpf->node); + msg = xstrcat(msg, (char *)"\",\"unit\":\""); + msg = xstrcat(msg, tmpf->alias); + msg = xstrcat(msg, (char *)"\",\"online\":"); + msg = xstrcat(msg, (tmpf->online) ? (char *)"1":(char *)"0"); + msg = xstrcat(msg, (char *)"}"); + } + + msg = xstrcat(msg, (char *)"],\"co2meters\":["); + comma = false; + for (tmpc = co2meters; tmpc; tmpc = tmpc->next) { + if (comma) + msg = xstrcat(msg, (char *)","); + comma = true; + msg = xstrcat(msg, (char *)"{\"uuid\":\""); + msg = xstrcat(msg, tmpc->uuid); + msg = xstrcat(msg, (char *)"\",\"node\":\""); + msg = xstrcat(msg, tmpc->node); + msg = xstrcat(msg, (char *)"\",\"unit\":\""); + msg = xstrcat(msg, tmpc->alias); + msg = xstrcat(msg, (char *)"\",\"online\":"); + msg = xstrcat(msg, (tmpc->online) ? (char *)"1":(char *)"0"); + msg = xstrcat(msg, (char *)"}"); + } + + msg = xstrcat(msg, (char *)"],\"ispindels\":["); + comma = false; + for (tmpi = ispindels; tmpi; tmpi = tmpi->next) { + if (comma) + msg = xstrcat(msg, (char *)","); + comma = true; + msg = xstrcat(msg, (char *)"{\"uuid\":\""); + msg = xstrcat(msg, tmpi->uuid); + msg = xstrcat(msg, (char *)"\",\"node\":\""); + msg = xstrcat(msg, tmpi->node); + msg = xstrcat(msg, (char *)"\",\"unit\":\""); + msg = xstrcat(msg, tmpi->alias); + msg = xstrcat(msg, (char *)"\",\"online\":"); + msg = xstrcat(msg, (tmpi->online) ? (char *)"1":(char *)"0"); + msg = xstrcat(msg, (char *)"}"); + } + + msg = xstrcat(msg, (char *)"]}}"); +// syslog(LOG_NOTICE, msg); + ws_broadcast(msg); + free(msg); + msg = NULL; +} + +