]> mj.ucw.cz Git - home-hw.git/commitdiff
SSR MQTT: Daemonization and MQTT resiliency
authorMartin Mares <mj@ucw.cz>
Sat, 11 Aug 2018 19:49:38 +0000 (21:49 +0200)
committerMartin Mares <mj@ucw.cz>
Sat, 11 Aug 2018 19:49:38 +0000 (21:49 +0200)
ssr/turris/Makefile
ssr/turris/burrow-ssrd.c

index 35bccce01efdfb20a8d1d5499e106bb0cc6bfa1a..57d90812b59eb8b704a8209e61cc3555d186b1ce 100644 (file)
@@ -21,6 +21,6 @@ ssr-control: ssr-control.c
 burrow-ssrd: burrow-ssrd.c
 
 upload:
-       rsync -av ssr-control burrow-ssrd micac:
+       rsync -av ssr-control burrow-ssrd micac:burrow/
 
 .PHONY: upload
index 8132225510704c53f932af3117f3713259f11382..93b1f2cd08ce33ece3f5555913aca71dda164f76 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <ucw/lib.h>
+#include <ucw/log.h>
 #include <ucw/mainloop.h>
 #include <ucw/opt.h>
 #include <ucw/strtonum.h>
@@ -102,6 +103,14 @@ static void mqtt_publish(const char *topic, const char *fmt, ...)
        va_end(args);
 }
 
+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");
+}
+
 static void mqtt_log_callback(struct mosquitto *mosq UNUSED, void *obj UNUSED, int level, const char *message)
 {
        // msg(L_INFO, "MQTT(%d): %s", level, message);
@@ -116,7 +125,7 @@ static void mqtt_msg_callback(struct mosquitto *mosq UNUSED, void *obj UNUSED, c
        }
        memcpy(val, m->payload, m->payloadlen);
        val[m->payloadlen] = 0;
-       msg(L_INFO, "MQTT < %s %s", m->topic, val);
+       msg(L_DEBUG, "MQTT < %s %s", m->topic, val);
 
        if (!strcmp(m->topic, "burrow/loft/fan")) {
                uint x;
@@ -153,11 +162,16 @@ static void mqtt_msg_callback(struct mosquitto *mosq UNUSED, void *obj UNUSED, c
        }
 }
 
+static int use_daemon;
+static int use_debug;
+
 static struct opt_section options = {
        OPT_ITEMS {
                OPT_HELP("A daemon for controlling the solid state relay module via MQTT"),
                OPT_HELP(""),
                OPT_HELP("Options:"),
+               OPT_BOOL('d', "debug", use_debug, 0, "\tLog debugging messages"),
+               OPT_BOOL(0, "daemon", use_daemon, 0, "\tDaemonize"),
                OPT_HELP_OPTION,
                OPT_CONF_OPTIONS,
                OPT_END
@@ -168,10 +182,18 @@ int main(int argc UNUSED, char **argv)
 {
        opt_parse(&options, argv+1);
 
+       if (use_daemon) {
+               struct log_stream *ls = log_new_syslog("daemon", 0);
+               log_set_default_stream(ls);
+       }
+       if (!use_debug)
+               log_default_stream()->levels &= ~(1U << L_DEBUG);
+
        int err;
        if (err = libusb_init(&usb_ctxt))
                die("Cannot initialize libusb: error %d", err);
-       libusb_set_debug(usb_ctxt, 3);
+       if (use_debug)
+               libusb_set_debug(usb_ctxt, 3);
        open_device();
        set_relays();
 
@@ -189,17 +211,20 @@ int main(int argc UNUSED, char **argv)
        if (mosquitto_connect(mosq, "127.0.0.1", 1883, 60) != MOSQ_ERR_SUCCESS)
                die("Mosquitto: connect failed");
 
-       if (mosquitto_subscribe(mosq, NULL, "burrow/loft/#", 1) != MOSQ_ERR_SUCCESS)
-               die("Mosquitto: subscribe failed");
-
-       mqtt_publish("burrow/loft/status", "ok");
+       mqtt_setup();
 
        time_t next_run = 0;
        for (;;) {
                time_t now = time(NULL);
                if (now < next_run) {
                        int err = mosquitto_loop(mosq, (next_run - now) * 1000, 1);
-                       if (err != MOSQ_ERR_SUCCESS)
+                       if (err == MOSQ_ERR_NO_CONN) {
+                               err = mosquitto_reconnect(mosq);
+                               if (err == MOSQ_ERR_SUCCESS)
+                                       mqtt_setup();
+                               else
+                                       msg(L_ERROR, "Mosquitto: cannot reconnect, error %d", err);
+                       } else if (err != MOSQ_ERR_SUCCESS)
                                msg(L_ERROR, "Mosquitto: loop returned error %d", err);
                        continue;
                }