Skip to content

Journal de bord

Mercredi 27 mars

8H Explication de M.Garcia sur comment allait se passer le stage.

10H J'ai réussi à faire fonctionner le pico w en autonomie et il envoie les données du DHT22 au raspberry via wifi

Graphique Grafana
Figure 95 — Graphique Grafana

11H Création du git https://gitlab.ictge.ch/jules-flr/beekeeper-compass

13H Création de l'architecture du rapport final

15H Tester de récupérer les données de la batterie qui est sur le pico W

16H J'ai réussi à récupérer le pourcentage de batterie et à l'afficher.

Graphique Grafana
Figure 96 — Graphique Grafana

Mercredi 28 mars

Aujourd'hui je vais essayer de récupérer les données dans mon application Flask.

8H Création de la connexion avec le Db

influxDbClient = InfluxDBClient(INFLUXDB_HOST, 8086, 'juju','SuperJules', 'hive_bucket') 

Lorsque je fais une requête j'ai cette erreur qui survient "influxdb.exceptions.InfluxDBClientError: 401: {"code":"unauthorized","message":"Unauthorized"}"

L'erreur vient que quand je crée une requête.

9H M.Bonvin est venu nous voir pour des questions potentielles.

11H après de multiples tests je suis venu a la conclusion que l'erreur vient des permissions de l'utilisateur j'ai donc modifier les permissions de l'utilisateur, de crée un nouvel utilisateur, mais rien ne fonctionne.

12H J'ai changé de tache pour cette aprèm et j'ai essayé de configurer LoRaWan sur le pico W et sur le Raspberry pour se faire j'utilise le site The Things Networks

13H Durant la création d'un nouveau end-device j'ai été bloqué sur le JoinEUI qui se trouve lors de l'installation de la GateWa. Je me suis donc attaqué a l'installation de la GateWay sur le raspberry.

Installation end-device
Figure 97 — Installation end-device

15H Erreur lors du lancement de la GateWay

Erreur lancement GateWay
Figure 98 — Erreur lancement GateWay

16H Leo qui fessait une installation d'InfluxDB à réussi à se connecter avec son application Flask la différence entre son installation et la sienne est la version d'InfluxDB moi je suis sur la version 2 et lui 1. J'ai donc modifié mon docker-compose en passant la version d'InfluxDB en 1.8 et en modifiant la configuration de Telegraf mais j'ai des erreurs lors Telegraf ne crée pas la table.

17H Avec Alexandre on a réussi a récupérer les données de son Telegraf v2 mon erreur était que ma connexion était pour l'ancienne version. Je suis dégouté d'avoir perdu 1 demi-journée pour ça, mais je suis content d'avoir trouvé une solution.

Samedi 30 mars

13H00 J'ai comme but aujourd'hui de récupérer les données d'InfluxDB sur l’application Flask

14H00 J'ai réussi à récupérer les données depuis le Flask voici les informations que j'ai utilisées pour me connecter

# Configuration de la connexion à InfluxDB
INFLUXDB_URL = 'http://raspi4-jules.local:8086'
INFLUXDB_TOKEN = 'V&aGMxx!%A6hiSBe%w97kRnCH'
INFLUXDB_ORG = 'hive_organization'
INFLUXDB_BUCKET = 'hive_bucket'
# Initialize the InfluxDB client with authentication
client = InfluxDBClient(url=INFLUXDB_URL, token=INFLUXDB_TOKEN, org=INFLUXDB_ORG)
query_api = client.query_api()

15H Création du docker-compose pour la base de données MariaDB pour information utilisateur

16H Test d'envoie de 2 capteurs sur le même topic mosquito et le résultat est que Grafana ne fait pas de distinction de qu'elle appareille envoie les données l'utilisateur est toujours le même 46a6ee8b253c

Mardi 2 avril

9H Création du planning avec GranttProject

Voici le planning :

Planning
Figure 99 — Planning

11H J'ai crée des tasks dans l’issue board

16H J'ai intégré une libraire de logging sur le pico w en micro Python pour crée un fichier de log, mais j'ai une erreur que je n'arrive pas a résoudre c'est celle d'afficher l'heure pour chaque log.

17H Je ne suis pas arrivée a résoudre cette erreur je vais donc crée une classe logging pour la faire moi

19H Ma classe logging est créée et fonctionne voici comment se présente le fichier de log :

[Info] 2024-04-04 11:02:34 : Connecting
[Info] 2024-04-04 11:02:44 : Network config: ('192.168.1.191', '255.255.255.0', '192.168.1.1','192.168.1.1')
[Warning] 2024-04-04 11:03:14 : Reconnect 

Jeudi 4 avril

10H J'ai crée le glossaire et j'ai commencé a le remplir

13H J'ai remarque 2bug sur le code de mon pico le premier était la réécriture du fichier de log et donc mes logs ne s'affichaient plus et le deuxième était lorsque le pico ne trouve pas de broker mqtt il effectuait la fonction reconnectée qui le fessait crash et donc la j'ai refait la fonction pour plus que cela arrive.

14H Installation de lightbox sur mkdocs pour voir les images en plus grandes sur le site et création des tests

Lundi 8 avril

9H J'ai continué la documentation du capteur interne

11H J'ai fait la documentation sur l'organisation de mon projet

Mardi 9 avril

14H Je me suis intéressé à faire fonctionner ma gateway LoRa sur mon raspberry j'ai suivi le tuto du constructeur https://www.waveshare.com/wiki/SX1302_LoRaWAN_Gateway_HAT, mais j'ai eu une erreur lors du lancement.

CoreCell reset through GPIO23...
SX1261 reset through GPIO23...
CoreCell power enable through GPIO18...
CoreCell ADC reset through GPIO13...
Opening SPI communication interface
ERROR: failed to start the gateway

J'ai trouvé une personne qui avait le même problème sur intérêt https://www.thethingsnetwork.org/forum/t/how-to-install-a-waveshare-sx1302-hat-on-a-raspi-as-gateway/55082 et j'ai donc activé SPI et I2C .

Après avoir reboot le lancement fonctionne

CoreCell reset through GPIO23...
SX1261 reset through GPIO23...
CoreCell power enable through GPIO18...
CoreCell ADC reset through GPIO13...
Opening SPI communication interface
Note: chip version is 0x12 (v1.2)
INFO: using legacy timestamp
ARB: dual demodulation disabled for all SF
INFO: found temperature sensor on port 0x39

