Eedomus : Trucs et Astuces de Programmation

A Destination des programmeurs (Script et Plugin)

Si vous avez un problème de programmation quelconque, venez ici à tout hasard, ou venez simplement fouiner, pour vous donner des idées...
(Je complèterai cette page au fur et à mesure de mon temps libre)

Table des matières

Mettre le pied à l'étrier
     Script "affichage de l'heure"
     Plugin "affichage de l'heure"
     Améliorer un Script
     Améliorer un Plugin
     Utilisation d'une variable VAR
     Extraction de données HTML
     Mise en forme de texte
Edition
PHP
     Références
     Upload sur Eedomus
     Utilisation de bac à sable
          Les fonctions propres à l'Eedomus
          Emulation des fonctions Eedomus
          Les fonctions autorisées
          La commande echo
          Le saut de ligne : \n
     Structure
          balises php
          variables
          fin d'instruction et commentaires
          exceptions au point virgule
          autres particularités
     Regex
          Gourmandise
          Option dotAll
     Emuler la fonction ucfirst
     Supprimer des caractères intercalés
     Date/Heure
     Extraire le nom court d'un périphérique
     Supprimer tous les commentaires balisés d'un HTML
     Utiliser un cache pour limiter le nombre de requêtes
     Mémorisation de mot de passe lors de l’installation d’un plugin
     Convertir les accents
     Supprimer les accents dans un texte
     Temps écoulé depuis
     Découper un texte en plusieurs parties et avec plusieurs séparateurs
     Extraire des données HTML vers un XML
Json
     C'est quoi ?
     Références
     Structure
     Variables
     Limitations
          10 choix max
          choix conditionnels
          autres choix conditionnels
     prédéfinir un choix de liste
     Contrôle
     Divers
Markdown
     Références
     Editeur en ligne
     Codage
     Aller plus loin
          mise en couleur
          les tableaux
          lien interne
          lien vers une autre fenêtre
     Comment vérifier le résultat
Divers
     Parent/Enfants, groupement de périphériques
     Je ne peux pas supprimer un périphérique en erreur
     Je ne vois pas mon périphérique
     Les paramètres Z-Wave ne sont pas renseignés
     Le périphérique ne répond pas aux commandes Z-Wave
     Orthodontie
     Interrupteur défaillant
     Contacteur Jour/Nuit
     Contact Sec
     kVA et kW
Autres Ressources
     Plugin Mobile Alerts
     Plugin Point de Rosée


Mettre le pied à l'étrier

Avant même de commencer, comme cette page est surtout destinée à ceux qui possèdent un mini-minimum de connaissances à propos des langages PHP, Json et Markdown... ce strict minimum peut être acquis avec des exemples simples, voir très simples, voir ultra simples, qui vous seront décrit pas à pas, histoire de "mettre le pied à l'étrier". Etudiez les dans l'ordre puisque le suivant se réfère presque toujours au précédent.
Les codes complets des exercices se trouvent ici.

Script "affichage de l'heure"

"Mon Premier Script"   (2 lignes de code détaillées dans tous les coins)

Plugin "affichage de l'heure"

"Mon Premier Plugin"   (basé sur le script précédent)

Améliorer un Script

Modification d'un script   (Mix du premier Script avec le Script "Horloge")

Améliorer un Plugin

Modification d'un plugin   (modification d'un Json en fonction du script "Horloge" modifié comme précédemment)

Utilisation d'une variable VAR / émulation GetArg

Utilisation d'une variable VAR   (Utilisation d'une variable VAR et émulation de la fonction GetArg pour Bac à Sable)

Extraction de données HTML

Extraction de données HTML   (Bulletin météo simplifié en 6 lignes de code !)

Mise en forme de texte

Mise en forme de texte   (Pour condenser un peu notre bulletin et apprendre quelques nouvelles fonctions)


La série des didacticiels "pied à l'étrier" s'arrête ici.


NB: pour aller plus loin, voir dans la rubrique PHP sur l'extraction de données.


Edition

Utilisez un éditeur, par exemple notepad++ qui permet de travailler du texte, de le surligner, le colorer automatiquement dans toutes sortes de langages, php, html, json, markdown compris ! Attention, cela ne remplace pas les éditeurs spécifiques (pas de wysiwyg): ces derniers sont une aide à l'écriture, notepad++ plus universel permet de mettre en forme le code.


PHP

Références

Documentation : Eedomus, Merguez07

Upload sur Eedomus

Vous pouvez vous référez à la page Eedomus concernée, ou à ce didacticiel si vous n'êtes pas physiquement présent à côté de votre box

Utilisation de bac à sable

Ce Bac à sable pour le PHP vous permettra de tester un bout de code ou votre script tout entier, mais il faudra tenir compte des limitations:

Les fonctions propres à l'Eedomus

getArg  httpQuery  saveVariable  loadVariable  deleteVariable  jsonToXML  xpath  setValue  setMacro  getPeriphList  setBattery  getPeriphValueList  getValue  getRooms  sdk_json_decode  sdk_header  netSend  ftpUpload  sendUPNP  sdk_get_input  sdk_get_ip_from_ip_or_mac

