Bonjour,
Oui, j’ai fait les mêmes modifications mais pas de la même façon. Pour les returnstatesvalues statusnum tu n’as pas une valeur supérieur à 100 qui remonte au bout de quelques secondes? J’ai mis $myhomescscmdnum->setConfiguration('returnStateValue',100);
au lieu de ¨$Status.
J’ai corrigé d’autres petits bugs qui faisaient perdre l’état du statusnum lors de plusieurs montées ou descentes successives et lors d’un appui sur STOP lorsque le volet est complètement ouvert.
public static function updateStatusShutter($decrypted_trame) {
/*
// FONCTION : MISE A JOUR DU STATUS DES VOLETS
// PARAMS : $decrypted_trame = array(
"trame" => string,
"format" => 'string',
"type" => 'string',
"value" => string,
"dimension" => string,
"param" => string,
"A" => string,
"PL" => string,)
*/
//Creation des variables utiles
$myhomescs = myhomescs::byLogicalId($decrypted_trame["A"].$decrypted_trame["PL"], 'myhomescs');
$device_type = explode('::', $myhomescs->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
$myhomescscmd = $myhomescs->getCmd('info', 'status');
$duree_cmd = $myhomescscmd->getConfiguration('DureeCmd');
$last_status = $myhomescscmd->execCmd(null,2);
$myhomescscmdnum = $myhomescs->getCmd('info', 'statusnum');
$updatedate=$myhomescscmd->getConfiguration('updatedate');
log::add('myhomescs','debug',' last : '.$last_status.' Sous_device : '.$sousdevice. ' duréecmd : '.$duree_cmd.' id cmd : '.$myhomescscmd->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'
|| $decrypted_trame["value"] == 'UP_ADVANCED'
|| $decrypted_trame["value"] == 'DOWN_ADVANCED'
|| $decrypted_trame["value"] == 'STOP_ADVANCED') {
$value = $decrypted_trame["value"];
//Il ne s'agit pas d'une mise à jour
}
elseif (!is_null($decrypted_trame["dimension"])) {
$dimension = $decrypted_trame["dimension"];
}
//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('myhomescs','debug',' sousdevice : '.$sousdevice.' LogicalID : '.$decrypted_trame["A"].$decrypted_trame["PL"]. " updatedate : ".$updatedate);
if ($sousdevice =='00') {
//Si il s'agit d'un bouton normal
log::add('myhomescs', 'debug', " Bouton normal \n");
if ($value == 'MOVE_UP') {
log::add('myhomescs', '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;
$myhomescscmd->setConfiguration('updatedate',NULL);
$myhomescscmd->setConfiguration('returnStateValue',NULL);
$myhomescscmd->setConfiguration('returnStateTime',NULL);
$myhomescscmdnum->setConfiguration('updatedate',NULL);
$myhomescscmdnum->setConfiguration('returnStateValue',NULL);
$myhomescscmdnum->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;
$myhomescscmd->setConfiguration('updatedate',NULL);
$myhomescscmd->setConfiguration('returnStateValue',NULL);
$myhomescscmd->setConfiguration('returnStateTime',NULL);
$myhomescscmdnum->setConfiguration('updatedate',NULL);
$myhomescscmdnum->setConfiguration('returnStateValue',NULL);
$myhomescscmdnum->setConfiguration('returnStateTime',NULL);
}
$sec=date("s");
if ($updatedate<$date)
{
$myhomescscmd->setConfiguration('updatedate',NULL);
$myhomescscmdnum->setConfiguration('updatedate',NULL);
$myhomescscmd->save();
$myhomescscmdnum->save();
$updatedate=0;
}
$move_time = round($new_pos/100*$move_time);
$move_time_quotient = floor($move_time/60);
log::add('myhomescs', 'debug', " Move time : ".$move_time);
$myhomescscmd->setConfiguration('updatedate',$date+$move_time);
$myhomescscmd->setConfiguration('returnStateValue','OPEN');
$myhomescscmdnum->setConfiguration('updatedate',$date+$move_time);
$myhomescscmdnum->setConfiguration('returnStateValue',100);
$nextupdate= 1+$move_time_quotient;
$myhomescscmd->setConfiguration('returnStateTime',$nextupdate);
$myhomescscmdnum->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('myhomescs', 'debug', "Point ".$status);
$move_time = $move_time - ($last_status/100*$move_time);
$move_time_quotient = floor($move_time/60);
log::add('myhomescs', 'debug', " Move time : ".$move_time);
$myhomescscmd->setConfiguration('updatedate',$date+$move_time);
$myhomescscmd->setConfiguration('returnStateValue','OPEN');
$myhomescscmdnum->setConfiguration('updatedate',$date+$move_time);
$myhomescscmdnum->setConfiguration('returnStateValue',100);
$nextupdate= 1+$move_time_quotient;
$myhomescscmd->setConfiguration('returnStateTime',$nextupdate);
$myhomescscmdnum->setConfiguration('returnStateTime',$nextupdate);
}
else {
$status = 'OPEN';
$statusnum = 100;
}
}
elseif ($value == 'MOVE_DOWN') {
log::add('myhomescs', '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;
$myhomescscmd->setConfiguration('updatedate',NULL);
$myhomescscmd->setConfiguration('returnStateValue',NULL);
$myhomescscmd->setConfiguration('returnStateTime',NULL);
$myhomescscmdnum->setConfiguration('updatedate',NULL);
$myhomescscmdnum->setConfiguration('returnStateValue',NULL);
$myhomescscmdnum->setConfiguration('returnStateTime',NULL);
}
//Si le volet est deja en bas
}
elseif ($last_statusnum == '0' || $last_status == 'CLOSED') {
$status = 'CLOSED';
$statusnum = 0;
log::add('myhomescs', 'debug', "last_status : $last_status, status : ".$status);
//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;
$myhomescscmd->setConfiguration('updatedate',NULL);
$myhomescscmd->setConfiguration('returnStateValue',NULL);
$myhomescscmd->setConfiguration('returnStateTime',NULL);
$myhomescscmdnum->setConfiguration('updatedate',NULL);
$myhomescscmdnum->setConfiguration('returnStateValue',NULL);
$myhomescscmdnum->setConfiguration('returnStateTime',NULL);
}
$sec=date("s");
$updatedate=$myhomescscmd->getConfiguration('updatedate');
if ($updatedate<$date)
{
$myhomescscmd->setConfiguration('updatedate',NULL);
$myhomescscmdnum->setConfiguration('updatedate',NULL);
$myhomescscmd->save();
$myhomescscmdnum->save();
$updatedate=0;
}
$move_time = round($new_pos/100*$move_time);
log::add('myhomescs', 'debug', " Move time : ".$move_time." New_pos : ".$new_pos);
$move_time_quotient = floor($move_time/60);
log::add('myhomescs', 'debug', " Move time : ".$move_time);
$myhomescscmd->setConfiguration('updatedate',$date+$move_time);
$myhomescscmd->setConfiguration('returnStateValue','CLOSED');
$myhomescscmdnum->setConfiguration('updatedate',$date+$move_time);
$myhomescscmdnum->setConfiguration('returnStateValue',0);
$nextupdate= 1+$move_time_quotient;
$myhomescscmd->setConfiguration('returnStateTime',$nextupdate);
$myhomescscmdnum->setConfiguration('returnStateTime',$nextupdate);
log::add('myhomescs', '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('myhomescs', 'debug', "Point ".$status."sec : ".$sec."movetime : ".$move_time);
$move_time = ($last_status/100*$move_time);
$move_time_quotient = floor($move_time/60);
log::add('myhomescs', 'debug', " Move time : ".$move_time);
$myhomescscmd->setConfiguration('updatedate',$date+$move_time);
$myhomescscmd->setConfiguration('returnStateValue','CLOSED');
$myhomescscmdnum->setConfiguration('updatedate',$date+$move_time);
$myhomescscmdnum->setConfiguration('returnStateValue',0);
$nextupdate= 1+$move_time_quotient;
$myhomescscmd->setConfiguration('returnStateTime',$nextupdate);
$myhomescscmdnum->setConfiguration('returnStateTime',$nextupdate);
log::add('myhomescs', 'debug', " Move time : ".$move_time);
}
else {
$status = 'CLOSED';
$statusnum = 0;
}
}
elseif ($value == 'MOVE_STOP') {
log::add('myhomescs', 'debug', "Action move_STOP");
//Par defaut on dit que le volet est arrete et donc à son ancienne position
$status = $last_status;
log::add('myhomescs','debug',"mise a jour du status : ".$statusnum."\n");
if (!is_numeric($laststatus)) {
$statusnum = $status;
}
if ($status == 'OPEN') {
$statusnum = 100;
}
log::add('myhomescs', 'debug', "last_status : $last_status, status : ".$status);
$updatedate=$myhomescscmd->getConfiguration('updatedate');
//Si le volet est deja en mouvement
if (!is_numeric($last_status) && (isset($updatedate))) {
$new_pos = ($move_time - ($updatedate - $date))/$move_time*100;
log::add('myhomescs', 'debug', " updatedate : ".$updatedate." Newpos : ".$new_pos);
if ($last_status == 'UP') {
$status = round($new_pos);
$statusnum = round($new_pos);
log::add('myhomescs', 'debug', "last_status : Up, status : ".$status);
log::add('myhomescs', 'debug', "last_status : $last_statusnum, status : ".$statusnum);
$myhomescscmd->setConfiguration('returnStateValue',$status);
$myhomescscmd->setConfiguration('returnStateTime',1);
$myhomescscmdnum->setConfiguration('returnStateValue',$statusnum);
$myhomescscmdnum->setConfiguration('returnStateTime',1);
}
elseif ($last_status == 'DOWN') {
$status = round(100 - $new_pos);
$statusnum = round(100 - $new_pos);
log::add('myhomescs', 'debug', "last_status : Down, status : ".$status);
$myhomescscmd->setConfiguration('returnStateValue',$status);
$myhomescscmd->setConfiguration('returnStateTime',1);
$myhomescscmdnum->setConfiguration('returnStateValue',$statusnum);
$myhomescscmdnum->setConfiguration('returnStateTime',1);
}
if (($status <= 0) && ($updatedate <> 0)) {
$status = 'CLOSED';
$last_status = 'CLOSED';
$statusnum = 0;
$myhomescscmd->setConfiguration('updatedate',NULL);
$myhomescscmd->setConfiguration('returnStateValue','CLOSED');
$myhomescscmd->setConfiguration('returnStateTime',NULL);
$myhomescscmdnum->setConfiguration('updatedate',NULL);
$myhomescscmdnum->setConfiguration('returnStateValue',0);
$myhomescscmdnum->setConfiguration('returnStateTime',NULL);
$myhomescscmd->save();
$myhomescscmdnum->save();
}
elseif (($status >= 100) && ($updatedate <> 0)) {
$status = 'OPEN';
$last_status = 'OPEN';
$statusnum = 100;
$myhomescscmd->setConfiguration('updatedate',NULL);
$myhomescscmd->setConfiguration('returnStateValue','OPEN');
$myhomescscmd->setConfiguration('returnStateTime',NULL);
$myhomescscmdnum->setConfiguration('updatedate',NULL);
$myhomescscmdnum->setConfiguration('returnStateValue',100);
$myhomescscmdnum->setConfiguration('returnStateTime',NULL);
}
}
}
$myhomescscmd->save();
$myhomescscmdnum->save();
A force je ne me rappelle plus ce que j’ai touché mais j’ai testé dans tous les sens et cela fonctionne parfaitement (plusieurs petites montées, descentes, changement de sens, stop, etc…)
L’ensemble du code ci-dessus.
Autre sujet, j’avance bien sur l’alarme. j’arrive à récupérer toutes les infos.
Il me reste à régler le fait que l’alarme ne renvoie pas tout à fait les mêmes trames lors d’un Status Request Frame (#50##) et lorsque qu’elle est enclenchée ou desenclenchée.
Exemple :
Réponse au Status Request Frame : 58**## pour 580## lorsque j’enclenche l’alarme.
Elle ajoute un Where.
Je pense que dans un cas c’est le Webserver qui répond et dans l’autre c’est l’alarme qui envoie
les trames.
As-tu les mêmes trames?
As-tu un portier bus SCS?
Après je m’attaque au canaux auxiliaires qui permettront de faire des scénarios plus poussés avec l’alarme.
Car si on utilise le statu de l’alarme pour faire de scénarios, ils se déclencheront aussi avec une activation et desactivation à distance par téléphone par exemple.
Bonne journée,
Romain.