diff -r 4091d4fe217f -r ab9f22ab57b5 thermferm/mqtt.c --- a/thermferm/mqtt.c Wed Jul 25 20:08:13 2018 +0200 +++ b/thermferm/mqtt.c Tue Jul 31 16:42:11 2018 +0200 @@ -300,14 +300,34 @@ /* * Product (beer) loaded information. - * TODO: extend with uuid and product code. */ - if (unit->name || strlen(unit->name)) { - payload = xstrcat(payload, (char *)"\"product\":{\"code\":null,\"name\":\""); - payload = xstrcat(payload, unit->name); - payload = xstrcat(payload, (char *)"\"}"); - } else { - payload = xstrcat(payload, (char *)"\"product\":null"); + if ((unit->product_name && strlen(unit->product_name)) || + (unit->product_code && strlen(unit->product_code)) || + (unit->product_uuid && strlen(unit->product_uuid))) { + comma = false; + payload = xstrcat(payload, (char *)"\"product\":{"); + if (unit->product_uuid && strlen(unit->product_uuid)) { + payload = xstrcat(payload, (char *)"\"uuid\":\""); + payload = xstrcat(payload, unit->product_uuid); + payload = xstrcat(payload, (char *)"\""); + comma = true; + } + if (unit->product_code && strlen(unit->product_code)) { + if (comma) + payload = xstrcat(payload, (char *)","); + payload = xstrcat(payload, (char *)"\"code\":\""); + payload = xstrcat(payload, unit->product_code); + payload = xstrcat(payload, (char *)"\""); + comma = true; + } + if (unit->product_name && strlen(unit->product_name)) { + if (comma) + payload = xstrcat(payload, (char *)","); + payload = xstrcat(payload, (char *)"\"name\":\""); + payload = xstrcat(payload, unit->product_name); + payload = xstrcat(payload, (char *)"\""); + } + payload = xstrcat(payload, (char *)"}"); } /* @@ -626,6 +646,135 @@ +void publishDLog(units_list *unit) +{ + char buf[32], *payload = NULL, *topic = NULL; + bool comma = false; + + if (mqtt_use) { + payload = payload_header(); + payload = xstrcat(payload, (char *)"{"); + + if ((unit->product_name && strlen(unit->product_name)) || + (unit->product_code && strlen(unit->product_code)) || + (unit->product_uuid && strlen(unit->product_uuid))) { + comma = false; + payload = xstrcat(payload, (char *)"\"product\":{"); + if (unit->product_uuid && strlen(unit->product_uuid)) { + payload = xstrcat(payload, (char *)"\"uuid\":\""); + payload = xstrcat(payload, unit->product_uuid); + payload = xstrcat(payload, (char *)"\""); + comma = true; + } + if (unit->product_code && strlen(unit->product_code)) { + if (comma) + payload = xstrcat(payload, (char *)","); + payload = xstrcat(payload, (char *)"\"code\":\""); + payload = xstrcat(payload, unit->product_code); + payload = xstrcat(payload, (char *)"\""); + comma = true; + } + if (unit->product_name && strlen(unit->product_name)) { + if (comma) + payload = xstrcat(payload, (char *)","); + payload = xstrcat(payload, (char *)"\"name\":\""); + payload = xstrcat(payload, unit->product_name); + payload = xstrcat(payload, (char *)"\""); + } + payload = xstrcat(payload, (char *)"}"); + comma = true; + } + + if (comma) + payload = xstrcat(payload, (char *)","); + payload = xstrcat(payload, (char *)"\"stage\":\"PRIMARY\",\"mode\":\""); + payload = xstrcat(payload, (char *)UNITMODE[unit->mode]); + payload = xstrcat(payload, (char *)"\",\"temperature\":{"); + comma = false; + if (unit->air_address) { + payload = xstrcat(payload, (char *)"\"air\":"); + sprintf(buf, "%.3f", unit->air_temperature / 1000.0); + payload = xstrcat(payload, buf); + comma = true; + } + if (unit->beer_address) { + if (comma) + payload = xstrcat(payload, (char *)","); + payload = xstrcat(payload, (char *)"\"beer\":"); + sprintf(buf, "%.3f", unit->beer_temperature / 1000.0); + payload = xstrcat(payload, buf); + comma = true; + } + if (unit->chiller_address) { + if (comma) + payload = xstrcat(payload, (char *)","); + payload = xstrcat(payload, (char *)"\"chiller\":"); + sprintf(buf, "%.3f", unit->chiller_temperature / 1000.0); + payload = xstrcat(payload, buf); + comma = true; + } + if (Config.temp_address) { + if (comma) + payload = xstrcat(payload, (char *)","); + payload = xstrcat(payload, (char *)"\"room\":"); + sprintf(buf, "%.1f", Config.temp_value / 1000.0); + payload = xstrcat(payload, buf); + } + 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->heater_address) { + payload = xstrcat(payload, (char *)",\"heater\":{\"power\":"); + sprintf(buf, "%d", unit->heater_state); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)",\"usage\":"); + sprintf(buf, "%d", unit->heater_usage); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"}"); + } + if (unit->cooler_address) { + payload = xstrcat(payload, (char *)",\"cooler\":{\"power\":"); + sprintf(buf, "%d", unit->cooler_state); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)",\"usage\":"); + sprintf(buf, "%d", unit->cooler_usage); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"}"); + } + if (unit->fan_address) { + payload = xstrcat(payload, (char *)",\"fan\":{\"power\":"); + sprintf(buf, "%d", unit->fan_state); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)",\"usage\":"); + sprintf(buf, "%d", unit->fan_usage); + payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)"}"); + } + // sg + if (unit->event_msg) { + payload = xstrcat(payload, (char *)",\"event\":\""); + payload = xstrcat(payload, unit->event_msg); + payload = xstrcat(payload, (char *)"\""); + } + payload = xstrcat(payload, (char *)"}}"); + + topic = xstrcat(topic_base((char *)"DLOG"), (char *)"/"); + topic = xstrcat(topic, unit->alias); + publisher(mosq, topic, payload, true); +printf("%s\n", payload); + free(payload); + payload = NULL; + free(topic); + topic = NULL; + } +} + + + void publishNData(bool birth, int flag) { char *payload = NULL, sidx[10], buf[64];