Emulation des fonctions Eedomus

Les fonctions Eedomus doivent être remplacées, dans le bac à sable par leur résultat ou par une variable définie en début de script !
MAIS, vous pouvez utiliser des fonctions d'émulation, qui comprendront les variables requises, à mettre en début de script lors d'un test dans le bac à sable; elles sont disponibles ICI. L'avantage est, non seulement de ne pas à avoir à modifier votre script pour les fonctions émulées, mais aussi lors de tests des différentes valeurs de variables de les avoir sous les yeux directement rassemblées en début de code.

Les fonctions autorisées

De plus, il y a une autre limitation quand vous utilisez une fonction PHP, il faut vérifier qu'elle soit prise en compte par l'Eedomus.
Les fonctions suivantes sont autorisées:
 abs  acos  addslashes  array  array_key_exists  array_map  array_merge  array_reverse  array_sum  asin  atan  atan2  base64_encode  bcpow  bin2hex  bin2hex  bindec  ceil  chr  chunk_split  cos  count  current  date  decbin  dechex  define  deg2rad  die  echo  elseif  empty  error_reporting  exp  explode  fclose  fgets  floor  fmod  for  foreach  fsockopen  fwrite  getprotobyname  gettype  hash  hash_hmac  header  hex2bin  hexdec  html_entity_decode  htmlspecialchars  http_build_query  if  implode  in_array  intval  is_float  is_int  is_numeric  is_string  isset  key  list  log  max  mcrypt_decrypt  mcrypt_encrypt  md5  microtime  min  mktime  next  ob_end_clean  ob_start  ord  pack  parse_str  pi  pow  preg_match  preg_match_all  preg_replace  printf  rad2deg  rand  rawurlencode  round  session_start  sha1  sin  sizeof  sleep  socket_bind  socket_close  socket_connect  socket_create  socket_get_status  socket_last_error  socket_read  socket_recvfrom  socket_sendto  socket_set_option  socket_strerror  socket_write  sprintf  sqrt  sscanf  str_pad  str_repeat  str_replace  str_split  stripslashes  strlen  strpos  strrchr  strtolower  strtotime  strtoupper  strtr  strval  substr  switch  tan  time  trim  uniqid  unpack  urlencode  usleep  utf8_decode  utf8_encode  var_dump  vsprintf  while
Et sur eedomus+ uniquement:
 socket_bind  socket_close  socket_create  socket_connect  socket_last_error  socket_recvfrom  socket_sendto  socket_set_option  socket_strerror  socket_write  getprotobyname

La commande echo

Ce qui sera renvoyé par votre script le sera par une commande echo, la même qui dans le bac à sable vous permettra d'afficher le résultat de votre code, mais vous pouvez néanmoins vérifier des variables en cours de code de la même manière en insérant une commande echo ainsi que sa description plus un retour de ligne afin d'augmenter la lisibilité :
echo "variable $machin : "; // simple texte
echo $machin; // l'affichage de votre variable
echo "\n"; // le retour ligne (voir plus loin)
ce qui donnera en rattachant tout ceci :
echo "variable $machin : " . $machin . "\n";
NB : pour les tableaux, ne pas utiliser echo ! l'affichage d'un tableau, avec structure complète est var_dump() et simplifiée print_r()
$JourSemaine = array("Monday" => "Lundi", "Tuesday" => "Mardi", "Wednesday" => "Mercredi", "Thursday" => "Jeudi", "Friday" => "Vendredi", "Saturday" => "Samedi", "Sunday" => "Dimanche") ;
print_r($JourSemaine) ;
echo "\n"; // retour ligne
var_dump ($JourSemaine) ;

Le saut de ligne : \n

Le saut de ligne est le caractère n mais pour qu'il ne soit pas pris pour un n, on l'échappe avec un anti slash, donc dans un texte on écrira \n

echo "toto";
echo "\n"; // je saute à la ligne
echo "est un vilain garçon";
On peut inclure le retour ligne dans un texte, puisque sa syntaxe est un texte !
echo "toto\nest un vilain garçon";

Structure

Il n'est pas dans l'objet de cette page de faire un cours sur le PHP, référez vous par exemple au manuel du PHP, en français, qui vous permettra en outre de faire des recherches sur une instruction en particulier (syntaxe, exemples), pour les spécificités en ce qui concerne les plugins, voir les liens de documentations en tête de chapître. Ici, nous allons juste voir quelques éléments de structure qui vous permettront immédiatement de tester le bac à sable.

balises php

Un code PHP sera reconnu par sa balise de début <?php qui doit en principe se fermer à la fin ?> elles apparaitront en rouge dans notepad++ qui comprendra donc immédiatement la nature du code et le présentera visuellement en conséquence.
<?php
code
<?php
(vous pouvez déjà tester l'affichage d'un tableau avec le code précédent)

variables

Toutes les variables commencent par un signe dollar $, on ne les déclare pas préalablement en indiquant leur type et/ou leur taille comme avec un langage habituel de programmation. On ne peut pas les utiliser si elles n'ont pas été préalablement définies, donc initialisées.
$variable_numérique=123456;
$variable_texte = "ceci est un texte";
$variable_tableau    = array("Marcel", "Robert", "Jeanne", "Henri");
if ($toto == 3) // provoquera un message d'erreur, $toto n'a pas été défini