INFO: concentrator EUI: 0x0016c001f15d64cb

Closing SPI communication interface
CoreCell reset through GPIO23...
SX1261 reset through GPIO23...
CoreCell power enable through GPIO18...
CoreCell ADC reset through GPIO13...

Jeudi 11 avril

10H J'ai commencé par enregistrer la gateway sur The Thing Network on peut la voir sur https://www.thethingsnetwork.org/community/geneva/ elle est a Laconnex.

GateWay Raspberry pi 4
Figure 100 — GateWay Raspberry pi 4

11H J'ai enregistré mon premier end-device (Le pico w avec le module lora et le capteur) en suivant le tutoriel du constructeur, mais a la partie de la démo je n'ai pas pu la faire, car elle est en C et moi je travaille en MicroPython.

J'ai d’abord cherché des porject similaires en MicroPython et je suis tombé là-dessus https://github.com/ehong-tl/micropySX126X/tree/master, Mais après plusieurs tentatives j'ai trouvé que se système fonctionne avec deux capteurs sans une gateway.

13H J'ai trouvé un nouveau depot git https://github.com/GereZoltan/LoRaWAN/tree/main?tab=readme-ov-file qui à première vue semble correspondre, mais j'ai envie de me changer les idées en fessant un peut de documentation

Vendredi 12 avril

12H Test du dépôt git que j'ai trouvé hier https://github.com/ehong-tl/micropySX126X/tree/master j'ai testé tous les codes du git et tous me retourne une erreur et le problème c'est que je my connais très peu et donc je n'arrive pas à savoir comment résoudre les erreurs.

13H Avancement de la documentation

14H Merge de toutes les branches sur main

19H Implémentation du subscribe sur le pico w

Lundi 15 avril

8H Avancement sur le MicroPython sur le subscribe

10H J'ai implémenté le multithreading pour que je puisse garder un time.sleep de 1 minute entre l'envoie des données et que je puisse recevoir les messages du subscribe

11H Ajouter dans ma librairie logging une fonction reçoive qui écrit ce que le programme reçoit du broker mqtt et j'ai aussi ajouter une fonction pour vider le fichier de log

12H J'ai une erreur depuis que j'ai implémenté le multithreading

Unable to connect to COM6: could not open port 'COM6': PermissionError(13, 'Accès refusé.', None, 5)

If you have serial connection to the device from another program, then disconnect it there first.

Process ended with exit code 1.

13H J'ai modifié mon code pour supprimer l'erreur en vins

14H J'ai fait des tests sur le microcontrôleur d'Alexandre et il n'a pas se problème donc la seule possibilité c'est une erreur qui vient du firmware

15H J'ai configuré un raspbery pi 4 pour lui implémenter une caméra pour récupérer son flux vidéo

16H Je n'arrive pas a récupérer le flux vidéo je n'ai aucune erreur juste rien ne s'affiche

17H J'ai essayé de récupérer se flux vidéo et de l'enregistrer en MP4, mais je n'arrive de nouveau pas a le visualiser

19H J'ai refait toutes les connexions sur ma balance en soudant pour que les connectiques tiennes mieux et je l'ai mis de la gaine thermorétractable dessus pour protéger les soudures

Mardi 16 avril

8H Lors du lancement de mon wsl j'ai cette erreur qui apparait :

SL2 n’est pas pris en charge avec votre configuration d’ordinateur actuelle. Activez le composant facultatif « Plateforme d’ordinateur virtuel » et assurez-vous que la virtualisation est activée dans le BIOS. Activez « Plateforme d’ordinateur virtuel » en exécutant : wsl.exe --install --no-distribution Pour plus d’informations, visitez https://aka.ms/enablevirtualization Error code: Wsl/Service/CreateInstance/CreateVm/HCS/HCS_E_HYPERV_NOT_INSTALLED Press any key to continue

12H J'ai tout essayé et je n'arrive pas a le régler

13H Nouvelle installation de Windows 11 et en parallèle j'ai commencé la configuration d'une caméra sur un raspbery pi 4

14H J'ai du changer d'os sur le raspberry, car il n'acceptait pas la caméra et j'ai réussi à récupérer et à afficher le flux de la caméra en temps réel en Flask

15H Pour tenter de récupérer les données de mon wsl j'ai téléchargé le disque virtuel de wsl pour le réinjecter dans mon nouveau wsl

Le problème c'est qu'il y a des données corrompues et cela ne fonctionne pas malheureusement

J'ai donc eu l'idée de démarrer sur un os Ubunutu pour tenter de monter le disque virtuel pour récupérer les données. Voici comment j'ai fait :

sudo apt-get install libguestfs-tools
sudo guestmount -a /path/to/your/disk.vhdx -m /dev/sda1 --ro /mnt/vhdx

Grâce à ça j'ai pu récupérer une partie des données

Mercredi 17 avril

8H Lors du lancement du Windows 11 sur mon ordinateur j'ai des blues screen en boucle après 1h de recherche j'ai pu voir que mon câble réseau était branché dans la carte réseau de l'ordinateur et que c'est ça qui fessait blues screen mon ordinateur. :)

10H J'ai avancé mon journal de bord

11H Avancement sur ma balance j'essaye de la faire fonctionner j'ai trouvé se tutoriel qui est pas mal https://forums.raspberrypi.com/viewtopic.php?t=322131

13H J'ai réussi a faire fonctionner ma balance et a récupéré les données, les deux choses qui fessait que la balance ne fonctionnait pas était l'alimentation que j'avais branché en 3 volts et maintenant en 5 volts et la connectique entre les câbles qui n'était pas bien faite.

Données de la balance
Figure 101 — Données de la balance

14H J'ai trouvé un script pour convertir les données en kg et tare la balance https://github.com/gandalf15/HX711/tree/master

16H J'ai crée mon script pour tare la balance et qu'elle fonctionne en affichant le poids en gramme

Jeudi 18 avril

Matinée : Documentation

13H Implémentation de ma base de données utilisateur sur le raspberry

16H Adapatation de l'asynchrone sur mon script MicroPython pour s'abonner a un topique

Vendredi 19 avril

8H Brain storming pour mon app Flask. J'ai eu l'idée de crée un dossier service ou il y aurait un fichier de config avec toutes les données pour se connecter à Influxdb, MariaDB et au broker mqtt. Un fichier connector avec 3 class pour chaque service et 1 fichier par service pour les différentes requêtes.

