bmsd/nodes.c

branch
stable
changeset 665
4d01937ae7af
parent 578
e75ce5bbda73
child 672
23f959713fcb
--- a/bmsd/nodes.c	Fri Oct 18 13:20:35 2019 +0200
+++ b/bmsd/nodes.c	Fri May 01 16:37:31 2020 +0200
@@ -3,7 +3,7 @@
  * @brief Handle nodes status
  * @author Michiel Broek <mbroek at mbse dot eu>
  *
- * Copyright (C) 2018-2019
+ * Copyright (C) 2018-2020
  *
  * This file is part of the bms (Brewery Management System)
  *
@@ -34,7 +34,7 @@
 extern int			debug;
 extern sys_fermenter_list	*fermenters;
 extern sys_co2meter_list	*co2meters;
-
+extern sys_ispindel_list	*ispindels;
 
 
 void node_birth_data(char *topic, char *payload)
@@ -82,6 +82,7 @@
     	node->gps_latitude = node->gps_longitude = node->gps_altitude = 0.0;
 	node->net_address = node->net_ifname = NULL;
 	node->net_rssi = 0;
+	node->interval = 300;
     }
 
     /*
@@ -111,6 +112,9 @@
 		free(node->uuid);
 	    node->uuid = xstrcpy((char *)json_object_get_string(val));
 	}
+	if (json_object_object_get_ex(metric, "interval", &val)) {
+	    node->interval = json_object_get_int(val);
+	}
 	if (json_object_object_get_ex(metric, "properties", &metric2)) {
 	    if (json_object_object_get_ex(metric2, "hardwaremake", &val)) {
 		if (node->hardwaremake)
@@ -214,6 +218,7 @@
     	printf("GPS       %.5f  %.5f  %.5f\n", node->gps_latitude, node->gps_longitude, node->gps_altitude);
 	printf("net       %s:%s\n", node->net_ifname, node->net_address);
 	printf("rssi      %d\n", node->net_rssi);
+	printf("interval  %d\n", node->interval);
     }
 }
 
@@ -247,11 +252,14 @@
     sys_node_list	*tmpn;
     sys_fermenter_list  *tmpf;
     sys_co2meter_list	*tmpc;
+    sys_ispindel_list	*tmpi;
     time_t		now = time(NULL);
 
     for (tmpn = nodes; tmpn; tmpn = tmpn->next) {
-	if (tmpn->online && ((now - tmpn->lastseen) > 600)) {
-	    syslog(LOG_NOTICE, "Timeout node `%s/%s'", tmpn->group_id, tmpn->node);
+//	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));
 	    tmpn->online = false;
 	    node_mysql_death(tmpn->node);
 
@@ -274,6 +282,16 @@
 		    }
 		}
 	    }
+
+	    for (tmpi = ispindels; tmpi; tmpi = tmpi->next) {
+		if (strcmp(tmpi->node, tmpn->node) == 0) {
+		    if (tmpi->online) {
+                        syslog(LOG_NOTICE, "Timeout ispindel %s", tmpi->node);
+                        tmpi->online = false;
+                        ispindel_mysql_death(tmpi->node);
+                    }
+		}
+	    }
 	}
     }
 }

mercurial