Les Carnets de Byfeel domotique , Objets connectés , DIY , Programmation, Nouvelles Technologies ….

Le Notif’Heure & Jeedom

Cet article , pour expliquer comment utiliser au mieux les nouvelles fonctionnalités du notif’heure avec votre box domotique . Ici Jeedom , mais vous pourrez facilement l’adapter à toute autre box.

La première partie , explique les interactions de Jeedom vers le notif’heure et la seconde partie , les interactions possible depuis le notif’heure vers jeedom.

JEEDOM  vers Notif’Heure

Vous allez être en mesure de pouvoir afficher toutes les infos que vous désirez depuis votre box Jeedom ( ou autres ) , sur le Notif’Heure.

  • Message d’information 
  • Message d’alerte
  • Une donnée de température , d’humidité , etc ….
  • Bref tout ce que vous êtes en mesure d’envoyer , déjà , depuis votre box via sms ou autre telegram …..
  • … et même des intéractions.

Il suffira juste d’écrire le bon scénario.

Envoyer une Notification

Dans un premier temps , il suffit d’aller dans le menu plugin / Programmation / Script de votre jeedom et de cliquer sur ajouter.

Activer et rendre visible l’equipement , puis se rendre dans l’onglet Commandes. Je créé ma premiére commande en cliquant sur ajouter commande puis je la paramètre avec les valeurs suivantes :

Exemple création équipement notif Bureau
  • Nom : Notif
  • Type de Script : Script
  • Type : Action   ( Message )
  • Requete : bouton vert pour nouveau puis création du fichier notifheure.php
création de la commande notification dans l’équipement script

Afin de faciliter la maintenance du code , j’ai décidé de réunir les deux scripts PHP , que j’utilisais avec la version 2.6 Voici le Script à copier dans le fichier nouvellement créé, qui permet de gérer les nouvelles options. ( il faut au minimum la version 3.1.2 )

Le script est disponible sur le Market Jeedom ( le plugin sera disponible prochainement ).

Script disponible dans le market jeedom – catégorie divers
<?php
  // maj 17-11-2018
  if (isset($argv)) {
  	$IP=$argv[1];
	$MOO=$argv[2];
	 // debuggage
/*	 include('/var/www/html/core/class/scenario.class.php');
	log::add('script','error','Argument 2 :'.$MOO); 
	log::add('script','error','Argument 3 :'.urlencode(utf8_encode($argv[2])) ); 
*/
	if ($MOO=="HOR" || $MOO=="SEC" ||  $MOO=="LUM" ||  $MOO=="INT" || $MOO=="NIG" || $MOO=="LED")
    {
     // Options 
      		$commande=urlencode(utf8_decode($argv[2]));
  			$etat=urlencode(utf8_decode($argv[3]));

			$url = 'http://'.$IP.'/Options';
			$data = array($commande => $etat);
			// use key 'http' even if you send the request to https://...
			$options = array(
  					'http' => array(
    				'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
    				'method'  => 'POST',
    				'content' => http_build_query($data),
  				),
			);
			$context  = stream_context_create($options);
			$result = file_get_contents($url, false, $context);
    } else {
      // Notifications
      $notif=iconv("UTF-8", "CP1252",$argv[2]);  // conversion utf8 en ISO 8859-15 - gestion de €
      $notif=urlencode($notif);

	// Decoupage des options transmis dans titre sous la forme type = Animation ; lum = intensite de la lumiére  ; etc
	//$Options = explode(";",str_replace(' ', '', $argv[3]));
	$Options=preg_split("/[\,\;\.\:\-]/", str_replace(' ', '', $argv[3]));
	foreach ( $Options as $Value ){
    list($k, $v) = explode("=",$Value);
    $k = strtolower($k);
    $v = strtoupper($v);
    $result[ $k ] = $v;
    }
// Affectation des differents index
	$type=$result["type"];
	$lum=$result["lum"];
    $flash=$result["flash"];
    $txt=$result["txt"];
    if ( $type == "INFO") { 
      $pause=$result["pause"];         
      $argtype="&type=".$type."&pause=".$pause;              
        } else {
        $argtype="&type=".$type;
      }

/* Lit un fichier distant sur le serveur www.example.com avec le protocole HTTP */
$url="http://".$IP."/Notification?msg=".$notif.$argtype."&intnotif=".$lum."&flash=".$flash."&txt=".$txt;
$httpfile  = file_get_contents($url);
    } 
  }
