Amélioration Onvif

@Flobul j’ai remarqué un truc en faite :

$this->setConfiguration('cameraStreamProfileToken', $sources[0][0]['profiletoken']);
$this->setConfiguration('cameraStreamAccessUrl', $mediaUri);

ne sont pas sauvegardé !

car configOnvif() est appelé par applyModuleConfiguration() qui est lui dans le postSave() donc après sauvegarde, il faut donc refaire un $this->save();.

Edit :
J’ai ajouté le $this->save(); dans applyModuleConfiguration()
image

Bien vu.

Pas de raison que ça puisse pas marcher.
On va corriger et adapter ça pour le proposer ensuite.

J’ai corrigé ce point, en ajoutant un tableau de donnée même quand il n’y a qu’un résultat.

														protected function _getActiveSources($videoSources, $profiles) {
                                                            // create an array of $videoSources if only one videoSource
                                                            $videoSources = ($videoSources === [] || (array_keys($videoSources) === range(0, count($videoSources) - 1)))?$videoSources:array($videoSources);

															$sources = array();
															// camera may have many sources
															for ($i = 0; $i < count($videoSources); $i++) {
																// NVT is a camera
																if (isset($videoSources[$i]['@attributes'])) {
																	$sources[$i]['sourcetoken'] = $videoSources[$i]['@attributes']['token'];
																	$this->_getProfileData($sources, $i, $profiles);
																} else {
																	// NVT is an encoder
																	if (strtolower($videoSources[$i]['@attributes']['SignalActive']) == 'true') {
																		$sources[$i]['sourcetoken'] = $videoSources[$i]['@attributes']['token'];
																		$this->_getProfileData($sources, $i, $profiles);
																	}
																}
															}
															return $sources;
														}

Testé sur mes 2 caméras onvif en simultant 1 et plusieurs profiles, ça renvoie bien l’url.

La découverte n’affichait que 1 seul ligne de résultat et lançait la création de cémara par le port 80, alors que certaines caméras répondent au port 8000 ou autre.
J’ai donc modifié 2 méthodes pour permettre l’ajout depuis la page découverte :

	public static function discoverCam() {
		$return = array();
		$onvif = new Ponvif();
		$onvif->setDiscoveryTimeout(10);
		$result = $onvif->discover();
		if (count($result) > 0) {
			foreach ($result as $cam) {
                $url = parse_url($cam['XAddrs']);
				$return[] = array(
					'ip' => $url['host'] . ':' . $url['port'],
					'type' => $cam['Types'],
					'discover' => 'onvif',
					'exist' => false,
				);
			}
		}
		$cameras = self::byType('camera');
		foreach ($return as &$cam) {
			foreach ($cameras as $camera) {
				if ($cam['ip'] == $camera->getConfiguration('ip') . ':' . $camera->getConfiguration('onvif_port')) {
					$cam['exist'] = true;
					break;
				}
			}
		}
		return $return;
	}

	public static function addDiscoverCam($_config) {
        $host = explode(':', $_config['ip']);
		$eqLogic = new self();
		$eqLogic->setName($host[0]);
		$eqLogic->setConfiguration('username', $_config['username']);
		$eqLogic->setConfiguration('password', $_config['password']);
		$eqLogic->setConfiguration('ip', $host[0]);
		$eqLogic->setConfiguration('onvif_port', $host[1]);
		$eqLogic->setEqType_name('camera');
		$eqLogic->setIsVisible(1);
		$eqLogic->setIsEnable(1);
		$eqLogic->setConfiguration('device', 'onvif');
		$eqLogic->save();
	}

J’ai poussé les modifications apportées dans la class ponvif sur GitHub :

@llaumgui dis-moi si tu as toujours l’erreur XML, j’ai peut-être une autre modification à apporter alors

@llaumgui @Phpvarious
Vous avez eu l’occasion de tester les dernières modifs ?

je rentre tous juste de vacances. Je check ça demain.
Possible d’avoir un accès github ? Car j’ai fait pas mal de modif et je ne suis plus ce que j’ai modifié, histoire de partir de 0.

