use esphome_client::{
EspHomeClient,
types::{EspHomeMessage, ListEntitiesRequest, SubscribeStatesRequest},
};
use std::collections::HashMap;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
let args: Vec<String> = std::env::args().collect();
if args.len() < 2 {
eprintln!("Usage: {} <host:port> [api_key]", args[0]);
eprintln!("Example: {} 192.168.1.100:6053", args[0]);
std::process::exit(1);
}
let address = &args[1];
let api_key = args.get(2);
println!("Connecting to ESPHome device at {}", address);
let mut builder = EspHomeClient::builder().address(address);
if let Some(key) = api_key {
builder = builder.key(key);
}
let mut client = builder.connect().await?;
println!("Connected successfully!");
let mut sensors: HashMap<u32, String> = HashMap::new();
client.try_write(ListEntitiesRequest {}).await?;
client.try_write(SubscribeStatesRequest {}).await?;
println!("\n=== Monitoring Sensors ===");
println!("Press Ctrl+C to stop\n");
loop {
let response = client.try_read().await?;
match response {
EspHomeMessage::ListEntitiesSensorResponse(sensor) => {
sensors.insert(sensor.key, sensor.name.clone());
println!(
"[Sensor Discovered] {} - {} ({})",
sensor.name, sensor.unit_of_measurement, sensor.device_class
);
}
EspHomeMessage::SensorStateResponse(state) => {
if let Some(sensor_name) = sensors.get(&state.key) {
if state.missing_state {
println!("[{}] State missing", sensor_name);
} else {
println!("[{}] {:.2}", sensor_name, state.state);
}
} else {
println!("[Unknown Sensor {}] {:.2}", state.key, state.state);
}
}
EspHomeMessage::ListEntitiesDoneResponse(_) => {
println!("\n--- All entities listed ---\n");
}
_ => {
}
}
}
}