[how to] création d'un plugin

Tags: #<Tag:0x00007f3859732df8>

Bonjour

Je me suis lancé dans la création d’un nouveau plugin (fou que je suis) et la, je me demandais si l’excellent et incontournable topic de @zygomatik sur l’ancien forum ( [how to] création d’un plugin ) a été mis à jour / importé sur le nouveau forum ? J’ai pas trouvé :slight_smile:
(edit: il est ici)

Il y a aussi une doc https://jeedom.github.io/plugin-template/fr_FR/ qui mérite d’être mise à jour

Je vais citer aussi la « phpDoc » générée automatiquement mais il y a tellement peu de commentaire dans le code qu’elle est assez pauvre et c’est bien dommage:
https://doc.jeedom.com/dev/phpdoc/3.3/

j’ai aussi trouvé de l’info sur le wiki du plugin template en particulier pour le daemon; https://github.com/rjullien/Jeedom-Plugins-Extra/wiki/Les-automates-dans-Jeedom

Autre source par sylvain:
Réaliser son 1er plugin avec un générateur automatique du squelette, et Des commandes et des tâches

tip debug: ajouter du log! ex:
log::add("lgthinq$_loggerSuffix", 'debug', $_message, $_logicalId);
1er param = le nom du log, par convention le nom du plugin (avec éventuellement un suffixe)
2e param = niveau de log (debug, info, warning, error)
3e param = le message à afficher
4e param facultatif (sais pas encore à quoi il sert)
Si plantage général (erreur non gérée, ou mal) un log sera généré dans http.error qui est le log par défaut. Si aucun log? il peut y avoir une erreur silencieuse sur le log ( core/class/log.class.php ) à cause du caractère @ dans la méthode de log.

tip debug#2: ajouter une fonction de shutdown
ajouter ce genre de fonction au début du index.php (ou dans un fichier séparé à inclure) permet de « catcher » toutes les erreurs y compris de compilation dans vos modules basé sur cette discussion de stackoverflow

<?php
define('E_FATAL',  E_ERROR | E_USER_ERROR | E_PARSE | E_CORE_ERROR |
		E_COMPILE_ERROR | E_RECOVERABLE_ERROR);

define('ENV', 'dev');

// Custom error handling vars
define('DISPLAY_ERRORS', TRUE);
define('ERROR_REPORTING', E_ALL | E_STRICT);
define('LOG_ERRORS', TRUE);

register_shutdown_function('shut');
set_error_handler('handler');

// Function to catch no user error handler function errors...
function shut(){
	$error = error_get_last();
	if($error && ($error['type'] & E_FATAL)){
		handler($error['type'], $error['message'], $error['file'], $error['line']);
	}
}

function handler( $errno, $errstr, $errfile, $errline ) {

	switch ($errno){

		case E_ERROR: // 1 //
			$typestr = 'E_ERROR'; break;
		case E_WARNING: // 2 //
			$typestr = 'E_WARNING'; break;
		case E_PARSE: // 4 //
			$typestr = 'E_PARSE'; break;
		case E_NOTICE: // 8 //
			$typestr = 'E_NOTICE'; break;
		case E_CORE_ERROR: // 16 //
			$typestr = 'E_CORE_ERROR'; break;
		case E_CORE_WARNING: // 32 //
			$typestr = 'E_CORE_WARNING'; break;
		case E_COMPILE_ERROR: // 64 //
			$typestr = 'E_COMPILE_ERROR'; break;
		case E_CORE_WARNING: // 128 //
			$typestr = 'E_COMPILE_WARNING'; break;
		case E_USER_ERROR: // 256 //
			$typestr = 'E_USER_ERROR'; break;
		case E_USER_WARNING: // 512 //
			$typestr = 'E_USER_WARNING'; break;
		case E_USER_NOTICE: // 1024 //
			$typestr = 'E_USER_NOTICE'; break;
		case E_STRICT: // 2048 //
			$typestr = 'E_STRICT'; break;
		case E_RECOVERABLE_ERROR: // 4096 //
			$typestr = 'E_RECOVERABLE_ERROR'; break;
		case E_DEPRECATED: // 8192 //
			$typestr = 'E_DEPRECATED'; break;
		case E_USER_DEPRECATED: // 16384 //
			$typestr = 'E_USER_DEPRECATED'; break;
	}

	$message =
		'<b>' . $typestr .
		': </b>' . $errstr .
		' in <b>' . $errfile .
		'</b> on line <b>' . $errline .
		'</b><br/>';

	if(($errno & E_FATAL) && ENV === 'production'){
		header('Location: 500.html');
		header('Status: 500 Internal Server Error');
	}

	if(!($errno & ERROR_REPORTING))
		return;

	if(DISPLAY_ERRORS)
		printf('%s', $message);

	//Logging error on php file error log...
	if(LOG_ERRORS)
		error_log(strip_tags($message), 0);
}

