nebz
Mars 15, 2024, 1:08
21
alors il faut renvoyer null et tester null partout plutot que is_nan
Ou vérifier avant si pas de valeur en 1er :
if ($temperature->execCmd() == '' || is_nan($temperature->execCmd())) {
nebz
Mars 15, 2024, 1:12
23
is_nan c’est pour les divisions par zero ou les résultats mathématiques impossibles, donc pas indiqué ici
NAN
est retourné par les opérations mathématiques qui ne sont pas définies, par exemple lors du passage de paramètres en dehors du domaine d’entrée de la fonction. La racine carrée (sqrt() ) n’est définie que pour les nombres positifs, le passage d’un nombre négatif résultera en un NAN
. D’autres exemples d’opérations renvoyant NAN
sont la division de INF
par INF
et toute opération impliquant une valeur NAN
existante.
il faut le remplacer comme @Phpvarious le disait par !is_numeric qui a plus de sens, et dans tous les plugins !!! j’ai 12 occurences code sur le github de jeedom !
Effectivement is_nan ne semble pas adapté, j’ai pensé a tort quelle ce comportait comme la fonction js.
nebz
Mars 15, 2024, 1:18
25
plutot comme Number.isNaN()
en javascript
nebz
Mars 15, 2024, 1:23
26
dans le plugin docker2 par exemple, elle a du sens !
1 « J'aime »
nebz
Mars 15, 2024, 1:27
27
j’ai fixé le plugin thermostat en beta + openvpn en beta.
@loic je fais le tour du core ou tu t’en charges ?
Loic
Mars 15, 2024, 1:43
28
Je peux me faire mais pas sur d’avoir tout compris, si je resume :
forcer le typage de tous les getId en int
si commande de type numérique renvoyer soit null soit la valeur en int lors du execCmd ?
nebz
Mars 15, 2024, 1:45
29
non juste revoir les is_nan en !is_numeric, je suis en train de faire un PR
pour les getId c’est un autre problème, car il faudrait aussi mettre à jour toutes les foreign keys…
le second c’est breaking change dans certain cas, donc faut voir…
Loic
Mars 15, 2024, 2:18
31
Top merci c’est corrigé. Pour les getId faut je vois l’impact mais pour moi il devrait pas etre aussi gros que ca, car en vrai ya pas de typage dans une requete sql sur les int donc ca devrait pas poser de soucis.
Autre soucis que j’ai remarqué (je suis sur un thermostat vierge)
Erreur sur thermostat::pull() : Unsupported operand types: string - int
if (!is_numeric($temp_in)) {
if ($thermostat->getCache('temp_threshold', 0) == 0) {
log::add(__CLASS__, 'error', $thermostat->getHumanName() . ' ' . __("La température intérieure n'est pas un numérique", __FILE__) . ' : ' . $temp_in);
}
log::add(__CLASS__, 'debug', $thermostat->getHumanName() . ' ' . __("Je ne fais rien car la température intérieure n'est pas un numérique", __FILE__));
$thermostat->setCache('temp_threshold', 1);
$thermostat->getCmd(null, 'status')->event(__('Défaillance sonde', __FILE__));
return;
}
$thermostat->setCache('temp_threshold', 0);
if (($temp_in < ($thermostat->getCache('lastOrder') - $thermostat->getConfiguration('offsetHeatFaillure', 1)) && $temp_in < $thermostat->getCache('lastTempIn') && $thermostat->getCache('lastState') == 'heat' && $thermostat->getConfiguration('coeff_indoor_heat_autolearn') > 25) ||
($temp_in > ($thermostat->getCache('lastOrder') + $thermostat->getConfiguration('offsetColdFaillure', 1)) && $temp_in > $thermostat->getCache('lastTempIn') && $thermostat->getCache('lastState') == 'cool' && $thermostat->getConfiguration('coeff_indoor_cool_autolearn') > 25)
) {
$thermostat->setCache('nbConsecutiveFaillure', $thermostat->getCache('nbConsecutiveFaillure') + 1);
if ($thermostat->getCache('nbConsecutiveFaillure', 0) == 2) {
log::add(__CLASS__, 'error', $thermostat->getHumanName() . ' ' . __('Attention une défaillance du chauffage est détectée', __FILE__));
$thermostat->failureActuator();
}
} else {
$thermostat->setCache('nbConsecutiveFaillure', 0);
}
Il n’y a pas de défaut
sur getCache()
Loic
Mars 15, 2024, 2:33
33
Je viens de pousser la correction ca sera bon dans la beta de demain, merci pour le retour.
1 « J'aime »
Idem ici :
}
}
}
}
$delta = $thermostat->getCache('deltaOrder', 0);
if ($delta > 0) {
log::add(__CLASS__, 'debug', $thermostat->getHumanName() . ' ' . __('Delta consigne > 0', __FILE__) . ' (' . $delta . '), ' . __('je lance le calcul avec consigne - delta/2', __FILE__));
$delta = $delta / 2;
}
$consigne = $thermostat->getCmd(null, 'order')->execCmd();
$temporal_data = $thermostat->calculTemporalData($consigne - $delta);
if ($temporal_data['power'] > 0 && $delta > 0) {
log::add(__CLASS__, 'debug', $thermostat->getHumanName() . ' ' . __('Power > 0 et delta consigne > 0', __FILE__) . ' (' . $delta . '), ' . __('je relance le calcul avec consigne + delta/2', __FILE__));
$temporal_data = $thermostat->calculTemporalData($consigne + $delta);
}
$thermostat->setCache('last_power', $temporal_data['power']);
$cycle = jeedom::evaluateExpression($thermostat->getConfiguration('cycle'));
$duration = round(($temporal_data['power'] * $cycle) / 100);
$thermostat->setCache('lastOrder', $consigne);
$thermostat->setCache('lastTempIn', $temp_in);
$thermostat->setCache('lastTempOut', $temp_out);
$consigne
renvoi une chaine vide donc
Erreur sur thermostat::pull() : Unsupported operand types: string - int
Loic
Mars 15, 2024, 3:04
35
Ca c’est plus compliqué car c’est un changement dans le core a faire, sauf que la on est en freeze donc je pourrais pas faire passer un changement aussi lourd. Il va falloir attendre le 19 avril de mémoire pour que je puisse corriger.
nebz
Mars 15, 2024, 3:40
36
Ah donc y’a une date pour la 4.4
3 « J'aime »
Loic
Mars 15, 2024, 4:13
37
Une fenêtre en tout cas pour le moment mais rien de sûr ça va dépendre du retour sur les tests en cours
Il faut que je passe en BETA du coup ?
Merci en tout cas. Super interactifs l’equipe !
Les modifications sont disponible sur le plugin en version béta, mais attention c’est pas pour autant que tu n’auras pas d’autres erreurs.
Techniquement, la version en prérequis pour le core V4.4 est Debian 11 “Bullseye”
1 « J'aime »