fin d'instruction et commentaires

Parceque ça fait super texte informatique et plus sérieusement que ça permet de s'étaler sur plusieurs lignes (?), ce n'est pas le caractère chariot qui sert à signer une instruction, mais le point virgule.
Vous pouvez insérer des commentaires à tout moment avec une double barre, mais pas dans les instructions évidemment ! Il est essentiel de les employer de manière abondante dans votre développement pour vous y retrouver, quitte à en supprimer la plupart une fois votre travail terminé :
<?php
instruction;
instruction; // gestion de VAR1
// et maintenant je dois faire telle chose ici
instruction; // mise en forme du XML

<?php

exceptions au point virgule

Les itérations et les comparaisons ont des paramètres entre accolade, elles n'ont donc pas de terminaison de type point virgule, mais à l'intérieur des accolades, les instructions sont toujours soumises aux mêmes règles:
<?php
foreach ()
{
 instructions;
}

if () {}then{}else{} // sur une ou plusieurs lignes
<?php

autres particularités

les opérateurs par rapport à d'autres langages sont parfois déroutants :
l'égalité, c'est == et non = qui représente l'attribution, on a même === (voir liste ici)
De même la concaténation qui s'effectue par un point :
"ceci est " . "concaténé" donnera "ceci est concaténé" (n'oubliez pas l'espace)

Regex

Regex ou "expression régulière": L'horreur du PHP qui le rend incompréhensible à la lecture à force de concision, pourtant c'est très puissant et c'est heureusement plus facile à écrire qu'à lire, il s'agit de ce genre de chose que vous pouvez trouver en essayant de comprendre le code d'un script:
"#(((https?|ftp)://(w{3}\.)?)(?<!www)(\w+-?)*\.([a-z]{2,4}))#"
voir ici un excellent didacticiel pour vous apprendre à parler le Chinois
Principe : on utilise des expressions formatées pour manipuler des chaines de caractère dans des expressions dites regex pour des instructions ... regex qui commencent par preg_ exemple:
preg_replace(regex,résultat,chaîne)
le regex est une chaine de caractères ("regex") identifiés par une balise presque quelconque : on utilise souvent # ou / et on va donner un seul exemple, je vous renvoi au didacticiel très bien fait pour en savoir plus.
On veut remplacer un éventuel chiffre qui commence une chaîne par un tiret bas _ (nécessaire pour un XML)
Ca va vous sembler simple, mais quand on commence à voir tous les cas, ça devient franchement illisible, mais il faut vous y faire de cet héritage de PERL...

$result = preg_replace("/^[0-9]/","_",$result);
Principe : on cherche un chiffre, on indique donc une classe de [0-9] et on demande à ne le sélectionner que s'il est en première position avec un chapeau ^ devant: le regex devient donc ^[0-9] et il s'écrit "/^[0-9]/" (ou "#^[0-9]#" etc.)

Gourmandise

Une méthode habituelle d'utilisation des Regex est d'identifier des groupes de code reconnaissable avant et après une partie à capturer, on a par exemple vu ce code dans le didacticiel "extraction !":
preg_match_all('#<div class="mod-body">\s*<div class="article-row">\s*<h2>.*</h2>\s*<p class="p-style-2" style="clear: both;"><br/><br/>(.*)<br/><br/><br/>#',$url,$matches);
Il ya un piège, c'est que l'identification de la chaîne est dite "gourmande", c'est à dire que tous les caractères seront recherchés jusqu'à une éventuelle autre occurence de la chaîne de fin d'encadrement ! C'est pour cela que dans l'astuce "Supprimer tous les commentaires balisés d'un HTML" dans les caractères de recherche à fin d'identification des commentaires situés entre les balises, on a rajouté un ? dont l'utilité est de justement supprimer la "gourmandise" de l'instruction, qui est le mode par défaut !
Dans l'exemple ci-dessus il sera bon de faire de même, ce qui nous permettra de raccourcir le code et même de le rendre correct, y compris si le nombre de retours ligne change (ce qui arrive parfois), ici, la séquence <br/> est répétée 2 fois avant le texte cherché et 3 fois ensuite, nous pouvons donc condenser cela en groupe, défini par une mise entre parenthèse, répété 1 à n fois, ce qui se réalise par le caractère + cela nous donne :
preg_match_all('#<div class="mod-body">\s*<div class="article-row">\s*<h2>.*</h2>\s*<p class="p-style-2" style="clear: both;">(<br/>)+(.*?)(<br/>)+#',$url,$matches);
Cette écriture condensée, va permettre n'importe quelle variation dans le nombre de retour ligne, et n'est rendu possible que par le caractère non gourmand de la recherche, en effet, si nous avions gardé le code .* la recherche se serait étendue jusqu'à la fin du code, avec donc la capture de ce qui suit le texte recherché (tout comme avec la suppression de commentaires, la "gourmandise" aurait sélectionné tout ce qui se trouve entre la première balise d'ouverture de commentaire et la dernière !

Option dotAll

