J'ai taillé grave dans le code de gestion des volets, puisque je passe de 520 lignes à 124. Il y a certainement des petites choses qui pourraient être optimisées, mais je ne maîtrise pas bien toutes les subtilités des commandes Jeedom pour la partie plugin.
Désormais, les statuts sont cohérents et fonctionnent parfaitement, la position du volet (en %) est cohérente pour peu que vous paramétriez le temps de mouvement de votre volet dans la commande 'status'. Bon, ne vous attendez pas non plus à une précision au millimètre hein, la cohérence elle est juste visuelle.
Il me reste à tester avec un volet 'commande inversé' avant de donner les fichiers modifiés à ceux qui sont intéressés. Il vous suffira d'utiliser le plugin 'outilsdev' pour mettre ces fichiers là où il faut.
Je vais aussi rajouter des statuts supplémentaires afin de pouvoir interfacer le plugin Myhome avec le plugin voletProp de mika-nt28. Le but, pouvoir piloter mes volets non plus en tout ou rien, mais en positionnement.
Mes volets disposant de lames ajourées, ça me permettra de laisser passe la lumière l'été tout en empêchant la chaleur d'entrer. Pour ce faire, j'aurai juste à envoyer une commande avec la position souhaitée (10% par exemple) et les volets se positionneront à cette position grâce au plugin de mika.
Mon code simplifié:
Code : Tout sélectionner
public static function updateStatusShutter($decrypted_trame, $scenarios=false) {
/*
// FONCTION : MISE A JOUR DU STATUS DES VOLETS
// PARAMS : $decrypted_trame = array(
"trame" => string,
"mode" => string,
"media" => 'string',
"format" => 'string',
"type" => 'string',
"value" => string,
"dimension" => string,
"param" => string,
"id" => string,
"unit" => string,
"date" => timestamp
$scenarios => boolean (true si l'on doit recherche des scenarios associés)
*/
$def = new myhome_def();
$myhome = myhome::byLogicalId($decrypted_trame["id"], 'myhome');
$unit = $decrypted_trame["unit"];
$deviceType = explode('::', $myhome->getConfiguration('device'));
$subDeviceType = $deviceType[1];
//Récupération de l'horodatage de la commande
$timestampCmd = strtotime($decrypted_trame["date"]);
//Récupération des derniers statuts
$statusId = 'status'.$unit;
$statusCmd = $myhome->getCmd('info', $statusId);
$maxDuration = $statusCmd->getConfiguration('maxDuration');
$lastStatus = $statusCmd->execCmd(null,2);
$positionId = 'position'.$unit;
$positionCmd = $myhome->getCmd('info', $positionId);
$lastPosition = $positionCmd->getConfiguration('returnStateValue');
$lastStatusUpdate = $statusCmd->getConfiguration('updatedate');
log::add('myhome','debug','[date] =>'.$decrypted_trame["date"].' [cmd] => '.$decrypted_trame["value"].' [timestampCmd] => '.$timestampCmd);
log::add('myhome','debug','[cmdId] => '.$statusCmd->getId().' [lastStatusUpdate] => '.$lastStatusUpdate.' [lastStatus] => '.$lastStatus.' [lastPosition] => '.$lastPosition.' [maxDuration] => '.$maxDuration);
//Contrôle si update des statuts nécessaire
if ($decrypted_trame["value"] == 'MOVE_UP'
|| $decrypted_trame["value"] == 'MOVE_DOWN'
|| $decrypted_trame["value"] == 'MOVE_STOP') {
$shutterCmd = $decrypted_trame["value"];
}
else {
return;
}
//gestion des temps ouverture/fermeture en fonction de la date
if (is_numeric($maxDuration)) {
$maxMoveTime = $maxDuration;
}
else {
$maxMoveTime = 30;
}
//Mise à jour de la position et du statut du volet
$movementTime = 0;
$deplacement = 0;
switch ($shutterCmd) {
case "MOVE_UP" :
if ($lastStatus == 'UP' || $lastStatus == 'OPEN') {
log::add('myhome','debug','[cmd] => '.$decrypted_trame["value"].' [lastStatus] => '.$lastStatus.' Mise à jour du statut non nécéssaire!');
return;
}
if ($lastStatus == 'DOWN') {
$movementTime = $timestampCmd - $lastStatusUpdate;
$deplacement = round($movementTime * 100 / $maxMoveTime);
}
$status = 'UP';
break;
case "MOVE_DOWN" :
if ($lastStatus == 'DOWN' || $lastStatus == 'CLOSED') {
log::add('myhome','debug','[cmd] => '.$decrypted_trame["value"].' [lastStatus] => '.$lastStatus.' Mise à jour du statut non nécéssaire!');
return;
}
if ($lastStatus == 'UP') {
$movementTime = $timestampCmd - $lastStatusUpdate;
$deplacement = round(-$movementTime * 100 / $maxMoveTime);
}
$status = 'DOWN';
break;
case "MOVE_STOP":
if ($lastStatus != 'UP' && $lastStatus != 'DOWN') {
log::add('myhome','debug','[cmd] => '.$decrypted_trame["value"].' [lastStatus] => '.$lastStatus.' Mise à jour du statut non nécéssaire!');
return;
}
$movementTime = $timestampCmd - $lastStatusUpdate;
$deplacement = round($movementTime * 100 / $maxMoveTime);
if ($lastStatus == 'DOWN') {
$deplacement = -$deplacement;
}
break;
defaut :
return;
}
log::add('myhome','debug','[movementTime] => '.$movementTime.' [deplacement] => '.$deplacement.'%'.' [lastPosition] => '.$lastPosition);
$position = $lastPosition + $deplacement;
if ($status != 'UP' && $status != 'DOWN') {
$status = $position;
if ($position >= 100) {
$position = 100;
$status = 'OPEN';
}
if ($position <= 0) {
$position = 0;
$status = 'CLOSED';
}
}
log::add('myhome','debug','[cmd] => '.$decrypted_trame["value"].' [lastStatus] => '.$lastStatus.' [newStatus] => '.$status.' [newPosition] => '.$position.' Mise à jour du statut!');
$statusCmd->setConfiguration('updatedate',$timestampCmd);
$statusCmd->setConfiguration('returnStateValue',$status);
$statusCmd->setConfiguration('returnStateTime',$movementTime);
$positionCmd->setConfiguration('updatedate',NULL);
$positionCmd->setConfiguration('returnStateValue',$position);
$positionCmd->setConfiguration('returnStateTime',$movementTime);
$statusCmd->save();
$positionCmd->save();
$statusCmd->event($status);
$positionCmd->event($position);
}