From a750a67d17de2aa89757971d80261a20b3fd7c4c Mon Sep 17 00:00:00 2001
From: lilly
Date: Wed, 22 Jul 2026 19:47:36 +0200
Subject: [PATCH 1/3] add show-locks to usage string
---
ssh-cli/src/main.rs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ssh-cli/src/main.rs b/ssh-cli/src/main.rs
index 2c044ef..5257b49 100644
--- a/ssh-cli/src/main.rs
+++ b/ssh-cli/src/main.rs
@@ -36,7 +36,7 @@ async fn main() -> eyre::Result<()> {
"dooris-over-ssh: Your personal door assistant with an extra serving of chaos"
);
println!(
- "Usage: ssh dooris@dooris.ccchh.net help | lock [wait|nowait] | unlock [wait|nowait]"
+ "Usage: ssh dooris@dooris.ccchh.net [wait|nowait] | unlock [wait|nowait]>"
);
println!();
println!("Commands:");
From d0a865e85ac53135c587ffed67cd7a7659ab49b4 Mon Sep 17 00:00:00 2001
From: lilly
Date: Thu, 23 Jul 2026 14:13:30 +0200
Subject: [PATCH 2/3] correct open/close wording which was incosistent
---
ssh-cli/src/main.rs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/ssh-cli/src/main.rs b/ssh-cli/src/main.rs
index 5257b49..b0b2904 100644
--- a/ssh-cli/src/main.rs
+++ b/ssh-cli/src/main.rs
@@ -52,7 +52,7 @@ async fn main() -> eyre::Result<()> {
" Also takes an additional parameter of \"wait\" or \"nowait\"which dictates"
);
println!(" whether the CLI exit as soon as the lock operation is queued or whether");
- println!(" it waits until the lock status changes to open.");
+ println!(" it waits until the lock status changes to closed.");
println!(" Defaults to \"wait\" if not specified.");
println!();
println!(" unlock [wait|nowait] -> Unlocks the lock identified with .");
@@ -60,7 +60,7 @@ async fn main() -> eyre::Result<()> {
" Also takes an additional parameter of \"wait\" or \"nowait\"which dictates"
);
println!(" whether the CLI exit as soon as the lock operation is queued or whether");
- println!(" it waits until the lock status changes to closed.");
+ println!(" it waits until the lock status changes to open.");
println!(" Defaults to \"wait\" if not specified.");
exit(0);
}
@@ -90,7 +90,7 @@ async fn main() -> eyre::Result<()> {
let api = ApiClient::new_from_env()?;
let lock = find_lock(&api, &lock_name).await?;
- println!("dooris at your service, locking {} now…", lock.name);
+ println!("dooris at your service, unlocking {} now…", lock.name);
api.operate_lock(&lock.id, DesiredLockState::OPEN).await?;
if wait_until_done {
From 5850cff5367b0a46f2098aabddf8d51895aba524 Mon Sep 17 00:00:00 2001
From: lilly
Date: Thu, 23 Jul 2026 14:19:29 +0200
Subject: [PATCH 3/3] display lock warnings on every operation not just
show-locks
---
ssh-cli/src/api_models.rs | 3 +--
ssh-cli/src/main.rs | 42 ++++++++++++++++++++++++++++++---------
2 files changed, 34 insertions(+), 11 deletions(-)
diff --git a/ssh-cli/src/api_models.rs b/ssh-cli/src/api_models.rs
index 95c2a70..2f90b7a 100644
--- a/ssh-cli/src/api_models.rs
+++ b/ssh-cli/src/api_models.rs
@@ -12,8 +12,7 @@ pub struct ApiLock {
#[derive(Debug, Eq, PartialEq, Hash, Deserialize)]
pub struct ApiLockStatus {
pub is_unreachable: bool,
- #[serde(default)]
- pub is_low_batteray: bool,
+ pub is_low_battery: bool,
pub is_error_jammed: bool,
pub lock_target_level: LockTargetLevel,
pub lock_state: LockState,
diff --git a/ssh-cli/src/main.rs b/ssh-cli/src/main.rs
index b0b2904..0f891cb 100644
--- a/ssh-cli/src/main.rs
+++ b/ssh-cli/src/main.rs
@@ -72,6 +72,7 @@ async fn main() -> eyre::Result<()> {
let lock = find_lock(&api, &lock_name).await?;
println!("dooris at your service, locking {} now…", lock.name);
+ print_lock_warnings(&lock);
api.operate_lock(&lock.id, DesiredLockState::CLOSED).await?;
if wait_until_done {
@@ -91,6 +92,7 @@ async fn main() -> eyre::Result<()> {
let lock = find_lock(&api, &lock_name).await?;
println!("dooris at your service, unlocking {} now…", lock.name);
+ print_lock_warnings(&lock);
api.operate_lock(&lock.id, DesiredLockState::OPEN).await?;
if wait_until_done {
@@ -108,15 +110,7 @@ async fn main() -> eyre::Result<()> {
for i_lock in locks.iter() {
println!(">> {}", i_lock.name);
- if i_lock.status.is_unreachable {
- println!(" !!! Lock is currently unreachable !!!");
- }
- if i_lock.status.is_low_batteray {
- println!(" !!! Lock has low battery !!!");
- }
- if i_lock.status.is_error_jammed {
- println!(" !!! Lock is jammed !!!");
- }
+ print_lock_warnings(&lock);
println!(" State: {:?}", i_lock.status.lock_state);
println!(" Desired State: {:?}", i_lock.status.lock_target_level);
println!(" Acitivty: {:?}", i_lock.status.activity_state);
@@ -164,3 +158,33 @@ async fn wait_for_lock_state(
Ok(())
}
+
+/// Display big warnings if the lock is in an error state like jammed/disconnected/low battery
+fn print_lock_warnings(lock: &ApiLock) {
+ let has_any_error =
+ lock.status.is_unreachable || lock.status.is_low_battery || lock.status.is_error_jammed;
+
+ if has_any_error {
+ println!(" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+ }
+
+ if lock.status.is_unreachable {
+ println!(" !!! !!!");
+ println!(" !!! Lock is currently unreachable !!!");
+ println!(" !!! !!!");
+ }
+ if lock.status.is_low_battery {
+ println!(" !!! !!!");
+ println!(" !!! Lock has low battery !!!");
+ println!(" !!! !!!");
+ }
+ if lock.status.is_error_jammed {
+ println!(" !!! !!!");
+ println!(" !!! Lock is jammed !!!");
+ println!(" !!! !!!");
+ }
+
+ if has_any_error {
+ println!(" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+ }
+}