handle device offline

This commit is contained in:
Robin Appelman 2020-12-26 22:51:19 +01:00
commit ff085e85ed

View file

@ -88,33 +88,33 @@ async fn mqtt_client(config: &Config, device_states: DeviceStates) -> Result<()>
while let Some(message) = stream.next().await { while let Some(message) = stream.next().await {
let message = message?; let message = message?;
println!( let payload = std::str::from_utf8(message.payload.as_ref()).unwrap_or_default();
"{} {}", println!("{} {}", message.topic, payload);
message.topic,
std::str::from_utf8(message.payload.as_ref()).unwrap_or_default()
);
let topic = Topic::from(message.topic.as_str()); let topic = Topic::from(message.topic.as_str());
match topic { match topic {
Topic::LWT(device) => { Topic::LWT(device) => {
match payload {
"Online" => {
println!("Discovered {}", device.hostname);
// on discovery, ask the device for it's ip and name // on discovery, ask the device for it's ip and name
let send_client = client.clone(); let send_client = client.clone();
tokio::task::spawn(async move { tokio::task::spawn(async move {
if let Err(e) = send_client if let Err(e) = send_client
.publish( .publish(
device.get_topic("cmnd", "IPADDRESS"), device.get_topic("cmnd", "IPADDRESS"),
QoS::AtMostOnce, QoS::AtLeastOnce,
false, false,
"", "",
) )
.await .await
{ {
eprintln!("Failed to ask for power state: {:#}", e); eprintln!("Failed to ask for device IP: {:#}", e);
} }
if let Err(e) = send_client if let Err(e) = send_client
.publish( .publish(
device.get_topic("cmnd", "DeviceName"), device.get_topic("cmnd", "DeviceName"),
QoS::AtMostOnce, QoS::AtLeastOnce,
false, false,
"", "",
) )
@ -124,8 +124,14 @@ async fn mqtt_client(config: &Config, device_states: DeviceStates) -> Result<()>
} }
}); });
} }
"Offline" => {
println!("Removing {}", device.hostname);
device_states.remove(&device.hostname);
}
_ => {}
}
}
Topic::Result(device) => { Topic::Result(device) => {
let payload = std::str::from_utf8(message.payload.as_ref()).unwrap_or_default();
if let Ok(json) = json::parse(payload) { if let Ok(json) = json::parse(payload) {
let mut device_state = device_states.entry(device.hostname).or_default(); let mut device_state = device_states.entry(device.hostname).or_default();
device_state.update(json); device_state.update(json);