thermferm/simulator.c

changeset 714
24749c296a50
parent 660
a28ef4d9afa4
child 715
f5d85af156ab
--- a/thermferm/simulator.c	Sun Apr 28 15:50:42 2024 +0200
+++ b/thermferm/simulator.c	Tue Apr 30 17:26:41 2024 +0200
@@ -22,6 +22,8 @@
 
 #include "thermferm.h"
 #include "delay.h"
+#include "xutil.h"
+#include "websocket.h"
 #include "simulator.h"
 
 int			my_simulator_state = 0;
@@ -29,6 +31,7 @@
 #ifdef USE_SIMULATOR
 
 extern sys_config	Config;
+extern const char	DEVPRESENT[4][6];
 
 int			my_simulator_shutdown = 0;
 int			SIMcooling = 0;
@@ -37,6 +40,157 @@
 int			SIMlight = 0;
 
 
+/*
+ * Return json data for one simulator
+ */
+char *simulator_json(simulator_list *simulator)
+{
+    char	*payload, buf[64];
+
+    payload = xstrcpy((char *)"{\"uuid\":\"");
+    payload = xstrcat(payload, simulator->uuid);
+    payload = xstrcat(payload, (char *)"\",\"name\":\"");
+    payload = xstrcat(payload, simulator->name);
+    payload = xstrcat(payload, (char *)"\",\"simno\":");
+    sprintf(buf, "%d", simulator->simno);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)",\"volume_air\":");
+    sprintf(buf, "%d", simulator->volume_air);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)",\"volume_beer\":");
+    sprintf(buf, "%d", simulator->volume_beer);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)",\"room\":{\"tempaddress\":\"");
+    payload = xstrcat(payload, simulator->room_tempaddress);
+    payload = xstrcat(payload, (char *)"\",\"temperature\":");
+    sprintf(buf, "%.1f", simulator->room_temperature);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)",\"humaddress\":\"");
+    payload = xstrcat(payload, simulator->room_humaddress);
+    payload = xstrcat(payload, (char *)"\",\"humidity\":");
+    sprintf(buf, "%.1f", simulator->room_humidity);
+    payload = xstrcat(payload, buf);
+
+    payload = xstrcat(payload, (char *)"},\"air\":{\"address\":\"");
+    payload = xstrcat(payload, simulator->air_address);
+    payload = xstrcat(payload, (char *)"\",\"temperature\":");
+    sprintf(buf, "%.4f", simulator->air_temperature);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)",\"present\":\"");
+    payload = xstrcat(payload, (char *)DEVPRESENT[simulator->air_present]);
+    payload = xstrcat(payload, (char *)"\"},\"beer\":{\"address\":\"");
+
+    payload = xstrcat(payload, simulator->beer_address);
+    payload = xstrcat(payload, (char *)"\",\"temperature\":");
+    sprintf(buf, "%.4f", simulator->beer_temperature);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)",\"present\":\"");
+    payload = xstrcat(payload, (char *)DEVPRESENT[simulator->beer_present]);
+    payload = xstrcat(payload, (char *)"\"},\"beer2\":{\"address\":\"");
+
+    payload = xstrcat(payload, simulator->beer_address2);
+    payload = xstrcat(payload, (char *)"\",\"temperature\":");
+    sprintf(buf, "%.4f", simulator->beer_temperature2);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)",\"present\":\"");
+    payload = xstrcat(payload, (char *)DEVPRESENT[simulator->beer_present2]);
+    payload = xstrcat(payload, (char *)"\"},\"chiller\":{\"address\":\"");
+
+    payload = xstrcat(payload, simulator->chiller_address);
+    payload = xstrcat(payload, (char *)"\",\"temperature\":");
+    sprintf(buf, "%.4f", simulator->chiller_temperature);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)",\"present\":\"");
+    payload = xstrcat(payload, (char *)DEVPRESENT[simulator->chiller_present]);
+    payload = xstrcat(payload, (char *)"\"},\"cooler\":{\"address\":\"");
+
+    payload = xstrcat(payload, simulator->cooler_address);
+    payload = xstrcat(payload, (char *)"\",\"temperature\":");
+    sprintf(buf, "%.4f", simulator->cooler_temp);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)",\"time\":");
+    sprintf(buf, "%d", simulator->cooler_time);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)",\"size\":");
+    sprintf(buf, "%.4f", simulator->cooler_size);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)",\"present\":\"");
+    payload = xstrcat(payload, (char *)DEVPRESENT[simulator->cooler_present]);
+    payload = xstrcat(payload, (char *)"\",\"power\":");
+    sprintf(buf, "%d", simulator->cooler_power);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)"},\"heater\":{\"address\":\"");
+
+    payload = xstrcat(payload, simulator->heater_address);
+    payload = xstrcat(payload, (char *)"\",\"temperature\":");
+    sprintf(buf, "%.4f", simulator->heater_temp);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)",\"time\":");
+    sprintf(buf, "%d", simulator->heater_time);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)",\"size\":");
+    sprintf(buf, "%.4f", simulator->heater_size);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)",\"present\":\"");
+    payload = xstrcat(payload, (char *)DEVPRESENT[simulator->heater_present]);
+    payload = xstrcat(payload, (char *)"\",\"power\":");
+    sprintf(buf, "%d", simulator->heater_power);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)"},\"fan\":{\"address\":\"");
+
+    payload = xstrcat(payload, simulator->fan_address);
+    payload = xstrcat(payload, (char *)"\",\"present\":\"");
+    payload = xstrcat(payload, (char *)DEVPRESENT[simulator->fan_present]);
+    payload = xstrcat(payload, (char *)"\",\"power\":");
+    sprintf(buf, "%d", simulator->fan_power);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)"},\"light\":{\"address\":\"");
+
+    payload = xstrcat(payload, simulator->light_address);
+    payload = xstrcat(payload, (char *)"\",\"present\":\"");
+    payload = xstrcat(payload, (char *)DEVPRESENT[simulator->light_present]);
+    payload = xstrcat(payload, (char *)"\",\"power\":");
+    sprintf(buf, "%d", simulator->light_power);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)"},\"frigo_isolation\":");
+
+    sprintf(buf, "%.4f", simulator->frigo_isolation);
+    payload = xstrcat(payload, buf);
+
+    payload = xstrcat(payload, (char *)",\"timestamp\":");
+    sprintf(buf, "%ld", (long)simulator->timestamp);
+    payload = xstrcat(payload, buf);
+    payload = xstrcat(payload, (char *)"}");
+
+    return payload;
+}
+
+
+
+void simulator_ws(void)
+{
+    bool		comma = false;
+    char		*payload = NULL, *payloadu = NULL;
+    simulator_list	*simulator;
+
+    payload = xstrcpy((char *)"{\"type\":\"simulator\",\"metric\":[");
+    for (simulator = Config.simulators; simulator; simulator = simulator->next) {
+        if (comma)
+            payload = xstrcat(payload, (char *)",");
+        payloadu = simulator_json(simulator);
+        payload = xstrcat(payload, payloadu);
+        comma = true;
+        free(payloadu);
+        payloadu = NULL;
+    }
+    payload = xstrcat(payload, (char *)"]}");
+    ws_broadcast(payload);
+    free(payload);
+    payload = NULL;
+}
+
+
+
 void *my_simulator_loop(void *threadid)
 {
     simulator_list	*simulator;
@@ -59,17 +213,17 @@
 	if (my_simulator_shutdown)
 	    break;
 
-	for (simulator = Config.simulators; simulator; simulator = simulator->next) {
-	    if (my_simulator_shutdown)
-	    	break;
+	now = time(NULL);
+	if (now != last) {
+	    last = now;
+	    /*
+	     * Each second
+	     */
+	    seconds++;
 
-	    now = time(NULL);
-	    if (now != last) {
-		last = now;
-		/*
-		 * Each second
-		 */
-	    	seconds++;
+	    for (simulator = Config.simulators; simulator; simulator = simulator->next) {
+		if (my_simulator_shutdown)
+	    	    break;
 
 		/*
 	    	 * First, calculate temperature difference between the room and the air in the
@@ -79,7 +233,7 @@
 	    	 */
 		sqm_room_air = (cbrtl(simulator->volume_air) * cbrtl(simulator->volume_air) * 6) / 100;	/* square meters all fridge sides */
 		thick_room_air = 0.04;	/* 4 cm walls	*/
-		k_room_air = 0.03;	/* Polystrene	*/
+		k_room_air = 0.03;		/* Polystrene	*/
 		air_heat_transfer=(k_room_air * sqm_room_air * (simulator->room_temperature - simulator->air_temperature)) / thick_room_air;
 		air_change = (air_heat_transfer / (vhc_air * ((simulator->volume_air - simulator->volume_beer) * 1000))) / 60.0;
 		simulator->air_temperature += air_change;
@@ -117,7 +271,7 @@
 		    simulator->s_cool_temp -= (simulator->s_cool_temp - simulator->air_temperature) / 25.0;
 		}
 
-	    	/*
+		/*
 	    	 * Calculate final temperature of the beer and the air.
 	    	 */
 		// Cheap trick, just follow slowly the air temp.

mercurial