summaryrefslogtreecommitdiffstats
path: root/radiator-plc/stm32/app/logic.c
diff options
context:
space:
mode:
authorfishsoupisgood <github@madingley.org>2021-01-12 16:58:31 +0000
committerfishsoupisgood <github@madingley.org>2021-01-12 16:58:31 +0000
commit7c6887eaaf812b63bab6c5e134f80a2ef36aeb31 (patch)
tree4b4b0d371107ae1b8540ca1618cb9aa796b72616 /radiator-plc/stm32/app/logic.c
parentf4b573fe337a436d5e2b20be4be031d77376d609 (diff)
downloadheating-7c6887eaaf812b63bab6c5e134f80a2ef36aeb31.tar.gz
heating-7c6887eaaf812b63bab6c5e134f80a2ef36aeb31.tar.bz2
heating-7c6887eaaf812b63bab6c5e134f80a2ef36aeb31.zip
works
Diffstat (limited to 'radiator-plc/stm32/app/logic.c')
-rw-r--r--radiator-plc/stm32/app/logic.c178
1 files changed, 135 insertions, 43 deletions
diff --git a/radiator-plc/stm32/app/logic.c b/radiator-plc/stm32/app/logic.c
index 8cab7ca..a9f845c 100644
--- a/radiator-plc/stm32/app/logic.c
+++ b/radiator-plc/stm32/app/logic.c
@@ -7,7 +7,7 @@ static volatile int semaphore = 0;
-static const char *valve_name[N_VALVES] = {
+static const char *plc0_valve_names[N_VALVES] = {
"dd_radiator1",
"dd_radiator2",
"dd_radiator3",
@@ -18,16 +18,57 @@ static const char *valve_name[N_VALVES] = {
"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}},
+static const Onewire_addr plc0_valve_owas[N_VALVES] = {
+ {{0x28, 0x09, 0xb3, 0xc3, 0x0b, 0x00, 0x00, 0xf9}},
+ {{0x28, 0x89, 0xda, 0xc3, 0x0b, 0x00, 0x00, 0xf1}},
+ {{0x28, 0xdf, 0xb2, 0xc6, 0x0b, 0x00, 0x00, 0xc3}},
+ {{0x28, 0x42, 0x23, 0xc4, 0x0b, 0x00, 0x00, 0x45}},
+ {{0x28, 0xf9, 0xd6, 0xc6, 0x0b, 0x00, 0x00, 0xc9}},
+ {{0x28, 0x8d, 0x0a, 0xc6, 0x0b, 0x00, 0x00, 0xf2}},
+ {{0x28, 0x5f, 0xb7, 0xc6, 0x0b, 0x00, 0x00, 0xfb}},
+ {{0x28, 0x25, 0xe5, 0xc6, 0x0b, 0x00, 0x00, 0xba}},
+};
+
+
+
+
+
+
+
+
+
+
+
+
+static const char *plc1_valve_names[N_VALVES] = {
+ "2fl_main_radiator",
+ "2fl_stair_radiator",
+ "plc1_radiator2",
+ "plc1_radiator3",
+ "plc1_radiator4",
+ "plc1_radiator5",
+ "plc1_radiator6",
+ "plc1_radiator7",
+};
+
+
+static const Onewire_addr plc1_valve_owas[N_VALVES] = {
+ {{0x28, 0x03, 0x01, 0xc5, 0x0b, 0x00, 0x00, 0xf3}},
+ {{0x28, 0xea, 0x79, 0xc5, 0x0b, 0x00, 0x00, 0x1f}},
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
};
+
+
+Onewire_addr owa_zero = {0};
+
+
+static const char **valve_name;
+static const Onewire_addr *valve_owa;
volatile int temp[N_VALVES];
#define BAD_TEMP 0x7fffffff
@@ -56,80 +97,98 @@ int high_limit[N_VALVES] = {
};
int valve_state[N_VALVES];
+int failed_reads[N_VALVES];
+
+
+
+static float scale (int i)
+{
+ float ret;
+ ret = i;
+ return ret / 1000.;
+}
void mqtt_dispatch (char *type, char *who, char *what, char *msg)
{
unsigned i;
+ static char msg_buf[80];
if (strcmp (type, "cmnd")) return;
for (i = 0; i < N_VALVES; ++i) {
if (!strcmp (who, valve_name[i])) {
- if (!strcmp (what, "var1"))
+ if (!strcmp (what, "var1")) {
low_limit[i] = atoi (msg) * 1000;
+ usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/var1 %.2f\r\n", valve_name[i], scale (low_limit[i])));
+ }
- if (!strcmp (what, "var2"))
+ if (!strcmp (what, "var2")) {
high_limit[i] = atoi (msg) * 1000;
- }
- }
-}
-
+ usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/var2 %.2f\r\n", valve_name[i], scale (high_limit[i])));
+ }
-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 int not_present = 1;
static char msg_buf[80];
int t;
int o;
int v;
+ if (!not_present) {
+ if (!read_failed)
+ read_failed = ds18b20_read (&valve_owa[i], &t);
+ if (read_failed) {
+ temp[i] = BAD_TEMP;
+ valve_state[i] = 0;
+ failed_reads[i]++;
+ } else {
+ temp[i] = t;
+ failed_reads[i] = 0;
- if (!read_failed)
- read_failed = ds18b20_read (&valve_owa[i], &t);
+ if (t < low_limit[i])
+ valve_state[i] = 1;
- if (read_failed) {
- temp[i] = BAD_TEMP;
- valve_state[i] = 0;
- } else {
- temp[i] = t;
+ if (t >= high_limit[i])
+ valve_state[i] = 0;
+ }
- if (t < low_limit[i])
- valve_state[i] = 1;
+ o = valve_state[i];
- if (t >= high_limit[i])
- valve_state[i] = 0;
- }
+ output_write (i, o);
+ v = input_get (i);
- o = valve_state[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));
- output_write (i, o);
- v = input_get (i);
+ 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/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/var2 %.2f\r\n", valve_name[i], scale (high_limit[i])));
- 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])));
+ }
+ usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/failed_reads %d\r\n", valve_name[i], failed_reads[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])));
+ } else {
+ valve_state[i] = 0;
+ o = valve_state[i];
+ output_write (i, o);
}
@@ -143,7 +202,12 @@ void logic_tick (void)
onewire_search();
}
- read_failed = ds18b20_set_12_convert (&valve_owa[i]);
+ if (!memcmp (&valve_owa[i], &owa_zero, sizeof (owa_zero)))
+ not_present = 1;
+ else {
+ not_present = 0;
+ read_failed = ds18b20_set_12_convert (&valve_owa[i]);
+ }
}
@@ -156,3 +220,31 @@ void logic_slow_tick (void)
void logic_dispatch (void)
{
}
+
+
+void logic_init (void)
+{
+ char serial[25] = {0};
+ unsigned i;
+
+ desig_get_unique_id_as_string (serial, sizeof (serial));
+
+ if (!strcmp (serial, "325715574155303632FFD305")) {
+ valve_name = plc0_valve_names;
+ valve_owa = plc0_valve_owas;
+
+ for (i = 0; i < 3; ++i) {
+ low_limit[i] = 19000;
+ high_limit[i] = 20000;
+ }
+ } else if (!strcmp (serial, "378125574155383139FFD805")) {
+ valve_name = plc1_valve_names;
+ valve_owa = plc1_valve_owas;
+ } else {
+ printf ("serial: %s\n", serial);
+ valve_name = plc0_valve_names;
+ valve_owa = plc0_valve_owas;
+ }
+
+
+}