Added mechanism to prevent false positives
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Dreaded_X 2023-08-15 18:08:27 +02:00
parent bb131f2b1a
commit 27ef78e132
Signed by: Dreaded_X
GPG Key ID: FA5F485356B0D2D4
3 changed files with 26 additions and 10 deletions

View File

@ -95,4 +95,4 @@ lights = { lights = ["hallway_light"], timeout = 60 }
[devices.bathroom_washer] [devices.bathroom_washer]
type = "Washer" type = "Washer"
topic = "zigbee2mqtt/bathroom/washer" topic = "zigbee2mqtt/bathroom/washer"
threshold = 1.2 threshold = 1

View File

@ -95,4 +95,4 @@ lights = { lights = ["hallway_light"], timeout = 10 }
[devices.bathroom_washer] [devices.bathroom_washer]
type = "Washer" type = "Washer"
topic = "zigbee2mqtt/bathroom/washer" topic = "zigbee2mqtt/bathroom/washer"
threshold = 1.2 threshold = 1

View File

@ -29,7 +29,7 @@ pub struct Washer {
event_channel: EventChannel, event_channel: EventChannel,
threshold: f32, threshold: f32,
running: bool, running: isize,
} }
#[async_trait] #[async_trait]
@ -49,7 +49,7 @@ impl CreateDevice for Washer {
mqtt: config.mqtt, mqtt: config.mqtt,
event_channel: event_channel.clone(), event_channel: event_channel.clone(),
threshold: config.threshold, threshold: config.threshold,
running: false, running: 0,
}) })
} }
} }
@ -60,6 +60,11 @@ impl Device for Washer {
} }
} }
// The washer needs to have a power draw above the theshold multiple times before the washer is
// actually marked as running
// This helps prevent false positives
const HYSTERESIS: isize = 3;
#[async_trait] #[async_trait]
impl OnMqtt for Washer { impl OnMqtt for Washer {
fn topics(&self) -> Vec<&str> { fn topics(&self) -> Vec<&str> {
@ -75,13 +80,18 @@ impl OnMqtt for Washer {
} }
}; };
if self.running && power < self.threshold { debug!(id = self.identifier, power, "Washer state update");
if power < self.threshold && self.running >= HYSTERESIS {
// The washer is done running
debug!( debug!(
id = self.identifier, id = self.identifier,
power, self.threshold, "Washer is done" power,
threshold = self.threshold,
"Washer is done"
); );
self.running = false; self.running = 0;
let notification = Notification::new() let notification = Notification::new()
.set_title("Laundy is done") .set_title("Laundy is done")
.set_message("Don't forget to hang it!") .set_message("Don't forget to hang it!")
@ -97,13 +107,19 @@ impl OnMqtt for Washer {
{ {
warn!("There are no receivers on the event channel"); warn!("There are no receivers on the event channel");
} }
} else if !self.running && power >= self.threshold { } else if power < self.threshold {
// Prevent false positives
self.running = 0;
} else if power >= self.threshold && self.running < HYSTERESIS {
// Washer could be starting
debug!( debug!(
id = self.identifier, id = self.identifier,
power, self.threshold, "Washer is starting" power,
threshold = self.threshold,
"Washer is starting"
); );
self.running = true self.running += 1;
} }
} }
} }