Version 0.3.27 More code for iSpindels. All online/offline data in the database is now handles as integers. Nodes timeout use the configured interval time from the nodes.

Sun, 15 Dec 2019 15:08:09 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Sun, 15 Dec 2019 15:08:09 +0100
changeset 572
7a03181d29a3
parent 571
468377312726
child 573
c4c891d5c4f8

Version 0.3.27 More code for iSpindels. All online/offline data in the database is now handles as integers. Nodes timeout use the configured interval time from the nodes.

bmsd/bms.c file | annotate | diff | comparison | revisions
bmsd/bms.h file | annotate | diff | comparison | revisions
bmsd/ispindels.c file | annotate | diff | comparison | revisions
bmsd/mqtt.c file | annotate | diff | comparison | revisions
bmsd/mysql.c file | annotate | diff | comparison | revisions
bmsd/nodes.c file | annotate | diff | comparison | revisions
config.status file | annotate | diff | comparison | revisions
configure file | annotate | diff | comparison | revisions
configure.ac file | annotate | diff | comparison | revisions
www/getfermenter.php file | annotate | diff | comparison | revisions
www/getnode.php file | annotate | diff | comparison | revisions
www/includes/global.inc.php file | annotate | diff | comparison | revisions
www/js/mon_node.js file | annotate | diff | comparison | revisions
--- a/bmsd/bms.c	Sat Dec 14 21:04:47 2019 +0100
+++ b/bmsd/bms.c	Sun Dec 15 15:08:09 2019 +0100
@@ -32,7 +32,7 @@
 
 int			my_shutdown = FALSE;
 int			debug = FALSE;
-static pid_t		pgrp, mypid;
+static pid_t		/*pgrp, */mypid;
 char			*Private_Path = NULL;	/* Users data path		*/
 
 extern sys_config       Config;
@@ -133,7 +133,7 @@
 
     while (my_shutdown == FALSE) {
 
-	usleep(100000);
+	usleep(1000000);
 	nodes_check_online();
     }
     if (debug)
@@ -217,9 +217,9 @@
 	 * if the child were to open a terminal, it would become
 	 * associated with that terminal as its control terminal.
 	 */
