Comme annoncé, ce forum est passé en lecture seule au 1er janvier 2020. Désormais nous vous invitons à vous rendre sur notre nouvelle page communauté :
Image

A très bientôt !

Aider un noob avec un virtuel et des capteurs de porte

Réservé à l'utilisation et la création des objets virtuels dans JEEDOM
Répondre
BigDream
Timide
Messages : 23
Inscription : 08 janv. 2019, 19:52

Aider un noob avec un virtuel et des capteurs de porte

Message par BigDream » 25 janv. 2019, 18:44

Bonsoir les gens !

J'ai une clé zigate avec des capteur d'ouverture de porte Xiaomi, j''ai réussi à tout inclure grace au plugin Zigate, mes designs "RDC", "Etage" et "Sous-Sol" ont chacun les widget associé et les infos remontent bien :)
J'ai crée un virtuel "Toutes ouvertures" que j'affiche sur mon design "Acceuil" pour vérifier si tout les capteurs de porte sont bien fermés d'un seul coup d’œil :
Image
Voici le detail du virtuel "Toutes ouvertures" :
Image
Tout marche impec !

Maintenant pour me faciliter la vie je souhaiterai que si une porte (ou une fenêtre) est ouverte, celle ci apparaissent sous le symbole de la porte sur mon design accueil, comme cela je n'aurai pas à chercher quel porte ou fenêtre est ouverte en naviguant dans mes 3 designs "RDC", "Etage" et "Sous-Sol" et je saurai directement ce qui n'est pas correctement fermé ;) hélas je suis une quiche en programmation et un gros noob sur Jeedom donc voila je me tourne vers vous pour que quelqu'un me prenne la main :lol:
Merci d'avance !

Avatar de l’utilisateur
bartounet
Actif
Messages : 2541
Inscription : 14 juil. 2016, 10:09

Re: Aider un noob avec un virtuel et des capteurs de porte

Message par bartounet » 25 janv. 2019, 19:02

Ça a pas l'air si simple ce que tu demandes je pense que c'est faisable avec du bloc code mais je ne suis pas assez doué

Si j'avais à faire je partirai sur un scénario avec comme déclencheur toutes tes ouverture
Et de là je gérerai dans le scénario une liste en fonction du déclencheur qui a lancé le scénario

tu peux faire ça avec la notion de trigger
va voir dans la doc et sur le site de sarakha63

imaginons que ce soit la ptorte d'entrée qui a déclenché le scénario
En interrogeant le trigger il va te dire porte d'entrée vérifier si le trigger est ouvert ou fermé et alimenter une liste ou une variable
Plutôt une liste car dans ta demande tu ne prends pas en compte le cas où il est plusieurs ouverture ouverte
Jeedom à jour Debian 9
VM VMWARE ESXi 6.7 ( SSD)
Stick ZWave / FIBARO / Ikea Light / Yeelight / Google Home
Wifi Unifi / PFSENSE / Reverse Proxy DMZ SSL

Passionné de bidouillage informatique en tout genre
Mon blog : http://blog.info16.fr

BigDream
Timide
Messages : 23
Inscription : 08 janv. 2019, 19:52

Re: Aider un noob avec un virtuel et des capteurs de porte

Message par BigDream » 25 janv. 2019, 20:05

A mon avis faut du block code mais j'y comprend un beignet !
Avec un scénario j'y ai pensé mais je ne trouve pas ça très élégant en terme d'optimisation :geek:

Avatar de l’utilisateur
bartounet
Actif
Messages : 2541
Inscription : 14 juil. 2016, 10:09

Re: Aider un noob avec un virtuel et des capteurs de porte

Message par bartounet » 25 janv. 2019, 21:08

Je vois pas trop en quoi un scénario n'est pas élégant
Ce qui est élégant c'est ce qui marche et qu'"on sait faire évoluer :)
Jeedom à jour Debian 9
VM VMWARE ESXi 6.7 ( SSD)
Stick ZWave / FIBARO / Ikea Light / Yeelight / Google Home
Wifi Unifi / PFSENSE / Reverse Proxy DMZ SSL

