Jeedom v4 | Petits codes entre amis

Scénarios - Petits codes entre amis

Jeedom v4 | Scénarios : Petits codes entre amis

Astuces pour la personnalisation de l’interface
Scénarios : Programmation du jour

Introduction
Quelques exemples
Ajout de fonction php
pyJeedom

Introduction

Vous le savez, un scénario est constitué de différents blocs (SI, A, DANS, etc), utilisés en fonction de ce que l’on désire faire. L’un d’entre eux est le bloc CODE, peu engageant à première vue, mais pourtant bien pratique.

Bloc CODE

Ce type de bloc permet d’écrire du code php que le scénario va interpréter. par exemple :

$trigger = $scenario->getTrigger();
$cmdID = str_replace('#', '', $trigger[0]);
$eq = cmd::byId($cmdID)->getEqLogic();
$eq->setIsEnable(0)->save()

C’est bien jolie, mais qu’est-ce qu’on peux faire avec ? Tout simplement accéder à toutes les fonctions php, mais aussi à la plupart des fonctions du core de Jeedom lui même, et donc aux équipements et à leurs commandes notamment.

Voici un lien vers la doc de l’API Jeedom, qui permet de retrouver facilement les fonctions souhaitées. Vous pouvez également regarder directement dans le code source du core.

Il faut considérer un bloc Code comme un script php que vous exécuter sur un serveur. Vous pouvez ainsi facilement récupérer des données de votre Jeedom, mais aussi des données sur Internet, dans un fichier sur un site ou autre. Même si pour des cas complexes, je préfère créer un Script avec le plugin Script.

Pour communiquer entre ce bloc CODE et le reste de votre scénarios, vous avez différentes options:

Remarques

Concernant php, je ne pourrai que conseiller de s’y familiariser un minimum. Pour çà il existe plein de sites, blogs et la doc sur Internet. En dehors des fonctions propres à Jeedom, l’étendu de php est extrêmement large, et vous familiariser avec les opérations les plus courante (manipulation de chaînes, boucles, conditions, dates etc) est un plus si vous vous engagez sur ce chemin ;-)

Quelques remarques

$message = 'message';
message::add("Titre", 'Message: '.$message);

Deux lignes qui illustrent plusieurs choses.

Et enfin, la concaténation de chaîne étant différente d’un langage à l’autre, vous pouvez aussi faire:

$var = 'bibi';
$msg = 'message de '.$var;

Un autre exemple, que j’ai publié il y a 2 ans déjà, avec des virtuels, un script php, et un gros bloc CODE en scénario pour récupérer les levé/couché du soleil, date, azimut, élévation, ensoleillement de façades etc: php-sunPos - Jeedom. Vous y trouverez notamment des manipulations de dates qui pourront vous intéresser.

Si vous n’avez pas encore lâché, vous pouvez continuer avec quelques exemples !

Quelques exemples


• Créer un message dans le centre de message

$title = 'php testing';
$message = 'small message';
message::add($title, $message);


• Récupérer la valeur d’une variable

$myVar = $scenario->getData('maVariable');


• Mettre à jour une commande info

cmd::byString('#[Maison][infos][test]#')->event(100);


• Récupérer la valeur d’une commande info

$value = cmd::byString('#[Maison][infos][test]#')->execCmd();


• Exécuter une commande action (même chose que pour une info)

cmd::byString('#[Maison][actions][actionOn]#')->execCmd();


• Exécuter une commande action de type slider

$options = array('slider'=>100);
cmd::byString('#[Salon][Lumière Salon][Intensité]#')->execCmd($options, $cache=0);


• Exécuter une commande action de type message

$options = array('title'=>'pièce', 'message'=> 'Hello, how is it today ?');
cmd::byString('#[Maison][TTS][Speak]#')->execCmd($options, $cache=0);


• Récupérer la date de dernière mise à jour d’une info

$cmd = cmd::byString('#[Maison][infos][test]#');
$collectDate = $cmd->getCollectDate();


• Écrire dans un log
Le niveau de log doit correspondre

log::add('maison', 'error', $value.'  : '.$collectDate);


• Écrire dans le log du scénario

$scenario->setLog('__'.$collectDate.' -> '.$value);


• Changer le cron d’un plugin. Je m’en sert pour passer le plugin Qivivo en cron15 hors période de chauffe

config::save('functionality::cron5::enable', 0, 'qivivo');
config::save('functionality::cron15::enable', 1, 'qivivo');


• Faire un reset du swap de votre Jeedom

$cmd = 'sudo swapoff -a && sudo swapon -a';
$result = exec($cmd);
$scenario->setLog($result);


• Masquer un objet

object::byName('Cuisine')->setIsVisible(0)->save();


• Récupérer le dernier message d’update
Avec un scénario en action sur message, vous pouvez vous envoyer un mail ou une notification quand il y a une update

Notification d'update

$msgs = message::byPlugin('update');
$msg = $msgs[0];
$text = $msg->getDate() . ': ' . $msg->getPlugin() . ': ' . $msg->getMessage();
scenario::setData('MsgFilter', $text);


• Récupérer un tag

$tags = $scenario->getTags();
$montag = $tags['#monTag#'];


• Attribuer un tag au scénario
Les tags n’existent que lors de l’exécution du scénario, vous n’avez donc pas besoin de le supprimer ensuite, comme pour une variable

$tags = $scenario->getTags();
$tags['#monTag#'] = 'Hello';
$scenario->setTags($tags);

C’est, je pense, la meilleure solution pour passer le résultat d’un bloc CODE au scénario et faire ensuite des tests en fonction

Tags


• Renseigner des variables lever et coucher du soleil
Rendez-vous sur Google Map, placez un repère sur votre habitation, notez les coordonnées GPS qui s’affichent en bas

$lat = 45.808;
$long = 4.872;
$sun_info = date_sun_info(time(), $lat, $long);
$sunrise = date("Hi", $sun_info["sunrise"]);
$sunset = date("Hi", $sun_info["sunset"]);
$scenario->setData('sunrise', $sunrise);
$scenario->setData('sunset', $sunset);

cf Scénarios : Programmation du jour

Ajout de fonction php

Jeedom permet également d’ajouter des fonctions utilisables directement dans les scénarios. Doc officielle

Pour cela il faut éditer le fichier /data/user.function.class.php. Vous pouvez utiliser l’éditeur de Jeedom (voir doc) ou le plugin JeeXplorer

Un petit exemple qui va nous permettre de tester et de récupérer un paramètre de configuration de Jeedom ou d’un plugin dans un scénario.

Le fichier /data/user.function.class.php:

<?php
require_once dirname(__FILE__) . '/../../core/php/core.inc.php';

class userFunction {
	public static function getConfigByKey($_key='', $_type='core', $_default = '', $_forceFresh = false) {
		$_key = self::stripQuotes($_key);
		$_type = self::stripQuotes($_type);
		$_default = self::stripQuotes($_default);
		return config::byKey($_key, $_type, $_default, $_forceFresh);;
	}

	/* INTERNAL FUNCTIONS */
	static function stripQuotes($text) {
		return preg_replace('/(^[\"\']|[\"\']$)/', '', $text);
	}
}

La fonction stripQuotes() permet d’appeller getConfigByKey(name, core) ou getConfigByKey(“name”, “core”), evitant les erreurs ;-)

Ce qui nous permet d’appeler la fonction getConfigByKey() dans un scénario:

getConfigByKey

Ou dans un bloc code:

require_once dirname(__FILE__) . '/../../data/php/user.function.class.php';
$var = userFunction::getConfigByKey('info::latitude');

pyJeedom

Si vous êtes un habitué du Python, le module pyJeedom permet d’accéder aux fonctions de l’api jsonrpc en python : pyJeedom



To be continued…