diff -r b5ae9017194f -r 2da3d3340403 thermferm/mqtt.c --- a/thermferm/mqtt.c Mon May 08 20:54:51 2017 +0200 +++ b/thermferm/mqtt.c Fri May 19 16:34:21 2017 +0200 @@ -187,219 +187,168 @@ prof_step *pstep; payload = xstrcat(payload, (char *)"{"); - if (birth || unit->mqtt_flag & MQTT_FLAG_MODE) { - // Also send these on mode change + if (birth) { payload = xstrcat(payload, (char *)"\"uuid\":\""); payload = xstrcat(payload, unit->uuid); payload = xstrcat(payload, (char *)"\",\"alias\":\""); payload = xstrcat(payload, unit->alias); - payload = xstrcat(payload, (char *)"\",\"name\":\""); - payload = xstrcat(payload, unit->name); - payload = xstrcat(payload, (char *)"\""); - comma = true; + payload = xstrcat(payload, (char *)"\","); } - if (birth || unit->mqtt_flag & MQTT_FLAG_AIR) { - if (comma) - payload = xstrcat(payload, (char *)","); - if (unit->air_address) { - payload = xstrcat(payload, (char *)"\"air\":{\"address\":\""); - payload = xstrcat(payload, unit->air_address); - payload = xstrcat(payload, (char *)"\",\"state\":\""); - payload = xstrcat(payload, (char *)TEMPSTATE[unit->air_state]); - payload = xstrcat(payload, (char *)"\",\"temperature\":"); - sprintf(buf, "%.3f", unit->air_temperature / 1000.0); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)"}"); - } else { - payload = xstrcat(payload, (char *)"\"air\":null"); - } - comma = true; + + payload = xstrcat(payload, (char *)"\"name\":\""); + payload = xstrcat(payload, unit->name); + if (unit->air_address) { + payload = xstrcat(payload, (char *)"\",\"air\":{\"address\":\""); + payload = xstrcat(payload, unit->air_address); + payload = xstrcat(payload, (char *)"\",\"state\":\""); + payload = xstrcat(payload, (char *)TEMPSTATE[unit->air_state]); + payload = xstrcat(payload, (char *)"\",\"temperature\":"); + sprintf(buf, "%.3f", unit->air_temperature / 1000.0); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"}"); + } else { + payload = xstrcat(payload, (char *)"\",\"air\":null"); } - if (birth || unit->mqtt_flag & MQTT_FLAG_BEER) { - if (comma) - payload = xstrcat(payload, (char *)","); - if (unit->beer_address) { - payload = xstrcat(payload, (char *)"\"beer\":{\"address\":\""); - payload = xstrcat(payload, unit->beer_address); - payload = xstrcat(payload, (char *)"\",\"state\":\""); - payload = xstrcat(payload, (char *)TEMPSTATE[unit->beer_state]); - payload = xstrcat(payload, (char *)"\",\"temperature\":"); - sprintf(buf, "%.3f", unit->beer_temperature / 1000.0); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)"}"); - } else { - payload = xstrcat(payload, (char *)"\"beer\":null"); - } - comma = true; + + if (unit->beer_address) { + payload = xstrcat(payload, (char *)",\"beer\":{\"address\":\""); + payload = xstrcat(payload, unit->beer_address); + payload = xstrcat(payload, (char *)"\",\"state\":\""); + payload = xstrcat(payload, (char *)TEMPSTATE[unit->beer_state]); + payload = xstrcat(payload, (char *)"\",\"temperature\":"); + sprintf(buf, "%.3f", unit->beer_temperature / 1000.0); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"}"); + } else { + payload = xstrcat(payload, (char *)",\"beer\":null"); } - if (birth || unit->mqtt_flag & MQTT_FLAG_HEATER) { - if (comma) - payload = xstrcat(payload, (char *)","); - if (unit->heater_address) { - payload = xstrcat(payload, (char *)"\"heater\":{\"address\":\""); - payload = xstrcat(payload, unit->heater_address); - payload = xstrcat(payload, (char *)"\",\"state\":"); - sprintf(buf, "%d", unit->heater_state); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)"}"); - } else { - payload = xstrcat(payload, (char *)"\"heater\":null"); - } - comma = true; + + if (unit->heater_address) { + payload = xstrcat(payload, (char *)",\"heater\":{\"address\":\""); + payload = xstrcat(payload, unit->heater_address); + payload = xstrcat(payload, (char *)"\",\"state\":"); + sprintf(buf, "%d", unit->heater_state); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"}"); + } else { + payload = xstrcat(payload, (char *)",\"heater\":null"); } - if (birth || unit->mqtt_flag & MQTT_FLAG_COOLER) { - if (comma) - payload = xstrcat(payload, (char *)","); - if (unit->cooler_address) { - payload = xstrcat(payload, (char *)"\"cooler\":{\"address\":\""); - payload = xstrcat(payload, unit->cooler_address); - payload = xstrcat(payload, (char *)"\",\"state\":"); - sprintf(buf, "%d", unit->cooler_state); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)"}"); - } else { - payload = xstrcat(payload, (char *)"\"cooler\":null"); - } - comma = true; + + if (unit->cooler_address) { + payload = xstrcat(payload, (char *)",\"cooler\":{\"address\":\""); + payload = xstrcat(payload, unit->cooler_address); + payload = xstrcat(payload, (char *)"\",\"state\":"); + sprintf(buf, "%d", unit->cooler_state); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"}"); + } else { + payload = xstrcat(payload, (char *)",\"cooler\":null"); } - if (birth || unit->mqtt_flag & MQTT_FLAG_FAN) { - if (comma) - payload = xstrcat(payload, (char *)","); - if (unit->fan_address) { - payload = xstrcat(payload, (char *)"\"fan\":{\"address\":\""); - payload = xstrcat(payload, unit->fan_address); - payload = xstrcat(payload, (char *)"\",\"state\":"); - sprintf(buf, "%d", unit->fan_state); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)"}"); - } else { - payload = xstrcat(payload, (char *)"\"fan\":null"); - } - comma = true; + + if (unit->fan_address) { + payload = xstrcat(payload, (char *)",\"fan\":{\"address\":\""); + payload = xstrcat(payload, unit->fan_address); + payload = xstrcat(payload, (char *)"\",\"state\":"); + sprintf(buf, "%d", unit->fan_state); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"}"); + } else { + payload = xstrcat(payload, (char *)",\"fan\":null"); } - if (birth || unit->mqtt_flag & MQTT_FLAG_DOOR) { - if (comma) - payload = xstrcat(payload, (char *)","); - if (unit->door_address) { - payload = xstrcat(payload, (char *)"\"door\":{\"address\":\""); - payload = xstrcat(payload, unit->door_address); - payload = xstrcat(payload, (char *)"\",\"state\":"); - sprintf(buf, "%d", unit->door_state); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)"}"); - } else { - payload = xstrcat(payload, (char *)"\"door\":null"); - } - comma = true; + + if (unit->door_address) { + payload = xstrcat(payload, (char *)",\"door\":{\"address\":\""); + payload = xstrcat(payload, unit->door_address); + payload = xstrcat(payload, (char *)"\",\"state\":"); + sprintf(buf, "%d", unit->door_state); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"}"); + } else { + payload = xstrcat(payload, (char *)",\"door\":null"); } - if (birth || unit->mqtt_flag & MQTT_FLAG_LIGHT) { - if (comma) - payload = xstrcat(payload, (char *)","); - if (unit->light_address) { - payload = xstrcat(payload, (char *)"\"light\":{\"address\":\""); - payload = xstrcat(payload, unit->light_address); - payload = xstrcat(payload, (char *)"\",\"state\":"); - sprintf(buf, "%d", unit->light_state); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)"}"); - } else { - payload = xstrcat(payload, (char *)"\"light\":null"); - } - comma = true; + + if (unit->light_address) { + payload = xstrcat(payload, (char *)",\"light\":{\"address\":\""); + payload = xstrcat(payload, unit->light_address); + payload = xstrcat(payload, (char *)"\",\"state\":"); + sprintf(buf, "%d", unit->light_state); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"}"); + } else { + payload = xstrcat(payload, (char *)",\"light\":null"); } - if (birth || unit->mqtt_flag & MQTT_FLAG_PSU) { - if (comma) - payload = xstrcat(payload, (char *)","); - if (unit->psu_address) { - payload = xstrcat(payload, (char *)"\"psu\":{\"address\":\""); - payload = xstrcat(payload, unit->psu_address); - payload = xstrcat(payload, (char *)"\",\"state\":"); - sprintf(buf, "%d", unit->psu_state); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)"}"); - } else { - payload = xstrcat(payload, (char *)"\"psu\":null"); - } - comma = true; - } - if (birth || unit->mqtt_flag & MQTT_FLAG_MODE) { - if (comma) - payload = xstrcat(payload, (char *)","); - payload = xstrcat(payload, (char *)"\"mode\":\""); - payload = xstrcat(payload, (char *)UNITMODE[unit->mode]); - payload = xstrcat(payload, (char *)"\""); - comma = true; - } - if (birth || unit->mqtt_flag & MQTT_FLAG_SP) { - if (unit->mode != UNITMODE_OFF) { - if (comma) - payload = xstrcat(payload, (char *)","); - payload = xstrcat(payload, (char *)"\"setpoint\":{\"low\":"); - sprintf(buf, "%.1f", unit->PID_heat->SetP); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)",\"high\":"); - sprintf(buf, "%.1f", unit->PID_cool->SetP); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)"}"); - comma = true; - } + + if (unit->psu_address) { + payload = xstrcat(payload, (char *)",\"psu\":{\"address\":\""); + payload = xstrcat(payload, unit->psu_address); + payload = xstrcat(payload, (char *)"\",\"state\":"); + sprintf(buf, "%d", unit->psu_state); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"}"); + } else { + payload = xstrcat(payload, (char *)",\"psu\":null"); } - if (birth || unit->mqtt_flag & MQTT_FLAG_PROFILE || unit->mqtt_flag & MQTT_FLAG_PERCENT) { - if (unit->mode == UNITMODE_PROFILE && unit->profile) { - for (profile = Config.profiles; profile; profile = profile->next) { - if (strcmp(unit->profile, profile->uuid) == 0) { - if (comma) - payload = xstrcat(payload, (char *)","); - payload = xstrcat(payload, (char *)"\"profile\":{\"uuid\":\""); - payload = xstrcat(payload, unit->profile); - payload = xstrcat(payload, (char *)",\"name\":\""); - payload = xstrcat(payload, profile->name); - payload = xstrcat(payload, (char *)"\",\"inittemp\":{\"low\":"); - sprintf(buf, "%.1f", profile->inittemp_lo); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)",\"high\":"); - sprintf(buf, "%.1f", profile->inittemp_hi); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)"},\"fridgemode\":"); - sprintf(buf, "%d", profile->fridge_mode); - payload = xstrcat(payload, buf); - comma = false; - if (profile->steps) { - payload = xstrcat(payload, (char *)",\"steps\":["); - for (pstep = profile->steps; pstep; pstep = pstep->next) { - if (comma) - payload = xstrcat(payload, (char *)","); - payload = xstrcat(payload, (char *)"{\"resttime\":"); - sprintf(buf, "%d", pstep->resttime); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)",\"steptime\":"); - sprintf(buf, "%d", pstep->steptime); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)",\"target\":{\"low\":"); - sprintf(buf, "%.1f", pstep->target_lo); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)",\"high\":"); - sprintf(buf, "%.1f", pstep->target_hi); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)"},\"fridgemode\":"); - sprintf(buf, "%d", pstep->fridge_mode); - payload = xstrcat(payload, buf); - payload = xstrcat(payload, (char *)"}"); - comma = true; - } - payload = xstrcat(payload, (char *)"]"); - } else { - payload = xstrcat(payload, (char *)",\"steps\":null"); + + payload = xstrcat(payload, (char *)",\"mode\":\""); + payload = xstrcat(payload, (char *)UNITMODE[unit->mode]); + payload = xstrcat(payload, (char *)"\",\"setpoint\":{\"low\":"); + sprintf(buf, "%.1f", unit->PID_heat->SetP); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)",\"high\":"); + sprintf(buf, "%.1f", unit->PID_cool->SetP); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"}"); + + if (unit->mode == UNITMODE_PROFILE && unit->profile) { + for (profile = Config.profiles; profile; profile = profile->next) { + if (strcmp(unit->profile, profile->uuid) == 0) { + payload = xstrcat(payload, (char *)",\"profile\":{\"uuid\":\""); + payload = xstrcat(payload, unit->profile); + payload = xstrcat(payload, (char *)",\"name\":\""); + payload = xstrcat(payload, profile->name); + payload = xstrcat(payload, (char *)"\",\"inittemp\":{\"low\":"); + sprintf(buf, "%.1f", profile->inittemp_lo); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)",\"high\":"); + sprintf(buf, "%.1f", profile->inittemp_hi); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"},\"fridgemode\":"); + sprintf(buf, "%d", profile->fridge_mode); + payload = xstrcat(payload, buf); + comma = false; + if (profile->steps) { + payload = xstrcat(payload, (char *)",\"steps\":["); + for (pstep = profile->steps; pstep; pstep = pstep->next) { + if (comma) + payload = xstrcat(payload, (char *)","); + payload = xstrcat(payload, (char *)"{\"resttime\":"); + sprintf(buf, "%d", pstep->resttime); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)",\"steptime\":"); + sprintf(buf, "%d", pstep->steptime); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)",\"target\":{\"low\":"); + sprintf(buf, "%.1f", pstep->target_lo); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)",\"high\":"); + sprintf(buf, "%.1f", pstep->target_hi); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"},\"fridgemode\":"); + sprintf(buf, "%d", pstep->fridge_mode); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"}"); + comma = true; } - payload = xstrcat(payload, (char *)"}"); - break; - } + payload = xstrcat(payload, (char *)"]"); + } else { + payload = xstrcat(payload, (char *)",\"steps\":null"); + } + payload = xstrcat(payload, (char *)"}"); + break; } - } else { - if (comma) - payload = xstrcat(payload, (char *)","); - payload = xstrcat(payload, (char *)"\"profile\":null"); - } + } + } else { + payload = xstrcat(payload, (char *)",\"profile\":null"); } payload = xstrcat(payload, (char *)"}"); @@ -493,25 +442,23 @@ comma = true; } - if (birth || flag & MQTT_NODE_HT) { - if (Config.temp_address || Config.hum_address) { - if (comma) - payload = xstrcat(payload, (char *)","); - payload = xstrcat(payload, (char *)"\"HT\":{"); - if (Config.temp_address) { - payload = xstrcat(payload, (char *)"\"temperature\":"); - sprintf(buf, "%.1f", Config.temp_value / 1000.0); - payload = xstrcat(payload, buf); - } - if (Config.temp_address && Config.hum_address) - payload = xstrcat(payload, (char *)","); - if (Config.hum_address) { - payload = xstrcat(payload, (char *)"\"humidity\":"); - sprintf(buf, "%.1f", Config.hum_value / 1000.0); - payload = xstrcat(payload, buf); - } - payload = xstrcat(payload, (char *)"}"); - } + if (Config.temp_address || Config.hum_address) { + if (comma) + payload = xstrcat(payload, (char *)","); + payload = xstrcat(payload, (char *)"\"HT\":{"); + if (Config.temp_address) { + payload = xstrcat(payload, (char *)"\"temperature\":"); + sprintf(buf, "%.1f", Config.temp_value / 1000.0); + payload = xstrcat(payload, buf); + } + if (Config.temp_address && Config.hum_address) + payload = xstrcat(payload, (char *)","); + if (Config.hum_address) { + payload = xstrcat(payload, (char *)"\"humidity\":"); + sprintf(buf, "%.1f", Config.hum_value / 1000.0); + payload = xstrcat(payload, buf); + } + payload = xstrcat(payload, (char *)"}"); } payload = xstrcat(payload, (char *)"}}");