use chrono::{Datelike, Timelike};
use std::time::Duration;
use tokio::time::sleep;
use knust::protocol::address::{GroupAddress, IndividualAddress};
use knust::{ConnectionConfig, ConnectionType, Knx};
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::init();
let config = ConnectionConfig {
connection_type: ConnectionType::Tunneling,
gateway_ip: Some("192.168.1.100".parse()?),
individual_address: IndividualAddress::new(1, 1, 240),
..Default::default()
};
let knx = Knx::new(config).await?;
knx.connect().await?;
let time_address = GroupAddress::from_parts(1, 4, 1)?;
let date_address = GroupAddress::from_parts(1, 4, 2)?;
println!("Sending current date and time to KNX bus...");
let now = std::time::SystemTime::now();
let datetime = chrono::DateTime::<chrono::Local>::from(now);
println!(
"Current date/time: {}",
datetime.format("%Y-%m-%d %H:%M:%S")
);
println!("Sending time to {time_address}...");
let time_bytes = [
((datetime.weekday().num_days_from_monday() as u8) << 5) | (datetime.hour() as u8),
datetime.minute() as u8,
datetime.second() as u8,
];
println!(
" Time bytes: {:02X} {:02X} {:02X}",
time_bytes[0], time_bytes[1], time_bytes[2]
);
sleep(Duration::from_millis(500)).await;
println!("Sending date to {date_address}...");
let date_bytes = [
datetime.day() as u8,
datetime.month() as u8,
(datetime.year() - 1900) as u8,
];
println!(
" Date bytes: {:02X} {:02X} {:02X}",
date_bytes[0], date_bytes[1], date_bytes[2]
);
knx.disconnect().await?;
println!("DateTime example completed successfully!");
println!("Note: Actual DateTime device and telegram sending requires implementation");
Ok(())
}