Comme ça dans les routes de mon main appel un fichier module qui fais le traitement des données il appelle le connecteur du service voulu avec la requête qui se trouve dans les ficher de service.

9H J'ai commencé a modifier mon code

10H Implémentation du fichier config.py et connector.py

13H Test de la connexion au différent service et c'est à ce moment-là que j'ai vu que mon service mqtt ne possédait pas d'utilisateur et de mot de passe.

J'ai essayé plusieurs techniques pour enregistrer le mot de passe et pour debug j'ai installé Portainer pour avoir une vue des log du container pour pouvoir debug

Pour finir, j'ai trouvé comment faire l'utilisateur. J'ai du en ajouter un en ligne de commande pour que Mosquitto crée un fichier avec le nom de l'utilisateur et le mot de passe haché que j'ai du copié et ajouter dans mon docker-compose.

J'ai aussi eu un problème c'est que télégraf n'arrivait plus a se connecter a mosquitt pour lire les données j'ai donc du aussi modifier la conf de Telegraf.

15H J'ai voulu mettre les mots de passe dans le fichier .env, mais je n'arrive pas à trouver une technique pour que le Mosquitto.conf le lise.

17H J'ai réussi a faire pour que les variables soit dans le .env avec en crée moi-même mon image Mosquitto et en fessant un script pour que le compte utilisateur soit mis dans le fichier de configuration

Samedi 20 avril

13H Modification sur mes dockerfile pour qu'il soit uniforme

14H J'ai modifié mon docker-compose-iot, mais j'ai du aussi modifier mon script MicroPython pour l'envoi des données, car je n'étais plus autorisé a communiqué avec le broker mqtt sans user et password. J'ai du ajouté le user password et le port pour réussir a me connecter.

user = 'juju'
password='SuperJuju'
port = 1883

client = MQTTClient(mac_address, mqtt_server, port, user, password)

Lundi 22 avril

8H J'ai commencé la journée en implémentation la connexion au site pour se faire j'utilise BCrypt pour hachée le mot de passe. Je n'ai pas d'inscription donc j'ai du haché un premier mot de passe manuellement pour l'ajouter dans la base de données pour tester par la suite les hash. J'utilise cette librairie, car elle a un point positif sa manière de hachée le mot de passe avec le salt est différente à chaque fois.

10H Implémentation d'un message d'erreur

11H J'ai voulu implémenter Grafana a mon application pour se faire j'ai utilisé les iframe, mais j'ai eu un problème c'est que mon site est en http pour le dev et les iframes n'acceptent pas d'afficher une page web https.

13H J'ai trouvé une solution, mais j'ai du modifier la configuration Grafana dans mon docker-compose pour accepter deux paramètres.

- GF_SECURITY_ALLOW_EMBEDDING=true
- GF_SECURITY_COOKIE_SAMESITE=none

15H Meet avec M.bonvin pour voir l'avancement de mon projet il m'a dit plusieurs choses :

  1. J'avais oublié de lui partager mon projet
  2. Pas assez de commentaires dans mon code
  3. Explication sur le threading et le await sur le pico w

16H J'ai implémenté l'ajout d'un module, mais j'ai une erreur que je n'arrive pas a réglé

TypeError: Module.add_module() missing 1 required positional argument: 'numRef'
Alors que dans ma fonction :
    typeModule = request.form.get("typeModule")
    numRef = request.form.get("numRef")
    Module.add_module(typeModule, numRef)

Mardi 23 avril

8H J'ai compris l'erreur que j'avais c'est que je n’initialisais pas module avant de l'appeler

9H J'ai implémenté l'ajout d'un module

10H J'ai construit une regex pour tester si l'utilisateur rentre correctement une mac adresse

pattern = re.compile("^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$")
11H Implémentation des messages d'erreur

13H Connexion a la base de données InfluxDb j'ai rencontré un problème c'est que le connector influxdb retourne toujours que l'on est bien connecté, mais qu’une requête s'exécute il annonce que la connexion n'a pas réussi. j'ai donc dû modifier mes variables de connexion

14H Récupération des dernières données qui ont été ajouter dans influxdb et les afficher. Voici la requête pour afficher les dernières valeurs du capteur :

from(bucket: "hive_bucket")
            |> range(start: -10m)
            |> filter(fn: (r) => r["_measurement"] == "mqtt_consumer")
            |> last()
            |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")

J'ai aussi ajouté pour refresh les données pour que l'utilisateur n'aie pas besoin de faire F5

16H J'ai crée deux méthodes pour me convertir le date time que je reçois en timestamp dans un premier pas et par la suite en la soustrayant pour récupérer le temps passé pour l'afficher. La deuxième méthode consiste a convertir la durée en seconde minutes heure.

17H J'ai refactorisé mon code, mais je n'ai pas eu le temps de le finir

Mercredi 24 avril

8H J'ai commencé par finir la refactorisation de mon code

9H J'ai réfléchi comment je pourrais savoir de quel capteur je reçois qu'elle donné et j'ai pu voir lorsque je reçois une donner il y a un champ host "d0c40c7b7124".

10H J'ai abandonné l'idée d'utiliser le host, car il change souvent. J'ai donc eu l'idée d'envoyer la mac adresse du capteur en même temps que les données comme ça lorsque je récupère les données je reçois aussi le propriétaire.

11H J'ai du modifier les deux lignes dans mon fichier telegraf.conf

  tag_keys = ["id_mac"]
  json_string_fields=["id_mac"]
12H J'assavoir la mac adresse de différents capteurs

13H J'ai crée un json web token lors de la connexion de l'utilisateur pour pouvoir modifier les requêtes en fonction. Voici comment je le crée

encoded_jwt = jwt.encode({"id": data[0]['id_user'], "user": data[0]['user'], "email": data[0]['user']}, secret_key, algorithm="HS256")
et voici comment je l'ajoute dans le n’agitateur de l'utilisateur
response.set_cookie(key="jwt_cookie", value=encoded_jwt, max_age=date_future.timestamp(), path='/', secure=True, httponly=True)
je lui donne une valeur de 30 jours avant son expiration

14H J'ai commencé a implémenter l'ajout d'une ruche, mais quand j'ai créé la requête je me suis rendu compte que dans ma base de données user était relier a Hive et non a Apiary. J'ai donc fait cette modification et je n'ai pas pu implémenter l'ajoute d'une ruche, car il me manquait l'id de Apiary.

