diff -r ea24b4ce02b1 -r 24749c296a50 thermferm/simulator.c --- 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.