IpCamera: New IP Camera Binding

Tags: #<Tag:0x00007f1737730be0> #<Tag:0x00007f1737730b18> #<Tag:0x00007f1737730a28>

There are four different ways to move a camera and not all cameras support all the methods, plus often they appear to have it implemented yet it just won’t work. The best thing to do is fire up onvif device manager and test what and how it all works.

The binding as of the next build supports 3 of the 4 methods and the readme will get updated soon. Presets are the easiest to setup controls for.

FWIW, looks like some sort of auto-correct got you. I suspect you mean AudioMotion, not AudioMutation, although the second could be interesting…

From my openhab.log with a DAHUA Thing Type

2020-06-20 21:16:52.941 [TRACE] [ing.ipcamera.handler.IpCameraHandler] - Sending camera: GET:

New build 2020-06-21 has these changes:

  • Onvif relative movement added, see readme for updated documentation and example.
  • Changes to auto discovery and use an Older Netty version to get closer to a state to merge the binding.
  • Absolute move does not wait till the next poll time anymore to move the camera.

@Kim_Andersen Can you see if your cameras all get detected as a brand/thing type that matches please? If not detected some TRACE to show what needs to change to allow your cameras to correctly detect when using PaperUI’s inbox search feature.

That’s awesome!
Thank you very much for your efforts!
I will cross check with ODM then.

Hi Matt.
It still the same.
Reolink is not beeing discovered. My Dahua is discovered as an Onvif cam.

This is the tracelog:

2020-06-21 15:26:02.355 [DEBUG] [ra.internal.IpCameraDiscoveryService] - <d:XAddrs> was not found in :<?xml version="1.0" encoding="UTF-8"?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsdd="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:wsa5="http://www.w3.org/2005/08/addressing" xmlns:xmime="http://tempuri.org/xmime.xsd" xmlns:xmime5="http://www.w3.org/2005/05/xmlmime" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:wsrfbf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsrfr="http://docs.oasis-open.org/wsrf/r-2" xmlns:ns1="http://www.onvif.org/ver10/actionengine/wsdl" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:ns10="http://www.onvif.org/ver10/events/wsdl/PullPointBinding" xmlns:ns11="http://www.onvif.org/ver10/events/wsdl/CreatePullPointBinding" xmlns:ns12="http://www.onvif.org/ver10/events/wsdl/PausableSubscriptionManagerBinding" xmlns:ns13="http://www.onvif.org/ver10/network/wsdl/RemoteDiscoveryBinding" xmlns:ns14="http://www.onvif.org/ver10/network/wsdl/DiscoveryLookupBinding" xmlns:tdn="http://www.onvif.org/ver10/network/wsdl" xmlns:ns3="http://www.onvif.org/ver20/analytics/wsdl/RuleEngineBinding" xmlns:ns4="http://www.onvif.org/ver20/analytics/wsdl/AnalyticsEngineBinding" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:ns5="http://www.onvif.org/ver10/events/wsdl/PullPointSubscriptionBinding" xmlns:ns6="http://www.onvif.org/ver10/events/wsdl/EventBinding" xmlns:ns7="http://www.onvif.org/ver10/events/wsdl/SubscriptionManagerBinding" xmlns:ns8="http://www.onvif.org/ver10/events/wsdl/NotificationProducerBinding" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:ns9="http://www.onvif.org/ver10/events/wsdl/NotificationConsumerBinding" xmlns:tad="http://www.onvif.org/ver10/analyticsdevice/wsdl" xmlns:tds="http://www.onvif.org/v

2020-06-21 15:26:02.357 [TRACE] [ra.internal.IpCameraDiscoveryService] - Discovery packet back from camera:<?xml version="1.0" encoding="utf-8" standalone="yes" ?><s:Envelope xmlns:sc="http://www.w3.org/2003/05/soap-encoding" xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:dn="http://www.onvif.org/ver10/network/wsdl" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing"><s:Header><a:MessageID>uuid:5eaac6ab-53ca-478e-8859-cde1b7deac17</a:MessageID><a:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</a:To><a:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/ProbeMatches</a:Action><a:RelatesTo>uuid:10b76d6d-32dd-48fa-9209-72a9eef65c92</a:RelatesTo></s:Header><s:Body><d:ProbeMatches><d:ProbeMatch><a:EndpointReference><a:Address>uuid:2e67f88c-99ce-44d4-8341-3ea5be3d138a</a:Address></a:EndpointReference><d:Types>dn:NetworkVideoTransmitter tds:Device</d:Types><d:Scopes>onvif://www.onvif.org/location/country/English onvif://www.onvif.org/name/XR onvif://www.onvif.org/hardware/IPC-HDW4631C-A onvif://www.onvif.org/Profile/Streaming onvif://www.onvif.org/type/Network_Video_Transmitter onvif://www.onvif.org/extension/unique_identifier</d:Scopes><d:XAddrs></d:XAddrs><d:MetadataVersion>1</d:MetadataVersion></d:ProbeMatch></d:ProbeMatches></s:Body></s:Envelope>

2020-06-21 15:26:02.359 [INFO ] [ra.internal.IpCameraDiscoveryService] - Camera found at xAddr:

2020-06-21 15:26:02.360 [DEBUG] [ra.internal.IpCameraDiscoveryService] - Camera IP: and ONVIF PORT:80

2020-06-21 15:26:02.479 [TRACE] [ra.internal.IpCameraDiscoveryService] - Cameras Login page is:<!DOCTYPE html> <html> <head> <title></title> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <script src="jsBase/lib/jquery.js?version=@WebVersion@"></script> <script src="jsBase/widget/js/jquery.ui.core.js?version=@WebVersion@"></script> <script src="jsBase/widget/js/jquery.ui.widget.js?version=@WebVersion@"></script> <script>jQuery.noConflict();</script> <script src="jsBase/lib/jquery.pubsub.js?version=@WebVersion@"></script> <script src="jsBase/lib/m.js?version=@WebVersion@"></script> <script src="jsBase/lib/more.js?version=@WebVersion@"></script> <script src="jsBase/common/extend.js?version=@WebVersion@"></script> <script type="text/javascript">// forced to add parameters,ensure the FF image loading do not fail    var cssList = ['css/reset.css', 'css/ui.css', 'css/custom.css', 'css/skin.css', 'css/main.css', 'css/alarm.css', 'css/set.css', 'css/resize.css', 'css/playback.css', 'jsBase/widget/css/ui.css', 'jsBase/widget/css/skin.css', 'css/fn.css', 'css/thermal.css'];    for (var i = 0; i < cssList.length; i++) {        var lt = "?WebVersion=@WebVersion@"        //To solve the problem of css loading in ie7 8        if (!(jQuery.browser.ie7 || jQuery.browser.ie8)) {            if (location.href.split('?')[1]) {                lt += "&" + location.href.split('?')[1];            }        }        var cssNode = document.createElement("link");        cssNode.rel = 'stylesheet';        cssNode.type = "text/css";        cssNode.media = 'screen';        cssNode.href = cssList[i] + lt;        document.head.appendChild(cssNode);    }    cssList = null, lt = null;</script> </head> <body>  <div id="login" class="login"> <div class="login-container"> <div class="login-content"> <div id="login_logo"></div> <div class="login-inputbox fn-clear"> <form autocomplete="off"> <div class="login-input-item"> <label t="w_Username+:" class="login-input-title">  </label> <input type="text" id="login_user" class="fn-width163 fn-mart3"> </div> <div class="login-input-item"> <label class="login-input-title" t="w_password+:">  </label> <input id="login_psw" type="password" maxlength="64" class="fn-width163 fn-mart3"> <a btn-for="onFindPwd" class="fn-hide" t="w_forgetPassword" style="cursor: pointer" href="javascript:;">  </a> </div>  <div class="login-input-item fn-hide"> <label class="ui-label fn-padl70"></label> <div class="fn-left fn-width165"> <ul class="ui-pwd-strength"> <li class="weak" t="w_Weak">  </li> <li class="middle" t="w_Middle">  </li> <li class="strong" t="w_Strong">  </li> </ul> </div> </div> <div class="login-input-item" id="login_type"> <label class="login-input-title" t="w_userType+:">  </label> <select class="fn-width169" id="login_selType"> <option value="Direct" t="w_localUser">  </option> <option value="ActiveDirectory" t="w_ADUser">  </option> <option value="LDAP" t="w_LDAPUser">  </option> </select> </div> <div class="ui-button-box login-btnbox"> <a btn-for="onLogin" t="w_Login" class="u-button fn-width80" href="javascript:;">  </a> <a btn-for="onCancel" t="Cancel" class="u-button fn-width80" href="javascript:;">  </a> </div> </form> </div> </div> </div>  <div id="device_init" class="u-dialog fn-width700" style="text-align:left"> <div class="u-dialog-head"> <h1 t="sys.DevInit"></h1> </div> <div class="u-dialog-content fn-clear fn-pad30"> <div class="ui-form-item"> <label class="ui-label fn-width170" t="w_Username">  </label> <div class="fn-left fn-width450"> <span class="ui-text">admin</span> </div> </div> <div class="ui-form-item"> <label class="ui-label fn-width170" t="w_password">  </label> <div> <input type="password" class="fn-mart2 fn-width320" data-pwd="pwdInit" name="newpwd" maxlength="32" onpaste="return false" oncontextmenu="return false"> <span class="u-input-error fn-ib fn-color-red"></span> </div> </div> <div class="ui-form-item"> <label class="ui-label fn-width170"></label> <div class="fn-left fn-width165"> <ul class="ui-pwd-strength"> <li class="weak" t="w_Weak">  </li> <li class="middle" t="w_Middle">  </li> <li class="strong" t="w_Strong">  </li> </ul> </div> </div> <div class="ui-form-item"> <label class="ui-label fn-width170" t="w_Pwdconfirm">  </label> <div> <input type="password" class="fn-mart2 fn-width320" data-pwd="pwdInit" name="newpwdcfm" maxlength="32" onpaste="return false" oncontextmenu="return false"> <span class="u-input-error fn-ib fn-color-red"></span> </div> </div> <div class="ui-form-item"> <label class="ui-label fn-width170">  </label> <div class="fn-left fn-width450"> <span class="ui-text" t="com.PwdTip"></span> </div> </div> <div class="fn-split-line fn-hide" id="devInit_split"></div> <div class="ui-form-item fn-hide" id="devInit_phone_container"> <label class="ui-label fn-width170"> <input type="checkbox" id="devInit_phone_enable"><span t="w_boundPhone"></span> </label> <div class="fn-left fn-width450"> <input type="text" id="devInit_bindPhone" maxlength="11" class="fn-mart2 fn-width320"> <span class="fn-ib" t="com.BindPhoneOrMailTip"></span> <span class="fn-ib fn-color-red"></span> </div> </div> <div class="ui-form-item fn-hide" id="devInit_mail_container"> <label class="ui-label fn-width170"> <input type="checkbox" id="devInit_mail_enable"><span t="sys.BindMail"></span> </label> <div class="fn-left fn-width450"> <input type="text" id="devInit_bindMail" maxlength="63" class="fn-mart2 fn-width320"> <span class="fn-ib" t="com.BindPhoneOrMailTip"></span> <span class="u-input-error fn-ib fn-color-red"></span> </div> </div> <div class="ui-form-item"> <label class="ui-label fn-width170"></label> <div class="fn-left fn-width450"> <div class="u-tip fn-mart4"></div> </div> </div> </div> <div class="u-dialog-foot"> <div class="ui-form-item"> <a class="u-button" data-action="confirm" href="javascript:;" t="w_Confirm">  </a> </div> </div> </div>  <div id="login_find1" class="u-dialog fn-width800"> <div class="u-dialog-head"> <h1 t="w_resetPwd1"></h1> </div> <div class="u-dialog-content fn-clear"> <div id="QR_edition_wrap" class="fn-hide"> <div class="ui-form-item fn-hide"> <label class="ui-label fn-width24" t="w_SN"> </label> <span class="ui-text" id="FP_SN"></span> </div> <div class="ui-form-item"> <label class="ui-label fn-width86" t="w_QRNote">  </label> <div class="fn-left fn-width292" style="background-color: white; margin-left: 20px; margin: 10px" id="FP_QR"></div> <div class="fn-left fn-width281 fn-height252 fn-padl10 fn-mart8" style="padding: 20px 10px; border:1px solid #000"> <div class="ui-form-item"> <label t="sys.ResetNote" class="ui-label fn-bold fn-width281"></label> </div> <div class="ui-form-item"> <p id="QR_ScanNote"></p> </div> </div> </div> <div class="ui-form-item"> <span class="ui-text fn-padl94" id="FP_QRTip"></span> </div> </div> <div id="alter_edition_wrap" class="fn-hide"> <div class="ui-form-item fn-red"> <label class="ui-label fn-padl20" t="w_deviceDate">  </label> <span id="device_date" class="ui-text">2016年10月31日</span> </div> <div class="ui-form-item"> <fieldset class="fn-pad10 fn-marr20 fn-marl20 fn-lineh24 fn-minhei150"> <span t="w_GetSecurityCodeMehtod"></span> </fieldset> </div> </div> <div class="ui-form-item"> <label class="ui-label fn-width86" t="w_InputSecurityCode">  </label> <div class="fn-left fn-width270"> <input type="text" id="security_code" class="fn-mart2 fn-marl5 fn-width610"> </div> </div> </div> <div class="u-dialog-foot"> <div class="ui-form-item"> <a class="u-button" data-action="close" href="javascript:;" t="w_Cancel">  </a> <a class="u-button" data-action="next" href="javascript:;" t="w_NextStep">  </a> </div> </div> </div>  <div id="login_find2" class="u-dialog fn-width800"> <div class="u-dialog-head"> <h1 t="w_resetPwd2"></h1> </div> <div class="u-dialog-content fn-clear fn-height275"> <div class="ui-form-item"> <label class="ui-label fn-padl20" t="w_User">  </label> <span class="ui-text">admin</span> </div> <div class="ui-form-item"> <label class="ui-label fn-padl20" t="w_password">  </label> <div class="fn-left fn-width270"> <input type="password" class="ui-input" data-pwd="resetUser" style="width:260px" maxlength="32" onpaste="return false" oncontextmenu="return false"> <span class="u-input-error fn-ib fn-color-red ui-tip-red"></span> </div> </div> <div class="ui-form-item"> <label class="ui-label fn-padl20"></label> <div class="fn-left fn-width165"> <ul class="ui-pwd-strength"> <li class="weak" t="w_Weak">  </li> <li class="middle" t="w_Middle">  </li> <li class="strong" t="w_Strong">  </li> </ul> </div> </div> <div class="ui-form-item"> <label class="ui-label fn-padl20"> </label> <div class="fn-left fn-width270"> <span class="ui-text" t="com.PwdTip"></span> </div> </div> <div class="ui-form-item"> <label class="ui-label fn-padl20" t="w_Pwdconfirm">  </label> <div class="fn-left fn-width270"> <input type="password" class="ui-input" data-pwd="resetUserCfm" maxlength="32" style="width:260px" onpaste="return false" oncontextmenu="return false"> <span class="u-input-error fn-ib fn-color-red ui-tip-red" id="use_AUserPwdCfmTip"></span> </div> </div> <div class="ui-form-item"> <label class="ui-label fn-padl20"></label> <div class="fn-left fn-width270"> <div class="u-tip fn-mart4"></div> </div> </div> </div> <div class="u-dialog-foot"> <div class="ui-form-item"> <a class="u-button" data-action="close" href="javascript:;" t="w_Cancel">  </a> <a class="u-button" data-action="confirm" href="javascript:;" t="w_Confirm">  </a> </div> </div> </div>  <div id="login_permission1" class="u-dialog fn-width800"> <div class="u-dialog-head"> <h1 t="sys.SoftwareLicence"></h1> </div> <div class="u-dialog-content fn-clear fn-height275 fn-pad30"> <div class="ui-form-item"> <div id="login_permission_container" class="ui-textarea fn-width740 fn-height252" style="background:#E2E2E2"> </div> </div> <div class="ui-form-item"> <label class="ui-checkbox"> <input type="checkbox" name="licence_check"><span t="sys.SoftwareLicenceNoted"></span> </label> </div> </div> <div class="u-dialog-foot"> <div class="ui-form-item"> <a class="u-button" data-action="next" href="javascript:;" t="w_NextStep">  </a> </div> </div> </div>  <div id="login_permission2" class="u-dialog fn-width800"> <div class="u-dialog-head"> <h1 t="sys.CloudAccess"></h1> </div> <div class="u-dialog-content fn-clear fn-height275 fn-pad30"> <div class="ui-form-item"> <label class="ui-checkbox"> <input type="checkbox" name="access_check" checked="true"><span t="sys.CloudAccess"></span> </label> </div> <div class="ui-form-item fn-padl20"> <span class="ui-label fn-width730" t="sys.CloudAccessNote"></span> </div> <div class="ui-form-item fn-padl20"> <div class="fn-left fn-width171" style="display:block;background-color: white; margin-left: 263px; margin-top: 20px" id="Le_QR"></div> </div> <div class="ui-form-item fn-wid100p"> <span class="ui-text fn-wid100p fn-textcenter" t="sys.DownloadLe"></span> </div> </div> <div class="u-dialog-foot"> <div class="ui-form-item"> <a class="u-button" data-action="next" href="javascript:;" t="w_NextStep">  </a> </div> </div> </div>  <div id="login_permission3" class="u-dialog fn-width800"> <div class="u-dialog-head"> <h1 t="sys.RemoteUpgrade"></h1> </div> <div class="u-dialog-content fn-clear fn-height275 fn-pad30"> <div class="ui-form-item"> <label class="ui-checkbox"> <input type="checkbox" name="autocheck_check" checked="true"><span t="sys.Autocheck"></span> </label> </div> <div class="ui-form-item fn-padl20"> <span class="ui-label fn-width730" id="login_online_AutocheckNote"></span> </div> <div class="u-tip fn-mart4 fn-marl20"></div> </div> <div class="u-dialog-foot"> <div class="ui-form-item"> <a class="u-button" data-action="confirm" href="javascript:;" t="w_Confirm">  </a> </div> </div> </div>  <div id="login_modify" class="u-dialog fn-width436"> <div class="u-dialog-head"> <h1 t="firstLoginChgPwd"></h1> <i class="i-close" data-action="close" id="i_close"></i> </div> <div class="u-dialog-content"> <div class="ui-form-item"> <label class="ui-label fn-padl20" t="w_NewPwd">  </label> <div class="fn-left fn-width169"> <input type="password" class="fn-mart2" name="newpwd" maxlength="32" onpaste="return false" oncontextmenu="return false"> <span class="u-input-error fn-color-red"></span> </div> </div> <div class="ui-form-item"> <label class="ui-label fn-padl20"></label> <div class="fn-left fn-width165"> <ul class="ui-pwd-strength"> <li class="weak" t="w_Weak">  </li> <li class="middle" t="w_Middle">  </li> <li class="strong" t="w_Strong">  </li> </ul> </div> </div> <div class="ui-form-item"> <label class="ui-label fn-padl20" t="w_Pwdconfirm">  </label> <div class="fn-left fn-width169"> <input type="password" class="fn-mart2" name="newpwd2" maxlength="32" onpaste="return false" oncontextmenu="return false"> <span id="login_pwd_cfm_tip" class="u-input-error fn-color-red"></span> </div> </div> <div class="ui-form-item" id="no_tip"> <label class="ui-label fn-padl20"></label> <label class="ui-checkbox"> <input type="checkbox"><span t="noPwdTip"></span> </label> </div> </div> <div class="u-dialog-foot"> <a class="u-button" data-action="confirm" href="javascript:;" t="Ok">  </a> <a class="u-button" data-action="close" href="javascript:;" t="Cancel" id="u_close">  </a> </div> </div> </div> <div id="main" class="main-container" style="display:none"> <div class="main-head"> <div id="main_logo"></div> </div> <ul class="u-tab main"> <li data-for="preview"> <a href="javascript:;" t="w_Preview">  </a> </li> <li data-for="ptz"> <a href="javascript:;" t="w_ptz">  </a> </li> <li data-for="playback"> <a href="javascript:;" t="w_Review">  </a> </li> <li data-for="report"> <a href="javascript:;" t="w_report">  </a> </li> <li data-for="set"> <a href="javascript:;" t="w_Setup">  </a> </li> <li data-for="alarm" class="fn-relative"> <a href="javascript:;" t="w_Alarm">  </a> <div class="main-nav-alarm" id="d_alarmtip" style="display:none"></div> </li> <li data-for="logout"> <a href="javascript:;" t="w_Logout">  </a> </li> </ul> <div class="u-tab-content fn-pad0"> <div class="tab-panel" data-page="preview"> <div class="main-top"> <a class="u-button fn-left" href="javascript:;" btn-for="onConnectMain" index="0" t="w_MainStream">  </a> <a class="u-button fn-left" href="javascript:;" btn-for="onConnectExtra" index="1" t="w_SecondStream" style="display:none">  </a> <a class="u-button fn-left" href="javascript:;" btn-for="onConnectExtra2" index="2" t="w_SecondStream2" style="display:none">  </a> <a class="u-button fn-left" href="javascript:;" btn-for="onConnectExtra3" index="3" t="w_SecondStream3" style="display:none">  </a> <a class="u-button fn-left" href="javascript:;" btn-for="onConnectExtra4" index="4" t="w_SecondStream4" style="display:none">  </a> <div id="pre_playType_container" class="fn-left fn-mart3 fn-hide"> <span t="w_playTypeSelect"></span> <select class="fn-width100" id="pre_playType_select" sel-for="onPlayTypeChange"> <option value="plugin_ocx" selected="selected" t="w_plugin">ocx</option> </select> </div> <div id="pre_stream" class="fn-left fn-mart3 fn-marl5"> <span t="Sub Stream Service"></span> <select class="fn-width100" id="pre_type"> <option value="0">TCP</option> <option value="4">UDP</option> <option t="w_multicast" value="3">Multicast</option> </select> </div> <a class="main-top-icon-help" href="javascript:;" hidefocus="true" help-file="preview.htm" t="title::w_help"></a> <a class="main-top-icon-speak play_type_icon" id="speakbut" href="javascript:;" hidefocus="true" t="title::w_btnaudiotalk" btn-for="onTalk" style="display:none"></a> <a class="main-top-icon-doubleVoice2 play_type_icon" href="javascript:;" hidefocus="true" t="title::w_btnaudio" btn-for="onVoice2" data-mode="15" style="display:none"></a> <a class="main-top-icon-doubleVoice1 play_type_icon" href="javascript:;" hidefocus="true" t="title::w_btnaudio" btn-for="onVoice1" data-mode="14" style="display:none"></a> <a class="main-top-icon-voice play_type_icon" href="javascript:;" hidefocus="true" t="title::w_btnaudio" btn-for="onVoice" data-mode="1" style="display:none"></a> <a class="main-top-icon-locate play_type_icon" href="javascript:;" hidefocus="true" t="title::w_manualTrack" btn-for="onTrackObject" style="display:none"></a> <a class="main-top-icon-afocus play_type_icon" href="javascript:;" hidefocus="true" t="title::w_aFocus" btn-for="onSetAF" style="display:none"></a> <a class="main-top-icon-recordAll play_type_icon" href="javascript:;" hidefocus="true" t="title::recordAll" btn-for="onRecordAll" style="display:none"></a> <a class="main-top-icon-vedio play_type_icon" href="javascript:;" hidefocus="true" t="title::w_Record" btn-for="onRecord"></a> <a class="main-top-icon-picturethree play_type_icon" href="javascript:;" hidefocus="true" t="title::w_3Snap" btn-for="onSnap3"></a> <a class="main-top-icon-picture play_type_icon" href="javascript:;" hidefocus="true" t="title::w_Snap" btn-for="onSnap"></a> <a class="main-top-icon-big play_type_icon" href="javascript:;" hidefocus="true" t="title::Local Range" btn-for="onEnlarged"></a> <a class="main-top-icon-fixedFocus play_type_icon" href="javascript:;" hidefocus="true" t="title::fixedFocus" btn-for="onFixedFocus" style="display:none"></a> <div id="pre_alarm_wrap"></div>  <a class="main-top-icon-figure play_type_icon" href="javascript:;" hidefocus="true" t="title::w_Figure" btn-for="onFigure" style="display:none"></a>  <div class="duckbackground play_type_icon" id="duck_wrap" style="display:none"> <a id="b_duck_red" class="main-top-icon-icon-duck-red main-top-duckcheck" href="javascript:;" btn-for="onDuckColorClick1" hidefocus="true" t="title::w_Red"></a> <a id="b_duck_blue" class="main-top-icon-icon-duck-blue" href="javascript:;" btn-for="onDuckColorClick2" hidefocus="true" t="title::w_Blue"></a> <a id="b_duck_green" class="main-top-icon-icon-duck-green" href="javascript:;" btn-for="onDuckColorClick3" hidefocus="true" t="title::w_Green"></a> </div> <a id="b_duckdrawn" class="main-top-duck-draw play_type_icon" href="javascript:;" btn-for="onDuckDrawnClick" hidefocus="true" style="display:none"></a> <a id="b_duck" class="main-top-icon-icon-duck play_type_icon" href="javascript:;" t="title::w_Duck" btn-for="onDuckClick" hidefocus="true" style="display:none"></a>  <a class="main-top-icon-reginFoucs play_type_icon" href="javascript:;" hidefocus="true" t="title::w_reginFocus" btn-for="onRegionFocus" style="display:none">  </a> <a class="main-top-icon-zoneExpose play_type_icon" href="javascript:;" hidefocus="true" t="title::w_zoneExpose" btn-for="onZoneExpose" style="display:none">  </a> <a id="b_dirAdjust" class="main-top-icon-dirAdjust play_type_icon fn-hide" href="javascript:;" hidefocus="true" t="title::w_directionCalibration" btn-for="onDirAdjust">  </a> <select sel-for="onChangeResolute" style="float:right; height:18px; margin-top:4px" style="display:none"> <option value="1920x1080">1920x1080</option> <option value="1280x960">1280x960</option> <option value="1280x720">1280x720</option> <option value="704x576">704x576</option> <option value="704x480">704x480</option> <option value="640x480">640x480</option> <option value="352x240">352x240</option> <option value="320x240">320x240</option> </select> <a class="main-top-icon-cut play_type_icon" href="javascript:;" hidefocus="true" t="title::w_CutResolute" btn-for="onCutResolute" style="display:none"></a>  <a class="main-top-icon-measureDistance play_type_icon" href="javascript:;" hidefocus="true" t="title::w_SD ImageRanging" btn-for="onMeasureDistance" style="display:none"></a>  <a id="b_manualEvidence" class="main-top-icon-mE play_type_icon fn-hide" href="javascript:;" hidefocus="true" t="title::ivs.ManualEvidence" btn-for="onManualEvidence"></a> <a id="b_ptzAdaptor" class="play_type_icon fn-hide" href="javascript:;" hidefocus="true" t="title::com.ptzAdaptor" btn-for="onPtzAdaptor"> <span class="main-top-icon-ptzAdaptor-2 fn-marl0" data-adaptor="2"></span> <span class="main-top-icon-ptzAdaptor-1" data-adaptor="1"></span>  </a> </div> <div class="main-bottom"> <div class="fn-relative"> <div class="main-video-container"> <div class="main-video" dhvideowhmode="Original Size"></div>  <div class="ui-video-bar" id="pre_video_bar"></div> <div class="main-bottom-container"> <div class="main-report-container" style="display:none"> </div> </div> </div> <div class="main-right-container"> <div class="main-ptz-control fn-border-radius fn-marb10" style="display:none"></div> <div class="main-ptz-distance fn-border-radius fn-marb10" style="display:none"></div> <div class="main-ptz-setting fn-border-radius fn-marb10" style="display:none"></div> <div class="main-image-adjust fn-border-radius fn-marb10" style="display:none"></div> <div class="main-zoom-focus fn-border-radius" style="display:none"></div> <div class="main-trigger-track fn-border-radius" style="display:none"></div> <div class="main-fisheye fn-border-radius" style="display:none"></div> <div class="main-face-feature" style="display:none"></div> </div> </div> </div> </div> <div class="tab-panel" data-page="ptz"> <div class="main-top"> <a class="main-top-icon-help" help-file="ptz.htm" t="title::w_help"></a> </div> <div class="main-bottom"> <div class="fn-relative"> <div class="main-video-container"> <div class="main-video" dhvideowhmode="Original Size"></div>  <div class="ui-video-bar"></div> </div> <div class="main-right-container"> <div class="main-ptz-control fn-border-radius fn-marb10"></div> <div class="main-ptz-setting fn-border-radius fn-marb10"></div> <div class="main-zoom-focus fn-border-radius" style="display:none"></div> <div class="main-trigger-track fn-border-radius" style="display:none"></div> </div> </div> </div> </div> <div class="tab-panel" data-page="playback">  </div> <div class="tab-panel" data-page="report">  </div> <div class="tab-panel" data-page="set"> <div class="set-container"> <div class="set-sidebar"> <ul id="set-menu"></ul> </div> <div class="set-content"> <div id="set-content" class="set-content-box fn-minwid912"></div> </div> </div> <div id="set-advance"></div>  <script type="text/template" id="menu"><% $.each(data, function(i, value) { %>                        <li category="<%= value.category %>" <% if(value.condition !== undefined) { %>style="display:none;"<% } %>>                            <a class="set-menu">                                <i class="set-menu-icon"></i>                                <span class="set-menu-label" t="<%= value.t %>"></span>                            </a>                            <ul style="display:none">                                <% $.each(value.member, function(i, item) { %>                                    <li class="set-item" filename="<%= item.filename %>" <% if(item.condition !== undefined) { %>style="display:none;"<% } %> <% if(item.vsp !== undefined) { %>vsp="vsp"<% } %>>                                        <i class="set-item-icon"></i>                                        <span class="set-menu-label" t="<%= item.t %>"></span>                                    </li>                                <% }); %>                            </ul>                        </li>                    <% }); %></script> </div> <div class="tab-panel" data-page="alarm">  </div> <div class="tab-panel" data-page="logout">  </div> </div>  <div id="timeout_logout" class="u-dialog fn-width436"> <div class="u-dialog-head"> <h1 t="w_Info"></h1> </div> <div class="u-dialog-content fn-clear fn-textcenter"> <i class="i-dialog-warn"></i> <span t="w_ErrorAuthorizeRelogin"></span> </div> <div class="u-dialog-foot"> <a class="u-button" data-action="confirm" href="javascript:;" t="Ok">  </a> </div> </div> <iframe id="_download" src="" style="display:none"></iframe> </div> <div id="markframe" class="fn-opacity" style="position:absolute;width:100%;;height:100%;;top:0;left:0;background:red;display:none;z-index:10000">1</div> <script src="jsBase/lib/md5.js?version=@WebVersion@"></script> <script src="jsBase/lib/base64.js?version=@WebVersion@"></script> <script src="jsCore/common.js?version=@WebVersion@"></script> <script src="js/publicFunc.js?version=@WebVersion@"></script> <script src="jsCore/modules/ui-schedule.js?version=@WebVersion@"></script> <script src="jsBase/lib/sea.js?version=@WebVersion@"></script> <script src="jsBase/lib/seajs-text.js?version=@WebVersion@"></script> <script src="jsBase/widget/js/dui.tab.js?version=@WebVersion@"></script> <script src="jsBase/widget/js/dui.table.js?version=@WebVersion@"></script> <script src="jsBase/widget/js/dui.pagination.js?version=@WebVersion@"></script> <script src="jsBase/widget/js/dui.textfield.js?version=@WebVersion@"></script> <script src="jsBase/widget/js/dui.numberfield.js?version=@WebVersion@"></script> <script src="jsBase/widget/js/dui.datepicker.js?version=@WebVersion@"></script> <script src="jsBase/widget/js/dui.timefield.js?version=@WebVersion@"></script> <script src="jsBase/widget/js/dui.tip.js?version=@WebVersion@"></script> <script src="jsBase/widget/js/dui.dialog.js?version=@WebVersion@"></script> <script src="jsBase/widget/js/dui.ipfield.js?version=@WebVersion@"></script> <script src="jsBase/widget/js/dui.validator.js?version=@WebVersion@"></script> <script type="text/javascript">seajs.config({        base: './jsBase',        paths: {            'js': '../js',            'html': '../html',            'platformHtm': '../platformHtm',            'jsCore': '../jsCore'        }    });    seajs.use('/jsCore/app', function(App) {        window.webApp = new App();    });</script> </body> </html>

