Sun, 15 Dec 2019 15:08:09 +0100
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>';