Passionné de bidouillage informatique en tout genre
Mon blog : http://blog.info16.fr

Avatar de l’utilisateur
bartounet
Actif
Messages : 2541
Inscription : 14 juil. 2016, 10:09

Re: Aider un noob avec un virtuel et des capteurs de porte

Message par bartounet » 25 janv. 2019, 22:42

En 10 minutes, un scénario qui marche.
A toi de l'adapter avec tes ouvrants,
Je ne gère pas la liste si plusieurs ouvrants sont ouverts
Dans ce cas il faut travailler pour afficher une liste
sinon c'est le dernier ouvert qui s'affichera

Le virtuel

Image

Le scénario

Image

Image

le résultat
Image

Image
Jeedom à jour Debian 9
VM VMWARE ESXi 6.7 ( SSD)
Stick ZWave / FIBARO / Ikea Light / Yeelight / Google Home
Wifi Unifi / PFSENSE / Reverse Proxy DMZ SSL

Passionné de bidouillage informatique en tout genre
Mon blog : http://blog.info16.fr

BigDream
Timide
Messages : 23
Inscription : 08 janv. 2019, 19:52

Re: Aider un noob avec un virtuel et des capteurs de porte

Message par BigDream » 25 janv. 2019, 23:16

En passant par un scénario j'ai peur d'alourdir mon système domotique et qu'il devienne moins réactif, mais je fait peut-être erreur en raisonnant de la sorte .
Si je passe par un scénario va falloir que j'apprenne à créer des listes et à utiliser des trigger... c'est peut etre aussi ca qui me fait peur :lol:
Je vais quand même tenter avec un scenario .

Sinon avec le plugin widget, Je vient d'un créer un (widget d'état on/off) et j'arrive à faire disparaître l'icone "fenetre fermé" et re-apparaitre l'icone "fenetre ouverte" en rajoutant .hide() et .show() sur les lignes de commande suivante

Code : Tout sélectionner

if (parseInt(_options.display_value) == 1) {
				$(".iconCmd#uid#").append("<i class='icon jeedom-fenetre-ouverte'></i>").show();
			} else {
				$(".iconCmd#uid#").append("<i class='icon jeedom-fenetre-ferme'></i>").hide();
Je pense qu'il y a une piste de ce coté aussi :)

BigDream
Timide
Messages : 23
Inscription : 08 janv. 2019, 19:52

Re: Aider un noob avec un virtuel et des capteurs de porte

Message par BigDream » 04 févr. 2019, 00:26

Merci bartounet d'avoir pris le temps de me faire ce petit tuto ;) désolé du retard pour la réponse je ne m'était pas remis sur jeedom depuis

Je viens d'essayer ta méthode qui fonctionne (pour l'instant juste sur deux capteur comme toi) mais dès que je vais vouloir mettre les 13 capteurs d'ouverture le scénario risque de devenir complexe :shock: mais bon si ça marche je prendrai le temps et j'essayerai de pas m’emmêler les pinceau avec la cascade alambiqué de "si", "alors" et "sinon" :lol:

Petites question qu'elle est la différence entre #[RDC][GBVD][onoff]# == 1 et trigger(#[RDC][GBVD][onoff]#) == 1 en terme de déclenchement ?

C'est vrai qu'avec une gestion de liste ça serai vraiment parfait lorsque plusieurs ouvrant sont ouverts, si tu peux m'aiguiller un peu je prend !

Encore merci de ton aide !!

Avatar de l’utilisateur
bartounet
Actif
Messages : 2541
Inscription : 14 juil. 2016, 10:09

Re: Aider un noob avec un virtuel et des capteurs de porte

Message par bartounet » 04 févr. 2019, 00:55

Relis les tutos sur les trigger et la documentation
Jeedom à jour Debian 9
VM VMWARE ESXi 6.7 ( SSD)
Stick ZWave / FIBARO / Ikea Light / Yeelight / Google Home
Wifi Unifi / PFSENSE / Reverse Proxy DMZ SSL