-	if ((pgrp = setpgid(0, 0)) == -1) {
-	    syslog(LOG_NOTICE, "setpgpid failed");
-	}
+//	if ((pgrp = setpgid(0, 0)) == -1) {
+//	    syslog(LOG_NOTICE, "setpgid failed: %s", strerror(errno));
+//	}
 
 	frk = fork();
 	switch (frk) {
--- a/bmsd/bms.h	Sat Dec 14 21:04:47 2019 +0100
+++ b/bmsd/bms.h	Sun Dec 15 15:08:09 2019 +0100
@@ -58,7 +58,7 @@
 
 
 #define MQTT_NODE_CONTROL	0x0001			///< Show node control
-
+#define LOWBATT			3.3			///< Low battery voltage
 
 
 /**
@@ -152,6 +152,7 @@
 {
     ALARM_FLAG_DOOR	= 0x0001,	///< Door open
     ALARM_FLAG_PSU	= 0x0002,	///< PSU problem
+    ALARM_FLAG_BATTERY	= 0x0004,	///< Low battery
     ALARM_FLAG_CHILLER	= 0x0100,	///< Chiller too warm
 } ALARM_FLAGS;
 
--- a/bmsd/ispindels.c	Sat Dec 14 21:04:47 2019 +0100
+++ b/bmsd/ispindels.c	Sun Dec 15 15:08:09 2019 +0100
@@ -113,6 +113,11 @@
 	syslog(LOG_NOTICE, "Unknown keyword `%s' from `%s'", key, node);
     }
 
+    if (ispindel->battery < LOWBATT)
+	ispindel->alarm |= ALARM_FLAG_BATTERY;
+    else
+	ispindel->alarm &= ~ALARM_FLAG_BATTERY;
+
     ispindel_dump(ispindel);
 
     if (new_ispindel || do_update) {
--- a/bmsd/mqtt.c	Sat Dec 14 21:04:47 2019 +0100
+++ b/bmsd/mqtt.c	Sun Dec 15 15:08:09 2019 +0100
@@ -103,6 +103,9 @@
 	topic = xstrcpy((char *)"mbv1.0/co2meters/#");	// Subscribe to co2meter messages.
 	mosquitto_subscribe(mosq, NULL, topic, 0);
 	free(topic);
+	topic = xstrcpy((char *)"ispindel/#");  // Subscribe to ispindel messages.
+        mosquitto_subscribe(mosq, NULL, topic, 0);
+        free(topic);
 	topic = NULL;
        	mqtt_status = STATUS_CONNACK_RECVD;
     } else {
--- a/bmsd/mysql.c	Sat Dec 14 21:04:47 2019 +0100
+++ b/bmsd/mysql.c	Sun Dec 15 15:08:09 2019 +0100
@@ -99,7 +99,7 @@
 		node->next          = NULL;
 		node->uuid          = xstrcpy(row[1]);
 		node->node          = xstrcpy(row[2]);
-		node->online        = false;	// Will be set using MQTT
+		node->online        = atoi(row[3]);
 		node->group_id      = xstrcpy(row[4]);
 		node->hardwaremake  = xstrcpy(row[5]);
 		node->hardwaremodel = xstrcpy(row[6]);
@@ -149,7 +149,7 @@
 		fermenter->uuid     = xstrcpy(row[1]);
 		fermenter->alias    = xstrcpy(row[2]);
 		fermenter->node     = xstrcpy(row[3]);
-		fermenter->online   = false;	// Will be set later
+		fermenter->online   = atoi(row[4]);
 		fermenter->beercode = xstrcpy(row[5]);
 		fermenter->beername = xstrcpy(row[6]);
 		fermenter->beeruuid = xstrcpy(row[44]);
@@ -245,7 +245,7 @@
                 co2meter->uuid                = xstrcpy(row[1]);
                 co2meter->alias               = xstrcpy(row[2]);
                 co2meter->node                = xstrcpy(row[3]);
-                co2meter->online              = 0;    // Will be set later
+                co2meter->online              = atoi(row[4]);
                 co2meter->beercode            = xstrcpy(row[5]);
                 co2meter->beername            = xstrcpy(row[6]);
                 co2meter->beeruuid            = xstrcpy(row[7]);
@@ -287,7 +287,7 @@
                 memset(ispindel, 0, sizeof(sys_ispindel_list));
                 ispindel->next                = NULL;
 		ispindel->node                = xstrcpy(row[1]);
-		ispindel->online              = 0;  // Will be set later
+		ispindel->online              = atoi(row[2]);
 		ispindel->alarm               = atoi(row[3]);
 		ispindel->beercode            = xstrcpy(row[4]);
                 ispindel->beername            = xstrcpy(row[5]);
@@ -323,6 +323,7 @@
 
 void bms_mysql_end(void)
 {
+    sys_ispindel_list	*tmpi, *oldtmpi;
     sys_co2meter_list	*tmpp, *oldtmpp;
     sys_fermenter_list	*tmpf, *oldtmpf;
     sys_node_list	*tmpn, *oldtmpn;
@@ -333,6 +334,19 @@
     if (debug)
 	fprintf(stdout, "MySQL: disconnected\n");
 
+    for (tmpi = ispindels; tmpi; tmpi = oldtmpi) {
+        oldtmpi = tmpi->next;
+	if (tmpi->node)
+            free(tmpi->node);
+        if (tmpi->beercode)
+            free(tmpi->beercode);
+        if (tmpi->beername)
+            free(tmpi->beername);
+        if (tmpi->beeruuid)
+            free(tmpi->beeruuid);
+        free(tmpi);
+    }
+
     for (tmpp = co2meters; tmpp; tmpp = oldtmpp) {
         oldtmpp = tmpp->next;
         if (tmpp->uuid)
@@ -490,11 +504,11 @@
 		mytime->tm_year + 1900, mytime->tm_mon + 1, mytime->tm_mday, mytime->tm_hour, mytime->tm_min, mytime->tm_sec);
 
     snprintf(query, 1023,
-	"INSERT INTO  mon_nodes SET uuid='%s', node='%s', online='%s', group_id='%s', " \
+	"INSERT INTO  mon_nodes SET uuid='%s', node='%s', online='%d', group_id='%s', " \
         "hardwaremake='%s', hardwaremodel='%s', os='%s', os_version='%s', firmware='%s', firstseen='%s', lastseen='%s', " \
 	"temperature='%.3f', humidity='%.3f', barometer='%.3f', gps_latitude='%.8f', gps_longitude='%.8f', gps_altitude='%.8f', " \
 	"net_address='%s', net_ifname='%s', net_rssi='%d'",
-	node->uuid, node->node, node->online ?"Y":"N", node->group_id, 
+	node->uuid, node->node, node->online ?1:0, node->group_id, 
 	node->hardwaremake, node->hardwaremodel, node->os, node->os_version, node->firmware, first, last,
 	node->temperature, node->humidity, node->barometer, node->gps_latitude, node->gps_longitude, node->gps_altitude,
 	node->net_address, node->net_ifname, node->net_rssi);
@@ -518,10 +532,10 @@
     	mytime->tm_year + 1900, mytime->tm_mon + 1, mytime->tm_mday, mytime->tm_hour, mytime->tm_min, mytime->tm_sec);
 
     snprintf(query, 1023,
-	"UPDATE mon_nodes SET online='%s', hardwaremake='%s', hardwaremodel='%s', os='%s', os_version='%s', firmware='%s', lastseen='%s', " \
+	"UPDATE mon_nodes SET online='%d', hardwaremake='%s', hardwaremodel='%s', os='%s', os_version='%s', firmware='%s', lastseen='%s', " \
 	"temperature='%.3f', humidity='%.3f', barometer='%.3f', gps_latitude='%.8f', gps_longitude='%.8f', gps_altitude='%.8f', " \
 	"net_address='%s', net_ifname='%s', net_rssi='%d' WHERE uuid='%s'",
-	node->online ?"Y":"N", node->hardwaremake, node->hardwaremodel, node->os, node->os_version, node->firmware, last,
+	node->online ? 1:0, node->hardwaremake, node->hardwaremodel, node->os, node->os_version, node->firmware, last,
 	node->temperature, node->humidity, node->barometer, node->gps_latitude, node->gps_longitude, node->gps_altitude, 
 	node->net_address, node->net_ifname, node->net_rssi, node->uuid);
 
@@ -535,7 +549,7 @@
 {
     char        *query = malloc(512);
 
-    snprintf(query, 511, "UPDATE mon_nodes SET online='N' WHERE node='%s'", node);
+    snprintf(query, 511, "UPDATE mon_nodes SET online='0' WHERE node='%s'", node);
     bms_mysql_query(query);
     free(query);
 }
@@ -547,7 +561,7 @@
     char        *query = malloc(2560);
 
     snprintf(query, 2559,
-	"INSERT INTO mon_fermenters SET uuid='%s', alias='%s', node='%s', online='%s', " \
+	"INSERT INTO mon_fermenters SET uuid='%s', alias='%s', node='%s', online='%d', " \
 	"beercode='%s', beername='%s', beeruuid='%s', " \
 	"air_address='%s', air_state='%s', air_temperature='%.3f', " \
 	"beer_address='%s', beer_state='%s', beer_temperature='%.3f', " \
@@ -562,7 +576,7 @@
 	"profile_uuid='%s', profile_name='%s', profile_state='%s', profile_percent='%d', " \
 	"profile_inittemp_high='%.3f', profile_inittemp_low='%.3f', profile_steps='%s', stage='%s', " \
 	"yeast_lo='%.1f', yeast_hi='%.1f', webcam_url='%s', webcam_light='%d'",
-	fermenter->uuid, fermenter->alias, fermenter->node, fermenter->online ? "Y":"N",
+	fermenter->uuid, fermenter->alias, fermenter->node, fermenter->online ? 1:0,
 	fermenter->beercode ? fermenter->beercode : "", fermenter->beername ? fermenter->beername : "",
 	fermenter->beeruuid ? fermenter->beeruuid : "",
 	fermenter->air_address ? fermenter->air_address : "", fermenter->air_state ? fermenter->air_state : "", fermenter->air_temperature,
@@ -593,7 +607,7 @@
     char        *query = malloc(2560);
 
     snprintf(query, 2559,
-	"UPDATE mon_fermenters SET online='%s', beercode='%s', beername='%s', beeruuid='%s', " \
+	"UPDATE mon_fermenters SET online='%d', beercode='%s', beername='%s', beeruuid='%s', " \
 	"air_address='%s', air_state='%s', air_temperature='%.3f', " \
 	"beer_address='%s', beer_state='%s', beer_temperature='%.3f', " \
 	"chiller_address='%s', chiller_state='%s', chiller_temperature='%.3f', " \
@@ -607,7 +621,7 @@
 	"profile_uuid='%s', profile_name='%s', profile_state='%s', profile_percent='%d', " \
 	"profile_inittemp_high='%.3f', profile_inittemp_low='%.3f', profile_steps='%s', stage='%s', " \
         "yeast_lo='%.1f', yeast_hi='%.1f', webcam_url='%s', webcam_light='%d' WHERE uuid='%s'",
-	fermenter->online ? "Y":"N", fermenter->beercode ? fermenter->beercode : "", fermenter->beername ? fermenter->beername : "",
+	fermenter->online ? 1:0, fermenter->beercode ? fermenter->beercode : "", fermenter->beername ? fermenter->beername : "",
 	fermenter->beeruuid ? fermenter->beeruuid : "",
 	fermenter->air_address ? fermenter->air_address : "", fermenter->air_state ? fermenter->air_state : "", fermenter->air_temperature,
 	fermenter->beer_address ? fermenter->beer_address : "", fermenter->beer_state ? fermenter->beer_state : "", fermenter->beer_temperature,
@@ -636,9 +650,9 @@
     char        *query = malloc(512);
 
     if (alias)
-    	snprintf(query, 511, "UPDATE mon_fermenters SET online='N' WHERE node='%s' and alias='%s'", node, alias);
+    	snprintf(query, 511, "UPDATE mon_fermenters SET online='0' WHERE node='%s' and alias='%s'", node, alias);
     else
-	snprintf(query, 511, "UPDATE mon_fermenters SET online='N' WHERE node='%s'", node);
+	snprintf(query, 511, "UPDATE mon_fermenters SET online='0' WHERE node='%s'", node);
 
     bms_mysql_query(query);
     free(query);
@@ -707,7 +721,7 @@
 
     snprintf(query, 2559,
         "INSERT INTO mon_ispindels SET node='%s', online='%d', alarm='%d', " \
-        "tilt='%.3f', temperature='%.3f', battery='%.3f', gravity='%.3f', interval='%d', rssi='%d'",
+        "tilt='%.6f', temperature='%.4f', battery='%.4f', gravity='%.6f', interval='%d', rssi='%d'",
         ispindel->node, ispindel->online ? 1:0, ispindel->alarm,
         ispindel->tilt, ispindel->temperature, ispindel->battery, ispindel->gravity, ispindel->interval, ispindel->rssi);
 
--- a/bmsd/nodes.c	Sat Dec 14 21:04:47 2019 +0100
+++ b/bmsd/nodes.c	Sun Dec 15 15:08:09 2019 +0100
@@ -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)
@@ -247,11 +247,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 +277,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);
+                    }
+		}
+	    }
 	}
     }
 }
--- a/config.status	Sat Dec 14 21:04:47 2019 +0100
+++ b/config.status	Sun Dec 15 15:08:09 2019 +0100
@@ -621,7 +621,7 @@
 S["CC"]="gcc"
 S["CYEARS"]="2016-2019"
 S["COPYRIGHT"]="Copyright (C) 2016-2019 Michiel Broek, All Rights Reserved"
-S["VERSION"]="0.3.26"
+S["VERSION"]="0.3.27"
 S["PACKAGE"]="bms"
 S["SUBDIRS"]="bmsd doc script tools www"
 S["target_alias"]=""
@@ -710,7 +710,7 @@
 D["PACKAGE_STRING"]=" \"\""
 D["PACKAGE_BUGREPORT"]=" \"\""
 D["PACKAGE_URL"]=" \"\""
-D["VERSION"]=" \"0.3.26\""
+D["VERSION"]=" \"0.3.27\""
 D["COPYRIGHT"]=" \"Copyright (C) 2016-2019 Michiel Broek, All Rights Reserved\""
 D["STDC_HEADERS"]=" 1"
 D["HAVE_SYS_TYPES_H"]=" 1"
--- a/configure	Sat Dec 14 21:04:47 2019 +0100
+++ b/configure	Sun Dec 15 15:08:09 2019 +0100
@@ -2043,7 +2043,7 @@
 
 
 PACKAGE="bms"
-VERSION="0.3.26"
+VERSION="0.3.27"
 COPYRIGHT="Copyright (C) 2016-2019 Michiel Broek, All Rights Reserved"
 CYEARS="2016-2019"
 
--- a/configure.ac	Sat Dec 14 21:04:47 2019 +0100
+++ b/configure.ac	Sun Dec 15 15:08:09 2019 +0100
@@ -8,7 +8,7 @@
 dnl General settings
 dnl After changeing the version number, run autoconf!
 PACKAGE="bms"
-VERSION="0.3.26"
+VERSION="0.3.27"
 COPYRIGHT="Copyright (C) 2016-2019 Michiel Broek, All Rights Reserved"
 CYEARS="2016-2019"
 AC_SUBST(PACKAGE)
--- a/www/getfermenter.php	Sat Dec 14 21:04:47 2019 +0100
+++ b/www/getfermenter.php	Sun Dec 15 15:08:09 2019 +0100
@@ -12,10 +12,5 @@
 $query = "SELECT * FROM mon_fermenters WHERE uuid=".$uuid."";
 $result = $mysqli->query($query);
 $resultArray = $result->fetch_array(MYSQLI_ASSOC);
-if ($resultArray['online'] == 'Y') {
-  $resultArray['online'] = 1;
-} else {
-  $resultArray['online'] = 0;
-}
 header("Content-type: application/json");
 echo json_encode($resultArray);
--- a/www/getnode.php	Sat Dec 14 21:04:47 2019 +0100
+++ b/www/getnode.php	Sun Dec 15 15:08:09 2019 +0100
@@ -13,10 +13,5 @@
 $result = $mysqli->query($query);
 //Copy result into a associative array
 $resultArray = $result->fetch_array(MYSQLI_ASSOC);
-if ($resultArray['online'] == 'Y') {
-    $resultArray['online'] = 1;
-} else {
-    $resultArray['online'] = 0;
-}
 header("Content-type: application/json");
 echo json_encode($resultArray);
--- a/www/includes/global.inc.php	Sat Dec 14 21:04:47 2019 +0100
+++ b/www/includes/global.inc.php	Sun Dec 15 15:08:09 2019 +0100
@@ -205,7 +205,7 @@
 $connect = mysqli_connect(DBASE_HOST,DBASE_USER,DBASE_PASS,DBASE_NAME);
 $result = mysqli_query($connect, "SELECT uuid,node,online,net_address FROM mon_nodes ORDER BY node");
 while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
-    if ($row['online'] == "Y")
+    if ($row['online'] == 1)
 	$img = "network-idle.png";
     else
 	$img = "network-error.png";
@@ -220,7 +220,7 @@
 <?php
 $result = mysqli_query($connect, "SELECT uuid,node,alias,online,mode FROM mon_fermenters ORDER BY node,alias");
 while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
-    if ($row['online'] == "Y")
+    if ($row['online'] == 1)
         $img = "network-idle.png";
     else
         $img = "network-error.png";
--- a/www/js/mon_node.js	Sat Dec 14 21:04:47 2019 +0100
+++ b/www/js/mon_node.js	Sun Dec 15 15:08:09 2019 +0100
@@ -30,7 +30,7 @@
    { name: 'record', type: 'int' },
    { name: 'uuid', type: 'string' },
    { name: 'node', type: 'string' },
-   { name: 'online', type: 'bool' },
+   { name: 'online', type: 'int' },
    { name: 'group_id', type: 'string' },
    { name: 'hardwaremake', type: 'string' },
    { name: 'hardwaremodel', type: 'string' },
@@ -54,13 +54,14 @@
  },
  dataAdapter = new $.jqx.dataAdapter(source, {
   loadComplete: function(records) {
+   var oline = (record.online) ? 'On-line' : 'Off-line';
    var record = dataAdapter.records[0],
    html = '<div id="node_table">';
    html += '<table style="width: 100%; padding: 10px;">';
    html += '<tr><th colspan=2>Systeem overzicht</th></tr>';
    html += '<tr><td>Uuid</td><td>' + record.uuid + '</td></tr>';
    html += '<tr><td>Systeem</td><td>' + record.node + '</td></tr>';
-   html += '<tr><td>Online</td><td>' + record.online + '</td></tr>';
+   html += '<tr><td>Online</td><td>' + oline + '</td></tr>';
    html += '<tr><td>Type</td><td>' + record.group_id + '</td></tr>';
    html += '<tr><td>Eerst gezien</td><td>' + record.firstseen + '</td></tr>';
    html += '<tr><td>Laatst gezien</td><td>' + record.lastseen + '</td></tr>';

mercurial