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
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
[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
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.
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.
$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 !!
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 :