Ce Forum passera en lecture seule en janvier 2020
Image
Merci de vous rendre sur https://community.jeedom.com maintenant pour vos prochains postes ;)

[HOW TO] Création de plugin

Cette partie est dédiée à la programmation sur le logiciel JEEDOM
ZygOm4t1k
Actif
Messages : 1702
Inscription : 08 sept. 2014, 20:52

[HOW TO] Création de plugin

Message par ZygOm4t1k » 27 mai 2018, 01:50

Voici un petit TP pour expliquer comment créer un plugin. Pour l’exemple nous allons créer un plugin qui retourne une phrase du site viedemerde.fr .(Le plugin sera évolutif)

Il ne remplace en aucun cas la documentation officielle ==> https://jeedom.github.io/plugin-template/fr_FR/

Vous pouvez télécharger l'archive de ce TP(Le plugin vdm) ==> TELECHARGER

Pour l'installer , dézipper et ajouter le dossier vdm dans /var/www/html/plugins/ .


Plugin Vie de merde
Plugin Horloge Analogique

Pour commencer il faut déterminer un nom et un id (qui ne doit pas exister)

Nom : Vie de Merde
Id : vdm

Télécharger le plugin template pour avoir la base https://github.com/jeedom/plugin-templa ... aster.zip

Dé zipper le fichier . Vous obtiendrez un dossier « plugin-template-master » contenant des dossiers 3rparty , core , desktop…

On y va.

Renommer le dossier « plugin-template-master » en « vdm » (l’id) du plugin.

1/ Ouvrir le fichier plugin_info/info.json et éditer le.

Code : Tout sélectionner

{
	"id" : "vdm",
	"name" : "Vie de Merde",
	"description" : "Plugin pour récupérer les dernières vdm",
	"licence" : "AGPL",
	"author" : "Zyg0m4t1k",
	"require" : "3.2",
	"category" : "monitoring",
	"changelog" : "",
	"documentation" : "",
	"language" : "",
	"compatibility" : ""	
}
Copier coller le code ci-dessus.

J’ai changé l’id (vdm) , le nom , ajouter une description , l’auteur et la catégorie.

require : version minimale de jeedom pour avoir accés au plugin sur le market.

Changelog, documentation, language , compatibility nuls pour le moment. J’y reviendrai plus tard

2/ Nous allons renommer les fichiers nécessaires pour que le plugin soit reconnu par Jeedom

- Renommer le fichier core/ajax/template.ajax.php en vdm.ajax.php

- Renommer le fichier core/class/template.class.php en vdm.class.php et ouvrez le pour l’éditer.

Remplacer

Code : Tout sélectionner