2020-06-21 15:26:02.489 [INFO ] [g.discovery.internal.PersistentInbox] - Added new thing 'ipcamera:ONVIF:10428194' to inbox.

==> /var/log/openhab2/events.log <==

2020-06-21 15:26:02.490 [home.event.InboxAddedEvent] - Discovery Result with UID 'ipcamera:ONVIF:10428194' has been added.

Hello Matt
This IP camera binding sounds brilliant. I am quite new to Openhab and I do not have much expirience with scripts or anything like that. I am using a RPI 3+ and I am not sure how to install this binding. Could you please explain where could I find the openhab2-addons folder and if it is being accesed using SSH or something else. Also how can I stop Openhab is it by just unplugging power? I had a read through readme file but I couldnt seem to get the answer. I also had a look around in this thread but its quite long so please forgive me if you did already answered this question. I want to use a Prikim camera and I am able to access the view from it through its IP adress.

That’s the same thing if you want to install other bindings (separate from PaperUI controlled bindings).

If you installed openhab by openhabian it’s here:

I usually copy the files using WinSCP (ssh).

Control OH:

systemctl start openhab2.service
systemctl restart openhab2.service
systemctl stop openhab2.service
1 Like

I just would like to report some issues I have seen.
Maybe someone else has similar experience.
(see below the gap between 09:49 and 10:30

I still have the issue that the ipcam binding seems to causes my OH to kind of hang up.
2020-06-21 09:48:54.869 [TRACE] [ing.ipcamera.handler.IpCameraHandler] - Snapshot recieved: Binding will now close the channel.
2020-06-21 09:48:55.190 [TRACE] [ing.ipcamera.handler.IpCameraHandler] - Sending camera: GET:
2020-06-21 09:48:55.565 [TRACE] [ing.ipcamera.handler.IpCameraHandler] - Snapshot recieved: Binding will now close the channel.
2020-06-21 09:48:59.285 [TRACE] [ing.ipcamera.handler.IpCameraHandler] - Sending camera: GET:
2020-06-21 09:48:59.362 [TRACE] [ing.ipcamera.handler.IpCameraHandler] - Sending camera: GET:
2020-06-21 09:48:59.560 [TRACE] [ing.ipcamera.handler.IpCameraHandler] - Snapshot recieved: Binding will now close the channel.
2020-06-21 09:48:59.848 [TRACE] [ing.ipcamera.handler.IpCameraHandler] - Snapshot recieved: Binding will now close the channel.
2020-06-21 09:49:03.929 [TRACE] [ing.ipcamera.handler.IpCameraHandler] - Sending camera: GET:
2020-06-21 09:49:03.959 [TRACE] [ing.ipcamera.handler.IpCameraHandler] - Sending camera: GET:
2020-06-21 09:49:04.219 [TRACE] [ing.ipcamera.handler.IpCameraHandler] - Snapshot recieved: Binding will now close the channel.
2020-06-21 09:49:04.381 [TRACE] [ing.ipcamera.handler.IpCameraHandler] - Snapshot recieved: Binding will now close the channel.
2020-06-21 09:49:05.188 [TRACE] [ing.ipcamera.handler.IpCameraHandler] - Sending camera: GET:
2020-06-21 09:49:24.062 [WARN ] [me.core.internal.events.EventHandler] - Dispatching event to subscriber 'org.openhab.core.events.$
2020-06-21 10:30:31.461 [WARN ] [me.core.internal.events.EventHandler] - Dispatching event to subscriber 'org.eclipse.smarthome.io$
2020-06-21 10:30:44.315 [INFO ] [.reconnect.PeriodicReconnectStrategy] - Try to restore connection to 'localhost'. Next attempt in$

I am not quite sure where thisis coming from (might be one new camera I added).
However, without the binding it’s running stable for weeks / months.

another point which caught my attention is, that even after removing the jar files from the addons folder, the ipcamera binding was still reporting in the logs.

When I started another try this morning (no jars in addons) and put your latest version in the addons folder), I got these messages:

