* fix(birdnet-pi): turn ALSA_CARD into a valid ALSA PCM name for REC_CARD 99-run.sh copied ALSA_CARD verbatim into REC_CARD, but BirdNET-Pi passes REC_CARD to "arecord -D" (scripts/birdnet_recording.sh) and "ffmpeg -f alsa -i" (scripts/livestream.sh), which expect an ALSA PCM name. A card index such as ALSA_CARD=1 therefore produced "Unknown PCM 1" and no recording at all. Build "plughw:CARD=<value>,DEV=0" from a card index or card id, and pass through a value that already is a PCM name. Also use sed --follow-symlinks so the rewrite no longer replaces the ~/BirdNET-Pi/birdnet.conf symlink with a detached copy of /config/birdnet.conf. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix: address CodeRabbit review * fix(birdnet-pi): bump version so the ALSA_CARD fix actually ships The PR changed 99-run.sh and added a CHANGELOG entry but left config.yaml untouched, so `version` still read 2026.08.02. Supervisor only offers a rebuild when `version` changes: without this the fix would have merged, the add-on would have kept running the old image, and the issue would have looked closed while ALSA_CARD stayed broken. 2026.08.15 matches the CHANGELOG heading this PR already adds, which is this add-on's convention — every past version lines up with a dated heading (2026.08.02, 2026.07.22, ...). Not a `.N` counter bump: birdnet-pi's `version` has drifted from updater.json's `upstream_version` (0.11), so the counter rule does not apply and the add-on's own date scheme governs. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(birdnet-pi-zach): turn ALSA_CARD into a valid ALSA PCM name for REC_CARD birdnet-pi-zach/rootfs/etc/cont-init.d/99-run.sh carried a byte-identical copy of the same bug fixed in birdnet-pi by this PR: REC_CARD was copied verbatim from ALSA_CARD, but BirdNET-Pi passes REC_CARD to "arecord -D" and "ffmpeg -f alsa -i", which expect an ALSA PCM name, not a card index. sed -i also replaced the $HOME/BirdNET-Pi/birdnet.conf symlink with a detached copy on first use. Apply the same fix: build "plughw:CARD=<value>,DEV=0" from a card index or card id, pass through a value that already is a PCM name, and use sed --follow-symlinks against /config/birdnet.conf only. Documented in README_standalone.md, same as birdnet-pi. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix: resolve ALSA_CARD against real PCM names, not a fixed allowlist CodeRabbit and Codex both flagged that the passthrough check only recognized default/null/pulse/pipewire: any other colon-free ALSA PCM name (sysdefault, front, surround51, a custom .asoundrc alias, ...) was still misread as a card index/id and rewritten as plughw:CARD=<name>,DEV=0, which then fails to open. alsa-utils is already installed in both images, so check the value against "arecord -L" (an exact, whole-line match against its unindented PCM-name lines) instead of hardcoding the set of names ALSA ships with. Anything that isn't a real PCM name still falls through to the plughw:CARD= build, so a numeric index or a card id is handled exactly as before. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
6.0 KiB
BirdNET-Pi Docker Installation Guide
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!
Addon informations
This guide provides instructions on how to install and run the BirdNET-Pi container using Docker Compose without dependency on HomeAssistant.
Note : For usage as an HomeAssistant addon, see here
Thanks to @gotschi for the initial Docker Compose
Prerequisites
Ensure you have the following installed on your system:
Installation
-
Create a directory for BirdNET-Pi
mkdir -p ~/birdnet-pi && cd ~/birdnet-pi -
Create a
docker-compose.ymlfile Create and open the file with:nano docker-compose.ymlCopy and paste the following configuration:
services: birdnet-pi: container_name: birdnet-pi image: ghcr.io/alexbelgium/birdnet-pi-amd64:latest # or ghcr.io/alexbelgium/birdnet-pi-aarch64:latest depending on your system restart: unless-stopped ports: - "8001:8081" # Used to access WebUI - "80:80" # Optional: set to 80 to use Caddy's automatic SSL. Can otherwise be set to null to avoid opening an additional port environment: - TZ=Europe/Vienna # Optional: Set your timezone according to https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - BIRDSONGS_FOLDER=/config/BirdSongs # Folder to store bird songs, be sure to use a path that is mapped to a volume (such as /config) - LIVESTREAM_BOOT_ENABLED=false # Enable/disable livestream on boot - Use_tphakala_model_v2=false # Switch to BirdNET-Go classifier files - ssl=false # Enable/disable SSL - certfile=fullchain.pem # SSL certificate file (located in /ssl/) - keyfile=privkey.pem # SSL key file (located in /ssl/) - pi_password= # Optional: Set web terminal password for user `pi` - MQTT_HOST_manual= # Optional: Manual MQTT host - MQTT_PASSWORD_manual= # Optional: Manual MQTT password - MQTT_PORT_manual= # Optional: Manual MQTT port - MQTT_USER_manual= # Optional: Manual MQTT user - PULSE_SERVER=unix:/tmp/pulseaudio.socket - PULSE_COOKIE=/tmp/pulseaudio.cookie volumes: - ./config:/config # All your configuration files - and location of the default Birdsongs folder - ./ssl:/ssl # SSL certificates - /dev/shm:/dev/shm # Shared memory - /tmp/pulseaudio.socket:/tmp/pulseaudio.socket - /tmp/pulseaudio.client.conf:/etc/pulse/client.conf devices: - /dev/snd:/dev/snd group_add: - audio tmpfs: - /tmp # Optional -
Start the Container Run the following command in the same directory as
docker-compose.yml:docker compose up -dThis will start the BirdNET-Pi container in detached mode.
-
Access BirdNET-Pi Web UI Open your browser and navigate to:
http://localhost:8001 # Or whatever port you have configuredReplace
localhostwith your server's IP address if running on another machine. When prompted for credentials in the web terminal, use the usernamepiand the password defined bypi_password(blank if unset).
troubleshoot
If rtsp feed doesn't work, perhaps you need to add "-rtsp-transport tcp" to your ffmpeg instruction, or allow udp on your network
Selecting the microphone
By default the container records through PulseAudio (REC_CARD=default in birdnet.conf). To record directly from a USB microphone instead, find it on the host with arecord -l, then pass its card number (or its card id) as ALSA_CARD:
environment:
- ALSA_CARD=1 # "card 1: Audio [KT USB Audio]" in the output of "arecord -l"
At startup this writes REC_CARD=plughw:CARD=1,DEV=0 into your birdnet.conf. A value that already is a full ALSA PCM name, as listed by arecord -L, is used as provided - for example ALSA_CARD=dsnoop:CARD=Audio,DEV=0, which allows the recording and the livestream services to read the same microphone at the same time.
Updating to the Latest Version
To check for new versions of the container and update:
-
Check for the latest version Visit the container registry: https://github.com/alexbelgium/hassio-addons/pkgs/container/birdnet-pi-amd64
The latest version tag (e.g.,
2025.02.23) will be listed. -
Update and restart the container Run the following commands:
docker compose pull birdnet-pi docker compose up -d --force-recreateThis pulls the latest image and restarts the container.
-
Verify the update
docker images | grep birdnet-piThis will show the latest downloaded image version.
Stopping and Removing the Container
To stop and remove the container, run:
docker compose down
This will stop and remove BirdNET-Pi while keeping the configuration and recorded songs intact.
Now you're all set to enjoy BirdNET-Pi with Docker! 🐦