Closed llaumgui closed 6 years ago
il apparait que certains équipements fournissent le % mais pas les XIAOMI d'où la nécessité de calculer d'après le voltage de la pile
Yes, c'est ce que j'ai compris. Mais la méthode de calcul est différentes entre les plugins. Et certaines personnes trouve que celle d'abeille est plus juste: https://www.jeedom.com/forum/viewtopic.php?p=641876#p641876 & https://www.jeedom.com/forum/viewtopic.php?p=643033#p643033
j'ai regardé comment fait Abeille : 3.1V = 100% 2.7V = 0% linéaire entre les 2
lib python actuel: 3.2V = 100% 0.9x3.2 soit 2.88 = 0% linéaire entre les 2
Si qqn à les sources du plugin Xiaomi pour comparer
Le sujet est sensible là bas aussi: https://www.jeedom.com/forum/viewtopic.php?p=456691#p456691
Oui , il ne faut pas oublier que le pourcentage c'est une estimation pour le confort de l'utilisateur car il n'y a pas de jauge dans la pile... il faut savoir aussi que le voltage dépend de la température et de la consommation donc le pourcentage peut varier et plus ou moins durant la journée
Yes, la question est de benchmarcké les 3 solutions et voir la meilleure VS les spécificité du fabriquant.
Du coup dans tous les cas, c'est pas le plugin mais le daemon Python qui fait le calcul ?
Oui
Je ferme car côté Python.
à voir, actuellement je considère que le % évolue de façon linéaire en fonction de la tension mais en réalité ce n'est pas le cas
Mais @doudz le calcul n'est pas ici: https://github.com/Jeedom-Zigate/jeedom-plugin-zigate/blob/master/core/class/zigate.class.php#L121 ? Ou alors c'est le fallback lorsque le daemon ne le remonte pas ?
Ah effectivement, j'ai répliqué le calcul qui est fait dans la lib python directement dans le plugin, j'avais oublié ce point. Le but était de pouvoir faire le calcul sans faire d'échange entre Jeedom et le démon. Je ne sais si c'est une bonne idée car ça fait double emploi et finalement les transferts entre jeedom et le démon sont assez rapide donc ce bout de code pourrait être modifier pour interroger directement la lib python
Je suis en train de lire / documenter / comprendre le code.
Pour moi c'est plus un fallback vu qu'il fait un $percent = $this->getProperty('battery_percent');
avant ?
Car si on récupère directement depuis la lib, ça doit remonter avec les autres propriétés ?
Non pas vraiment getProperty('battery_percent')
permet d'avoir le pourcentage de batterie dans le cas où l'équipement zigbee le propose, ce qui n'est pas le cas de XIAOMI par exemple (en fait je n'ai jamais vu ce cas encore). Si la valeur n'existe pas alors on l'estime.
La lib python fait exactement la même chose, on regarde si la valeur battery_percent existe, sinon on la calcule
C'est pour ça qu'il faudrait peut-être modifier la fonction du plugin pour interroger la lib au lieu de faire le calcul dans le plugin, ça évite d'avoir 2 codes identiques à maintenir.
Dans un premier tu peux aussi simplement modifier le code dans le plugin pour avoir un calcul juste et dans un 2e temps je modifierai le code python pour avoir le même fonctionnement.
De toute façon la méthode n'est appelée que pour la création (_create_command), donc le cout en appel de lib va pas être énorme...
Du coup, pour récupérer depuis la lib il me sufferais de faire un :
zigate::callZiGate('get_device_from_addr', [$addr]);
Et toi faut que tu rajoute un battery_percent lorsqu'il est pas présent ?
Attention, le code n'est pas appelé uniquement à la création, mais à chaque fois que l'attribut battery est mis à jour la fonction update_command (appelé lorsqu'un attribut est mis à jour) utilise aussi la fonction _create_command, l'intérêt est d'avoir un seul et même code pour créer et mettre à jour une commande
OK. Mais tu me confirmes que pour le moment battery_percent n'est pas systématiquement remonté par
zigate::callZiGate('get_device_from_addr', [$addr]);
Non il n'est pas remonté
Ok, donc faut le mieux est de laisser comme ça. Attendre la modification côté lib Python et le récupérer. Comme ça on sera uniforme.
Ou alors modifier le démon pour ajouter une fonction permettant de récupérer la valeur
Exemple :
zigate::callZiGate('get_device_battery_percent', [$addr]);
Et dans le démon ajouter après la ligne 97 :
elif hasattr(self, action):
func = getattr(self, action)
response['result'] = func(*args)
et toujours dans la classe JeedomHandler ajouter la fonction get_device_battery_percent
def get_device_battery_percent(self, addr):
device = z.get_device_from_addr(addr)
return device.battery_percent
Mais n'est-ce pas à la lib de remonter des choses de manières régulières ? De palier au fait que Xiaomi ne remonte pas de % ? Plutôt qu'au plugin de supporter ceci ?
XIAOMI remonte uniquement le voltage de la batterie et c'est pour l'utilisateur final qu'on souhaite afficher le pourcentage Donc pour moi il est normal que lorsque la lib (la zigate) indique que le voltage a changé, le plugin recalcule le pourcentage. Et dans un souci de cohérence du résultat, le plugin demande à la lib python de faire le calcul (au lieu de faire le calcul comme actuellement)
Ce mettre en phase avec ce commit: https://github.com/doudz/zigate/commit/cb550a6e258a0229d6a03ebc5097abca172c121c
Aller, je lance le troll, il y a 3 méthodes actuellement:
On pourrait voir lequelle est la mieux et l'adopter.