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(); }