lifx-mqtt-bridge/src/mqtt.rs

71 lines
2.2 KiB
Rust
Raw Normal View History

2019-01-08 21:05:14 +00:00
use rumqtt;
use rumqtt::LastWill;
use rumqtt::MqttClient;
use rumqtt::Notification;
use rumqtt::Receiver;
use rumqtt::{ConnectionMethod, MqttOptions, QoS, ReconnectOptions};
pub struct Mqtt {
pub client: MqttClient,
pub notifications: Receiver<Notification>,
}
impl Mqtt {
pub fn connect(host: &str, port: u16) -> Result<Self, String> {
let last_will = LastWill {
topic: format!("{}/status", crate::MQTT_ID),
message: "disconnected".to_string(),
qos: QoS::AtLeastOnce,
retain: true,
};
let options = MqttOptions::new(crate::MQTT_ID, host, port);
let options = options
.set_connection_method(ConnectionMethod::Tcp)
.set_keep_alive(10)
.set_last_will(last_will)
.set_reconnect_opts(ReconnectOptions::Always(20));
match MqttClient::start(options) {
Ok((mut client, notifications)) => {
match client.publish(
format!("{}/status", crate::MQTT_ID),
QoS::AtLeastOnce,
true,
"connected",
) {
Ok(()) => Ok(Mqtt {
client,
notifications,
}),
Err(conn_err) => Err(conn_err.to_string()),
}
}
Err(conn_err) => Err(conn_err.to_string()),
}
}
2019-01-15 20:41:43 +00:00
pub fn add_light(&mut self, id: &str, label: &str) -> Result<(), rumqtt::ClientError> {
self.client.publish(
format!("{}/lights", crate::MQTT_ID),
QoS::AtLeastOnce,
false,
format!("{}:{}", id, label),
)?;
self.client.publish(
format!("{}/{}/status/connected", crate::MQTT_ID, label),
QoS::AtLeastOnce,
false,
"true",
)?;
self.client.subscribe(
format!("{}/{}/command/power", crate::MQTT_ID, label),
QoS::AtLeastOnce,
)?;
self.client.subscribe(
format!("{}/{}/command/brightness", crate::MQTT_ID, label),
QoS::AtLeastOnce,
)?;
Ok(())
}
2019-01-08 21:05:14 +00:00
}