2020-06-22 07:39:03.736 [WARN ] [org.apache.felix.fileinstall        ] - A bundle with the same symbolic name (io.netty.codec) and version (4.1.42.Final) is already installed.  Updating this bundle instead.
2020-06-22 07:39:03.839 [WARN ] [org.apache.felix.fileinstall        ] - A bundle with the same symbolic name (io.netty.resolver) and version (4.1.42.Final) is already installed.  Updating this bundle instead.
2020-06-22 07:39:03.880 [WARN ] [org.apache.felix.fileinstall        ] - A bundle with the same symbolic name (io.netty.codec-http) and version (4.1.42.Final) is already installed.  Updating this bundle instead.
2020-06-22 07:39:03.971 [WARN ] [org.apache.felix.fileinstall        ] - A bundle with the same symbolic name (io.netty.transport) and version (4.1.42.Final) is already installed.  Updating this bundle instead.
2020-06-22 07:39:04.051 [WARN ] [org.apache.felix.fileinstall        ] - A bundle with the same symbolic name (io.netty.handler) and version (4.1.42.Final) is already installed.  Updating this bundle instead.
2020-06-22 07:39:04.125 [WARN ] [org.apache.felix.fileinstall        ] - A bundle with the same symbolic name (io.netty.common) and version (4.1.42.Final) is already installed.  Updating this bundle instead.
2020-06-22 07:39:04.214 [WARN ] [org.apache.felix.fileinstall        ] - A bundle with the same symbolic name (io.netty.buffer) and version (4.1.42.Final) is already installed.  Updating this bundle instead.