Passionné de bidouillage informatique en tout genre
Mon blog : http://blog.info16.fr

romanais
Actif
Messages : 1999
Inscription : 21 août 2014, 21:36
Localisation : Drôme

Re: Aider un noob avec un virtuel et des capteurs de porte

Message par romanais » 04 févr. 2019, 10:32

Salut, voici qui devrait te donner une piste pour ce que tu veux faire
https://www.testsavisetcompagnie.fr/jee ... -lumieres/

Ce sera sans doute à adapter, par exemple sur mes Strips Sensative, la commande s'appelle Etat, et non Ouverture comme dans le script d'exemple.
Merci à toute l'équipe pour le taf

Mon matériel

romanais
Actif
Messages : 1999
Inscription : 21 août 2014, 21:36
Localisation : Drôme

Re: Aider un noob avec un virtuel et des capteurs de porte

Message par romanais » 04 févr. 2019, 15:28

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
mail.jpg (401.33 Kio) Consulté 1505 fois
Merci à toute l'équipe pour le taf

Mon matériel

romanais
Actif
Messages : 1999
Inscription : 21 août 2014, 21:36
Localisation : Drôme

Re: Aider un noob avec un virtuel et des capteurs de porte

Message par romanais » 04 févr. 2019, 16:06

Je viens de modifier un peu le script, pour avoir 2 variables distinctes finalement, à l'usage ce sera mieux.

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.'<br> '.$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.'<br> '.$human;
                  }   
      }
    }
  }
}
//On formate les messages si les variables ne sont pas vides
if ( !empty($messageOpen)) { $messageOpen = 'Ouvert(s) : '.$messageOpen;}
if ( !empty($messageClose)) { $messageClose = 'Fermé(s) : '.$messageClose;}
//On colle les 2 variables dans une variable message 
//$message = $messageOpen.$messageClose;
//$message = $messageOpen;
//On log le message pour avoir une trace
$scenario->setLog($messageOpen);
$scenario->setLog($messageClose);
//On affecte le message à une variable Lumières pour pouvoir l'utiliser dans un mail, TTS, SMS
$scenario->setData('Ouvrants_open',$messageOpen);
$scenario->setData('Ouvrants_close',$messageClose);
Je peux afficher sur le Dashboard, la liste des éléments ouverts/fermés (on peut faire 2 virtuels distincts par exemple, et/ou retravailler l'affichage).
virtuel.jpg
virtuel.jpg (26.99 Kio) Consulté 1499 fois
virtuel2.jpg
virtuel2.jpg (99.18 Kio) Consulté 1499 fois
Merci à toute l'équipe pour le taf

Mon matériel

romanais
Actif
Messages : 1999
Inscription : 21 août 2014, 21:36
Localisation : Drôme

Re: Aider un noob avec un virtuel et des capteurs de porte

Message par romanais » 05 févr. 2019, 10:03

J'ai appliqué le script (légèrement modifié) sur une installation plus conséquente (11 capteurs d'ouverture).
Je prends en compte le cas de 3 capteurs dont l'état est inversé par rapport tous les autres.
Tout est commenté dans le script ci-dessous (à coller dans un bloc code dans un scénario).

Code : Tout sélectionner

//basé sur https://www.testsavisetcompagnie.fr/jeedom-scenario-etat-des-ouvrants-et-lumieres/
// Équipements catégorie "Sécurité"
$cat = eqLogic::ByCategorie('security');

