X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ssr%2Fhost%2Fburrow-ssrd.c;h=86a3156c3364bf5a5316f3a27a37a1435101f450;hb=832142c0afc865e125a978f590ba5f5dcce17219;hp=53042605ee7da81de84900f65fea1c84925fb8e8;hpb=94e41c58ddbfe49a41d06a58f9a6fc921a5608ac;p=home-hw.git diff --git a/ssr/host/burrow-ssrd.c b/ssr/host/burrow-ssrd.c index 5304260..86a3156 100644 --- a/ssr/host/burrow-ssrd.c +++ b/ssr/host/burrow-ssrd.c @@ -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); } }