# HG changeset patch # User Michiel Broek # Date 1531581685 -7200 # Node ID 49580ca85ab733400dbca91304c34f3c84300d3d # Parent 34bf9f38974900593eb3a3691eb061260826d5e0 Versie 0.6.3. MQTT device berichten alleen als een fermenter ingeschakeld is. MQTT fermenter birth en death berichhten als een fementer in of uitgeschakeld wordt. MQTT node death bericht bij normaal afsluiten van de daemon. Alle MQTT persistent berichten worden nu goed opgeruikmd. diff -r 34bf9f389749 -r 49580ca85ab7 configure --- a/configure Fri Aug 18 17:45:14 2017 +0200 +++ b/configure Sat Jul 14 17:21:25 2018 +0200 @@ -2035,9 +2035,9 @@ PACKAGE="mbsePi-apps" -VERSION="0.6.2" -COPYRIGHT="Copyright (C) 2014-2017 Michiel Broek, All Rights Reserved" -CYEARS="2014-2017" +VERSION="0.6.3" +COPYRIGHT="Copyright (C) 2014-2018 Michiel Broek, All Rights Reserved" +CYEARS="2014-2018" diff -r 34bf9f389749 -r 49580ca85ab7 configure.ac --- a/configure.ac Fri Aug 18 17:45:14 2017 +0200 +++ b/configure.ac Sat Jul 14 17:21:25 2018 +0200 @@ -8,9 +8,9 @@ dnl General settings dnl After changeing the version number, run autoconf! PACKAGE="mbsePi-apps" -VERSION="0.6.2" -COPYRIGHT="Copyright (C) 2014-2017 Michiel Broek, All Rights Reserved" -CYEARS="2014-2017" +VERSION="0.6.3" +COPYRIGHT="Copyright (C) 2014-2018 Michiel Broek, All Rights Reserved" +CYEARS="2014-2018" AC_SUBST(PACKAGE) AC_SUBST(VERSION) AC_SUBST(COPYRIGHT) diff -r 34bf9f389749 -r 49580ca85ab7 thermferm/mqtt.c --- a/thermferm/mqtt.c Fri Aug 18 17:45:14 2017 +0200 +++ b/thermferm/mqtt.c Sat Jul 14 17:21:25 2018 +0200 @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (C) 2016-2017 + * Copyright (C) 2016-2018 * * Michiel Broek * @@ -419,7 +419,11 @@ -void publishDBirth(void) +/** + * @brief Publish DBIRTH for all active units. If there are no active units, don't + * publish anything. This function should be called at program start. + */ +void publishDBirthAll(void) { char *payload = NULL; units_list *unit; @@ -428,13 +432,17 @@ payload = payload_header(); payload = xstrcat(payload, (char *)"{\"units\":["); for (unit = Config.units; unit; unit = unit->next) { - if (comma) - payload = xstrcat(payload, (char *)","); - payload = xstrcat(payload, unit_data(unit, true)); - comma = TRUE; + if (unit->mode != UNITMODE_OFF) { + if (comma) + payload = xstrcat(payload, (char *)","); + payload = xstrcat(payload, unit_data(unit, true)); + comma = TRUE; + } } - payload = xstrcat(payload, (char *)"]}}"); - publisher(mosq, topic_base((char *)"DBIRTH"), payload, true); + if (comma) { // Only publish if there is at least one unit active. + payload = xstrcat(payload, (char *)"]}}"); + publisher(mosq, topic_base((char *)"DBIRTH"), payload, true); + } free(payload); payload = NULL; } @@ -465,6 +473,53 @@ +void publishDBirth(units_list *unit) +{ +#ifdef HAVE_MOSQUITTO_H + + char *payload = NULL, *topic = NULL; + + if (mqtt_use) { + payload = payload_header(); + payload = xstrcat(payload, unit_data(unit, true)); + payload = xstrcat(payload, (char *)"}"); + topic = xstrcat(topic_base((char *)"DBIRTH"), (char *)"/"); + topic = xstrcat(topic, unit->alias); + publisher(mosq, topic, payload, true); + free(payload); + payload = NULL; + free(topic); + topic = NULL; + } +#endif +} + + + +void publishDDeath(units_list *unit) +{ +#ifdef HAVE_MOSQUITTO_H + + char *topic = NULL; + + if (mqtt_use) { + // First delete presistent DBIRTH topic + topic = xstrcat(topic_base((char *)"DBIRTH"), (char *)"/"); + topic = xstrcat(topic, unit->alias); + publisher(mosq, topic, NULL, true); + free(topic); + topic = NULL; + topic = xstrcat(topic_base((char *)"DDEATH"), (char *)"/"); + topic = xstrcat(topic, unit->alias); + publisher(mosq, topic, NULL, true); + free(topic); + topic = NULL; + } +#endif +} + + + void publishNData(bool birth, int flag) { #ifdef HAVE_MOSQUITTO_H @@ -550,15 +605,6 @@ -void publishBirth(void) -{ - publishNData(true, 0); - publishDBirth(); -} - - - - void mqtt_connect(void) { #ifdef HAVE_MOSQUITTO_H @@ -630,7 +676,8 @@ * Initialise is complete, report our presence state */ mosquitto_loop_start(mosq); - publishBirth(); + publishNData(true, 0); + publishDBirthAll(); } #endif } @@ -648,8 +695,8 @@ * After that, remove the retained topic. */ syslog(LOG_NOTICE, "MQTT disconnecting"); - publisher(mosq, topic_base((char *)"DBIRTH"), NULL, true); publisher(mosq, topic_base((char *)"NBIRTH"), NULL, true); + publisher(mosq, topic_base((char *)"NDEATH"), NULL, true); mqtt_last_mid = mqtt_mid_sent; mqtt_status = STATUS_WAITING; mqtt_my_shutdown = TRUE; diff -r 34bf9f389749 -r 49580ca85ab7 thermferm/mqtt.h --- a/thermferm/mqtt.h Fri Aug 18 17:45:14 2017 +0200 +++ b/thermferm/mqtt.h Sat Jul 14 17:21:25 2018 +0200 @@ -16,7 +16,30 @@ void pub_domoticz_output(int, int); void mqtt_connect(void); void mqtt_disconnect(void); -void publishDData(units_list *); -void publishNData(bool, int); + +/** + * @brief Publish unit data. + * @param unit Unit data structure. + */ +void publishDData(units_list *unit); + +/** + * @brief Publish unit birth. + * @param unit Unit data structure. + */ +void publishDBirth(units_list *unit); + +/** + * @brief Publish death of a unit. + * @param unit Unit data structure. + */ +void publishDDeath(units_list *unit); + +/** + * @brief Publish Node data or birth message. + * @param birth If true send a birh message, else a regular data update. + * @param flag Bit flag to enable control messages. + */ +void publishNData(bool birth, int flag); #endif diff -r 34bf9f389749 -r 49580ca85ab7 thermferm/server.c --- a/thermferm/server.c Fri Aug 18 17:45:14 2017 +0200 +++ b/thermferm/server.c Sat Jul 14 17:21:25 2018 +0200 @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (C) 2008-2017 + * Copyright (C) 2008-2018 * * Michiel Broek * @@ -2099,6 +2099,7 @@ srv_send((char *)"NAME,%s", unit->name); srv_send((char *)"UUID,%s", unit->uuid); srv_send((char *)"ALIAS,%s", unit->alias); + srv_send((char *)"MODE,%s", UNITMODE[unit->mode]); srv_send((char *)"VOLUME,%2f", unit->volume); srv_send((char *)"AIR_ADDRESS,%s", unit->air_address); srv_send((char *)"AIR_STATE,%s", TEMPSTATE[unit->air_state]); @@ -2154,7 +2155,6 @@ srv_send((char *)"PSU_ADDRESS,%s", unit->psu_address); srv_send((char *)"PSU_STATE,%d", unit->psu_state); srv_send((char *)"PSU_IDX,%d", unit->psu_idx); - srv_send((char *)"MODE,%s", UNITMODE[unit->mode]); srv_send((char *)"FRIDGE_SET,%.1f", unit->fridge_set); srv_send((char *)"BEER_SET,%.1f", unit->beer_set); srv_send((char *)"PROFILE,%s", unit->profile); @@ -2484,12 +2484,16 @@ } else if (val && (strcmp(kwd, (char *)"MODE") == 0)) { for (i = 0; i < 5; i++) { if (strcmp(val, UNITMODE[i]) == 0) { + unit->mqtt_flag |= MQTT_FLAG_DATA; /* Initialize log if the unit is turned on */ - if ((unit->mode == UNITMODE_OFF) && (i != UNITMODE_OFF)) + if ((unit->mode == UNITMODE_OFF) && (i != UNITMODE_OFF)) { initlog(unit->name); + unit->mqtt_flag |= MQTT_FLAG_BIRTH; + } else if ((unit->mode != UNITMODE_OFF) && (i == UNITMODE_OFF)) { + unit->mqtt_flag |= MQTT_FLAG_DEATH; + } syslog(LOG_NOTICE, "Fermenter unit %s mode %s to %s", unit->uuid, UNITMODE[unit->mode], UNITMODE[i]); unit->mode = i; - unit->mqtt_flag |= MQTT_FLAG_DATA; /* Allways turn everything off after a mode change */ unit->PID_cool->OutP = unit->PID_heat->OutP = 0.0; unit->PID_cool->Mode = unit->PID_heat->Mode = PID_MODE_NONE; @@ -2681,8 +2685,18 @@ } } - if (unit->mqtt_flag) - publishDData(unit); + if (unit->mqtt_flag) { + if (debug) + fprintf(stdout, "flag value %d\n", unit->mqtt_flag); + if (unit->mqtt_flag & MQTT_FLAG_BIRTH) { + publishDBirth(unit); + } else { + publishDData(unit); + } + if (unit->mqtt_flag & MQTT_FLAG_DEATH) { + publishDDeath(unit); + } + } } } } diff -r 34bf9f389749 -r 49580ca85ab7 thermferm/thermferm.c --- a/thermferm/thermferm.c Fri Aug 18 17:45:14 2017 +0200 +++ b/thermferm/thermferm.c Sat Jul 14 17:21:25 2018 +0200 @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (C) 2014-2017 + * Copyright (C) 2014-2018 * * Michiel Broek * @@ -391,11 +391,15 @@ */ void change_mode(int mode) { - if ((current_unit->mode == UNITMODE_OFF) && (mode != UNITMODE_OFF)) + current_unit->mqtt_flag |= MQTT_FLAG_DATA; + if ((current_unit->mode == UNITMODE_OFF) && (mode != UNITMODE_OFF)) { initlog(current_unit->name); + current_unit->mqtt_flag |= MQTT_FLAG_BIRTH; + } else if ((current_unit->mode != UNITMODE_OFF) && (mode == UNITMODE_OFF)) { + current_unit->mqtt_flag |= MQTT_FLAG_DEATH; + } syslog(LOG_NOTICE, "Mode from %s to %s via panel interface", UNITMODE[current_unit->mode], UNITMODE[mode]); current_unit->mode = mode; - current_unit->mqtt_flag |= MQTT_FLAG_DATA; /* Allways turn everything off after a mode change */ current_unit->PID_cool->OutP = current_unit->PID_heat->OutP = 0.0; current_unit->PID_cool->Mode = current_unit->PID_heat->Mode = PID_MODE_NONE; @@ -1217,7 +1221,8 @@ LCDunit = 0; for (unit = Config.units; unit; unit = unit->next) { LCDunit++; - unit->mqtt_flag = unit->alarm_flag = 0; + unit->mqtt_flag &= ~MQTT_FLAG_DATA; + unit->alarm_flag = 0; if (unit->air_address) { rc = device_in(unit->air_address, &temp); @@ -1850,7 +1855,17 @@ * Publish MQTT messages set in flag */ if (unit->mqtt_flag) { - publishDData(unit); + if (unit->mqtt_flag & MQTT_FLAG_BIRTH) { + publishDBirth(unit); + unit->mqtt_flag &= ~MQTT_FLAG_BIRTH; + } else { + publishDData(unit); + unit->mqtt_flag &= ~MQTT_FLAG_DATA; + } + if (unit->mqtt_flag & MQTT_FLAG_DEATH) { + publishDDeath(unit); + unit->mqtt_flag &= ~MQTT_FLAG_DEATH; + } } /* @@ -1984,8 +1999,14 @@ device_out(unit->fan_address, unit->fan_state); pub_domoticz_output(unit->fan_idx, unit->fan_state); device_out(unit->light_address, unit->light_state); - unit->mqtt_flag = MQTT_FLAG_DATA; - publishDData(unit); + if (unit->mode != UNITMODE_OFF) { + /* + * If unit ia active, publish we are dying. + */ + unit->mqtt_flag = MQTT_FLAG_DATA; + publishDData(unit); + publishDDeath(unit); + } syslog(LOG_NOTICE, "Unit `%s' stopped in mode %s", unit->name, UNITMODE[unit->mode]); } diff -r 34bf9f389749 -r 49580ca85ab7 thermferm/thermferm.h --- a/thermferm/thermferm.h Fri Aug 18 17:45:14 2017 +0200 +++ b/thermferm/thermferm.h Sat Jul 14 17:21:25 2018 +0200 @@ -206,6 +206,8 @@ #define UNITMODE_PROFILE 4 /* Unit runs in profile mode */ #define MQTT_FLAG_DATA 0x0001 /* Show updated data values */ +#define MQTT_FLAG_BIRTH 0x0002 /* Show birth instead of data */ +#define MQTT_FLAG_DEATH 0x0004 /* Show death of a unit */ #define MQTT_NODE_CONTROL 0x0001 /* Show node control */