Files
hassio-addons/birdnet-go-dev/README.md
Alexandre 0df49c3858 docs(localdisks): say folder mounts need a build after 2026-09-19 (#3077)
#3076 changed the shared template without bumping add-on versions, so each
add-on picks up folder mounts at its next build. Until then, the old code
reads "NAS/public" as a disk named "public". Depending on the folder name,
it skips the entry, aborts the mount script, or mounts another disk whole.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-19 13:40:02 +02:00

13 KiB

Home assistant add-on: Birdnet-Go (from source)

⚠️ Test build. This is a special variant of the standard birdnet-go add-on. Instead of pulling the prebuilt ghcr.io/tphakala/birdnet-go image, it compiles BirdNET-Go from the alexbelgium/birdnet-go fork. At build time it syncs the fork's main with the tphakala/birdnet-go upstream and merges every open non-draft ("in review") pull request on the fly (see merge-prs.sh), so the binary reflects upstream main plus all work currently under review. Everything below is identical to the standard add-on, except the fork-only settings listed under Fork-only settings.

I maintain this and other Home Assistant add-ons in my free time: keeping up with upstream changes, HA changes, and testing on real hardware takes a lot of time (and some money). I use around 5-10 of my >110 addons so regularly I install test machines (and purchase some test services such as vpn) that I don't use myself to troubleshoot and improve the addons

If this add-on saves you time or makes your setup easier, I would be very grateful for your support!

Buy me a coffee Donate via PayPal

Addon informations

Version Ingress Arch

Codacy Badge GitHub Super-Linter Builder

Thanks to everyone having starred my repo! To star it click on the image below, then it will be on top right. Thanks!

Stargazers repo roster for @alexbelgium/hassio-addons

downloads evolution

About

BirdNET-Go is an AI solution for continuous avian monitoring and identification developed by @tphakala

This addon is based on their docker image.

Configuration

Install, then start the addon a first time. Webui can be found at http://homeassistant:8080. You'll need a microphone : either use one connected to HA or the audio stream of a rstp camera.

The audio clips folder can be stored on an external or SMB drive by mounting it from the addon options, then specifying the path instead of "clips/". For example, "/mnt/NAS/Birdnet/". With localdisks, a folder can be given after the drive name to mount only that folder: NAS/Birdnet mounts just it, at the same /mnt/NAS/Birdnet/ path. Folder mounts need an add-on version released after 2026-09-19.

Options can be configured through three ways :

  • Addon options
BIRDSONGS_FOLDER: /config/clips # where audio clips are stored (can be on a mounted drive)
LOG_MAX_SIZE_MB: 50 # max log file size before rotation
LOG_MAX_AGE_DAYS: 7 # max log retention in days
homeassistant_microphone: false # when true, force audio source to "default" (HA microphone)
env_vars: [] # extra environment variables to pass to the container
TZ: Etc/UTC # timezone, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
mqtt_auto_config: false # set true to auto-wire the Home Assistant MQTT addon into config.yaml
mariadb_auto_config: false # set true to auto-wire the Home Assistant MariaDB addon into config.yaml (also disables SQLite)
  • Config.yaml Additional variables can be configured using the config.yaml file found in /config/db21ed7f_birdnet-go/config.yaml using the Filebrowser addon

  • Config_env.yaml Additional environment variables can be configured there

Fork-only settings

These are currently fork-only settings from the alexbelgium/birdnet-go fork and are not in the standard add-on. merge-prs.sh syncs the fork's main with upstream before applying open PRs, so once a PR merges upstream the setting stays in this build — it just arrives via that sync instead of the PR-merge step, and stops being fork-only. Only a PR that is closed without merging drops its setting from later builds.

First daily detection consensus

Requires a second model to confirm the first detection of each bird species each day. Until one is accepted, every attempt for that species is held to the same two-model bar; only once a detection clears it does every later detection that day behave exactly as it does today, on a single model.

The first detection of a species in a day is the weakest evidence the pipeline produces, and it is the one that creates a "new species today" entry. Asking two models to agree on just that one detection removes most spurious new-species entries without slowing anything else down.

Off by default. Turn it on in the web UI under Settings → Filters → First Daily Detection Consensus, or in config.yaml:

realtime:
  firstdailyconsensus:
    enabled: true

The setting is re-read on each detection cycle, so it takes effect without restarting the add-on.

It deliberately does nothing in these cases, all of which keep today's single-model behaviour:

  • you run only one bird model (the default) — a second opinion does not exist, so the rule can never trigger
  • the species is not a bird — bats and the non-bird sound classes Perch reports (insects, amphibians, mammals, power_tool, and so on)
  • the species is not known to every active bird model analyzing that audio source — a species only one of them can name could never reach two confirmations. With several sources running different model combinations, this is decided per source, not add-on-wide
  • a dynamic threshold has actually lowered the bar for that species, meaning you asked for a more permissive gate
  • the taxonomy or the database cannot be consulted — it fails open and accepts the detection

In practice it only bites when a single audio source has two or more bird models (for example BirdNET plus Perch) analyzing it, on species all of them can identify. The trade is fewer false new-species entries, at the cost of occasionally delaying a genuine first sighting until a second model agrees.

Requires alexbelgium/birdnet-go#63.

MQTT and MariaDB auto-configuration (opt-in)

If the Home Assistant MQTT addon is installed and running and you set mqtt_auto_config: true in the addon options, the addon writes the HA Mosquitto credentials directly into BirdNET-Go's config.yaml on every startup: realtime.mqtt.enabled, broker, username, and password are populated, and the topic defaults to birdnet. In addition, it enables BirdNET-Go's native Home Assistant MQTT auto-discovery (realtime.mqtt.homeassistant.enabled), so the detection sensors show up in Home Assistant automatically — no manual MQTT sensor YAML required (the hand-written sensors in HAINTEGRATION.md remain available if you prefer to build your own). Messages are also retained (realtime.mqtt.retain: true) so sensor states survive Home Assistant restarts. When the option is false (the default), the addon still logs the broker details and reminds you about the option whenever Mosquitto is detected — nothing is written.

If the Home Assistant MariaDB addon is installed and running and you set mariadb_auto_config: true, the addon writes the HA credentials into output.mysql.* and sets output.sqlite.enabled to false (database name birdnet, created on first connect). When the option is false (the default), the addon only logs the credentials so you can configure them manually.

The addon also seeds output.sqlite.path and logging.file_output.* defaults only when those keys are missing from config.yaml, so values you change through the BirdNET-Go UI now survive container restarts.

Mounting Drives

This addon supports mounting both local drives and remote SMB shares:

Custom Scripts and Environment Variables

This addon supports custom scripts and environment variables through the app_config mapping:

Installation

The installation of this add-on is pretty straightforward and not different in comparison to installing any other add-on.

  1. Add my add-ons repository to your home assistant instance (in supervisor addons store at top right, or click button below if you have configured my HA)

    Open your Home Assistant instance and show the add add-on repository dialog with a specific repository URL pre-filled.

  2. Install this add-on.

  3. Click the Save button to store your configuration.

  4. Set the add-on options to your preferences

  5. Start the add-on.

  6. Check the logs of the add-on to see if everything went well.

  7. Open the webUI and adapt the software options

Integration with HA

Home Assistant Integration instructions are found here, Birdnet-Go Addon: Home Assistant Integration

Setting up a RTSP Source using VLC

VLC opens a TCP port but the stream is udp. Because of this will need to configure Birdnet-Go to use udp. Adjust the config.yaml file to udp or use the birdnet-go command line option:

--rtsptransport udp --rtsp rtsp://192.168.1.21:8080/stream.sdp

Linux instructions

Run vlc without an interface using one of these commands:

# This should work for most devices
/usr/bin/vlc -I dummy -vvv alsa://hw:0,0 --no-sout-all --sout-keep --sout '#transcode{acodec=mpga}:rtp{sdp=rtsp://:8080/stream.sdp}'

# Try this if the first command does not work
/usr/bin/vlc -I dummy -vvv alsa://hw:4,0 --no-sout-all --sout-keep --sout '#rtp{sdp=rtsp://:8080/stream.sdp}'

Run arecord -l to get microphone hardware info

**** List of CAPTURE Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC3220 Analog [ALC3220 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: S7 [SteelSeries Arctis 7], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 3: Nano [Yeti Nano], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 4: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]
  Subdevices: 0/1
  Subdevice #0: subdevice #0

hw:4,0 = card 4: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]

Systemd service file example. Adjust the user:group accordingly. If you want to run as root, you will likely need to run vlc-wrapper instead of vlc.

[Unit]
Description=VLC Birdnet RTSP Server
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
StandardOutput=journal
ExecStart=/usr/bin/vlc -I dummy -vvv alsa://hw:0,0 --sout '#transcode{acodec=mpga}:rtp{sdp=rtsp://:8080/stream.sdp}'
User=someone
Group=somegroup

[Install]
WantedBy=multi-user.target

Common issues

Not yet available

Support

Create an issue on github


illustration