Suite à l'achat d'une caméra chinoise PTZ sur Aliexpress, je me suis rapidement rendu compte que celle-ci allait être difficile à intègrer sous Jeedom.
En effet, étant inconnue, aucune URL pour le snapshot et encore moins pour le PTZ.
La seule donnée connue étant qu"elle est compatible (comme toutes les nouvelles caméra) ONVIF.
Etant tombé sur sur projet : https://github.com/futomi/node-onvif#On ... set-method , je me suis dis qu'il y avait une forte piste a suivre.
J'ai donc installé le module Node ONVIF avec la commande
Code : Tout sélectionner
npm install -s node-onvif
Puis réalisé le code suivant (getStatus.js) :
Code : Tout sélectionner
const onvif = require('node-onvif');
// Create an OnvifDevice object
let device = new onvif.OnvifDevice({
xaddr: 'http://192.168.1.10:8899/onvif/device_service',
user : 'xxx',
pass : 'xxx'
});
// Initialize the OnvifDevice object
device.init().then(() => {
let profile = device.getCurrentProfile();
console.log(JSON.stringify(profile, null, ' '));
}).then(() => {
console.log('Done!');
}).catch((error) => {
console.error(error);
});
Et là, miracle :
Code : Tout sélectionner
root@jeedom:~# node getStatus.js
{
"token": "000",
"name": "Profile_000",
"snapshot": "http://192.168.1.10/webcapture.jpg?command=snap&channel=1",
"stream": {
"udp": "rtsp://192.168.1.10:554/user=xx_password=xx_channel=1_stream=0.sdp?real_stream",
"http": "rtsp://192.168.1.10:554/user=xx_password=xx_channel=1_stream=0.sdp?real_stream",
"rtsp": "rtsp://192.168.1.10:554/user=xx_password=xx_channel=1_stream=0.sdp?real_stream"
},
"video": {
"source": {
"token": "000",
"name": "VideoS_000",
"bounds": {
"width": 1280,
"height": 960,
"x": 0,
"y": 0
}
},
"encoder": {
"token": "000",
"name": "VideoE_000",
"resolution": {
"width": 1280,
"height": 960
},
"quality": 4,
"framerate": 25,
"bitrate": 3072,
"encoding": "H264"
}
},
"audio": {
"source": {
"token": "000",
"name": "Audio_000"
},
"encoder": {
"token": "000",
"name": "AudioE_000",
"bitrate": 64,
"samplerate": 8,
"encoding": "G711"
}
},
"ptz": {
"range": {
"x": {
"min": -1,
"max": 1
},
"y": {
"min": -1,
"max": 1
},
"z": {
"min": -1,
"max": 1
}
}
}
}
Done!
Bon, c'est bien beau, mais maintenant, il serait bien de pouvoir la piloter :
Création du script ptz.js :
Code : Tout sélectionner
const onvif = require('node-onvif');
var myArgs = process.argv.slice(2);
console.log('myArgs: ', myArgs);
// Create an OnvifDevice object
let device = new onvif.OnvifDevice({
xaddr: 'http://192.168.1.10:8899/onvif/device_service',
user : 'xx',
pass : 'xx'
});
// Initialize the OnvifDevice object
device.init().then(() => {
let params = {
'ProfileToken': '000',
'PresetToken' : myArgs[0],
'Speed' : {'x': 1, 'y': 1, 'z': 1}
};
device.services.ptz.gotoPreset(params).then((result) => {
console.log(JSON.stringify(result['data'], null, ' '));
}).catch((error) => {
console.error(error);
});
});
Créer un fichier OnvifPtz.sh :
Code : Tout sélectionner
#!/bin/bash -l
node /home/pi/ptz.js $1
Je me retrouve donc avec une caméra parfaitement intégrée dans Jeedom.
Certe, le temps de réponse est assez long (3 secondes entre l'appuis sur le virtuel et la réponse de la caméra), mais c'est déjà pas mal.
La doc sur le module node-onvif est assez détaillée, libre à vous de rajouter d'autres commandes telles que déplacement, zoom ...