16H J'ai ajouté des données à la main dans Apiary et j'ai implémenté la page d'ajout de ruche pour que chaque rucher a un ajout de ruche automatique.

Jeudi 25 avril

8H Je commence la journée par cette erreur "Error connecting to MariaDB: Unknown server host 'raspi4-jules.local' (-2)" quand je lance mon application j'ai donc changé la config et remplacer " 'host': '10.5.51.37'" je ne comprends pas pourquoi tous les autres jours ça fonctionne, mais pas aujourd'hui

9H J'ai implémenté l'ajout d'un rucher

10H J'ai mis en place un filter_input pour les chaines de caractères pour vérifier se que l'utilisateur entre j'ai testé trois choses si le champ est vide, s’il y a des caractères d'échappement et les mots cle pour les injections SQL.

11H J'ai implémenté la recherche automatique des ruches pour que l'utilisateur puisse les supprimer plus facilement

13H J'ai implémenté la suppression d'un rucher

14H En implémentant l'ajout d'une ruche j'ai remarque que je devais modifier complètement l'affichage, car je ne pouvais pas récupérer l'id du rucher

15H Je passe l'id du rucher dans le lien

16H J'arrive à ajouter une ruche, mais il s'ajout pas dans avec le bon id rucher je dois faire une modification pour rectifier ça

17H Après l'ajout d'une ruche l'affichage n'est plus comme avant je dois modifier aussi cela

Vendredi 26 avril

7H J'ai commencé la journée par régler le bug de hier sur l'ajout d'une ruche avec le mauvais id apiary

9H J'ai réussi a régler les deux bugs que j'avais et j’arrive a ajouter une ruche et a récupéré les ruches pour chaque rucher

10H J'ai modifié ma façon de renvoyé les erreurs et maintenant je les passe dans l'url. J'ai dû sérialiser le tableau sinon je récupérais un string et plus un dictionnaire.

11H J'ai implémenté la suppression d'une ruche

13H J'ai commencé l'implémentation de la page module dynamique

14h J'ai demandé a M. Zanardi si ça dérange si les erreurs que j'affiche dynamique a l'utilisateur son passer dans l'url http://127.0.0.1:5000/apiary?alerte=%7B%22type%22:+%22danger%22,+%22message%22:+%22Merci+d%27entrer+des+donn%5Cu00e9es+correcte%22%7D. Il m'a dit que c'était plus joli si je retourne un code d'erreur et dans un fichier j'ai un tableau avec chaque code d'erreur le message a affiché.

15H J'ai un problème avec DBeaver je ne peux plus ajouter aucune donnée dans ma base de données et plus interagir avec depuis le site.

Lundi 29 avril

9H Meet avec M. Bonvin on a discuter de mon problème avec ma base de données et le problème était que ma table user crée une erreur avec son nom.

10h Rendez-vous cher le médecin

12H Modification des noms de ma base de données

13H Création de mon poster

Voici le résultat du premier jet:

Poster
Figure 102 — Poster

15H Adatapation de mon application Flask avec la nouvelle base de données

16H J'ai voulu retenter un export de ma base de données il fonctionne, mais je ne peux pas la réimporter. Alexandre a trouvé comment importer la base de données il faut le faire depuis la ligne de commande et il n'y a pas d'erreur.

17H J'ai fini d'implémenter le crud pour un module

Mardi 30 avril

7H J'ai commencé la journée avec la page rucher_view pour afficher tout les ruchers de l'utilisateur et visualiser ces ruches

9H J'ai refait ma base de donner et M.Bonvin m'a expliqué pourquoi le dump ne pouvait pas être import dans DBeaver car l'intérieur n'était pas le même entre le dump et l'import

11H J'ai commencé l'affichage de la page des ruchers

14H Revue de mon nouveau poster

16H J'ai fini l'implémentation de la page rucher_view et quand on ajout un module a une ruche on récupère automatiquement ces données les plus récents

Jeudi 2 mai

Aujourd'hui j'avance la documentation

11H J'ai voulu installer mes requirements mais j'avais plein d'erreur sur des packet trop vieux je l'ai donc refait

12H J'ai mis à jour mon dépôt docker-compose-iot avec l'ajout de potainer et le compte sur Mosquitto

J'ai fais de la documentation tout l'après-midi

16H Je me suis rendu compte que les images ne s'affichent plus sur mon mkdocs

Vendredi 3 mai

7H J'ai résolu mon problème avec les images qui ne s'affichais pas le problème venait que j'écrivais des liens relatifs et quand la documentation est postée sur gitlab les images ne sont pas trouvées

8H J'ai ajouté des images pour que la documentation soie plus esthétique

11H J'ai modifié mon .gitlab-ci et requirements pour que mon pipeline affiche correctement ma documentation

14H J'ai fait mon résumé de mon projet et mon abstract

15H J'ai ajouté pour toute la page apiary, hive et module des messages explicatife quand il n'y a pas de données.

Dimanche 5 mai

19H J'ai ajouté des messages explicatifs au page statistique et caméra

20H J'ai ajouté le système de pagination a statistique et caméra

Lundi 6 mai

8H J'ai modifié la page vue de vos ruchers pour qu'elle soit responsive

10H J'ai modifié la barre de navigation pour qu'elle soit responsive

12H J'ai renommé les noms des fichiers en anglais

13H J'ai sécurisé toutes les pages pour que si l'utilisateur ne possède pas de token il ne puisse pas voir la page

14H J'ai crée un décorateur pour tester l'authentification de l'utilisateur

15H Meet avec M.Bonvin

16H J'ai crée un fichier ou j'ai regroupé toutes les fonctions que j'ai besoin sur l'entièreté de l'application

Mardi 7 mai

7H J'ai débuté la journée sur le code de la balance mon but est de pouvoir envoyé les données au broker mqtt et les stocker en base de données

8H Aprés avoir réussi a récupéré la mac adresse sur le raspberry j'ai voulu connecter mon T-weight mais je n'arrivais pas a le flash sur thonny c'est la que je me suis aperçu que sans ce module je ne pouvais pas développer déçu T-U2T c'est une cle type c que viens se mettre sur le type c d'arrivé du composant pour pouvoir communiquer avec.

10h J'ai crée un logo voici le résultat

Beekeeper compass
Figure 103 — Beekeeper compass

13H J'ai ajouté ça dans ma configuration Telegraf pour enlever les tag que je ne voulais pas tagexclude = ["host","topic"]

14H Avancement sur la documentation de ma balance

