Added third parameter: MQTT server

This commit is contained in:
Ollo 2025-04-30 21:46:53 +02:00
parent fbdf1ea24b
commit a0e18c1a7d

View File

@ -387,107 +387,25 @@ fn main() -> ExitCode {
2 => {
let ip = &args[1];
let mut device_online = check_connection(ip.to_string());
if !device_online {
println!("{} not online", ip);
// return ExitCode::FAILURE;
}
let receiver = openweathermap::init_forecast("Mannheim",
"metric",
"de",
"978882ab9dd05e7122ff2b0aef2d3e55",
60,1);
let mut last_data = Option::None;
// Test Webcrawler for public transportataion
let mut straba_res = straba::fetch_data(Some(true));
println!("{:?} {:?}s", straba_res.outbound_station, straba_res.outbound_diff);
println!("{:?} {:?}s", straba_res.inbound_station , straba_res.inbound_diff);
// Initialize MQTT client from MQTT_BROKER env var (else disabled)
let mqtt_client: Option<Client> = {
// Read broker URL from environment
let broker = match std::env::var("MQTT_BROKER") {
Ok(val) if !val.is_empty() => val,
_ => {
eprintln!("Environment variable MQTT_BROKER not set or empty, MQTT disabled");
String::new()
}
};
if broker.is_empty() {
None
} else {
let create_opts = CreateOptionsBuilder::new()
.server_uri(&broker)
.client_id("ledboard_client")
.finalize();
match Client::new(create_opts) {
Ok(cli) => {
let conn_opts = ConnectOptionsBuilder::new()
.keep_alive_interval(Duration::from_secs(20))
.clean_session(true)
.finalize();
match cli.connect(conn_opts) {
Ok(_) => Some(cli),
Err(e) => {
eprintln!("Failed to connect to MQTT broker '{}': {}", broker, e);
None
}
}
}
Err(e) => {
eprintln!("Failed to create MQTT client for '{}': {}", broker, e);
None
}
}
// Read broker URL from environment
let broker = match std::env::var("MQTT_BROKER") {
Ok(val) if !val.is_empty() => val,
_ => {
eprintln!("Environment variable MQTT_BROKER not set or empty, MQTT disabled");
String::new()
}
};
// Render start
send_package(ip.to_string(), &last_data, &straba_res);
loop {
let st_now = SystemTime::now();
let seconds = st_now.duration_since(UNIX_EPOCH).unwrap().as_secs();
let delay = time::Duration::from_millis(500);
thread::sleep(delay);
// Only request, if the device is present
if device_online == true {
let answer = openweathermap::update_forecast(&receiver);
match answer {
Some(_) => {
last_data = answer;
}
None => {
}
}
}
return main_function(ip, Some(broker))
if (straba_res.request_time + 50) < seconds as i64 {
device_online = check_connection(ip.to_string());
// request once a minute new data
if device_online == true {
straba_res = straba::fetch_data(None);
println!("Update {:?} {:?}s", straba_res.outbound_station, straba_res.outbound_diff);
println!("Update {:?} {:?}s", straba_res.inbound_station , straba_res.inbound_diff);
}
}
if device_online == true {
// Render new image
send_package(ip.to_string(), &last_data, &straba_res);
// Publish data to MQTT
}
if let Some(ref client) = mqtt_client {
publish_to_mqtt(client, &last_data, &straba_res);
}
}
}
// two argument passed
3 => {
let ip = &args[1];
let mqtt = &args[2];
return main_function( ip,
Some(mqtt.to_string())
);
}
// all the other cases
_ => {
@ -497,3 +415,100 @@ fn main() -> ExitCode {
}
}
}
fn main_function(ip: &String, mqttBroker: Option<String>) -> ExitCode {
let mut device_online: bool = check_connection(ip.to_string());
if !device_online {
println!("{} not online", ip);
return ExitCode::FAILURE;
}
let receiver = openweathermap::init_forecast("Mannheim",
"metric",
"de",
"978882ab9dd05e7122ff2b0aef2d3e55",
60,1);
let mut last_data = Option::None;
// Test Webcrawler for public transportataion
let mut straba_res = straba::fetch_data(Some(true));
println!("{:?} {:?}s", straba_res.outbound_station, straba_res.outbound_diff);
println!("{:?} {:?}s", straba_res.inbound_station , straba_res.inbound_diff);
// Initialize MQTT client from MQTT_BROKER env var (else disabled)
let mqtt_client: Option<Client> = {
if mqttBroker.is_none() {
None
} else if mqttBroker.is_some() {
let create_opts = CreateOptionsBuilder::new()
.server_uri(mqttBroker.clone().unwrap())
.client_id("ledboard_client")
.finalize();
match Client::new(create_opts) {
Ok(cli) => {
let conn_opts = ConnectOptionsBuilder::new()
.keep_alive_interval(Duration::from_secs(20))
.clean_session(true)
.finalize();
match cli.connect(conn_opts) {
Ok(_) => Some(cli),
Err(e) => {
eprintln!("Failed to connect to MQTT broker '{}': {}", mqttBroker.clone().unwrap(), e);
None
}
}
}
Err(e) => {
eprintln!("Failed to create MQTT client for '{}': {}", mqttBroker.clone().unwrap(), e);
None
}
}
} else {
None
}
};
// Render start
send_package(ip.to_string(), &last_data, &straba_res);
loop {
let st_now = SystemTime::now();
let seconds = st_now.duration_since(UNIX_EPOCH).unwrap().as_secs();
let delay = time::Duration::from_millis(500);
thread::sleep(delay);
// Only request, if the device is present
if device_online == true {
let answer = openweathermap::update_forecast(&receiver);
match answer {
Some(_) => {
last_data = answer;
}
None => {
}
}
}
if (straba_res.request_time + 50) < seconds as i64 {
device_online = check_connection(ip.to_string());
// request once a minute new data
if device_online == true {
straba_res = straba::fetch_data(None);
println!("Update {:?} {:?}s", straba_res.outbound_station, straba_res.outbound_diff);
println!("Update {:?} {:?}s", straba_res.inbound_station , straba_res.inbound_diff);
}
}
if device_online == true {
// Render new image
send_package(ip.to_string(), &last_data, &straba_res);
// Publish data to MQTT
}
if let Some(ref client) = mqtt_client {
publish_to_mqtt(client, &last_data, &straba_res);
}
}
}