8. MUR de COMMANDES
8.1 les fichiers de base
Index_loc.php en général ne pas modifier
if (ON_ONOFF==true) include ("include/mur_inter.php");
header.php
<?php if (ON_ONOFF==true) echo '<li class="zz"><a href="#murinter">Mur On/Off</a></li>';?>
styles : mes_css.css
#murinter{
width: 100%;
height: 1120px;padding: 80px 0;
min-height: 100%;
position: relative;
color: #000;
top: 350px;z-index:-20;overflow: auto;
}
#murinter{background-color: aquamarine;}
8.1.1 écriture automatique du javascript
Effectuée par une fonction PHP à partir de la base de données
Extrait de la page html pour des commandes pour Domoticz et Home Assistant:
voir le § 0.3.2 Les Dispositifs exemple des scripts générés automatiquement
8.1.2 Commandes de changement d’état
Note
pour zigbee2mqtt, le dialogue s’effectue en mqtt sous javacript
les fonctions PHP
pour l’API Home Assistant
function devices_id($deviceid,$type,$value="",$pass=0){$post="";global $L_ha,$Token_ha;
$type= strtolower($type);
$mat=explode('.',$deviceid);$mat=$mat[0];
switch ($type) {
case "etat" :
$api="api/states/".$deviceid;$mode=1;
break;
case "service" :
$api="api/services";$mode=1;
break;
case "on" :
$mode=2;
if ($mat=="input_boolean") {$api="api/services/input_boolean/turn_on";$post='{"entity_id": "'.$deviceid.'"}';}
if ($mat=="switch") {$api="api/services/switch/turn_on";$post='{"entity_id": "'.$deviceid.'"}';}
if ($mat=="light") {$api="api/services/light/turn_on";$post='{"entity_id": "'.$deviceid.'"}';}
break;
case "off" :
$mode=2;
if ($mat=="input_boolean") {$api="api/services/input_boolean/turn_off";$post='{"entity_id": "'.$deviceid.'"}';}
if ($mat=="switch") {$api="api/services/switch/turn_off";$post='{"entity_id": "'.$deviceid.'"}';}
if ($mat=="light") {$api="api/services/light/turn_off";$post='{"entity_id": "'.$deviceid.'"}';}
break;
case "4" ://"entity_id":"light.salon", "brightness": 255, "rgb_color": [20,30,20]
$mode=2;$rgb=$value;//$value=str_replace('(','[',$value);$value=str_replace(')',']',$value);
$api="api/services/light/turn_on";$post='{"entity_id": "'.$deviceid.'", "brightness": 255, "rgb_color": '.json_encode($value).'}';
break;
case "value" :
$mode=2;
if ($mat=="input_text") {$api="api/services/input_text/set_value";$post='{"entity_id": "'.$deviceid.'" , "value" : "'.$value.'" }';}
break;
default:
}
$L=$L_ha.$api;
$ha=file_http_curl($L,$mode,$post,$Token_ha);
$data = json_decode($ha, true);
$data['status']="OK";
$data['address_api']=$post;
return json_encode($data);}
pour l’API de Domoticz
function switchOnOff_setpoint($idx,$valeur,$type,$level,$pass="0"){$auth=9;global $L_dz;
// exemple : http://192.168.1.75:8082/json.htm?type=command¶m=udevice&idx=84&nvalue=Off&svalue=2
// /json.htm?type=command¶m=switchlight&idx=99&switchcmd=Set%20Level&level=6
// /json.htm?type=command¶m=setcolbrightnessvalue&idx=99&hex=RRGGBB&brightness=100&iswhite=false
if ($pass=="0") {$auth=0;}
if ((($pass==NOM_PASS_CM)&&($_SESSION['passwordc']==PWDCOMMAND))&&($_SESSION['timec']>time())) {$auth=1;}
if (($pass==NOM_PASS_AL)&&($_SESSION['passworda']==PWDALARM)&&($_SESSION['time']>time())) {$auth=2;}
if ($auth<3){$json2="json.htm?type=command¶m=";
// $type=1 .....
if ($type==1){$json1='udevice&idx='.$idx.'&nvalue=group%20on&svalue=2';}
// $type=2 .....ON/OFF
if ($type==2){$json1='switchlight&idx='.$idx.'&switchcmd='.$valeur;}
// $type=3 Réglez une lumière dimmable/stores/sélecteur à un certain niveau
if ($type==3){$json1='switchlight&idx='.$idx.'&switchcmd=Set%20Level&level='.$level;}
// $type=4 Réglez une lumière RVB dimmable
if ($type==4){
$hex=substr($valeur,1,6);$json1='setcolbrightnessvalue&idx='.$idx.'&hex='.$hex.'&brightness='.$level.'&iswhite=false';}
$json= $L_dz.$json2.$json1;
$json_string=file_get_curl($json);
$result = json_decode($json_string, true);
}
else {$result['status']="acces interdit";}
return $result ;
}
pour l’API de Io.broker , avec ioBroker Swagger UI, voir le § 0.2.3.3 pour IoBroker
function set_object($device,$type,$value,$pass=0){global $Token_iob,$port_api_iob,$IP_iob; //http://192.168.1.104:8093/v1/state/zigbee2mqtt.0.0xa4c13878aa747f7e.state?value=false //http://192.168.1.162:8093/v1/command/setState?id=zigbee2mqtt.0.0xb40ecfd06e810000.color&state=%231BFF42 //$mode=1;//$device=$device.".".$type; switch ($type) { case "state" : if ($value=="On") {$value='true';} if ($value=="Off") {$value='false';} $L=$IP_iob.':'.$port_api_iob.'/v1/state/'.$device.'?value='.$value; break; case "command" : $L=$IP_iob.':'.$port_api_iob.'/v1/command/setState?id='.$device.'&state='.$value; //file_http_curl($L,$mode,$post,$token) break; default: } $iob=file_get_curl($L); $iob = json_decode($iob, true); $data['status']="OK"; $data['id']=$iob['id']; $data['valeur']=$iob['val']; return $data; }
8.1.2.1 client mqtt zigbee2mqtt
Depuis la version monitor 4.1.0: MQTT.js remplace Paho, voir ce § 9.5.4 Installation de mqtt.JS coté client
voir le paragrahe 8.2.6.3.2 avec Paho-MQTT pour utiliser Paho js
8.1.2.2 Commandes de changement de couleur des lampes
le color picker jscolor.js est utilisé: https://jscolor.com/
explications concernant les couleurs des lampes zigbee
les couleurs peuvent être modifiées par :
le systeme hue huesat ( h & s + brigthness)
le systeme de coordonnées xy (x & y + brightness)
color_temp pour les différente couleurs de blancs(valeurs en mired( pour simplifier c’est l’inverse des ° Kelvin)
Scripts PHP utilisé pour la conversion Hex vers rgb,hs,xy et mired(1 000 000/Kelvin)
function power($c){ if ($c> 0.04045){$c = pow(($c + 0.055) / (1.0 + 0.055), 2.4);} else {$c = ($c/12.92);} return $c;} function hextohsl($hex,$lum){// ex: #FFFFFF , 255 require ('ColorConverter.php'); $converter = new ColorConverter(); $color=[]; // Convert HEX to RGB $rgb = $converter->hexToRgb($hex); // [255, 87, 51] // convert RGB to xy $red = power(($rgb[0]/255),2.4);$green=power(($rgb[1]/255),2.4);$blue=power(($rgb[2]/255),2.4); $X = ($red * 0.664511) + ($green * 0.154324) + ($blue * 0.162028); $Y = ($red * 0.283881) + ($green * 0.668433) + ($blue * 0.047685); $Z = ($red * 0.000088) + ($green * 0.072310) + ($blue * 0.986039); $x = $X/($X + $Y + $Z);$y = $Y/($X + $Y + $Z);// 0.1234 0.4567 // convert xy to CCT (temp_color) $n = ($x-0.3320)/(0.1858-$y) ; $CCT = 437*pow($n,3) + 3601*pow($n,2) + 6861*$n + 5517; $mired=intval(1000000/$CCT); // Convert HEX to HSL $hsl2 = $converter->hexToHsl($hex); // [10.59, 100, 60] if ($lum>253) {$hsl2[0]=51;$hsl2[1]=100;$hsl2[2]=100;} $color=[ R' => $rgb[0], V' => $rgb[1], 'B' => $rgb[2], 'rgb' => $rgb, 'hsl' => $hsl2, 'Hue' => $hsl2[0], 'Saturation' => $hsl2[1], 'luminosité' => $hsl2[2], 'x' => round($x,4), 'y' => round($y,4), 'CCT' => $CCT, 'mired' => $mired ]; return $color;}
le fichier include/mur_inter.php
Dans include/footer.php la fonction suivante permet d’envoyer aux api (DZ, HA, IOB) la couleur choisie (pour DZ ,IOB, HA); pour Zigbee2mqtt la fonction envoie directement un message websocket à z2m.
function adby(choix) {var formData=new Array();
case 10: // couleur lampes
var lumin=get_brightness($("#val1").val());
//document.getElementById('val2').value =lumin;
$("#val2").val(lumin);
var formData = {
app : "dimm",
command : $("#val1").val(),
type : lumin,
device : $("#idhtml").val(),
name : "100"
};fenetre='color_lampes';dType="json";
break;
default:
}
$.ajax({
type: "GET",
url: "ajax.php",
data: formData,
dataType: dType,
success:function (data) {
$('#'+fenetre).empty();
if (choix !=10) {document.getElementById(fenetre).innerHTML = data;document.getElementById(fenetre).style.display = "block";}
else {
if (data['serveur']==6){ const msg=data['payload'];const topic=data['topic'];
client.publish(topic, msg);}
}
},
error: function() {
alert('La requête n\'a pas abouti');
}
});
}
Pour calculer la luninosité:
function get_brightness(hexCode) {
// strip off any leading #
hexCode = hexCode.replace('#', '');
var c_r = parseInt(hexCode.substr(0, 2),16);
var c_g = parseInt(hexCode.substr(2, 2),16);
var c_b = parseInt(hexCode.substr(4, 2),16);
return Math.round(((c_r * 299) + (c_g * 587) + (c_b * 114)) / 1000);
}
Dans fonctions.php :
8.2 mur_inter.php
Sans les changements de couleurs pour les lampes
8.2.1 Exemple avec node red
L’interrupeur mécanique de l’éclairage extérieur de l’entrée commande également en zigbee l’éclairage du jardin.
Cette solution est un exemple pour des cas paticuliers ; la solution plus simple est d’utiliser un groupe ou une scène.
Domoticz , Les capteurs virtuels
Les capteurs sont mis à jour par MQTT et node-red depuis zigbee2mqtt
Important
Ce script automatique de Domoticz ne suffit pas en cas de commande de l’interrupteur car le délai de réponse de domoticz/out peut atteindre plus de 10 s, il faut donc envoyer un message MQTT à partir de l’interrupteur virtuel.
Le script python lancé par la « lampe_ext_entree »
Ce script publie un message MQTT vers zigbee2mqtt pour allumer l’éclairage du jardin si l’interrupteur « lampe_ext_entree » est actionné
.../domoticz/scripts/python/mqtt.py zigbee2mqtt/eclairage_ext/set state_l2 ON
.../domoticz/scripts/python/mqtt.py zigbee2mqtt/eclairage_ext/set state_l2 OFF
le script mqtt.py
voir ce § 18.2.1 Le script pour envoyer des messages (mqtt.py)
https://www.eclipse.org/paho/index.php?page=clients/python/docs/index.php
8.2.2 Problème de lecture de fichier
Pour éviter des erreurs (512, 256), penser à convertir le fichier python en Unix s’il a été créé avec Notepad++
dos2unix installation et commande bash pour convertir le fichier en Unix
sudo apt install dos2unix
dos2unix <CHEMIN/NOM DU FICHIER>
8.2.3 Exemple pour un éclairage de jardin
Cet exemple est choisi car un interrupteur sur le mur de commandes allume plusieurs lampes dont l’allumage doit aussi être visible sur le plan extérieur.
Le plan: un interrupteur est ajouté
monitor le fichier exterieur.php
Les lampes concernées en gris et jaune
css pour les lampes de exterieur_svg.php
/*exterieur*/
.txt_ext{position:relative;top:20px;left:20px;}
.lj1{fill:#a29e9e;}
.lj2{fill:#a29e9e;}
La Base de Données
Le Javascript dans footer.php
maj_devices()
maj_mqtt() , remplace depuis la version 2.2.7 maj_switch()
8.2.4 Exemple pour arrosage jardin
Relais Sonoff wifi ip 192.168.x.x :8081
DOMOTICZ : Le Capteur virtuel :
Le capteur est ajouté au plan
Le script python
#!/usr/bin/env python3.7
# -*- coding: utf-8 -*-
import sys
import urllib.request
import json
total_arg = len(sys.argv)
if (total_arg>0) : arg= str(sys.argv[1])
data = '{"deviceid":"1000a0876c","data":{"switch":"'+arg+'"}}'
url = 'http://192.168.1.146:8081/zeroconf/switch'
req = urllib.request.Request(url)
dataasbytes = data.encode('utf-8') # needs to be bytes
req.add_header('Content-Length', len(dataasbytes))
response = urllib.request.urlopen(req, dataasbytes)
mur_inter.php
<ul>
<li style="margin-left:0;margin-top:10px"><a href="#murinter"><img id="sw8" src="<?php echo $lien_img;?>/images/arrosage.svg" width="60" height="auto" alt=""/></a></li>
La Base de données
8.2.5 Exemple éclairage simple, une lampe de salon
Dans Domoticz
création d’un dispositif virtuel
ajout du dispositif au plan
placement sur le plan
Dans monitor
mur_inter.php
Les images pour lampe de bureau :
La base de données « monitor », table dispositifs
Affichage : Eteint / Allumé
8.2.6 Exemple volet roulant
Le moteur est à 4 fils, piloté par une commande TUYA FT30F et Zigbee2mqtt
Important
pour éviter que les commandes soient inversées dans Domoticz, mettre à TRUE le paramètre spécifique concernant cet interrupteur, dans le fronted de zigbee2mqtt
Avertissement
Pour utiliser le Javascript (comme pour le plan) il ne faut pas charger l’image par son nom mais l’incorporer dans un fichier PHP.
<li style="margin-left:0;margin-top:10px"><?php include ("volet-roulant_svg.php");?></li>
L’image svg :
Cette image a été ajoutée avec la CLASS ci-dessus, les ID étant uniques ;
ID « volet_bureau » (1er <rect ) pour indiquer le % d’ouverture
ID « volet_bureau1 » (2eme <rect ) pour pouvoir cliquer n’importe où sur l’image.
8.2.6.1 Affichage sur le plan
Le plan :
Pour un clic qui fonctionne sans problème, on peut ajouter un rectangle :
<rect style="fill:black;fill-opacity:1" xlink:href="#interieur"
onclick="popup_device(31)"
class="volet_bureau"
id="volet_bur" width="26" height="37" x="113" y="726">
<title id="title69449">volet_bur</title></rect>
Domoticz , Ci-dessous le dispositif concerné
Base de données SQL
Enregistrer le dispositif avec l’ID pour le mur de commande et une CLASS pour le plan (permet de visualiser, comme pour les lampes l’ouverture ou la fermeture des volets
Le Javascript , footer.php
maj_devices()
8.2.6.2 Dans le mur ON/OFF
Pour afficher le % d’ouverture
Pour indiquer le % d’ouverture on ajoute un rectangle dans l’image, la hauteur sera fonction du % d’ouverture ; pour cela il faut indiquer dans l’image la hauteur de référence ; sinon un pourcentage s’appliquera à la hauteur déjà modifiée qui diminuera au fil des mises à jour.
Important
Height de l’image sera suivant le % d’ouverture modifié dans le Dom, c’est pourquoi on crée un attribut h qui est le reflet du height d’origine
Le volume d’ouverture est indiqué dans Data : Set Level : VALEUR en %
On applique ce pourcentage au rectangle de l’mage.
Dans maj_devices() , on récupère la valeur h de l’image
var h=document.getElementById(val.ID1).getAttribute("h");
On attribue à l’image la bonne hauteur qui tient compte du % d’ouverture
document.getElementById(val.ID1).setAttribute("height",parseInt((h*pourcent[2])/100));
Ou suivant que les 100% soit pour l’ouverture ou la fermeture :
document.getElementById(val.ID1).setAttribute("height",parseInt((h*(100-pourcent[2]))/100));
Affichage sur le mur de commandes:
La fonction complète maj_devices(plan) dans footer.php
Manoeuvrer le volet
Le rectangle indiquant le % d’ouverture peut être très petit, aussi pour pouvoir cliquer n’importe où sur l’image, il suffit d’ajouter un rectangle incolore comme déjà indiqué dans ce paragraphe :
On ajoute l’id de ce rectangle dans la base de données :
Comme pour les commandes onoff , les scripts des commandes onoff+stop sont écrits automatiquement par la fonction function sql_plan($t) ;
Le wiki de Domoticz concernant ces commandes :
La fonction PHP sql_1() , partie consacrée à maj_js=onoff+stop
if ($row['maj_js']=="onoff+stop") {$sl='").on("click", function ()
{$("#popup_vr").fadeIn(300);document.getElementById("VR").setAttribute("title","'.$row['idm'].'");document.getElementById("VR").setAttribute("rel","'.$row['idx'].'");})';}
La fenêtre complémentaire :
le code PHP dans mur_inter.php
C’est cette fenêtre qui va envoyer les commandes d’ouverture, fermeture
8.2.6.3 les scripts JS
2 solutions:
8.2.6.3.1 avec Ajax et PHP
amount=id pour input button voir l’mage du § precédent
Ci-dessus, on récupère idx idm et la commande
Mise à jour instantanée : on utilise la fonction qui met à jour dans monitor, les dispositifs si ils sont activés depuis domoticz ou Home Assistant.(d’où son nom maj_mqtt)
8.2.6.3.2 avec Paho-MQTT
PHP-MQTT et MQTT.js plus faciles à utiliser, remplacent désormais Paho; la solution ci-dessous n’est que pour information .
define(“MQTT”, true) de config.php fait référence désormais à MQTT.js
C’est une autre solution qui peut s’appliquer pour tout dispositifs non gérer par HA, DZ ou IOB ; c’est aussi la solution pour la maj en temps rél depuis IoBroker. Il faut installer la bibliothèque ci-dessous paho-mqtt voir le § 18.2 Installer Paho-mqtt
https://www.eclipse.org/paho/index.php?page=clients/js/index.php
Cette solution est aussi utilisée pour la mise à jour des données en temps réel: 1.1.3.2 Solution temps réel MQTT et 1.3.5.1.b rafraichissement avec MQTT
Ce fichier est chargé automatiquement dans footer.php si MQTT est à true dans /admin/config
define('MQTT', false);// true si serveur MQTT utilisé par monitor
if (MQTT==true) echo '<script src="js/mqttws.min.31.js"></script>';?>
La même commande de volet par MQTT
L’envoi des données doit être un tableau json
Value= {idx : 177, switchcmd : ‘’ Set Level’’ , level : ‘’ On ‘’}
Note
Le topic étant domoticz/in, voir cette page de domo-site.fr :http://domo-site.fr/accueil/dossiers/90
Cette page est consacrée à un capteur mais la publication d’un message est identique
convertir une valeur JavaScript en chaîne JSON
avec La méthode JSON.stringify()
var result = JSON.stringify(value);
La commande :
8.5 les Groupes et Scenes
exemples avec des groupes et scènes simples
Le dispositif de commande (bouton virtuel) est enregistré dans la base de données de la même façon que tous les dispositifs;pour différencier ce fonctionnement l” idm du dispositif commencera par :
G: pour groupe
S: pour scène
8.5.1 Exemple avec Domoticz
le groupe « Allumage Jardin ALL »
Pur chaque interrupteur qui peut commander plusieurs lampes, il est possible d’ajouter une extinction personnalisée.
le bouton virtuel est ajouté au plan qui regroupe tous les dispositifs, il est ajouté au fichier Json que reçoit monitor:
Comme pour tous les dispositifs ON/OFF le Jquery est écrit automatiquement dans le HTML
8.5.2 Exemple avec Home Assistant
le groupe « Lumieres_jardin »
Contrairement à Domoticz l’extinction des lampes commandées par un interrupteur, provoque également l’extinction des lampes des autres interrupteurs du groupe.
Comme pour DZ, on enregistre la commande dans la base de données; les données sont pour la plupart les même puisque les lampes sont les mêmes












































