16H J'ai finalisé mon poster et la c'est la version finale.

Voici le résultat:

Poster
Figure 104 — Poster

Mercredi 8 mai

8H J'ai continué la documentation sur la balance

10H J'ai modifié ma base de donné la table "ConfigurationAlerts". J'ai ajouté 4 champs humidityMax,humidityMin,temperatureMax,temperatureMin

11H Je me suis aussi aperçu que la table ConfigurationAlerts était reliée à la ruche et je ne trouve plus ça logique donc maintenant elle est reliée directement à un utilisateur. Parsque l'apiculteur aura les mèmes configuration des valeurs maximum et minimum pour toutes ces ruches et pas que pour une.

Voici le nouveau schéma de base de données utilisateur:

Schéma base de données user
Figure 105 — Schéma base de données user

12H J'ai crée la page de paramètre et cette après-midi je vais faire les ajouts dans la base de données

16H J'ai réussi à récupérer, ajouter et modifier les paramètres météorologiques en fonction de l'utilisateur

Samedi 11 mai

9H J'ai refait ma fonction get_imgae_color pour prendre en compte les paramètres de l'utilisateur. Avant il y avait 4 couleurs différentes. Maitentant il y en a plus eu 3: Gris c'est s’il n'y a pas de données de la ruche, rouge c'est si les données ne sont pas entre les paramètres utilisateur et vert c'est si les valeurs sont entre les paramètres utilisateur.

10H J'avais un problème sur les alertes qui ne s'affichais pas sur la page des paramètres météorologique j'avais oublié d'encoder le tableau.

11H J'ai testé Katalon Recorder mais il y a des bugs sur l'extension je ne pouvais pas crée plusieurs task. J'ai donc testé Selenmium IDE mais je n'ai pas aimé l'interface. Je vais donc attendre lundi pour voir ce que mes autres collègues utilisent pour que je m'en inspire.

12H J'ai commencé a créé la page d'interaction avec les capteurs.

Lundi 13 mai

8H J'ai ajouté dans mon markdown ce plugin pour ajouter une légende aux images de ma documentation

9H J'ai du modifier toutes les images qui comportait le style d'alignement a droite, car le plugin de légende d'image me recentre les images

10H J'ai exporté mon nouveau fichier de requirement.txt

12H J'ai installé mkdocs-with-pdf

14H J'ai fait beaucoup de modification, car mes images étaient trop grande et donc le pdf ne se générait pas correctement

16H J'ai fait une révision de toutes mes pages pour voir si la documentation s'affichait correctement et j'ai aussi vérifié mes fautes d'orthographe

Mardi 14 mai

7H J'ai commencé la journée par devellopé sur un nouveau micro controlleur c'est le Lilygo t-weigh. J'ai commencé par installer son firmware

8H J'ai été sur leur dêpot github pour trouver du code pour essayer de le faire fonctionner avec ma balance mais le problème c'est tout le code qu'il est mis a disposition est en c++. J'ai donc commencer a dévelloper dessus mais sans success

9H J'ai eu une réusnion avec mon maitre de diplome pour le rendu intermèdiaire est ca c'est plutot bien passé

10H Durant le rendu mon prof m'a conseiller de commencer la détection des abeilles avec la camera. J'ai donc eu l'idée de modifier mon générateur d'abeilles pour qu'il puisse me fournire un flux video en mp4 pour le tester dans mon script de détection d'abeilles. Comme ca mon générateur menvoie un flux video et il a aussi le vrai compteur d'abeilles comme ca je vais pouvoir vérifier mon script de détection.

11H On a ranger la classe de technicien pour etre prete pour la journée poster

12H J'ai réussi à récupérer le flux vidéo de mon générateur en C#

13H J'ai crée un script Python pour lire la video et commencer a essayer de traiter les abeilles

14H Les premières années sont venu nous rendre visite pour qu'on leur explique nos projets de diplome c'était un super entrainerment

18H On a eu pas mal de visite et c'était très sympa de pouvoir s'entrainer a parler de notre project

Mercredi 15 mai

8H J'ai commencé la journée par avancer sur mon script de détection des abeilles

9H Voici les étapes que j'ai réalisées pour détecter les abeilles. J'ai fait un filtre de Canny pour qu'il reste que les contours.

Filtre de canny
Figure 106 — Filtre de canny

J'ai par la suite fait une détection des contours

Détection des contours
Figure 107 — Détection des contours

Le problème est qu'il détecte plusieurs abeilles ou il y en a qu’une et que si il une guêpe qui passe elle sera aussi compter comme une abeille.

12H J'ai décidé de tester des modèles d'intelligence artificielle prés entrainer pour détecter des abeilles.

13H J'ai découvert YOLOv8 qui est un système qui est un modèle entrainer sur des données Microsoft. Se qui ma attirer vers cette technologie c'est se project de détection d'insecte qui fonctionne super bien.

14H J'ai testé de faire fonctionner le modèle déjà pré entrainer du projet Insect Detect mais j'ai eu des problèmes du moment ou j'ai voulu ajouter mon propre flux vidéo, car leur code est conçu pour une caméra spécifique.

15H J'ai découvert le site Roboflow qui est un site pour entrainer une intelligence de reconnaissance d'image ou il y a des dataset déjà fait. J'ai trouvé ce projet Bee-Gen qui convient a mes besoins et j'ai décidé de l'installer pour le tester.

16H J'ai essayé de comprendre comment l'installer, car il n'y avait pas déjà le modèle conçu il faut télécharger le dataset du projet et l'exécuter pour crée le modèle

Jeudi 16 mai

8H J'ai commencé la journée par lancé la création du modèle avec le dataset.

Voici la commande que j'ai utilisée pour créer le modèle

yolo detect train data="./bee-gen-4/data.yaml" model=yolov8n.yaml epochs=100 imgsz=640

Je me suis vite aperçu que ça prenait énormément de temps pour crée se modèles j'ai donc lancé la création sur un ordinateur plus puissant.

9H La création du modèle à pris 30 minutes

10H Lors de la création du modèle j'ai vu le fichier "yolov8s.pt" et je pensais que c'était le modèle que je venais de générer et donc je l'ai tester et il n'a pas fonctionné. J'ai pensé que c'était la commande que j'avais tapée et j'ai donc enlevé "model=yolov8n.yaml".

Je l'ai donc modifier et relancer la création du modèle.

