Bloc code - erreur sur getHumanName sur l'objet d'un équipement sans objet

Lorsqu’on appelle la commande getHumanName() sur un equipement qui n’est affecté à aucun objet, on a une erreur PHP plutot que la valeur « aucun » (comme c’est le cas à l’affichage dans Jeedom) ou juste une valeur vide

$eqLogicHumanName  = $eqLogic->getHumanName();

renvoie

Call to a member function getHumanName() on null

Erreur qui fait sortir du bloc code

Norbert

Salut,

Non je ne pense pas que l’erreur soit là
C’est quoi $eqLogic dans ton code? Car c’est lui qui est « null » sur lequel tu appelles getHumanName
Tu appellerais getId tu aurais la même erreur

bonjour @Mips

Tu as raison, ce n’ets pas la ligne que je pensais qui me renvoie cette erreur !

Voilà le bout de code :

  $eqLogicId         = $eqLogic->getId();
  $eqLogicHumanName  = $eqLogic->getHumanName();
  $scenario->setLog($eqLogicHumanName);
  $objectHumanName   = $eqLogic->getObject()->getHumanName();
  $scenario->setLog($objectHumanName);

et le retour

[2023-05-16 07:27:08][SCENARIO] [Aucun][0xdc8e95fffe2e1139]
[2023-05-16 07:27:08][SCENARIO] Call to a member function getHumanName() on null

C’est donc la ligne :

$eqLogic->getObject()->getHumanName();

Du coup, c’est effectivement un objet vide (aucun dans l’IHM de Jeedom), mais est-ce que ca ne devrait pas renvoyer une chaine vide, ou aucun, ou 0, ou …
→ La question (existancielle !) est donc de savoir si le rien est quand même quelquechose :grin:

Norbert

Non si pas d’objet assigné getObject renvoi null. C’est normal.
L’objet (pièce) n’existe pas donc impossible de renvoyer un objet (au sens programmation)

Le core gère en testant si null.

On pourrait imaginer que getObject renvoi un objet « statique » qui correspondrait à un faux objet « aucun » mais voilà là ça n’existe pas.
Et l’objet « aucun » ne peut pas exister réellement car en db ça bloquerait: le nom de l’équipement est unique par objet sauf dans l’objet « aucun » (car justement il n’existe pas). Si on avait pas ça il y aurait trop de problème de duplicate lors de la création des équipements par les plugins.

du coup, je ne m’y connais pas assez un php. Comment je peux tester ce retour « null » sans que ca crashe mon bloc code ?

Norbert

Je suis sur téléphone donc il y a pe des erreurs de syntaxes mais un truc du genre devrait faire l’affaire

$name = $eqLogic->getObject()->getHumanName() ?? 'Aucun'

Cherches « null coalescing » sur le net pour l’explication détaillé de ?? mais en gros ça renvoi la première partie si pas null sinon la partie a droite

Je ne suis juste plus sur si en php il y a propagation ou non du null.
Car ici c’est getObject qui renvoi null donc il faudrait déjà interrompre le code à ce moment et renvoyer ce qui est à droite.
Si ça marche pas alors un simple test fera l’affaire.

If (!is_null(xxxx->getObject()) ...

@ngrataloup,

Je ne vois pas où tu définis $eqLogic, tu peux nous montrer la définition stp ?

Pour ne pas crasher le bloc code, tu as try et catch.

voilà le bout de code …

$plugin               = "zigbee2mqtt";
foreach (eqLogic::byType($plugin, true) as $eqLogic)     // pour chaque equipement du plugin
{
  $eqLogicId         = $eqLogic->getId();
  $eqLogicHumanName  = $eqLogic->getHumanName();
  $scenario->setLog($eqLogicHumanName);
  $objectHumanName   = $eqLogic->getObject()->getHumanName();
  $scenario->setLog($objectHumanName);
  $objectId          = $eqLogic->getObject()->getId();
  $deviceModel       = $eqLogic->getConfiguration('device_model');
.....

… Et du coup, au moindre équipement du plugin zigbee2mqtt non affecté à un objet (ce qui est le cas lorsque j’integre un nouveau truc !), mon code crashe !!

Norbert

Hello,

Ton erreur est clairement sur cette ligne :

Si tu regarde le code de eqLogic::getHumanName() dans le Core, tu verras qu’il y a un traitement spécial au cas où eqLogic::getObject() ne renvoie pas un objet :

$object = $this->getObject();
if (is_object($object)) {
	$name .= $object->getHumanName($_tag, $_prettify);
} else {
	if ($_tag) {
		$name .= '<span class="label labelObjectHuman" style="text-shadow : none;">' . __('Aucun', __FILE__) . '</span>';
	} else {
		$name .= '[' . __('Aucun', __FILE__) . ']';
	}
}

Bad

C’est ce que je disais non?