Détection de mouvement sur SzSinocam IPC-F10P

J’avais acheté cette caméra n’y connaissant pas grand chose. Je voulais avoir du Wifi et puisse être mise à l’exterieur.

Concernant l’extérieur, elle est plutôt solide (fonte d’aluminium) et semble étanche (sauf peut-être au niveau de l’antenne Wifi). Elle a resisté quelques mois à l’extérieur sans avoir de séquelles.

Par contre au niveau logiciel c’est une grosse bouse. Tout d’abord elle fonctionne avec ActiveX et sous Microsoft Internet Explorer. Impossible de la faire fonctionner autre part ni avec un autre navigateur.

Pour gérer les caméras, j’ai installé Zoneminder qui a le principal intérêt d’être reconnu (pourtant il est moche et compliqué à configurer). J’espère trouver des moyens de l’améliorer. En particulier, il gère de son côté la détection de mouvement. Donc par là il est continuellement en train d’analyser les flux vidéo. Sachant que les caméras intègrent elle-même des mécanismes de détection de mouvement, c’est donc de la consommation CPU inutile (sauf si on souhaite faire de la reconnaissance facial, de forme ou autre).

Script

Zoneminder permet de connecter des scripts externe pour effectuer la détection de mouvement. Lorsque les caméras sont compatibles OnVIF, alors il y a moyen de récupérer l’état de détection de mouvements (en l’ayant activé dans la caméra).

Une librairie onvif pour Python existe et permet de communiquer avec la Caméra selon ce protocole. Voir https://github.com/quatanium/python-onvif

#!/usr/bin/python

import sys

host = sys.argv[1]
user = sys.argv[2]
password = sys.argv[3]

from onvif import ONVIFCamera mycam = ONVIFCamera(host, 80, user, password, '/etc/onvif/wsdl/')

# Get Hostname
#resp = mycam.devicemgmt.GetHostname()
#print 'My camera`s hostname: ' + str(resp.Name)
# Get system date and time
event_service = mycam.create_events_service()
event_service.GetEventProperties()

pullpoint = mycam.create_pullpoint_service()
req = pullpoint.create_type('PullMessages')
req.Timout='PT30S'
req.MessageLimit=10
msg = pullpoint.PullMessages(req)
msg = msg.NotificationMessage.pop(0).Message.Message

time = msg._UtcTime
data = msg.Data

if data.SimpleItem._Name == "IsMotion":
print(time+','+data.SimpleItem._Value)

A noter qu’encore une fois cette caméra n’est pas à la hauteur des Hikvision/AXIS (que j’ai testés aussi), car ici la caméra ne gère pas correctement les évènements: un message d’évènement est émit dès la requête. Alors qu’il devrait être emis que lorsqu’il y a détection. Il faut donc absolument demander toutes les secondes l’état du détecteur de la caméra pour se rendre compte de manière réactive, qu’il y a eu une détection.

Aussi, le flux RTSP est disponible là: rtsp://<user>:<pass>@<IP>:554/11