Partage
  • Partager sur Facebook
  • Partager sur Twitter

Surveillance bonne arrivée des données

Est il possible de surveiller que la base est bien mise à jour?

Sujet résolu
    9 mai 2022 à 14:13:19

    Bonjour, encore une question de débutant, je n'ai pas trouvé grand chose sur le sujet sur internet (surement une mauvaise formulation de ma demande).

    Toujours ma table avec mes ruches...

    J'ai donc maintenant une seule table contenant les données reçues toutes les 3 à 4 mn par 5 Arduinos (envoie d'une série de données par chaque Arduino toutes les 3 à 4 mn).

    Ma recherche est :

    Est-il possible de faire en sorte (je ne sais pas si c'est au niveau de la base MariaDB, du serveur, ou du Raspberry) de surveiller que chaque Arduino envoie bien au moins une série de relevé au moins toutes les 5 mn (par exemple) afin de m'alerter s'il y a un problème.

    Je demande cela car le 08/05 j'ai eu une absence de mesures durant plusieurs heures sur 3 de mes 5 ruches...

    Avant j'avais 5 bases (une par ruche) à chaque fois que je regardais une ruche (donc une base) je voyais visuellement s'il me manquait plusieurs heures de relevés maintenant c'est plus compliqué, et puis il fallait quand même que je jette un (5) œil sur les bases...

    D'où ma question peut -on créer une surveillance de ce type?

    Si oui à partir de quoi et comment?

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      9 mai 2022 à 16:30:38

      Bonjour,

      Selon quel critères détermines-tu qu'il y a un problème ?

      Et comment voudrais-tu être averti ?

      -
      Edité par Benzouye 9 mai 2022 à 16:31:04

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        9 mai 2022 à 20:29:14

        Ben chaque ruche envoi une série de mesure toutes les 4 minutes, je ne sais pas trop ce qu'il est possible de faire..

        L'idéal serait un truc du genre surveillance que dans les 10 dernières minutes chaque ruche ai au moins une fois (puisqu'en théorie au moins 2 fois) rempli la base, pour l'alerte , un email, un sms,.... je ne sais vraiment pas trop ce qu'il est possible de faire.

        Dans mon problème du 8/5 (je dois encore éplucher les journaux de bord des Arduinos) 3 ruches sur 5 n'ont pas communiqués avec la base de donnée, et cela durant plusieurs heures c'est bizarre car normalement mes Arduino sont censés m'envoyer un email après 6 échecs dans la journée...

        Mais bon comme en ce moment les POP et IMAP de la poste sont en panne, j'ai du remplacer un peu en catastrophe mes messagerie par une orange....

        Voilà

        Merci

        Je viens d'éplucher les 3 journaux de bord c'est un truc hyper bizarre les 3 Arduinos (sans mode commun) se sont gelés (pas planté) du 07/05 vers 17h15-30 puis se sont remis normalement à fonctionner le 08/05 vers 5h57, tous les 3!

        Pas de reboot le seul cas ou cela pourrait se produire c'est que le HX711 qui fait la conversion analogique numérique du capteur de poids ne réponde pas. Cela gèle le programme sans plantage, simplement le programme attend une valeur... qui lorsqu'elle arrive continue normalement comme si de rien n'était c'est ce qu'indique mes journaux de bord...

        Encore un mystère de plus...

        Si j'avais été alerté j'aurais pu aller sur place et voir si l'afficheur local (LCD) était aussi en attente ce qui m'aurait permis de confirmer cette forte suspicion!

        Non seulement cela ne m'était jamais arrivé mais en plus 3 capteurs indépendant sur 5 en même temps aux mêmes horaires.... J'aurais dû jouer au loto...

        Merci

        -
        Edité par GillesMangin-Voirin 9 mai 2022 à 21:55:19

        • Partager sur Facebook
        • Partager sur Twitter
          10 mai 2022 à 9:55:58

          En toute rigueur il faut régler le problème à la source, c'est à dire côté Arduino. Vérifier si le shield (WiFi ou ethernet) fonctionne correctement et s'assurer du paramétrage SMTP pour l'envoi des emails.

          Toutefois, tu pourrais créer une tâche planifiée (cron sur linux ou tasks scheduler sur windows) qui exécuterai une requête SQL listant les ruches sans valeurs depuis plus de 10 minutes, et enverrai le résultat par email (SMTP à vérifier quand même).

          La requête pourrait être :

          SELECT
          	M1.id_ruche,
          	R.libelle,
          	M1.date_creation,
          	MIN( M2.date_creation ) AS date_suivante
          FROM
          	mesure M1
          		INNER JOIN ruche R
          			ON M1.id_ruche = R.id_ruche
          		INNER JOIN mesure M2
          			ON M1.date_creation < M2.date_creation
          			AND M1.id_ruche = M2.id_ruche
          GROUP BY
          	M1.id_ruche,
          	R.libelle,
          	M.date_creation
          HAVING date_suivante > M1.date_creation + INTERVAL 10 MINUTE
          ORDER BY
          	M1.id_ruche,
          	M.date_creation

          -
          Edité par Benzouye 10 mai 2022 à 9:56:22

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            10 mai 2022 à 15:21:49

            Merci

            J'ai fais  le point sur les Arduino.

            Je pense qu'à ce niveau le problème est insoluble car si le capteur poids ne répond pas cela ne génère pas d'erreur ou de dysfonctionnement ou de plantage.

            Cela ne fait qu'attendre la réception de l'information demandée et a ma connaissance on ne peut pas paramétrer un temps au bout duquel on passerait à la suite (gestion d'erreur au niveau de l'Arduino.

            Les autres capteurs des ruches sont surveillés et peuvent générer des erreurs que je gère et dont j'alerte par email, mais là l'Arduino attend la réponse du HX 77 et c'est tout il se" gèle" .

            Merci encore je vais de toute façon essayer de mettre en place cette tache et installer aussi l'envoi d'email par le Raspberry.

            j'ai vite fait testé la requête suivante :

            SELECT
                M1.id_ruche,
                M1.horodatage,
                MIN( M2.horodatage ) AS date_suivante
            FROM
                Telemesures_ruches M1
                    INNER JOIN Liste_ruches R
                        ON M1.id_ruche = R.id_ruche
                    INNER JOIN Telemesures_ruches M2
                        ON M1.horodatage < M2.horodatage
                        AND M1.id_ruche = M2.id_ruche
            GROUP BY
                M1.id_ruche,
                M1.horodatage
            HAVING date_suivante > M1.horodatage + INTERVAL 10 MINUTE
            ORDER BY
                M1.id_ruche,
                M1.horodatage

            J'ai enlevé libelle je ne sais pas à quoi cela correspondais

            Remplacé les variables date_creation par horodatage et le nom des tables (celle qui contient les mesures s'appelle chez moi telemesure_ruches et celle qui contient la liste des ruches s'appelle Liste_Ruches)

            Et dans group et order rajouté un 1 à M.horodatage sql me donnait des erreurs (dans PHP Admin)..

            La requête a du coup une syntaxe correcte, mais son chargement en cours n'en fini jamais... j'ai encore dû me planter

            Merci

            • Partager sur Facebook
            • Partager sur Twitter
              10 mai 2022 à 16:33:48

              GillesMangin-Voirin a écrit:

              son chargement en cours n'en fini jamais...

              Aïe ...

              Cette requête est gourmande par nature, car elle oblige MySQL à regarder pour chaque mesure pour chaque ruche toutes les mesures enregistrées après pour en trouver la première suivante (avec MIN). Comme ton système de mesure est très régulier (toutes les 4/5 min) le volume à traiter est rapidement très important.

              Un premier point pour en améliorer la rapidité est de mettre un INDEX sur la colonne horodatage (puisque l'on travaille fortement dessus).

              Ensuite, on peut retirer la jointure vers la table Liste_ruches puisque tu n'a pas besoin du libellé (c'était la colonne reprenant le nom, ou la désignation, de la ruche).

              Mais surtout, après réflexion, on s'en fout qu'une ruche n'a pas eu de mesure pendant plus de 10 minutes il y 3 semaines ... non ?

              On peut se poser la question autrement, en disant plutôt à MySQL : "Liste-moi les ruches pour lesquelles je n'ai pas de mesure depuis 10 minutes" :

              SELECT
              	M1.id_ruche,
              	MAX( M2.horodatage ) AS derniere_mesure
              FROM Telemesures_ruches M1
              GROUP BY
              	M1.id_ruche,
              	M1.horodatage
              HAVING MAX( M2.horodatage ) < NOW() - INTERVAL 10 MINUTE
              ORDER BY M1.id_ruche

              La requête est plus simple, pas d'auto-jointure, et se limite à l'heure actuelle ...

              C'est mieux non ?

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                10 mai 2022 à 17:22:26

                C'est mieux elle met 2.1s mais me sort 160500 points sur 215 500 points...

                J'ai du remplacer les M2.horodatage inconnu par des M1.

                SELECT
                    M1.id_ruche,
                    MAX( M1.horodatage ) AS derniere_mesure
                FROM Telemesures_ruches M1
                GROUP BY
                    M1.id_ruche,
                    M1.horodatage
                HAVING MAX( M1.horodatage ) < NOW() - INTERVAL 10 MINUTE
                ORDER BY M1.id_ruche

                Ne voyant pas l'intérêt de M1 j'ai essayé ceci :

                SELECT
                    id_ruche,
                    MAX(horodatage) AS derniere_mesure
                FROM Telemesures_ruches
                GROUP BY
                    id_ruche,
                    horodatage
                HAVING MAX(horodatage) < NOW() - INTERVAL 10 MINUTE
                ORDER BY id_ruche

                Cela n'a rien changé


                J'ai testé cette partie du code :

                SELECT
                    id_ruche,
                    MAX(horodatage) AS derniere_mesure
                FROM Telemesures_ruches

                cela retourne la dernière valeur temporel enregistré dans la table mais toujours avec l'id de la ruche 1 même si l'heure appartient à une autre ruche...

                si je remet la suite :

                SELECT
                    M1.id_ruche,
                    MAX( M2.horodatage ) AS derniere_mesure
                FROM Telemesures_ruches M1
                GROUP BY
                    M1.id_ruche,
                    M1.horodatage



                je retrouve mes  160 500 resultats..

                Merci

                • Partager sur Facebook
                • Partager sur Twitter
                  10 mai 2022 à 17:55:12

                  Non mais c'est moi qui vais trop vite ...

                  SELECT
                      M1.id_ruche,
                      MAX( M1.horodatage ) AS derniere_mesure
                  FROM Telemesures_ruches M1
                  GROUP BY M1.id_ruche
                  HAVING MAX( M1.horodatage ) < NOW() - INTERVAL 10 MINUTE
                  ORDER BY M1.id_ruche

                  Là on devrait être bon, à condition qu'il y ait bien une ruche sans mesure depuis plus de 10 minutes ...

                  -
                  Edité par Benzouye 10 mai 2022 à 17:55:27

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    10 mai 2022 à 21:25:52

                    Bon c'est effectivement vide du coup je rebranche ma ruche du bureau (la 6) pour tester!

                    Par contre lancer cette requête depuis la crontab c'est une chose mais comment récupérer un résultat non vide (avec du coup l'id_Ruche) pour générer une action (je pense l'envoie d'un email)?

                    Je te tiens au courant des que le test est fait!

                    Merci

                    PS: cela fonctionne la requête m'a trouvé le dernier point de ma ruche 6 à 22h15 il est 22h56

                    Super merci

                    Bon j'ai essayé aussi d'envoyer un mail pour préparer le terrain et comme d'habitude rien ne fonctionne bien du premier coup!

                    J'ai suivi ce post :

                    https://hotfirenet.com/blog/1704-envoyer-mail-depuis-le-raspberry-pi/

                    mais cela ne fonctionne pas pour certains oui pour d'autres (dont je vais parti non)

                    Lors de l’envoi de mon mail, j’obtiens cette erreur :
                    « Impossible d’expédier le message : Processus terminé avec un état de sortie non nul »

                    J'ai aussi regardé ce ce côté :

                    https://forum.ubuntu-fr.org/viewtopic.php?id=1490201

                    pour essayer de résoudre le soucis mais je n'ai encore pas réussi!

                    Bon je vais créer un post sur le sujet!

                    Merci

                    -
                    Edité par GillesMangin-Voirin 11 mai 2022 à 23:05:58

                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 mai 2022 à 10:42:10

                      Sur l'envoi d'email depuis RPi je ne pourrais pas t'aider ...

                      Par contre, crontab va appeler un script PHP, c'est ton serveur PHP qui exécute la requête SQL de détection des absences de mesure, je pense que c'est plutôt à PHP d'envoyer le mail, avec la fonction mail().

                      -
                      Edité par Benzouye 12 mai 2022 à 10:44:23

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        16 mai 2022 à 12:20:31

                        Bonjour, j'ai enfin réglé mon problème d'envoie d'email en changeant complétement de programme : j'utilise maintenant msmtp qui chez moi fonctionne bien avec la commande :

                         echo 'texte du message via mail' | mail adressemaildudestinataire@orange.fr

                        Mon interrogation suivante, maintenant que j'ai un requête pour déterminer le manque de données, la possibilité d'envoyer un email, comment intégrer tout cela dans un script exécuter par la crontab?

                        je suppose que c'est du python à utiliser dans le script.

                        Peux t'on mettre du code php dans un script ou faut-il réécrire complètement le sujet en python ou autre?

                        j'ai trouvé ce sujet mais jamais résolu... (enfin si solution trouvée jamais mise sur le site)

                        https://openclassrooms.com/forum/sujet/php-email-envoie-dun-email-avec-php

                        En résumé comment rédiger un script que la crontab lancerait tous les quart d'heures et en cas de résultat non nul sur la requête enverrais un email d'alerte contenant le numéro de la ruche qui n'a pas envoyé de données depuis plus de 10 mn?

                        Merci

                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 mai 2022 à 13:27:02

                          CRON est côté serveur.

                          Avec une tâche planifiée présente sur crontab tu peux appeler le programme de ton choix ... ce peut être python, PHP, ou n'importe quelle commande exécutable depuis le serveur.

                          Comme je te l'écrivais juste avant, vu que requête est traitée en PHP (la mécanique PDO est déjà en place), je pense judicieux de tout faire en PHP.

                          Une possibilité est de mettre dans crontab une commande PHP qui exécute un fichier alerte.php qui :

                          • se connecte à la BDD
                          • exécute la requête SQL de détection des "anomalies"
                          • traite le retour
                          • si besoin (existence d'anomalie), envoie un mail avec ce contenu

                          Exemple succinct :

                          <?php
                          $bdd = new PDO( ... );
                          
                          $requete = $bdd->query( '
                              SELECT
                                  M1.id_ruche,
                                  MAX( M1.horodatage ) AS derniere_mesure
                              FROM Telemesures_ruches M1
                              GROUP BY M1.id_ruche
                              HAVING MAX( M1.horodatage ) < NOW() - INTERVAL 10 MINUTE
                              ORDER BY M1.id_ruche'
                          );
                          
                          $alertes = $requete->fetchAll();
                          
                          if( count( $alertes ) ) {
                              // code pour construire le contenu du mail
                              $destinataire = '...';
                              $sujet = '[App Ruches] Anomalie du '.date( 'd/m/Y' );
                              $contenu = '...';
                              mail( $destinaire, $sujet, $contenu );
                          }

                          La commande à placer dans crontab est alors simplement :

                          php alerte.php

                          -
                          Edité par Benzouye 16 mai 2022 à 13:30:19

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            16 mai 2022 à 14:26:04

                            Salut, alors pour le moment les seuls script que j'ai fais sont en python du genre :

                            #!/bin/sh
                            
                            #https://www.geek-directeur-technique.com/2017/07/17/utilisation-de-mysqldump
                            
                            # configuration de l'utilisateur MySQL et de son mot de passe
                            
                            DB_USER="abeille"
                            DB_PASS="password"
                            
                            # configuration de la machine hébergeant le serveur MySQL
                            
                            DB_HOST="localhost"
                            
                            # Nom de la base à sauvegarder
                            DB_NAME="ruches"
                            
                            # Dossier racine de destination
                            #DEST_DIR="/media/pi/SAUVEGARDES"
                            
                            
                            #sous-chemin de destination
                            MAINTENANT=`date +%Y%m%d_%H%M`
                            
                            # Dossier racine de destination
                            DEST_DIR="/media/pi/SAUVEGARDES/""$MAINTENANT"
                            echo $DEST_DIR
                            
                            
                            # Fichier de destination
                            DEST_FILE="$DEST_DIR""/""$DB_NAME""_""$MAINTENANT"".zip"
                            echo $DEST_FILE

                            et pour envoyer un email je n'ai pas la fonction mail() pour le moment j'utilise cette commande : (depuis l'invite de commande)

                            echo "texte du message " | mail adressemaildudestintaire@wanadoo.fr

                            si je fais dans l'invite de commande :

                            mail adressemaildudestintaire@wanadoo.fr je peux rentrer d'autres destinataires (CC) le titre du mail puis le corps du mail et enfin ctrl-D pour envoyer le tout!

                            Il va falloir que je vois si je peux traduire cela en PHP j'ai vite fais testé ceci :
                            // Envoi du mail
                            mail('caffeinated@example.com''Mon Sujet'$message);
                            cela ne fonctionne pas (exemple de la fonction mail())
                            Merci
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 mai 2022 à 15:18:35

                              GillesMangin-Voirin a écrit:

                              les seuls script que j'ai fais sont en python

                              Tu parles de script shell, mais tu as fais plein de scripts PHP, tout ton site est en script PHP ...

                              Cela te gênerai que ton script shell, lance un script PHP (comme évoqué plus haut) ?

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                16 mai 2022 à 18:35:25

                                Non cela ne me gène pas du tout. 

                                C'était juste qu'il va surement falloir que je mélange un peu les deux car la fonction mail() php ne fonctionne pas actuellement j'ai eu et j'ai encore des soucis sur les mails ça fonctionne à moitié..

                                Merci 

                                Je te redis cela dès que j'aurais trouver comment envoyer des emails via php

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 mai 2022 à 23:59:41

                                  Si cela fonctionne en Python alors c'est possible aussi.

                                  Il suffit de transposer le code proposé plus haut de PHP vers Python, avec mysql.cursor au lieu de PDO.

                                  Et un script shell qui lance Python au lieu de PHP.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                    18 mai 2022 à 13:23:29

                                    ok merci pour le moment je suis sur un script python passé par piper pour l'envoi de mail il faut d'abord que je réussisse à le faire fonctionner...

                                    c'est pas encore gagné!

                                    merci

                                    A+

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      23 mai 2022 à 9:23:45

                                      Bonjour, à chaque petit pas en avant un gouffre s'ouvre devant moi et chaque fois que je pense tenir le bon bout un autre problème surgit!

                                      J'ai résolu l'envoi d'un mail je peux le faire "manuellement" : création d'un fichier contenant ceci :

                                      <?php
                                      // création du fichier d'envoie d'email
                                      
                                      $file = fopen("/home/pi/script/contenu_mail.ini", "a");
                                      fwrite($file,"DEST=adressemail du destinataire
                                      SUBJECT=Alerte
                                      TITLE=Alerte problème réception données ruche
                                      TEXT=Salut,<br>Ici le raspberry. C'est la ruche n° x Il y a un problème de réception de données!
                                      FILELIST=");
                                      
                                      fclose($file);
                                       
                                      ?>

                                      La suite logique était d'intégrer la requête de détection du problème pour lancer d'abord la création du mail puis son envoi!

                                      J'avais donc imaginé ceci :

                                      <?php
                                      
                                      // ouverture base de données ruches
                                      
                                      error_reporting(E_ALL);
                                      ini_set('display_errors', TRUE);
                                      ini_set('display_startup_errors', TRUE);
                                      
                                      /* Connexion à une base MySQL avec l'invocation de pilote */
                                      $dsn = 'mysql:dbname=ruches;host=127.0.0.1';
                                      $user = 'abeille';
                                      $password = 'password';
                                      
                                      
                                      try {
                                          $bdd = new PDO($dsn, $user, $password);
                                      // Activation des erreurs PDO
                                       $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                                      
                                      // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
                                      
                                       $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                                      	} catch (PDOException $e) {
                                          echo 'Connexion échouée : ' . $e->getMessage();
                                      							 }
                                      
                                      // requete de surveillance
                                      
                                      $reponse = $bdd->query("SELECT M1.id_ruche, MAX( M1.horodatage ) AS derniere_mesure FROM Telemesures_ruches M1 GROUP BY M1.id_ruche HAVING MAX( M1.horodatage ) < NOW() - INTERVAL 10 MINUTE ORDER BY M1.id_ruche");
                                      
                                      $donnees = $reponse->fetch();
                                      
                                      
                                      
                                      
                                      // création du fichier d'envoie d'email
                                      
                                      $file = fopen("/home/pi/script/contenu_mail.ini", "a");
                                      fwrite($file,"DEST=adresse mail du destinataire
                                      SUBJECT=Alerte
                                      TITLE=Alerte problème réception données ruche
                                      TEXT=Salut,<br>Ici le raspberry. C'est la ruche n° $donnees['id_ruche'] Il y a un problème de réception de données!
                                      FILELIST=");
                                      
                                      fclose($file);
                                      // puis déclenchement de l'envoi du mail...
                                       
                                      ?>


                                      Mais dès que j'ai rajouté du code à la première partie (même le $donnees['id_ruche'] dans le texte) cela ne fonctionne plus et en plus je ne sais pas trop comment suivre son exécution puisque là on est sur le Raspberry...



                                      Merci

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        23 mai 2022 à 9:49:14

                                        Bonjour,

                                        Ce script PHP est exécuté par CRON ?

                                        Tu peux quand même le lancer manuellement en accédant à l'URL correspondante. et voir si des erreurs sont affichées.

                                        Ensuite, le fichier .ini est-il généré ? Si oui que contient-il ?

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                          23 mai 2022 à 11:27:39

                                          Bonjour, je suis un idiot!

                                          en tentant de lancer directement le fichier php cela ne peut pas fonctionner!

                                          Si je passe par le script de lancement:

                                          #!/bin/bash
                                          
                                          # script de lancement du code php
                                          
                                          
                                          echo "Execution de surveillance_donnees.php"
                                          
                                          php -f surveillance_donnees.php
                                          
                                          echo "c'est fait!"
                                          
                                          echo"on envoie le mail"
                                          php -f /home/pi/script/sendmail_simple.php /home/pi/script/contenu_mail.ini


                                          ou via le pc en pointant sur le fichier surveillance_donnees.php c'est bon aussi

                                          Désolé pour cette mauvaise question (enfin tes remarques mon permis de trouver mon erreur)

                                          Du coup voici une autre question:

                                          lorsque je lance depuis mon PC via une page web j'obtiens le fichier suivant:

                                          DEST=adresse mail du destinataire

                                          SUBJECT=Alerte

                                          TITLE=Alerte problème réception données ruche

                                          TEXT=Salut,<br>Ici le raspberry. C'est la ruche n° 6 Il y a un problème de réception de données!

                                          FILELIST=

                                          c'est bon il y a bien le numéro de la ruche en défaut!

                                          Mais si je lance le même code depuis mon raspberry (via le script) voici le résultat:

                                          DEST=adresse mail du destinataire

                                          SUBJECT=Alerte

                                          TITLE=Alerte problème réception données ruche

                                          TEXT=Salut,<br>Ici le raspberry. C'est la ruche n° donnees['id_ruche'] Il y a un problème de réception de données!

                                          FILELIST=

                                          je n'ai plus le numéro de ruche.... comme si le code php précédent n'avait pas été executé!

                                          j'ai mis ceci dans la partie création du fichier :

                                          // création du fichier d'envoie d'email
                                          
                                          $file = fopen("/home/pi/script/contenu_mail.ini", "a");
                                          fwrite($file,"DEST=rolande.mangin@wanadoo.fr
                                          SUBJECT=Alerte
                                          TITLE=Alerte problème réception données ruche
                                          TEXT=Salut,<br>Ici le raspberry. C'est la ruche n° ".$donnees['id_ruche']." Il y a un problème de réception de données!
                                          FILELIST=");
                                          
                                          fclose($file);
                                          
                                          

                                          Bizarre cela fonctionne depuis la page web mais pas en direct...

                                          Merci

                                          -
                                          Edité par GillesMangin-Voirin 23 mai 2022 à 11:53:25

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            23 mai 2022 à 11:40:18

                                            Si tu rajoutes une pause dans ton script bash :

                                            #!/bin/bash
                                            echo "Execution de surveillance_donnees.php"
                                            php -f surveillance_donnees.php
                                            echo "c'est fait!"
                                            pause

                                            Que s'affiche-t-il ?

                                            Je te conseille de poster un nouveau sujet dans le forum PHP juste pour ce point là.

                                            -
                                            Edité par Benzouye 23 mai 2022 à 13:09:43

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                              23 mai 2022 à 13:52:10

                                              C'est bon maintenant j'avais surement dû oublier d'enregistrer des modifications...

                                              Sinon j'ai deux questions pour toi!

                                              La première comment faire pour qu'à chaque lancement de la tache de vérification donc de ta requête on ne renvoie pas un email si on l'a déjà fait car actuellement tant que la ruche n'a pas repris son émission vers la base il y a génération d'un email et cela à la fréquence de la crontab que j'envisage tous les quart d'heure... en résumé comment mémoriser l'info du bon envoi de l'email... pour au moins attendre soit 12h ou 24 h avant de repermettre l'envoi d'un email si on n'a toujours pas reçu de données (si entre temps la ruche a refonctionné la question ne se pose pas, sauf à effacer cette mémorisation).. 

                                              J'espère avoir été clair...pas sur...

                                              La deuxième est si plusieurs ruches ne peuvent mettre à jour la table comment gérer l'envoi d'un email par ruche ..

                                              j'envisageais une boucle du genre

                                              while ($donnees = $reponse->fetch())
                                              {
                                              $file = fopen("/home/pi/script/contenu_mail.ini", "a");
                                              fwrite($file,"DEST=radresse mail destinataire
                                              SUBJECT=Alerte ruche ".$donnees['id_ruche']."
                                              TITLE=Alerte problème réception données ruche
                                              TEXT=Salut,<br>Ici le raspberry. <br>C'est la ruche n° ".$donnees['id_ruche']." <br>Il y a un problème de réception de données.<br> Cela fait plus de 10 minutes qu'elle n'a rien émis!
                                              FILELIST=");
                                              
                                              fclose($file);
                                              
                                              }

                                              le seul (en fin je crois) soucis c'est que le fichier même s'il contient plusieurs ruches à alerter n'envoie que la dernière récupérée.

                                              Cela est du au fait que l'envoi de l'email est fait depuis le script et pas depuis le fichier php (je n'y arrive (pas encore))

                                              en effet le fichier peut contenir ceci: 

                                              DEST=adresse mail du destinataire
                                              SUBJECT=Alerte ruche 4
                                              TITLE=Alerte problème réception données ruche
                                              TEXT=Salut,<br>Ici le raspberry. <br>C'est la ruche n° 4 <br>Il y a un problème de réception de données.<br> Cela fait plus de 10 minutes qu'elle n'a rien émis!
                                              FILELIST=DEST=adresse mail du destinataire
                                              SUBJECT=Alerte ruche 6
                                              TITLE=Alerte problème réception données ruche
                                              TEXT=Salut,<br>Ici le raspberry. <br>C'est la ruche n° 6 <br>Il y a un problème de réception de données.<br> Cela fait plus de 10 minutes qu'elle n'a rien émis!
                                              FILELIST=

                                              Le programme d'envoi des emails ne prendra que les dernières entrées soit uniquement :

                                              DEST=adresse mail du destinataire
                                              SUBJECT=Alerte ruche 6
                                              TITLE=Alerte problème réception données ruche
                                              TEXT=Salut,<br>Ici le raspberry. <br>C'est la ruche n° 6 <br>Il y a un problème de réception de données.<br> Cela fait plus de 10 minutes qu'elle n'a rien émis!
                                              FILELIST=
                                              Le fichier de lancement du script contient ceci :
                                              #!/bin/bash
                                              
                                              # script de lancement du code php
                                              
                                              
                                              echo "Execution de surveillance_donnees.php"
                                              
                                              php -f surveillance_donnees.php
                                              
                                              echo "c'est fait!"
                                              
                                              echo "on envoie le mail"
                                              php -f /home/pi/script/sendmail_simple.php /home/pi/script/contenu_mail.ini
                                              
                                              sleep 10
                                              
                                              


                                              c'est cet ordre qui active l'envoie de l'email et l'effacement du fichier /home/pi/script/contenu_mail.ini. Il faudrait qu'il soit intégrer dans la boucle de préparation du fichier contenu_mail.ini Mais j'avoue une fois de plus ne pas savoir comment intégrer cette commande dans le code php...

                                              Merci

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                23 mai 2022 à 16:30:16

                                                GillesMangin-Voirin a écrit:

                                                comment faire pour qu'à chaque lancement de la tache de vérification donc de ta requête on ne renvoie pas un email si on l'a déjà fait

                                                Sur ce point là, je rajouterai une colonne date_email (de type DATETIME) dans la table des ruches. Je t'explique après comment s'en servir.

                                                GillesMangin-Voirin a écrit:

                                                si plusieurs ruches ne peuvent mettre à jour la table comment gérer l'envoi d'un email par ruche

                                                L'idée de la boucle est bonne, mais tu ne l'as pas bien mise en application ...

                                                Je te propose le code suivant pour répondre à tes deux interrogations :

                                                <?php
                                                error_reporting(E_ALL);
                                                ini_set('display_errors', TRUE);
                                                ini_set('display_startup_errors', TRUE);
                                                $dsn = 'mysql:dbname=ruches;host=127.0.0.1';
                                                $user = 'abeille';
                                                $password = 'password';
                                                
                                                try {
                                                	$bdd = new PDO($dsn, $user, $password);
                                                	$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                                                	$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                                                } catch (PDOException $e) {
                                                	echo 'Connexion échouée : ' . $e->getMessage();
                                                }
                                                
                                                $reponse = $bdd->query("
                                                	SELECT M1.id_ruche, MAX( M1.horodatage ) AS derniere_mesure
                                                	FROM
                                                		Telemesures_ruches M1
                                                			INNER JOIN Liste_ruches R
                                                				ON M1.id_ruche = R.id_ruche
                                                	WHERE
                                                		R.date_email IS NULL
                                                		OR R.date_email < NOW() - INTERVAL 1 DAY
                                                	GROUP BY M1.id_ruche
                                                	HAVING MAX( M1.horodatage ) < NOW() - INTERVAL 10 MINUTE ORDER BY M1.id_ruche
                                                ");
                                                $donnees = $reponse->fetchAll();
                                                
                                                if( count( $donnees ) ) {
                                                	$plusieurs = count( $donnees ) > 1;
                                                	$message = '<p>Salut,</p><p>Ici le raspberry.</p><p>Il y a un problème de réception de données pour '.( $plusieurs ? 'les ruches suivantes :</p>' : 'la ruche ' );
                                                	$message .= ( $plusieurs ? '<ul>' : '' );
                                                	
                                                	$requete = $bdd->prepare( "
                                                		UPDATE Liste_ruches
                                                		SET date_email = NOW()
                                                		WHERE id_ruche = ?;"
                                                	);
                                                	
                                                	foreach( $donnees AS $ruche ) {
                                                		$message .= ( $plusieurs ? '<li>' : '' ).$ruche['id_ruche'].' depuis '.$ruche['derniere_mesure'].( $plusieurs ? '</li>' : '' );
                                                		$requete->execute([$ruche['id_ruche']]);
                                                	}
                                                	$message .= ( $plusieurs ? '</ul>' : '</p>' );
                                                	
                                                	$file = fopen("/home/pi/script/contenu_mail.ini", "a");
                                                	fwrite($file,"DEST=adresse mail du destinataire
                                                	SUBJECT=Alerte
                                                	TITLE=Alerte problème réception données ruche
                                                	TEXT=$message
                                                	FILELIST=");
                                                	fclose($file);
                                                }

                                                Ce code liste les ruches qui n'ont pas de mesures depuis plus de 10 minutes ET qui n'ont pas de date_email depuis 24h (tu peux changer ce délai en modifiant la ligne 25 ci-dessus).

                                                Ensuite on boucle sur le résultat pour construire une variable $message qui dépend si une ou plusieurs ruches posent problème.

                                                Pour chacune, on fait une requête UPDATE sur la date_creation pour qu'elle ne ressorte pas avant 24h.

                                                Enfin on crée le fichier .ini avec le message consolidé.

                                                PS : Résoudre le problème d'envoi d'email avec PHP simplifierai quand même le truc :p

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                  23 mai 2022 à 20:17:27

                                                  J'arrive à envoyer des mails avec PHP mais PHP mailer... sur ce post tu verras une discussion sur le sujet :

                                                  https://openclassrooms.com/forum/sujet/comment-lancer-un-fichier-php-depuis-php#message-94526433

                                                  La fourchette m'appelle...(ma femme ) donc je ne vais pas regarder de suite ton code à fond, mais si j'ai bien compris en survolant le truc c'est que tu te sers de la table des listes des ruches pour stocker une variable temporelle d'envoi du dernier email je n'y aurais pas du tout pensé c'est astucieux!

                                                  Si j'ai bien compris lorsqu'on envoie l'email d'une ruche on écrit dans le champ date_email la date et l'heure du jour, du coup ce champ sera quasiment vide tout le temps !

                                                  Bon j'ai testé le code il y a un petit soucis dans la requête et dans la création du message .

                                                  En effet lors du lancement de la requête celle-ci m'a vu la ruche 1 sans envoie de données depuis aujourd'hui à 21:18 et plus de données ainsi que la ruche 6à cette même heure alors seul la ruche 6 n'envoie plus de données depuis plusieurs jours!

                                                  le fichier pour l'envoi de l'email contenait ceci :

                                                  DEST=rmail du destinatiare
                                                      SUBJECT=Alerte ruche
                                                      TITLE=Alerte problème réception données ruche
                                                      TEXT=<p>Salut,</p><p>Ici le raspberry.</p><p>Il y a un problème de réception de données pour les ruches suivantes :</p><ul><li>1 depuis 2022-05-23 20:56:24</li><li>6 depuis 2022-05-23 11:16:00</li></ul>
                                                      FILELIST=

                                                  voici quelques copies d'écran cela sera surement plus parlant:

                                                  données actuelle de liste ruches :

                                                  dernières valeurs rentrées dans télémesures ruches :

                                                  dernière mise à jour ruche 6 aujourd'hui à 11h16..

                                                  J'ai jeté un petit coup d'œil à ton code , peux tu m'expliquer un peu cette partie?

                                                  L'objectif est de remplir la variable $message avec différents messages selon les cas mais les

                                                  .= 

                                                   ? '<ul>' : ''
                                                  ...
                                                  if( count( $donnees ) ) {
                                                      $plusieurs = count( $donnees ) > 1;
                                                      $message = '<p>Salut,</p><p>Ici le raspberry.</p><p>Il y a un problème de réception de données pour '.( $plusieurs ? 'les ruches suivantes :</p>' : 'la ruche ' );
                                                      $message .= ( $plusieurs ? '<ul>' : '' );
                                                       
                                                  ......
                                                       
                                                      foreach( $donnees AS $ruche ) {
                                                          $message .= ( $plusieurs ? '<li>' : '' ).$ruche['id_ruche'].' depuis '.$ruche['derniere_mesure'].( $plusieurs ? '</li>' : '' );
                                                          $requete->execute([$ruche['id_ruche']]);
                                                      }
                                                      $message .= ( $plusieurs ? '</ul>' : '</p>' );

                                                  Merci

                                                  -
                                                  Edité par GillesMangin-Voirin 23 mai 2022 à 21:29:23

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    23 mai 2022 à 21:30:06

                                                    Si PHP mailer fonctionne, alors autant l'inclure dans le code PHP en lieu et place des lignes 48 à 54, et tu peux même conditionner l'UPDATE à la réussite de l'envoi de l'email...

                                                    Et oui, tu as bien compris pour le champ datetime.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                      23 mai 2022 à 22:17:21

                                                      oui c'est ce que je viens juste de faire : j'ai intégrer le code en supprimant tout ce qui ne sert plus (la création du fichier par exemple.

                                                      Je te mets le code brouillon car du coup dans ce code j'envoie juste un email sans tenir compte de ta requete qui demande encore les corrections évoquées ci dessus.

                                                      <?php
                                                      #Reçoit en entrée un fichier contenant tout le nécessaire pour envoyer l'email sans accès à la base de données.
                                                      require_once ("./libmail.php");
                                                      
                                                      
                                                      
                                                      
                                                      $dsn = 'mysql:dbname=ruches;host=127.0.0.1';
                                                      $user = 'abeille';
                                                      $password = 'bpassword';
                                                      
                                                      // paramètres de la messagerie
                                                      $SMTPSERVER="smtp.gmail.com";
                                                      $SMTPPORT="587";
                                                      $SMTPUSER="mon adresse mail";
                                                      $SMTPPASS="mon mot de passe";
                                                      $SMTPAUTH="y"; // ou n
                                                      $SMTPSECURE="tls"; // ou tls ou vide
                                                      $ACUSERECEPTION="N"; // ou Y
                                                      $DESTLIST=array("adresse mail du destinataire");
                                                      $COPYLIST=array();
                                                      $FROM="mon adresse mail";
                                                      
                                                      
                                                      
                                                      // fichier sendmail_simple.php
                                                      
                                                      
                                                      /*****************************
                                                         $tf=explode("|",$listefile);
                                                         $i=0;
                                                         foreach($tf as $fic) 
                                                         {
                                                      	   if (file_exists($fic) === false) { $fic=""; }
                                                      	   if ($fic!="") 
                                                      	   { 
                                                      			if (!in_array($fic,$result->ATTACHEMENTLIST)) $result->ATTACHEMENTLIST[$i]=$fic; $i++; 
                                                      		} 
                                                         }
                                                      
                                                      /*****************************
                                                      	if (($listefile!="") and (count($result->ATTACHEMENTLIST)==0))
                                                      	{
                                                      		$result->MSG=$listefile." ne contient pas de fichiers existant !\n";
                                                      		$result->CR=-2;
                                                      		return $result;
                                                      	}		   
                                                      		
                                                      	if (count($result->DEST)==0)
                                                      	{
                                                      		$result->MSG="DEST ne contient aucune adresse email valide\n";
                                                      		$result->CR=-2;
                                                      		return $result;
                                                      	}		   
                                                      		
                                                      	elseif ($result->SUBJECT=="")
                                                      	{
                                                      		$result->MSG="SUBJECT vide\n";
                                                      		$result->CR=-2;
                                                      		return $result;
                                                      	}	
                                                      
                                                      	elseif ($result->TEXT=="")
                                                      	{
                                                      		$result->MSG="Texte vide\n";
                                                      		$result->CR=-2;
                                                      		return $result;
                                                      	}		
                                                      	return $result;
                                                      
                                                      */
                                                      
                                                      
                                                      // ouverture base de données ruches
                                                      
                                                      error_reporting(E_ALL);
                                                      ini_set('display_errors', TRUE);
                                                      ini_set('display_startup_errors', TRUE);
                                                      
                                                      /* Connexion à une base MySQL avec l'invocation de pilote */
                                                      
                                                      
                                                      	
                                                      try {
                                                          $bdd = new PDO($dsn, $user, $password);
                                                      // Activation des erreurs PDO
                                                       $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                                                      
                                                      // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
                                                      
                                                       $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                                                      	} catch (PDOException $e) {
                                                          echo 'Connexion échouée : ' . $e->getMessage();
                                                      							 }
                                                      $reponse = $bdd->query(" SELECT M1.id_ruche, MAX( M1.horodatage ) AS derniere_mesure
                                                          FROM Telemesures_ruches M1 INNER JOIN Liste_ruches R ON M1.id_ruche = R.id_ruche
                                                          WHERE R.date_email IS NULL OR R.date_email < NOW() - INTERVAL 1 DAY
                                                          GROUP BY M1.id_ruche HAVING MAX( M1.horodatage ) < NOW() - INTERVAL 10 MINUTE ORDER BY M1.id_ruche ");
                                                          
                                                      $donnees = $reponse->fetchAll();
                                                       
                                                      if( count( $donnees ) ) {
                                                          $plusieurs = count( $donnees ) > 1;
                                                          $message = '<p>Salut,</p><p>Ici le raspberry.</p><p>Il y a un problème de réception de données pour '.( $plusieurs ? 'les ruches suivantes :</p>' : 'la ruche ' );
                                                          $message .= ( $plusieurs ? '<ul>' : '' );
                                                         
                                                         // requete pour mémoriser dans le champ date_email la date et l'heure actuelle d'envoi de l'email  
                                                          $requete = $bdd->prepare( " UPDATE Liste_ruches SET date_email = NOW() WHERE id_ruche = ?;" );
                                                           
                                                          foreach( $donnees AS $ruche ) {
                                                              $message .= ( $plusieurs ? '<li>' : '' ).$ruche['id_ruche'].' depuis '.$ruche['derniere_mesure'].( $plusieurs ? '</li>' : '' );
                                                              $requete->execute([$ruche['id_ruche']]);
                                                          }
                                                          $message .= ( $plusieurs ? '</ul>' : '</p>' );
                                                          
                                                           // création du fichier d'envoie d'email
                                                       
                                                      
                                                          //$TEXT=$message;
                                                       
                                                         
                                                      }
                                                      
                                                       $SUBJECT="Alerte ruche ".$donnees['id_ruche'];
                                                      	$TITLE="Alerte problème réception données ruche";
                                                      	$TEXT="Salut,<br>Ici le raspberry. <br>C'est la ruche n° ".$donnees['id_ruche']." <br>Il y a un problème de réception de données.<br> Cela fait plus de 10 minutes qu'elle n'a rien émis!";
                                                       
                                                      
                                                      $tbto=array_merge($DESTLIST,$COPYLIST);
                                                      $hbody ="<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'><html>";
                                                      $hbody.="<head><title>".$TITLE."</title></head>";
                                                      $hbody.="<body>".$TEXT."<br><br>";
                                                      $hbody.="</body></html>";
                                                      $r=envoie_mail_secure($SMTPSERVER,$SMTPPORT,$SMTPUSER,$SMTPPASS,$SMTPAUTH,$SMTPSECURE,$DESTLIST,$FROM,$COPYLIST,$SUBJECT ,$hbody,$ATTACHEMENTLIST,$ACUSERECEPTION);
                                                      if ($r->CR!="0")
                                                      {
                                                      echo ($r->MSG);
                                                      //@unlink($infile);
                                                      }
                                                      else
                                                      {
                                                      echo ("Envoie réussi de ".$subject." à ".implode(";",$tbto)."\r\n");
                                                      }
                                                      	
                                                      
                                                      ?>
                                                      
                                                      

                                                      Merci

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        23 mai 2022 à 23:26:19

                                                        Comme ça vite fait la structure me paraît bonne, par contre ligne 124, $donnees['id_ruche'] n'existe pas ...

                                                        Il faut laisser le texte "générique".

                                                        <?php
                                                        require_once ("./libmail.php");
                                                        
                                                        $dsn = 'mysql:dbname=ruches;host=127.0.0.1';
                                                        $user = 'abeille';
                                                        $password = 'bpassword';
                                                        
                                                        $SMTPSERVER="smtp.gmail.com";
                                                        $SMTPPORT="587";
                                                        $SMTPUSER="mon adresse mail";
                                                        $SMTPPASS="mon mot de passe";
                                                        $SMTPAUTH="y"; // ou n
                                                        $SMTPSECURE="tls"; // ou tls ou vide
                                                        $ACUSERECEPTION="N"; // ou Y
                                                        $DESTLIST=array("adresse mail du destinataire");
                                                        $COPYLIST=array();
                                                        $FROM="mon adresse mail";
                                                         
                                                        error_reporting(E_ALL);
                                                        ini_set('display_errors', TRUE);
                                                        ini_set('display_startup_errors', TRUE);
                                                        
                                                        try {
                                                        	$bdd = new PDO($dsn, $user, $password);
                                                        	$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                                                        	$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                                                        }
                                                        catch (PDOException $e) {
                                                        	echo 'Connexion échouée : ' . $e->getMessage();
                                                        }
                                                        
                                                        $reponse = $bdd->query("
                                                        	SELECT M1.id_ruche, MAX( M1.horodatage ) AS derniere_mesure
                                                        	FROM Telemesures_ruches M1 INNER JOIN Liste_ruches R ON M1.id_ruche = R.id_ruche
                                                        	WHERE R.date_email IS NULL OR R.date_email < NOW() - INTERVAL 1 DAY
                                                        	GROUP BY M1.id_ruche HAVING MAX( M1.horodatage ) < NOW() - INTERVAL 10 MINUTE ORDER BY M1.id_ruche"
                                                        );
                                                        $donnees = $reponse->fetchAll();
                                                          
                                                        if( count( $donnees ) ) {
                                                        	$plusieurs = count( $donnees ) > 1;
                                                        	
                                                        	$SUBJECT="Alerte ruche";
                                                        	$TITLE="Alerte problème réception données ruche";
                                                        	$message = '<p>Salut,</p><p>Ici le raspberry.</p><p>Il y a un problème de réception de données pour '.( $plusieurs ? 'les ruches suivantes :</p>' : 'la ruche ' );
                                                        	$message .= ( $plusieurs ? '<ul>' : '' );
                                                        	
                                                        	$requete = $bdd->prepare( " UPDATE Liste_ruches SET date_email = NOW() WHERE id_ruche = ?;" );
                                                        	  
                                                        	foreach( $donnees AS $ruche ) {
                                                        		$message .= ( $plusieurs ? '<li>' : '' ).$ruche['id_ruche'].' depuis '.$ruche['derniere_mesure'].( $plusieurs ? '</li>' : '' );
                                                        		$requete->execute([$ruche['id_ruche']]);
                                                        	}
                                                        	$message .= ( $plusieurs ? '</ul>' : '</p>' );
                                                        	
                                                        	$tbto=array_merge($DESTLIST,$COPYLIST);
                                                        	$hbody ="<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'><html>";
                                                        	$hbody.="<head><title>".$TITLE."</title></head>";
                                                        	$hbody.="<body>".$message."</body></html>";
                                                        	$r=envoie_mail_secure($SMTPSERVER,$SMTPPORT,$SMTPUSER,$SMTPPASS,$SMTPAUTH,$SMTPSECURE,$DESTLIST,$FROM,$COPYLIST,$SUBJECT ,$hbody,$ATTACHEMENTLIST,$ACUSERECEPTION);
                                                        	if( $r->CR != "0" ) {
                                                        		echo $r->MSG;
                                                        	} else {
                                                        		echo "<p>Envoie réussi de ".$subject." à ".implode(";",$tbto)."</p>";
                                                        	}
                                                        }

                                                        -
                                                        Edité par Benzouye 24 mai 2022 à 9:05:38

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                          24 mai 2022 à 9:37:25

                                                          Bonjour, j'ai fini d'éplucher ton code et de le commenter un peu du coup cela a répondu à quelques unes de mes questions en particulier sur les.=,...

                                                          En fait tu concatènes le message au fur et à mesure.

                                                          Sinon pour une ruche cela fonctionne bien, je dois maintenant tester avec plusieurs mais pour cela il faut que j'aille sur le rucher couper une ruche...

                                                          Une dernière petite chose sur ce post avant de mettre le code final. Le format dans le message au niveau de la date est sous yy/mm/dd h:m:s comment le mettre en Français : dd/mm/jj h:m:s

                                                          Tu me l'avais fait sur cette requête :

                                                          $requete = $bdd->query('SELECT DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) AS horodatage,M.id_ruche,MH.temperature, ROUND(AVG(M.mas),2) AS poids
                                                          			FROM Telemesures_ruches M INNER JOIN (-- Moyennes temperature
                                                                          SELECT DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) AS point_horaire,
                                                                              	ROUND(AVG(tex),1) AS temperature FROM Telemesures_ruches WHERE horodatage >= NOW() - INTERVAL 20 DAY
                                                                         	 	GROUP BY DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) ) AS MH ON DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) = MH.point_horaire
                                                          			WHERE M.horodatage >= NOW() - INTERVAL 20 DAY GROUP BY DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ), M.id_ruche, MH.temperature
                                                          			ORDER BY DATE_FORMAT( M.horodatage, "%Y-%m-%d %H:00" ) DESC, M.id_ruche');

                                                          via DATE_FORMAT j'ai essayé dans cette requête :

                                                          $reponse = $bdd->query(" SELECT M1.id_ruche, DATE_FORMAT(MAX( M1.horodatage),"%d-%m-%Y %H:%i%s") AS derniere_mesure
                                                              FROM Telemesures_ruches M1 INNER JOIN Liste_ruches R ON M1.id_ruche = R.id_ruche
                                                              WHERE R.date_email IS NULL OR R.date_email < NOW() - INTERVAL 1 MINUTE
                                                              GROUP BY M1.id_ruche HAVING MAX( M1.horodatage ) < NOW() - INTERVAL 10 MINUTE ORDER BY M1.id_ruche ");

                                                          avec diverses syntaxe le MAX avant,... bon j'avoue cela ne tourne pas PHP me mets une erreur!

                                                          et du coup je me suis aperçu aussi que sur ma page données le format était encore en Anglais j'ai donc essayé de modifié comme suis la requête :

                                                          $reponse = $bdd->query("SELECT * , DATE_FORMAT( horodatage, "%d-%m-%Y %H:%i:%s " ) FROM Telemesures_ruches WHERE (id_ruche) = $NumRuche AND horodatage >= NOW() - INTERVAL 2 WEEK ORDER BY horodatage DESC");
                                                          

                                                          et aussi ceci :

                                                          $reponse = $bdd->query("SELECT * FROM Telemesures_ruches WHERE (id_ruche) = $NumRuche AND DATE_FORMAT( horodatage, "%d-%m-%Y %H:%i:%s" ) as horodatage >= NOW() - INTERVAL 2 WEEK ORDER BY horodatage DESC");
                                                          
                                                          

                                                          sans plus de réussite!



                                                          merci

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            24 mai 2022 à 11:41:36

                                                            Je ne sais pas si tu avais vu, mais j'ai reposté le code avec la libmail PHP juste au-dessus.

                                                            Pour les formats de date, c'est bien DATE_FORMAT qu'il faut utiliser, avec le MAX ça donne :

                                                            DATE_FORMAT( MAX( M1.horodatage ), "%d/%m/%Y %H:%i" ) AS derniere_mesure
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                              24 mai 2022 à 14:38:14

                                                              Salut, j'ai comparé les codes , tu as surtout fais une remise en forme et supprimé les .$donnees['id_ruche'].

                                                              Je n'avais pas eu hier soir le temps de le faire mais j'avais vu que cela ne pouvait plus aller avec la nouvelle requête... Tu as tout à fait raison.

                                                              Merci

                                                              A propos de la nouvelle requête j'ai essayé ceci :

                                                              // on exécute la variable de détection						 
                                                              $reponse = $bdd->query(" SELECT M1.id_ruche, DATE_FORMAT( MAX( M1.horodatage ), "%d/%m/%Y %H:%i" ) AS derniere_mesure
                                                                  FROM Telemesures_ruches M1 INNER JOIN Liste_ruches R ON M1.id_ruche = R.id_ruche
                                                                  WHERE R.date_email IS NULL OR R.date_email < NOW() - INTERVAL 1 MINUTE
                                                                  GROUP BY M1.id_ruche HAVING MAX( M1.horodatage ) < NOW() - INTERVAL 10 MINUTE ORDER BY M1.id_ruche ");

                                                              mais PHP me trouve une erreur sur cette ligne (comme lors de mes essais car j'avais dans mes nombreux essais essayé cette syntaxe...)

                                                              Alors une recherche en entraine une autre sur ma page données j'ai cette requête qui fonctionne  avec les guillements:

                                                              $reponse = $bdd->query("SELECT * FROM Telemesures_ruches WHERE (id_ruche) = $NumRuche AND horodatage >= NOW() - INTERVAL 2 WEEK ORDER BY horodatage DESC");


                                                              si je remplace les guillemets par ' elle ne fonctionne plus :

                                                              $reponse = $bdd->query('SELECT * FROM Telemesures_ruches WHERE (id_ruche) = $NumRuche AND horodatage >= NOW() - INTERVAL 2 WEEK ORDER BY horodatage DESC');

                                                              Je me demande pourquoi? sachant que d'autres requêtes comme celle-ci  fonctionnent bien :

                                                              $requete = $bdd->query('SELECT DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) AS horodatage, M.id_ruche, ROUND(AVG(M.mas),2) AS valeur
                                                              			FROM Telemesures_ruches M INNER JOIN Liste_ruches R ON M.id_ruche = R.id_ruche
                                                              			WHERE DATE(horodatage) BETWEEN CURRENT_DATE-50 AND CURRENT_DATE
                                                              			GROUP BY DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ), M.id_ruche ORDER BY DATE_FORMAT( M.horodatage, "%Y-%m-%d %H:00" ) DESC');

                                                              Je me suis aperçu de cela en cherchant pourquoi le date_format ne fonctionnait pas, je me suis dit que comme dans le format de sorti était entre guillemet il pouvait y avoir conflit d'où mon idée de remplacer les guillemets de la requête par des ' mais bon encore un bien mauvaise idée. Si ce n'est qu'avec ta futur réponse je vais encore apprendre quelque chose!
                                                               

                                                              merci

                                                              -
                                                              Edité par GillesMangin-Voirin 24 mai 2022 à 15:07:24

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Surveillance bonne arrivée des données

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown