Birdnet - tuto - comment repérer et écouter les oiseaux du jardin 🐦

Salut

@Thomas.dmm
Oui le titre est un peu trompeur, c’est pas la journée compléte, mais juste une partie. Heure glissante ou heure fixe, je n’ai de mon coté pas investigué plus : avec parfois 1000 detections par jour, c’est de toute façon pas visuellement efficace d’afficher sur un longue durée.

@bentou
Pour à l’image, il faut que je regarde peut-être que j’ai modifié le lien.

Ma version actuelle

type: custom:stack-in-card
mode: vertical
cards:
  - type: markdown
    uix:
      style: |
        ha-card { border: none !important; box-shadow: none !important; }
    content: |
      ![Image]({{ state_attr('sensor.birdnet_go_events', 'image') }})
  - type: custom:mushroom-template-card
    uix:
      style: |
        ha-card { border: none !important; box-shadow: none !important; }
    primary: "{{ state_attr('sensor.birdnet_go_events', 'common_name') }}"
    secondary: à {{ state_attr('sensor.birdnet_go_events', 'time') }}
    entity: sensor.birdnet_detection
    icon: mdi:bird
    icon_color: blue
    tap_action:
      action: url
      url_path: "{{ state_attr('sensor.birdnet_go_events', 'link') }}"
  - type: custom:mushroom-chips-card
    alignment: start
    uix:
      style: |
        ha-card { 
          border: none !important; 
          box-shadow: none !important;
          --chip-box-shadow: none;
          --chip-background: none;
          padding: 0px 12px 12px;
        }
    chips:
      - type: template
        content: >-
          {{ (state_attr('sensor.birdnet_go_events', 'confidence_score') | float
          * 100) | round(0) }}% de confiance
        icon: mdi:shield-check
      - type: template
        content: "{{ state_attr('sensor.birdnet_go_events', 'scientific_name') }}"
        icon: mdi:identifier
        icon_color: grey
  - type: markdown
    uix:
      style: |
        ha-card { border: none !important; box-shadow: none !important; }
        ha-card table {
          margin-left: auto;
          margin-right: auto;
        }
    content: >-
      Heure|Espèce|Détection|Fiabilité

      :---|:---|:---:|:---:

      {%- set t = now() %}

      {%- set bird_list =
          state_attr('sensor.birdnet_go_events', 'bird_events')
          | sort(attribute='time', reverse=true)
          | map(attribute='name')
          | unique
          | list
      %}

      {%- set bird_objects =
          state_attr('sensor.birdnet_go_events', 'bird_events')
          | sort(attribute='time', reverse=true)
      %}

      {%- for thisbird in bird_list or [] %}

          {%- set ubird =
              (bird_objects
                  | selectattr('name', 'equalto', thisbird)
                  | list
              )[0]
          %}

          {%- set ubird_count =
              bird_objects
              | selectattr('name', 'equalto', thisbird)
              | list
              | length
          %}

          {%- set ubird_max_confidence =
              bird_objects
              | selectattr('name', 'equalto', thisbird)
              | map(attribute='confidence')
              | map('replace', '%', '')
              | map('float')
              | max
              | round(0)
          %}

          {%- if ubird_max_confidence > 70 %}
      {{ ubird.time }} |  [{{ ubird.name }}](https://fr.wikipedia.org/wiki/{{
      ubird.name | replace(' ', '_') }}) | {{ ubird_count }} | {{
      ubird_max_confidence }} %
          {%- endif %}

      {%- endfor %}

      **Ce jour** | Espèces différentes : {{bird_list | count}} | Nb de
      détections : {{bird_objects | count}}

Donc c’est cohérent avec l’affichage plus haut

Et l’image pointe vers (le pinson) https://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Male_Chaffinch_-_Fringilla_coelebs.jpg/1280px-Male_Chaffinch_-_Fringilla_coelebs.jpg

Il me met
https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Short-toed_treecreeper_%28Certhia_brachydactyla_megarhynchos%29.jpg/1024px-Short-toed_treecreeper_%28Certhia_brachydactyla_megarhynchos%29.jpg

alors que toi c’est
https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Short-toed_treecreeper_%28Certhia_brachydactyla_megarhynchos%29.jpg/1280px-Short-toed_treecreeper_%28Certhia_brachydactyla_megarhynchos%29.jpg

je demande à afficher le 1024px alors que toi c’est le 1280px…

mais où estce qu’il va trouver la taille en pixel ???

Absolument aucune idée, j’ai pas souvenir d’avoir modifié quoique ce soit à ce propos

Génial ce projet Birdnet, je connaissais l'appli pour téléphone mais pas tout cela...

ni une ni deux, il y a une heure je me suis lancé, j'ai installé ça sur un container dans mon Proxmox, et il va chercher les flux de mes caméras. Cela fonctionne au top, tous les oiseaux détectés remontent !

Je vais m'atteler un peu plus tard, au calme, à tester la remontée dans HA :slight_smile:

Bonjour à tous,

De fil en aiguille avec mes corrections sur la carte, j'ai fini par packager tout ça proprement. Je partage le résultat, ça peut servir à d'autres.

GitHub - Pulpyyyy/ha-birdnet: Home Assistant integration and Lovelace card for BirdNET-Pi / BirdNET-Go over MQTT · GitHub

