GuSi BM1K Last updated: 2025-09-05

This documentation explains step by step how to assemble and program your radio. Time required (excluding printing time): 2-3 hours.
For all analog enthusiasts: the instructions are also available as a PDF file for printing.

1. Partlist

You can use the shopping list to order most components with a single click from reichelt.de (German distributor). The USB-C socket and screws must be ordered separately. Aliexpress is also a good option for overseas purchases, which can significantly reduce material costs.
The printing files for the housing can be downloaded from printables.com

1 x Raspberry Pi Zero W 2

1 x Hifiberry miniAMP

1 x GPIO header edge

1 x Pinmoroni OnOff SHIM

1 x Rotary encoder KY-040

1 x Cherry MX Blue switch

1 x Mico-SD card

1 x Micro-USB solder plug

1 x Dupon housing 1×5

16 x Dupon housing 1×1

4 x Crimp contact male

17 x Crimp contact female

3D-printed parts

1 x Visatron FR8 TA, 10W, 4Ω

Speaker cable (≈0,5 mm2)

Cable (≈0,14 mm2)

1 x LED (5 mm)

1 x USB-C socket

4 x M3 / 8-10 mm

4 x M3 / 5 mm

4 x M3 / 5 mm

2. Cable preparation

Below you can find the amount, length, and connection type of the cables. The colors are optional, but can be helpful when wiring.

1 x Speaker
Length:160 mm
End 1:blank
End 2:blank

5 x Rotary encoder
Length:180 mm
End 1:female
End 2:female

4 x OnOff SHIM
Length:110 mm
End 1:female
End 2:male

2 x Buttons
Length:180 mm
End 1:blank
End 2:blank

2 x LED
Length:180 mm
End 1:blank
End 2:female

3. Wiring

Connect the cables exactly as shown in the diagram below. Stay focused, because just one wrong connection can cause you a lot of troubleshooting time.

4. Assembly

Go through the assembly instructions step by step. Before you proceed to Steps 15-18, first install the software. I recommend not closing the housing until everything is running smoothly.

5. Software installation

Let's start with the installation of the software. First of all, we need an operating system for the raspberry Pi.

5.1 Install operating system

Download the Raspberry Pi imager from the official website, install it and choose the following settings.

  • Raspberry Pi Model: Raspberry Pi Zero 2 W
  • Operating system: Raspberry Pi OS (Other) > Raspberry Pi OS (Legacy, 64-Bit) Lite Bullseye
  • SD card: Select the SD card

Attention

Make sure that you have selected the operating system version “Bullseye”, otherwise the OnOff SHIM will run incorrectly.

Click on CONTINUE and confirm that you want to edit the OS settings by clicking on ADJUST SETTINGS:

GENERAL:
  • Hostname: gusi
  • Username: gusi
  • Password: enter a password
  • Set up wifi: Enter the login data for your WLAN network
  • Wifi country: select your country code
  • Set language settings: Set the correct time zone and keyboard layout

SERVICES:
  • Enable SSH: Use password for authentication

Click on SAVE, confirm with YES that you want to use the settings and start the installation with CONTINUE.

After successfully writing on the SD card, insert it into the Raspberry Pi and start it. The first start takes a little longer. Wait five minutes until you go to the next step.

5.2 Identify IP address

To be able to access the Raspberry, you need the IP address. You can search for the device “gusi” in your router and note the IP, or you can use your computer’s console (CMD in Windows, Terminal in Mac and Linux). Enter the following command and confirm with the ENTER key:

ping gusi.local

If the request is successful, you should be able to read out the IP address of the radio. In my example:
64 bytes from 192.168.1.22: icmp_seq=8 ttl=64 time=5.323 ms

5.3. SSH connection

Open the console (CMD or Terminal) on your computer and enter the command to connect via SSH. Replace the example IP with yours!

ssh gusi@192.168.1.22

5.4. Activate sound card

In the configuration file of the Raspberry, we now activate the sound card and deactivate the Bluetooth module. The last is of course optional.

sudo nano /boot/config.txt

Place the following text at the end:


################## GUSI ################
# Disable Bluetooth
dtoverlay=pi3-disable-bt

# Enable Hifiberry Soundcard
dtoverlay=hifiberry-dac
							

Save the change with CTRL + X and confirm with Y and ENTER.

5.5. Install GuSi

1. Install the required packages to be able to operate the radio:

sudo apt-get update -y && sudo apt-get upgrade -y && sudo apt-get install -y git mpd mpc alsa-utils python3-pip python3-gpiozero hostapd dnsmasq