Even though, I restarted OH yesterday without the jars in addons!?

I will try to identify the culprit for the hang up

Another minor thing I found out:
The snapshot image is not updated, if NULL.
That means, I need to trigger the update once, so that it will update in the frequency which is setup in PaperUI.
(Time in milliseconds between checking camera states and fetching a JPG/Image)

New Habpanel widget created for the latest version of this binding for any cameras that are PTZ. Please keep all feedback and questions in the thread at the link below.

Do a little more research, there is much better hardware available, that is actually open source. RPi 4 certainly have fixed some of their worst hardware gaffes, but at the end of the day it’s still a locked down platform with a binary blob running the show (instead of the OS you installed).

You mean this community?
Will do.
Any suggestion about a specific thread would be helpful though.

I have seen in the past a lot of HW discussions and in some cases it seems to be very depending on what the users used in the past.

I am actually quite happy with my RPi3B+ (after changing the sd-card to an SSD), so I guess I am biased to RPi as well.

I actually see RPi recommended quite a lot around here, lol, so I think you may need to venture out of the confines, perhaps. :grin:

Nowadays I use the Armbian “Supported” Board list as a starting point / short list / jumping off point for further research. You will find a lot more interesting (and performant) devices over there. The tradeoff, is you will need to do a little research. But there are lots of hardware options, some very well suited to particular tasks like NAS, video display, networking stuff, etc…

