diff -r 862de87f9f89 -r cdcd07bbee30 thermferm/server.c --- a/thermferm/server.c Sat Apr 29 17:07:36 2017 +0200 +++ b/thermferm/server.c Mon May 08 16:26:02 2017 +0200 @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (C) 2008-2015 + * Copyright (C) 2008-2017 * * Michiel Broek * @@ -2166,6 +2166,7 @@ for (unit = Config.units ; unit; unit = unit->next) { if (strcmp(unit->uuid, param) == 0) { while (1) { + unit->mqtt_flag = 0; rlen = srv_recv(ibuf); if (rlen == -1) { run_pause = FALSE; @@ -2180,6 +2181,7 @@ kwd = strtok(ibuf, ",\0"); val = strtok(NULL, "\0"); if (kwd) { + unit->mqtt_flag = 0; /* * Accept writable data. The client can sent just one line, * but may also sent everything. Simply ignore things we @@ -2189,11 +2191,11 @@ if (unit->name) { if (strcmp(unit->name, val)) { syslog(LOG_NOTICE, "Fermenter unit %s name `%s' to `%s'", unit->uuid, unit->name, val); - mqtt_publish_str(unit->alias, (char *)"name", val); } free(unit->name); } unit->name = xstrcpy(val); + unit->mqtt_flag |= (MQTT_FLAG_MODE); } else if (val && (strcmp(kwd, (char *)"VOLUME") == 0)) { if (sscanf(val, "%f", &fval) == 1) { @@ -2214,6 +2216,7 @@ device_count(TRUE, unit->air_address); } else unit->air_address = NULL; + unit->mqtt_flag |= MQTT_FLAG_AIR; } else if (strcmp(kwd, (char *)"BEER_ADDRESS") == 0) { if (val && unit->beer_address && (strcmp(val, unit->beer_address))) @@ -2227,6 +2230,7 @@ device_count(TRUE, unit->beer_address); } else unit->beer_address = NULL; + unit->mqtt_flag |= MQTT_FLAG_BEER; } else if (strcmp(kwd, (char *)"HEATER_ADDRESS") == 0) { if (val && unit->heater_address && (strcmp(val, unit->heater_address))) @@ -2240,12 +2244,14 @@ device_count(TRUE, unit->heater_address); } else unit->heater_address = NULL; + unit->mqtt_flag |= MQTT_FLAG_HEATER; } else if (val && (strcmp(kwd, (char *)"HEATER_STATE") == 0)) { if ((sscanf(val, "%d", &ival) == 1) && ((ival == 0) || (ival == 100))) { if (unit->heater_state != ival) syslog(LOG_NOTICE, "Fermenter unit %s heater state %d to %d", unit->uuid, unit->heater_state, ival); unit->heater_state = ival; + unit->mqtt_flag |= MQTT_FLAG_HEATER; } } else if (val && (strcmp(kwd, (char *)"HEATER_DELAY") == 0)) { @@ -2267,12 +2273,14 @@ device_count(TRUE, unit->cooler_address); } else unit->cooler_address = NULL; + unit->mqtt_flag |= MQTT_FLAG_COOLER; } else if (val && (strcmp(kwd, (char *)"COOLER_STATE") == 0)) { if ((sscanf(val, "%d", &ival) == 1) && ((ival == 0) || (ival == 100))) { if (unit->cooler_state != ival) syslog(LOG_NOTICE, "Fermenter unit %s cooler state %d to %d", unit->uuid, unit->cooler_state, ival); unit->cooler_state = ival; + unit->mqtt_flag |= MQTT_FLAG_COOLER; } } else if (val && (strcmp(kwd, (char *)"COOLER_DELAY") == 0)) { @@ -2294,12 +2302,14 @@ device_count(TRUE, unit->fan_address); } else unit->fan_address = NULL; + unit->mqtt_flag |= MQTT_FLAG_FAN; } else if (val && (strcmp(kwd, (char *)"FAN_STATE") == 0)) { if ((sscanf(val, "%d", &ival) == 1) && ((ival == 0) || (ival == 100))) { if (unit->fan_state != ival) syslog(LOG_NOTICE, "Fermenter unit %s fan state %d to %d", unit->uuid, unit->fan_state, ival); unit->fan_state = ival; + unit->mqtt_flag |= MQTT_FLAG_FAN; } } else if (val && (strcmp(kwd, (char *)"FAN_DELAY") == 0)) { @@ -2321,12 +2331,14 @@ device_count(TRUE, unit->light_address); } else unit->light_address = NULL; + unit->mqtt_flag |= MQTT_FLAG_LIGHT; } else if (val && (strcmp(kwd, (char *)"LIGHT_STATE") == 0)) { if ((sscanf(val, "%d", &ival) == 1) && ((ival == 0) || (ival == 100))) { if (unit->light_state != ival) syslog(LOG_NOTICE, "Fermenter unit %s light state %d to %d", unit->uuid, unit->light_state, ival); unit->light_state = ival; + unit->mqtt_flag |= MQTT_FLAG_LIGHT; } } else if (val && (strcmp(kwd, (char *)"LIGHT_DELAY") == 0)) { @@ -2361,6 +2373,7 @@ device_count(TRUE, unit->psu_address); } else unit->psu_address = NULL; + unit->mqtt_flag |= MQTT_FLAG_PSU; } else if (val && (strcmp(kwd, (char *)"MODE") == 0)) { for (i = 0; i < 5; i++) { @@ -2392,18 +2405,6 @@ unit->mqtt_flag |= MQTT_FLAG_SP; } } - if (unit->heater_address) - mqtt_publish_int(unit->alias, (char *)"heater", 0); - else - mqtt_publish_clear(unit->alias, (char *)"heater"); - if (unit->cooler_address) - mqtt_publish_int(unit->alias, (char *)"cooler", 0); - else - mqtt_publish_clear(unit->alias, (char *)"cooler"); - if (unit->fan_address) - mqtt_publish_int(unit->alias, (char *)"fan", 0); - else - mqtt_publish_clear(unit->alias, (char *)"fan"); break; } } @@ -2519,19 +2520,7 @@ device_out(unit->cooler_address, unit->cooler_state); device_out(unit->fan_address, unit->fan_state); device_out(unit->light_address, unit->light_state); - if (unit->heater_address) - mqtt_publish_int(unit->alias, (char *)"heater", 0); - else - mqtt_publish_clear(unit->alias, (char *)"heater"); - if (unit->cooler_address) - mqtt_publish_int(unit->alias, (char *)"cooler", 0); - else - mqtt_publish_clear(unit->alias, (char *)"cooler"); - if (unit->fan_address) - mqtt_publish_int(unit->alias, (char *)"fan", 0); - else - mqtt_publish_clear(unit->alias, (char *)"fan"); - unit->mqtt_flag |= (MQTT_FLAG_PROFILE | MQTT_FLAG_SP); + unit->mqtt_flag |= (MQTT_FLAG_PROFILE | MQTT_FLAG_SP | MQTT_FLAG_HEATER | MQTT_FLAG_COOLER | MQTT_FLAG_FAN); } } else if (val && (strcmp(kwd, (char *)"PROF_STATE") == 0)) { @@ -2541,17 +2530,14 @@ case PROFILE_OFF: if (unit->prof_state == PROFILE_DONE) { unit->prof_state = PROFILE_OFF; syslog(LOG_NOTICE, "Fermenter unit %s profile to OFF", unit->uuid); - mqtt_publish_str(unit->alias, (char *)"profile/state", (char *)PROFSTATE[i]); } break; case PROFILE_PAUSE: if (unit->prof_state == PROFILE_RUN) { unit->prof_state = PROFILE_PAUSE; syslog(LOG_NOTICE, "Fermenter unit %s profile PAUSE", unit->uuid); - mqtt_publish_str(unit->alias, (char *)"profile/state", (char *)PROFSTATE[i]); } else if (unit->prof_state == PROFILE_PAUSE) { unit->prof_state = PROFILE_RUN; syslog(LOG_NOTICE, "Fermenter unit %s profile RESUME", unit->uuid); - mqtt_publish_str(unit->alias, (char *)"profile/state", (char *)PROFSTATE[PROFILE_RUN]); } break; case PROFILE_RUN: if (unit->prof_state == PROFILE_OFF) { @@ -2560,7 +2546,6 @@ unit->prof_paused = unit->prof_primary_done = 0; unit->prof_peak_abs = unit->prof_peak_rel = 0.0; syslog(LOG_NOTICE, "Fermenter unit %s profile to RUN", unit->uuid); - mqtt_publish_str(unit->alias, (char *)"profile/state", (char *)PROFSTATE[i]); } break; case PROFILE_DONE: break; /* Command is illegal */ @@ -2568,7 +2553,6 @@ unit->prof_state = PROFILE_OFF; unit->prof_started = 0; syslog(LOG_NOTICE, "Fermenter unit %s profile ABORT", unit->uuid); - mqtt_publish_str(unit->alias, (char *)"profile/state", (char *)PROFSTATE[i]); } break; } @@ -2592,6 +2576,8 @@ } } + if (unit->mqtt_flag) + publishDData(unit); } } }