2. Clone the data from the Git project:

git clone https://github.com/earlmckay/gusi-radio.git

3. Start the installation script:

chmod +x /home/gusi/gusi-radio/setup_files/setup_gusi.sh && sudo /home/gusi/gusi-radio/setup_files/setup_gusi.sh

Select your preferred language and which model of the radio you are using (BM1K).

4. Install the Pimoroni OnOff SHIM. The component ensures that the Raspberry shuts down cleanly when it is switched off and starts up again when the on/off button is pressed again:

curl https://get.pimoroni.com/onoffshim | bash

Restart the device after the installation has been completed.
After the restart, the device is ready for operation and should already start playback.

6. Customization

In this section, we will take a look at customizing your radio so that it meets your requirements.

6.1. Personalize radio stations

1. Connect to the radio via SSH and open the script that controls the playback. (Alternatively, you can edit the script locally on your computer using e.g. FileZilla).

sudo nano /home/gusi/gusi-radio/gusi.py

2. Create a separate variable for each streaming link. For example “S1” for the first station, “S2” for the second station etc. …


S1 = "https://server7.streamserver24.com:61424/stream"
S2 = "http://www.segenswelle.de:8000/deutsch"
S3 = "https://server23644.streamplus.de/stream.mp3"
							

In the variable stations you determine which stations are used and, especially, in which order. The announcements variable determines which announcements are used and in which order. The “s1.mp3” will say: “Station one”. These announcements go up to “Station six”. Beyond that, your own announcements must be generated – or even better: the real name of the station.


#---------- RADIO STATIONS ORDER ----------#
stations = [S1, S2, S3]

#---------- ANNOUNCEMENTS ORDER ----------#
announcements = ["s1.mp3", "s2.mp3", "s3.mp3"]
							

3. Example: You want to use two stations on your radio. 1live and WDR5. The code should look like this:


einslive = "https://wdr-1live-live.icecastssl.wdr.de/wdr/1live/live/mp3/128/stream.mp3"
wdr5 = "https://wdr-wdr5-live.icecastssl.wdr.de/wdr/wdr5/live/mp3/128/stream.mp3"

#---------- RADIO STATIONS ORDER ----------#
stations = [einslive, wdr5]

#---------- ANNOUNCEMENTS ORDER ----------#
announcements = ["s1.mp3", "s2.mp3"]
							

6.2. Auto shutdown

The radio has an automatic shutdown function. This is defined with the variable shutdown_timeout.
The default value is 60 minutes. The countdown starts as soon as the volume = 0, or playback is paused.

shutdown_timeout = 60 * 60

For 30 minutes it would then be 30 x 60.

6.3. Default volume

The default volume of the radio can be adjusted as needed. The setting will be recalled at startup and will remain until the volume is changed manually.
Just enter the volume you want here (0-100).

sudo nano /home/gusi/gusi-radio/user_settings/default_volume.txt

6.4. Customized announcements

The pre-installed announcements were generated with the voice “Stefan Rank der Erzähler” via elevenlabs and normalized to -15 LUFS.
You can use any voice you like and personalize the station’s announcement.

1. Transfer the data (e.g. with FileZilla) to the Raspberry in the main directory (/home/gusi/gusi-radio/).

2. Move the MP3 file to the correct directory. Make sure to enter the correct file name in the command!

sudo mv "/home/gusi/gusi-radio/wdr5.mp3 /var/lib/mpd/music/

3. Update the music database after all required announcements have been moved:

mpc update

Announcements used on the radio:

Error: No WiFi network available/found
Hello! I was unable to find a known Wi-Fi network. Maybe I have a new home, or the connection to the router is broken. If you want to connect me to a new network, you can choose to start the WPS method by pressing the large button, or you can turn it to enter the login details of the router with a smartphone. The WPS method is straightforward, but requires that your router supports WPS. The button for this is often labeled “WPS” or “Connect”. For the alternative setup via smartphone, tablet or computer, I will create a separate Wi-Fi network. Then you can use it to enter the login details for your home network.
So: Press the large button for the WPS method, or turn it for the connection via a device.
If you don't give any input, I'll switch off myself, as I can't play anything without an internet connection.


Setup: WiFi setup via WPS
Okay, let's start with the WPS method.
First press the WPS button on your router. After this, press the big button on the radio so I know when to start searching for the router.


Setup: WiFi setup WPS search started
Okay, thanks for the confirmation. I'll assume that the router is in WPS mode and start searching now.


Error: WiFi setup WPS failed
I'm sorry, I was unable to connect to the router.
Please check if the router is reachable and if the WPS function is available and activated
You can also try the second connection method.
If you still cannot establish a connection, try reducing the distance to the router.
Switch me on again if you want another attempt.


Setup: WiFi setup WPS successful
Perfect.
I was able to connect to the router and am now ready to go.


Setup: WiFi setup via a device
Okay, let's start with the setup via the browser on a device of your choice.
Go to the Wi-Fi settings of your device and search for the Wi-Fi network “GUSI-Radio Setup”. Connect to this. The default password is “One, Two, Three, Four, Five”.
After login, a new window should open automatically. If not, you will need to open the page manually.
Open an internet browser and enter the address: HTTP, colon, slash, slash, one nine two, dot, one six eight, dot, four, dot, one.
Select your Wi-Fi network in the first field, enter the password and confirm your input with “Save”.
I will then save the access data and try to connect the next time I start.


Error: No interaction during setup method
Sorry, I could not detect any input from you.
Without an internet connection I cannot do my job, so I am switching off now.
Turn me on again if you want a new attempt.


Error: No internet connection
Hello, I have a problem with the connection: I am connected to the home network, but I can't access the Internet.
Please check if the router is connected to the Internet or a setting is blocking my connection.
I shut down myself until then. If you want another try, just turn me on again.


Radio station
Station - one. Station - two. ...


Radio station not available
The station is currently unavailable. You can try again later.

6.5. Remote updates

It is possible to enable OTA updates.
When activated, the radio checks at each startup—via an API interface—whether its version matches the version number on GitLab. If the GitLab version is higher, the updated files are downloaded automatically.
This makes it easy to apply small adjustments remotely, such as:

  • Editing the station list
  • Adding or replacing announcement MP3 files
  • Making code changes

1. First, enable the update function in start.py.

sudo nano /home/gusi/gusi-radio/start.py
Remove the # at the beginning of both lines so that they are no longer commented out.


### Feature to update scripts for clients via gitlab ###
log_message("Checking online for a GUSI Update...")
subprocess.Popen(["python3", "/home/gusi/gusi-radio/user_settings/updater.py"])
							

2. Make the updater.py file executable.

chmod +x /home/gusi/gusi-radio/updater.py

3. Log in to GitLab and create a new project. Inside the project, the following folder structure must be present:

							
user Root folder
└─────── 1278-V1 Folder with user-ID and version
└─────── gusi.py File that should be modified or replaced.
└─────── ann_wdr4.mp3 MP3 file that should be added additionally.

Go to your user settings. Open the Access tokens tab and create a new token via Add new token.
Give it a name, e.g. "gusi-update" and enable the options read_api and read_repository. Click Create token to generate the key.

Warning

The token has a defined lifetime. Once it expires, a new token must be generated and manually replaced in the radio. To avoid this, you can renew the tokens before they expire.

4. Adjust the updater-config.json file.

sudo nano /home/gusi/gusi-radio/user_settings/updater-config.json
  • version: Defines the current version of the radio. It’s a good idea to start with “1”. With each update, the number will be increased automatically.
  • user-id: A four-digit number assigned to the radio.
  • gitlab-token: Insert the token you generated earlier.
  • project-id: The ID of your project (you can find it in the project header under the three-dot menuCopy Project ID).


{
    "version": 1,
    "user_id": "1278",
    "gitlab_token": "xxxxx-xxXxxxxxXX_XXx-xxxXXXx",
    "project_id": "67191617"
}
							
Trigger the update

To trigger an update, you need to increase the version number in the folder name on GitLab (e.g. from 1278-V1 to 1278-V2). This way, the radio knows that new data is available.

And to let the radio know what needs to be changed, we provide a control file updater.sh via GitLab. This file contains the commands that the radio executes automatically (e.g. replacing the updated gusi.py).


#!/bin/bash
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> /home/gusi/gusi-radio/logs/update.log
}

cp /home/gusi/gusi-radio/update/gusi.py /home/gusi/gusi-radio/
log "gusi.py aktualisiert"

mv /home/gusi/gusi-radio/update/ann_wdr4.mp3 /var/lib/mpd/music/
log "ann_wdr4.mp3 moved to /var/lib/mpd/music/"

mpd update
log "mpd updated"

log "Update commented"
exit 0

							
This code does the following: It eplaces the current gusi.py, moves the new MP3 file and updates the MPD database so the MP3 can be found.