Bonjour,
Suite à la découverte du projet Birdnet-pi, j’ai décidé de me lancer dans ce super projet.
L’idée de Birdnet est de mettre un place un micro qui écoute les sons extérieurs et par magie, où plutôt un développement d’algorithmes efficaces, Birdnet nous mets en avant les espèces d’oiseaux reconnus.
Je trouve cela merveilleux et j’arrive à donner des noms aux oiseaux qui se trouvent dans mon jardin et même mieux à les reconnaitre maintenant grâce à leurs chants.
Ils existent de nombreuses personnes qui ont travaillés pour le développement du logiciel, de l’intégration dans HA et pour la mise en place de card très bien.
Je ne m’attribue pas du tout leurs travaux, mais c’est plutôt un partage de mon expérience pour mettre en avant ce travail remarquable.
Il existe un addon home assistant que j’ai essayé d’utilisé, mais en terme de ressources, cela était trop limite, j’ai donc décidé d’avoir un raspberry pi 4B+ dédié.
Je ne développerais donc pas la partie addon-HA, ci dessous le lien qui en parle très bien:
Pour mon projet, je suis donc partie sur Birdnet-pi, sur un raspberry pi 4B+, équipé d’un micro usb.
Le tout est dehors et communique avec Home assistant par mqtt.
Voici les différents liens qui m’ont aidés avant de vous présenter un tuto de mise en place.
Le site officiel :
Le forum HA et le sujet Birdnet :
Un blog très complet sur le projet Birdnet-go, mais très utilie pour la configuration coté HA dans mon cas :
Tutoriel d’installation :
1- Installation birdnet sur rapberry pi 4 B+ :
Le mieux est de suivre la procédure d’installation décrite dans le github :
Pour faire simple :
A - Installer raspberry pi os à partir de pi imager
B- Faire les mises à jour :
sudo apt-get update
sudo apt-get upgrade
C - Installer votre micro si non reconnu.
D - Lancer la commande d’installation Birdnet-pi
curl -s ``https://raw.githubusercontent.com/Nachtzuster/BirdNET-Pi/main/newinstaller.sh`` | bash
Vous avez donc à ce stade un serveur web qui affiche l’interface web :
http://adresse_ip_du_pi (par exemple, pour ma part, http://192.168.1.32)
2- Mise en place de mqtt coté raspberry pi 4 B+ - Birdnet
Il faut installer un mqtt léger sur le raspberry-pi pour publier les informations à home assistant via le broker MQTT. J’ai choisi paho-mqtt.
Comme il s’agit d’environnement python, il faut créer un environnement virtuel pour exécuter les scripts python à l’intérieur, c’est la méthode recommandée par raspberry os :
A - Créez un environnement virtuel dans votre répertoire personnel :
Commande :
python3 -m venv birdnet_venv
B- Activez l’environnement virtuel :
source birdnet_venv/bin/activate
C- Installez paho-mqtt dans cet environnement :
pip install paho-mqtt
D- Créer le script Python
Créer un fichier nommé “birdnet_to_mqtt.py” :
Commande :
nano birdnet_to_mqtt.py
Mettez les éléments ci-dessous et adapter bien les XXXX relatifs à MQTT.
Script python :
import time
import re
import datetime
import json
import paho.mqtt.client as mqtt
import subprocess
# Configuration MQTT
MQTT_SERVER = "192.168.1.XXX" # Adresse de votre Home Assistant
MQTT_PORT = 1883
MQTT_USER = "XXXX" # Nom utilisateur mqtt de votre Home Assistant
MQTT_PASSWORD = "XXXXXX" # Mot de passe mqtt de votre Home Assistant
MQTT_TOPIC = "birdnet/detection" # Topic de base
# Regex pour capturer les informations de détection
RE_BIRD_ENTRY = re.compile(r".*\('([^']+)_\s*([^']+)', ([\d.]+)\)")
def on_connect(client, userdata, flags, rc):
"""Fonction appelée lors de la connexion au broker MQTT."""
if rc == 0:
print("Connecté au broker MQTT!")
else:
print("Échec de la connexion, code de retour:", rc)
def main():
"""Fonction principale pour lire les logs et publier sur MQTT."""
client = mqtt.Client(protocol=mqtt.MQTTv311)
client.username_pw_set(MQTT_USER, MQTT_PASSWORD)
client.on_connect = on_connect
client.connect(MQTT_SERVER, MQTT_PORT, 60)
client.loop_start()
print("Démarrage de la surveillance des logs...")
command = ["journalctl", "-f", "-o", "cat", "-u", "birdnet_analysis.service"]
process = subprocess.Popen(command, stdout=subprocess.PIPE, text=True, bufsize=1)
while True:
line = process.stdout.readline()
if not line:
time.sleep(1)
continue
match = RE_BIRD_ENTRY.search(line)
if match:
scientific_name = match.group(1).strip()
common_name = match.group(2).strip()
confidence = float(match.group(3))
# Ignore si l’espèce est dans la liste EXCLUDED_SPECIES
if scientific_name in EXCLUDED_SPECIES:
print(f"Ignoré : {common_name} ({scientific_name})")
continue
# Condition sur la confiance
if confidence > 0.7: # Ajuster si vous voulez plus précis ou moins précis
payload = {
"timestamp": datetime.datetime.now().isoformat(),
"scientific_name": scientific_name,
"common_name": common_name,
"confidence": confidence
}
json_payload = json.dumps(payload)
client.publish(MQTT_TOPIC, json_payload)
print(f"Publication : {common_name} ({scientific_name}) (confiance: {confidence:.2f})")
if __name__ == "__main__":
main()
client = mqtt.Client()
client.username_pw_set(MQTT_USER, MQTT_PASSWORD)
client.on_connect = on_connect
client.connect(MQTT_SERVER, MQTT_PORT, 60)
client.loop_start()
print("Démarrage de la surveillance des logs...")
with open(SYSLOG_FILE_PATH, "r") as file:
file.seek(0, 2) # Déplacer le curseur à la fin du fichier
while True:
line = file.readline()
if not line:
time.sleep(1)
continue
match = RE_BIRD_ENTRY.search(line)
if match:
log_data = match.group(1)
# Le format du log peut varier, il faut l'adapter
# Cet exemple est basé sur un format courant
parts = log_data.split(';')
if len(parts) >= 5:
timestamp = parts[0]
sci_name = parts[2]
com_name = parts[3]
confidence = float(parts[4])
payload = {
"timestamp": timestamp,
"scientific_name": sci_name,
"common_name": com_name,
"confidence": confidence
}
json_payload = json.dumps(payload)
client.publish(MQTT_TOPIC, json_payload)
print(f"Publication de la détection : {com_name} sur le topic {MQTT_TOPIC}")
if __name__ == "__main__":
main()
Sauvegardez le fichier (Ctrl+O, puis Entrée, et Ctrl+X).
E - Rendre le script automatique au démarrage du pi :
Pour que le script Python qui transmet les détections d’oiseaux à MQTT se lance automatiquement au démarrage du Raspberry Pi, il faut créer un service systemd. Cela garantira que le script est toujours actif et qu’il redémarre en cas de problème.
Voici les étapes pour créer ce service.
E-1 : Créer le fichier de service systemd:
Créez un nouveau fichier de service dans le répertoire des services système :
sudo nano /etc/systemd/system/birdnet-mqtt.service
Ensuite, copiez et collez le contenu suivant dans le fichier. N’oubliez pas d’ajuster les chemins si necessaire :
[Unit]
Description=Service de publication des détections BirdNet sur MQTT
After=network.target
After=network-online.target
[Service]
ExecStart=/home/pi/birdnet_venv/bin/python /home/pi/birdnet_to_mqtt.py
WorkingDirectory=/home/pi
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
Avec :
ExecStart : C’est la commande qui sera exécutée pour lancer le service. Nous spécifions le chemin complet vers l’interpréteur Python de votre environnement virtuel (/home/pi/birdnet_venv/bin/python) et le chemin complet de votre script (/home/pi/birdnet_to_mqtt.py).
User et Group : Ces lignes indiquent que le service doit s’exécuter avec les permissions de l’utilisateur pi.
Restart=always : Cette ligne est importante car elle garantit que le service redémarrera automatiquement s’il s’arrête de manière inattendue.
Attention, visiblement sur pi os trexie, le nom d’utilisateur n’est pas pi mais admin. Il faut adapter les chemins du fichier systemd ci dessus en remplacement pi par admin si ce fichier ne fonctionne pas lors de l’installation.
E-2 : Activer et démarrer le service
Recharger la configuration systemd :
sudo systemctl daemon-reload
Activer le service pour qu’il se lance au démarrage :
sudo systemctl enable birdnet-mqtt.service
Démarrer le service :
sudo systemctl start birdnet-mqtt.service
E-3 : Vérifier le service :
Pour vérifier le statut du service birdnet-mqtt, utilisez la commande suivante :
sudo systemctl status birdnet-mqtt.service
Cette commande affichera des informations détaillées sur l’état du service, y compris s’il est en cours d’exécution (active (running)), s’il y a eu des erreurs, et les dernières entrées de son journal.
A ce stade, le rapberry pi Birdnet doit envoyer des informations à Home Assitant via mqtt.
3- Configuration coté Home assistant :
A - Configuration ds sensors dans configuration.yaml:
Dans votre fichier configuration.yaml, il faut ajouter des senors qui permettent de récupérer les informations envoyé par le raspberry pi Birdnet via le mqtt .
mqtt:
sensor:
- name: "Dernière détection d'oiseau"
state_topic: "birdnet/detection"
value_template: "{{ value_json.common_name }}"
icon: "mdi:bird"
json_attributes_topic: "birdnet/detection"
unique_id: Derniere_detection_oiseau
- name: "Confiance de la détection"
state_topic: "birdnet/detection"
value_template: "{{ (value_json.confidence * 100) | round(2) }}"
unit_of_measurement: "%"
icon: "mdi:percent"
unique_id: Confiance_de_la_detection
- name: "Nom scientifique"
state_topic: "birdnet/detection"
value_template: "{{ value_json.scientific_name }}"
icon: "mdi:leaf"
unique_id: Nom_scientifique
- name: "Heure de la détection"
state_topic: "birdnet/detection"
value_template: "{{ value_json.timestamp }}"
icon: "mdi:clock"
device_class: timestamp
unique_id: heure_de_la_detection
B - Card Lovelace :
Card très basique :
type: entities
title: Dernières détections d'oiseaux
state_color: false
entities:
- entity: sensor.derniere_detection_doiseau
- entity: sensor.nom_scientifique
- entity: sensor.confiance_de_la_detection
- entity: sensor.heure_de_la_detection
Sur les conversations :
et sur le blog de Kyle Niewiada
il y a de belles cards, avec des images des oiseaux.
C’est un peu complexe à mettre en place, mais c’est une bonne base pour améliorer les cards.
Un conseil il faut vraiment utiliser le type de card : type: markdown, je ne suis pas arrivé avec picture-card ou picture-element.
**A ce stade, vous devriez avoir lié Birdnet à Home assistant.
BONUS :**
J’ai essayé de moderniser la page web de Birdnet-pi et j’ai créé une nouvelle page web :
Vous pouvez trouver mon site sur cette page là :
https://jpbirdnet.duckdns.org/
**
**
J’espère que vous serez émerveillé par ce beau projet et que vous trouverez du plaisir à reconnaitre les oiseaux situés à proximité de chez vous.









