Il faut aussi savoir que l'interrupteur envoie une commande STOP sur le réseau lorsque le volet arrive en butée ou après un timeout (>30 secondes) si la gestion des butées n'est pas active. C'est la réception de cette commande STOP qui va générer les états OPEN ou CLOSE si le temps de déplacement du volet a été suffisamment long.
Par contre, la gestion du temps de déplacement du volet me semble bien compliquée par rapport à ce que tu as fait dans voletProp et par rapport à ce que j'ai l'habitude de faire au boulot sur des installations automatisées.
Je te joins le bout de code qui gère les états des volets.
Pour voletProp, si j'ai bien compris, tu attends des états binaires?
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,
"format" => 'string',
"type" => 'string',
"value" => string,
"dimension" => string,
"param" => string,
"id" => string,
"unit" => string,)
$scenarios => boolean (true si l'on doit recherche des scenarios associés)
*/
$def = new myhome_def();
//Creation des variables utiles
$myhome = myhome::byLogicalId($decrypted_trame["id"], 'myhome');
$unit = $decrypted_trame["unit"];
$device_type = explode('::', $myhome->getConfiguration('device'));
$sousdevice = $device_type[1];
//On recupere la date de l'action et on ajoute le temps du relais interne
$date = strtotime($decrypted_trame["date"]);
//recuperation du derniere etat connu ET des possibilites
$statusid = 'status'.$unit;
$myhomecmd = $myhome->getCmd('info', $statusid);
$duree_cmd = $myhomecmd->getConfiguration('DureeCmd');
$last_status = $myhomecmd->execCmd(null,2);
$statusidnum = 'statusnum'.$unit;
$myhomecmdnum = $myhome->getCmd('info', $statusidnum);
$updatedate=$myhomecmd->getConfiguration('updatedate');
log::add('myhome','debug',' last : '.$last_status.' Sous_device : '.$sousdevice. ' duréecmd : '.$duree_cmd.' id cmd : '.$myhomecmd->getId() . " date : ".$date);
//on test s'il faut faire un update des statuts
if ($decrypted_trame["value"] == 'MOVE_UP'
|| $decrypted_trame["value"] == 'MOVE_DOWN'
|| $decrypted_trame["value"] == 'MOVE_STOP') {
$value = $decrypted_trame["value"];
//Il ne s'agit pas d'une mise à jour
}
else {
return;
}
//gestion des temps ouverture/fermeture en fonction de la date
if (is_numeric($duree_cmd)) {
$move_time = $duree_cmd;
}
else {
$move_time = 30;
}
//mise a jour en fonction du mouvement demande
log::add('myhome','debug',' sousdevice : '.$sousdevice.' statusid : '.$statusid.' statusidnum : '.$statusidnum . " updatedate : ".$updatedate);
if ($sousdevice =='00') {
//Si il s'agit d'un bouton normal
log::add('myhome', 'debug', " Bouton normal \n");
if ($value == 'MOVE_UP') {
log::add('myhome', 'debug', "Action MOVE_UP");
//Si le volet est en train de monter
if ($last_status == 'UP') {
$status = 'UP';
$new_pos= ($move_time - ($updatedate - $date))/$move_time*100;
$statusnum = round($new_pos);
if ($new_pos >= 100) {
$status = 'OPEN';
$statusnum = 100;
$myhomecmd->setConfiguration('updatedate',NULL);
$myhomecmd->setConfiguration('returnStateValue',NULL);
$myhomecmd->setConfiguration('returnStateTime',NULL);
$myhomecmdnum->setConfiguration('updatedate',NULL);
$myhomecmdnum->setConfiguration('returnStateValue',NULL);
$myhomecmdnum->setConfiguration('returnStateTime',NULL);
}
//Si le volet est deja en haut
}
elseif ($last_status == '100' || $last_status == 'OPEN') {
$status = 'OPEN';
$statusnum = 100;
//Si le volet change de sens
}
elseif ($last_status == 'DOWN') {
$status = 'UP';
$new_pos = ($move_time - ($updatedate - $date))/$move_time*100;
$statusnum = round(100-$new_pos);
if ((100-$new_pos) <= 0) {
$statusnum = 0;
$myhomecmd->setConfiguration('updatedate',NULL);
$myhomecmd->setConfiguration('returnStateValue',NULL);
$myhomecmd->setConfiguration('returnStateTime',NULL);
$myhomecmdnum->setConfiguration('updatedate',NULL);
$myhomecmdnum->setConfiguration('returnStateValue',NULL);
$myhomecmdnum->setConfiguration('returnStateTime',NULL);
}
$sec=date("s");
if ($updatedate<$date)
{
$myhomecmd->setConfiguration('updatedate',NULL);
$myhomecmdnum->setConfiguration('updatedate',NULL);
$myhomecmd->save();
$myhomecmdnum->save();
$updatedate=0;
}
$move_time = round($new_pos/100*$move_time);
$move_time_quotient = floor($move_time/60);
log::add('myhome', 'debug', " Move time : ".$move_time);
$myhomecmd->setConfiguration('updatedate',$date+$move_time);
$myhomecmd->setConfiguration('returnStateValue','OPEN');
$myhomecmdnum->setConfiguration('updatedate',$date+$move_time);
$myhomecmdnum->setConfiguration('returnStateValue',100);
$nextupdate= 1+$move_time_quotient;
$myhomecmd->setConfiguration('returnStateTime',$nextupdate);
$myhomecmdnum->setConfiguration('returnStateTime',$nextupdate);
//Si le volet est en position intermediaire ou completement ferme
}
elseif (is_numeric($last_status) || $last_status == 'CLOSED') {
if ($last_status == 'CLOSED') {
$last_status = 0;
}
$status = 'UP';
$statusnum = $last_status;
$sec=date("s");
log::add('myhome', 'debug', "Point ".$status);
$move_time = $move_time - ($last_status/100*$move_time);
$move_time_quotient = floor($move_time/60);
log::add('myhome', 'debug', " Move time : ".$move_time);
$myhomecmd->setConfiguration('updatedate',$date+$move_time);
$myhomecmd->setConfiguration('returnStateValue','OPEN');
$myhomecmdnum->setConfiguration('updatedate',$date+$move_time);
$myhomecmdnum->setConfiguration('returnStateValue',100);
$nextupdate= 1+$move_time_quotient;
$myhomecmd->setConfiguration('returnStateTime',$nextupdate);
$myhomecmdnum->setConfiguration('returnStateTime',$nextupdate);
}
else {
$status = 'OPEN';
$statusnum = 100;
}
}
elseif ($value == 'MOVE_DOWN') {
log::add('myhome', 'debug', "Action move_DOWN");
//Si le volet est en train de descendre
if ($last_status == 'DOWN') {
$status = 'DOWN';
$new_pos= ($move_time - ($updatedate - $date))/$move_time*100;
$statusnum = round(100-$new_pos);
if ((100-$new_pos) <= 0) {
$status = 'CLOSED';
$statusnum = 0;
$myhomecmd->setConfiguration('updatedate',NULL);
$myhomecmd->setConfiguration('returnStateValue',NULL);
$myhomecmd->setConfiguration('returnStateTime',NULL);
$myhomecmdnum->setConfiguration('updatedate',NULL);
$myhomecmdnum->setConfiguration('returnStateValue',NULL);
$myhomecmdnum->setConfiguration('returnStateTime',NULL);
}
//Si le volet est deja en bas
}
elseif ($last_status == '0' || $last_status == 'CLOSED') {
$status = 'CLOSED';
$statusnum = 0;
//Si le volet change de sens
}
elseif ($last_status == 'UP') {
$status = 'DOWN';
$new_pos = ($move_time - ($updatedate - $date))/$move_time*100;
$statusnum = round($new_pos);
if (($new_pos) >= 100) {
$statusnum = 100;
$myhomecmd->setConfiguration('updatedate',NULL);
$myhomecmd->setConfiguration('returnStateValue',NULL);
$myhomecmd->setConfiguration('returnStateTime',NULL);
$myhomecmdnum->setConfiguration('updatedate',NULL);
$myhomecmdnum->setConfiguration('returnStateValue',NULL);
$myhomecmdnum->setConfiguration('returnStateTime',NULL);
}
$sec=date("s");
$updatedate=$myhomecmd->getConfiguration('updatedate');
if ($updatedate<$date)
{
$myhomecmd->setConfiguration('updatedate',NULL);
$myhomecmdnum->setConfiguration('updatedate',NULL);
$myhomecmd->save();
$myhomecmdnum->save();
$updatedate=0;
}
$move_time = round($new_pos/100*$move_time);
log::add('myhome', 'debug', " Move time : ".$move_time." New_pos : ".$new_pos);
$move_time_quotient = floor($move_time/60);
log::add('myhome', 'debug', " Move time : ".$move_time);
$myhomecmd->setConfiguration('updatedate',$date+$move_time);
$myhomecmd->setConfiguration('returnStateValue','CLOSED');
$myhomecmdnum->setConfiguration('updatedate',$date+$move_time);
$myhomecmdnum->setConfiguration('returnStateValue',0);
$nextupdate= 1+$move_time_quotient;
$myhomecmd->setConfiguration('returnStateTime',$nextupdate);
$myhomecmdnum->setConfiguration('returnStateTime',$nextupdate);
log::add('myhome', 'debug', " Move time : ".$move_time);
//Si le volet est arrete en position intermediaire ou completement ouvert
}
elseif (is_numeric($last_status) || $last_status == 'OPEN') {
if ($last_status == 'OPEN') {
$last_status = 100;
}
$status = 'DOWN';
$statusnum = $last_status;
$sec=date("s");
log::add('myhome', 'debug', "Point ".$status."sec : ".$sec."movetime : ".$move_time);
$move_time = ($last_status/100*$move_time);
$move_time_quotient = floor($move_time/60);
log::add('myhome', 'debug', " Move time : ".$move_time);
$myhomecmd->setConfiguration('updatedate',$date+$move_time);
$myhomecmd->setConfiguration('returnStateValue','CLOSED');
$myhomecmdnum->setConfiguration('updatedate',$date+$move_time);
$myhomecmdnum->setConfiguration('returnStateValue',0);
$nextupdate= 1+$move_time_quotient;
$myhomecmd->setConfiguration('returnStateTime',$nextupdate);
$myhomecmdnum->setConfiguration('returnStateTime',$nextupdate);
log::add('myhome', 'debug', " Move time : ".$move_time);
}
else {
$status = 'CLOSED';
$statusnum = 0;
}
}
elseif ($value == 'MOVE_STOP') {
log::add('myhome', 'debug', "Action move_STOP");
//Par defaut on dit que le volet est arrete et donc à son ancienne position
$status = $last_status;
log::add('myhome', 'debug', " debug Ikes $last_status : ".$last_status);
$updatedate=$myhomecmd->getConfiguration('updatedate');
//Si le volet est deja en mouvement
//if (!is_numeric($last_status) && isset($updatedate)) {
if (($last_status == 'UP' || $last_status == 'DOWN') && isset($updatedate)) {
$new_pos = ($move_time - ($updatedate - $date))/$move_time*100;
log::add('myhome', 'debug', " updatedate : ".$updatedate." Newpos : ".$new_pos);
if ($last_status == 'UP') {
log::add('myhome', 'debug', " debug Ikes status UP");
$status = round($new_pos);
$statusnum = round($new_pos);
log::add('myhome', 'debug', "last_status : Up, status : ".$status);
$myhomecmd->setConfiguration('returnStateValue',$status);
$myhomecmd->setConfiguration('returnStateTime',1);
$myhomecmdnum->setConfiguration('returnStateValue',$statusnum);
$myhomecmdnum->setConfiguration('returnStateTime',1);
}
elseif ($last_status == 'DOWN') {
log::add('myhome', 'debug', " debug Ikes status DOWN");
$status = round(100 - $new_pos);
$statusnum = round(100 - $new_pos);
log::add('myhome', 'debug', "last_status : Down, status : ".$status);
$myhomecmd->setConfiguration('returnStateValue',$status);
$myhomecmd->setConfiguration('returnStateTime',1);
$myhomecmdnum->setConfiguration('returnStateValue',$statusnum);
$myhomecmdnum->setConfiguration('returnStateTime',1);
}
if ($status <= 0 || $last_status == 'CLOSED') {
log::add('myhome', 'debug', " debug Ikes status CLOSED");
$status = 'CLOSED';
$statusnum = 0;
$myhomecmd->setConfiguration('updatedate',NULL);
$myhomecmd->setConfiguration('returnStateValue',NULL);
$myhomecmd->setConfiguration('returnStateTime',NULL);
$myhomecmdnum->setConfiguration('updatedate',NULL);
$myhomecmdnum->setConfiguration('returnStateValue',NULL);
$myhomecmdnum->setConfiguration('returnStateTime',NULL);
}
elseif ($status >= 100 || $last_status == 'OPEN') {
log::add('myhome', 'debug', " debug Ikes status OPEN");
$status = 'OPEN';
$statusnum = 100;
$myhomecmd->setConfiguration('updatedate',NULL);
$myhomecmd->setConfiguration('returnStateValue',NULL);
$myhomecmd->setConfiguration('returnStateTime',NULL);
$myhomecmdnum->setConfiguration('updatedate',NULL);
$myhomecmdnum->setConfiguration('returnStateValue',NULL);
$myhomecmdnum->setConfiguration('returnStateTime',NULL);
}
}
else {
$status = 'OPEN';
$statusnum = 100;
}
}
$myhomecmd->save();
$myhomecmdnum->save();
}