Hello.
Ras-le-bol de ce module qui donne des valeurs fantaisistes de consommation.
Problème connu des communautés, mais jamais corrigé par le fabricant.
Attention, ne concerne que le module NAS-WR01ZE, pas le module NAS-WR01Z qui, lui, fonctionne.
Le firmware 2.32 semble être le dernier en date pour ce module, et le problème existe également sur la version 2.23.
La valeur est proche du min admissible : -2147483647 kWh.
J’en parle sur ce sujet : NAS-WR01ZE, vers l'infini et... Jeedom - Flobul-Domotique
Première solution : Filtrage
J’ai tout d’abord mis une valeur min à 0 dans jeedom.
Ca fonctionne : plus aucune valeur négative n’apparait.
Seulement, quand le module décide de ne donner que des valeurs négatives, aucune valeur ne remonte alors dans jeedom pendant quelques temps.
Deuxième solution : Recalcul
Quelques patchs sur d’autres solutions domotiques existent et je vais vous indiquer la marche à suivre, enfin celle que j’ai codée dans mon Jeedom, pour rattraper ces valeurs perdues.
Eh oui, la valeur n’est pas perdue, elle est juste mal interprétée.
Avant toute application, veuillez faire une sauvegarde de votre jeedom. Le code supprime la valeur historisée et en crée une nouvelle.
Dans un nouveau scénario pour corriger à la volée les prochaines valeurs :
Mettre en déclencheur la commande info/numeric de consommation. Possible d’en mettre plusieurs.
Ajouter un bloc SI/ALORS/SINON et mettre : triggerValue() != "" AND triggerValue() < 0
Et le bloc code suivant dans ALORS :
// Ce bloc est executé selon la commande déclencheur définie (commande Consommation en kWh) du module NAS-WR01ZE
// Recherche de la commande trigger
// supression de l'historique de cette mauvaise valeur
// recalcul de la nouvelle valeur
// ajout de la valeur calculée en déclenchant un nouvel évenement
$trigger = $scenario->getRealTrigger(); // et pas trigger() qui liste tous les déclencheurs
$cmdId = str_replace('#', '', $trigger);
$cmdTrig = cmd::byId($cmdId); // commande du déclenchement
$value = round((($cmdTrig->execCmd()*100)+2147483647)/100,2); // valeur corrigée
$cmdHistory = history::byCmdIdAtDatetime($cmdTrig->getId(), $cmdTrig->getCollectDate()); // objet history de cette valeur
$scenario->setLog("[T] Déclencheur : " . $trigger);
$scenario->setLog("[C] Date collecte : " . $cmdTrig->getCollectDate());
$scenario->setLog("[H] Valeurs history : " . json_encode(utils::o2a($cmdHistory))); // contenu de l'objet
if (is_object($cmdHistory)) {
$currentValue = $cmdHistory->getValue();
$currentDatetime = $cmdHistory->getDatetime();
$cmdHistory->remove(); //suppression de la valeur d'historique
$cmdTrig->event($value, $currentDatetime); //création de la valeur corrigée (pour déclencher toutes les actions en fonction de cette valeur (cache, return, event...) plutôt que juste remplacer la valeur de l'objet history)
$scenario->setLog("[ID] Commande ID : " . $cmdHistory->getCmd_id());
$scenario->setLog("[-] Ancienne valeur : " . $currentValue);
$scenario->setLog("[?] Nouvelle valeur : " . $value);
}
Penser à retirer la borne minValue sur la commande sinon les valeurs négatives ne seront pas vues.
C’est bien beau, mais ça ne corrige que les nouvelles valeurs, et pas les anciennes déjà historisées.
Voilà comment rattraper les anciennes valeurs.
Dans le même scénario :
Ajouter un bloc SI/ALORS/SINON et mettre : trigger() == "user"
.
Glisser ce bloc code dans ALORS :
// Ce bloc est executé manuellement via le scénario pour corriger toutes les valeurs erronées du module NAS-WR01ZE
// Recherche dans toutes les commandes déclencheur
// récupère toutes les valeurs d'historique
// supprime les mauvaises valeurs une à une
// recalcul de chaque nouvelle valeur
// ajout de cette valeur
$scenario->setLog("[X] Declencheurs " . json_encode($scenario->getTrigger()));
$triggers = $scenario->getTrigger();
foreach ($triggers as $trigger) { // parmi tous les déclencheurs listés
$cmdId = str_replace('#', '', $trigger);
$cmdTrig = cmd::byId($cmdId);
$histories = array_reverse(history::all($cmdTrig->getId())); // récupère toutes les valeurs historique
foreach ($histories as $history) { // pour chaque valeur
$currentValue = $history->getValue();
$currentDatetime = $history->getDatetime();
if ($currentValue < 0) { // si la valeur est négative
$value = round((($currentValue*100)+2147483647)/100,2); // valeur corrigée
if ($value > 100000) continue; // valeurs lissées non prises en compte
$scenario->setLog("[ID] Commande ID : " . $history->getCmd_id());
$scenario->setLog("[-] Ancienne valeur : " . $currentValue);
$scenario->setLog("[?] Nouvelle valeur : " . $value);
$history->setValue($value)->save(null, true); // on remplace directement la valeur, pas besoin de réaffecter le cache ou autre
$scenario->setLog("[+] Confirmation valeur : " . $history->getValue());
//history::removes($history->getCmd_id(), $currentDatetime, $currentDatetime); // supprime la valeur historisée mauvaise
}
}
}
Et glisser toute la partie précédente dans le bloc SINON.
Ce qui donne :
Voilà le template du scénario à importer : NAS-WR01ZE.json.txt (12,7 Ko)
Ce code est une base de modification, n’hésitez pas à apporter vos suggestions.