le point remplace n'importe quel caractère mais pas les retours lignes ! pour les lui faire accepter, il suffira d'indiquer cette option, s valable pour tout le Regex, et donc à positionner juste après le caractère de fermeture, par exemple comme ceci : "#Regex#s" on trouvera un exemple dans le tip "supprimer les commentaires"

le s va servir aussi au sein d'une chaine, donc avec le caractère d'échappement \ à indiquer un "blanc", en indiquant une occurence variable avec le caractère étoile, on va pouvoir "passer" autant d'espaces, de tabulation et de lignes que nécessaire qui pourraient se trouver dans un code, on écrira donc \s* , exemple :

<br>
        <b>mon texte</b>

le Regex pourra commencer par "#<br>\s*<b>(.*) ...

On en a une illustration dans le didacticiel sur l'extraction.

Emuler la fonction ucfirst

La fonction ucfirst ne fait pas partie de la panoplie des fonctions autorisées, voici comment mettre la première lettre d'une variable en majuscule:
$variable = strtoupper($variable[0]).substr($variable, 1);
Explication : nous mettons la première lettre [0] de la variable en majuscule que nous concaténons avec (substr) toute (on ne donne pas de longueur) la variable à partir de la 2ème lettre (,1)
Notez que la première place est 0, donc la deuxième est 1.

Supprimer des caractères intercalés

L'exemple typique est celui décrit dans l'aide sur la mise en forme de texte (dans le script exemple en fin de document):
Si nous avons une rose des vents de type N, N-N-E, N-E, E-N-E ... à convertir en N, NNE, NE, ENE ...
première remarque : cela ne concerne pas les 4 points cardinaux : il ya au moins 2 caractères
deuxième remarque : le troisième caractère ne peut être que O ou E
Il faut donc :
Cela donne le Regex :
#[NSEO]-[NSEO]-?[EO]?#
ça ne nous permet pas d'extraire uniquement les lettres, on le fera avec les parenthèses capturantes et une petite nouveauté : si elles sont indexées dans un tableau d'extraction (comme avec preg_match_all) elles le sont aussi avec les variables $1,$2 ... on fera donc, avec une instruction preg_replace :
$var = preg_replace ("#([NSEO])-([NSEO])-?([EO])?#","$1$2$3",$var);
qui nous sortira nos 2 ou 3 lettres de rose des vents sans le tiret intermédiaire
Notez qu'on évite ainsi de lister tous les cas (12) de directions combinées, ce qui aurait pu être une autre solution. Ici, l'important est de comprendre comment sélectionner des mots dans un texte et surtout réfléchir à la solution la plus simple pour obtenir le résultat désiré.

Date/Heure

Au lieu de réinventer l'eau chaude à base de sous programme, vous avez une instruction PHP qui vous sort absolument tous les formats voulus : date()
exemple pour un formatage de type hh:mm:ss
$heure = date('H') . ":" . date('i'). ":" . date('s');
Toutes les références sont ICI

Extraire le nom court d'un périphérique

Si on peut, à partir de l'ID d'un périphérique, extraire le nom long, c'est à dire, comportant la pièce dans laquelle il se trouve, par exemple:
Température Congélateur Cuisine
On n'a pas de variable short_name permettant d'extraire dans cet exemple Température Congélateur
exemple d'une extraction à partir du périphérique appelant:
$periph_id= getArg('eedomus_controller_module_id'); // on récupère l'ID de l'appelant
$periph_value= getValue($periph_id, false); // on charge le tableau de ses valeurs
$nom_appel= $periph_value['full_name']; // on en extrait le nom
Il va falloir passer, en plus des codes précédents, par une extraction des pièces ! On rajoutera donc:
$rooms= getRooms($periph_id); // on extrait la liste des pièces
foreach ($rooms as $room) // on va les passer en revue
{
$room_name = $room['room_name']; // pour chaque, on en extrait le nom
$nom_appel = preg_replace("/$room_name$/","",$nom_appel); //on le supprime s'il se trouve à la fin du nom long
}

$nom_appel = trim($nom_appel);
// on enlève l'espace de fin
Notez que l'espace n'est supprimé qu'une fois le foreach terminé, puisqu'il permet de ne PAS réitérer le Regex, puisqu'une fois supprimé, le nom de la pièce ne se terminant pas avec un espace, elle ne peut être supprimée une deuxième fois, par exemple, soit une sonde de température que vous avez mis dans la pièce salon et dans la pièce températures, pour la reconnaitre dans cette dernière pièce, vous l'avez appelé température salon, son nom long dans la pièce salon devient donc:
température salon salon
le nom court est bien entendu température salon et pas température ! or, à la première itération, $room_name se termine par un espace puisqu'on ne lui a enlevé que le mot "salon"... le garder provisoirement permet de ne pas l'enlever une deuxième fois.

Supprimer tous les commentaires balisés d'un HTML

