Dahua IPC to MQTT App

Maybe appending data field JSON to payload would help? Would you be able to parse JSON then?

I’ve updates app. Now it sends two MQTT topics:
First MQTT topic will be: cameras/1/<event>, ex: cameras/1/VideoMotion and payload will be action: Start or Stop
Second MQTT topic will be: cameras/1, ex: cameras/1 and payload will be data received from camera in JSON format for you to parse.

1 Like

I have dahua IPC-HFW1300S and IPC-HFW1320S cameras.
I have a message with the IPC-HFW1300S camera -
2019-04-15 00: 33: 12.029320 INFO DahuaMQTT: [192.168.1.100] OnDisconnect (Success [])

However, with IPC-HFW1320S. seems to be ok -
2019-04-15 00: 42: 50.970780 INFO DahuaMQTT: [192.168.1.103] Publishing MQTT. topic = cameras / 1, payload = {"code": "VideoMotion", "action": "Start", "index": "0"}

The settings are the same - can it be a matter of firmware?

How can I run an automation based on motion detection? Can someone show me an example of an automation code? I would like to start the switch after motion detection.

Personally, I’ve created binary sensors:

    - platform: mqtt
      name: motion_cam01
      state_topic: cameras/cam01
      payload_on: Start
      payload_off: Stop
      value_template: '{{ value_json.action }}'
      device_class: motion

And then you can create automation on binary_sensor.motion_cam01 on / off state.

Thank you very much. Works perfectly.

Does anybody has this working on a Dahua NVR?
I have the script working, nut my NVR has 5 camera’s attached…

Could you please post AppDaemon log?

The app has stopped working since I enabled HTTPS on my Dahua NVR. I assume HTTP should continue working, but it looks like the call is redirected and then I get a certificate error:

SSL certificate problem: unable to get local issuer certificate

I guess the solution would be to disable HTTPS again, but would there be a possibility to use HTTPS?

Yes, there should be, but I didn’t tried HTTPS on my cameras, so didn’t implemented it. Is your certificate self-signed?

Yes, self signed. I don’t know about the cameras themselves, but the NVR has an option to generate a certificate.

Ok, I’ll take a look. I guess component just needs option to accept self-signed certificate.

Could you pull updated app from my repository (here) and try setting ignore_ssl: True to configuration file?

Great work, @algirdasc! I am experiencing some issues with parsing the JSON payload, maybe because it contains a lot of “\n”?

{"code": "CrossRegionDetection", "action": "Stop", "index": "2", "data": "{\n   \"Action\" : \"Appear\",\n   \"Class\" : \"Normal\",\n   \"CountInGroup\" : 1,\n   \"DetectRegion\" : [\n      [ 346, 2473 ],\n      [ 2512, 1092 ],\n      [ 7754, 2249 ],\n      [ 7827, 4722 ],\n      [ 8045, 5204 ],\n      [ 3822, 6681 ],\n      [ 8100, 7773 ],\n      [ 8082, 8063 ],\n      [ 36, 8127 ],\n      [ 55, 5332 ],\n      [ 419, 5300 ]\n   ],\n   \"EventSeq\" : 84,\n   \"Extension\" : {\n      \"EventLongID\" : \"0220190507170948003539900000\"\n   },\n   \"FrameSequence\" : 21637811,\n   \"GroupID\" : 84,\n   \"IndexInGroup\" : 0,\n   \"LocaleTime\" : \"2019-05-07 17:09:51\",\n   \"Mark\" : 0,\n   \"Name\" : \"Voorkant\",\n   \"Object\" : {\n      \"Action\" : \"Appear\",\n      \"BoundingBox\" : [ 5840, 2400, 6432, 4448 ],\n      \"Center\" : [ 6136, 3424 ],\n      \"Confidence\" : 0,\n      \"FrameSequence\" : 0,\n      \"LowerBodyColor\" : [ 0, 0, 0, 0 ],\n      \"MainColor\" : [ 0, 0, 0, 0 ],\n      \"ObjectID\" : 840,\n      \"ObjectType\" : \"Human\",\n      \"RelativeID\" : 0,\n      \"Source\" : 0.0,\n      \"Speed\" : 0,\n      \"SpeedTypeInternal\" : 0\n   },\n   \"PTS\" : 43814814030.0,\n   \"RuleId\" : 1,\n   \"Sequence\" : 0,\n   \"Source\" : 55530608.0,\n   \"Track\" : null,\n   \"UTC\" : 1557248988,\n   \"UTCMS\" : 273\n}\n"}

Could you please specify what issues are you experiencing? A lot of “\n” might be from printing debuging info, which should be ignored and JSON should be parsed anyway.

I would like to parse out the “Name” field. I use dev-template to test my template.

Template:

{% set my_test_json = {"code": "CrossRegionDetection", "action": "Stop", "index": "2", "data": "{\n   \"Action\" : \"Appear\",\n   \"Class\" : \"Normal\",\n   \"CountInGroup\" : 1,\n   \"DetectRegion\" : [\n      [ 346, 2473 ],\n      [ 2512, 1092 ],\n      [ 7754, 2249 ],\n      [ 7827, 4722 ],\n      [ 8045, 5204 ],\n      [ 3822, 6681 ],\n      [ 8100, 7773 ],\n      [ 8082, 8063 ],\n      [ 36, 8127 ],\n      [ 55, 5332 ],\n      [ 419, 5300 ]\n   ],\n   \"EventSeq\" : 56,\n   \"Extension\" : {\n      \"EventLongID\" : \"0220190506205857002629900000\"\n   },\n   \"FrameSequence\" : 19821373,\n   \"GroupID\" : 56,\n   \"IndexInGroup\" : 0,\n   \"LocaleTime\" : \"2019-05-06 20:59:00\",\n   \"Mark\" : 0,\n   \"Name\" : \"Voorkant\",\n   \"Object\" : {\n      \"Action\" : \"Appear\",\n      \"BoundingBox\" : [ 1744, 4040, 2080, 4440 ],\n      \"Center\" : [ 1912, 4240 ],\n      \"Confidence\" : 0,\n      \"FrameSequence\" : 0,\n      \"LowerBodyColor\" : [ 0, 0, 0, 0 ],\n      \"MainColor\" : [ 0, 0, 0, 0 ],\n      \"ObjectID\" : 1460,\n      \"ObjectType\" : \"Human\",\n      \"RelativeID\" : 0,\n      \"Source\" : 0.0,\n      \"Speed\" : 0,\n      \"SpeedTypeInternal\" : 0\n   },\n   \"PTS\" : 43742164310.0,\n   \"RuleId\" : 1,\n   \"Sequence\" : 0,\n   \"Source\" : 55530608.0,\n   \"Track\" : null,\n   \"UTC\" : 1557176337,\n   \"UTCMS\" : 525\n}\n"} %}

{{ my_test_json.data }}

Then the result is:

{
   "Action" : "Appear",
   "Class" : "Normal",
   "CountInGroup" : 1,
   "DetectRegion" : [
      [ 346, 2473 ],
      [ 2512, 1092 ],
      [ 7754, 2249 ],
      [ 7827, 4722 ],
      [ 8045, 5204 ],
      [ 3822, 6681 ],
      [ 8100, 7773 ],
      [ 8082, 8063 ],
      [ 36, 8127 ],
      [ 55, 5332 ],
      [ 419, 5300 ]
   ],
   "EventSeq" : 56,
   "Extension" : {
      "EventLongID" : "0220190506205857002629900000"
   },
   "FrameSequence" : 19821373,
   "GroupID" : 56,
   "IndexInGroup" : 0,
   "LocaleTime" : "2019-05-06 20:59:00",
   "Mark" : 0,
   "Name" : "Voorkant",
   "Object" : {
      "Action" : "Appear",
      "BoundingBox" : [ 1744, 4040, 2080, 4440 ],
      "Center" : [ 1912, 4240 ],
      "Confidence" : 0,
      "FrameSequence" : 0,
      "LowerBodyColor" : [ 0, 0, 0, 0 ],
      "MainColor" : [ 0, 0, 0, 0 ],
      "ObjectID" : 1460,
      "ObjectType" : "Human",
      "RelativeID" : 0,
      "Source" : 0.0,
      "Speed" : 0,
      "SpeedTypeInternal" : 0
   },
   "PTS" : 43742164310.0,
   "RuleId" : 1,
   "Sequence" : 0,
   "Source" : 55530608.0,
   "Track" : null,
   "UTC" : 1557176337,
   "UTCMS" : 525
}

This however does not provide any result:

{{ my_test_json.data.Name }}

Yes, I see. The problem is that my_test_json.data is not parsed to JSON object, but to string instead. I’ve updated app, please update and let me know if the problem is resolved.

Great work, I have problem getting AudioAnomaly: input abnormal to work even when i see on Onvif Device Manager that there are events. Anyone got Audio Detected to work?

DahuaMQTT:
  class: DahuaMQTT
  module: dahua_mqtt
  cameras:

    - host: 192.168.1.113
      port: 80
      user: !secret living_room_camera_username
      pass: !secret living_room_camera_passwd
      topic: cameras/living_room/
      events: VideoMotion,CrossLineDetection,CrossRegionDetection,LeftDetection,TakenAwayDetection,FaceDetection,AudioMutation,AudioAnomaly,VideoBlind,LeftDetection,MoveDetection

eventCode can be any one of the standard codes defined in DHIIF, or “All”.
All means all kinds of the eventcode.
eventcode include:
VideoMotion: motion detection event
VideoLoss: video loss detection event
VideoBlind: video blind detection event.
AlarmLocal: alarm detection event.
CrossLineDetection: tripwire event
CrossRegionDetection: intrusion event
LeftDetection: abandoned object detection
TakenAwayDetection: missing object detection
VideoAbnormalDetection: scene change event
FaceDetection: face detect event
AudioMutation: intensity change
AudioAnomaly: input abnormal
VideoUnFocus: defocus detect event
WanderDetection: loitering detection event
RioterDetection: People Gathering event
ParkingDetection: parking detection event
MoveDetection: fast moving event
StorageNotExist: storage not exist event.
StorageFailure: storage failure event.
StorageLowSpace: storage low space event.
AlarmOutput: alarm output event.
MDResult: motion detection data reporting event. The motion detect window contains 18 rows
and 22 columns. The event info contains motion detect data with mask of every row.
HeatImagingTemper: temperature alarm event

Yes, has been resolved. Thanks!

A great way to troubleshot is
use the command that makes a log

wget 'http://USERNAME:PASSWORD@IP/cgi-bin/eventManager.cgi?action=attach&codes=[VideoMotion,VideoLoss,VideoBlind,AlarmLocal,CrossLineDetection,CrossRegionDetection,LeftDetection,TakenAwayDetection,VideoAbnormalDetection,FaceDetection,AudioMutation,AudioAnomaly,VideoUnFocus,WanderDetection,RioterDetection,ParkingDetection,MoveDetection,MDResult]' -O events.log

I get an error with that command. I’m using username=admin & password=somethingsomething

Error Invalid Authority!