static struct mosquitto *mosq;
-static u32 ssr_state;
+static u32 ssr_state = ~0U;
void open_device(void)
{
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, ...)
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)
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;
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));
}
}
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);
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)
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);
}
}