?>

Pour la version 3.2 , il faudra utiliser ce script. Si vous utilisez l’ancien , il y aura des risques de problèmes d’encodage sur les caractères étendues

<?php
  // maj 15-12-2018 
  // Script pour notif'heure ( validé pour version  V3.2 ) 
  if (isset($argv)) {
  	$IP=$argv[1];
	$MOO=$argv[2];
	 // debuggage
 //include('/var/www/html/core/class/scenario.class.php');
	
//	log::add('script','error','Argument 3 :'.urlencode(utf8_encode($argv[2])) ); 
  //$argv[2]=html_entity_decode($argv[2]);

	if ($MOO=="HOR" || $MOO=="SEC" ||  $MOO=="LUM" ||  $MOO=="INT" || $MOO=="NIG" || $MOO=="LED")
    {
     // Options 
      		$commande=urlencode(($argv[2]));
  			$etat=urlencode(utf8_decode($argv[3]));

			$url = 'http://'.$IP.'/Options';
			$data = array($commande => $etat);
			// use key 'http' even if you send the request to https://...
			$options = array(
  					'http' => array(
    				'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
    				'method'  => 'POST',
    				'content' => http_build_query($data),
  				),
			);
			$context  = stream_context_create($options);
			$result = file_get_contents($url, false, $context);
    } else {
      // Notifications
  //log::add('script','error','message avant:'.$notif);
      $notif=rawurlencode(html_entity_decode($argv[2],ENT_QUOTES));
	//log::add('script','error','message :'.$notif);
	// Decoupage des options transmis dans titre sous la forme type = Animation ; lum = intensite de la lumiére  ; etc
	//$Options = explode(";",str_replace(' ', '', $argv[3]));
	$Options=preg_split("/[\,\;\.\:\-]/", str_replace(' ', '', $argv[3]));
	foreach ( $Options as $Value ){
    list($k, $v) = explode("=",$Value);
    $k = strtolower($k);
    $v = strtoupper($v);
    $result[ $k ] = $v;
    }
// Affectation des differents index
	$type=$result["type"];
	$lum=$result["lum"];
    $flash=$result["flash"];
    $txt=$result["txt"];
    $imp=$result["important"];
    if ( $type == "INFO") { 
      $pause=$result["pause"];
      	$fi=$result["fi"];
    	$fo=$result["fo"];
    	$fio=$result["fio"];
      	if (!is_numeric($fi)) $fi=8;
    	if (!is_numeric($fo)) $fo=1;
      	if (is_numeric($fio)) {
          	$fi=$fio;
      		$fo=$fio;
        }
      	if (!is_numeric($pause)) $pause=3;
      	$argtype="&type=".$type."&pause=".$pause."&fi=".$fi."&fo=".$fo;              
        } else {
        $argtype="&type=".$type;
      }
    
    

/* Lit un fichier distant sur le serveur www.example.com avec le protocole HTTP */
$url="http://".$IP."/Notification?msg=".$notif.$argtype."&intnotif=".$lum."&flash=".$flash."&txt=".$txt."&important=".$imp;
//log::add('script','error','url :'.$url); 
$httpfile  = file_get_contents($url);
    } 
  }
?>

Dans le champs requête je renseigne trois arguments. Le premier l adresse ip du notif’heure le champ message et title. 

…/notifheure.php 192.168.8.127 « #message# » « #title# »

ou

…/notifheure.php 192.168.8.127 #message# #title#

si vous utilisez les guillemets dans le champ message , ne pas metttre d’espace dans les options title.

Pour envoyer une notification il suffit de renseigner le champ message et envoyer. 

brique notif’heure jeedom

