58 lines
1.8 KiB
Rust
58 lines
1.8 KiB
Rust
use crate::light::Status;
|
|
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),
|
|
)?;
|
|
self.client.publish(
|
|
format!("{}/{}/status/connected", crate::MQTT_ID, lampname),
|
|
QoS::AtLeastOnce,
|
|
false,
|
|
"true",
|
|
)?;
|
|
self.client.subscribe(
|
|
format!("{}/{}/command/power", crate::MQTT_ID, lampname),
|
|
QoS::AtLeastOnce,
|
|
)?;
|
|
self.client.subscribe(
|
|
format!("{}/{}/command/brightness", crate::MQTT_ID, lampname),
|
|
QoS::AtLeastOnce,
|
|
)?;
|
|
Ok(())
|
|
}
|
|
|
|
pub fn listen(&mut self) {
|
|
while let Ok(status) = self.updates.recv() {
|
|
match status {
|
|
Status::New(light) => self.add_light(&light.id, &light.label).unwrap(),
|
|
Status::Remove(_name) => unimplemented!(),
|
|
Status::Update(update) => {
|
|
let (detail, value) = update.status.unravel();
|
|
self.client
|
|
.publish(
|
|
format!("{}/{}/status/{}", crate::MQTT_ID, update.lampname, detail),
|
|
QoS::AtLeastOnce,
|
|
true,
|
|
value,
|
|
)
|
|
.unwrap();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|