Ajouté.
Le dernier commit, c’est mes dernière motifs, et le commit d’avant, c’est la beta actuelle.

Alors, il y a du mieux ! L’équipement se créé sans souci. Par contre, pas de commandes. J’ai fait à la main du coup :

Et ça ne bouge pas…

Merci pour le retour.

Oui, exact, j’ai pas modifié le fichier de configuration onvif sur le plugin camera, pour ajouter les commandes.

Normal, en créant une commande, le logicalId est vide.

Edit : j’ai poussé les commandes

Pas marché… Le seul log que j’ai :

[2023-09-04 14:22:22]DEBUG : TEST [{"sourcetoken":"VideoSource000","0":{"profilename":"Profile000","profiletoken":"Profile000","encodername":"VideoEncoder000","encoding":"H264","width":"1920","height":"1080","fps":"20","bitrate":"1536","ptz":{"name":"PTZ000","nodetoken":"PTZ000"}},"1":{"profilename":"Profile001","profiletoken":"Profile001","encodername":"VideoEncoder001","encoding":"H264","width":"640","height":"480","fps":"15","bitrate":"512","ptz":{"name":"PTZ000","nodetoken":"PTZ000"}}}]
[2023-09-04 14:22:23]DEBUG : TEST2 "rtsp:\/\/192.168.1.76:554\/cam\/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif"

Tu as supprimé et recréé l’équipement ou changé le type de caméra et remis Onvif ensuite ?

C’est le seul moyen de demander la création des commandes d’un type.

Supprimé.
Par contre, j’ai fait les requêtes en base pour modifier le logicalId et c’est bon, je contrôle bien la caméra !

En base ? Comment ça ?

update cmd set... mais en fait ça marche plus. Mon cas de test était pas bon.

Je regarde ce soir pour reproduire et corriger. Et on pourra proposer les modifs, je pense.

Bloc code scénario, pour rajouter le logicialId :

$cmd = cmd::byId(123456789); // ID de ta commande créée manuellement sans logicalId
$cmd->setLogicalId('ptzleft')->save(); // tu lui mets le logicialId que tu veux

En fait, si, il est déjà présent dans la méthode configOnvif :

		$this->setConfiguration('cameraStreamAccessUrl', $mediaUri);
		$this->save();
	}

Mais il fout le bordel si on veut ajouter des nouvelles commandes (double save à la suite) et donc crée puis efface les nouvelles commandes.
D’ailleurs return; dans la méthode applyModuleConfiguration empêche de créer les commandes via devicesParameters.
Le save() est fait juste après dans import().

J’ai poussé la modification.
Ca corrige du coup la non création des commandes, @llaumgui

Alors, je confirme que ça marche ! Les commandes sont bien créées, et surtout, les commandes fonctionnent !

Une remarque, le stop n’est pas automatique, alors qu’avant, j’avais un pas. Il faudrait pouvoir avoir le même comportement sinon c’est difficilement utilisable.

Sur chaque commande action de ptz, il faut indiquer la commande de stop.
C’etait deja codé et utilisable dans le plugin, autant s’en servir

OK, sur le plugin PTZ OnVif, il y avait ça :

Du coup, je vais tester un truc comme ça :

Je sais déjà pas si les modifs vont être acceptées par Loic.
Ca fait un peu lourd, je pense.

sleep() attend un int en argument.
essaye usleep()
Dis-moi si ça marche.

Yes, mais je suis obligé de passer par un scénario pour ça… De plus, ce n’est pas précis. Grosso-modo, tu lances une commande et rapidement une autre en espérant qu’elle soit exécutée dans les temps.

Non… Le stop marche bien, mais pas le stop via une poste exécution… Je ne comprends pas pourquoi par contre.

Pour moi : tu appelles ptz_ContinuousMove avec des pantilt entiers (donc 100%). Il faudrait y mettre des décimaux.

Alors 2 solutions de mon point de vue :

  • Soit on modifie l’interface de configuration (mais c’est lourd, surtout pour une config, et @Loic doit valider comme tu le dis,
  • soit on rajoute 2 commandes (pour pan_x et pan_y) ? Là, on serait propre au niveau de l’implémentation du protocole PTZ Soap.