jeedom-zigate / jeedom-plugin-zigate

Plugin Jeedom for ZiGate key.
MIT License
29 stars 12 forks source link

Calcul du % de batterie... #47

Closed llaumgui closed 6 years ago

llaumgui commented 6 years ago

Aller, je lance le troll, il y a 3 méthodes actuellement:

On pourrait voir lequelle est la mieux et l'adopter.

doudz commented 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

llaumgui commented 6 years ago

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

doudz commented 6 years ago

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

doudz commented 6 years ago

Si qqn à les sources du plugin Xiaomi pour comparer

llaumgui commented 6 years ago

Le sujet est sensible là bas aussi: https://www.jeedom.com/forum/viewtopic.php?p=456691#p456691

doudz commented 6 years ago

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

llaumgui commented 6 years ago

Yes, la question est de benchmarcké les 3 solutions et voir la meilleure VS les spécificité du fabriquant.

llaumgui commented 6 years ago

Du coup dans tous les cas, c'est pas le plugin mais le daemon Python qui fait le calcul ?

doudz commented 6 years ago

Oui

llaumgui commented 6 years ago

Je ferme car côté Python.

doudz commented 6 years ago

à 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 image

llaumgui commented 6 years ago

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 ?

doudz commented 6 years ago

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

llaumgui commented 6 years ago

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 ?

doudz commented 6 years ago

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

doudz commented 6 years ago

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.

llaumgui commented 6 years ago

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...

llaumgui commented 6 years ago

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 ?

doudz commented 6 years ago

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

llaumgui commented 6 years ago

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]);
doudz commented 6 years ago

Non il n'est pas remonté

llaumgui commented 6 years ago

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.

doudz commented 6 years ago

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
llaumgui commented 6 years ago

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 ?

doudz commented 6 years ago

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)

llaumgui commented 6 years ago

Ce mettre en phase avec ce commit: https://github.com/doudz/zigate/commit/cb550a6e258a0229d6a03ebc5097abca172c121c