yolo detect train data="./bee-gen-4/data.yaml"epochs=100 imgsz=640

11H C'est pendant la deuxième création que j'ai trouvé que le modèle se trouvait dans runs/detect/train/weights/best.pt

J'ai utilisé ce script :

from ultralytics import YOLO

# Load a pretrained YOLOv8n model
model = YOLO('best.pt')

# Run inference on 'bus.jpg' with arguments
model.predict('test-bee.jpg', save=True, imgsz=320, conf=0.5)

et voici le résultat :

Détection avec Yolov8
Figure 108 — Détection avec Yolov8

12H Par la suite j'ai mis un flux vidéo pour voir si ça fonctionnait et le résultat est impeccable, mais il est enregistré dans /runs/detect/predict. J'ai donc commencé a écrire un script pour afficher la vidéo en temps réel.

14H J'avais un problème qui était que mon script se lance, mais il n'affiche rien j'ai compris plus tard que c'était à cause de wsl qui ne l'affichait pas

15H Je suis passé sur Windows ou le script fonctionnais parfaitement, mais était pas rapide.

16H Pour faire la détection des abeilles je suis obligé de découpé le flux vidéo image par image se que j'ai donc fait pour perdre moins de temps c'est d’enlever 1 image sur 4 et le rendu est aussi rapide que si la vidéo n'a pas de traitement.

Vendredi 17 mai

7H J'ai modifier mon générateur d'abeilles j'ai ajouter un bouton pour que l'utilisateur puisse modifier l'image de fond et j'ai fais la modification de la taille des abeilles

10H Documentation de mon générateur d'abeilles et de YOLOv8

12H J'ai continuer sur la documentation j'ai ajouter des mots dans le glossaire

14H J'ai modifier mon scirpt de reconnaissance d'abeilles pour qu'il ajoute 2 barre horizontal qui vont me servire pour détecter les abeilles et deux champs text ou le nombre d'abeilles entree et sortie seront afficher

15H J'ai commencer par modifier le carre autour de l'abeilles pour afficher que 1 point au centre de l'abeilles

16H J'ai ajouter une détection de seuil de confiance pour que si il n'est pas sur a 70% que c'est une abeilles il n'affiche rien. Parsque il détectais des abeilles ou il y avait pas.

detections = [det for det in results[0].boxes if det.conf >= 0.7]

17H J'ai réussi à faire un script de détection mais quand une abeille passe elle incrémente plus d'une fois donc les chiffres ne sont pas juste.

Mardi 21 mai

8H J'ai commencé par débugger mon script de détection d'abeilles, car il y a des imprécisions quand elle touche une barre de détection et elles ne se font pas bien détecter

11H J'ai trouvé une comment je pouvais rendre unique une abeille avec un id grâce à ça :

  results = model.track(frame, persist=True) 

12H J'ai implémenté dans mon application de génération d'abeilles une création de fichiers avec le rendu des données des abeilles qui sont entrées et sorties durant l'enregistrement.

14H J'ai modifié mon code complètement pour faire le comptage des abeilles et ça fonctionne parfaitement. Il faudrait que je fasse des tests pour tester les limites de mon script.

16H J'ai modifié complètement mon application de générateur d'images, car je n'étais pas fier de mon code il y avait de la redondance. J'avais fait deux listes avec les abeilles dans la ruche et une autre liste pour les abeilles externe a la ruche. J'ai donc fait un booléen dans la classe bee qui stock si l'abeille est à l'intérieur de la ruche ou a l'extérieur.

17H J'ai modifié les images de ma documentation de mon application, car elle a changé

Mercredi 22 mai

Durant tout la journée j'ai tester l'implémentation de mon script de détection d'abeilles dans mon application Flask. Pour se faire j'ai crée une classe qui contient tout le fonctionnement et qui prend comme paramètre une video qui contient l'extansion mp4. Par la suite j'ai du l'implémenter dans les pages camera. J'ai ajouter un input pour que l'utilisateur puisse ajouter une video. J'ai du enregistrer des fichiers uploader par l'utilisateur. Pour se faire je les enregistrés dans un dossier temporaire. Si une video a plusieurs fois le meme nom le nouvelle ecrasse la présédente.

J'ai du aussi modifier mon script de reconnaissance d'abeilles pour qu'il n'affiche plus les trackers sur les abeilles ni les id des abeilles car il y avait du clignotement.

J'ai commencé la gestion des erreurs mais je n'ai pas encore fini il me reste a afficher les messages d'erreur. J'aimerais aussi rajouter une image de chargement en attenante que le rendu se lance.

Jeudi 23 mai

8H J'ai commencé par afficher le message d'erreur sur la page caméra

9H J'ai modifié la page apiary_view pour que les options soient en accord avec les modules que possède l'utilisateur.

Page apiary_view avec les options des modules
Figure 109 — Page apiary_view avec les options des modules

11H J'ai continué sur la page des modules pour que l'utilisateur puisse interagir avec que les modules qu'il possède. Je n’ai pas encore fait l'implémentation des actions des boutons.

12H J'ai reflasher mes 3 pico w et j'ai refait le câblage proprement suivant les normes électriques et voici le résultat :

Capteur interne câblé
Figure 110 — Capteur interne câblé

14H J'ai modifié mon dashboard Grafana pour qu'il accepte comme paramètre une mac adresse pour séparer les capteurs entre eux.

16H J'ai modifié ma page statistique de mes capteurs. Elles affichent les 3 graphiques Grafana avec le capteur sélectionner.

17H J'ai un problème avec mes iframe Grafana, lors du chargement ils font complètement crash mon navigateur. J'ai donc voulu tester sur Google Chrome, mais j'ai pu remarque que je n'arrivais plus a mon site je vais devoir revoir ma connexion.

Vendredi 24 mai

7H J'ai commencé la matinée par ajouter les macs adresse sur les pico w, pour se faire j'ai utilisé étiqueteuse et j'ai inscrit leur mac adresse.

8H J'ai eu un problème avec le capteur DHT22 que je n'avais jamais eu. Il me renvoie cette une erreur "[Errno 110] ETIMEDOUT". J'ai cette erreur que sur 1 module interne j'ai donc fait plusieurs tests. J'ai changé le capteur rien n'a changé âpres j'ai changé les câbles rien n'a changé j'ai changé le pico et toujours rien. J'ai donc regardé si j'avais ajouté sur les autres modules internes une librairie et non. J'ai trouvé sur internet des personnes qui ont la même erreur que moi et pour la résoudre ils sont utilisés un "time.sleep(2)", ça a amélioré la situation, mais il y a toujours des fois ou l'erreur se produit. J'ai donc géré l'erreur avec un try catch.

Voici le résultat

try:
    sensor.measure()  # Lire les données du capteur DHT22
    time.sleep(5)
    voltage = adc.read_u16() * 3.3 / (65535 * 3)  # Calculer la tension de la batterie
    battery_level = voltage / 3.3 * 100  # Calculer le pourcentage de la batterie
    data = {
        "id_mac": mac_address,
        "temperature": sensor.temperature(),
        "humidity": sensor.humidity(),
        "voltage": battery_level
    }
    client.publish(topic_pub_data, json.dumps(data))  # Publier les données au broker MQTT
    logging.info(f"Data: {data}")
    gc.collect()  # Collecter les déchets pour libérer de la mémoire
    await asyncio.sleep(1)
except Exception as e:
    logging.error(f"Error reading data from DHT22: {e}")

10H J'ai ajouté les fonctionnalités permettant de démarrer, arrêter et redémarrer l'envoi des données du capteur. Pour cela, j'utilise des tâches asynchrones pour créer la boucle lors du démarrage. Cette approche me permet de démarrer facilement la boucle de lecture des données du capteur et de l'arrêter rapidement grâce à la fonction cancel . En cas de redémarrage, je procède en arrêtant d'abord la boucle en cours, puis en lançant une nouvelle instance de la boucle pour reprendre l'envoi des données.

12H J'ai fait des tests de lancement pour voir si tout fonctionnait correctement

13H J'ai commencé a l'implémentation de mqtt dans mon Flask

J'ai passé tout le reste de l'après-midi a afficher les 10 dernier log qui était sur mon capteur, mais le problème c'est que mon application n'attend pas l'envoie du tableau dans le topique mosquito donc il récupère none comme données. J'ai donc essaye en asynchrone, mais je n’y suis pas arrivé. J'ai essayé avec thread pas réussi et j'ai même essayer d'y afficher en JavaScript et j'ai non plus pas réussi. Je vais demander conseil lundi, mais au pire ce n’est pas grave si je n'arrive pas a afficher les 10 derniers logs c'est pas important, mais j'aurais trouvé jolie. Je n’aurais pas du passé toute une après-midi dessus. J'aurais pensé que ça aurait été plus simple.

Dimanche 26 mai

17H J'ai fini la partie environnement de dévellopement dans la documentation. J'ai utiliser le style pour les pages. J'ai aussi installer le plugins glightbox qui affiche les images en grand quand on click dessus.

Lundi 27 mai

8H J'ai installé un os sur un raspberry pi 5 en vue de l'amener en extörieur pour brancher mes 3 modules dessus pour avoir des vrais données.

9H J'ai modifié la configuration ssh en changent le port de connexion et en désactivant les connexions sans une clé ssh pré enregistrer. (authorized_key)

10H J'ai lancé mon docker-iot dessus en modifiant les noms et mots de passe pour que ça soit plus sécurisé.

11H J'ai testé avec un capteur voir si mon environnement fonctionnait correctement.

12H J'ai été chez un apiculteur pour déployer mon système.

13H J'ai commencé par tester le wifi s'il arrivait à la ruche. J'ai pu faire un speed, test est, je suis arrivé a 20 mbps, je verrais plus tard si cela suffie.

14H J'ai installé le raspberry à côté du routeur pour lui ajouter le wifi pour pouvoir communiquer avec lui avec mon ordinateur via ssh

15H J'ai voulu rediriger les ports du raspberry sur le router, mais il y avait une erreur et qui informais que le routeur n'avait pas d'adresse ip public. J'ai donc contacté le service client pour leur demander d'en attribuer une ip publique.

16H Une fois qu'il m'ait attribuée une adresse publique pour le raspberry j'ai pu rediriger les ports des services que j'utilise et j'ai pu les tester avec le capteur et tout fonction correctement.

17H J'ai mesuré la ruche pour refaire aux dimensions ma balance et la finaliser pour qu'elle puisse résister aux intempéries.

19H Avancement sur la documentation

Mardi 28 mai

8H J'ai commencé la journée par envoyer les données de la balance a mon serveur mqtt

10H J'ai ajouté les mêmes fonctionnalités a ma balance qu’a mes capteurs internes, les log et les messages qui provienne d'un topic mqtt. J'ai dû modifier pas mal de choses, car il y avait des librairies qui fonctionnaient qu’en micropython.

12H J'ai implémenté un script pour la calibration de la balance, mais j'ai eu de la peine a comprendre comment fonction le calcule du poids de la balance et si c'était possible d'enregistrer l'objet hx.

14H J'ai trouvé une solution pour enregistrer l'objet hx grâce a pickel.

Voici comment j'ai fait pour enregistrer l'objet hx dans un fichier:

with open(nom_fichier_donnee_balance, 'rb') as fichier_echange:
    hx = pickle.load(fichier_echange)
Et voici comment je les récupère :

with open(nom_fichier_donnee_balance, 'wb') as fichier_echange:
    pickle.dump(hx, fichier_echange)
    fichier_echange.flush()
    os.fsync(fichier_echange.fileno())
fichier_echange.flush() Vide le tampon d'écriture, forçant l'écriture des données en mémoire dans le fichier.

os.fsync(fichier_echange.fileno()) Assure que toutes les données en attente sont écrites physiquement sur le disque.

16H J'ai implémenté mon script de calibration dans mon script principal

Mercredi 29 mai

8H Aujourd'hui je travaille depuis cher moi, car je dois créer une boite étanche pour emmener mon raspbery en extérieur et refaire ma balance avec les nouvelles dimensions. J'ai eu l'idée pour raccorder ma balance à mon raspberry de passé sur un câble USB. Mon but va être de souder un connecteur USB femelle sur les pin de mon raspberry et de le faire sortir de ma boite étanche, pour pouvoir venir connecter un câble USB mal qui est relié sur ma balance. Bien évidemment ce connecteur USB ne pourra aller dans aucune autre prise USB, car les connecteurs ont été modifiés.

Voici le câblage électrique que je vais effectuer :

