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 {
let message = message?;
println!(
"{} {}",
message.topic,
std::str::from_utf8(message.payload.as_ref()).unwrap_or_default()
);
let payload = std::str::from_utf8(message.payload.as_ref()).unwrap_or_default();
println!("{} {}", message.topic, payload);
let topic = Topic::from(message.topic.as_str());
match topic {
Topic::LWT(device) => {
match payload {
"Online" => {
println!("Discovered {}", device.hostname);
// on discovery, ask the device for it's ip and name
let send_client = client.clone();
tokio::task::spawn(async move {
if let Err(e) = send_client
.publish(
device.get_topic("cmnd", "IPADDRESS"),
QoS::AtMostOnce,
QoS::AtLeastOnce,
false,
"",
)
.await
{
eprintln!("Failed to ask for power state: {:#}", e);
eprintln!("Failed to ask for device IP: {:#}", e);
}
if let Err(e) = send_client
.publish(
device.get_topic("cmnd", "DeviceName"),
QoS::AtMostOnce,
QoS::AtLeastOnce,
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) => {
let payload = std::str::from_utf8(message.payload.as_ref()).unwrap_or_default();
if let Ok(json) = json::parse(payload) {
let mut device_state = device_states.entry(device.hostname).or_default();
device_state.update(json);