]> mj.ucw.cz Git - home-hw.git/blobdiff - ssr/host/burrow-ssrd.c
Rainbow case: TODO
[home-hw.git] / ssr / host / burrow-ssrd.c
index 53042605ee7da81de84900f65fea1c84925fb8e8..86a3156c3364bf5a5316f3a27a37a1435101f450 100644 (file)
@@ -25,7 +25,7 @@ static struct libusb_device_handle *devh;
 
 static struct mosquitto *mosq;
 
-static u32 ssr_state;
+static u32 ssr_state = ~0U;
 
 void open_device(void)
 {
@@ -84,12 +84,16 @@ static int transaction(uint req_len, uint resp_len)
        return received;
 }
 
-static void set_relays(void)
+static void set_relays(u32 mask, u32 data)
 {
-       msg(L_INFO, "Setting relays to %02x", ssr_state);
-       put_u32_be(req, 1);
-       put_u32_be(req+4, ssr_state);
-       transaction(8, 4);
+       u32 new = (ssr_state & mask) | data;
+       if (new != ssr_state) {
+               msg(L_INFO, "Setting relays to %02x", new);
+               put_u32_be(req, 1);
+               put_u32_be(req+4, new);
+               transaction(8, 4);
+               ssr_state = new;
+       }
 }
 
 static void mqtt_publish(const char *topic, const char *fmt, ...)
@@ -108,7 +112,7 @@ static void mqtt_setup(void)
        if (mosquitto_subscribe(mosq, NULL, "burrow/loft/#", 1) != MOSQ_ERR_SUCCESS)
                die("Mosquitto: subscribe failed");
 
-       mqtt_publish("burrow/loft/status", "ok");
+       mqtt_publish("status/loft-ssr", "ok");
 }
 
 static void mqtt_log_callback(struct mosquitto *mosq UNUSED, void *obj UNUSED, int level, const char *message)
@@ -134,20 +138,21 @@ static void mqtt_msg_callback(struct mosquitto *mosq UNUSED, void *obj UNUSED, c
                        msg(L_ERROR, "Received invalid fan setting %s: %s", val, err);
                        x = 0;
                }
-               msg(L_INFO, "Setting fan level to %u", x);
-               ssr_state &= ~7U;
+               msg(L_DEBUG, "Setting fan level to %u", x);
                switch (x) {
+                       case 0:
+                               set_relays(~7U, 0);
+                               break;
                        case 1:
-                               ssr_state |= 4;
+                               set_relays(~7U, 4);
                                break;
                        case 2:
-                               ssr_state |= 2;
+                               set_relays(~7U, 2);
                                break;
                        case 3:
-                               ssr_state |= 1;
+                               set_relays(~7U, 1);
                                break;
                }
-               set_relays();
        } else if (!strcmp(m->topic, "burrow/loft/circulation")) {
                uint x;
                const char *err;
@@ -155,11 +160,8 @@ static void mqtt_msg_callback(struct mosquitto *mosq UNUSED, void *obj UNUSED, c
                        msg(L_ERROR, "Received invalid circulation setting %s: %s", val, err);
                        x = 0;
                }
-               msg(L_INFO, "Setting circulation to %u", x);
-               ssr_state &= ~8U;
-               if (x)
-                       ssr_state |= 8;
-               set_relays();
+               msg(L_DEBUG, "Setting circulation to %u", x);
+               set_relays(~8U, (x ? 8 : 0));
        }
 }
 
@@ -197,7 +199,7 @@ int main(int argc UNUSED, char **argv)
        if (use_debug)
                libusb_set_debug(usb_ctxt, 3);
        open_device();
-       set_relays();
+       set_relays(0, 0);
 
        mosquitto_lib_init();
        mosq = mosquitto_new("ssrd", 1, NULL);
@@ -207,7 +209,7 @@ int main(int argc UNUSED, char **argv)
        mosquitto_log_callback_set(mosq, mqtt_log_callback);
        mosquitto_message_callback_set(mosq, mqtt_msg_callback);
 
-       if (mosquitto_will_set(mosq, "burrow/loft/status", 4, "dead", 0, true) != MOSQ_ERR_SUCCESS)
+       if (mosquitto_will_set(mosq, "status/loft-ssr", 4, "dead", 0, true) != MOSQ_ERR_SUCCESS)
                die("Mosquitto: unable to set will");
 
        if (mosquitto_connect(mosq, "127.0.0.1", 1883, 60) != MOSQ_ERR_SUCCESS)
@@ -231,14 +233,13 @@ int main(int argc UNUSED, char **argv)
                        continue;
                }
 
-               next_run = now + 5;
+               next_run = now + 10;
 
                put_u32_be(req, 2);
                transaction(8, 8);
                int t = get_u32_be(resp+4);
                msg(L_DEBUG, "Measured raw temperature %d", t);
 
-               mqtt_publish("burrow/loft/temperature", "%.3f", t / 1000.);
-               mqtt_publish("burrow/loft/temperature_timestamp", "%llu", (unsigned long long) now);
+               mqtt_publish("burrow/temp/loft", "%.3f %llu", t / 1000., (unsigned long long) now);
        }
 }