class template extends eqLogic {
par

Code : Tout sélectionner

class vdm extends eqLogic {
et

Code : Tout sélectionner

class templateCmd extends cmd
par

Code : Tout sélectionner

class vdmCmd extends cmd
- Renommer le fichier core/php/template.inc.php en core/php/vdm.inc.php
- Renommer le fichier desktop/php/template.php en desktop /php/vdm.php et ouvrez le

Remplacer

Code : Tout sélectionner

$plugin = plugin::byId('template');
Par

Code : Tout sélectionner

$plugin = plugin::byId(‘vdm’);

Code : Tout sélectionner

{{Ajouter un template}}
Par

Code : Tout sélectionner

{{Ajouter un équipement}}

Code : Tout sélectionner

<legend>{{Mes templates}}</legend>
Par

Code : Tout sélectionner

<legend>{{Mes équipement}}</legend>

Code : Tout sélectionner

{{Nom de l'équipement template}}
Par

Code : Tout sélectionner

{{Nom de l'équipement }} 

Code : Tout sélectionner

{{template param 1}}
Par

Code : Tout sélectionner

{{Paramètres}}

Code : Tout sélectionner

<?php include_file('desktop', 'template', 'js', 'template');?>
Par

Code : Tout sélectionner

<?php include_file('desktop', vdm, 'js', vdm);?>
Et rien d’autre , ne pas changer la ligne <?php include_file('core', 'plugin.template', 'js');?>

-Renommer le fichier desktop/modal/modal.template.php en desktop/modal/modal.vdm.php

-Renommer le fichier desktop/js/template.js en desktop/js/ vdm.js

- Ouvrir le fichier plugin_info/install.php
Et renommer les fonctions comme suit

Code : Tout sélectionner

function vdm_install() {
    
}

function vdm_update() {
    
}


function vdm_remove() {
    
}
Voilà le plugin est prêt mais il reste la customisation et l’icône à mettre à jour ==> https://jeedom.github.io/documentation/ ... _de_plugin

Ajouter l'icône dans le dossier plugin_info sous le nom vdm_icon.png

dans mon cas


Image


Maintenant on peut copier le dossier vdm dans le dossier plugin de Jeedom et aller dans la gestion des plugins. On retrouve bien le plugin.

Image

On l'active et ensuite plugins/Monitoring/Vie de Merde

Image

ça ne va pas car la couleur du plus ne correspond pas à la couleur de l'icône.

J'ouvre le fichier desktop/php/desktop.php pour corriger.

Code : Tout sélectionner

      <div class="cursor eqLogicAction" data-action="add" style="text-align: center; background-color : #ffffff; height : 120px;margin-bottom : 10px;padding : 5px;border-radius: 2px;width : 160px;margin-left : 10px;" >
        <i class="fa fa-plus-circle" style="font-size : 6em;color:#94ca02;"></i>
        <br>
        <span style="font-size : 1.1em;position:relative; top : 23px;word-break: break-all;white-space: pre-wrap;word-wrap: break-word;color:#94ca02">{{Ajouter}}</span>
      </div>
Je remplace

Code : Tout sélectionner

color:#94ca02;"
par

Code : Tout sélectionner

color:#00A9EC;"
On remarque aussi que les textes ne sont pas alignés donc on rectifie le style de la configuration ( propriété top)

Code : Tout sélectionner

<span style="font-size : 1.1em;position:relative; top : 15px;word-break: break-all;white-space: pre-wrap;word-wrap: break-word;color:#767676">{{Configuration}}</span>
par

Code : Tout sélectionner

<span style="font-size : 1.1em;position:relative;top : 23px;word-break: break-all;white-space: pre-wrap;word-wrap: break-word;color:#767676">{{Configuration}}</span>
Image


Voilà la base est prête. Vous devriez avoir le plugin d'actif mais pour le moment il ne fait rien.
Dernière édition par ZygOm4t1k le 10 mars 2019, 23:22, édité 12 fois.

Avatar de l’utilisateur
noodom
Actif
Messages : 982
Inscription : 13 juil. 2014, 17:25
Contact :

Re: [HOW TO] Création de plugin

Message par noodom » 27 mai 2018, 02:11

Bonne initiative, j'attends la suite avec impatience et pourquoi pas, me lancer.
En tout cas, je vais lire la suite avec attention !

Merci !

Loic74
Actif
Messages : 709
Inscription : 24 oct. 2017, 22:45
Localisation : Haute-Savoie
Contact :

Re: [HOW TO] Création de plugin

Message par Loic74 » 27 mai 2018, 03:27

Bonjour et merci beaucoup pour ce tuto!
---------------------------------------
Jeedom v3.3.19, VM sur Synology RS1619xs+, Arduinos, ETH-IO32B, MQTT, TTN, LoRa, Service Pack Power Ultimate
Ma présentation
Ma piscine connectée
ioBoard

ZygOm4t1k
Actif
Messages : 1702
Inscription : 08 sept. 2014, 20:52

Re: [HOW TO] Création de plugin

Message par ZygOm4t1k » 27 mai 2018, 08:17

Les commandes


Le but du plugin sera de récupérer une vdm aléatoire et l’afficher sur le dashboard.

Il faut donc créer une commande de type info pour stocker cette information. Elle sera de sous-type « String » car c’est une chaîne de caractère.

Pour l’exemple nous allons ajouter une commande qui rafraîchit l’information. Ce sera donc une commande de type action et sous-type other

-Créer un équipement « vdm1 » en cliquant sur le +. Activer le et rendez le visible. Choisissez un objet et l’équipement doit apparaitre sur le dashboard( selon l’objet).

A ce moment, il n’y a pas de commandes qui apparaissent dans l’onglet commande s, ni sur le widget.

Ouvrir le fichier core/class/vdm.class.php et chercher la fonction postSave() (Lire la doc du plugin template si pas encore fait)

On crée les 2 commandes

Code : Tout sélectionner

    public function postSave() {
	
		$info = $this->getCmd(null, 'story');
		if (!is_object($info)) {
			$info = new vdmCmd();
			$info->setName(__('Histoire', __FILE__));
		}
		$info->setLogicalId('story');
		$info->setEqLogic_id($this->getId());
		$info->setType('info');
		$info->setSubType('string');
		$info->save();	
		
		$refresh = $this->getCmd(null, 'refresh');
		if (!is_object($refresh)) {
			$refresh = new vdmCmd();
			$refresh->setName(__('Rafraichir', __FILE__));
		}
		$refresh->setEqLogic_id($this->getId());
		$refresh->setLogicalId('refresh');
		$refresh->setType('action');
		$refresh->setSubType('other');
		$refresh->save();        
    }
-Créer un autre équipement « vdm2 » en cliquant sur le +. Dans l’onglet commandes, les commandes sont apparues. Activer le et rendez le visible. Choisissez un objet parent et allez voir ce que ça donne sur le dashboard.

-Enregistrer le premier équipement « vdm1 » pour créer les commandes. Voir le rendu sur le widget aussi.

Dans l’onglet commandes , vous devriez voir.

Image


Ouvrir desktop/php/vdm.php pour trouver le code html de ce tableau.

Code : Tout sélectionner

<a class="btn btn-success btn-sm cmdAction pull-right" data-action="add" style="margin-top:5px;"><i class="fa fa-plus-circle"></i> {{Commandes}}</a><br/><br/>
<table id="table_cmd" class="table table-bordered table-condensed">
    <thead>
        <tr>
            <th>{{Nom}}</th><th>{{Type}}</th><th>{{Action}}</th>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>
Au moment de l’affichage , c’est le script desktop/js/vdm.js qui est appelé et lance la fonction
addCmdToTable.

Code : Tout sélectionner

function addCmdToTable(_cmd) {
    if (!isset(_cmd)) {
        var _cmd = {configuration: {}};
    }
    if (!isset(_cmd.configuration)) {
        _cmd.configuration = {};
    }
    var tr = '<tr class="cmd" data-cmd_id="' + init(_cmd.id) + '">';
    tr += '<td>';
    tr += '<span class="cmdAttr" data-l1key="id" style="display:none;"></span>';
    tr += '<input class="cmdAttr form-control input-sm" data-l1key="name" style="width : 140px;" placeholder="{{Nom}}">';
    tr += '</td>';
    tr += '<td>';
    tr += '<span class="type" type="' + init(_cmd.type) + '">' + jeedom.cmd.availableType() + '</span>';
    tr += '<span class="subType" subType="' + init(_cmd.subType) + '"></span>';
    tr += '</td>';
    tr += '<td>';
    if (is_numeric(_cmd.id)) {
        tr += '<a class="btn btn-default btn-xs cmdAction" data-action="configure"><i class="fa fa-cogs"></i></a> ';
        tr += '<a class="btn btn-default btn-xs cmdAction" data-action="test"><i class="fa fa-rss"></i> {{Tester}}</a>';
    }
    tr += '<i class="fa fa-minus-circle pull-right cmdAction cursor" data-action="remove"></i>';
    tr += '</td>';
    tr += '</tr>';
    $('#table_cmd tbody').append(tr);
    $('#table_cmd tbody tr:last').setValues(_cmd, '.cmdAttr');
    if (isset(_cmd.type)) {
        $('#table_cmd tbody tr:last .cmdAttr[data-l1key=type]').value(init(_cmd.type));
    }
    jeedom.cmd.changeType($('#table_cmd tbody tr:last'), init(_cmd.subType));
}
Cela se fait automatiquement.

Je souhaite ajouter les options Affichage et historiser pour chaque commande.

J’édite le code html du tableau dans le fichier desktop.php en ajoutant une colonne ..

Code : Tout sélectionner

<th>{{Nom}}</th><th>{{Type}}</th><th>{{Configuration}}</th><th>{{Action}}</th>
Puis éditer desktop.js ,trouver

Code : Tout sélectionner

    tr += '<span class="subType" subType="' + init(_cmd.subType) + '"></span>';
    tr += '</td>';
    tr += '<td>';
    if (is_numeric(_cmd.id)) {
On ajoute les informations souhaitées.

Code : Tout sélectionner

    tr += '<span class="subType" subType="' + init(_cmd.subType) + '"></span>';
    tr += '</td>';
    tr += '<td>';
    tr += '<span><input type="checkbox" class="cmdAttr checkbox-inline" data-l1key="isHistorized" /> {{Historiser}}<br/></span>';
   tr += '<span><input type="checkbox" class="cmdAttr checkbox-inline" data-l1key="isVisible" /> {{Affichage}}<br/></span>';
   tr += '</td>';		
    tr += '<td>';
    if (is_numeric(_cmd.id)) {

Je laisse le bouton pour créer une commande mais je souhaite qu’il soit à gauche.

Code : Tout sélectionner

<a class="btn btn-success btn-sm cmdAction pull-right" data-action="add" style="margin-top:5px;"><i class="fa fa-plus-circle"></i> {{Commandes}}</a><br/><br/>
Je change la class pull-right en pull-left

Code : Tout sélectionner

<a class="btn btn-success btn-sm cmdAction pull-left" data-action="add" style="margin-top:5px;"><i class="fa fa-plus-circle"></i> {{Commandes}}</a><br/><br/>
Voici le rendu.Les options de configuration (Affichage et historiser) sont bien présentes.

Image

Voilà il reste à récupérer une vdm aléatoire et à utiliser les commandes. ( A venir)

ZygOm4t1k
Actif
Messages : 1702
Inscription : 08 sept. 2014, 20:52

Re: [HOW TO] Création de plugin

Message par ZygOm4t1k » 27 mai 2018, 10:33

Récupération des informations

Pour récupérer une vdm de manière aléatoire.

Code : Tout sélectionner

	
$url = "http://www.viedemerde.fr/aleatoire";
$data = file_get_contents($url);
@$dom = new DOMDocument();
libxml_use_internal_errors(false);
$dom->loadHTML('<?xml encoding="UTF-8">' .$data);
libxml_use_internal_errors(true);
$xpath = new DOMXPath($dom);
$divs = $xpath->query('//article[@class="art-panel col-xs-12"]//div[@class="panel-content"]//p//a');
return $divs[0]->nodeValue ;
Ouvrir le fichier core/class/vdm.class.php et pour la class vdm qui hérite des méthodes egLogic, je crée une fonction randomVdm

Code : Tout sélectionner

	
	public function randomVdm() {
		$url = "http://www.viedemerde.fr/aleatoire";
		$data = file_get_contents($url);
		@$dom = new DOMDocument();
		libxml_use_internal_errors(true);
		$dom->loadHTML($data);
		libxml_use_internal_errors(false);
		$xpath = new DOMXPath($dom);
		$divs = $xpath->query('//article[@class="art-panel col-xs-12"]//div[@class="panel-content"]//p//a');
		return $divs[0]->nodeValue ;
	}
	
Maintenant on va updater la commande info(story) avec cette information en lançant la commande action(refresh).
Toujours dans core/class/vdm.class.php pour la class vdmCmd on va utiliser la méthode execute

Code : Tout sélectionner

public function execute($_options = array()) {
		
        
 }
C’est ici qu’on va définir ce qu’il va se passer quand on lance la commande « Rafraîchir ». La classe vdmCmd a hérité de toutes les méthodes de la class cmd (Core jeedom)

On vérifie le logicalId de la commande lancée et si « refresh » on lance les actions

Code : Tout sélectionner

switch ($this->getLogicalId()) {				
	case 'refresh': // LogicalId de la commande rafraîchir que l’on a créé dans la méthode Postsave de la classe vdm . 
	// code pour rafraîchir ma commande
	break;
}
Maintenant il reste à lancer la fonction randomVdm() . On récupère pour cela , l’eqLogic ( l’équipement) de la commande lancer et on lance la fonction

Code : Tout sélectionner

$eqlogic = $this->getEqLogic(); // Récupération de l’eqlogic
$info = $eqlogic-> randomVdm() ; //Lance la fonction et stocke le résultat dans la variable $info
On met à jour la commande « story » avec la variable $info. On va utiliser la méthode checkAndUpdateCmd de la class eqlogic

Code : Tout sélectionner

$eqlogic->checkAndUpdateCmd('story', $info);
Ce qui donne au final

Code : Tout sélectionner

    public function execute($_options = array()) {
		$eqlogic = $this->getEqLogic(); //récupère l'éqlogic de la commande $this
		switch ($this->getLogicalId()) {	//vérifie le logicalid de la commande 			
			case 'refresh': // LogicalId de la commande rafraîchir que l’on a créé dans la méthode Postsave de la classe vdm . 
				$info = $eqlogic->randomVdm(); 	//On lance la fonction randomVdm() pour récupérer une vdm et on la stocke dans la variable $info
				$eqlogic->checkAndUpdateCmd('story', $info); // on met à jour la commande avec le LogicalId "story"  de l'eqlogic 
				break;
		}
    }
Maintenant aller dans un équipement créé et lancer la commande Rafraichir. Puis la commande « Histoire » qui doit être à jour.

Sur le Dashboard, les informations apparaissent. Cliquez sur l’icône refresh pour changer l’information

On va définir ensuite la taille du widget et le customiser un peu

Puis automatiser le refresh.

Anonyme
Actif
Messages : 10082
Inscription : 09 août 2014, 12:15

Re: [HOW TO] Création de plugin

Message par Anonyme » 27 mai 2018, 10:52

Contenu supprimé à la demande de son auteur

Avatar de l’utilisateur
SBO
Actif
Messages : 1371
Inscription : 17 sept. 2014, 18:31

Re: [HOW TO] Création de plugin

Message par SBO » 27 mai 2018, 11:10

Super @ZygOm4t1k

Bonne initiative.
Ex-Bêta-Testeur | Jeedom | VM Debian 9

Pas de logs, pas d'infos, pas de réponse possible

Charte du forum | Doc jeedom | Trucs et astuces

Avatar de l’utilisateur
lunarok
Actif
Messages : 6704
Inscription : 08 août 2014, 12:48
Localisation : Anjou

Re: [HOW TO] Création de plugin

Message par lunarok » 27 mai 2018, 11:16

Oui félicitations et on voit que ca vient de quelqu'un qui a compris Jeedom.
Par contre faudrait voir à le mettre dans les docs howto ou alors faire un coucou tous les 364 jours pour éviter la purge des fils ...
Mon Blog | Xiaomi Home
Pour contribuer au développement des plugins (don ou achat de matériel) : Paypal
Aides nous à t'aider : les logs, détails du soucis, la doc, recherche sur le forum ...
PS : pas de support par MP, je ne répondrais pas

philippe
Actif
Messages : 1176
Inscription : 17 juil. 2014, 07:40

Re: [HOW TO] Création de plugin

Message par philippe » 27 mai 2018, 12:02

Merci @ZygOm4t1k pour ce tuto .
ça donne envie de s'y mettre :)

ZygOm4t1k
Actif
Messages : 1702
Inscription : 08 sept. 2014, 20:52

Re: [HOW TO] Création de plugin

Message par ZygOm4t1k » 27 mai 2018, 16:49

lunarok a écrit :
27 mai 2018, 11:16
Oui félicitations et on voit que ca vient de quelqu'un qui a compris Jeedom.
Par contre faudrait voir à le mettre dans les docs howto ou alors faire un coucou tous les 364 jours pour éviter la purge des fils ...
Merci.
Ah Oui c'est vrai ! Vais sauvegarder ça en local.

Avatar de l’utilisateur
loic
Administrateur
Messages : 14862
Inscription : 01 févr. 2014, 16:21

Re: [HOW TO] Création de plugin

Message par loic » 27 mai 2018, 17:02

Bonjour,
Nous allons revoir cette règle qui semble dans certains rare cas ne pas marcher donc pas d'inquiétude à avoir. Par contre si tu veux en faire un tuto en md je le publierais avec plaisir.
Aide nous à t'aider : mets des logs, détaille ton soucis... Vous n'aurez aucune réponse de ma part si votre demande n'est pas détaillée (log, capture d'écran lisible...) ou si vous ne postez pas dans la bonne section

meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

Re: [HOW TO] Création de plugin

Message par meute » 28 mai 2018, 00:26

Un grand merci pour ce tuto, c'est probablement LA brique qui me manquait pour commencer à construire ... quand j'aurais un peu de temps ... et une idée ...
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

coorfang
Timide
Messages : 15
Inscription : 24 mai 2018, 14:19

Re: [HOW TO] Création de plugin

Message par coorfang » 28 mai 2018, 12:03

Bonjour,

Merci pour votre tuto!

J'ai bien suivi votre instruction juste avant coper tout ça dans le dossier 'plugin'. Mais, après, le site web march pas du tout. Il semble que l'engine essayer ouvrir mon plugin mais il ne peut pas. Il faut reboot le raspberry pi forcément.

J'ai aussi essayé changer le permission a le même que l'autres. C'est: 'drwxrwxr-x'. Mais, il n'aide pas. Le même problem apparu.

J'ai donc supprimé mon plugin dossier dans le 'plugin' dossier. Après le site march encore, et j'ai reçu le log message: "Plugin introuvable (json invalide) : /var/www/html/core/class/../../plugins/snips/plugin_info/info.json =>".

Plus des information:
Version de JeeDom : 3.2.7

Content de mon info.json:

Code : Tout sélectionner

{
	"id" : "snips",
	"name" : "Snips Voice Control",
	"description" : "Snips voice control plugin, which allows you execute command by using your voice",
	"licence" : "AGPL",
	"author" : "Coor Fang",
	"require" : "3.2",
	"category" : "Automation",
	"hasDependency" : false,
	"hasOwnDeamon" : false,
	"maxDependancyInstallTime" : 0,
	"changelog" : "https://jeedom.github.io/plugin-template/#language#/changelog",
	"documentation" : "https://jeedom.github.io/plugin-template/#language#/",
	"link" : {
		"forum":"Lien vers le forum",
		"video" : "Lien vers une video",
	},
	"language" : ["fr_FR","en_US","de_DE","sp_SP","ru_RU","id_ID","it_IT"],
	"compatibility" : ["Jeedomboard","Smart","RPI/RPI2","Docker","DIY","mobile"]
}
J'ai essayé changer le content de json a votre, ça marche!! :roll: :roll: :roll:

Donc, pour le personne qui a la même problem, tu dois fait exactement le même que instruction pour ton 'info.json' dossier......

Avatar de l’utilisateur
slobberbone
Actif
Messages : 2692
Inscription : 25 juin 2014, 12:34
Localisation : Caen

Re: [HOW TO] Création de plugin

Message par slobberbone » 28 mai 2018, 12:31

coorfang a écrit :
28 mai 2018, 12:03
Bonjour,

Merci pour votre tuto!

J'ai bien suivi votre instruction juste avant coper tout ça dans le dossier 'plugin'. Mais, après, le site web march pas du tout. Il semble que l'engine essayer ouvrir mon plugin mais il ne peut pas. Il faut reboot le raspberry pi forcément.

J'ai aussi essayé changer le permission a le même que l'autres. C'est: 'drwxrwxr-x'. Mais, il n'aide pas. Le même problem apparu.

J'ai donc supprimé mon plugin dossier dans le 'plugin' dossier. Après le site march encore, et j'ai reçu le log message: "Plugin introuvable (json invalide) : /var/www/html/core/class/../../plugins/snips/plugin_info/info.json =>".

Plus des information:
Version de JeeDom : 3.2.7

Content de info.json:

Code : Tout sélectionner

{
	"id" : "snips",
	"name" : "Snips Voice Control",
	"description" : "Snips voice control plugin, which allows you execute command by using your voice",
	"licence" : "AGPL",
	"author" : "Coor Fang",
	"require" : "3.2",
	"category" : "Automation",
	"hasDependency" : false,
	"hasOwnDeamon" : false,
	"maxDependancyInstallTime" : 0,
	"changelog" : "https://jeedom.github.io/plugin-template/#language#/changelog",
	"documentation" : "https://jeedom.github.io/plugin-template/#language#/",
	"link" : {
		"forum":"Lien vers le forum",
		"video" : "Lien vers une video",
	},
	"language" : ["fr_FR","en_US","de_DE","sp_SP","ru_RU","id_ID","it_IT"],
	"compatibility" : ["Jeedomboard","Smart","RPI/RPI2","Docker","DIY","mobile"]
}
J'ai essayé changer le content de json a votre, ça marche!!

Donc, pour le personne qui a la même problem, tu dois fait exactement le même que instruction pour ton 'info.json' dossier......
Salut, tu as une virgule en trop :

Code : Tout sélectionner

	"link" : {
		"forum":"Lien vers le forum",
		"video" : "Lien vers une video"[u][color=#FF0000],[/color][/u]
	},
	
Présentation, Rénovation, JeedomBox : https://www.jeedom.fr/forum/viewtopic.php?f=50&t=11339
Mes plugins/widgets : viewtopic.php?f=50&t=11339#p214011

coorfang
Timide
Messages : 15
Inscription : 24 mai 2018, 14:19

Re: [HOW TO] Création de plugin

Message par coorfang » 28 mai 2018, 12:38

slobberbone a écrit :
28 mai 2018, 12:31
coorfang a écrit :
28 mai 2018, 12:03
Bonjour,

Merci pour votre tuto!

J'ai bien suivi votre instruction juste avant coper tout ça dans le dossier 'plugin'. Mais, après, le site web march pas du tout. Il semble que l'engine essayer ouvrir mon plugin mais il ne peut pas. Il faut reboot le raspberry pi forcément.

J'ai aussi essayé changer le permission a le même que l'autres. C'est: 'drwxrwxr-x'. Mais, il n'aide pas. Le même problem apparu.

J'ai donc supprimé mon plugin dossier dans le 'plugin' dossier. Après le site march encore, et j'ai reçu le log message: "Plugin introuvable (json invalide) : /var/www/html/core/class/../../plugins/snips/plugin_info/info.json =>".

Plus des information:
Version de JeeDom : 3.2.7

Content de info.json:

Code : Tout sélectionner

{
	"id" : "snips",
	"name" : "Snips Voice Control",
	"description" : "Snips voice control plugin, which allows you execute command by using your voice",
	"licence" : "AGPL",
	"author" : "Coor Fang",
	"require" : "3.2",
	"category" : "Automation",
	"hasDependency" : false,
	"hasOwnDeamon" : false,
	"maxDependancyInstallTime" : 0,
	"changelog" : "https://jeedom.github.io/plugin-template/#language#/changelog",
	"documentation" : "https://jeedom.github.io/plugin-template/#language#/",
	"link" : {
		"forum":"Lien vers le forum",
		"video" : "Lien vers une video",
	},
	"language" : ["fr_FR","en_US","de_DE","sp_SP","ru_RU","id_ID","it_IT"],
	"compatibility" : ["Jeedomboard","Smart","RPI/RPI2","Docker","DIY","mobile"]
}
J'ai essayé changer le content de json a votre, ça marche!!

Donc, pour le personne qui a la même problem, tu dois fait exactement le même que instruction pour ton 'info.json' dossier......
Salut, tu as une virgule en trop :

Code : Tout sélectionner

	"link" : {
		"forum":"Lien vers le forum",
		"video" : "Lien vers une video"[u][color=#FF0000],[/color][/u]
	},
	
Merci beaucoup pour réponse rapide, maintenant je sais où est le problem.

Avatar de l’utilisateur
slobberbone
Actif
Messages : 2692
Inscription : 25 juin 2014, 12:34
Localisation : Caen

Re: [HOW TO] Création de plugin

Message par slobberbone » 28 mai 2018, 13:07

coorfang a écrit :
28 mai 2018, 12:38
slobberbone a écrit :
28 mai 2018, 12:31
coorfang a écrit :
28 mai 2018, 12:03
Bonjour,

Merci pour votre tuto!

J'ai bien suivi votre instruction juste avant coper tout ça dans le dossier 'plugin'. Mais, après, le site web march pas du tout. Il semble que l'engine essayer ouvrir mon plugin mais il ne peut pas. Il faut reboot le raspberry pi forcément.

J'ai aussi essayé changer le permission a le même que l'autres. C'est: 'drwxrwxr-x'. Mais, il n'aide pas. Le même problem apparu.

J'ai donc supprimé mon plugin dossier dans le 'plugin' dossier. Après le site march encore, et j'ai reçu le log message: "Plugin introuvable (json invalide) : /var/www/html/core/class/../../plugins/snips/plugin_info/info.json =>".

Plus des information:
Version de JeeDom : 3.2.7

Content de info.json:

Code : Tout sélectionner

{
	"id" : "snips",
	"name" : "Snips Voice Control",
	"description" : "Snips voice control plugin, which allows you execute command by using your voice",
	"licence" : "AGPL",
	"author" : "Coor Fang",
	"require" : "3.2",
	"category" : "Automation",
	"hasDependency" : false,
	"hasOwnDeamon" : false,
	"maxDependancyInstallTime" : 0,
	"changelog" : "https://jeedom.github.io/plugin-template/#language#/changelog",
	"documentation" : "https://jeedom.github.io/plugin-template/#language#/",
	"link" : {
		"forum":"Lien vers le forum",
		"video" : "Lien vers une video",
	},
	"language" : ["fr_FR","en_US","de_DE","sp_SP","ru_RU","id_ID","it_IT"],
	"compatibility" : ["Jeedomboard","Smart","RPI/RPI2","Docker","DIY","mobile"]
}
J'ai essayé changer le content de json a votre, ça marche!!

Donc, pour le personne qui a la même problem, tu dois fait exactement le même que instruction pour ton 'info.json' dossier......
Salut, tu as une virgule en trop :

Code : Tout sélectionner

	"link" : {
		"forum":"Lien vers le forum",
		"video" : "Lien vers une video"[u][color=#FF0000],[/color][/u]
	},
	
Merci beaucoup pour réponse rapide, maintenant je sais où est le problem.
De rien !
Présentation, Rénovation, JeedomBox : https://www.jeedom.fr/forum/viewtopic.php?f=50&t=11339
Mes plugins/widgets : viewtopic.php?f=50&t=11339#p214011

ZygOm4t1k
Actif
Messages : 1702
Inscription : 08 sept. 2014, 20:52

Re: [HOW TO] Création de plugin

Message par ZygOm4t1k » 28 mai 2018, 21:38

Update des informations (cron)

Le plugin est fonctionnel mais pour l’instant il ne fait pas grand-chose. Si vous cliquer sur la commande « refresh » , la commande « story » se met à jour mais sinon rien.

A noter que pour la commande je la nomme par logicalId. Et c’est important. Avoir un logicalId unique par équipement (eqLogic) simplifie les choses.

On va voir maintenant comment mettre à jour la commande en utilisant les fonctions natives du core : Les crons

Il y en a plusieurs
cron : rafraichissement toutes les minutes
cron5 : rafraichissement toutes les 5 minutes
cron15 : rafraichissement toutes les 15 minutes
cron30 : rafraichissement toutes les 30 minutes
cronHourly : euh.. toutes les heures
cronDaily : ben 1/jour
Vu le plugin on va effectuer une mise à jour toutes les heures (soyons fous). On va donc utiliser la fonction cronHourly().

On va donc ouvrir le fichier vdm.class.php et chercher

Code : Tout sélectionner

    /*
     * Fonction exécutée automatiquement toutes les heures par Jeedom
      public static function cronHourly() {

      }
     */
Décommenter le code

Code : Tout sélectionner

      public static function cronHourly() {

      }
Notre fonction est opérationnelle

Maintenant il faut récupérer tous les équipements de notre plugin,

Code : Tout sélectionner

self::byType('vdm') //array contenant tous les équipements du plugin 
et les trier 1 par 1

Code : Tout sélectionner

foreach (self::byType('vdm') as $vdm) {
}
Avant d’effectuer quoique ce soit on vérifie que l’équipement est actif

Code : Tout sélectionner

if ($vdm->getIsEnable() == 1) {
}
Voila maintenant on recherche la commande « refresh » de l’équipement (eqLogic)

Code : Tout sélectionner

$cmd = $vdm->getCmd(null, 'refresh');
Si elle n’existe pas on continue la boucle (foreach) sinon on l’éxécute

Code : Tout sélectionner

if (!is_object($cmd)) {
continue;
}
$cmd->execCmd();	
Ce qui donne au final

Code : Tout sélectionner

      public static function cronHourly () {
		  foreach (self::byType('vdm') as $vdm) {//parcours tous les équipements du plugin vdm
			  if ($vdm->getIsEnable() == 1) {//vérifie que l'équipement est actif
				  $cmd = $vdm->getCmd(null, 'refresh');//retourne la commande "refresh si elle exxiste
				  if (!is_object($cmd)) {//Si la commande n'existe pas
				  	continue; //continue la boucle
				  }
				  $cmd->execCmd(); // la commande existe on la lance
			  }
		  }
      }
Pour tester, dans jeedom , aller dans configuration/moteur de tâches et lancer le cron de class « plugin » fonction « cronHourly »
L’information se met à jour.

C’est bien mais ça ne me convient pas. A la création de l’équipement, la commande « story » ne se met pas à jour.

On améliore donc le code.

Pour la création des commandes nous avons utilisé la méthode postSave(). On va utiliser la méthode postUpdate() pour mettre à jour l’information.

La manière la plus simple vu qu’il n’y a qu’une commande et qu’elle est créé en postSave

Code : Tout sélectionner

    public function postUpdate() {
		$cmd = $this->getCmd(null, 'refresh'); // On recherche la commande refresh de l’équipement
		if (is_object($cmd)) { //elle existe et on lance la commande
			 $cmd->execCmd();
		}
    }
Il faut tester, ça fonctionne?

Mais voici une alternative qui peut s’avérer plus utile dans des cas plus complexe

Dans la fonction postUpdate() , on lance la function cronHourly() avec l'id de l'équipement

Code : Tout sélectionner

    public function postUpdate() {
		self::cronHourly($this->getId());// lance la fonction cronHourly avec l’id de l’eqLogic
    }
Mais dans ce cas on change la fonction cronHourly()

Code : Tout sélectionner

	public static function cronHourly($_eqLogic_id = null) {
		if ($_eqLogic_id == null) { // La fonction n’a pas d’argument donc on recherche tous les équipements du plugin
			$eqLogics = self::byType('vdm', true);
		} else {// La fonction a l’argument id(unique) d’un équipement(eqLogic)
			$eqLogics = array(self::byId($_eqLogic_id));
		}		  
	
		foreach ($eqLogics as $vdm) {
			if ($vdm->getIsEnable() == 1) {//vérifie que l'équipement est acitf
				$cmd = $vdm->getCmd(null, 'refresh');//retourne la commande "refresh si elle exxiste
				if (!is_object($cmd)) {//Si la commande n'existe pas
				  continue; //continue la boucle
				}
				$cmd->execCmd(); // la commande existe on la lance
			}
		}
	}
Après vous pouvez changer la fréquence du cron selon l'importance de vos informations à récupérer.

Je ne peux que vous invitez à prendre le temps d’aller sur cette page pour en savoir plus ==> ICI

Et encore mieux d'aller sur le github du core ==> ICI

Mettez le nez de dedans pour maîtrisez encore plus .

Le plugin est fonctionnel en l'état.

Je prendrai le temps d'ajouter la façon de mettre en place un cron personnalisé selon l'équipement .
Dernière édition par ZygOm4t1k le 29 mai 2018, 06:21, édité 2 fois.

ZygOm4t1k
Actif
Messages : 1702
Inscription : 08 sept. 2014, 20:52

Re: [HOW TO] Création de plugin

Message par ZygOm4t1k » 28 mai 2018, 23:23

Le widget

Pas une mince affaire le widget mais on va rester sur le widget par défaut pour le moment.

Si vous n’avez rien touché, équipement activé et visible, le widget prend toute la largeur de l’écran. On va donc le changer.

La commande qui apparaît est la commande «story» de type info , sous-type string

Mon plaisir est de me lever le matin est de lire une vdm au réveil. Ça me permet de voir qu’il y a pire que moi :D

Mais je n’ai pas mes lunettes et actuellement le rendu sur le widget ne me permet pas de le lire…

Donc on va changer le style en affectant un template à la commande « story»

Rien de plus simple.

Je vais voir ==> ICI

Je cherche un template pour cmd.info.string( notre commande est de type info sous-type string) .Pas difficile il y en a que deux (default ou tile)

J’applique le template « cmd.info.string.tile.html » à ma commande.

Pour cela j’ouvre le fichier vdm.class.php , fonction postSave() et j’ajoute le template « tile » pour la commande « story » en appliquant la méthode setTemplate()

Code : Tout sélectionner

		$info = $this->getCmd(null, 'story');
		if (!is_object($info)) {
			$info = new vdmCmd();
			$info->setName(__('Histoire', __FILE__));
		}
		$info->setLogicalId('story');
		$info->setEqLogic_id($this->getId());
		$info->setType('info');
		$info->setTemplate('dashboard','tile');//template pour le dashboard
		$info->setSubType('string');
		$info->save();
Rafraîchir le dasboard.

C'’est mieux mais le widget prend toujours la largeur du dashboard. On va donc corriger. Par défaut la largeur du widget de l’équipement(eqLogic) et la hauteur sont à « auto ».

On va donc changer la largeur du widget(équipement => eqLogic) en utilisant la méthode setDisplay() héritée de la class eqLogic .On laisse la hauteur en auto.

Pour cela il suffit d’ajouter

Code : Tout sélectionner

$this->setDisplay("width","800px");
Oui , mais !! Car il y a un mais. Essayez d’ajouter ça dans la fonction postsave() ou postUpdate() et ça ne prends pas en compte le changement. Pourquoi ? Ben faut lire la doc du plugin template ==>ICI

Maintenant que vous avez bien lu vous savez qu’Il faut utiliser la méthode preSave()

Code : Tout sélectionner

    public function preSave() {
		$this->setDisplay("width","800px");
    }
Enregistrer un équipement et rafraîchissez le dashboard.

Étonnant non? ...

INFO:
ceci est un exemple à adapter bien sûr selon les besoins. Si vous modifier le widget en mode modification sur le dashboard les paramètres seront sauvegardés. Par contre si vous sauvegarder de nouveau l'équipement , la largeur sera de 800px avec la hauteur que vous avez définie en mode modification..

Avatar de l’utilisateur
mamatdv
Actif
Messages : 1495
Inscription : 10 juil. 2014, 10:03
Localisation : Dijon

Re: [HOW TO] Création de plugin

Message par mamatdv » 28 mai 2018, 23:27

Beau travail ZygOm4t1k !



Envoyé de mon iPhone en utilisant Tapatalk Pro
Beta-testeur
Mon matosici
Doc jeedom - Trucs et astuce

ZygOm4t1k
Actif
Messages : 1702
Inscription : 08 sept. 2014, 20:52

Re: [HOW TO] Création de plugin

Message par ZygOm4t1k » 29 mai 2018, 06:33

C'est corrigé.
Merci pour la relecture.

Répondre

Revenir vers « Développements sur Jeedom »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité