8. MUR de COMMANDES ------------------- |image574| |image575| 8.1 les fichiers de base ^^^^^^^^^^^^^^^^^^^^^^^^ Index_loc.php en général ne pas modifier .. code-block:: if (ON_ONOFF==true) include ("include/mur_inter.php"); - **header.php** .. code-block:: Mur On/Off';?> - **styles** : mes_css.css .. code-block:: #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 |image1212| Extrait de la page html pour des commandes pour Domoticz et Home Assistant: |image580| voir le § :ref:`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 .. admonition:: les fonctions PHP **pour l'API Home Assistant** .. code-block:: 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** .. code-block:: 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 :darkblue:`ioBroker Swagger UI`, voir le § :ref:`0.2.3.3 pour IoBroker` .. code-block:: 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; } .. admonition:: les fonctions Javascript |image1214| |image1213| 8.1.2.1 client mqtt zigbee2mqtt """"""""""""""""""""""""""""""" **Depuis la version monitor 4.1.0**: MQTT.js remplace Paho, voir ce § :ref:`9.5.4 Installation de mqtt.JS coté client` voir le paragrahe :ref:`8.2.6.3.2 avec Paho-MQTT` pour utiliser Paho js .. admonition:: **publier un message** ., code-block:: function publish_mqtt(idx,type,command,level=0){ // Publish a Message var msg='{ "'+ type+'":"'+ command+'"}';console.log(msg); var topic='zigbee2mqtt/'+idx+'/set'; client.publish(topic, msg);return; } 8.1.2.2 Commandes de changement de couleur des lampes """"""""""""""""""""""""""""""""""""""""""""""""""""" le color picker jscolor.js est utilisé: https://jscolor.com/ .. admonition:: 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) .. code-block:: 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;} |image1409| le fichier include/mur_inter.php |image1410| 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. .. code-block:: 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é: .. code-block:: 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 : |image1776| 8.2 mur_inter.php ^^^^^^^^^^^^^^^^^^ Sans les changements de couleurs pour les lampes |image582| 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. |image583| |image584| **Domoticz** , Les capteurs virtuels |image585| Les capteurs sont mis à jour par MQTT et node-red depuis zigbee2mqtt .. admonition:: **Les scripts node-red** *envoi vers domoticz/in* |image586| *La réponse de Domoticz* |image587| .. 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.** .. admonition:: **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é |image588| .. code-block:: .../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 § :ref:`18.2.1 Le script pour envoyer des messages (mqtt.py)` |image591| |paho| 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++ .. admonition:: **dos2unix** installation et commande bash pour convertir le fichier en Unix .. code-block:: sudo apt install dos2unix .. code-block:: dos2unix .. attention:: Attention aussi aux autorisations |image590| 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é |image592| **monitor** le fichier exterieur.php Les lampes concernées en gris et jaune |image595| |image596| *css pour les lampes de* :darkblue:`exterieur_svg.php` .. code-block:: /*exterieur*/ .txt_ext{position:relative;top:20px;left:20px;} .lj1{fill:#a29e9e;} .lj2{fill:#a29e9e;} |image594| **La Base de Données** |image597| **Le Javascript** dans footer.php - *maj_devices()* |image598| - *maj_mqtt()* , remplace depuis la version 2.2.7 maj_switch() |image599| la fonction PHP pour établir la table decorrespondance entre idm et ID ou idx |image1416| 8.2.4 Exemple pour arrosage jardin ================================== *Relais Sonoff wifi ip 192.168.x.x :8081* **DOMOTICZ** : Le Capteur virtuel : |image601| |image602| Le capteur est ajouté au plan |image604| **Le script python** .. code-block:: #!/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** .. code-block::