commentaires de type <!-- mon commentaire -->
Principe : on utilise une instruction regex qui va remplacer toutes les occurences trouvées par rien, avec un regex qui commence et se termine par les balises, avec, entre, le point pour n'importe quel caractère, l'étoile parcequ'il y 'en a autant que l'on veut, le point d'interrogation parceque ce n'est pas 'gourmand': voir cette notion, ici , la balise dotall s détermine que le regex interprete aussi les sauts de ligne, donc le commentaire peut être placé sur plusieurs lignes, il sera aussi pris en compte et ici, supprimé !
$result = preg_replace("/<!--.*?-->/s","",$result);

Utiliser un cache pour limiter le nombre de requêtes

Au lieu d'appeler autant de fois que de capteurs la même URL qui renverra le même XML contenant toutes les données nécessaires à la mise à jour desdits capteurs, il est préférable de ne le faire qu'une fois par intervalle de relevé, puis de faire appel au contenu du cache entre ces appels.
Ceci est fort bien décrit dans l'aide de merguez07 (voir Documentation)
E - Astuce de programmation
    1 - Création d’un cache pour limiter le nombre de requêtes      76

Mémorisation de mot de passe lors de l’installation d’un plugin

Lorsque l’on créé un plugin qui nécessite, pour fonctionner, des identifiants que l’on ne souhaitent pas mettre en évidence :
cf aide de merguez07 (voir Documentation)
E - Astuce de programmation
    2 - Mémorisation de mot de passe lors de l’installation d’un plugin      77

Convertir les accents

Ne vous arrachez plus les cheveux parceque votre texte comporte des caractères bizarres quand vous l'affichez dans l'Eedomus ! parfois ça ne se voit que temporairement dans l'appli smartphone... dans tous les cas, le réflexe, c'est :
$texte=utf8_decode($texte);

Supprimer les accents dans un texte

cf aide de merguez07 (voir Documentation)
F - Fonctions php perso intéressantes
    1 - Supprimer les accents dans un texte      79

Temps écoulé depuis

cf aide de merguez07 (voir Documentation)
F - Fonctions php perso intéressantes
    2 - Temps écoulé depuis      81

Découper un texte en plusieurs parties et avec plusieurs séparateurs

cf aide de merguez07 (voir Documentation)
F - Fonctions php perso intéressantes
    3 - découper un texte en plusieurs parties et avec plusieurs séparateurs      81

Extraire des données HTML vers un XML

Il s'agit ici d'un didacticiel concernant le B A BA de l'extraction de données multiples qui représente la quasi totalité des scripts Eedomus. Les prérequis sont au moins d'avoir digéré les petites aides "pied à l'étrier" et d'avoir abondamment utilisé le bac à sable et les fonctions d'émulation afin de suivre chaque étape en la mettant en relation avec les résultats obtenus. Un exemple "virtuel" est donné qui pose les principes de base de l'exercice.
Le didacticiel s'appelle Extraction !


JSON

C'est quoi ?

Un language de description, issu du javascript, mais ici extrèmement limité pour la création de plugin : un plugin, qui fera parti du store, est s'implement un script auquel on a ajouté un dossier d'icônes, une documentation et un utilitaire d'installation: ce dernier est le json.
Il comprend 3 parties : Le conditionnel est extremement limité, il se contente de cases à cocher ou d'une liste sous forme d'un tableau a deux dimensions.

Références

Documentation : Eedomus, Merguez07

Structure

on a donc la structure suivante pour un plugin :
{
couples de la section description (,)
[ {paramètre1},{paramètre2}...],
[ {script} ],
[ {device1},{device2}...]
}
les {devices} ont eux même une description, un {tableau de paramètres} dans lequel on a un éventuel [tableau de{valeurs}]
On notera donc que tous les couples sont entre accolades (objet), et que les tableaux n'existent donc que pour les objets parametres, script, device et à l'intérieur de ceux ci, une éventuelle liste de valeurs.

Variables

Les seules variables admises sont les valeurs des noms de paramètre, dont l'identification sera toujours de la forme:
plugin.parameters.nom_du_paramètre
Aucune opération, ou réattribution de valeur, n'est possible dans le code, seule la valeur par défaut ou celle entrée par l'utilisateur est prise en compte. Ce ne sont donc pas à proprement parler des variables mais des identifications de la valeur d'un paramètre.

Limitations

10 choix max

