Basé sur la page indiquée ci-dessus, j'ai corrigé vite fait le scénario (; manquants, mise en forme du résultat, suppression de la gestion de la durée).
Considérant que j'ai 3 capteurs d'ouverture Xiaomi (porte d'entrée du bureau, tiroir, placard).
Voici ce que j'arrive à obtenir avec le scénario suivant (la variable "Ouvrants" contient les informations)
Code : Tout sélectionner
// Équipements catégorie security
$cat = eqLogic::ByCategorie('security');
//$scenario->setLog($cat);
//On récupère les équipements de la catégorie security
foreach($cat as $i){
//On récupère les commandes des équipements security (tableau)
$cmdtab = cmd::byEqLogicId($i->getId());
//On cherche les commandes de la catégorie security
foreach($cmdtab as $cmd){
//On garde seulement les commandes Ouverture
if($cmd->getName() == "Etat"){
//On récupère le nom entier de l'équipement
$human = $i->getHumanName();
//On reconstitue la commande avec le nom entier + état
$cmd = cmd::byString('#' . $human . '[' . $cmd->getName() . ']#');
//On récupère le statut de la commande - renvoie 1 ou 0
$statut = $cmd->execCmd();
//On récupère le nom de l'objet
$objet = $i->getObject()->getName();
//On sépare les fenêtres ouvertes 1 et fermées 0
if ($statut == 0){
//On affecte la variable messageOpen avec l'objet pour les fenêtres ouvertes.
if ( empty($messageOpen)) {
$messageOpen = $human;
} else {
//A partir du 2nd élément ouvert j'ajoute les messages les uns après les autres.
$messageOpen = $messageOpen.', '.$human;
}
} else {
//On affecte la variable messageClose avec l'objet pour les fenêtres fermées et on ajoute la durée
if ( empty($messageClose)) {
$messageClose = $human;
} else {
$messageClose = $messageClose.', '.$human;
}
}
}
}
}
//On formate les messages si les variables ne sont pas vides
if ( !empty($messageOpen)) { $messageOpen = 'Ouvert(s) : '.$messageOpen."\r\n";}
if ( !empty($messageClose)) { $messageClose = 'Fermé(s) : '.$messageClose;}
//On colle les 2 variables dans une variable message
$message = $messageOpen.$messageClose;
//On log le message pour avoir une trace
$scenario->setLog($message);
//On affecte le message à une variable Ouvrants pour pouvoir l'utiliser dans un mail, TTS, SMS
$scenario->setData('Ouvrants',$message);
Quand les 3 sont ouverts
Code : Tout sélectionner
[2019-02-04 15:09:08][SCENARIO] Start : Scenario lance manuellement.
[2019-02-04 15:09:08][SCENARIO] Exécution du sous-élément de type [action] : code
[2019-02-04 15:09:08][SCENARIO] Exécution d'un bloc code
[2019-02-04 15:09:08][SCENARIO]
Ouvert(s) : [Bureau][Placard], [Bureau][Porte], [Bureau][Tiroir]
[2019-02-04 15:09:08][SCENARIO] Fin correcte du scénario
Quand les 3 sont fermés
Code : Tout sélectionner
------------------------------------
[2019-02-04 15:10:40][SCENARIO] Start : Scenario lance manuellement.
[2019-02-04 15:10:40][SCENARIO] Exécution du sous-élément de type [action] : code
[2019-02-04 15:10:40][SCENARIO] Exécution d'un bloc code
[2019-02-04 15:10:40][SCENARIO] Fermé(s) : [Bureau][Placard], [Bureau][Porte], [Bureau][Tiroir]
[2019-02-04 15:10:40][SCENARIO] Fin correcte du scénario
2 ouverts, 1 fermé
Code : Tout sélectionner
[2019-02-04 15:11:16][SCENARIO] Start : Scenario lance manuellement.
[2019-02-04 15:11:16][SCENARIO] Exécution du sous-élément de type [action] : code
[2019-02-04 15:11:16][SCENARIO] Exécution d'un bloc code
[2019-02-04 15:11:16][SCENARIO]
Ouvert(s) : [Bureau][Placard], [Bureau][Tiroir]
Fermé(s) : [Bureau][Porte]
[2019-02-04 15:11:16][SCENARIO] Fin correcte du scénario
2 fermés, 1 ouvert
Code : Tout sélectionner
[2019-02-04 15:12:14][SCENARIO] Start : Scenario lance manuellement.
[2019-02-04 15:12:14][SCENARIO] Exécution du sous-élément de type [action] : code
[2019-02-04 15:12:14][SCENARIO] Exécution d'un bloc code
[2019-02-04 15:12:14][SCENARIO]
Ouvert(s) : [Bureau][Placard]
Fermé(s) : [Bureau][Porte], [Bureau][Tiroir]
[2019-02-04 15:12:14][SCENARIO] Fin correcte du scénario
[/code
Pour ce 1er test, j'affiche tout dans ma variable, mais en production, seuls les capteurs ouverts vont m'intéresser, il suffira de changer la ligne en bas de scénario
[code]
$message = $messageOpen.$messageClose;
par
$message = $messageOpen;
Ce code est largement customisable, c'est un premier jet pour voir si ça peut faire l'affaire pour toi.
Du coup je vais l'utiliser, j'y songeais depuis un bail, avoir une alerte au moment de quitte la maison, mais je n'avais jamais pris le temps.
Au départ, je te conseille vraiment de tout afficher dans la variable, pour t'assurer que tous tes modules remontent bien (par exemple, si l'un de tes modules renvoyait 0 au lieu du 1 attendu, ça inverserait le résultat, et il faudrait affiner le scénario pour prendre en compte ce cas de figure).
Je peux ajouter une action d'envoi de mail (ou telegram, sms...) comme ci-dessous (attention, lors d'un précédent test, l'envoi du mail a planté car la variable "Ouvrants" était vide).
On peut imaginer créer 2 variables différentes (ouverts et fermés), et affecter une valeur par défaut. On pourrait ainsi utiliser précisément l'une ou l'autre donnée.
Je reçois ça en contenu de mail :
Ouvert(s) : [Bureau][Placard]
Fermé(s) : [Bureau][Porte], [Bureau][Tiroir]
- mail.jpg (401.33 Kio) Consulté 1516 fois