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
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.
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
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.
15H Erreur lors du lancement de la 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 :
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.
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
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.
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.
15H Meet avec M.bonvin pour voir l'avancement de mon projet il m'a dit plusieurs choses :
- J'avais oublié de lui partager mon projet
- Pas assez de commentaires dans mon code
- 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é
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
11H Implémentation des messages d'erreur13H 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
12H J'assavoir la mac adresse de différents capteurs13H 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")
response.set_cookie(key="jwt_cookie", value=encoded_jwt, max_age=date_future.timestamp(), path='/', secure=True, httponly=True)
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:
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
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:
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:
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.
J'ai par la suite fait une 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
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.
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 :
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.
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 :
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.
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 :
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:
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.
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.
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 :
- Fixer les cellules de charges aux impressions 3D.
- Trouver un système pour ranger les fils proprement.
- Nouveau système pour la détection des cellules de charges avec le plateau.
- Simplifier la connectique avec le raspberry.
- Maintenir le plateau pour pas qu'il puisse bouger.
Voici ce que j'ai mis en place pour les résoudre.
- J'ai collé avec de la colle chaude les cellules de charges aux impressions 3D.
- J'ai fait des rainures avec une défonceuse pour faire passer les câbles à l'intérieur.
- Découpage de carré dans une plaque d'acier qui sont collé au plateau.
- Modifier un connecteur USB pour faire la connectique de la balance.
- 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.
- Librairie GPIO pas compatible avec le raspberry pi 5. J'ai dû installer "pip3 install rpi-lgpio"
- 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 :
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