The best thing about using Armbian as a base is that it is just plain Debian. Armbian project handles all the low level details and optimizations and therefore you have a nice common base you can build upon, regardless of hardware chosen to fit your particular need.

I have been running it for years, first on a Cubietruck, and more recently on a couple ODROID-XU4. But that is because those meet my requirements. There is a whole another world out there besides RPi! Come on in, the water is fine! :smile:

Thanks for sharing - I will look into the Armbian list.
During my investigation yesterday I found also an Intel NUC mentioned regulary.
Maybe that will be my next choice as I do not need digital IOs for the OH central unit.

EDIT: Sorry just recognized that I kind of hijacked this thread with HW discussion.
This was not my intention.
@TRS-80 I will proceed with my activities here:

Yes @matt1, sorry about that! We will excuse ourselves now! :slight_smile:

Nice looooooooong thread you’ve got here! Nice seeing you, keep up the great work! :slight_smile:

Has anyone else found mjpg streams going offline? I was testing with two on a HapPanel page in CameraFeed widgets, using /ipcamera.mjpeg.

After a while they end up showing the broken image icon. Both are Dahua cams, and when the binding feeds stop, I’m still able to access them directly, via /cgi-bin/mjpg/video.cgi?channel=1&subtype=1

Restarting OpenHab gets them working again. I think modifying my camera .things file will resolve it as well.