Tout fonctionne , on peut continuer . Quand , rien n’est renseigné dans titre , les valeurs par défaut pour les notifications sont envoyés ( luminosité par défaut , pas d’animation etc …. ) .

Par défaut Jeedom , supprime les quotes ‘ ou les doubles quotes. Afin d’afficher ces caractères depuis Jeedom , il suffit pour les doubles quotes , d’échapper le caractère avec \ .
Par exemple : hello \ »world\ »  , affichera hello « world »

Pour la simple quote ou apostrophe , il faudra utiliser le code Ascii étendue : ‘
par exemple : hello ‘world’ , pour afficher hello ‘world’.

Options des notifications : Il est possible dans le champ titre , d’ajouter des options séparés par un ; 

exemple : lum=10 ; type=PAC     ( envoie une notification avec un niveau de luminosité de 10 et l’animation Pac Man . )

Options possible : 

  • lum : de 0 à 15 pour indiquer une valeur de luminositée
  • type : Type d’animation ou de comportement
    • BLINDS ,PAC ou OPENING : pour des effets d’animation avant la notification affiche l’info « txt » , contenu dans la variable txt.
    • INFO : associé au champ « pause » permet d’afficher un texte court  entre 0 et 60 secondes.
    • FIX : Affiche un texte court , en permanence . Une nouvelle notification envoyée , enleverra le texte. Si , on désire effacer sans afficher de texte , il faut utiliser le mot clé  » !Clear! » dans le champ message.
  • txt : Un mot a afficher avant les effets d’animation ( par défaut : notif )
  • pause : Associé à INFO , permet de définir un temps d’affichage entre 0 et 60 secondes.
  • flash : pour activer le flash lumineux avant notification ( si LED présente )
  • fi,fo ou fio : permet de choisir un effet pour la commande de type INFO . fi pour l’effet d’entrée , fo pour l’effet de sortie et fio pour définir le même effet en entrée et sortie. Par exemple fio=26,type=info permet un scrolling de la droite vers la gauche.
  • important : Permet de rajouter un tag sur le message pour l’historisation et notification LED si présente.

exemple notification :

title :     flash=1 ;type=BLINDS;lum=3
message : Affiche message avec effet Blinds , luminosité 3 et alert flash led avant.

Exemple pour un texte afficher en permanence . 

title :              type=fix
message :     Alerte

Ne pas mettre un texte trop long dans message , cela depend de la taille de votre Zone Message ( pour 4 matrices , pas plus de 6 caractères )

[adsense]

Gérer les Options

Les Options , permettent de gérer depuis Jeedom les 4 options présentent dans l’interface WEB .

  • Affichage des secondes
  • Affichage de l’horloge
  • Mode Auto / manuel
  • Réglage de l’intensité pour le mode manuel
  • ON / Off de la led si présente

Exemple , pour gérer l’option d’affichage de l’horloge ( Mot clé : HOR) , Il suffit de créer une nouvelle commande action de type script , choisir Action sous type liste .

Dans le champs requête je sélectionne le script notifheure.php et je renseigne les arguments ip  , HOR ( pour affichage Horloge ) , et #select# qui correspond aux valeurs de la liste .

…….sources/notifheure.php 192.168.8.127 HOR #select#

Dans le champs parametre de la liste , j’ecris les infos suivantes :
 0 |OFF; 1|ON ce qui donne :

Création de la commande Horloge

Le retour d’etat de la commande se fera via la création de la requéte Json ( info – binaire ) . Dans le champs requête je choisis Options>HOR et  dans le champ options la requête : adresseIP-notif/getInfo . J’obtiens la brique suivante :

Exemple brique Notif’Heure avec commande Affichage Horloge

Il suffit de réaliser la même chose pour les deux autres commandes : SEC ( pour l’affichage des secondes ) et LUM ( pour le mode manuel ou auto , pas nécessaire si pas de photocell installé ). Ce qui donne :

Les commandes pour les options SEC , LUM et HOR

Pour le réglage de la commande INT ( Valeur de l’intensité de la luminosité en mode manuel ), le principe est le même mais à la place de sous type liste , je choisi sous type curseur , le champ requête est de la formes suivante .

