1. Configuration minimum : la page d’accueil ******************************************** Permet d’afficher - La température extérieure, - Le jour (changement à 0H pour une tablette connectée en permanence), - La sortie des poubelles, - La gestion de la fosse septique, - La surveillance de la pression de la chaudière - Les anniversaires - Rappel pour la prise de médicaments - La prévision de pluie à 1 heure de Météo France - L’arrivée du courrier - La mise en service de l’alarme de nuit - Le remplacement des piles pour les capteurs concernés - Les dispositifs off line - etc .... |image117| 1.1 – Configuration :/admin.config.php ========================================== :red:`Il faut fournir un minimum de renseignements` : 1.1.1 -Adresse IP , domaine, favicon de monitor ----------------------------------------------- .. code-block:: //general monitor -->define('URLMONITOR', '');//domaine (pour accès distant) et port si différent de 443 -->define('IPMONITOR', '192.168.1.9');//ip define('PASSMONITOR', '*******');//mot passe serveur et SSH2 define('USERMONITOR', 'michel');//user serveur et SSH2 ;le répertoire perso sera /home/nom de USERMONITOR define('MONCONFIG', 'admin/config.php');//fichier config define('DZCONFIG', 'admin/dz/temp.lua');//fichier temp -->define('FAVICON', '/favicon.ico');//fichier favicon , icone du domaine dans barre url define('DISPOSITIFS', 'dispositifs'); define('ECRAN_ADMIN', array( // enable ou disable "connect_lua" => "enable", // Mots passe cryptés(Base64) et IP réseau "string_tableaux" => "enable",//Configuation variables dz maj_services "modect" => "enable", //Configuation modect dz alarmes "idx_dz_list" => "enable", //Créer fichier idx/nom Domoticz , LISTE "var_list" => "enable", //LISTE variables (HA et DZ) "mod_py_list" => "enable", //LISTE modules python dans monitor "idx_dz-zigbee" => "enable", //Créer fichier idx/nom Domoticz , TABLEAU zigbee "reboot_pi" => "enable", //Reboot Raspberry "msmtprc" => "enable", //msmtprc (config envoi mail) "connect_py" => "enable" // Maj automatique des IP depuis connect.py )); define('ON_SOS',true);// bouton sos page accueil, le disositif dit être enregistré dans SQL define('BASE64', 'admin/connect/connect.py');//login et password en Base64 pour dz,ha,iobroker .. note:: :red:`define('DISPOSITIFS', 'dispositifs');` Pour faciliter la réinitialisation des dispositifs dans Domoticz ou un transfert (ex, zwavejs2mqtt , zigbee2mqtt sous docker) ; en créant une copie de la table dispositifs (« dispositifs » par défaut), il est possible de préparer le transfert ; ici la table dispositifs a été renommée Dispositifs |image120| |image121| 1.1.1.a Pour l’image de fond suivant la résolution d’écran et le logo ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: // Monitor define('IMAGEACCUEIL', 'images/maison.webp');//image page accueil pour écrans >534 px define('IMAGEACCUEILSMALL', 'images/maison_small.webp');//image page accueil pour écrans <535 px define('IMGLOGO', 'images/logo.png');//image logo 1.1.1.b Pour les titres, slogans et lexique ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Pour le lexique : - true = lexique par défaut - false = lexique à modifier /include/lexique_no.php .. code-block:: define('NOMSITE', 'Domoticz');//nom principal du site define('NOMSLOGAN', xxxxxxxxxxx);//nom secondaire ou slogan // affichage lexique define('LEXIQUE', true); 1.1.2 intervalles de maj ------------------------ L’intervalle de mise à jour pour les services (poubelles, anniversaires,...) et les dispositifs, il peut être changé: - il est de ½ heure (1800000 milli secondes) pour les variables (services) - il est se 3Os pour les dispositifs avec un minimum de 5 secondes. .. code-block:: // interval de maj des fonctions JS maj_services() & maj_devices() define('TEMPSMAJSERVICES', 1800000);//interval maj services en milli secondes define('TEMPSMAJSERVICESAL', 180000);//interval maj services ALARME ABSENCE(si installée) en milli secondes define('TEMPO_DEVICES', 180000);// en milli secondes, rafraichissement programmé(dispositifs non prioritaires) define('TEMPO_DEVICES_D', 30000);// en milli secondes (>=5s, <30s) maj déclenchée par Dz ou Ha voir doc .. IMPORTANT:: Si define('SSE', true) = TEMP REEL , :red:`TEMPO_DEVICES_DZ est annulé` un serveur SSE doit etre installé ainsi qu'un script(léger) dans DZ ou(et) HA .. note:: *TEMPO_DEVICES* pour tous les dispositifs *TEMPO_DEVICES_D* :red:`SUPPRIMER dans la Version 4.1.3` ou **serveur SSE** pour les dispositifs qui doivent afficher leurs données en temps réel (voir le § suivant) 1.1.3 maj en temps réel ----------------------- 2 solutions : .. admonition:: SUPPRIME à partir de la version 4.1.3 **semi temps réel** , monitor interroge une variable mis à jour par Dz ou Ha lors d'un changement de valeur d'un dispositif; si la variable est à 1 monitor fait une mise à jour avec l'API des dispositifs et remet à 0 la variable.C'est la solution historique de monitor mais la solution SSE-php, incluse dans monitor est à privilégier.cette solution sera obsolète dans les prochaines versions - temps réel, en recevant de Domoticz ou Home Assistant, par un message depuis un SSE(Server-sent Events) , les données du dispositifs qui ont changées de valeur .. note:: **TEMPO_DEVICES_D** : avec la valeur dans config.php, rafraichissement des dispositifs toutes les 30 secondes pouvant être ramenée à 5 secondes ( si par exemple un PIR, un contact de porte, qui sont déclarés prioritaires dans DZ passent à ON) - Avantage : simplicité de mise en oeuvre , création d'une variable dans DZ ou HA et ajout d'une (ou plusieurs) ligne(s) de script (DzVent ou yaml). - Inconvénients : Retard dans la mise à jour de 5 secondes minimum , si 2 écrans (2 navigateurs sont connectés) la mise à jour est effective sur un seul des écrans ; le second écran sera mis à jour lors de la mise à jour cyclique. avec les groupes, les scènes ou automatisations ce retard du rafraichissement peut être désagréable. |image126| **Seveur SSE** pour l'installation d'un serveur node.js voir ce § :ref:'21.12 Serveur SSE Node JS' - Avantages : Vrai temps réel, économise de la bande passante; un serveur SSE PHP est déjà installé dans monitor , la création d'un script pour envoyer les données depuis DZ ou HA est simple; - Inconvénients : Installation d'un serveur JS pour la version SSE NodeJS ; .. IMPORTANT:: En https,pour des connexions distantes, il suffit de demander des certificats Let'encrypt; le serveur SSE-PHP installé dans monitor n'a pas besoin de certificat contrairement à un serveur SSE Node.JS 1.1.3.1 Solution semi temps réel ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :red:`Cette solution est obsolète et sera supprimée dans les futures version`. La fonction JS : .. code-block:: 30000) tempo_devices=30000; var_sp(idsp); function var_sp(idsp){ $.getJSON( "ajax.php?app=data_var&variable=29", function(data) { //console.log(data.var_dz); if (data.var_dz=="1"){maj_variable(29,"variable_sp",0,2);maj_devices(plan);maj_services(0);} if (data.message!="0"){maj_variable("msg",data.message,0,0);maj_services(0); } }); setTimeout(var_sp, tempo_devices, idsp); }';?> La fonction PHP qui récupère la valeur de la variable Domoticz: .. code-block:: // valeur d'une variable function val_variable($variable){ $result=array(); $L=URLDOMOTIC."json.htm?type=command¶m=getuservariable&idx=".$variable; $json_string = file_get_curl($L); $result = json_decode($json_string, true); $lect_var = $result['result'][0]; $value = $lect_var['Value']; return $value; } pour Home Assistant l' API monitor peut être utilisée. 1.1.3.2 Solution temps réel SSE ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Le serveur SSE-NodeJS voir § :ref:`21.12 Serveur SSE Node JS` Le serveur SSE-PHP voir ce § :ref:`18.10 Serveur SSE installé dans Monitor` .. note:: cette solution évite pour l'accès distant la demande d'un certificat pour https Pour SSE-node, l'IP, le port, sont à déclarer dans /admin/config.php. Pour SSE-php , indiquer le rafraichissement en secondes. .. code-block:: define('SSE', false);// node ou php si serveur SSE utilisé par monitor //pour SSE php define('SSE_SLEEP', 2);//raffraichissement en secondes // pour SSE node define('SSE_USER', "michel");//user et mot passe define('SSE_PASS', ""); define('SSE_URL', 'socket..ovh'); define('SSE_IP', '192.168.1.26');//adresse IP define('SSE_PORT', 3000);// .. note:: Port mqtt: 3000 les scripts JS dans footer.php: .. admonition:: **Client SSE PHP, solution incluse dans monitor:** voir ce paragraphe concernant le serveur :ref:`18.10 Serveur SSE installé dans Monitor` .. code-block:: if (SSE=='php') {echo " ";}?> .. admonition:: **Client SSE NodeJS:** .. code-block:: if (SSE=='node') {echo " ";} .. code-block:: function maj_mqtt(id_x,state,ind,level=0){ switch (ind) { case 0: for (attribute in maj_dev) { if (maj_dev[attribute]==id_x) var id_m=attribute; } var command=state; pp[id_m].Data=command; console.log(command) var sid1=pp[id_m].ID1;; var sid2=pp[id_m].ID2; var scoul_on=pp[id_m].coul_ON; var scoul_off=pp[id_m].coul_OFF; var c_l_on=pp[id_m].coullamp_ON var c_l_off=pp[id_m].coullamp_OFF var scoul="";var scoull=""; if (command=="On" || command=="on") {scoul=scoul_on;scoull=c_l_on;} else if (command.substring(0, 9)=="Set Level") {scoull=scoull=c_l_on;} else if (command=="Off" || command=="off" ) {scoul=scoul_off;scoull=c_l_off;} else return; document.getElementById(sid1).style = scoul; if (sid2) {document.getElementById(sid2).style = scoul;} var c_lamp= pp[id_m].class_lamp ;console.log("c_lamp="+c_lamp); if (command.substring(0, 9)=="Set Level") {var h=document.getElementById(sid1).getAttribute("h"); document.getElementById(sid1).setAttribute("height",parseInt((h*(level)/100))); console.log("h="+h+parseInt((h*(level)/100)));} break; case 1:scoull=state;c_lamp=id_x;console.log("c_lamp="+c_lamp); break; default: break; } if (c_lamp!="" && scoull!="") { var elements = document.getElementsByClassName(c_lamp); for (var i = 0; i < elements.length; i++) { var element = elements[i]; element.style=scoull;} } return; } **explications**: 2 parties dans ce script, la 1ère partie concerne la réception des évènements avec SSE (php ou node.js), la 2eme partie, la mise à jour des dispositifs |image906| 1.1.3.3 Solution temps réel MQTT Websocket ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Définir MQTT sur true dans admin/config.php et renseigner les données concernant le serveur MQTT |image1765| **Dans admin/footer.php** |image1770| Extrait du fichieru :darkblue:`admin/mqtt_js.php` & de la fonction & :darkblue:`maj_mqtt()` |image1771| |image1774| .. admonition:: **Exemple avec ioBroker** ioBroker.MQTT-CLIENT doit être installé |image1766| |image1767| - **Envoyer et recevoir des données** |image1768| Avec MQTTX |image1769| - **Sur la console** : |image1773| .. note:: Pour supprimer les messages conservés depuis mosquitto: .. code-block:: mosquitto_pub -h nom d’hôte -t 'sujet' -u nom d’utilisateur -P mot de passe -n -r -d |image1772| 1.1.3.4 Solution temps réel MQTT Z2m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Voir le paragraphe :ref:`9.5 utilisation directe avec monitor` La mise à jour est directe entre monitor et Zigbee2mqtt 1.1.4 Autres données -------------------- Choisir Idx de Domoticz ou idm de monitor ? .. note:: Pour une première installation avec Domoticz, choisir idx ; pour une réinstallation de Domoticz, il sera alors préférable de choisir idm pour éviter de renommer tous les dispositifs dans les images svg Pour une installation avec HA , idm , il n'existe pas d' Idx, choisir idm et laisser vide 'NUMPLAN'. *La création d’un plan qui regroupe les dispositifs sur Domoticz est nécessaire : noter le N° du plan (NUMPLAN)* .. code-block:: // choix ID pour l'affichage des infos des dispositifs // idx : idx de Domoticz (dans ce cas , // en cas de problème il faudra renommer tous les dispositifs // dans monitor au lieu de la DB) define('CHOIXID','idm');// DZ:idm ou idx ; HA : idm uniquement define('NUMPLAN','2');//DZ uniquement: n° du plan regroupant tous les capteurs Paramètres de la base de données : .. code-block:: // parametres serveur DBMaria define('SERVEUR','localhost'); define('MOTDEPASSE',''); define('UTILISATEUR','michel'); define('DBASE','monitor'); Paramètres pour Domoticz , HA ou IoBroker: .. code-block:: // Domoticz ou HA ou iobroker define('DOMOTIC', 'DZ');//domaine//DZ ou HA ou IOB ou "" (non utlisé) define('DOMOTIC1', 'HA');//DZ ou HA ou IOB ou "" define('DOMOTIC2', 'IOB');//DZ ou HA ou IOB ou "" // URL HTTPS define('URLDZ', 'https://domoticz.la-truffiere.ovh'); define('URLHA', 'https://ha.la-truffiere.ovh'); define('URLIOB', array( 0 => "https://iobroker.la-truffiere.ovh", // serveur config 1 => "https://iobweb.la-truffiere.ovh" )); // serveur web // define('IPDOMOTIC', '192.168.1.142');//ip define('USERDOMOTIC', 'michel');//user du serveur,répertoire :home/user define('PWDDOMOTIC', '');//mot passe serveur define('URLDOMOTIC', 'http://192.168.1.76:8086/');//url define('DOMDOMOTIC', 'https://*************');//domaine define('TOKENDOMOTIC', '');//TOKEN ou BEARER define('IPDOMOTIC1', '');//ip 2emme serveur Domotique define('USERDOMOTIC1', 'michel');//user du serveur,répertoire :home/user define('PWDDOMOTIC1', '');//mot passe serveur define('URLDOMOTIC1', 'http://192.168.1.5:8123/');//url ex:http://192.168.1.5:8123/ define('DOMDOMOTIC1', 'https://***********');//domaine define('TOKEN_DOMOTIC1',"eyJhb*****************************************************************2k"); define('IPDOMOTIC2', '192.168.1.162');//ip 3emme serveur Domotique define('USERDOMOTIC2', 'michel');//user du serveur,répertoire :home/user define('PWDDOMOTIC2', 'Idem4546');//mot passe serveur define('URLDOMOTIC2', 'http://192.168.1.162:8081/');//url ex:http://192.168.1.104:8081/ define('TOKEN_DOMOTIC2',""); define('PORT_API_DOMO2','8093');//port de l'API éventuel define('PORT_WEBUI_DOMO2','8082/vis-2/index.html');//port web UI et vis 2 et dossier éventuel //*************modules et constantes complémentaires Domoticz define('NUMPLAN','2');//DZ uniquement: n° du plan regroupant tous les capteurs define('VARTAB', 'admin/connect/string_tableaux.lua');// define('CONF_MODECT', 'admin/string_modect.json'); //*********** pour Iobroker define('OBJ_IOBROKER','zigbee2mqtt.0,yr.0.forecastHourly,worx.1');// séparer les objets par une virgule,yr.0.forecastHourly.0h //----------------------------------------------------------- // Sauvegardes domoticz define('FICVARDZ','var_dz');//fichier json sauvegarde des variables .. warning:: les variables ci-dessus , VARTAB, CONF_MODECT ne sont à déclarer ici que si elles sont utilisées dans un fichier Paramètres divers .. code-block:: //Constantes diverses //Raspberry define('IPRPI', '192.168.1.8');//IP du Raspberry define('LOGIN_PASS_RPI', ':'); define('MSMTPRC_LOC_PATH', '/var/www/html/monitor/scripts/');//copie config serveur mail define('MOD_PYTHON_FILE', '/var/www/monitor/admin/connect/mod.json');//liste des modules Python $file = '/var/www/monitor/admin/connect/connect.py';// ajout domaine dans connect.py $current = file_get_contents($file); if (str_contains($current, 'domaine')===false ){ $current = $current."domaine='".URLMONITOR."'\n"; // pour les maj file_put_contents($file, $current);} Le programme démarre avec 3 pages : - Accueil - Plan intérieur - Page d’administration, pour afficher cette page, le mot de passe est obligatoire : par défaut :red:`« admin »`. .. note:: *pour afficher d'autres pages existantes dans le programme, modifier la configuration.* - à partir de la page administration - avec un éditeur (le fichier à modifier: :green:'admin/config.php' Les autres pages concernent l’alarme, un mur de caméras, ... 1.2 - Les fichiers PHP, les styles, le javascript ===================================================== 1.2.1 - à la racine du site : ----------------------------- voir ce paragraphe : :ref:`0.4 Le serveur http de NGINX` **Complément d'informations concernant "fonctions.php":** voir le fichier à jour sur Github : https://raw.githubusercontent.com/mgrafr/monitor/main/fonctions.php Principales fonctions contenues dans ce fichier : .. admonition:: **function file_http_curl** |image134| 1.2.1.1 status_variables , devices_zone et device_plan ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. admonition:: **function status_variables** Pour récupérer les valeurs des variables de Domoticz et HA |image1181| |image135| |image136| .. admonition:: **fonctions maj_variable et sql_variable** |image138| |image1184| .. admonition:: **function devices_zone** API HA pour récupérer les valeurs des dispositifs |image137| .. admonition:: **function devices_plan et function sql_plan()** API Domoticz pour les devices : les dispositifs doivent être placés dans un plan; celui-ci peut se résumer à un rectangle ou un carré |image1414| |image139| |image1413| |image1328| |image140| .. important:: **plan Domoticz** Le mode plan consiste à définir des salles et y placer différents périphériques; l'avantage de ce mode c'est que l'api peut envoyer des données concernant tous les dispositifs dun plan. Plusieurs plans peuvent être crées mais l'un d'eux doit regrouper tous les dispositifs utilisés par monitor. |image943| **Maj de la date** si la tablette reste allumée en permanence,la date ne sera pas mise à jour en absence de rafraichissement On crée un maj_date=0 avec lequel la maj sera forcée (voir la fonction maj_devices(plan) dans footer.php) .. code-block:: $data[0] = ['jour' => date('d'), 'maj_date' => '0']; **Maj état des piles des dispositifs** .. code-block:: $abat="0"; if ($al_bat==0) $abat="batterie_forte"; if ($al_bat==1) $abat="batterie_moyenne"; if ($al_bat==2) $abat="batterie_faible"; $val_albat=val_variable(PILES[0]); if ($abat != $val_albat) maj_variable(PILES[0],PILES[1],$abat,2); 1.2.2 les styles css -------------------- |image141| https://raw.githubusercontent.com/mgrafr/monitor/main/css/mes_css.css https://raw.githubusercontent.com/mgrafr/monitor/main/css/jquery-ui.css Fichier mes_css.css , extrait : .. code-block:: /*interieur*/ #linky{position: relative;top: -250px;left: 600px;width: 60px;} #th_ext_cuis{position: relative;top: -747px; left: 170px; width: 50px;} #temp_ext_cuisine{font-size: 8px; color: black;} #voltage{position: absolute;top: -30px;right: -20px;width: 200px;} .meteo_concept_am {display: inline;width: 150px;margin-left: -20px;} #meteo_concept_am{position: relative;top: 20px;margin-left: -20px;} #meteo_concept{position: relative;top: 10px;} .image_met{width:80px;margin-left: -15px;} .icone_vent{width: 40px;margin-left: 0;margin-top: -20px;} .vvent{font-family: Arial;font-size: 15px;margin-left: 0; /* MediaQueries /* Large devices (Large desktops 768px and up) */ @media (min-width:768px) {img#cam1,img#cam2,img#cam3,img#cam4,img#cam5,img#cam6,img#cam7,img#cam8,img#cam9{width: 450px;} .modal-lg {width: 740px;}.cam {margin-left: 100px;}.fond_date {right: -270px;}body {max-width: 768px;margin: 0 auto;background-color: #79afbf;} .menu-link {left: 50%;top: 50px;}#bar_pression{top: -750px;left: 450px;}.txt_ext{left:100px;}.modal {left: -100px;} .modal_param {left: 200px; }.modal-dialog {width:740px;} } 1.2.2.1 styles CSS communs à toutes les pages ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: #interieur, #exterieur, #meteo, #alarmes,#commandes,#murcam ,#murinter,#app_diverses,#graphiques,#admin, #zigbee, #zwave, #dvr, #nagios,#spa,#recettes{ 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{ background-color: aquamarine;} 1.2.3 – Le javascript --------------------- 1.2.3 a - Les fichiers footer.php , voir ce script :ref:`1.3.5 les scripts JavaScript` 1.2.3 b - le fichier mes_js.js : scripts principaux , fichier complet : https://raw.githubusercontent.com/mgrafr/monitor/main/js/mes_js.js .. admonition:: **virtual keypad** .. code-block:: /*Minimal Virtual Keypad $(document).ready(function () { const input_value = $("#password"); var pwd,nameid; //disable input from typing $("#password").keypress(function () { return false; }); ....... |image1236| .. admonition:: **fenêtre modale BULMA** |image145| 1.3 Les fichiers principaux dans /include ========================================= 1.3.1 entete_html.php --------------------- https://raw.githubusercontent.com/mgrafr/monitor/main/include/entete_html.php .. code-block:: monitor-domoticz | by michel Gravier "> '; echo "test....BD: "; // Create connection $con = new mysqli(SERVEUR, UTILISATEUR, MOTDEPASSE); // Check connection if ($con->connect_error) { die("Pas de connexion au serveur: " . $con->connect_error);$_SESSION["exeption_db"]="pas de connexion à la BD";} else echo " connection au serveur OK , .."; $conn = new mysqli(SERVEUR, UTILISATEUR, MOTDEPASSE, DBASE); if ($conn->connect_error) { die("Verifier le nom de la BD: " . $conn->connect_error);$_SESSION["exeption_db"]="pas de connexion à la BD";} echo " connection à la BD OK , ..";$_SESSION["exeption_db"]=""; echo "connexion terminée , .."; ?> 1.3.3 le menu, header.php ------------------------- les pages configurées avec config.php sont ajoutées automatiquement au menu https://raw.githubusercontent.com/mgrafr/monitor/main/include/header.php Extrait: .. code-block::