Page 1 sur 20

[Framework SC] les scenarios en php

Publié : 12 avr. 2016, 10:00
par dJuL
Salut,

Alors je trouve les scénarios de jeedom très bien foutus, avec les blocs, mais jeedom étant super ouvert ça donne toujours envie d'en faire plus.
Je me suis retrouvé parfois à faire des conditions à rallonge, avec des blocs dans des blocs...
Et là j'ai commencé a regarder le code source de jeedom pour pouvoir faire mes scénarios en php.
Puis du coup je me suis dit autant faire une classe que ce soit plus propre dans les balises codes.
Puis là je me dis peut être que ça peut intéresser du monde, pour ceux qui connaissent un peu la programmation.

Voilà donc l'idée, un petit framework pour manier tous les objets et fonctions propre à jeedom facilement dans des blocs codes.
Voici les avantages que je trouve à cette technique :
- Permet d'avoir toute la puissance du langage php
- Permet de facilement réadapter des script en LUA
- Permet de créer des opération rapides en une ligne qui prendrait 20 blocs en mode visuel
- Peut se découper en autant de blocs code que l'on veut (pratique pour déboguer, permet de désactiver un bloc...)
- reste compatible à 100% avec les blocs visuel (d’où l'autre avantage de splitter les blocs de code : pouvoir insérer des blocs classiques entre les blocs de code)
- Log détaillé
- Utilise une architecture avec des librairies, infini ou presque en évolutions et en possibilités
- Encore plus geek :D

Pour consulter la documentation et la procédure d'installation, ça se passe ici :
http://rulistaff.free.fr/sc


La doc est assez complète et comporte des exemples complet ainsi qu'un exemple d'utilisation pour chaque fonction.

Voilou ;)

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 10:12
par Sshafi
Même si pour l'instant je n'ai pas encore trop utilisé les blocs code, je trouve ton idée très intéressante :)
Et du coup je marque ta page ;)

From Tapatruc...

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 10:24
par dJuL
Merci ;)
De toutes façons d'origine on ne peut pas magner les équipements super facilement dans un bloc code, et encore moins récupérer leurs valeurs facilement, surtout avec les conversion en #id# dans la bdd quand le nom est en dur... Ce genre de pbs.
A la base le bloc code n'est pas fait pour ça, voila pourquoi j'ai commencé à faire une classe qui permet de faire du scenario dans les blocs codes aussi (à condition de connaitre un peu le php)

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 10:26
par lunarok
Pareil, j'aime le principe, même si j'ai peu d'espoir que beaucoup l'utilise vu que les users sont plutot du genre à demander de la bouillie prédigérée que de la haute gastronomie.
Mais dans le lot il doit bien y avoir quelques fines bouches que ca ravira. En tout cas faciliter et donner des raisons d'utiliser le bloc code c'est une bonne chose

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 10:44
par mbuffat69
Je trouve l'idée très intéressante (en particulier pour moi qui écrit un peu de php dans mes scénarios)

J'ai cependant qques questions:
- quid de la pérennité de la solution: dépend -t-elle fortement de la version de jeedom, et nécessite elle à ton avis des mises à jour systématiques
- peut-on envisager de partager des variables entre le code php et l'interface gui (autre qu'avec des variables globales) ?
- si on utilise des nom d'équipements (jeedom) dans le code php , je suppose que cela ne sera pas mise à jour si on change le nom de l'équipement (ce qui se fait dans l'interface gui)

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 10:55
par domoggvad
Bonjour @dJuL
Merci pour ce partage, même moi qui commence mes cours de PHP pour les nuls, je trouve l'idée très enrichissante, et ça démystifie un peu la programmation, surtout à mon petit niveau.

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 11:08
par dJuL
- quid de la pérennité de la solution: dépend -t-elle fortement de la version de jeedom, et nécessite elle à ton avis des mises à jour systématiques
Je ne pense pas car elle utilise vraiment des fonctions de bases du core de jeedom, qui n'ont pas de raison d'être modifiées régulièrement.
(sinon plus rien ne marcherait, les plugins...)
- peut-on envisager de partager des variables entre le code php et l'interface gui (autre qu'avec des variables globales) ?
Pour l'instant non, il faut passer par une variable jeedom (par contre d'un bloc code à l'autre pas besoin, c'est une option de sauvegarder la variable en jeedom ou pas)
Mais à l'avenir si la classe est incluse dans Jeedom, ce ne sera pas une obligation, il suffit d'ajouter 2 lignes de codes dans la classe scenarioExpression de Jeedom pour ça.
edit: Ah oui par contre il y a une fonction pour effacer une variable (jeedom ou interne) ce qui permet de cleaner la table des variables jeedom en fin de scenario par exemple
- si on utilise des nom d'équipements (jeedom) dans le code php , je suppose que cela ne sera pas mise à jour si on change le nom de l'équipement (ce qui se fait dans l'interface gui)
Oui et non
Si l’équipement est marqué en dur (string intégral contenant le nom), genre $toto = "#[equipement]#"; aucun soucis, on peut le renommer et ça suivra sans soucis.
Les blocs codes sont sauvegardés comme les autres blocs, et tous les noms trouvés #equipements# sont transformés en #id# dans la bdd, ce qui permet le renommage sans tout péter.
Par contre si son nom est construit dynamiquement, genre $toto_sub = "equipement"; puis $toto = "#[" . $toto_sub . "]#";
Là si on renomme ça ne marchera plus, forcément...

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 11:12
par romanais
Salut, je n'ai pas encore d'idée d'utilisation pour l'instant, mais l'outil créé le besoin :p
Super boulot en tout cas, je suis scié, c'est hyper intéressant et clair !

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 11:20
par mbuffat69
merci de ta réponse @dJul
j'ai hâte de pouvoir tester !!

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 11:32
par PuNiSHeR
Je suis preneur pour donner encore plus de puissance aux scénario, moi qui fait assez bien de bloc code. On en a jamais assez, même si Jeedom est très puissant et flexible.

Maintenant, ce qu'il serait bien, c'est une mise à jour simplifié comme un plugin. C'est juste une question de facilité pour ne pas perdre du temps inutilement.

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 11:43
par Theduck38
Ah ouuiiiii !!!

+++

(ça me plaît beaucoup) :D

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 11:56
par dJuL
PuNiSHeR a écrit : Maintenant, ce qu'il serait bien, c'est une mise à jour simplifié comme un plugin. C'est juste une question de facilité pour ne pas perdre du temps inutilement.
Si du monde est intéressé, et que ça se passe comme pour le thème, et que Loic est ok, ce sera très simple, la maj sera faite directement en même temps que Jeedom, et je mettrait a dispo en plus un script sur le market (comme pour le thème) pour forcer la maj en un click pour ceux qui ne veulent pas attendre la maj jeedom pour avoir la dernière release.

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 11:58
par PuNiSHeR
Impec. Y a plus qu'a, comme dirait l'autre. ;)

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 13:05
par marmoul
Moi j'y connais pas grand chose au scénario car je débute et j'ai très peu de matos mais si c'est comme pour le thème dark je prend c'est au top :)

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 13:21
par domoggvad
Difficile de dire non, cela permet de mieux comprendre le rouage..

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 16:43
par specimen
J'avoue que je ne comprends pas très bien le concept.
On peut déjà récupérer des valeurs de Jeedom par :

Code : Tout sélectionner

$cmd = cmd::byString('#[Appart][Elec][Test]#');
$test = $cmd->execCmd();
Et on peut aussi facilement positionner des valeurs dans Jeedom:

Code : Tout sélectionner

$cmdC = "#[Appart][Elec][Test]#";
$cmd = cmd::byString($cmdC);
$cmd->event(("100"));
Ca permet d'interagir dans les 2 sens.

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 17:00
par dJuL
Le but est de simplifier les manips au maximum, tout en ayant un log efficace, qui affiche les noms d'équipement et pas les id, et de rajouter des fonctions qui raccourcissent et simplifie le code.
Celui qui maitrise déjà tout n'en aura pas besoin...
Et encore que perso je préfère passer par la classe c'est bien plus lisible et bien plus court.
A la base je l'ai faite pour moi.

Le but est de faire un mini "framework" pour simplifier l'utilisation pour les non expert des fonctions jeedom, et d'avoir accès à toutes les fonctions des scenarios de jeedom (et plus) avec la même syntaxe ou presque.
Au début je recopiais des fonctions dans chaque scénario, au bout d'un moment je me suis dis que ce serait mieux de faire une classe incluse en une ligne, plutôt que de modifier mes fonctions dans chaque scénario, ingérable pour avoir la même version partout.

Par exemple la fonction qui retourne les valeurs :

Code : Tout sélectionner

public static function val($cmd, $log = true, $logStyle = null) {   
    $cmd = self::_tag($cmd, $log);
    if (!$cmd) {
      return null;
    }
    $cmd_obj = self::_cmdbyString($cmd);
    $value = ($cmd_obj) ? $cmd_obj->execCmd() : null;
    if ($log && $value !== null) {
      $cmd = (self::_isId($cmd)) ? self::_tag($cmd_obj->getHumanName()) : $cmd;
      self::_log("Récupération valeur", self::_format($cmd) . " = " . self::_format($value), $log, $logStyle);
    }
    else if ($value === null) {
      self::error("Impossible de lire la valeur de " . self::_format($cmd), $log); 
    }
    return $value;
  }
Voila le concept...

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 17:34
par Claude69
Super intéressé. Je MarkTaPage :D
J'étais justement en train de m'initier ;)

Code : Tout sélectionner

$Msg = array();
$TotalMsg = 0;
#récupération des messages
$Msg[0] = $scenario->getData('Msg_Pompe');
$Msg[1] = $scenario->getData('Msg_Portail');
$Msg[2] = $scenario->getData('Msg_Garage');
$Msg[3] = $scenario->getData('Msg_Poubelles');
$Msg[4] = $scenario->getData('Msg_Congel');
$Msg[5] = $scenario->getData('Msg_MaL');
$Msg[6] = $scenario->getData('Msg_Déshumidificateur');

for($i=0;$i<7;$i++) {
	if($Msg[$i]>0 and $Msg[$i]<200) {
  		$TotalMsg = $TotalMsg + 1;
  	}
}
#renvoyer le tout dans les variables du scénario
$scenario->setData('Msg_Present', $TotalMsg);

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 18:03
par Morlock
dJuL passe une vitesse là !
Cette fois c'est un outil mais malheureusement je n'ai pas le cerveau qui va avec lol
J'ai beau essayer de comprendre vos lignes et de m'aider de google... en vain.
Je vais quand même suivre ce sujet, sait-on jamais :D

Re: dev en cours: les scenarios en php

Publié : 12 avr. 2016, 18:06
par dJuL
@Claude69

Voici une version un peu plus légère de ton code qui fait la même chose:

Code : Tout sélectionner

$Msg = array('Msg_Pompe', 'Msg_Portail', Msg.... etc);
$TotalMsg = 0;
for ($i=0; $i<count($Msg); $i++) {
  $val = $scenario->getData($Msg[$i]);
  $TotalMsg+= ($val > 0 && $val < 200) ? 1 : 0;
}
J'ai pas testé, j'ai écrit à l'arrache ici y'a pt'etre un parse error...