-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathflash.rs
73 lines (64 loc) · 2.39 KB
/
flash.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//! Example to turn all Homie devices on and off every 5 seconds, 4 times.
use futures::FutureExt;
use homie_controller::{Datatype, Event, HomieController, HomieEventLoop, PollError};
use rumqttc::MqttOptions;
use std::error::Error;
use std::sync::Arc;
use std::time::Duration;
use tokio::task::{self, JoinHandle};
use tokio::{time, try_join};
fn spawn_poll_loop(
mut event_loop: HomieEventLoop,
controller: Arc<HomieController>,
) -> JoinHandle<Result<(), PollError>> {
task::spawn(async move {
loop {
for event in controller.poll(&mut event_loop).await? {
if let Event::PropertyValueChanged {
device_id,
node_id,
property_id,
value,
fresh,
} = event
{
println!(
"{}/{}/{} = {} ({})",
device_id, node_id, property_id, value, fresh
);
} else {
log::info!("Event: {:?}", event);
}
}
}
})
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
pretty_env_logger::init();
let mqttoptions = MqttOptions::new("homie_controller", "test.mosquitto.org", 1883);
let (controller, event_loop) = HomieController::new(mqttoptions, "homie");
let controller = Arc::new(controller);
let handle = spawn_poll_loop(event_loop, controller.clone());
for _ in 0..3 {
for &value in [true, false].iter() {
time::sleep(Duration::from_secs(5)).await;
println!("Turning everything {}", if value { "on" } else { "off" });
for device in controller.devices().values() {
for node in device.nodes.values() {
for property in node.properties.values() {
if property.settable && property.datatype == Some(Datatype::Boolean) {
println!("{}/{}/{} set to {}", device.id, node.id, property.id, value);
controller
.set(&device.id, &node.id, &property.id, value)
.await?;
}
}
}
}
}
}
controller.disconnect().await?;
try_join!(handle.map(|res| Ok::<_, Box<dyn Error>>(res??)))?;
Ok(())
}