From b4967bfe68aad5afcad8d0007bd788fa03d22542 Mon Sep 17 00:00:00 2001 From: Simmon Yau Date: Fri, 7 Mar 2025 05:15:53 -0500 Subject: [PATCH] [ipcamera] Add reboot action for Reolink ipcamera (#18337) * Add reboot channel for Reolink ipcam Signed-off-by: Simmon Yau --- bundles/org.openhab.binding.ipcamera/README.md | 10 ++++++++++ .../binding/ipcamera/internal/IpCameraActions.java | 13 +++++++++++++ .../binding/ipcamera/internal/ReolinkHandler.java | 10 ++++++++++ .../ipcamera/internal/handler/IpCameraHandler.java | 11 +++++++++++ 4 files changed, 44 insertions(+) diff --git a/bundles/org.openhab.binding.ipcamera/README.md b/bundles/org.openhab.binding.ipcamera/README.md index 63c3231861..1b844fec53 100644 --- a/bundles/org.openhab.binding.ipcamera/README.md +++ b/bundles/org.openhab.binding.ipcamera/README.md @@ -703,6 +703,16 @@ then end ``` +## How To Reboot Camera +``` +rule "Reboot Camera At 12:00 AM" +when + Time cron "0 0 0 ? *" +then + getActions("ipcamera", "ipcamera:reolink:1a40bbe041").reboot() +end +``` + ## HABpanel This section is about how to get things working in HABpanel. diff --git a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/IpCameraActions.java b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/IpCameraActions.java index d7e5f30fb8..7b864df29e 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/IpCameraActions.java +++ b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/IpCameraActions.java @@ -76,4 +76,17 @@ public class IpCameraActions implements ThingActions { public static void recordGIF(ThingActions actions, @Nullable String filename, int secondsToRecord) { ((IpCameraActions) actions).recordGIF(filename, secondsToRecord); } + + @RuleAction(label = "reboot", description = "Reboot camera") + public void reboot() { + logger.debug("Rebooting camera."); + IpCameraHandler localHandler = handler; + if (localHandler != null) { + localHandler.reboot(); + } + } + + public static void reboot(@Nullable ThingActions actions) { + ((IpCameraActions) actions).reboot(); + } } diff --git a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/ReolinkHandler.java b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/ReolinkHandler.java index 30676c6c1f..16ad4ada72 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/ReolinkHandler.java +++ b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/ReolinkHandler.java @@ -322,6 +322,12 @@ public class ReolinkHandler extends ChannelDuplexHandler { ipCameraHandler.setChannelState(CHANNEL_ENABLE_RECORDINGS, OnOffType.ON); } break; + case "/api.cgi?cmd=Reboot": + // This handles reboot action response. + if (!content.contains("\"rspCode\" : 200")) { + ipCameraHandler.logger.warn("Reboot failed:\n{}", content); + } + break; default: // ignore responses from all Setxx commands if (!cutDownURL.startsWith("/cgi-bin/api.cgi?cmd=Set") @@ -589,4 +595,8 @@ public class ReolinkHandler extends ChannelDuplexHandler { public List getLowPriorityRequests() { return List.of(); } + + public void reboot() { + ipCameraHandler.sendHttpPOST("/api.cgi?cmd=Reboot" + ipCameraHandler.reolinkAuth, "[{\"cmd\":\"Reboot\"}]"); + } } diff --git a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/handler/IpCameraHandler.java b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/handler/IpCameraHandler.java index f80a3e9c4d..549df320eb 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/handler/IpCameraHandler.java +++ b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/handler/IpCameraHandler.java @@ -1059,6 +1059,17 @@ public class IpCameraHandler extends BaseThingHandler { setChannelState(CHANNEL_RECORDING_GIF, DecimalType.valueOf(new String("" + seconds))); } + public void reboot() { + switch (thing.getThingTypeUID().getId()) { + case REOLINK_THING: + ReolinkHandler reolinkHandler = new ReolinkHandler(getHandle()); + reolinkHandler.reboot(); + break; + default: + logger.warn("Reboot is not yet supported for ipcamera type {}", thing.getThingTypeUID().getId()); + } + } + private void getReolinkToken() { sendHttpPOST("/api.cgi?cmd=Login", "[{\"cmd\":\"Login\", \"param\":{ \"User\":{ \"Version\": \"0\", \"userName\":\""