…. chemin dossier/notifheure.php 192.168.8.127 INT #slider#

La commande Intensité

L’option LED , permet , si la LED est installé , d’allumer ou d’éteindre la LED . Le principe est le même que pour la commande HOR , il suffit de mettre LED à la place.

Ce qui donne :

La commande LED

…. chemin dossier/notifheure.php 192.168.8.127 LED #select#

Mise à jour des états

A chaque commande effectué , une mise à jour de l »état est effectué.Il n’est pas conseillé de planifier une mise à jour auto ( Auto-actualisation (cron) ) il n’y a aucun intérêt , si il y a besoin de lire un état dans un scénario , mieux vaut lancer la commande update à ce nomment .

Exemple Scénario notification

Deux exemples de scénario , pour l’utilisation du notif’heure

Envoyer une notification si on sonne au portail ( la notification déclenchera un flash lumineux si led installé , et mettra l’intensité au max à 15 )

Scenario sonnette

Ci dessous , un scénario un peu plus complexe , qui déclenchera un message d’information ( date du jour) et température extérieur et intérieur , et entre 06H00 et 10H00 le saint du jour ( plugin domogeek ). Il y a un contrôle , afin de s’assurer de ne pas renvoyer la notification avant un délai de 20 minutes.

Scenario information 

Interaction Jeedom

Il est tout a fait possible d’utiliser les interactions JEEDOM , afin d’envoyer à distance des notifications sur le notif’heure souhaité.

Pour cela , il suffit d’aller dans le menu Interactions , de créer une nouvelle interaction que j’appelle Notification.

Puis j’indique dans la demande :  #commande# #message# #objet# , afin d’éviter d’avoir un trop grand nombre de phrases , dans la partie filtre , je sélectionne uniquement commande type action , plugin script et champ message.

Interaction pour envoie notification

Il suffit de tester :  notification hello world bureau 
notification : nom de la commande du notif’heure pour envoie notif
hello world : mon message
bureau : Objet ou est affecté l’equipement

Dans le champ réponse , j’ai indiqué la réponse suivante : ok , je viens d’envoyer #message# à #objet#. A vous de personnaliser , vos interaction , en fonction de vos mots clés.

[adsense]

Notif’heure vers Jeedom 

Le notif’heure est en mesure d’envoyer des commandes vers jeedom ( ou autre box domotique ).

Pour cela , il faut activer l’option Domotique 

Paramétrage box domotique

Cette Option permet de renseigner une URL sous la forme :

http://ipbox/API/commande……

Il est possible pour l’instant de renseigner 3 url d’action , afin de pouvoir les déclencher via un des boutons ( si celui ci installé sur le notif’heure ) et une URL qui sert à forcer la mise à jour des infos dans jeedom sur modifications des options en dehors de jeedom. Par exemple , je modifie l’affichage des secondes depuis l’interface Web du notif’heure , et j’en informe Jeedom ( ou autre box ) afin de mettre à jour les infos de mon équipement.

URL_update

URL_Update ( permet de renseigner l’url pour mise à jour de l’équipement )

Pour trouver l’URL , il suffit de se rendre dans l’équipement et de cliquer sur configurations avancées.

configurations avancees

En face de la commande rafraichir , je clique sur les roues crantées pour accéder à la configuration de la commande et enfin copier le lien renseigner dans la variable URL.

config commande pour lien URL

j’obtiens le lien suivant :

https://monjeedom.net/core/api/jeeApi.php?apikey=bsxxij3456789034&type=cmd&id=11085

à modifier par un lien local : Si box jeedom = 192.168.8.50

http://192.168.8.50/core/api/jeeApi.php?apikey=bsxxij3456789034&type=cmd&id=11085

L’inconvénient de cette méthode , c’est qu’a chaque fois que le notif’heure demande à jeedom de se mettre  à Jour , il attend le retour d’info de la requête provenant de jeedom , et cela peut entrainer une latence jusqu’a 6 secondes.

Afin d’avoir un retour plus rapide de Jeedom , il est possible de créer un virtuel , qui recevra la demande d’update via url_update du notif’heure.