Here the same with my china dahua cam. I do openhab service restart and the picture is back again.

Thanks for reporting it. I have had it happen to my Amcrest which is made by dahua. Since it is a PTZ camera when this happens the camera appears to have rebooted and the direction of the camera has changed. Only started happening since I used it in habpanel so only known for a few days, going to look into it ASAP but this may be a camera bug hopefully triggered by something that can be changed in the binding. If people have seen it with another brand that is not made by dahua then please let me know.

FWIW, I had set logging for the binding, and found something in it that looked like it was related to authentication issues (I have since cleared those logs.) Is it possible the binding gets locked out, and then stops trying?

I’ve also seen that it isn’t both cameras at the same time, often one will still be working while the other has gone offline.

I can test anything you’d need, or enable any specific logging if that would help. I removed another camera, so I only have the two Dahua connections at the moment.


No since I can reproduce it easily I don’t need logs and it should be a quick fix.

I have done some testing and I can confirm this only happens with Dahua based cameras as Hikvision can handle it without the same issue. Work around is to use ‘snapshots.mjpeg’ or ‘autofps.mjpeg’ as different code creates these streams and they don’t come from the cameras file server. The camera gives a http error 500 meaning the file server inside the camera crashed or something like that occured. It is 100% reproducible here by calling a REFRESH when the cameras mjpeg stream is open which means the stream is closed and re-opened only 200 milliseconds apart, it may be a bug in the firmware and if this is the case it should be checked by changing firmware to confirm and then reporting it to the cameras support.

Going to run some tests to look for a work around by increasing the delay to >1 second when a refresh is called for.

1 Like

New build 2020-06-26

  • Fix for cameras that give http 500 error when refreshing mjpeg streams. @jace