13. APPLICATIONS externes en lien avec Domoticz, HA ou monitor
--------------------------------------------------------------
13.1 Affichage des notifications sur un téléviseur LG
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Le script optionnel pour la notification sur un téléviseur LG (web os)
.. admonition:: **PREREQUIS**
**sudo et Node.js doit être installés**
*ainsi que les modules lgtv et superagent*
Pour les installer:
.. code-block::
npm install lgtv
npm install superagent
|image699|
- **Les variables Domoticz** , *à ajouter* :
|image700|
- **Le script, notifications_tv.lua** à ajouter à Domoticz->Evènements :
.. code-block::
--notification à 19h30 et 20h30 , rappel possible à 20h"30 :
-- variable nb_not_tv = 2 trigger->TIME
package.path = package.path..";www/modules_lua/?.lua"
-- pour notification_lg ip tv et ip dz
require 'connect'
local iptv=ip_tv
local ipdz=ip_domoticz
commandArray = {}
local time = string.sub(os.date("%X"), 1, 5)
--
local idx="7";-- idx de la variable not_tv_ok
function notification()
os.execute("node userdata/scripts/js/notification_lg.js "..texte.." "..idx.." not_tv_ok 2 1 "..iptv.." "..ipdz.." >> /home/michel/tv.log 2>&1");
print(time..".. maj notification");
end
--
--19h30 et 20h00
-- on envoie les 1eres notifications
if ((time == "19:30") or (time == "20:00")) then
tv_conf=uservariables['not_tv_conf']
print('tv_conf'..tv_conf)
-- les poubelles :
if (uservariables['not_tv_poubelle']=="1") then
texte=" mettre_la_poubelle "
notification()
end
-- autres:
if (uservariables['not_tv_fosse']=="1") then
texte="entretien_fosse_septique"
notification()
-- ..................
end
-- si affichage ok on incrémente le nb d' affichage
if (uservariables['not_tv_ok']=='1') then
print('connexion reussie')
tv_nb=tonumber(uservariables['not_tv_nb'])
print('tv_nb_0'..tostring(tv_nb))-- pour test
tv_nb=tv_nb+1
print('tv_nb_1'..tostring(tv_nb)) -- pour test
commandArray['Variable:not_tv_nb'] = tostring(tv_nb)
commandArray['Variable:not_tv_ok'] = tostring("0")
else print('pas de notification')
end
end
-- si une notification n'a pas eu lieu (TV allumé apres 19h30 etc .....not_tv est inférieur à 2.)
--20h30
if (time == "20:30") then
tv_conf=uservariables['not_tv_conf']
tv_nb=tonumber(uservariables['not_tv_nb'])
if (tv_nb <= tonumber(tv_conf)) then
print('tv_nb_2'..tv_nb) -- pour test
-- les poubelles :
if (uservariables['not_tv_poubelle']=="1") then
texte=" mettre_la_poubelle "
notification()
end
-- autres:
if (uservariables['not_tv_fosse']=="1") then
texte="entretien_fosse_septique"
notification()
-- ..................
end
end
--remise à zero des notifications pour ce jour
commandArray['Variable:not_tv_poubelle'] = tostring("0")
commandArray['Variable:not_tv_fosse'] = tostring("0")
commandArray['Variable:not_tv_nb'] = tostring('0')
commandArray['Variable:not_tv_ok'] = tostring("0")
tv_nb=0
end
return commandArray
Les valeurs transmises par dz au script dans l’ordre : texte, idx, vtype, vvalue
|image703|
.. warning:: **Scripts js**
Script :darkblue:`notification_lg.js` à ajouter à Home/user/
Script :darkblue:`node_modules/lgtv/index.js` à remplacer
Voir le dossier http://domo-site/accueil/dossiers/32
- **Essai avec la console** :
|image704|
13.2 Portier Dahua VTO 2000 et VTO 2022
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
13.2.1 VTO 2000A
================
Voir les pages http://domo-site.fr/accueil/dossiers/21
|image705|
Et : http://domo-site.fr/accueil/dossiers/7
|image706|
- **Domoticz** , on crée une variable « sonnette »
|image707|
. **Le script LUA** :
.. code-block::
--vto2000 Dahua exploiter le changement de valeur d' une variable
-- pour signaler l' appui sur le portier video vto2000
--
package.path = package.path..";www/modules_lua/?.lua"
require 'connect'
commandArray = {}
--
if (uservariables['sonnette']=="1") then
-- --envoi image pushover ---------------
os.execute("/bin/bash userdata/scripts/bash/./pushover_img.sh "..ip_domoticz..">> /home/michel/push.log 2>&1");
commandArray['Variable:sonnette'] = '0'
end
return commandArray
:red:`La variable passe à 1 à la demande d'asterisk quand la sonnette est activée sur le portier`
. **pushover_image.sh**
|image710|
.. important:: **En utilisant connect.lua**
*on évite une mise à jour lors d'un changement d’IP*
on évite d'afficher les logins et mots de passe
connect.lua :
|image711|
- **Dans DZ** , on indique la variable de connect.lua, :darkblue:`ex : ip_domoticz`
.. code-block::
package.path = package.path..";www/modules_lua/?.lua"
require 'connect'
--
os.execute("/bin/bash userdata/scripts/bash/pushover_img.sh "..ip_domoticz..">> /home/michel/push.log 2>&1");
- **Dans pushover_img.sh**
.. code-block::
wget http://$1/camsnapshot.jpg?idx=1 -O /opt/domoticz/userdata/camsnapshot.jpg
.. note:: **Si domoticz est sous docker**, c'est le cas ici, l':red:`ip et le port` sont ceux de :darkblue:`docker-compose.yml` et non l'ip du serveur
*Il est difficile de récupérer l'ip de l'hôte il est préférable d'utiliser* l':red:`IP 127.0.0.1`
|image257|
- **asterisk**
. *sip.conf*
|image712|
. *extensions.conf*
|image714|
.. admonition:: **Réglages du portier vidéo**
|image713|
**configTools** -> *VDPConfig*
|image715|
|image716|
|image717|
|image718|
|image719|
13.3 -La boite aux lettres
^^^^^^^^^^^^^^^^^^^^^^^^^^
*Voir domo-site pour la programmation de l’esp8266 , de dzvent et Python*
|image720|
- **Le matériel**
. 2 ILS (pour le volet , pour la porte
. 1 esp 01 et une alim 12V/3,3 Volts
Voir la page consacrée à la réalisation et la programmation de l’ESP pour une communication MQTT: http://domo-site.fr/accueil/dossiers/68
- **Les images svg**
|image721| |image722|
- **Le fichier accueil.php** , * concernée*
.. code-block::
- **Le fichier footer.php** , *le script pour afficher une demande de confirmation de la relève du courrier ou d'autres notifications*
.. code-block::
$(".confirm a").click(function(){
var ch=0;
var title_confirm=$(this).attr('title');ch=$(this).attr('rel');var mod_nom=$("img",this).attr("id");
var nb = Object.keys(service).length;
for (i = 1; i < nb; i++) {//console.log(ch+'...'+service[i].ID);
if (service[i].idm==ch) {ch=i;i=nb; }
}
switch (mod_nom) {
case "lastseen":
Content=service[ch].contenu;mod_ext="1";
break;
case "poubelle":
mod_ext="2";Content="cliquer sur OK pour enregistrer la date \n du ramassage dans la base de données";
break;
case "fosse":
case "pression_chaud":
case "pilule":
case "ping_rasp":
case "bl": // boite aux lettres
Content="confirmer la notification\nelle va être supprimée";mod_ext="1";
break;
default:
Content="mod_nom:"+mod_nom;
break;
}
open_modale('confirm',title_confirm,Content,ch,mod_ext);
});
|image725|
Un clique sur la BL fait apparaitre le popup de confirmation
|image726|
- **Les styles css pour les notifications tel que la boite aux lettres**
.. code-block::
/* ping raspi, boite lettres, lastseen, info */
#ping_rasp{position: absolute;top: -180px;display: none;left: 150px;width:40px}
.bl{position: absolute;top: 20px;left: 620px;}
#bl{width: 40px;display:none;height: auto;}
.lastseen, .lastseen1{width: 140px;height: autopx;position: absolute;Top:5px;left: 185px;}
.lastseen1{top: 60px;}
.aff_info{width: 50px;height: auto;top:55px;left:10px;position: absolute}
.notif1{color:white;margin-top: 70px;margin-left: 180px;}
a#annul_notif1{color:white}
- **La variable Domoticz**
|image728|
- **Les tables sql**
. Variables dans la table « dispositifs »
|image729|
. La table « text_image »
|image730|
Après confirmation de la relève, la confirmation de la maj de la variable Domoticz
|image731|
Domoticz(script dzvents) envoie par MQTT la confirmation de la mise à zéro de la variable boite lettres
.. code-block::
-- script notifications_autres
return {
on = {
variables = {'boite_lettres'}
},
execute = function(domoticz, variable)
domoticz.log('Variable ' .. variable.name .. ' was changed', domoticz.LOG_INFO)
if (domoticz.variables('boite_lettres').changed) then
if (domoticz.variables('boite_lettres').value == "0") then
print("topic envoyé : esp/in/boite_lettres")
local command = "/home/michel/domoticz/scripts/python/mqtt.py esp/in/boite_lettres valeur 0 >> /home/michel/esp.log 2>&1" ;
os.execute(command);
end
end
end
}
13.4 Surveillance du PI par Domoticz
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|image733|
.. note:: Voir cette page : http://domo-site.fr/accueil/dossiers/44
- **Les tables SQL "text_image" et "variables_dz"**
|image734|
|image735|
C'est le script JS ,
- **maj_services** qui gère l’affichage de la page d’accueil
|image736|
- **Domoticz** , DZEvent « notifications_devices »
A partir de l’info du matériel « **System Alive Checker** » , la variable « pi-alarme » est modifié
|image737|
.. code-block::
return {
on = {
devices = {
'Ping_pi4',
}
},
execute = function(domoticz, device)
domoticz.log('device '..device.name..' was changed', domoticz.LOG_INFO)
if (device.name == 'Ping_pi4' and device.state=='Off' and domoticz.variables('pi-alarme').value == "0") then
domoticz.variables('pi-alarme').set("pi_hs")
domoticz.variables('variable_sp').set("1")
txt='alarmeùpiùhs';obj='alarme pi hs'alerte_gsm(txt);domoticz.email('Alarme',obj,adresse_mail)
elseif (device.name == 'Ping_pi4' and device.state=='On' and domoticz.variables('pi-alarme').value == "pi_hs") then
domoticz.variables('pi-alarme').set("0")
txt='alarmeùPIùdeùnouveauùOK';obj='alarme PI de nouveau OK'alerte_gsm(txt);domoticz.email('Alarme',obj,adresse_mail)
end
--
- **monitor** *page "nagios"*
c’est le script JS « maj_devices(plan) » qui gère le changement de couleur de l’icône, à partir du dispositif dans Domoticz
|image740|
13.5 Capteur de pression chaudière
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
*Réalisé avec un microcontrôleur Wemos D1 : pour la partie réalisation du capteur, voir le site web : domo-site.fr*
|image741|
- Envoie les données de pression sur le serveur MQTT
- Domoticz récupère et traites les données
- Monitor affiche en temps réel les données, l’historique des données, un graphique ,...
|image742|
13.5.1 l’image SVG
==================
Elle est ajoutée à **interieur.php** (ci-dessous) et **accueil.php** (ci-dessus)
|image743|
- **Accueil.php**
.. code-block::
.. admonition:: **Pour annuler l'alarme**
|image747|
- **footer.php**, la fenêtre modale est déjà utilisée pour la boite aux lettres, ajout d’une variable « ch=0 pour la BL et ch=1 pour la pression chaudière
|image745|
.. important:: **Une variable doit être créée dans Domoticz**, *voir le paragraphe suivant*
_ **L’image SVG** dans include/chaudiere_svg.php
.. code-block::
.. warning:: **Pour la notification (chaudière rouge en page d’accueil) :
- créer la même image mais avec l'extension "svg" au lieu de "php"
- supprimer les dernières lignes
|image749|
chaudiere_svg.php:
|image750|
13.5.2 Dans Domoticz, le capteur, le plan, les variables et les scripts
=======================================================================
- **le capteur**
|image752|
.. error:: **Pour éviter des erreurs comme celles-ci**
|image753|
L’envoie des données doivent être un tableau json de cette forme :
|image651|
*Le topic est « domoticz/in »*
- **Le plan**
*Le capteur est ajouté au plan pour une communication automatique avec Monitor ou toute autre application, les données sont récupérées dans un fichier json*
|image756| |image757|
- **Le fichier json** appelé par la fonction « devices_plan » , voir le § :ref:`1.3.5 les scripts JavaScript`
|image758|
.. admonition:: **Enregistrer les valeurs dans la BD SQL**
- Le **script export_sql.lua**
Pour n’envoyer à la BD que les changements de pression (pour limiter le nombre d’enregistrements) , il faut :
. Soit créer une user variable
. Soit utiliser une donnée persistante, solution retenue ici
|image759|
Le script : les lignes à ajouter pour l’enregistrement dans la BD et le déclenchement d’une alarme
.. code-block::
package.path = package.path..";www/modules_lua/?.lua"
require 'datas'
require 'string_tableaux'
function write_datas(data)
f = io.open("www/modules_lua/datas.lua", "w")
f:write("pression="..data)
f:close()
end
elseif (deviceName=='pression_chaudière') then
pressionch=tonumber(deviceValue);
print ("pression_chaudiere:"..pressionch.."--"..pression);
if (pression~=pressionch) then
libelle="pression_chaudiere#valeur";don=" "..libelle.."#"..tostring(deviceValue).."#"..datetime
envoi_fab(don)
--donnees['pression']=tonumber(deviceValue)
write_datas(tonumber(deviceValue),data1)
--pression_chaudiere: variable du fichier 'string_tableaux'
if (pressionchP Max0kW
- **La BD**
|image779|
.. admonition:: **Explications pour explode(concerne le PHP)**
*Data concerne 6 éléments* , :darkblue:`fonctions devices_plan() et pour_data()`
|image780|
Pour n’afficher que le 5eme élément on utilise dans une fonction PHP « explode »
Explode renvoie un tableau de chaînes, chacune étant une sous-chaîne limitée par un séparateur, ici un point-virgule.
|image781|
.. important:: :red:`Contrairement à LUA, en PHP les tables commencent à 0 : 4 = table[4 ]= 5eme champ`
.. note::
Data a été utilisé car c'est le cas avec l'API pour beaucoup de dispositifs mais Counter et Usage peuvent aussi être utilisé dans l'utilisation des compteurs.
c'est d'ailleurs counter et usage qu'i faut utiliser avec DzVent, voir le § :ref:`13.7.1 enregistrement dans la BD SQL` , ci dessous
|image256|
13.7.1 enregistrement dans la BD SQL
====================================
- **Créer la table**
.. code-block::
CREATE TABLE `energie` (
`num` int(4) NOT NULL,
`date` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`conso` varchar(10) NOT NULL,
`pmax` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `energie` CHANGE `num` `num` INT(4) NOT NULL AUTO_INCREMENT, add PRIMARY KEY (`num`);
*La table possède 2 valeurs aussi le champ « valeur » ne peut être utilisé , 2 champs distincts sont créés*
- **Domoticz** , *graphique.php*
Depuis la mise à jour 2023-2 de Domoticz , DeviceValue ne peut plus être utilisé aussi le script lua a été réécrit en dzvent: :darkblue:`export_timer_sql`
*Comme c'est la consommation de la veille qui est affichée , il suffit donc de choisir à quelle heure enregistrer ces paramètres.*
|image782|
voir également le paragraphe :ref:`6.2.1 fabric`
- **monitor**
|image784|
|image785|
|image786|
Pour ajouter un historique de la consommation :
|image787|
13.8 Pont HA (ha-bridge)
^^^^^^^^^^^^^^^^^^^^^^^^
https://github.com/bwssytems/ha-bridge
ha-bridge est un logiciel qui simule sur votre ordinateur un pont Philips Hue
.. admonition:: **fonction du pont**
extrait du readme de github :
Émule l’API Philips Hue à d’autres passerelles domotiques telles qu’Amazon Echo/Dot ou d’autres systèmes prenant en charge la découverte de réseau local Philips Hue.
:darkblue:`Le ha-bridge ne fait pas partie de meethue.philips.com donc la connexion cloud ne s’applique pas à ce système. Le pont gère les commandes de base telles que les commandes « On », « Off », « Brightness » et « Color » du protocole hue. Ce pont peut
contrôler la plupart des appareils qui ont une API distincte.`
13.8.1 Installation dans un conteneur LXC Proxmox
=================================================
Vous pouvez l’installer comme moi dans un conteneur LXC (debian12 standart) ou dans une VM, le programme java est léger.
|image1077|
Comme pour les autres VM et CT on installe sudo et l'on crée un utilisateur avec des droits.
Après **apt update & apt upgrade**:
|image1078|
.. code-block::
usermod -aG sudo
Java 8 ou > doit être installé , pour debian12 un package existe , java 17:
.. code-block::
apt install default-jdk -y
|image1079|
.. admonition:: **Téléchargement & Installation de ha-bridge**
*https://github.com/bwssytems/ha-bridge/releases* , choisir la version java 11
|image1088|
.. code-block::
mkdir ha-bridge
cd ha-bridge
wget https://github.com/bwssytems/ha-bridge/releases/download/v5.4.1RC1/ha-bridge-5.4.1-java11.jar
**Création du service systemd** :darkblue:`nano /etc/systemd/system/ha-bridge.service`
.. note:: **Il faut choisir le port**
le port 80 est nécessaire pour Alexa et il n'est pas pas utilisé sur mon installation domotique, sont utilisés 8084(zigbee2mqtt), 8086 (dz), 8090(dvr), 8091(Zwavejs), 8123(HA)
.. code-block::
[Unit]
Description=HA Bridge
Wants=network.target
After=syslog.target network-online.target
[Service]
Type=simple
WorkingDirectory=/opt/habridge
ExecStart=/usr/bin/java -jar -Dconfig.file=/etc/habridge/habridge.config /opt/habridge/ha-bridge-5.4.1-java11.jar
Restart=on-failure
RestartSec=10
KillMode=process
[Install]
WantedBy=multi-user.target
**activation du service**
.. code::
systemctl daemon-reload
systemctl start ha-bridge.service
systemctl enable ha-bridge.service
.. important:: si le port est différent de 80 , ajouter dans ExecStart : :darkblue:`-Dserveur.port=`
13.8.2 Le serveur de ha-bridge
==============================
On récupère l'ip :
|image1080|
On ouvre la page d'accueil du serveur dans un navigateur, ici :darkblue:`http://192.168.1.14/`
|image1081|
*Come indiqué précédemment, Google Home et Alexa exigent que le pont réponde sur le port 80. Si le port 80 est déjà utilisé, il faut utiliser les fonctions de proxy de Nginx pour rediriger les urls concernant ha-bridge vers un port non utilisé par exemple 8088.*
.. important:: **Vérifier qu'il ne soit pas déjà utilisé**
si 80 est utilisé :
Le fichier de configuration :darkblue:`/etc/nginx/conf.d/habridge.conf`
.. code-block::
location / {
proxy_pass http://192.168.1.14:8088;
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://192.168.1.14:8088/api;
}
13.8.2.1 accès distant
""""""""""""""""""""""
.. code-block::
upstream pontha {
server 192.168.1.14; }
server {
server_name pontha.;
location / {
proxy_pass http://pontha;
proxy_set_header Host $host;
proxy_connect_timeout 30;
proxy_send_timeout 30; }
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/pontha./fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/pontha./privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot}
server {
if ($host = pontha.) {
return 301 https://$host$request_uri; }
listen 80;
server_name pontha.;
return 404; # managed by Certbot}
La demande de certificat Let'sEncrypt:
.. code-block::
sudo certbot --nginx -d pontha.
|image1138|
13.8.3 Enregistrement d'Alexa & Domoticz dans le pont
=====================================================
|image1082|
|image1083|
|image1085|
Sauvegarder la configuration
|image1086|
Il suffit d'actualiser la page et un nouvel onglet pour Domoticz est disponible avec la liste des dispositifs
|image1087|
13.8.3.1 Les dispositifs et les actions
"""""""""""""""""""""""""""""""""""""""
Exemple avec les interrupteurs virtuels de l'alarme d'absence et de l'alarme de nuit
.. note::
J'ai choisi ces dispositifs pour les essais car en déconnectant la sirène , à part quelques SMS, rien ne perturbe le quotidien , pas d'allumage ni extinction de lumière; mais :red:`IL NE FAUT PAS ARRÊTER L'ALARME AVEC L'ASSISTANT VOCAL`
Ajout du premier dispositif :
|image1089|
|image1090|
|image1091|
Il en sera de même pour tous les dispositifs
13.8.4 Ajouter Ha-bridge dans le matériel Domoticz
==================================================
Sur le serveur Ha-bridge, utiliser le "link button"
|image1098|
Dans Domoticz, cliquer sur "**register on bridge**" et ajouter le pont
|image1099|
Des nouveaux dispositifs sont crées:
|image1139|
13.8.5 détection des nouveaux appareils par Alexa
=================================================
j' ai utilisé un émulateur Android gratuit pour les essais
|image1105| https://www.bluestacks.com/fr/index.html
Dans HA bridge, renuméroter les dispositifs et associer les appareils en appuyant sur "lien"
|image1100|
Dans l'application Alexa : Ajouter un appareil
|image1102|
Choisir Philips HUE
|image1103|
|image1104|
Découverte des appareils:
|image1106|
|image1101|
|image1107|
Il ne reste plus qu'à configurer les appareils
|image1108|
13.8.6 Intégrer le Pont Hue à Monitor
=====================================
Les fichiers concernés:
- **admin/config.php**
.. code-block::
define('ON_HABRIDGE',true);// mise en service Ha-bridge(Pont HUE)
define('IPHABRIDGE', 'http://192.168.1.14');// port 80 obligatoire ou ProxyPass
define('URLHABRIDGE', 'https://habridge.');
- **Les styles**
.. code-block::
#murinter,#app_diverses,#graphiques,#admin, #zigbee, #zwave, #dvr, #nagios,#spa,#recettes, #habridge{
width: 100%;height: 1120px;padding: 80px 0;min-height: 100%;position: relative;color: #000;
top: 350px;z-index:-20;overflow: auto;}
#interieur, #exterieur,#alarmes,#commandes,#murcam ,#murinter,#app_diverses,#admin, #zigbee, #zwave, #dvr,
#nagios,#spa,#recettes, #habridge{background-color: aquamarine;}
#habridgeapp{width: 750px;height: 700px;position: relative;top: 10px;}
@media (max-width:534px) {#habridgeapp{width: 500px;height: 600px;}}
- **index_loc.php**
.. code-block::
if (ON_HABRIDGE==true) include ("include/habridge.php");//pont hue Alexa
- **include/header.php**
.. code-block::
Pont HUE';?>
- **include/habridge.php**
.. code-block::