summaryrefslogtreecommitdiffstats
path: root/radiator-plc/stm32/app/logic.c
diff options
context:
space:
mode:
authorfishsoupisgood <github@madingley.org>2020-09-09 11:53:37 +0100
committerfishsoupisgood <github@madingley.org>2020-09-09 11:53:37 +0100
commit9d87c925a9eaa4fc256be3173c14a20d1469472d (patch)
tree50d63f87a47a0eac3f5b8058850184bcd4e6ee95 /radiator-plc/stm32/app/logic.c
parentdafd8cf2fdcdd637cc06f760d318cf8391b1a294 (diff)
downloadheating-9d87c925a9eaa4fc256be3173c14a20d1469472d.tar.gz
heating-9d87c925a9eaa4fc256be3173c14a20d1469472d.tar.bz2
heating-9d87c925a9eaa4fc256be3173c14a20d1469472d.zip
everything, mostly, working
Diffstat (limited to 'radiator-plc/stm32/app/logic.c')
-rw-r--r--radiator-plc/stm32/app/logic.c158
1 files changed, 158 insertions, 0 deletions
diff --git a/radiator-plc/stm32/app/logic.c b/radiator-plc/stm32/app/logic.c
new file mode 100644
index 0000000..8cab7ca
--- /dev/null
+++ b/radiator-plc/stm32/app/logic.c
@@ -0,0 +1,158 @@
+#include "project.h"
+
+
+#define N_VALVES 8
+
+static volatile int semaphore = 0;
+
+
+
+static const char *valve_name[N_VALVES] = {
+ "dd_radiator1",
+ "dd_radiator2",
+ "dd_radiator3",
+ "hall_radiator",
+ "kitchen_radiator",
+ "music_room_radiator",
+ "bathroom_radiator",
+ "plc0_radiator7",
+};
+
+static Onewire_addr valve_owa[N_VALVES] = {
+ {{0x28, 0xe3, 0x5d, 0x56, 0xb5, 0x01, 0x3c, 0x96}},
+ {{0x28, 0x0d, 0xaf, 0x56, 0xb5, 0x01, 0x3c, 0x89}},
+ {{0x28, 0x79, 0xb1, 0x56, 0xb5, 0x01, 0x3c, 0x13}},
+ {{0x28, 0x99, 0x8f, 0x56, 0xb5, 0x01, 0x3c, 0x1c}},
+ {{0x28, 0xb4, 0x98, 0x6e, 0x32, 0x20, 0x01, 0xc7}},
+ {{0x28, 0x0d, 0x4d, 0x56, 0xb5, 0x01, 0x3c, 0xd0}},
+ {{0x28, 0xb1, 0x71, 0x75, 0x32, 0x20, 0x01, 0xa9}},
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
+};
+volatile int temp[N_VALVES];
+
+#define BAD_TEMP 0x7fffffff
+
+int low_limit[N_VALVES] = {
+ 15000,
+ 15000,
+ 15000,
+ 15000,
+ 15000,
+ 15000,
+ 15000,
+ 00000,
+};
+
+
+int high_limit[N_VALVES] = {
+ 15000,
+ 15000,
+ 15000,
+ 15000,
+ 15000,
+ 15000,
+ 15000,
+ 00000,
+};
+
+int valve_state[N_VALVES];
+
+
+
+void mqtt_dispatch (char *type, char *who, char *what, char *msg)
+{
+ unsigned i;
+
+ if (strcmp (type, "cmnd")) return;
+
+ for (i = 0; i < N_VALVES; ++i) {
+
+ if (!strcmp (who, valve_name[i])) {
+ if (!strcmp (what, "var1"))
+ low_limit[i] = atoi (msg) * 1000;
+
+ if (!strcmp (what, "var2"))
+ high_limit[i] = atoi (msg) * 1000;
+ }
+ }
+}
+
+
+static float scale(int i)
+{
+float ret;
+
+ret=i;
+return ret/1000.;
+}
+
+void logic_tick (void)
+{
+ static unsigned i;
+ static int read_failed = 1;
+ static char msg_buf[80];
+ int t;
+ int o;
+ int v;
+
+
+
+ if (!read_failed)
+ read_failed = ds18b20_read (&valve_owa[i], &t);
+
+ if (read_failed) {
+ temp[i] = BAD_TEMP;
+ valve_state[i] = 0;
+ } else {
+ temp[i] = t;
+
+ if (t < low_limit[i])
+ valve_state[i] = 1;
+
+ if (t >= high_limit[i])
+ valve_state[i] = 0;
+ }
+
+ o = valve_state[i];
+
+ output_write (i, o);
+ v = input_get (i);
+
+ usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/POWER %s\r\n", valve_name[i], o ? "ON" : "OFF"));
+ usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/OPEN %d\r\n", valve_name[i], v));
+
+ usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/var1 %.2f\r\n", valve_name[i], scale(low_limit[i])));
+
+ usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/var2 %.2f\r\n", valve_name[i], scale(high_limit[i])));
+
+
+
+ if (!read_failed) {
+ usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/TEMPERATURE %.2f\r\n", valve_name[i], scale(temp[i])));
+ usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/DELTA %.2f\r\n", valve_name[i], scale(low_limit[i]-temp[i])));
+ }
+
+
+ i++;
+
+ if (i >= N_VALVES)
+ i = 0;
+
+ if (request_search) {
+ request_search = 0;
+ onewire_search();
+ }
+
+ read_failed = ds18b20_set_12_convert (&valve_owa[i]);
+}
+
+
+void logic_slow_tick (void)
+{
+ semaphore = 1;
+}
+
+
+void logic_dispatch (void)
+{
+}