C'est une intégration et sa carte Lovelace. L'idée est de remplacer le template sensor à déclencheur et la pile stack-in-card + mushroom + markdown par quelque chose qui s'installe et se configure dans l'interface.

Carte BirdNET

Carte BirdNET

Ce que ça apporte par rapport au montage YAML

  • Le journal du jour survit aux redémarrages. Il est persisté sur disque, remis à zéro à minuit, et exclu du recorder pour ne pas gonfler la base. Plafond à 500 détections par jour au lieu des 20 que gardait le template.
  • Les doublons sont ignorés. BirdNET analyse des fenêtres qui se chevauchent et republie parfois la même détection au même horodatage. Sur certaines journées ça gonflait les compteurs.
  • Seuil de confiance et espèces ignorées se règlent dans l'interface, plus dans du Jinja.
  • Une entité event pour les automatisations, qui ne se déclenche qu'une fois par détection retenue.
  • Le parseur accepte indifféremment le modèle Apprise de BirdNET-Pi, le format de BirdNET-Go (à finir de tester), et les scripts maison du tuto.

La carte

Elle est livrée avec l'intégration et s'ajoute toute seule aux ressources Lovelace, rien à déclarer.

Photo en fond avec le nom, le nom latin, l'heure et la fiabilité en incrustation, puis le journal du jour : une ligne par espèce, heure, nombre de détections, meilleure fiabilité avec une jauge. Éditeur visuel, et trois mises en page selon la place disponible.

compact

minimal

Deux points sur lesquels j'ai passé du temps :

L'écoute du clip. Le bouton en haut à droite joue l'enregistrement sur lequel BirdNET s'est basé. Le lien d'écoute ne pointe pas directement sur le Pi : Home Assistant sert de relais. Sans ça, l'extrait est injouable dès qu'on accède à HA en HTTPS (contenu mixte) ou depuis l'extérieur, puisque le navigateur ne peut pas joindre une adresse privée.

Le responsive. La carte se mesure elle-même via les container queries, elle s'adapte donc à la largeur de sa colonne et non à celle de l'écran. Au-delà de 520 px le journal passe sur deux colonnes, trois au-delà de 760.

L'interface et l'éditeur sont traduits en français, anglais, allemand, espagnol et italien.

Installation

HACS → Intégrations → menu ⋮ → Dépôt personnalisé, catégorie Integration, puis Paramètres → Appareils et services → Ajouter une intégration → BirdNET.

Le modèle Apprise à coller côté BirdNET-Pi est dans le README, c'est celui de ce fil avec quelques champs en plus.

Migration depuis le montage du tuto

La carte sait lire un capteur existant qui expose bird_events, vous pouvez donc l'essayer avant de basculer. Et inversement, le nouveau capteur expose un attribut bird_events au même format pour ne pas casser une carte markdown en place. Les deux peuvent tourner en parallèle le temps de la bascule, MQTT étant du pub/sub. Il y a un MIGRATION.md dans le dépôt.

Précautions

C'est frais, testé sur une seule installation, la mienne. Le relais audio en particulier suppose l'arborescence /By_Date/<date>/<Espèce>/ de BirdNET-Pi — si votre installation range les clips ailleurs, ça ne marchera pas et je suis preneur du retour.

Merci à @JOBE pour le tuto d'origine, c'est lui qui m'a donné le format du payload et la logique du tableau. Et à @KipK dont le guide sur les cartes embarquées dans une intégration m'a évité de m'arracher les cheveux sur l'enregistrement de la ressource Lovelace.

Pensez à nettoyer l'ancien trigger qui n'est plus nécessaire

Retours et issues bienvenus.

Bonjour, c'est superbe ça fonctionne très bien et la migration aucun problème, merci beaucoup pour le temps consacré et le partage c'est top !

Edit : deux petits problèmes :

Le lien est détecté en fonction de ta config. Normalement raspberry-bird.local est le nom que déclare le PI concerné.
C'est pas forcément celui qui est proposé dans l'interface PI, tu as testé si tu l'entends ?
Tu peux me montrer de ou tu trouves ton lien avec ip et php ?

Tu as sélectionné l'option ? Et cliqué sur l'image ?

Merci pour tes retours très rapides, je viens de faire la mise à jour du raspberry-bird et j'ai bien maintenant l'audio directement sous HA et pour le lien forcément si je le sélectionne pas ça ne peut pas marcher.
Du coup tout fonctionne parfaitement

Je préfére ça, j'ai moins de boulot :wink:

Merci à toi pour avoir développé mon approche et de l'avoir mis en orbite ! Bravo! Tu as fait un excellent travail :folded_hands::folded_hands:

Salut,

De rien, mais j'ai agit sous la contrainte :sweat_smile: => Ma femme voulait savoir quels étaient les p'tits oiseaux qui passaient leur temps dans le jardin

Salut a tous

Comme j'ai un bassin est que les oiseaux viennent s'abreuver et faire un brin de toilette, sans oublier que j'avais un rpi4 un ssd 250go et un micro usb qui trainaient dans un tiroir, bin je me suis lancé dans un petit birdnet-pi.

par contre pas de script python , juste une notification MQTT via APPRISE, il y a juste une pauvre ligne a configurer et c'est terminé.

Voici la carte que j'ai créée, c'est simple mais suffisant pour moi

A+ Fred