Calculight est un plugin qui permet de fournir des informations calculées sur plusieurs capteurs.
Le script a été elaboré par opa95 pour répondre au besoin lié à l'utilisation de plusieurs capteurs :
Merguez07 en a fait un plugin qui permet d'affecter facilement les capteurs à partir de leur nom et d'obtenir les opérations de base.
Depuis le store eedomus, cliquez sur le bouton « Créer » situé sous l'icone du plugin.
Cela vous donnera ensuite accès à l'interface d'installation du périphérique qu'il vous faudra paramétrer.
En 1 par défaut le périphérique sera nommé "Calculight"
En 2 n'oubliez pas de lui affecter une pièce si vous voulez trouver facilement votre périphérique
En 3 renseignez l'unité désiré pour le calcul voulu
En 4 choisir vos capteurs. Vous pouvez en choisir 8 lors de l'installation mais vous pourrez en mettre plus par la suite
En 5 renseigner l'opération que vous désirez faire
En 6 cliquez, enfin, sur le bouton « Créer ».
Le script fournit le résultat de diverses opérations provenant de divers capteurs définis par leur identifiant (id1,id2,...idn). Il peut utiliser la valeur brute du capteur et une valeur corrigée par un gain et un offset lié à chaque capteur :
ValeurCorrigée= (valeurBrute x gain) - offset.
Les opérations effectuées sont :
Les cinq premières opérations sont toujours effectuées et les deux premières (somme, moyenne) toujours accessibles.
Les six dernières opérations peuvent ne pas être affichées pour alléger le résultat.
Les opérations med et tri peuvent être exclues (traitement plus rapide). De plus, le résultat peut être : - simplement calculé (mode=get), - sauvé pour éviter un recalcul ultérieur (mode=save) et - relu sans recalcul (mode=load ou clear).
Le résultat de notre calcul est obtenu par les requêtes dont les url sont les suivantes :
http://localhost/script/?exec=calculight.php&periphIds=[VAR1]
(requête simplifiée)
ou
http://localhost/script/?exec=calculight.php&periphIds=[VAR1]&adjust=[VAR2]&mode=[VAR3]
(requête complète)
VAR1 contient la listes des id des capteurs séparés par des "," , avec ou sans espaces. Les capteurs non valides ne sont pas pris en compte. Le nombre de capteurs est illimité.
ex : VAR1 -> 1338783,1338786,1338790,1338799,1338785
lors de l'installation, l'API des capteurs non renseignés son remplacés par plugin.parameters.devicex.
ex : VAR1 -> 1338783,1338786,...,plugin.parameters.device_5,...,plugin.parameters.device_8
On peut effacer par la suite ",plugin.parameters.device5,...,plugin.parameters.device_8" et rajouter autant de capteurs que nécessaire.
S'il n'y a aucun capteur valide, les opérations de base renvoient 0 (en particulier nombre=0), time et gmt sont corrects et result="Capteurs invalides" : le test le plus simple se fait sur nombre.
VAR2 contient les facteurs d'ajustement liés à chaque capteur : ValeurCorrigée=(ValeurCapteur x Gain)+Offset sous la forme id1:Gain1:Offset1,id2:Gain2:Offset2,...
par défaut gain=1 et offset=0 pour tous les capteurs.
ex : VAR2 -> 1338786:1.8:32
pour obtenir la valeur du capteur 2 en Fahrenheit [(valeur x 1.8)+32] pour la conversion inverse (de Fahrenheit en °C) on aurait 1338786:0.555556:-17.77778
si gain=idxxxxxxx (ou Id ou iD ou Id) gain = valeur de capteur xxxxxxx ou 1 si capteur non valide (les espaces ne sont pas pris en compte).
si offset=Idxxxxxxx offset = valeur de capteur xxxxxxx ou 0 si capteur non valide (les espaces ne sont pas pris en compte).
remarque, on peut obtenir :
1338786:id1338786
[capteur2 x capteur2]1338786:id1338783
[calcul d'une puissance électrique (courant x tension) ou d'une énergie (puissance x durée)]1338786:-1
[capteur1-capteur2]1338783,1338786,1338790,1338799,1338785
et VAR2 -> 1338783:1,1338786:2,1338790:4,1338799:8,1338785:16
donne alarme si somme > 0 et permet de déterminer la cause de l'alarme en utilisant un masque.VAR3 permet de limiter les opérations effectuées et de sauvegarder un résultat, par défaut toutes les opérations et pas de sauvegarde.
all
ou vide : toutes les opérationsall:nomin
ou nomin
: toutes les opérations sauf min, [VAR3 -> nomin:nomax
toutes les opérations sauf min et max,...]ops
: aucune opération particulière (seulement les opérations de base : sommes, moyenne, nombre...)ops :min
opérations de base plus min, [VAR3 -> ops :min:max base+min+max
]Remarque 1 :
la limitation des opérations n'est intéressante que pour obtenir un résultat plus court, ou plus rapide si on ne demande ni le tri, ni la médiane et que le nombre de capteurs est supérieur à 2.
get :
lecture et calcul en fonction des opérations sélectionnées.save:mem0
[VAR3 -> save
] calcul et sauvegarde dans la variable mem0 (par défaut).load:mem0
[VAR3 -> load
] lesture de la variable mem0 (par défaut). clear:mem0
[VAR3-> clear
] lesture de la variable mem0 (par défaut) et effacement.get:mem0,all
ou VAR3 -> all,get:mem0
Remarque 2 :
http://localhost/script/?exec=calculight.phpmode=[VAR3]
avec VAR3 -> load:mem0
Le script affiche les résutats de la requête sous forme XML dont les données pourront ensuite être exploitées par l'XPATH.
Forme du XML minimale (forme minimale : [VAR2] vide et [VAR 3] ops) :
<?xml version="1.0" encoding="UTF-8"?>
<root>
<time>2021-10-26 12:06:09</time>
<gmt>1635242769</gmt>
<result>23</result>
<somme>23</somme>
<sommeBrute>23</sommeBrute>
<moyenne>11.5</moyenne>
<nombre>2</nombre>
<mode>GET:mem0</mode>
</root>
Forme du XML par défaut (forme étendue : [VAR2] et [VAR 3] vides) :
<?xml version="1.0" encoding="UTF-8"?>
<root>
<time>2021-10-26 20:05:20</time>
<gmt>1635271520</gmt>
<result>23</result>
<somme>23</somme>
<sommeBrute>23</sommeBrute>
<moyenne>11.5</moyenne>
<nombre>2</nombre>
<mode>:mem0</mode>
<min>
<value>23</value>
<rawValue>23</rawValue>
<change>2021-10-24 10:46:18</change>
<gmt>1635065178</gmt>
<num>2</num>
<numTri>2</numTri>
<id>736884</id>
<name>Temp CH Info</name>
</min>
<max>
<value>23</value>
<rawValue>23</rawValue>
<change>2021-10-24 10:46:18</change>
<gmt>1635065178</gmt>
<num>2</num>
<numTri>2</numTri>
<id>736884</id>
<name>Temp CH Info</name>
</max>
<last>
<value>23</value>
<rawValue>23</rawValue>
<change>2021-10-24 10:46:18</change>
<gmt>1635065178</gmt>
<num>2</num>
<numTri>2</numTri>
<id>736884</id>
<name>Temp CH Info</name>
</last>
<med>
<num>1 2</num>
<numTri>1.5</numTri>
<value>11.5</value>
<rawValue>11.5</rawValue>
<id>2035791 736884</id>
<change>0</change>
<name>Temp DS18B20 n°1 ou Temp DHT22 [Invisible] / Temp CH Info</name>
<gmt>0</gmt>
</med>
<vals>
<val>
<value></value>
<rawValue></rawValue>
<change></change>
<gmt></gmt>
<num>1</num>
<numTri>1</numTri>
<id>2035791</id>
<name>Temp DS18B20 n°1 ou Temp DHT22 [Invisible]</name>
</val>
<val>
<value>23</value>
<rawValue>23</rawValue>
<change>2021-10-24 10:46:18</change>
<gmt>1635065178</gmt>
<num>2</num>
<numTr>2</numTri>
<id>736884</id>
<name>Temp CH Info </name>
</val>
</vals>
</root>
//result
: Résultat si une seule opération {équivalent à //min/value
ou //max/value
ou //med/value
ou //last/value
} sinon //somme
.//time
: Heure du calcul//sommeBrute
: Somme sans gain ni offset//somme
//moyenne
: somme divisée par nombre (équivalent à (//somme)div(//nombre)
)//xxx/value
ou //xxx/num
ou //xxx/id
ou //xxx/name
ou //xxx/change
ou //xxx/gmt
(avec xxx=min ou max ou med ou last)//min/yyyy
//max/yyyy
//last/yyyy
//med/yyyy
//val[num=n]/yyyy
ou //val[id=zzzzzzz]/yyyy
ou val[numTri=n]/yyyy]
avec yyyy=value ou =id ou =name ou =change ou =gmt ou =num ou =numTri (num est lordre initial, numTri l'ordre trié).exemple de combinaison d'xpath :
la moyenne sans valeurs extrêmes
((//somme)-(//min/value)-(//max/value)) div ((//nombre)-2)
ou bien
((//somme)-(//val[numTri=1]/value)-(//val[numTri=//nombre]/value)) div ((//nombre)-2)