tip dépendances : ajouter un script resources/install_apt.sh sur ce modèle
à propos de dépendances, bien penser que les box (smart & pro & peut être autre…) sont sous Debian Stretch + PHP7.0 et le comportement de PHP n’est pas identique en PHP7.3 (version de Buster)

tip erreur étrange javascript du style undefined element of #
il faut vérifier le code source HTML généré à un validateur HTML ça permet souvent de repérer un tag ouvert non fermé, ou un tag fermé en trop, ou encore des doublons d’ID sur la page.

gestion des dépendances : 2 méthodes d’instance à ajouter dans la classe principale eqLogic.

2 J'aimes

Bah ça en fait de la doc déjà… c’est cool tu pourras écrire une doc digne de ce nom à l’avenir du coup :smiley:

Le tuto de @ZygOm4t1k est dans les documentations jeedom déjà:

Pour info démon et cron c’est déjà dans la doc du plugin template

Bonjour,
Je me suis lancé également dans la création d’un plugin et j’avoue également que j’ai trouvé la documentation de l’API Jeedom un peu light, très peu explication en effet sur les fonctions et leur utilité.
Il faut passer par l’expérimentation :wink:
Ou également piocher des informations dans les plugins existant pour comprendre.
Je ne crois pas avoir vu non plus de section dédié aux développeurs de plugin pour pour s’entraider ?
Existe t-il un autre canal ?

1 J'aime

Salut,

Il faut s’inscrire en tant que développeurs pour accéder au salon du forum dédié aux développeurs.

https://www.jeedom.com/site/fr/dev.html

Par contre y’en a déjà 450 dont une énorme partie qui ne fait aucun développement il était plutôt question de faire du ménage que d’en ajouter récemment après je n’ai pas toutes les infos.

Salvialf, j’ai fait la démarche et j’ai reçu la validation.
Côté market j’ai bien les « CGU » développeur acceptés.
Je me suis créér un compte compte GIT pour les futurs dépots de mes sources, et le l’ai lié au forum d’ailleurs.
Pour autant je ne vois pas en effet de section dev. dans ce forum. Peut-être je vais regarder si cela ne viens pas du fait d’utilisé peut-être une adresse différente.
J’image en effet que beaucoup de création de compte pour peu de publication.

Bonjour,
Je pense qu’il faut le temps que l’équipe valide.
Ensuite n’hésitez pas à poster dans la section, je la surveille et généralement je réponds assez vite (quand je sais).

Question doc je comprend, c’est galère au départ et il y a vraiment beaucoup de possibilités.
Je disais récemment à @Salvialf que je comptais documenter tout ce que j’avais découvert et non documenté le problème est qu’il fait trop beau pour l’instant et je travaille au jardin :sunglasses:.
Mais sinon une des meilleurs doc c’est le code du core directement : à avoir à portée de clavier !

1 J'aime

Merci pour l’info, je l’ignorais! je viens de faire la demande d’inscription :slight_smile:

Pour le ménage… C’est plutôt dommage, c’est à l’avantage de jeedom d’avoir une grosse communauté, même si une majorité n’est plus active maintenant ça peut changer.

450 devs ça fait beaucoup quand même je trouve :grinning: Le truc c’est qu’avec l’ancien forum il fallait s’inscrire comme dev ou beta-testeur pour avoir accès à community c’est pour ça qu’il y en a autant

Bonjour,
Je n’ai eu aucun retour suite à mon inscription, pour le dev, même pas un accusé réception, ça marche encore ce process ?
En attendant je continue ici :slight_smile: y-a-t-il un fond pour l’icône, avec les bordures et la couleur de fond ad-hoc?
La seule image que j’ai trouvé est ici mais avec toutes les mesures autour c’est pas très pratique:
https://jeedom.github.io/documentation/dev/fr_FR/Icone_de_plugin

Bonjour,

non il n’y a pas de base fournie, mais tu peux récupérer n’importe quel icône de plugin dans son dossier plugin_info, voilà celle de calendar si tu veux :

calendar_icon

a+

Salut,
moi j’utilise un svg que je transforme ensuite en png, je trouve ca plus simple pour l’édition (je suis dev, pas graphiste :wink: ):

voila la base que j’utilise:

<svg version="1.1"
    baseProfile="full"
    width="309" height="348"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">
    <rect width="309" height="309" rx="60" ry="60" style="fill:rgb(rrrrr,gggg,bbbbb)" />
    <image  x="50%" y="44%"  transform="translate(-100,-100)" width="200" height="200" xlink:href="data:image/svg+xml;base64,"/>
</svg>

à remplacer:

  • fill:rgb(rrrrr,gggg,bbbbb) par la couleur de fond que tu veux
  • et à placer le logo dans le tag image en dessous: xlink:href="data:image/svg+xml;base64,"
    tu peux y mettre ce que tu veux, svg, svg base64, png base 64 …
    et tu peux jouer sur la largeur et la hauteur de l’icone bien sur

En cette période particulière les délais sont allongés. Il va falloir patienter un peu plus qu’une semaine.

Merci pour l’aide, j’ai fait mon icône :slight_smile:

Maintenant, question déboggage et / ou log ? J’ai une erreur ajax, la requête rend une erreur 500 et je ne trouve rien dans les logs… J’ai pourtant tout mis en debug. Le contexte: je veux ouvrir une modale

		$('#md_modal').dialog({title: "Synchroniser les objets LG"});
		$('#md_modal').load('index.php?v=d&plugin=lgthinq&modal=include').dialog('open');

J’ai donc mis le template dans /desktop/modal/include.php, et au début ça marchait bien (enfin, pour afficher genre hello world)
Maintenant, dans la console js j’ai une erreur 500
image
J’ai un début de log dans le log de mon module, puis plus rien, ni rien non plus dans http.error (c’est pourtant la qu’atterrissent toutes les erreurs php & apache)

J’ai ajouté un try { … } catch( \Throwable $e) { echo $e; } j’espérais afficher plus de log ou une erreur autre que 500 mais je n’arrive à rien. Est-ce qu’il y a une gestion d’erreur ou une technique de debug spécifique dans jeedom ?

il semblerait que j’ai une erreur sur la création d’un objet, lorsque je fais:
$eqLogic->save();
pourtant c’est la bonne syntaxe (?) aucun message d’erreur aucun log après ceci, le dernier log que j’ai mis juste avant (c’est l’objet serializé) :

[2020-05-07 00:30:43][DEBUG] : before saving lgthinq: O:7:"lgthinq":22:
{s:5:"*id";N;s:7:"*name";
s:50:"33d29e50-7196-11e7-a90d-b4e62a6453b5 1REB1GLPX1___";
s:12:"*logicalId";s:36:"33d29e50-7196-11e7-a90d-b4e62a6453b5";
s:15:"*generic_type";N;
s:12:"*object_id";N;s:14:"*eqType_name";s:7:"lgthinq";s:12:"*eqReal_id";N;
s:12:"*isVisible";i:1;s:11:"*isEnable";i:1;s:16:"*configuration";
a:2:{s:12:"product_name";s:15:"Réfrigérateur";s:12:"product_type";s:12:"REFRIGERATOR";}
s:10:"*timeout";i:0;s:11:"*category";N;s:10:"*display";N;
s:8:"*order";i:9999;s:10:"*comment";N;s:7:"*tags";N;
s:9:"*_debug";b:0;s:10:"*_object";N;s:21:"*_needRefreshWidget";b:1;
s:18:"*_timeoutUpdated";b:0;s:18:"*_batteryUpdated";b:0;s:11:"*_changed";b:1;
}

Fait un commit dans une nouvelle branche si tu veux de l’aide pcq là, personne ne peut débug si on ne voit que ca:

rien dans http.error?

Non rien de rien, je vais ajouter des lignes de debug dans la classe eqLogic je ne vois pas d’autre solution… Mon code ressemble à ça:

/**
 * create the new object
 */
public static function CreateEqLogic($_config){
LgLog::debug('new lgthinq');
		$eqLogic = new lgthinq();
		$eqLogic->setEqType_name('lgthinq');
		$eqLogic->setIsEnable(1);
		$eqLogic->setLogicalId($_config['id']);
		if (isset($_config['model']) && trim($_config['model']) != '') {
				$eqLogic->setName($eqLogic->getLogicalId() . ' ' . $_config['model']);
		} else {
				$eqLogic->setName('Device ' . $eqLogic->getLogicalId());
		}
		$eqLogic->setConfiguration('product_name', $_config['name']);
		$eqLogic->setConfiguration('product_type', $_config['type']);
		$eqLogic->setIsVisible(1);
LgLog::debug('before saving lgthinq: ' . serialize($eqLogic));
		$eqLogic->save();
		//$eqLogic = openzwave::byId($eqLogic->getId());
		// TODO
		//$eqLogic->createCommand(false, $_config);
LgLog::debug('return lgthinq');
		return $eqLogic;
}

heu… mais pourquoi tu fais ca ?

Ya les fonctions core pour la création de l’eqLogic, toi tu dois gérer l’enregistrement avec toutes les fonctions pré-définies dans le plugin template.

Notamment
// Méthode appelée après la création de votre objet
public function postInsert() {}
// fct appelée par Jeedom aprés l’enregistrement de la configuration
public function postSave() {}

C’est là dedans qu’il faut travailler

Non, pas du tout, c’est tout à fait adapté de faire comme cela quand tu as un plugin qui créé lui-même les équipements parce qu’il les découvre.

1 J'aime

Le problème doit être quelque part, mais faudrait voir le code en entier… et pas dans un forum. je ne sais pas debug pas dans un forum

oui, c’est bien ça : le plugin découvre tous les objets et les inclus à la configuration, il n’y aura pas d’inclusion manuelle sous jeedom :slight_smile:
Pour l’instant j’ai fait une nouvelle branche « dev » du projet en cours:

Je vais essayer d’ajouter des mocks du serveur python parce que en l’état, si tu n’a pas un appareil LG connecté tu ne pourra pas tester.