je voudrais faire une proposition pour la gestion des capteurs chinois "pas cher" qui utilisent le protocole "EV1527"
Moi j'ai récupéré un détecteur de mouvement PIR , et j'ai vu que @6co (viewtopic.php?f=28&t=12567&start=2560#p418181 a un détecteur de porte.
Visiblement, ces capteurs chinois se fatiguent pas (c'est pas cher) et envoient toujours une trame du genre
20;6D;EV1527;ID=072a45;SWITCH=0a;CMD=ON;
ce qui ne rend pas facile de les différencier.
Je voudrais proposer une fonction pour les gérer dans le plugin RFlink. L'idée serait de détecter le protocole EV1527 et de ne crée que l'équipement, puis que l'utilisateur précise dans l'interface jeedom la catégorie du noeud (par exemple "Mouvement" ou "Contact").
Muni de cette information, à la prochaine trame, le plugin pourrait créer les bonnes commandes en fonction de cette information.
j'ai fais un essai et je voudrais vous soumettre (enfin surtout @lunarok) ce que ça donne :
Je précise que je suis très débutant en jeedom (le plugin rflink est un peu mon tuto pour comprendre les classses Cmd et EqLogic de jeedom) donc il faut prendre mon code que comme un brouillon.
En tout cas je veux bien votre avis.
Code : Tout sélectionner
// EV1527 protocol
public function registerEV1527($_id, $_value) {
log::add('rflink', 'debug', 'registerEV1527 ' . $_id . ' value ' . $_value);
// on regarde si la commande existe deja
$rflinkCmd = rflinkCmd::byEqLogicIdAndLogicalId($this->getId(),$_id);
// regarde la configuration du noeud
log::add('rflink','debug','icone='.$this->getConfiguration('icone'));
switch($this->getConfiguration('icone')) {
// on teste quelle icone a choisi l'utilisateur pour le noeud et on crée la commande
case 'motion' :
$binary = ($_value == 'OFF') ? '0' : '1';
if (!is_object($rflinkCmd)) {
$rflinkCmd = new rflinkCmd();
$cmds = $this->getCmd();
$order = count($cmds);
$rflinkCmd->setOrder($order);
$rflinkCmd->setName(__('Présence', __FILE__));
$rflinkCmd->setEqLogic_id($this->id);
$rflinkCmd->setEqType('rflink');
$rflinkCmd->setLogicalId($_id);
$rflinkCmd->setType('info');
$rflinkCmd->setSubType('binary');
$rflinkCmd->setTemplate("mobile",'presence' );
$rflinkCmd->setTemplate("dashboard",'presence' );
$rflinkCmd->setDisplay("forceReturnLineAfter","1");
$rflinkCmd->setConfiguration('value',$binary);
$rflinkCmd->save();
}
// on force la generation d'un event en attendant de comprendre checkandupdatecmd()
$rflinkCmd->event($binary);
break;
case 'contact' :
log::add('rflink','debug','case contact');
if (!is_object($rflinkCmd)) {
$rflinkCmd = new rflinkCmd();
$cmds = $this->getCmd();
$order = count($cmds);
log::add('rflink','debug','order=' . $order);
$rflinkCmd->setOrder($order);
$name= 'Contact' . $_id;
log::add('rflink','debug','name='.$name);
$rflinkCmd->setName(__($name, __FILE__));
$rflinkCmd->setEqLogic_id($this->id);
$rflinkCmd->setEqType('rflink');
$rflinkCmd->setLogicalId($_id);
$rflinkCmd->setType('info');
$rflinkCmd->setSubType('binary');
//$rflinkCmd->setTemplate("mobile",'line' );
//$rflinkCmd->setTemplate("dashboard",'line' );
$rflinkCmd->setDisplay("forceReturnLineAfter","1");
$rflinkCmd->setConfiguration('value',1);
$rflinkCmd->save();
}
// on force la generation d'un event en attendant de comprendre checkandupdatecmd()
$rflinkCmd->event(1);
break;
default :
break;
}
}
De plus je n'ai géré que 2 cas: mon détecteur PIR, et l'exemple de @6co sur les trames qu'il a donné.
Pour appeler la fonction , il faudrait modifier comme suit dans receiveData():
Code : Tout sélectionner
switch ($type) {
case 'SWITCH' :
switch ($protocol) {
case 'RTS' :
$rflink->registerRTS($value,$args['CMD']);
break;
case 'MiLightv1' :
$rflink->registerMilightv1($value,$args['CMD'],$args['RGBW']);
break;
case 'EV1527' :
$rflink->registerEV1527($value, $args['CMD']);
break;
default :
$rflink->registerSwitch($value,$args['CMD']);
//SWITCH=00;CMD=OFF
break;
}
Hervé