//On récupère les équipements de la catégorie "Sécurité"
foreach($cat as $i){
  //On récupère les commandes des équipements (dans un tableau)
  $cmdtab = cmd::byEqLogicId($i->getId());
  //On cherche les commandes pour chacun des ces équipements
  foreach($cmdtab as $cmd){
    //On garde seulement les commandes nommées "Etat ou Ouverture"
    if($cmd->getName() == "Etat" || $cmd->getName() == "Ouverture"){
      //On récupère le nom entier de l'équipement
      $human = $i->getHumanName();
      //$scenario->setLog($human); //décommenter pour lister tous les équipements de la catégorie Sécurité dans les logs du scénario
      //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 - pas nécessaire pour notre utilisation
      //$objet = $i->getObject()->getName();

    //On sépare les fenêtres ouvertes et fermées - en gérant les exceptions (1 et 0 inversés) selon les équipements
	//Je gère les cas où l'état est égal à 1 lorsque c'est fermé (au lieu de 0)
	switch($human)
	{
		case "[Salon][Baie 1 - HKZW-DWS01]":
		case "[Salon][Baie 2 - HKZW-DWS01]":
		case "[Bureau][Fenêtre- FGK-101]":
		if ($statut == 0) {$statut = 1;}
		if ($statut == 1) {$statut = 0;}
		break;
	}

      if ($statut == 1) { //si ouvert - remplacer par 0 si ce sont principalement des modules Xiaomi qui sont en place
        //On affecte la variable messageOpen avec l'équipement 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.'<br> '.$human;
        	} //end else
        } else { //si fermé
          //On affecte la variable messageClose avec l'équipement pour les fenêtres fermées et on ajoute la durée
          if ( empty($messageClose)) {
            $messageClose = $human;
          } //endif
		  else {
              $messageClose = $messageClose.'<br> '.$human;
               } //endelse
			} //endelse
    } //end if
  } //end foreach
} //end foreach
//On formate les messages si les variables ne sont pas vides
if ( !empty($messageOpen)) { $messageOpen = 'Ouvert(s) : '.$messageOpen;}
if ( !empty($messageClose)) { $messageClose = 'Fermé(s) : '.$messageClose;}
//On colle les 2 variables dans une variable message 
//$message = $messageOpen.$messageClose;
//$message = $messageOpen;
//On log le message pour avoir une trace
$scenario->setLog($messageOpen);
$scenario->setLog($messageClose);
//On affecte le message à une variable Lumières pour pouvoir l'utiliser dans un mail, TTS, SMS
$scenario->setData('Ouvrants_open',$messageOpen);
$scenario->setData('Ouvrants_close',$messageClose);
J'ai 3 capteurs qui sont à 1 lorsqu'ils sont fermés, j'ai géré leur cas de cette façon :

Code : Tout sélectionner

	switch($human)
	{
		case "[Salon][Baie 1 - HKZW-DWS01]":
		case "[Salon][Baie 2 - HKZW-DWS01]":
		case "[Bureau][Fenêtre- FGK-101]":
		if ($statut == 0) {$statut = 1;}
		if ($statut == 1) {$statut = 0;}
		break;
	}
Si besoin, il est facile de rajouter des lignes pour d'autres capteurs qui auraient le même comportement.

Au moment où j'écris, voici l'état de mes ouvrants.
Fermé(s) : [Salon][Baie 1 - HKZW-DWS01]
[Salon][Baie 2 - HKZW-DWS01]
[Extérieur][BAL - FGK-101]
[Garage][Capteur porte - FGK-101]
[Salon][Capteur Porte Entrée - PST02-C 3 en 1]
[Cuisine][Fenêtre cuisine - Strips]
[Chambre môme][Fenêtre môme- Strips]
[Chambre parents][Fenêtre parents - Strips]
[Bureau][Fenêtre- FGK-101]
[Cuisine][Porte de service - Door Sensor Gen5 (ZW089)]
[Salon][Porte-fenêtre - Strips]
En déclencheur de ce scénario, je mets tous ces capteurs.
De cette façon, dès qu'un ouvrant est manipulé, l'état général de la maison est mis à jour.
Et quand je quitte la maison, je peux recevoir une alerte (telegram, tts, sms) si l'un des ouvrants est ouvert.
Merci à toute l'équipe pour le taf

Mon matériel

Répondre

Revenir vers « [Plugin officiel] Virtuels »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 3 invités