From 37dac824b4da9f6c87f22af22641c1836bce0b88 Mon Sep 17 00:00:00 2001 From: Thomas Burri Date: Tue, 20 Jun 2023 08:30:54 +0200 Subject: [PATCH 1/4] Added connection check via IdleStateHandler events for sent onvif requests. Also checking connect errors and setting new states connectError or refusedError accordingly. On connect, only one request is sent to have less parallel actions in case of reconnect, timeout. Moved GetCapabilities call to GetSystemDateAndTime response handler part. Added support to disable automatic polling at startup. Signed-off-by: Thomas Burri --- .../ipcamera/internal/CameraConfig.java | 5 ++ .../internal/handler/IpCameraHandler.java | 51 +++++++++++++++---- .../ipcamera/internal/onvif/OnvifCodec.java | 17 +++++++ .../internal/onvif/OnvifConnection.java | 49 ++++++++++++++++-- .../resources/OH-INF/i18n/ipcamera.properties | 2 + .../resources/OH-INF/thing/thing-types.xml | 9 ++++ 6 files changed, 119 insertions(+), 14 deletions(-) diff --git a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/CameraConfig.java b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/CameraConfig.java index fbbbed579bfc2..c84cb8afbbb24 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/CameraConfig.java +++ b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/CameraConfig.java @@ -30,6 +30,7 @@ public class CameraConfig { public boolean useToken = true; private int onvifMediaProfile; private int pollTime; + private boolean disableSnapshotAtStartup; private String ffmpegInput = ""; private String snapshotUrl = ""; private String mjpegUrl = ""; @@ -169,4 +170,8 @@ public int getGifPreroll() { public int getPort() { return port; } + + public boolean getDisableSnapshotAtStartup() { + return disableSnapshotAtStartup; + } } 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 546d8741a7776..5532946d59ad2 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 @@ -525,6 +525,18 @@ private void checkCameraConnection() { } return;// ffmpeg snapshot stream is still alive } + + // if ONVIF cam also use connection state which is updated by regular messages to camera + if (thing.getThingTypeUID().getId().equals(ONVIF_THING) && snapshotUri.isEmpty()) { + logger.trace("is ONVIF with empty snapshot URI"); + if (onvifCamera.isConnected()) { + logger.trace("cam is connected"); + return; + } else { + logger.trace("cam not connected"); + } + } + // Open a HTTP connection without sending any requests as we do not need a snapshot. Bootstrap localBootstrap = mainBootstrap; if (localBootstrap != null) { @@ -663,7 +675,7 @@ public void operationComplete(@Nullable ChannelFuture future) { break; } ch.writeAndFlush(request); - } else { // an error occured + } else { // an error occurred cameraCommunicationError( "Connection Timeout: Check your IP and PORT are correct and the camera can be reached."); } @@ -1397,10 +1409,16 @@ void snapshotIsFfmpeg() { "Binding has no snapshot url. Will use your CPU and FFmpeg to create snapshots from the cameras RTSP."); bringCameraOnline(); if (!rtspUri.isEmpty()) { - updateImageChannel = false; - ffmpegSnapshotGeneration = true; - setupFfmpegFormat(FFmpegFormat.SNAPSHOT); - updateState(CHANNEL_POLL_IMAGE, OnOffType.ON); + if (!cameraConfig.getDisableSnapshotAtStartup()) { + updateImageChannel = false; + ffmpegSnapshotGeneration = true; + setupFfmpegFormat(FFmpegFormat.SNAPSHOT); + updateState(CHANNEL_POLL_IMAGE, OnOffType.ON); + } else { + logger.debug("snapshot polling with ffmpeg at startup is disabled"); + ffmpegSnapshotGeneration = false; + updateState(CHANNEL_POLL_IMAGE, OnOffType.OFF); + } } else { cameraConfigError("Binding can not find a RTSP url for this camera, please provide a FFmpeg Input URL."); } @@ -1422,9 +1440,16 @@ void pollingCameraConnection() { return; } if (cameraConfig.getOnvifPort() > 0 && !onvifCamera.isConnected()) { + if (onvifCamera.isConnectError()) { + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, "Camera is not reachable"); + } else if (onvifCamera.isRefusedError()) { + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, + "Camera refused connection on ONVIF ports."); + } logger.debug("About to connect to the IP Camera using the ONVIF PORT at IP:{}:{}", cameraConfig.getIp(), cameraConfig.getOnvifPort()); onvifCamera.connect(thing.getThingTypeUID().getId().equals(ONVIF_THING)); + return; } if ("ffmpeg".equals(snapshotUri)) { snapshotIsFfmpeg(); @@ -1561,9 +1586,6 @@ void pollCameraRunnable() { if (!snapshotPolling) { checkCameraConnection(); } - if (!onvifCamera.isConnected()) { - onvifCamera.connect(true); - } break; case INSTAR_THING: if (!snapshotPolling) { @@ -1763,6 +1785,9 @@ public void initialize() { } private void tryConnecting() { + int firstDelay = 4; + int normalDelay = 12; // doesn't make sense to have faster retry than CONNECT_TIMEOUT, which is 10 seconds, if + // camera is off if (!thing.getThingTypeUID().getId().equals(GENERIC_THING) && !thing.getThingTypeUID().getId().equals(DOORBIRD_THING) && cameraConfig.getOnvifPort() > 0) { onvifCamera = new OnvifConnection(this, cameraConfig.getIp() + ":" + cameraConfig.getOnvifPort(), @@ -1770,8 +1795,16 @@ private void tryConnecting() { onvifCamera.setSelectedMediaProfile(cameraConfig.getOnvifMediaProfile()); // Only use ONVIF events if it is not an API camera. onvifCamera.connect(supportsOnvifEvents()); + + if (supportsOnvifEvents()) { + // it takes some time to try to retrieve the ONVIF snapshot and stream URLs and update internal members + // on first connect; if connection lost, doesn't make sense to poll to often + firstDelay = 12; + normalDelay = 30; + } } - cameraConnectionJob = threadPool.scheduleWithFixedDelay(this::pollingCameraConnection, 4, 8, TimeUnit.SECONDS); + cameraConnectionJob = threadPool.scheduleWithFixedDelay(this::pollingCameraConnection, firstDelay, normalDelay, + TimeUnit.SECONDS); } private boolean supportsOnvifEvents() { diff --git a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifCodec.java b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifCodec.java index e9eb38a08436b..e744a9bdace69 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifCodec.java +++ b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifCodec.java @@ -21,6 +21,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.http.HttpContent; import io.netty.handler.codec.http.LastHttpContent; +import io.netty.handler.timeout.IdleStateEvent; import io.netty.util.CharsetUtil; import io.netty.util.ReferenceCountUtil; @@ -59,6 +60,22 @@ public void channelRead(@Nullable ChannelHandlerContext ctx, @Nullable Object ms } } + @Override + public void userEventTriggered(@Nullable ChannelHandlerContext ctx, @Nullable Object evt) throws Exception { + if (ctx == null) { + return; + } + if (evt instanceof IdleStateEvent) { + IdleStateEvent e = (IdleStateEvent) evt; + logger.trace("IdleStateEvent received {}", e.state()); + onvifConnection.setIsConnected(false); + // } + ctx.close(); + } else { + logger.trace("other event received {}", evt); + } + } + @Override public void exceptionCaught(@Nullable ChannelHandlerContext ctx, @Nullable Throwable cause) { if (ctx == null || cause == null) { diff --git a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java index 6930a6e2cc872..3cdc99fa7785e 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java +++ b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java @@ -14,6 +14,7 @@ import static org.openhab.binding.ipcamera.internal.IpCameraBindingConstants.*; +import java.net.ConnectException; import java.net.InetSocketAddress; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; @@ -49,6 +50,7 @@ import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; +import io.netty.channel.ConnectTimeoutException; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; @@ -127,6 +129,8 @@ public static enum RequestType { private String imagingXAddr = "http://" + ipAddress + "/onvif/device_service"; private String ptzXAddr = "http://" + ipAddress + "/onvif/ptz_service"; private String subscriptionXAddr = "http://" + ipAddress + "/onvif/device_service"; + private boolean connectError = false; + private boolean refusedError = false; private boolean isConnected = false; private int mediaProfileIndex = 0; private String snapshotUri = ""; @@ -312,10 +316,13 @@ public void processReply(String message) { } else if (message.contains("GetSystemDateAndTimeResponse")) {// 1st to be sent. connecting.lock(); try { + connectError = false; + refusedError = false; isConnected = true; } finally { connecting.unlock(); } + sendOnvifRequest(requestBuilder(RequestType.GetCapabilities, deviceXAddr)); parseDateAndTime(message); logger.debug("Openhabs UTC dateTime is:{}", getUTCdateTime()); } else if (message.contains("GetCapabilitiesResponse")) {// 2nd to be sent. @@ -324,6 +331,8 @@ public void processReply(String message) { } else if (message.contains("GetProfilesResponse")) {// 3rd to be sent. connecting.lock(); try { + connectError = false; + refusedError = false; isConnected = true; } finally { connecting.unlock(); @@ -552,7 +561,7 @@ public void sendOnvifRequest(HttpRequest request) { @Override public void initChannel(SocketChannel socketChannel) throws Exception { - socketChannel.pipeline().addLast("idleStateHandler", new IdleStateHandler(0, 0, 70)); + socketChannel.pipeline().addLast("idleStateHandler", new IdleStateHandler(20, 20, 20)); socketChannel.pipeline().addLast("HttpClientCodec", new HttpClientCodec()); socketChannel.pipeline().addLast("OnvifCodec", new OnvifCodec(getHandle())); } @@ -567,10 +576,22 @@ public void operationComplete(@Nullable ChannelFuture future) { return; } if (future.isSuccess()) { + connectError = false; Channel ch = future.channel(); ch.writeAndFlush(request); } else { // an error occured - logger.debug("Camera is not reachable on ONVIF port:{} or the port may be wrong.", onvifPort); + if (future.isDone() && !future.isCancelled()) { + Throwable cause = future.cause(); + logger.trace("connect failed - cause {}", cause.getMessage()); + if (cause instanceof ConnectTimeoutException) { + logger.debug("Camera is not reachable on IP {}", ipAddress); + connectError = true; + } else if ((cause instanceof ConnectException) + && cause.getMessage().contains("Connection refused")) { + logger.debug("Camera ONVIF port {} is refused.", onvifPort); + connectError = true; + } + } if (isConnected) { disconnect(); } @@ -913,13 +934,20 @@ public void connect(boolean useEvents) { threadPool = Executors.newScheduledThreadPool(2); sendOnvifRequest(requestBuilder(RequestType.GetSystemDateAndTime, deviceXAddr)); usingEvents = useEvents; - sendOnvifRequest(requestBuilder(RequestType.GetCapabilities, deviceXAddr)); } } finally { connecting.unlock(); } } + public boolean isConnectError() { + return connectError; + } + + public boolean isRefusedError() { + return refusedError; + } + public boolean isConnected() { connecting.lock(); try { @@ -929,6 +957,15 @@ public boolean isConnected() { } } + public void setIsConnected(boolean isConnected) { + connecting.lock(); + try { + this.isConnected = isConnected; + } finally { + connecting.unlock(); + } + } + private void cleanup() { if (!isConnected && !mainEventLoopGroup.isShuttingDown()) { try { @@ -947,9 +984,9 @@ private void cleanup() { public void disconnect() { connecting.lock();// Lock out multiple disconnect()/connect() attempts as we try to send Unsubscribe. try { - isConnected = false;// isConnected is not thread safe, connecting.lock() used as fix. if (bootstrap != null) { - if (usingEvents && !mainEventLoopGroup.isShuttingDown()) { + if (isConnected && usingEvents && !mainEventLoopGroup.isShuttingDown()) { + // Only makes sense to send if connected // Some cameras may continue to send events even when they can't reach a server. sendOnvifRequest(requestBuilder(RequestType.Unsubscribe, subscriptionXAddr)); } @@ -958,6 +995,8 @@ public void disconnect() { } else { cleanup(); } + + isConnected = false;// isConnected is not thread safe, connecting.lock() used as fix. } finally { connecting.unlock(); } diff --git a/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/i18n/ipcamera.properties b/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/i18n/ipcamera.properties index d644dde8ec5e5..0059676306cee 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/i18n/ipcamera.properties +++ b/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/i18n/ipcamera.properties @@ -530,6 +530,8 @@ thing-type.config.ipcamera.onvif.password.label = Password thing-type.config.ipcamera.onvif.password.description = Enter the password for your camera. Leave blank if your camera does not use one. thing-type.config.ipcamera.onvif.pollTime.label = Poll Time thing-type.config.ipcamera.onvif.pollTime.description = Most features are made on demand and not polled, but some features require a regular snapshot to work. Default is "1000" which is 1 second. +thing-type.config.ipcamera.onvif.disableSnapshotAtStartup.lable = Disable Automatic Snapshot-Polling at Startup +thing-type.config.ipcamera.onvif.disableSnapshotAtStartup.description = For cameras without Snapshot URL, a ffmpeg process is automatically started for creating snapshots. Set this flag to true, if you don't want it. thing-type.config.ipcamera.onvif.port.label = Port for HTTP thing-type.config.ipcamera.onvif.port.description = This port will be used for HTTP calls for fetching the snapshot and alarm states. thing-type.config.ipcamera.onvif.ptzContinuous.label = Use Continuous PTZ diff --git a/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/thing/thing-types.xml b/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/thing/thing-types.xml index d2f687f79881d..99173f5389d95 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/thing/thing-types.xml +++ b/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/thing/thing-types.xml @@ -566,6 +566,15 @@ true + + + For cameras without Snapshot URL, a ffmpeg process is automatically started for creating snapshots. Set + this flag to true, if you don't want it. + + false + true + + Select if you want Relative (false) or Continuous (true) movements. From cf4fddeaee983be4ed9d2bc14fc1c196e38c1539 Mon Sep 17 00:00:00 2001 From: Thomas Burri Date: Mon, 26 Jun 2023 22:46:02 +0200 Subject: [PATCH 2/4] Updates according to comments from Skinah. Removed thing configuration 'disableSnapshotAtStartup' again. Signed-off-by: Thomas Burri --- .../ipcamera/internal/CameraConfig.java | 5 ---- .../internal/handler/IpCameraHandler.java | 24 +++++-------------- .../ipcamera/internal/onvif/OnvifCodec.java | 3 +-- .../internal/onvif/OnvifConnection.java | 22 ++++------------- .../resources/OH-INF/i18n/ipcamera.properties | 2 -- .../resources/OH-INF/thing/thing-types.xml | 9 ------- 6 files changed, 12 insertions(+), 53 deletions(-) diff --git a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/CameraConfig.java b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/CameraConfig.java index c84cb8afbbb24..fbbbed579bfc2 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/CameraConfig.java +++ b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/CameraConfig.java @@ -30,7 +30,6 @@ public class CameraConfig { public boolean useToken = true; private int onvifMediaProfile; private int pollTime; - private boolean disableSnapshotAtStartup; private String ffmpegInput = ""; private String snapshotUrl = ""; private String mjpegUrl = ""; @@ -170,8 +169,4 @@ public int getGifPreroll() { public int getPort() { return port; } - - public boolean getDisableSnapshotAtStartup() { - return disableSnapshotAtStartup; - } } 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 5532946d59ad2..bcb3fd1ef028f 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 @@ -527,14 +527,8 @@ private void checkCameraConnection() { } // if ONVIF cam also use connection state which is updated by regular messages to camera - if (thing.getThingTypeUID().getId().equals(ONVIF_THING) && snapshotUri.isEmpty()) { - logger.trace("is ONVIF with empty snapshot URI"); - if (onvifCamera.isConnected()) { - logger.trace("cam is connected"); - return; - } else { - logger.trace("cam not connected"); - } + if (thing.getThingTypeUID().getId().equals(ONVIF_THING) && snapshotUri.isEmpty() && onvifCamera.isConnected()) { + return; } // Open a HTTP connection without sending any requests as we do not need a snapshot. @@ -1409,16 +1403,10 @@ void snapshotIsFfmpeg() { "Binding has no snapshot url. Will use your CPU and FFmpeg to create snapshots from the cameras RTSP."); bringCameraOnline(); if (!rtspUri.isEmpty()) { - if (!cameraConfig.getDisableSnapshotAtStartup()) { - updateImageChannel = false; - ffmpegSnapshotGeneration = true; - setupFfmpegFormat(FFmpegFormat.SNAPSHOT); - updateState(CHANNEL_POLL_IMAGE, OnOffType.ON); - } else { - logger.debug("snapshot polling with ffmpeg at startup is disabled"); - ffmpegSnapshotGeneration = false; - updateState(CHANNEL_POLL_IMAGE, OnOffType.OFF); - } + updateImageChannel = false; + ffmpegSnapshotGeneration = true; + setupFfmpegFormat(FFmpegFormat.SNAPSHOT); + updateState(CHANNEL_POLL_IMAGE, OnOffType.ON); } else { cameraConfigError("Binding can not find a RTSP url for this camera, please provide a FFmpeg Input URL."); } diff --git a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifCodec.java b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifCodec.java index e744a9bdace69..1e398f79c7428 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifCodec.java +++ b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifCodec.java @@ -69,10 +69,9 @@ public void userEventTriggered(@Nullable ChannelHandlerContext ctx, @Nullable Ob IdleStateEvent e = (IdleStateEvent) evt; logger.trace("IdleStateEvent received {}", e.state()); onvifConnection.setIsConnected(false); - // } ctx.close(); } else { - logger.trace("other event received {}", evt); + logger.trace("Other ONVIF netty channel event occured {}", evt); } } diff --git a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java index 3cdc99fa7785e..be01f20e69f45 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java +++ b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java @@ -314,14 +314,7 @@ public void processReply(String message) { } else if (message.contains("RenewResponse")) { sendOnvifRequest(requestBuilder(RequestType.PullMessages, subscriptionXAddr)); } else if (message.contains("GetSystemDateAndTimeResponse")) {// 1st to be sent. - connecting.lock(); - try { - connectError = false; - refusedError = false; - isConnected = true; - } finally { - connecting.unlock(); - } + setIsConnected(true); sendOnvifRequest(requestBuilder(RequestType.GetCapabilities, deviceXAddr)); parseDateAndTime(message); logger.debug("Openhabs UTC dateTime is:{}", getUTCdateTime()); @@ -329,14 +322,7 @@ public void processReply(String message) { parseXAddr(message); sendOnvifRequest(requestBuilder(RequestType.GetProfiles, mediaXAddr)); } else if (message.contains("GetProfilesResponse")) {// 3rd to be sent. - connecting.lock(); - try { - connectError = false; - refusedError = false; - isConnected = true; - } finally { - connecting.unlock(); - } + setIsConnected(true); parseProfiles(message); sendOnvifRequest(requestBuilder(RequestType.GetSnapshotUri, mediaXAddr)); sendOnvifRequest(requestBuilder(RequestType.GetStreamUri, mediaXAddr)); @@ -589,7 +575,7 @@ public void operationComplete(@Nullable ChannelFuture future) { } else if ((cause instanceof ConnectException) && cause.getMessage().contains("Connection refused")) { logger.debug("Camera ONVIF port {} is refused.", onvifPort); - connectError = true; + refusedError = true; } } if (isConnected) { @@ -961,6 +947,8 @@ public void setIsConnected(boolean isConnected) { connecting.lock(); try { this.isConnected = isConnected; + this.connectError = false; + this.refusedError = false; } finally { connecting.unlock(); } diff --git a/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/i18n/ipcamera.properties b/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/i18n/ipcamera.properties index 0059676306cee..d644dde8ec5e5 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/i18n/ipcamera.properties +++ b/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/i18n/ipcamera.properties @@ -530,8 +530,6 @@ thing-type.config.ipcamera.onvif.password.label = Password thing-type.config.ipcamera.onvif.password.description = Enter the password for your camera. Leave blank if your camera does not use one. thing-type.config.ipcamera.onvif.pollTime.label = Poll Time thing-type.config.ipcamera.onvif.pollTime.description = Most features are made on demand and not polled, but some features require a regular snapshot to work. Default is "1000" which is 1 second. -thing-type.config.ipcamera.onvif.disableSnapshotAtStartup.lable = Disable Automatic Snapshot-Polling at Startup -thing-type.config.ipcamera.onvif.disableSnapshotAtStartup.description = For cameras without Snapshot URL, a ffmpeg process is automatically started for creating snapshots. Set this flag to true, if you don't want it. thing-type.config.ipcamera.onvif.port.label = Port for HTTP thing-type.config.ipcamera.onvif.port.description = This port will be used for HTTP calls for fetching the snapshot and alarm states. thing-type.config.ipcamera.onvif.ptzContinuous.label = Use Continuous PTZ diff --git a/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/thing/thing-types.xml b/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/thing/thing-types.xml index 99173f5389d95..d2f687f79881d 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/thing/thing-types.xml +++ b/bundles/org.openhab.binding.ipcamera/src/main/resources/OH-INF/thing/thing-types.xml @@ -566,15 +566,6 @@ true - - - For cameras without Snapshot URL, a ffmpeg process is automatically started for creating snapshots. Set - this flag to true, if you don't want it. - - false - true - - Select if you want Relative (false) or Continuous (true) movements. From 300ce480501fc46d6c8a6fdc44f3929733eaf969 Mon Sep 17 00:00:00 2001 From: Thomas Burri Date: Mon, 11 Sep 2023 21:01:54 +0200 Subject: [PATCH 3/4] Added missing braces. Signed-off-by: Thomas Burri --- .../binding/ipcamera/internal/onvif/OnvifConnection.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java index f629ad74403be..25c24d1b0d35a 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java +++ b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java @@ -592,7 +592,9 @@ public void operationComplete(@Nullable ChannelFuture future) { if (isConnected) { disconnect(); } - }); + } + } + }); } else { logger.debug("ONVIF message not sent as connection is shutting down"); } From bdbbfc4fa8c603816a82558e30310dd74ef4b976 Mon Sep 17 00:00:00 2001 From: Thomas Burri Date: Mon, 11 Sep 2023 21:18:33 +0200 Subject: [PATCH 4/4] Fixed call of sendOnvifRequest (missed to remove one call of requestBuilder). Signed-off-by: Thomas Burri --- .../binding/ipcamera/internal/onvif/OnvifConnection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java index 25c24d1b0d35a..70b830ab394b2 100644 --- a/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java +++ b/bundles/org.openhab.binding.ipcamera/src/main/java/org/openhab/binding/ipcamera/internal/onvif/OnvifConnection.java @@ -315,7 +315,7 @@ public void processReply(String message) { sendOnvifRequest(RequestType.PullMessages, subscriptionXAddr); } else if (message.contains("GetSystemDateAndTimeResponse")) {// 1st to be sent. setIsConnected(true); - sendOnvifRequest(requestBuilder(RequestType.GetCapabilities, deviceXAddr)); + sendOnvifRequest(RequestType.GetCapabilities, deviceXAddr); parseDateAndTime(message); logger.debug("Openhabs UTC dateTime is:{}", getUTCdateTime()); } else if (message.contains("GetCapabilitiesResponse")) {// 2nd to be sent.