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::
boite_lettres
- **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:: text id="text_chaudiere" transform="matrix(1 0 0 1 7 55)" class="st33 st36a">tmp .. 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 (pressionch P Max 0 kW - **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::

Pont HUE : Ha-bridge

|image1110| 13.9 Installation de Jupyter ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |image1199| Dans le terninal web, mise à jour de pip3 : .. code-block:: pip3 install --upgrade pip |image1200| 13.9.1 Installation du noyau & configuration ============================================ .. code-block:: pip3 install hass_pyscript_kernel jupyter pyscript install |image1201| |image1202| Avec nano, effectuer la configuration (le chemin du fichier est indiqué comme le montre l'image précédente): |image1203| 13.9.2 Quelques vérifications ============================= Vérifier que Jupyter reconnaît le nouveau noyau .. code-block:: jupyter kernelspec list |image1204| Vérifier le fichier de configuration: .. code-block:: jupyter pyscript info |image1205| 13.9.3 Exécution de Jupyter: Jupyter notebook ============================================= Contrairement au tutoriel (https://github.com/craigbarratt/hass-pyscript-jupyter/blob/master/README.md), Jupyter notebook ne se lance pas, j'ai du l'installer de nouveau en suivant la methode officielle: .. code-block:: pip3 install jupyter Lancer jupyter notebook: |image1207| .. |image256| image:: ../media/image256.webp :width: 433px .. |image257| image:: ../media/image257.webp :width: 438px .. |image699| image:: ../media/image699.webp :width: 423px .. |image700| image:: ../media/image700.webp :width: 650px .. |image703| image:: ../media/image703.webp :width: 642px .. |image704| image:: ../media/image704.webp :width: 644px .. |image705| image:: ../media/image705.webp :width: 601px .. |image706| image:: ../media/image706.webp :width: 642px .. |image707| image:: ../media/image707.webp :width: 659px .. |image710| image:: ../media/image710.webp :width: 500px .. |image711| image:: ../media/image711.webp :width: 474px .. |image712| image:: ../media/image712.webp :width: 450px .. |image713| image:: ../media/image713.webp :width: 392px .. |image714| image:: ../media/image714.webp :width: 614px .. |image715| image:: ../media/image715.webp :width: 514px .. |image716| image:: ../media/image716.webp :width: 414px .. |image717| image:: ../media/image717.webp :width: 485px .. |image718| image:: ../media/image718.webp :width: 700px .. |image719| image:: ../media/image719.webp :width: 650px .. |image720| image:: ../media/image720.webp :width: 416px .. |image721| image:: ../media/image721.webp :width: 85px .. |image722| image:: ../media/image722.webp :width: 85px .. |image725| image:: ../media/image725.webp :width: 639px .. |image726| image:: ../media/image726.webp :width: 455px .. |image728| image:: ../media/image728.webp :width: 700px .. |image729| image:: ../media/image729.webp :width: 700px .. |image730| image:: ../media/image730.webp :width: 650px .. |image731| image:: ../media/image731.webp :width: 533px .. |image733| image:: ../media/image733.webp :width: 533px .. |image734| image:: ../media/image734.webp :width: 335px .. |image735| image:: ../media/image735.webp :width: 430px .. |image736| image:: ../media/image736.webp :width: 650px .. |image737| image:: ../media/image737.webp :width: 650px .. |image740| image:: ../media/image740.webp :width: 623px .. |image741| image:: ../media/image741.webp :width: 142px .. |image742| image:: ../media/image742.webp :width: 478px .. |image743| image:: ../media/image743.webp :width: 500px .. |image745| image:: ../media/image745.webp :width: 550px .. |image746| image:: ../media/image746.webp :width: 352px .. |image747| image:: ../media/image747.webp :width: 413px .. |image749| image:: ../media/image749.webp :width: 371px .. |image750| image:: ../media/image750.webp :width: 650px .. |image752| image:: ../media/image752.webp :width: 496px .. |image753| image:: ../media/image753.webp :width: 601px .. |image756| image:: ../media/image756.webp :width: 292px .. |image757| image:: ../media/image757.webp :width: 279px .. |image758| image:: ../media/image758.webp :width: 700px .. |image759| image:: ../media/image759.webp :width: 400px .. |image651| image:: ../media/image651.webp :width: 474px .. |image760| image:: ../media/image760.webp :width: 700px .. |image762| image:: ../media/image762.webp :width: 605px .. |image764| image:: ../media/image764.webp :width: 700px .. |image765| image:: ../media/image765.webp :width: 700px .. |image766| image:: ../media/image766.webp :width: 700px .. |image767| image:: ../media/image767.webp :width: 571px .. |image768| image:: ../media/image768.webp :width: 650px .. |image772| image:: ../media/image772.webp :width: 444px .. |image773| image:: ../media/image773.webp :width: 414px .. |image774| image:: ../media/image774.webp :width: 483px .. |image775| image:: ../media/image775.webp :width: 389px .. |image776| image:: ../media/image776.webp :width: 650px .. |image777| image:: ../media/image777.webp :width: 432px .. |image778| image:: ../media/image778.webp :width: 525px .. |image779| image:: ../media/image779.webp :width: 700px .. |image780| image:: ../media/image780.webp :width: 437px .. |image781| image:: ../media/image781.webp :width: 700px .. |image782| image:: ../media/image782.webp :width: 700px .. |image784| image:: ../media/image784.webp :width: 650px .. |image785| image:: ../media/image785.webp :width: 490px .. |image786| image:: ../media/image786.webp :width: 530px .. |image787| image:: ../media/image787.webp :width: 602px .. |image1077| image:: ../media/image1077.webp :width: 313px .. |image1078| image:: ../media/image1078.webp :width: 605px .. |image1079| image:: ../media/image1079.webp :width: 700px .. |image1080| image:: ../media/image1080.webp :width: 601px .. |image1081| image:: ../media/image1081.webp :width: 605px .. |image1082| image:: ../media/image1082.webp :width: 700px .. |image1083| image:: ../media/image1083.webp :width: 700px .. |image1084| image:: ../media/image1084.webp :width: 605px .. |image1085| image:: ../media/image1085.webp :width: 622px .. |image1086| image:: ../media/image1086.webp :width: 571px .. |image1087| image:: ../media/image1087.webp :width: 700px .. |image1088| image:: ../media/image1088.webp :width: 363px .. |image1089| image:: ../media/image1089.webp :width: 564px .. |image1090| image:: ../media/image1090.webp :width: 700px .. |image1091| image:: ../media/image1091.webp :width: 700px .. |image1098| image:: ../media/image1098.webp :width: 450px .. |image1099| image:: ../media/image1099.webp :width: 635px .. |image1100| image:: ../media/image1100.webp :width: 550px .. |image1101| image:: ../media/image1101.webp :width: 400px .. |image1102| image:: ../media/image1102.webp :width: 650px .. |image1103| image:: ../media/image1103.webp :width: 450px .. |image1104| image:: ../media/image1104.webp :width: 400px .. |image1105| image:: ../media/image1105.webp :width: 196px .. |image1106| image:: ../media/image1106.webp :width: 550px .. |image1107| image:: ../media/image1107.webp :width: 550px .. |image1108| image:: ../media/image1108.webp :width: 550px .. |image1110| image:: ../media/image1110.webp :width: 533px .. |image1138| image:: ../media/image1138.webp :width: 647px .. |image1139| image:: ../media/image1139.webp :width: 700px .. |image1199| image:: ../media/image1199.webp :width: 200px .. |image1200| image:: ../media/image1200.webp :width: 700px .. |image1201| image:: ../img/image1201.webp :width: 319px .. |image1202| image:: ../img/image1202.webp :width: 650px .. |image1203| image:: ../img/image1203.webp :width: 7000px .. |image1204| image:: ../img/image1204.webp :width: 510px .. |image1205| image:: ../img/image1205.webp :width: 568px .. |image1207| image:: ../img/image1207.webp :width: 650px