Bonjour,
dans le plugin que j’ai développé, il y a plusieurs champs d’info et notamment un status.
Dans la function execute de cette info, je calcul le status en fonction de différents critères et je fini par un return $outputStatus;
Dans certains cas (indeterminer?) la valeur de l’info status est bien mise a jour mais dans d’autre cas non et je ne trouve pas pourquoi.
Voila un extrait de log :
ActualState : 0, consigne : 19, temp 19.1, hyst : 0.25, RefTemp : 21.7, tendance : down, coéfficent d’inertie : 30%, mode : Confort
Status « Arrêté » ==> Température pour chauffer : 19.635
Nouveau Status : 1
ActualState : 1, consigne : 19, temp 19, hyst : 0.25, RefTemp : 19, tendance : up, coéfficent d’inertie : 30%, mode : Confort
Status « Chauffage » ==> Température pour arreter : 19.175
Nouveau Status : 1
ActualState : 1, consigne : 19, temp 19.3, hyst : 0.25, RefTemp : 19, tendance : up, coéfficent d’inertie : 30%, mode : Confort
Status « Chauffage » ==> Température pour arreter : 19.175
Nouveau Status : 0
ActualState : 1, consigne : 19, temp 19.5, hyst : 0.25, RefTemp : 19, tendance : up, coéfficent d’inertie : 30%, mode : Confort
Status « Chauffage » ==> Température pour arreter : 19.175
Nouveau Status : 0
ActualState : 1, consigne : 19, temp 20, hyst : 0.25, RefTemp : 19, tendance : up, coéfficent d’inertie : 30%, mode : Confort
On voit par exemple ci dessus qu’au depart, le status est a 0 et que la valeur calculer est 1 (Nouveau Status : 1)
Ensuite on repasse dans la fonction, et la le status actuel est bien a 1 (ActualState : 1) donc c’est OK
Le status calculer reste 1 donc tous va bien
Ensuite on repasse dans la fonction, le status actuel est 1 et on calcul un nouveau status a 0.
Ensuite on repasse dans la fonction et la le status actuel est 1 (alors qu’il aurait du être a 0)
Voila le code la fonction au cas ou c’est nécessaire (j’ai enlever des parties pas utiliser de la fonction) :
case 'status':
//Gestion de la température de référence (le pic haut ou bas)
$mode = $this->getEqLogic()->getCmd('info', 'mode')->execCmd();
$needSave = false;
$actualState = $this->execCmd();
//Pour réinitialiser l'enregistrement de l'historique
$this->setCollectDate('');
$outputStatus = $actualState;
$actualTemp = $this->getEqLogic()->getCmd(null, 'associatedTemperatureSensor')->execCmd();
$cmdSetPoint = $this->getEqLogic()->getCmd(null, 'adjustedSetPoint');
if ($actualState && $cmdSetPoint->getConfiguration('RefTemp') > $actualTemp) {
$cmdSetPoint->setConfiguration('RefTemp', $actualTemp);
$needSave = true;
} else if (!$actualState && $cmdSetPoint->getConfiguration('RefTemp') < $actualTemp) {
$cmdSetPoint->setConfiguration('RefTemp', $actualTemp);
$needSave = true;
}
$actualSetPoint = $cmdSetPoint->execCmd();
$hysteresis = $this->getEqLogic()->getConfiguration('hysteresis');
$inertiaFactor = $this->getEqLogic()->getConfiguration('inertiaFactor');
if ($inertiaFactor < 0) $inertiaFactor = 0;
if ($inertiaFactor > 90) $inertiaFactor = 90;
log::add('boilerThermostat', 'debug', 'Thermostat : ' . $this->getEqLogic()->getHumanName() . ', ActualState : ' . $actualState . ', consigne : ' . $actualSetPoint .
', temp ' . $actualTemp . ', hyst : ' . $hysteresis . ', RefTemp : ' . $cmdSetPoint->getConfiguration('RefTemp') .
', tendance : ' . ($cmdSetPoint->getConfiguration('RefTemp') - $actualTemp > 0 ? 'down' : 'up') .
', coéfficent d\'inertie : ' . $inertiaFactor . '%' . ', mode : ' . $mode);
$startHeatingTemp = $actualSetPoint - $hysteresis + ($cmdSetPoint->getConfiguration('RefTemp') - ($actualSetPoint - $hysteresis)) * $inertiaFactor / 100;
$stopHeatingTemp = $actualSetPoint + $hysteresis - (($actualSetPoint + $hysteresis) - $cmdSetPoint->getConfiguration('RefTemp')) * $inertiaFactor / 100;
if (!$actualState) {
log::add('boilerThermostat', 'info', 'Thermostat : ' . $this->getEqLogic()->getHumanName() . ', Status "Arrêté" ==> Température pour chauffer : ' . $startHeatingTemp);
} else {
log::add('boilerThermostat', 'info', 'Thermostat : ' . $this->getEqLogic()->getHumanName() . ', Status "Chauffage" ==> Température pour arreter : ' . $stopHeatingTemp);
}
//Check if heating is necessary
if ($mode == 'Off' || $this->getEqLogic()->getManagerState() == 0) {
$displayParam = $cmdSetPoint->getDisplay('parameters');
if ($displayParam['couleur'] != 'black') {
$displayParam['couleur'] = 'black';
$displayParam['fontcolor'] = 'black';
$cmdSetPoint->setDisplay('parameters', $displayParam);
//$cmdSetPoint->save();
$needSave = true;
$this->getEqLogic()->processChildActuators(2);
//$this->getEqLogic()->getCmd(null, 'statusName')->event(__('Off', __FILE__));
$this->getEqLogic()->CheckAndUpdateCmd('statusName', __('Off', __FILE__));
$outputStatus = 0;
}
} else if (($actualTemp <= $actualSetPoint - $hysteresis
|| ($cmdSetPoint->getConfiguration('RefTemp') - $actualTemp > 0 &&
$actualTemp <= $startHeatingTemp && $actualTemp <= $actualSetPoint + $hysteresis))) {
if ($actualState == 0 || $actualState == '') {
$displayParam = $cmdSetPoint->getDisplay('parameters');
$displayParam['couleur'] = 'red';
$displayParam['fontcolor'] = 'white';
$cmdSetPoint->setDisplay('parameters', $displayParam);
//$cmdSetPoint->save();
$needSave = true;
$this->getEqLogic()->processChildActuators(1);
//$this->getEqLogic()->getCmd(null, 'statusName')->event(__('Chauffage', __FILE__));
$this->getEqLogic()->CheckAndUpdateCmd('statusName', __('Chauffage', __FILE__));
}
$outputStatus = 1;
}
//Check if stop heating is necessary
else if (($actualTemp >= $actualSetPoint + $hysteresis
|| ($cmdSetPoint->getConfiguration('RefTemp') - $actualTemp < 0 &&
$actualTemp >= $stopHeatingTemp && $actualTemp >= $actualSetPoint - $hysteresis))) {
$displayParam = $cmdSetPoint->getDisplay('parameters');
if ($actualState == 1 || $actualState == '' || $displayParam['couleur'] == 'black') {
$displayParam = $cmdSetPoint->getDisplay('parameters');
$displayParam['couleur'] = 'grey';
$displayParam['fontcolor'] = 'white';
$cmdSetPoint->setDisplay('parameters', $displayParam);
//$cmdSetPoint->save();
$needSave = true;
$this->getEqLogic()->processChildActuators(2);
//$this->getEqLogic()->getCmd(null, 'statusName')->event(__('Arrêté', __FILE__));
$this->getEqLogic()->CheckAndUpdateCmd('statusName', __('Arrêté', __FILE__));
}
$outputStatus = 0;
}
log::add('boilerThermostat', 'info', 'Thermostat : ' . $this->getEqLogic()->getHumanName() . ', Nouveau Status : ' . $outputStatus);
if ($needSave) $cmdSetPoint->save();
return $outputStatus;
break;
Je suis dsl la fonction est un peu longue mais ne vous pencher pas trop sur la logique (un peu tordu surement car c’est ma logique ^^) car le resultat de $outputStatus est toujours correct dans la dernière ligne de log, mon problème est bien que cette valeur n’est pas prise en compte.
J’avais déjà eu des problème de ce type mais c’était lorsque j’utilisais execCmd() sans faire ensuite un setCollectDate(‹ ›); mais la je le fait.
Je pourrais surement faire un CheckAndUpdate sur la valeur mais est ce normal ? Sachant que ça fonctionnait bien avant (oui mais avant quoi?..) y’a t il eu des changements que j’aurais raté a ce niveau la?
J’ajoute de plus qu’un seul utilisateur me remonte ce pbm et qu’a piori je n’ai pas ce pbm chez moi.
Merci d’avance au courageux qui lieront ce post.
A+