From d2e37ebfbf4e9b03ed3ff0a69dcb6a17f50e3887 Mon Sep 17 00:00:00 2001 From: Bo Jeanes Date: Sat, 10 Sep 2022 08:44:16 +1000 Subject: [PATCH] Publish connection errors to MQTT Also move `raw` debug output to console output, hex-formatted. --- modbus-mqtt/src/modbus/connection.rs | 13 +++++++++++-- modbus-mqtt/src/modbus/register.rs | 22 +++++++++------------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/modbus-mqtt/src/modbus/connection.rs b/modbus-mqtt/src/modbus/connection.rs index 30d3e92..387c6bd 100644 --- a/modbus-mqtt/src/modbus/connection.rs +++ b/modbus-mqtt/src/modbus/connection.rs @@ -49,8 +49,14 @@ pub(crate) async fn run( let _ = connection_is_ready.send(()); - if let Err(error) = conn.run().await { + let result = conn.run().await; + + if let Err(error) = result { error!(?error, "Modbus connection failed"); + mqtt.publish("state", "errorered").await.unwrap(); + mqtt.publish("last_error", format!("{error:?}")) + .await + .unwrap(); tokio::time::sleep(std::time::Duration::from_secs(current_wait as u64)) .await; @@ -73,7 +79,10 @@ pub(crate) async fn run( } }); - is_connection_ready.changed().await; + is_connection_ready + .changed() + .await + .map_err(|_| Error::RecvError)?; Ok(handle) } diff --git a/modbus-mqtt/src/modbus/register.rs b/modbus-mqtt/src/modbus/register.rs index c24a601..53b114b 100644 --- a/modbus-mqtt/src/modbus/register.rs +++ b/modbus-mqtt/src/modbus/register.rs @@ -31,21 +31,17 @@ impl Monitor { loop { interval.tick().await; if let Ok(words) = self.read().await { - debug!(address=%self.register.address, "type"=?self.register.register_type, ?words); - - #[cfg(feature = "raw")] - self.mqtt - .publish("raw", serde_json::to_vec(&words).unwrap()) - .await - .unwrap(); - let value = self.register.parse_words(&words); + let value = serde_json::to_string(&value).unwrap(); - if let Err(error) = self - .mqtt - .publish("state", serde_json::to_vec(&value).unwrap()) - .await - { + debug!( + address=%self.register.address, + "type"=?self.register.register_type, + %value, + raw=%format!("{:04x?}", &words), + ); + + if let Err(error) = self.mqtt.publish("state", value).await { warn!(?error); break; }