thermferm/mqtt.c

changeset 554
ab9f22ab57b5
parent 550
04c942cded91
child 555
c6f04bfcec2c
--- 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];

mercurial