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 boxio_def();
//Creation des variables utiles
$boxio = boxio::byLogicalId($decrypted_trame["id"], 'boxio');
$id = $decrypted_trame["id"];
$unit = $decrypted_trame["unit"];
$device_type = explode('::', $boxio->getConfiguration('device'));
$ref_id_legrand = $device_type[0].$unit;
$sousdevice = $device_type[1];
//On recupere la date de l'action et on ajoute le temps du relais interne
$date = strtotime($decrypted_trame["date"]) + $def->SHUTTER_RELAY_TIME;
//recuperation du derniere etat connu ET des possibilites
$config = $boxio->getConfiguration($ref_id_legrand);
$unit_status = $config["unit_status"];
$possibility = $config["possibility"];
$statusid = 'status'.$unit_status;
$boxiocmd = $boxio->getCmd('info', $statusid);
$duree_cmd = $boxiocmd->getConfiguration('DureeCmd');
$last_status = $boxiocmd->execCmd(null,2);
$statusidnum = 'statusnum'.$unit_status;
$boxiocmdnum = $boxio->getCmd('info', $statusidnum);
log::add('boxio','debug','unit_status : '.$unit_status.' poss2 : '.$possibility.' Sous_device : '.$sousdevice.' last : '.$last_status.' duréecmd : '.$duree_cmd.' id cmd : '.$boxiocmd->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;
}
//Recuperation des options
if ($config["server_opt"] != "NULL") {
preg_match_all('/(?P.+?)=(?P[^;]+);//', $config["server_opt"], $server_opt);
$params = array();
foreach ($server_opt['param'] as $opt => $opt_value) {
$params[$opt_value] = $server_opt['value'][$opt];
}
}
//gestion des temps ouverture/fermeture en fonction de la date
//if (strpos($possibility, 'MEMORY') !== FALSE) { //En gros si MEMORY existe dans les possibility (par extrapolation de si STATUS ou SERVER_STATUS existe)
if (is_numeric($duree_cmd)) {
$move_time = $duree_cmd;
}
else {
$move_time = $def->DEFAULT_SHUTTER_MOVE_TIME;
}
//mise a jour en fonction du mouvement demande
if ($sousdevice =='00') {
//Si il s'agit d'un bouton normal
log::add('boxio', 'debug', " Bouton normal \n");
if ($value == 'MOVE_UP') {
log::add('boxio', 'debug', "Action MOVE_UP");
//Si le volet est en train de monter
if ($last_status == 'UP') {
$status = 'UP';
//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';
$sec=date("s");
$updatedate=$boxiocmd->getConfiguration('updatedate');
$updatedate=$boxiocmdnum->getConfiguration('updatedate');
if ($updatedate<$date)
{
$boxiocmd->setConfiguration('updatedate',NULL);
$boxiocmd->save();
$boxiocmdnum->setConfiguration('updatedate',NULL);
$boxiocmdnum->save();
$updatedate=0;
}
$new_pos = ($move_time - ($updatedate - $date))/$move_time*100;
$move_time = round($new_pos/100*$move_time);
$move_time_quotient = floor($move_time/60);
log::add('boxio', 'debug', " Movel time : ".$move_time);
$boxiocmd->setConfiguration('updatedate',$date+$move_time);
$boxiocmd->setConfiguration('returnStateValue','OPEN');
$boxiocmdnum->setConfiguration('updatedate',$date+$move_time);
$boxiocmdnum->setConfiguration('returnStateValue','100');
$nextupdate= 1+$move_time_quotient;
$boxiocmd->setConfiguration('returnStateTime',$nextupdate);
$boxiocmdnum->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';
$sec=date("s");
log::add('boxio', 'debug', "Point ".$status);
$move_time = $move_time - ($last_status/100*$move_time);
$move_time_quotient = floor($move_time/60);
log::add('boxio', 'debug', " Move time : ".$move_time);
$boxiocmd->setConfiguration('updatedate',$date+$move_time);
$boxiocmd->setConfiguration('returnStateValue','OPEN');
$boxiocmdnum->setConfiguration('updatedate',$date+$move_time);
$boxiocmdnum->setConfiguration('returnStateValue','100');
$nextupdate= 1+$move_time_quotient;
$boxiocmd->setConfiguration('returnStateTime',$nextupdate);
$boxiocmdnum->setConfiguration('returnStateTime',$nextupdate);
}
else ($status == 'OPEN'); {
$statusnum = 100;
}
}
elseif ($value == 'MOVE_DOWN') {
log::add('boxio', 'debug', "Action move_DOWN");
//Si le volet est en train de descendre
if ($last_status == 'DOWN') {
$status = 'DOWN';
//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';
$sec=date("s");
$updatedate=$boxiocmd->getConfiguration('updatedate');
$updatedate=$boxiocmdnum->getConfiguration('updatedate');
if ($updatedate<$date)
{
$boxiocmd->setConfiguration('updatedate',NULL);
$boxiocmd->save();
$boxiocmdnum->setConfiguration('updatedate',NULL);
$boxiocmdnum->save();
$updatedate=0;
}
$new_pos = ($move_time - ($updatedate - $date))/$move_time*100;
$move_time = round($new_pos/100*$move_time);
log::add('boxio', 'debug', " Move time : ".$move_time." New_pos : ".$new_pos);
$move_time_quotient = floor($move_time/60);
log::add('boxio', 'debug', " Move time : ".$move_time);
$boxiocmd->setConfiguration('updatedate',$date+$move_time);
$boxiocmd->setConfiguration('returnStateValue','CLOSED');
$boxiocmdnum->setConfiguration('updatedate',$date+$move_time);
$boxiocmdnum->setConfiguration('returnStateValue','0');
$nextupdate= 1+$move_time_quotient;
$boxiocmd->setConfiguration('returnStateTime',$nextupdate);
$boxiocmdnum->setConfiguration('returnStateTime',$nextupdate);
log::add('boxio', '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';
$sec=date("s");
log::add('boxio', 'debug', "Point ".$status. "sec:".$sec. "movetime:".$move_time);
$move_time = ($last_status/100*$move_time);
$move_time_quotient = floor($move_time/60);
log::add('boxio', 'debug', " Move time : ".$move_time);
$boxiocmd->setConfiguration('updatedate',$date+$move_time);
$boxiocmd->setConfiguration('returnStateValue','CLOSED');
$boxiocmdnum->setConfiguration('updatedate',$date+$move_time);
$boxiocmdnum->setConfiguration('returnStateValue','0');
$nextupdate= 1+$move_time_quotient;
$boxiocmd->setConfiguration('returnStateTime',$nextupdate);
$boxiocmdnum->setConfiguration('returnStateTime',$nextupdate);
//log::add('boxio', 'debug', " Move time : ".$move_time);
}
else ($status == 'CLOSED'); {
$statusnum = 0;
}
}
elseif ($value == 'MOVE_STOP') {
log::add('boxio', 'debug', "Action move_STOP");
//Par defaut on dit que le volet est arrete et donc à son ancienne position
$status = $last_status;
$updatedate=$boxiocmd->getConfiguration('updatedate');
$updatedate=$boxiocmdnum->getConfiguration('updatedate');
//Si le volet est deja en mouvement
if (($last_status == 'UP' || $last_status == 'DOWN') && isset($updatedate)) {
$new_pos = ($move_time - ($updatedate - $date))/$move_time*100;
log::add('boxio', 'debug', " updatedate : ".$updatedate." Newpos : ".$new_pos);
$boxiocmd->setConfiguration('updatedate',NULL);
$boxiocmdnum->setConfiguration('updatedate',NULL);
if ($last_status == 'UP') {
$status = round($new_pos);
$statusnum = $status;
log::add('boxio', 'debug', "last_status : Up, status : ".$status);
$boxiocmd->setConfiguration('returnStateValue',$status);
$boxiocmdnum->setConfiguration('returnStateValue',$statusnum);
$boxiocmdnum->setConfiguration('returnStateTime',1);
$boxiocmd->setConfiguration('returnStateTime',1);
}
elseif ($last_status == 'DOWN') {
$status = round(100 - $new_pos);
$statusnum = $status;
log::add('boxio', 'debug', "last_status : Down, status : ".$status);
$boxiocmd->setConfiguration('returnStateValue',$status);
$boxiocmdnum->setConfiguration('returnStateValue',$statusnum);
$boxiocmd->setConfiguration('returnStateTime',1);
$boxiocmdnum->setConfiguration('returnStateTime',1);
}
if ($status <= 0) {
$status = 'CLOSED';
$statusnum = '0';
$boxiocmd->setConfiguration('updatedate',NULL);
$boxiocmd->setConfiguration('returnStateValue',$status);
$boxiocmd->setConfiguration('returnStateTime',NULL);
$boxiocmdnum->setConfiguration('updatedate',NULL);
$boxiocmdnum->setConfiguration('returnStateValue',$status);
$boxiocmdnum->setConfiguration('returnStateTime',NULL);
}
elseif ($status >= 100) {
$status = 'OPEN';
$statusnum = '100';
$boxiocmd->setConfiguration('updatedate',NULL);
$boxiocmd->setConfiguration('returnStateValue',$status);
$boxiocmd->setConfiguration('returnStateTime',NULL);
$boxiocmdnum->setConfiguration('updatedate',NULL);
$boxiocmdnum->setConfiguration('returnStateValue',$status);
$boxiocmdnum->setConfiguration('returnStateTime',NULL);
}
}
//else ($status == 'OPEN');{
//$statusnum = 100;
//}
}
$boxiocmd->save();
$boxiocmdnum->save();
}