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 :
- repérer une des 4 lettres [NSEO] entre crochet (une classe), suivit d'un tiret, puis...
- encore une fois une de ces 4 lettres [NSEO]
- suivit d'un tiret optionnel (on se rappelle le code '?') donc -?
- et d'une des deux lettres [EO], encore une fois optionnel, [EO]?
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 :
- une description du plugin (version, ce qui s'affiche dans le store...)
- l'entrée des paramètres nécessaires à la création de nos capteurs
- la création conditionnelle des capteurs (device) avec des paramètres prédéfinis et entrés par l'utilisateur
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
- couple: "Nom":"Valeur"
- tout couple, objet ou tableau se terminent par une virgule s'il y'en a un suivant
- le dernier de sa liste ne doit donc pas comporter de virgule
- ils peuvent être regroupés par accolades: les Objets
- ces derniers regroupés par crochets: les Tableaux
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
- nomduplugin = le nom (du fichier) de votre plugin (sans extension évidemment)
- lui est adjoint _PRIVATE pour le plugin en cours de test avant publication/mise à jour
- pour le plugin en anglais, il suffit de remplacer readme_fr par readme_en
- #Ancre est bien sur optionnel
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 :
- La puissance admise pour vos modules
- L'abonnement Linky
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