Un virtuel pour update notif’heure

il suffira de renseigner l’URL suivante dans la commande URL_Update , avec ipjeedom = adresse ip de jeedom et numero_id= numéro de la commande update créé.

http://ipjeedom/core/api/jeeApi.php?apikey=bsxxij1234567890&type=virtual&id=numero_id&value=1

Puis il suffit de créer un scénario , qui se chargera de mettre à jour les infos du notif’heure à chaque changement d’état de la commande update .

exemple scenario update

URL_action

Dans ces champs il est possible d’assigner des url d’actions afin de déclencher une action depuis un des boutons du notif’heure. 

Pour information , les requêtes https ne sont pas gérés pour l’instant.

par exemple :

  • Allumer une lampe / eteindre une lampe
  • Déclencher un bouton virtuel
  • Modifier l’etat d’un virtuel
  • etc ….

Allumer un plafonnier  , commandé en Zwave , il suffit d’aller chercher la commande « on » du plafonnier , puis de récupérer son url , via configuration de la commande ( roues crantées ), puis de coller l’URL dans le champ URL_action .

http://ip-jeedom/core/api/jeeApi.php?apikey=bsxxij1234567890&type=cmd&id=461

l’inconvénient de cette méthode , nous oblige à récupérer la deuxième commande pour le « off » . Le plus simple serait d’utiliser une commande action , qui permettrait de basculer on et off automatiquement.

Pour réaliser cela , il va falloir passer par la création d’un virtuel de type « Toggle » sous jeedom. Dans la documentation du plugin virtuel , tout est expliqué comment créer facilement un virtuel de type toggle.

Ce qui donne

Virtuel Toggle

il suffit de renseigner dans le champs action la commande toggle

http://ip jeedom/core/api/jeeApi.php?apikey=bsxxi01234567890&type=cmd&id=11079

Ainsi à chaque appuie sur le bouton , l’état de la commande basculera entre 0 et 1 . Il ne reste plus qu’a lui associer un scénario afin de commander tout type d’action.

Pour déclencher directement un scénario , voici la commande à renseigner ( Merci a Jona , pour l’info )

http://ipjeedom/core/api/jeeApi.php?apikey=xxxx&type=scenario&id=ID_du_scenario&action=start/stop/activer/desactiver

Pour associer la commande à un bouton , il faut sélectionner dans la page config du notif’heure , l’option bouton 1 ou bouton 2 :

Configuration bouton

J’ai ensuite , la possibilité de choisir , de déclencher une action pour un simple clic , un double clic ou un triple clic. Une fois , les options sélectionnés je sauvegarde et reboot mon notif’heure.

Récupérer les informations du DHT

Si un module DHT est installé dans le notif’heure , il est alors possible ,aussi de récupérer les informations de température et d’humidité.

Le plus simple pour cela , est de créer un nouvel équipement dans le plugin Script.

création équipement script T/H

Afin de récupérer les infos Températures et humidités , toutes les 10 minutes , je programme une auto actualisation suivante :

*/10 * * * *

Afin de bien écrire votre CRON , vous pouvez utiliser le site suivant :

Crontab.guru

Cron toutes les 10 minutes

Dans la partie commande , on créé une commande de type JSON avec comme requête  : dht>T pour la température et comme URL : http://ip-notifheure/getInfo

Pour l’humidité , il suffira de renseigner à la place : dht>H

Brique DHT notif’heure

Conclusion

La gestion par le module script est très puissante , et permet beaucoup d’interaction , mais elle peut s’avérer lourde à entretenir , si on veut pouvoir utiliser toutes les options. L’idéal serait que le notif’heure dispose d’un plugin jeedom ( ou autre box ). J’espère , aussi qu’un jour il soit possible de pouvoir appeler directement des websockets depuis l’interface Script , ce qui rendrait les choses plus simple. Je suis entrain de voir , pour implémenter un API plus complet et rédiger une documentation à ce sujet.

44 commentaires sur “Le Notif’Heure & Jeedom”

Les commentaires sont fermés.