Les listes destinés à créer un capteur sont réduites à 10 valeurs puisque la commande "create" qui va valider ou pas la création du Capteur ne supporte que des comparaisons avec des chiffres (0 à 9), tout autre valeur, y compris une opération, validera le create inconditionnellement. Une liste des capteurs, dont une commande permet de construire la liste avec des filtres, n'est pas limitée, mais ne peuvent donc pas servir dans un create, puiqu'ils sont identifiés par leur ID (pour l'attribuer en parent par exemple).
Pour outrepasser ce nombre, vous devez donc créer une autre liste, et leur inclure un choix nul, il ne reste alors qu'un maximum de 9 capteurs par liste, mais vous pouvez les regrouper par genre. Liste 1 : Choix nul, capteur1, capteur2... Liste 2 : Choix nul, capteur10, capteur11...

choix conditionnels

Les seuls choix conditionnels à notre disposition sont sur la commande create et ne concerne:
une case à cocher (dans ce cas on interroge la variable de coche device.parameters.nom_du_coche qui sera vraie (create) si la case est cochée.
une liste, dont les éléments (description) ne peuvent être identifiés (valeur) qu'avec un chiffre de 0 à 9 : on, ne peut donc pas réaliser de create avec une liste des capteurs dont l'identification est leur ID.

autres choix conditionnels

On peut réaliser d'autres choix conditionnels de la même manière qu'on a étendu la limite de 10 capteurs: en indiquant un choix nul pour invalider une liste, on compte bien entendu (pas de protection possible puisque cette page de création json n'est pas interactive/dynamique) sur l'utilisateur pour ne pas faire de choix multiples ou de choix incohérents en ce cas, il y aura création de capteurs non désirés ou inversement de capteurs non créés : on fera bien de mettre des descriptifs adaptés devant les choix proposés. Cela ira mieux avec un exemple: On veut, sur un capteur en particulier, créer plusieurs sous capteurs, dont certains seraient disponibles en plusieurs versions ! ça semble impossible ? eh non :
Liste1 : 1-Capteur1, 2-Capteur2, 3-Capteur3...
liste2 : 0-Autres Capteurs, 1-Version1, 2-Version2...

et dans la liste des devices :
.../...
create liste1 == 1
create liste1 == 2
(ou pas)
create liste1 == 3
.../...
PAS DE create liste2 == 0 (puisque choix nul)
create liste2 == 1
create liste2 == 2

Il faudra bien entendu mettre des "paramètres descriptifs" pour anoter notre page :
Choisissez votre Capteur (liste1)
Choix Capteur2 seulement (liste2)
et par défaut, la liste2 est initialisée à 0 et afficherait ici "Autres Capteurs"
L'utilisateur peut donc créer dans cet exemple un Capteur 1, 2 (ou pas) ou 3 tout seul OU un Capteur 2a ou 2b tout seul OU un Capteur2 (ou pas) ET un Capteur 2a ou 2b ... évidemment si certains choix sont illogiques, commenter en ce sens.

prédéfinir un choix de liste

Ce n'est pas documenté, mais il est tout à fait possible de définir un choix par défaut dans un combobox (liste), il faut évidemment donner le choix "valeur" et pas le descriptif !
"default_value": "1"

Contrôle

Vous pourrez contrôler la validité de votre JSON, y compris sous forme de table, mais la seule solution pour le tester est de créer un plugin qui apparaîtra en PRIVATE

Divers

Si dans un texte, une apostophe (ou un guillemet) n'est pas échappé par un double antislash \\ vous allez provoquer une erreur (qui ne sera pas reconnue dans les pages de test et pendant l'enregistrement sur l'Eedomus) qui va vous faire un sablier éternel lors de la création !
Cela est simplement du au fait que les 2 balises de texte l'encadrent déjà, pour afficher une apostrophe par exemple, il faut donc écrire par exemple: n\\'oubliez pas !
Solution: : supprimer le plugin du store (en général en PRIVATE), supprimez le script dans le dossier /script, puis dans la fenêtre des périphériques, tout en bas, cliquez sur le fautif, cela provoquera une erreur qui vous donnera la possibilité de le supprimer.


Markdown

C'est le language utilisé pour rédiger les documentations Eedomus, son extension est .md

le Markdown est un nième avatar de la mise en forme de texte, qui, comme le BBCode utilisé dans les forums est sensé simplifier l'écriture d'un code HTML simple: Pour écrire des titres, du gras ou du souligné, c'est plus rapide, mais il faut quand même apprendre les subtilités du langage, aussi simple soit-il ou utiliser un éditeur. Toutes ses limitations sont compensées par le fait... qu'on peut inclure du code HTML

Références

Sur openclassrooms plus accessible que le lien qui apparait dans la fenêtre de publication des plugins, ne serait-ce que parce que c'est écrit en français

Editeur en ligne

Voila le lien de M Editor qui a une barre d'outils, contrairement à ses concurrents qui se contentent d'afficher le résultat de votre code. Notez qu'on n'a à sa disposition que les codes Markdown ! SI vous voulez aller plus loin, si vous désirez une mise en forme qui n'existe pas dans le langage, eh bien... vous utiliserez du code HTML tout simplement ! Mais pour éditer une aide simple, on peut très bien se contenter des marqueurs de base, puisque ceci est fait justement pour ceux qui ne veulent pas apprendre un langage ou se compliquer la vie.

Codage

Attention si vous développez une aide dans une autre langue, je vous déconseille d'UTF8 qui pourra vous donner des caractères bizarres sur les accentués ! préférez l'ANSI (par exemple copier-coller dans le bloc note puis avec un "enregistrez-sous", choisissez le codage). Avec Notepad++, vous choisirez "convertir en ANSI"

Aller plus loin

Si vous voulez insérer du code HTML pour quelque chose de spécifique (par exemple mettre un texte en couleur) et que vous n'êtes pas à l'aise avec le HTML, tapez simplement votre recherche suivi de HTML. Dans l'exemple des couleurs, recherchez : "mettre du texte en couleur HTML" en faisant très attention d'éviter les pages qui vont vous compliquer la vie avec des CSS et autres adeptes de "pourquoi faire simple quand on peut faire compliqué"

mise en couleur

Si la balise <font> a disparue du HTML5, à ma connaissance, elle est toujours comprise par les navigateurs, mais vous pouvez utiliser à la place <p style..> pour un paragraphe ou <span style...> pour des(un) mots isolés. Par exemple...
<font color="#FF0000">mots rouges</font>
<p style="color:red";>pagraphe rouge</p>
<span style="color:red";>mots rouges</span>
<span style="color:#FF9900";>mots orange</span>

les tableaux

Les tableaux Markdown ne fonctionnent pas ! ne les composez pas avec les éditeurs en ligne, la seule solution, qui fonctionne fort bien, est de les rédiger en HTML !
dans ce code, il ya 3 lignes de 2 colonnes, la première ligne 'titre' est en gras (th), pour ajouter une ligne, ajoutez un ensemble (tr /tr), pour ajouter une colonne, ajoutez partout une ligne (td) SI vous voulez des bordures, remplacez <table> par <table border="1">
<table border=1>
 <tr>
   th>Titre</th>
   th>Données</th>
 </tr>
 <tr>
   td>premier</td>
   td>valeur1</td>
 </tr>
 <tr>
   td>deuxième</td>
   td>valeur2</td>
 </tr>
</table>

ce qui donnera :

Titre Données
premier valeur1
deuxième valeur2

lien interne

Il est tout à fait possible en Markdown de pointer sur une ancre, dans ce cas, il suffit de donner un lien vers celle-ci en posant le caractère # devant, exemple:
[Chapitre 4](#chapitre4)
Il faut évidemment définir cette ancre, il suffit d'insérer, avec un nom sans espace, juste avant l'endroit ou l'on veut sauter :
<a id="chapitre4"></a>
Attention à ne pas "déranger" le code Markdown :
On peut poser l'ancre au début d'un texte, la ligne vide juste avant, la fin d'un texte, mais pas avant une définition de titre !
<a id="Ancre"></a>## Titre1 ## >// code perturbé
Or... la fermeture des balises de titre n'est PAS requise en Markdown, il suffit donc de poser votre Ancre après :
## Titre 4 <a id="Ancre"></a>
NB: dans l'éditeur, l'ancre apparait dans ce cas avec l'indication " class="reference-link">, ne vous en souciez pas.

lien vers une autre fenêtre

C'est assez ennuyeux que la syntaxe simplifiée Markdown reste sur la même fenêtre, il faut donc passer par une syntaxe HTML pour ouvrir une autre fenêtre du navigateur, donc au lieu de taper :
[texte](lien)
il faudra faire:
<a href="http://lien" target="_blank">texte du lien</a>
on peut remplacer le texte du lien par une image :
<a href="http://lien" target="_blank"><img src="http://image.jpg"></a>

Comment vérifier le résultat

On pourrait dire simplement : avec l'éditeur wysiwyg ci-dessus, mais ce n'est pas si simple ! on n'aura pas strictement la même apparence qu'avec le lien Eedomus, en outre le début de l'aide est spécifique puisqu'elle montre l'image du plugin ainsi que son nom !
Donc, le mieux, une fois fier de son travail, c'est d'aller directement voir ce que cela donne, et vous pouvez le faire, dès l'enregistrement du plugin, avant même de tester une création : Le lien est dans la description, mais... pas dans toutes les langues, si vous en avez rédigé, et pas non plus avec les ancres si vous en avez posé (vous pouvez dans la fenêtre de création poser des liens sur des parties spécifiques de l'aide)
Voila la syntaxe du plugin en mode privé :
https://secure.eedomus.com/pages/doc.php?type=nomduplugin_PRIVATE&file=readme_fr.md#Ancre


Divers

Parent/Enfants, groupement de périphériques

Mal nommé, donc source de confusion, le principe est de grouper des périphériques pour leur faire partager les mêmes : polling (fréquence de requête), VARs et le nombre d'erreurs ignorées (paramètres expert): chanque changement de l'un se répercute sur tous les autres. Il suffit de rattacher un (des) périphérique(s) à un autre pour constituer un groupe. Notez que cette notion est physiquement déterminée quand il s'agit d'un même périphérique (un module température/humidité, un contacteur avec ses interrupteurs etc.).
Attention: dans la liste des périphériques, ils ne sont alors visibles que sous le "parent".

Je ne peux pas supprimer un périphérique en erreur

Généralement du à un JSON défectueux : voir ICI

Je ne vois pas mon périphérique

Il faut lui attribuer une pièce, attention, l'ancien tag "visible", peut avoir été utilisé dans un ancien plugin non mis à jour, s'il a été mis à "false", il suffit de désattribuer une pièce puis de la réattribuer pour que tout rentre dans l'ordre. Dans le pire des cas, s'il n'est pas visible dans la liste des périphériques, il le sera toujours dans la liste des périphériques "parents", la "manoeuvre" est un peu almbiquée: il faut "rattacher à" (paramètres expert) n'importe quel périphérique à celui que l'on cherche, afin qu'il soit "pointé" dans la liste des périphériques parent/enfants et à ce moment accessible pour lui attribuer une pièce et le rendre visible dans la liste des périphériques; on détachera le périphérique à la fin de l'opération.

Les paramètres Z-Wave ne sont pas renseignés

Cela ne les empêche pas de fonctionner : voir ICI.

Le périphérique ne répond pas aux commandes Z-Wave

Il faut réveiller les périphériques à pile : voir ICI.


Plus de programmation ici, juste quelques astuces concernant la domotique...

Orthodontie

On manque de place dans les boîtiers électriques

Alors, c'est peut être une lapalissade, mais c'est mieux de le dire et encore mieux de le montrer :
Si on fait le chemin des fils proprement, on peut entrer presque 2 modules dans un boitier !
(bon, j'exagère)... la suite ici.

Interrupteur défaillant

Un interrupteur défaillant peut faire croire à un dysfonctionnement... la suite ici.

Contacteur Jour/Nuit

Beaucoup de bêtises sur la sortie compteur jour/nuit C1 C2 : on entend même parler d'une "impulsion" (?)
Alors soyons clair, c'est juste un contact sec, imaginez que C1 et C2 (et c'est parfois indiqué dans certains schémas) soient les bornes d'un interrupteur ! fermé la nuit, ouvert le jour (ne vous emmêlez pas les pinceaux : un contact fermé laisse passer le courant, et non pas ferme dans le sens "éteint").

Contact Sec

Un nom compliqué pour nommer un simple interrupteur, on dit aussi "libre de potentiel", puisqu'effectivement il n'ya pas d'autre courant que celui que vous y injecterez dedans ! un contact sec peut donc s'accuper de courant continu ou alternatif, peu importe ! Ce sera donc utile pour interrompre l'action d'un contacteur jour/nuit en mettant un contact sec sur un des fils C1 ou C2 d'un compteur (par exemple pour commander un chauffe eau en mode normal/vacances en mettant en série un contact sec sur le fil qui arrive du compteur à votre contacteur jour/nuit) ou pour actionner des périphériques à entrée contact sec : attention, certains demandent, eux, une impulsion, voir la doc Eedomus ici.
Attention à la puissance nécessaire si vous fermez un cable d'alimentation: tout contact sec qu'il soit, le circuit laissera passer le courant injecté qui ne peut pas outrepasser les limites de votre module !

kVA et kW

Le courant alternatif n'est pas soumis aux même règles que le courant continu, si vous faites simplement P=UI vous n'obtiendrez que des kVA et non des kW !
Sauf le cas particulier des éléments purement résistifs comme un convecteur, on a toujours kVA > kW
La conversion se fait avec un paramètre parfois indiqué sur votre appareil qui est le facteur de puissance ou cos φ où P = cos φ UI
Plus le cos φ est petit, plus la puissance nécessaire (ou l'intensité nécessaire) doit être importante, même si cela ne change pas la puissance consommée ! par exemple si une installation globale a un cos φ de 0.5, si la puissance consommée est de 10 kW, elle nécessitera 20kW de puissance, si elle consomme 3 A, il faudra lui en fournir 6 ! cela a des conséquences sur :
Dans le premier cas vous devez connaître le cos φ de votre appareil, et en déduire la puissance nécessaire puisque votre module ne vous indiquera que la puissance résistive (cos φ = 1)
Dans le second, il faudra penser souvent à augmenter votre Ampérage et donc votre abonnement puisque malheureusement pour vous, si avant, les compteurs ne s'appuyaient que sur le kW (consommés), les compteurs Linky s'appuient sur les kVA (au niveau de l'abonnement seulement ! cela ne change pas votre consommation qui reste en kW), notez qu'il existe des économiseurs.

quelques exemples:

 Convecteur électrique  1  Four électrique  1
 Cumulus  1  Moteur synchrone  0,98
 Machine à outils  0,95  Réfrigérateur  0,65
 Lave linge  0,65  Moteur asynchrone  0,65
 Climatiseur  0,65  Pompe hydraulique  0,65
 Vitrine réfrigérée  0,65  Pompe à chaleur  0,60
 Panneau photovoltaïque  0,60  Éolienne  0,45

Comment être sur ?

Les exemple donnés ci dessus sont très pessimistes, et vous pouvez, avant achat d'un module, connaître directement la puissance necessaire sans même passer par les notions de cos φ: il vous suffit simplement de connaître le Voltage (sur l'importe quelle prise de votre logement) et l'Intensité max de votre appareil que vous pourrez mesurer avec un multimètre qui fasse ampéremètre (ça ne coûte pas grand chose) et vous multipliez les 2, voila, c'est tout ! (rappelons que le résultat n'est PAS une consommation !)
Evidemment, en l'abscence d'enregistrement, ça demande de rester devant l'appareil en notant l'Intensité MAX mesurée, par exemple pour un lave linge, cylindre tournant et chauffage en route (au début en somme).
Et si vous voulez connaître le cos phi, vous le ferez avec un wattmètre (ou après coup si votre module remonte la consommation) et appliquerez la formule décrite en début de chapitre.
Addentum: Certains Wattmètres donnent directement le facteur de puissance, comme le Chacon.

Autres Ressources

     Plugin Mobile Alerts
     Plugin Point de Rosée