[HX711](./environnement_de_developpement/composant.md#module-hx711)        | Câble USB        | Raspberry Pi
-------------|------------------|-----------------------
VCC          | Rouge (VCC)      | Broche 2 (5V power)
GND          | Noir (GND)       | Broche 6 (Ground)
DT (Data)    | Blanc (Data-)    | Broche 31 (GPIO 6)
SCK (Clock)  | Vert (Data+)     | Broche 29 (GPIO 5)

Pour pouvoir réutiliser le raspberry sur un autre projet j'ai soudé mon connecteur femelle sur une rallonge de pin qui se fixer sur le raspberry.

Connecteur usb femmelle sur raspberry
Figure 111 — Connecteur usb femmelle sur raspberry

10H J'ai percé les 2 trous le plus fins possible pour que l'alimentation et le câble d'alimentation du module interne puissent être branchés au raspberry et qu'il ne mette pas en péril l'étanchéité de la boite.

Boite étanche avec tous les raccords
Figure 112 — Boite étanche avec tous les raccords

12H Pour la balance j'ai commencé à souder un USB mal a mon capteur HX711.

13H J'ai commencé a découper les planches de bois dont j'ai besoin.

Il y avait plusieurs points que je voulais améliorer avec la version 1 de ma balance, les voici :

  1. Fixer les cellules de charges aux impressions 3D.
  2. Trouver un système pour ranger les fils proprement.
  3. Nouveau système pour la détection des cellules de charges avec le plateau.
  4. Simplifier la connectique avec le raspberry.
  5. Maintenir le plateau pour pas qu'il puisse bouger.

Voici ce que j'ai mis en place pour les résoudre.

  1. J'ai collé avec de la colle chaude les cellules de charges aux impressions 3D.
  2. J'ai fait des rainures avec une défonceuse pour faire passer les câbles à l'intérieur.
  3. Découpage de carré dans une plaque d'acier qui sont collé au plateau.
  4. Modifier un connecteur USB pour faire la connectique de la balance.
  5. Crée des cales sur le socle de la balance pour maintenir le plateau.

17H Je suis très content du résultat de la version 2 de la balance.

Jeudi 30 mai

12H J'ai testé la balance que j'ai branchée sur le raspberry pi 5 et quand j'ai lancé le script j'ai eu plusieurs erreurs.

  1. Librairie GPIO pas compatible avec le raspberry pi 5. J'ai dû installer "pip3 install rpi-lgpio"
  2. Problème avec la librairie HX711 j'ai cru que c'était mon câblage qui n'était pas correct, mais c'était juste la librairie. Je l'ai donc téléchargé manuellement et ajouter dans mon dossier Lib.

Pour résoudre le problème de la librairie HX711 j'ai débranché le raspberry pi 5 et j'ai mis à la place le 4 qui fonctionnait parfaitement c'est comme ça que je me suis appercu que l'erreur venait de la librairie.

15H J'ai restructuré la documentation dans la partie développement j'ai crée deux catégories : "Conception et fonctionnement" et "Description de l'implémentation". Dans la "Conception et fonctionnement" je vais ajouter comment j'ai branché et relier les composants entre eux donc plutôt matériel et dans "Description de l'implémentation" sera une partie sur l'explication du code.

17H J'ai modifié et ajouter du texte dans la documentation de la balance.

Vendredi 31 mai

Aujourd'hui j'ai fait que de la documentation !!

Dimanche 2 juin

11H J'ai crée les barres métalliques sur la balance

13H Documentation de ce que j'ai fait et j'ai insérer les liens des mots du glossaire dans toute ma documentation

Lundi 3 juin

8H J'ai relié les mots du glossaire dans ma documentation

10H J'ai corrigé toutes les fautes d'orthographe de ma documentation avec antidote

11H J'ai été cher un apiculteur mettre ma balance en extérieur.

13H En fessant des tests avec mon serveur Iot, j'ai pu remarquer que je ne captais pas le wifi.

14H J'ai donc décidé de passer par l'électricité avec Devolo pour recevoir du réseau, mais je n'ai pas pu tester. Car j'avais rendez-vous avec un autre apiculteur pour faire des vidéos des ruches.

15H Rendez vous cher un autre apiculteurs pour filmer l'entrée des ruches pour avoir un flux vidéo pour le tester sur ma détection d'abeilles.

Mardi 4 juin

8H On a rendez-vous avec notre prof de diplôme dans l'après-midi et on doit lui rendre notre documentation pour qu'il l'analyse, je vais faire de la doc ce matin

J'ai dès que de la documentation le reste de la journée

Mercredi 5 juin

Documentation toute la journée, j'ai refait l'environnement de développement et les technologies utilisées. J'ai refait aussi le schéma interaction de mon application global.

Jeudi 6 juin

J'ai fini la documentation de mon application Flask j'ai expliqué toutes les pages et j'ai expliqué le code qui était important.

J'ai commencé la conclusion, mais je ne l'ai pas encore fini

19H J'ai été tester des Courant Porteur en Ligne (CPL) chers l'apiculteur pour voir si j'arrivais a connecter le rasperry au réseau.

20H Le raspberry est connecté au réseau avec un Courant Porteur en Ligne (CPL)

Voici la connexion :

Connection du raspberry au réseau
Figure 113 — Connection du raspberry au réseau

Vendredi 7 juin

9H En écrivant la conclusion de pourquoi je n’avais pas utilisé LoRaWan et que j'avais relié le raspberry directement en réseau je me suis rendu compte que mes modules n'avaient pas de wifi pour communiquer leurs données .

10H J'ai crée un access point sur le raspberry pour que modules puissent si connecter et envoyer les données.

Voici le script que j'ai utilisé:

[Unit]
Description=WiFi Hotspot
After=network.target

[Service]
ExecStart=/usr/bin/nmcli device wifi hotspot ssid beekeeper_compass_iot password h3atwe3YyA3fAP86RtkoUHkyNqvas6
Restart=on-failure
User=root

[Install]
WantedBy=multi-user.target

11H J'ai crée la pwa de mon application.

15H J'ai modifié mes explications de code de me simulateur

1H J'ai réussi a envoyé le flux vidéo en direct depuis un raspberry a mon application Flask

Samedi 8 juin

10H J'ai crée le boitier pour la caméra

12H Test de la détection d'abeilles

19H Ajout de la documentation des tests

Dimanche 9 juin

10H J'ai crée la conclusion de pour toutes les parties de mon projet

12H J'ai fait le retour d'expérience de mon projet

14H J'ai revu les fautes d'orthographe

16H J'ai ajouté les liens de redirection pour les composants, logiciel, langage de programmation et pour les services