lifx-mqtt-bridge/src/mqtt_updates.rs

72 lines
2.4 KiB
Rust
Raw Normal View History

2019-01-20 09:02:44 +00:00
use crate::light::{Status, Update, Value, BRIGHTNESS, POWER};
2019-01-16 21:46:12 +00:00
use rumqtt;
use rumqtt::{MqttClient, QoS};
pub struct MqttUpdates {
client: MqttClient,
updates: crossbeam_channel::Receiver<Status>,
}
impl MqttUpdates {
pub fn new(client: MqttClient, updates: crossbeam_channel::Receiver<Status>) -> Self {
MqttUpdates { client, updates }
}
pub fn add_light(&mut self, id: &str, lampname: &str) -> Result<(), rumqtt::ClientError> {
self.client.publish(
format!("{}/lights", crate::MQTT_ID),
QoS::AtLeastOnce,
false,
format!("{}:{}", id, lampname),
)?;
2019-01-20 09:02:44 +00:00
let base_url = format!("{}/{}/", crate::MQTT_ID, lampname);
2019-01-16 21:46:12 +00:00
self.client.publish(
2019-01-20 09:02:44 +00:00
base_url.clone() + "status/connected",
2019-01-16 21:46:12 +00:00
QoS::AtLeastOnce,
2019-01-20 09:02:44 +00:00
true,
2019-01-16 21:46:12 +00:00
"true",
)?;
2019-01-20 09:02:44 +00:00
self.client
.subscribe(base_url.clone() + "command/" + POWER, QoS::AtLeastOnce)?;
self.client
.subscribe(base_url.clone() + "command/" + BRIGHTNESS, QoS::AtLeastOnce)?;
2019-01-16 21:46:12 +00:00
Ok(())
}
pub fn listen(&mut self) {
while let Ok(status) = self.updates.recv() {
match status {
2019-01-20 09:02:44 +00:00
Status::New(light) => {
self.add_light(&light.id, &light.label).unwrap();
self.handle_update(Update::new(&light.label, Value::Power(light.power)));
self.handle_update(Update::new(
&light.label,
Value::Brightness(light.brightness),
));
2019-01-16 21:46:12 +00:00
}
2019-01-20 09:02:44 +00:00
Status::Remove(_name) => self
.client
.publish(
format!("{}/{}/status/connected", crate::MQTT_ID, _name),
QoS::AtLeastOnce,
true,
"false",
)
.unwrap(),
Status::Update(update) => self.handle_update(update),
2019-01-16 21:46:12 +00:00
}
}
}
2019-01-20 09:02:44 +00:00
fn handle_update(&mut self, update: Update) {
let (detail, value) = update.status.unravel();
self.client
.publish(
format!("{}/{}/status/{}", crate::MQTT_ID, update.lampname, detail),
QoS::AtLeastOnce,
true,
value,
)
.unwrap();
}
2019-01-16 21:46:12 +00:00
}