9. Dispositifs Zigbee --------------------- **Avec zigbee2mqtt** 9.1 Démarrage automatique ^^^^^^^^^^^^^^^^^^^^^^^^^ .. IMPORTANT:: Si Z2m n'envoie plus de messages à Domoticz ou Home assistant: le souci vient de Z2M et du driver **ember** : à la moindre interruption du courter mqtt, il faut redémarrer Z2m - **Pour une installation classique node.js** Démarrage auto : avec PM2 , Voir la page domo-site : http://domo-site.fr/accueil/dossiers/74 |image658| |image659| - **Pour une installation sous Docker**, le démarrage sera automatique. - **Pour un démarrage avec systemg** zigbee2mqtt.service .. code-block:: [Unit] Description=zigbee2mqtt After=network.target [Service] Environment=NODE_ENV=production ExecStart=/usr/bin/pnpm start WorkingDirectory=/opt/zigbee2mqtt StandardOutput=inherit StandardError=inherit Restart=always User=root [Install] WantedBy=multi-user.target 9.2 Le fronted ^^^^^^^^^^^^^^ |image1143| Affichage |image653| .. admonition:: **ajouter une fonction utile**: *vu pour la derière fois* |image1142| A parir du frontend: |image1141| .. note:: **ISO 8601** c'est la représentation de la date, en format internationalement, exemple : 2023-10-06T17:13:26Z le payload MQTT: .. code:: MQTT publish: topic 'zigbee2mqtt/lampe_jardin', payload '{"last_seen":"2023-10-05T20:52:34.706Z","linkquality":156,"state_l1":"OFF","state_l2":"OFF"}' La donnée "last_seen" peut être utilisé avec Node , HA (mais pas avec Dz) pour connaitre les dispositifs :red:`offline` .. note:: Voir la page du site consacrée à frontend : http://domo-site.fr/accueil/dossiers/48 9.3 Ajouter le Fronted dans monitor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - **la page zigbee.php** |image654| - **Le fichier admin/config.php** .. code-block:: // Page zigbee2mqtt define('ON_ZIGBEE',true);// mise en service Zigbee define('IPZIGBEE', 'http://192.168.1.92:8084');//ip:port define('URLZIGBEE', 'https://zigbee.');//url - **Le fichier index_loc.php** : pour info, ne pas modifier .. code-block:: if (ON_ZIGBEE==true) include ("include/zigbee.php");// fronted zigbee2mqtt - **Les styles CSS** En plus des css pour la page: .. code-block:: /*zigbee2mqtt zwavejs2mqtt & ngiosmobile (----------------*/ #zbmqtt,#zwmqtt {margin-top:-40px;width: 100%;height: 800px;} - **zigbee.php** on ajoute une iframe *(permet d'obtenir une page HTML intégrée dans la page courante)* .. code-block:: |image657| 9.4 accès distant HTTPS ^^^^^^^^^^^^^^^^^^^^^^^ Il faut configurer NGINX : - :ref:`1.8 Accès distant HTTPS` .. admonition:: **Exemple de fichier .conf avant de demander un certificat cerbot** .. code-block:: server { listen 80; server_name zigbee.; #return 301 https://zigbee$request_uri; } location / { proxy_pass http://:/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /api { proxy_pass http://:/api; proxy_set_header Host $host; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } - **Demande de certificat Let's Encrypt** : .. prereq::**Installer Cerbot** .. code-block:: sudo apt install certbot python3-certbot-nginx .. code-block:: sudo cerbot --nginx Le fichier modifié par cerbot lors de la demande de certificat |image655| .. attention:: ** Pour utiliser auth basic** *comme c'est le cas ici* Il faut créer un fichier de mot de passe et ajouter des utilisateurs https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/ 9.5 utilisation directe avec monitor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ sans l'intermédiaire de Domoticz, Home Assistant ou Ipbroker 9.5.1 Créer un lien symbolique de state.json """""""""""""""""""""""""""""""""""""""""""" Ce fichier json contient les dernières valeurs de tous les dispositifs. il est mis à jour toutes les 5 minutes. .. note:: la mise à jour en temps réel n'est effective que pour les dispositifs affichant un état ON/OFF; en règle général la mise à jour des autres dispositifs s'effectue dans le delai indiqué dans include/admin/config.php TEMPO_DEVICES', 180000) pour DZ, HA, IOB ; il peut être judicieux , lors de l'utilisation de z2m directement par monitor d'armoniser cette mise à jour: 150 000 , 300 000, 450 000 milli secondes; pour une utilisation de seulement monitor + z2m , régler TEMPO_DEVICES sur 3000000. .. code-block:: ln -s /opt/zigbee2mqtt/data/state.json /opt/zigbee2mqtt/node_modules/zigbee2mqtt-windfront/dist/state.json .. note:: Ce lien permer de récutérer en http le contenu du fichier : http://IP_Z2M:8084:state.json |image1955| 9.5.2 Installation de php-mqtt/client coté serveur """""""""""""""""""""""""""""""""""""""""""""""""" https://github.com/php-mqtt/client .. note:: Un autre choix existe : mosquitto client; le paquet pour Debian, libmosquitto-dev mais l’installation n’est pas aussi simple qu’avec php-mqtt/client installé depuis composer; composer ne peut pas être installé en root .. code-block:: cd /www/monitor sudo apt install composer composer require php-mqtt/client |image1956| 9.5.2.1 envoyer et recevoir les messages ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Le script est est exécuter dans le répertoire **ws_z2m** .. code-block:: "Data", 'state_l2' => "Data", 'state_l1' => "Data", 'temperature' => "temperature", 'soil_moisture' => "Data", 'humidity' => "humidity", "contact" => "Data" ]; if ($nom_objet!="") { $conn = new mysqli(SERVEUR,UTILISATEUR,MOTDEPASSE,DBASE); $sql="SELECT * FROM ".DISPOSITIFS." WHERE ( nom_objet = '".$nom_objet."' AND Actif = '6' AND maj_js <> 'variable');"; $result = $conn->query($sql);$nb_rows=$result->num_rows; if ($nb_rows>0) {$i=0;//$row = $result->fetch_assoc();echo $row['ID']; while($row = $result->fetch_array(MYSQLI_ASSOC)){ $ro=explode(":",$row['param']) ; $rq[$i]=['ID' => $row['ID'], 'idm' => $row['idm'], 'champ' => $zb_donnees[$ro[1]], 'nb' => $nb_rows, 'json' => $ro[1] ];} //$rx=json_encode($rq);echo $rx; } else { $rq[0]=['ID' => '0'];}} else { $rq[0]=['ID' => '0'];} return $rq;} $server = MQTT_IP; $port = 1883; $clientId = rand(5, 15); $username = MQTT_USER; $password = MQTT_PASS; $clean_session = false; $mqtt_version = MqttClient::MQTT_3_1_1; $connectionSettings = (new ConnectionSettings) ->setUsername($username) ->setPassword($password) ->setKeepAliveInterval(60) ->setLastWillTopic('monitor/last-will') ->setLastWillMessage('client mqtt déconnecté') ->setLastWillQualityOfService(1) ->setReconnectAutomatically(true) ->setMaxReconnectAttempts(3) ->setDelayBetweenReconnectAttempts(0); try { debut: // Boucle d’attente de connexion $maxWait = 30; // secondes max d’attente $start = time(); $mqtt = new MqttClient($server, $port, $clientId, $mqtt_version); $mqtt->connect($connectionSettings, $clean_session); printf("client connecté\n"); $mqtt->subscribe('zigbee2mqtt/#', function ($topic, $message) use ($mqtt) { //if ($topic == "monitor") {sms($message);} $str=explode("/",$topic);$name=$str[1];$search_id=[]; $search_id=id_name($name);$id=$search_id[0]['ID']; if ($id!="0") {$n=$search_id[0]['nb'];$i=0;while($i<$n){$search=$search_id[$i];echo "----->".$n." ".$i; $id=$search['ID'];$idm=$search['idm'];$json=$search['json'];$champ=$search['champ'];$obj = json_decode($message); if (isset($obj->state) && $obj->state=="offline"){$ob=$obj->state;$msg='{ "id" : "'.$id.'", "objet" : "'.$name.'", "state" : "'.$ob.'" }';maj($id,$ob);} if (isset($obj->$json)) {$ob=$obj->$json;$msg='{ "id" : "'.$id.'", "objet" : "'.$name.'","state" : "'.$ob.'", "champ1" : "'.$champ.'", "champ2" : "'.$json.'", "idm" : "'.$idm.'"}'; // echo '------------'.$msg; $mqtt->publish('z1m', $msg, 0,false);$id="0";$str=[]; echo "envoi msg:".$msg; } $i++;}}} ); $mqtt->loop(); $mqtt->disconnect(); } catch (\Throwable $e) { echo 'An exception occured: ' . $e->getMessage() . PHP_EOL; while (time() - $start <= $maxWait) { usleep(1000000); // pause 1000ms pour éviter de saturer le CPU echo ".";} goto debut; //$mqtt->disconnect(); } |image1957| |image1967| |image1225| .. note:: Ne pas utiliser "z2m" pour le topic à publier car il est utilisé pour publier des erreurs de zigbee2mqtt; j'ai utilisé "z1m" 9.5.2.2 démarrage automatique systemd ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ le fichier php-mqtt.service .. code-block:: [Unit] Description=cclient mqtt php After=multi-user.target [Service] Type=idle ExecStart=php /var/www/monitor/ws_z2m/sub_messages_mqtt.php > /home/michel/sub_mqtt.log 2>&1 [Install] WantedBy=multi-user.target |image1965| Pour activer et démarrer le service : .. code-block:: Systemctl enable php-mqtt systemctl start php-mqtt.service |image1966| 9.5.3 Scripts concernés dans monitor """""""""""""""""""""""""""""""""""" .. admonition:: **fonctions.php & include/fonctions_1.php** fonctions.php |image1958| |image1979| include/fionctions_1.php |image1964| |image1980| 9.5.4 Installation de mqtt.JS coté client """"""""""""""""""""""""""""""""""""""""" |image1959| https://github.com/mqttjs/MQTT.js .. code-block:: if (MQTT==true) {echo '';} |image1960| - Ajout de MQTT.js à JS dans include/footer.php |image1968| 9.5.4.1 Le javascript sur la page html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fichier include/mqtt-js.php .. code-block:: |image1961| 9.5.4.2 envoyer et recevoir les messages ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - **publier** .. code-block:: client.publish(topic, msg);} // topic , payload Exemples: |image1962| Scripts concernés dans include/footer.php |image1963| - **recevoir et mettre à jour les données** |image1969| |image1976| Voir aussi le § :ref:`8.1.2.2 Commandes de changement de couleur des lampes` 9.5.5 Automatisations """"""""""""""""""""" 9.5.5.1 Le plugin Zigbee2MQTT-automations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |image1228| https://github.com/Luligu/zigbee2mqtt-automations **Installation** .. code-block:: cd /opt/zigbee2mqtt/data mkdir external_extensions cd external_extensions wget https://github.com/Luligu/zigbee2mqtt-automations/blob/master/dist/automations.js systemctl stop zigbee2mqtt systemctl start zigbee2mqtt |image1229| |image1994| Après le redémarrage, automations.js est pris en compte par le fronted |image1995| Exemple d'une première automation : dans /opt/zigbee2mqtt/data/automations.yaml .. code-block:: Allumage lampes jardin 2mn depuis contact lampe_ porche: active: true trigger: entity: lampe_terrasse_nord state: ON action: - entity: lampe_jardin payload: state_l2: ON turn_off_after: 120 payload_off: logger: info Dans le frontend -> Extensions: Sélectionner automations.js et sauvegarder; automations.yaml et scenes.yaml (si il existe) sont rechargés. |image1996| 9.5.5.2 Script d'aide pour automations.yaml de monitor ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |image1997| - **le SCRIPT** |image2009| - **UTILISATION:** . pour obtenir de l'aide |image1999| . indiquer le nom de l'automation, . choisir de l'activer ou non . choisir un déclenchement |image1998| |image2000| . choisir une condition si il y a lieu, choisir une action |image2001| |image2002| |image2003| |image2004| |image2005| . POUR TERMINER APPUYER sur Envoyer |image2006| . et sur COPY pour récupérer le script et l'ajouter à :green:`automations.yaml' |image2007| .. note:: la console est affichée par un textarea html et l'indentation peut être quelquefois modifiée mais la copie crée dans le presse papier est correcte et peut être ajoutée dans :green:`automations.yaml`. La copie dans le presse papier est réalisée par clipboard.js : https://clipboardjs.com/ |image2008| .. |image653| image:: ../media/image653.webp :width: 536px .. |image654| image:: ../media/image654.webp :width: 625px .. |image655| image:: ../media/image655.webp :width: 700px .. |image657| image:: ../media/image657.webp :width: 700px .. |image658| image:: ../media/image658.webp :width: 600px .. |image659| image:: ../media/image659.webp :width: 647px .. |image1141| image:: ../media/image1141.webp :width: 650px .. |image1142| image:: ../media/image1142.webp :width: 700px .. |image1143| image:: ../media/image1143.webp :width: 418px .. |image1225| image:: ../img/image1225.webp :width: 500px .. |image1228| image:: ../img/image1228.webp :width: 90px .. |image1229| image:: ../img/image1229.webp :width: 650px .. |image1955| image:: ../img/image1955.webp :width: 700px .. |image1956| image:: ../img/image1956.webp :width: 500px .. |image1957| image:: ../img/image1957.webp :width: 580px .. |image1958| image:: ../img/image1958.webp :width: 700px .. |image1959| image:: ../img/image1959.webp :width: 200px .. |image1960| image:: ../img/image1960.webp :width: 550px .. |image1961| image:: ../img/image1961.webp :width: 550px .. |image1962| image:: ../img/image1962.webp :width: 650px .. |image1963| image:: ../img/image1963.webp :width: 550px .. |image1964| image:: ../img/image1964.webp :width: 600px .. |image1965| image:: ../img/image1965.webp :width: 350px .. |image1966| image:: ../img/image1966.webp :width: 700px .. |image1967| image:: ../img/image1967.webp :width: 700px .. |image1968| image:: ../img/image1968.webp :width: 650px .. |image1969| image:: ../img/image1969.webp :width: 700px .. |image1976| image:: ../img/image1976.webp :width: 650px .. |image1979| image:: ../img/image1979.webp :width: 700px .. |image1980| image:: ../img/image1980.webp :width: 300px .. |image1994| image:: ../img/image1994.webp :width: 280px .. |image1995| image:: ../img/image1995.webp :width: 500px .. |image1996| image:: ../img/image1996.webp :width: 550px .. |image1997| image:: ../img/image1997.webp :width: 600px .. |image1998| image:: ../img/image1998.webp :width: 500px .. |image1999| image:: ../img/image1999.webp :width: 550px .. |image2000| image:: ../pict/image2000.webp :width: 500px .. |image2001| image:: ../pict/image2001.webp :width: 500px .. |image2002| image:: ../pict/image2002.webp :width: 500px .. |image2003| image:: ../pict/image2003.webp :width: 500px .. |image2004| image:: ../pict/image2004.webp :width: 500px .. |image2005| image:: ../pict/image2005.webp :width: 500px .. |image2006| image:: ../pict/image2006.webp :width: 550px .. |image2007| image:: ../pict/image2007.webp :width: 550px .. |image2008| image:: ../pict/image2008.webp :width: 650px .. |image2009| image:: ../pict/image2009.webp :width: 700px