Home entertainment rebuild (1)

I used to have a “home entertainment system” to play music (MP3), radio (web streams) and movies (via a beamer). The music/radio portion ran on a raspberry pi 1, the movies I played from a Lenovo desktop.
However, all parts were om the edge of their usable lifetime or already broken.

Old setup

My old setup consisted of:

  • Amplifier: Yamaha AX-492
  • Speakers: JBL (SMS-100 subwoofer, 2 100SAT satellite speaker)
  • Video: BenQ TW 529 projector
  • Media center 1: Raspberry Pi 1 to play audio (music or web radio, homebrew distro, which I call MPDpi because all it does is play via MPD)
  • Media center 2: A Lenovo desktop I got on the cheap, to play movies

The speakers were broken: the satellite speakers had the cone foam broken. The amplifier (originally from I think from 1999) was recently renovated by a friend. That same friend sold me a pair of Dali speakers.

The Rapsberry Pi 1 is still my daily driver for music and web radio streams. I have an IR sensor hooked up to it and can control it with a remote control and my phone. However, it lacked some functionality I had earlier after I had to reinstall it due to an SD card crash, like detection of the power state of the amplifier, and a shutdown button.

I had bricked the Lenovo pc I used to run Kodi in mid 2019. I bought a Raspberry Pi 3 to replace it, and two days after that (I had not even recieved it), the RPi 4 was announced. However, the end of the year is always a busy time for me, and then came covid, and countrary to the rest of the whole working world, I was busier than ever with work and certainly did not have time to tinker.

Also, behind all the equipment there was a horrible mess of cables.

Project goal

My goal for this project is the following:

  • Have one device for both music and video (Kodi)
  • Install the better Dali speakers
  • Easy to control
  • Make my bookcase look cleaner
  • Ideally: be able to stream audio (over bluetooth) to the speakers, and to stream video (casting) to the beamer
  • Ideally: be able to play retro games
  • Ideally: be able to use Youtube, NPO Start

Cleaning up

First order of business was cleaning up.
I removed all cables that I didn’t use. Moved my router (that was in the same area) to on top of my bookcase for better reception and put the speakers where I wanted them.

Then, I installed new speakers. Unfortunately, the only speaker cables I had were old, severely oxidized, and a few centimeters too short. But even then, the sound quality was formidably better. The old speakers were literally ringing from having perished foam around the speaker cones.

One problem with the new speakers is that they are much more directional than the old ones. They are meant to be used directly aimed at the listener (say: on the sides of a TV), but I did offend all audiophiles by installing them in a bookcase (they are called bookshelf speakers) behind the couch, relying on the wall reflecting the sound.
In a later episode, I will also offend all videophiles by projecting my video on a rough painted-white wall.
I had to get used to the sound of the speakers, but by increasing the loudness setting on the amp a tiny bit I got a good compromise between sound quality walking around the house and sitting on my sofa. Update: It was really a matter of getting used to the new, better sound – I removed all loudness and it still sounds great.

A few weeks later, I installed newer new speaker cables: they are new, non-oxidized, a little bit thinner, but I have the feeling the sound was a lot better already.

Setting up a temporary workspace

I like to first have a temporary setup to be able to work on the Raspberry Pi on my desk, next to my work pc.
I needed the following devices and cables:

  • Image: Monitor, Mini HDMI to HDMI, HDMI Cable, HDMI to DVI-convertor, Power cord
  • Audio: Trust Leto (Cheapest speakers available), Hifiberry DAC+, Tulip-to-3.5mm jack, 3.5mm jack splitter
  • Connectivity: Network cable
  • Misc: USB power brick, USB-A to USB-C cable, mouse, keyboard

A little plugging and finding cables later (the HDMI cable I had turned out to be HDMI to Displayport, I had to dig deep in my cable drawer for a HDMI-HDMI cable and switch the old monitor, that had only VGA and DVI, for one of the monitors that’s on my computer, which has HDMI as well) the monitor did not display anything, and the RPi blinked a led 4 times, which means “start*.elf not found”. So, the SD Card that was already in the Pi had no usable image.

I had decided earlier on an install of retropie, as it promised it would run Kodi without too much clutter. This turned out to not be the case for me.

Dealing with a faulty SD card

I downloaded a new RetroPie image and installed it with step 2 from my Basic Raspberry Pi Headless Wired install, which is copying the image file over to the SD card. I did this with dd in a terminal window in Dolphin, but that would stop showing status updates after ± 20s, and was unkillable, except by pulling out the SD card. In a Konsole terminal it did copy over to the card, with an astounding 1.6MB/s. However, it seemed to hang after fully writing. Apparently, this is somewhat normal behaviour of using conv=fsync. However, even without the conv=fsync, dd hung a few times.
Testing with Badblocks I found

$ sudo badblocks -n -v /dev/sdj
Checking for bad blocks in non-destructive read-write mode
From block 0 to 7802879
Testing with random pattern:
badblocks: Input/output error during test data write, block 448

It found multiple bad blocks. Due to wear leveling, an SD card should self-clear bad blocks and never have any bad block. According to this post, even one bad block means a broken SD card. I tossed this one.

Another card gave

$ sudo badblocks -n -v /dev/sdj
Checking for bad blocks in non-destructive read-write mode
From block 0 to 7761919
Testing with random pattern: Pass completed, 0 bad blocks found. (0/0/0 errors)

Back in business

The good SD card meant I could continue with step 2 from my Basic Raspberry Pi Headless Wired install:

$ sudo dd bs=4M if=retropie-buster-4.8-rpi4_400.img of=/dev/sdj status=progress
3148873728 bytes (3,1 GB, 2,9 GiB) copied, 208 s, 15,1 MB/s
750+1 records in
750+1 records out
3148873728 bytes (3,1 GB, 2,9 GiB) copied, 587,84 s, 5,4 MB/s

So, finally a clean install!

Then, I did steps 3-9 of my basic Pi install (choosing as IP and using retropie as hostname, for now). This worked fine and I could login via ssh.

Installing the Hifiberry

Next, I wanted to try the Hifiberry, which is a DAC (digital to analog converter) for the Raspberry Pi. It can do audio conversion with a dedicated chip with more precision than the CPU of the Raspberry Pi can, and it is dedicated. So it promises better sound quality.

First check: did the Raspberry (with Hifiberry) play any sound at all? I connected the speakers to the headphone jack, installed mpg123 and tried to play the stream for Studio Brussel:

sudo apt-get install mpg123
mpg123 http://icecast.vrtcdn.be/stubru-high.mp3

Initially, I got no sound. I found a solution by Dengfeng, which is to disable the HDMI and composite video in raspi-config:
sudo raspi-config6 Advanced optionsA8 HDMI / CompositeDisable 4Kp60 HDMI and composite video and then reboot. This made audio work. However, I still had no video! It turned out that my combination of Mini HDMI to HDMI + HDMI (male-male) cable + HDMI to DVI converter was not working.
←This will disable video entirely, which is not what I want obviously!
I found out that the sound is played by default through HDMI and can be moved to the headphone jack (which can also do composite video, if I ever want to attach an old-fashioned tv) in raspi-config under 1 system optionsS2 AudioHeadphone output→select Jack output.

Next, I installed my Hifiberry, which was just a matter of popping it on top of the Pi.
I ran in a bit of problem with connecting the speaker: they had a male 3.5mm jack plug. The Hifiberry I chose only had RCA plugs, and I only had RCA to male 3.5mm cables that I was not willing to sacrifice. I am sure I must have a female-female 3.5mm jack splitter somewhere, but I could not find it. However, I did find a 3.5mm splitter (for if you want to listen with two headphones to one walkman) and realized that also can act as a female-female converter. Just don’t let the male prong touch anything conductive.

This setup did not produce any sound at the first try.
From the hifiberry config page:

In /boot/config.txt:

  • Comment the line #dtparam=audio=on
  • Add audio-off to dtoverlay=vc4-fkms-v3d,audio=off
    (or, if the line was had “kms” instead of fkms: add ,noaudio:
  • Add the line dtoverlay=hifiberry-dacplus

On reboot, aplay -l showed

**** List of PLAYBACK Hardware Devices ****
card 0: sndrpihifiberry [snd_rpi_hifiberry_dacplus], device 0: HiFiBerry DAC+ HiFi pcm512x-hifi-0 [HiFiBerry DAC+ Hi
Fi pcm512x-hifi-0]
Subdevices: 1/1
Subdevice #0: subdevice #0

This is good. But …

pi@retropie:~ $ mpg123 http://icecast.vrtcdn.be/stubru-high.mp3
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
version 1.25.10; written and copyright by Michael Hipp and others
free software (LGPL) without any warranty but with best wishes
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
Segmentation fault

Turned out I forgot to configure alsa in /etc/asound.conf. I added:

pcm.!default {
   type hw card 0
ctl.!default {
   type hw card 0

And then it worked!
Nice! I have a base system setup, with a working audio via the Hifiberry!

Installing Kodi (part 1)

I had installed Retropie above. But it kept crashing, and even audio output from the terminal was slow, so I decided I wanted something more stable, so instead I decided to install a vanilla Raspberry Pi OS (the new name for Raspbian) Lite (without X) using their Imager.
After going through all the steps I had done before, the command to install kodi is just

sudo apt install kodi

That pulls in a whole lot of packages (240, including everything needed for X), but afterward, running


I was greeted by the Kodi home screen with some Kodi installation settings!
That was easy!

Note that the GPU split apparently needs to be 256MB (“at least 160MB”) for kodi, this can be changed with raspi-config.

I immediately added the option to control kodi from HTTP from settings→Control→Allow remote control via HTTP. I could now control Kodi from Kore, the official Kodi Android app.

I decided not to go on with the Kodi install for now, but make the audio portion work first.

Installing NFS

On my NAS, I have a NFS share with all my movies and audio on it. I roughly followed a guide at PiMyLifeup. First step should be to install NFS-common (sudo apt-get install nfs-common), but that was already installed. Then I made a mountpoint and manually mounted the NFS drive:

mkdir /media/nfsMovieDisk
sudo mount -t nfs -o proto=tcp,port=2049 /media/nfsMovieDisk

This worked. To automatically boot the NFS share, I can put a line for it in /etc/fstab. I copied the line from my MPDpi:  /media/nfsMovieDisk     nfs4    defaults    0       2

This means: mount the (shared) root of (my NAS) at /media/nfsMovieDisk, type nfs4, default options, no backup, not the first device to boot.

A quick reboot confirmed that the NAS drive was mounted at boot.

Installing MPD

What I want from the raspberry pi is to play audio (web streams and mp3’s stored on another computer) using MPD, and operate mpd via both an IR remote control and the MPDroid app.

I just tried

sudo apt-get install mpd

Then I edited the /etc/mpd.conf according to what I had in my MPDpi. Notably, the lines with

  • music_directory: "/media/nfsMovieDisk/Audio"
  • bind_to_address: "any"

I added a few streams to /var/lib/mpd/playlists (giving those files user mpd with a sudo chown mpd <filename>.m3u, and updated the library by typing (from another computer)

mpc --host= update --wait

The mpdroid app on my phone would connect to mpd and play mp3’s from my NFS share happily. When playing a web radio stream, it would take about 10 seconds to start, and sometimes pause for a second. I could not find an immediate solution. Then I remembered mpg123 was also very slow to start a stream. I spent an hour googling, no one seemed to have the same problem, but I did find a remark about network configuration. That made me wonder whether my network was setup right. A quick test revealed it wasn’t:

$ping icecast.vrtcdn.be
PING icecast.vrtcdn.be(2600:9000:238d:7a00:14:8356:dcc0:93a1 (2600:9000:238d:7a00:14:8356:dcc0:93a1)) 56 data bytes
64 bytes from 2600:9000:238d:7a00:14:8356:dcc0:93a1 (2600:9000:238d:7a00:14:8356:dcc0:93a1): icmp_seq=1 ttl=58 time=
10.2 ms
64 bytes from 2600:9000:238d:7a00:14:8356:dcc0:93a1 (2600:9000:238d:7a00:14:8356:dcc0:93a1): icmp_seq=2 ttl=58 time=
10.3 ms

The first result took over 15 second to show up. My mpdpi had about similar ping times, but with IPv4 the first line came a lot faster.

This thread offered no direct help, but made me think the problem lay in the dns resolving.

My /etc/resolv.conf was

# Generated by resolvconf
nameserver fd51:42f8:caae:d92e::1
nameserver fd00::3ea6:2fff:fe8e:1f24

The first line pointed to a non-existing nameserver, as I chose to have my local domain be 192.168.15/24.

In step 8 of my Basic Raspberry Pi Headless Wired install, I set the nameservers in /etc/dhcpcd.conf. Indeed, I had forgotten to update the domain_name_servers to After I did that, Ping and playing mpd web streams were now lightning fast!

Installing LIRC

I want to recieve (and possibly later send) infrared (IR) systems from a remote control and use that to control the media centre. LIRC (Linux InfraRed Control) can do that (and did that on my mpdpi). To recieve infrared signals from remote controls, I need to connect an IR reciever to the raspberry Pi. However, the Hifiberry takes up the entire pin header where you’d normally attach GPIO, but has space for another pin header that I had to solder on (voiding the warranty).

However, there are several pins that are reserved: GPIO 0-3 and 18-21, which turn out to be GPIO pins 27, 28, 3, 5, 12, 35, 38, 40, respectively). This means I have all other pins available to me. Because I only had a 26 (2×13) female pin header, I decided to only put the header pins on pins 1-26, but omitting reserved pins 3,5 and 12. Luck would have it that I had a 22 pin header, and I snapped one pin off from another header.

I was happy at my soldering job: apart from a few scars at the plastic header, it went reasonably well, and I tested all pins for connectivity and not having shorts with any of it’s neighbors.

I also needed an infrared reciever. The one I had was connected to a 2.5mm jack, but I had an IR reciever connected to serial port that I made in 2001, the whole thing put in a CD jewelcase. As it was set up for the higher serial port voltages, I solder-tacked a cable directly to the TSOP1738. The other end, I made from the audio connectors of and old PC: pink for the IR reciever, and maybe I want to try an IR sender later, so I reserved the green one for that. Figuring out the pins for those connectors took me some time, turns out each has 5 pins: one for ground, left and right audio, and two that connected to detect when a jack plug was inserted.
I connected the tip to +5V, ring to the GPIO and sleeve to ground. (I later found out that this makes the system non-hotpluggable: the RPi reboots on inserting the jack plug).
The two female audio connectors were on a little breakout board which had a 10 pin header, that connected to two other 10 pin headers for use on the mainboard, one labelled “AC ’97” and the other “HD Audio”. I decided to use these headers temporarily, rewiring them so one was used for power and ground (covering pins 1-10) and the other for GPIO 25 (pin 22), and the future blaster to GPIO 11 (pin 23) (covering pins 21-30, with pins 26-30 not populated).

With the hardware part complete, now the software. I followed this guide from [alexba], which is ancient (from 2013), but I found the url it in my old MPDpi’s /boot/config.txt, and a more up-to-date (but less structured) instructable.

First: install LIRC:

sudo apt-get install lirc

You don’t need to add things to /etc/modules as written in the Alexba manual anymore. Instead, add one line to /boot/config.txt: (and note that dtoverlay=lirc-rpi is ancient as well, use gpio-ir).

# Note: these are GPIO numbers, not pin numbers!
#dtoverlay=gpio-ir-tx,gpio_pin=22 #disabled because I don't use it yet

To test whether infrared reception works, use the program mode2, which shows the raw output of a remote. First stop the lirc service, then use mode2 to test:

$sudo systemctl stop lircd.service
$sudo mode2 -d /dev/lirc0  
Using driver devinput on device /dev/lirc0
Trying device: /dev/lirc0
Using device: /dev/lirc0
Running as regular user pi
code: 0x7c381f0014c51e006b23000149110000
code: 0x7b020001ee0100007f0200015b060000
code: 0x65020001ee0100007e0200015b060000
code: 0x640200015a0600007f02000141060000
code: 0x7e0200015b06000065020001ee010000
Partial read 4 bytes on /dev/lirc0pi@kodipi:~ $

It did respond to button presses of a remote, but not in a format I expected, and after one press it quit. A quick google led to this question from stackoverflow. The solution was to change two lines in /etc/lirc/lirc_options.conf:
driver          = default
device          = /dev/lirc0

This gave me the expected results with mode2:

$sudo mode2 -d /dev/lirc0 
Using driver default on device /dev/lirc0
Trying device: /dev/lirc0
Using device: /dev/lirc0
Running as regular user pi
pulse 9071
space 4443
pulse 613
space 493
pulse 641
space 39881
pulse 9069
space 2178
pulse 638
timeout 135368

This means my IR reciever recieves remote control signals!

Next step, is to define actions based on button presses. For example, if I want to play or stop the music when I press the “pause” button. For that I first need mpc, which is the reference implementation of the client for the mpd.

sudo apt-get install mpc
mpc pause

This just worked: the playing stream stopped (and a mpc play restarted it)

Lirc has a helper program, irexec, that can run other programs when recieving button presses. The two main configuration files are /etc/lirc/lircd.conf.d/<name>.conf (one for each remote) and /etc/lirc/irexec.lircrc (this used to be /etc/lirc/lircrc).

I copied over the file irexec.lircrc from my old mpdPi’s lircrc. However, it did not work immediately. After reading the irexec man page, I found that irexec has it’s own service, which needs to be started. sudo systemctl start irexec starts the service, and now the pause button on my remote stops the music playing. However, irexec would not automatically start at boot.

Raspberry Pi OS now uses systemd to start services. I found this useful introduction to systemd (specifically for the RPi). In the end, it was as simple as

sudo systemctl enable irexec

I did make a few changes to /usr/lib/systemd/system/irexec.service, for which I submitted a bug to raspbian: I added the program name to the description line (as well as for lircd.service and lircd-setup.service) and added After=multi-user.target lircd.service (to describe when it should start). This made the startup messages a lot clearer and lirc and irexec immediately follow each other.

Lirc config files

There are two config file(sets) that are very important: the definition of remote controls and the actions to be taken.

For the remote controls, there used to be a file /etc/lircd.conf where you had to put all your “remote” configurations in one file. That is replaced with one file per remote in the directory /etc/lirc/lircd.conf.d/. You can record a remote with LIRC’s IRrecord. But, I already had a configuration file on my MPDpi, so I copied that and split it into three files for three different remotes.
The file for the Yamaha RAX1 I have is

# Please make this file available to others
# by sending it to <lirc@bartelmus.de>
# this config file was automatically generated
# using lirc-0.9.0-pre1(default) on Mon Mar  3 22:35:39 2014
# contributed by 
# brand:                       Yamaha
# model no. of remote control: RAX1 (VU07410)
# devices being controlled by this remote:

begin remote

  name  Yamaha_RAX1
  bits           16
  eps            30
  aeps          100

  header       9039  4458
  one           602  1647
  zero          602   522
  ptrail        598
  repeat       9039  2211
  pre_data_bits   16
  pre_data       0x5EA1
  gap          108000
  toggle_bit_mask 0x0

      begin codes
          SELECT_AUX               0xE817
          SELECT_TAPE2             0x9867
          SELECT_TAPE1             0x18E7
          SELECT_TUNER             0x6897
          SELECT_CD                0xA857
          SELECT_PHONO             0x28D7
          VOLUME_UP                0x58A7
          VOLUME_DOWN              0xD827
          POWER                    0xF807
          TAPE_DIRA                0xE01F
          TAPE_DIRB                0x02FD
          TAPE_REC/PAUSE           0x20DF
          TAPE_PLAY                0x00FF
          TAPE_STOP                0xC03F
          TAPE_A/B                 0x609F
          TAPE_<<                  0x807F
          TAPE_>>                  0x40BF
          TUNER_PRESET-            0x8877
          TUNER_PRESET+            0x08F7
          TUNER_A/B/C/D/E          0x48B7
          CD_<<                    0xB04F
          CD_>>                    0x30CF
          CD_|<<                   0xD02F
          CD_>>|                   0x50AF
          CD_DISC                  0xF20D
          CD_PLAY                  0x10EF
          CD_STOP/PAUSE            0x906F
      end codes

end remote

The irexec.lircrc file lists all actions for the remote:

begin radio
        prog = irexec
        button = CD_STOP/PAUSE 
        config = mpc stop
        flags = quit
        repeat = 0
        prog = irexec
        button = CD_DISC
        config = mpc-play music
        repeat = 0
        flags = mode
end radio

        prog = irexec
        button = TUNER_PRESET- 
        config = mpc-play StuBru
        repeat = 0
        mode = radio
        prog = irexec
        button = TUNER_PRESET+ 
        config = mpc-play "Radio 1"
        repeat = 0
        mode = radio
        prog = irexec
        button = CD_DISC
        config = mpc play
        repeat = 0
        prog = irexec
        button = POWER
        config = mpc stop
        repeat = 0
        prog = irexec
        button = CD_<<
        config = mpc seek -0:00:10
        repeat = 1
        delay = 4
        prog = irexec
        button = CD_>>
        config = mpc seek +0:00:10
        repeat = 1
        delay = 4
        prog = irexec
        button = CD_|<<
        config = mpc prev
        repeat = 0
        prog = irexec
        button = CD_>>|
        config = mpc next
        repeat = 0
        prog = irexec
        button = CD_PLAY
        config = mpc play
        repeat = 0
        prog = irexec
        button = CD_STOP/PAUSE 
        config = mpc pause
        repeat = 0
        prog = irexec
        button = KEY_UP 
        config = kodi-send Up
        repeat = 3
        delay  = 8
        prog = irexec
        button = KEY_DOWN 
        config = kodi-send Down
        repeat = 3
        delay  = 8
        prog = irexec
        button = KEY_LEFT 
        config = kodi-send Left
        prog = irexec
        button = KEY_RIGHT 
        config = kodi-send Right
        repeat = 3
        delay  = 8
        prog = irexec
        button = KEY_TV
        config = kodi-send Back
        repeat = 0
        prog = irexec
        button = KEY_OK 
        config = kodi-send Select
        repeat = 0
        prog = irexec
        button = KEY_INFO 
        config = kodi-send Info
        repeat = 0
        prog = irexec
        button = KEY_CONTEXT_MENU 
        config = kodi-send ShowOSD
        repeat = 0
        prog = irexec
        button = KEY_0 
        config = kodi-send Pause
        repeat = 0
        prog = irexec
        button = KEY_MUTE 
        config = kodi-send Mute
        repeat = 0
        prog = irexec
        button = DVD_rewind 
        config = kodi-send Rewind
        repeat = 0
        prog = irexec
        button = DVD_play 
        config = kodi-send Play
        repeat = 0
        prog = irexec
        button = DVD_fastforward
        config = kodi-send Forward
        repeat = 0
        prog = irexec
        button = DVD_stop
        config = kodi-send Stop
        repeat = 0
        prog = irexec
        button = DVD_power
        config = kodi-send Kodi-on
        repeat = 0

irexec requires two helper scripts: one for controlling kodi and one for controlling the mpd playlists.

/usr/local/sbin/kodi-send is a bash shell script that I made to control Kodi on a different pc. I will work on it later.



case $1 in
  PARAMS=', "params":{"playerid":1}'
  PARAMS=', "params":{"playerid":1,"value":"smallbackward"}'
  PARAMS=', "params":{"playerid":1,"value":"smallforward"}'
  PARAMS=', "params":{"playerid":1}'
# No longer used - this was used to wake up a secondary pc that ran kodi. Now this is all on the same machine.
#  wakeonlan $MACaddress
#  exit
#  ;;
  echo "Wrong Command"

#echo $COMMAND
LONGCOMMAND="{\"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"$COMMAND\"$PARAMS}"

curl -s -d "$LONGCOMMAND" -H 'content-type: application/json;'  $HOST
echo `date` $LONGCOMMAND >> /home/pi/lirc/kodisend.log

The /usr/local/sbin/mpc-play is a script that manages the current MPD playlists. If it’s length ≤ 1 then it assumes we’re playing a stream. If the length > 1, then a list of MP3’s is assumed. This allows quick switching between a web stream (radio) and a list of MP3’s, and will even revert the play position.


die () {
    echo >&2 "$@"
    exit 1

[ "$#" -eq 1 ] || die "1 argument required, $# provided"

#assume we are playing mp3 files if we have a playlist length >1
if [ `mpc playlist | wc -l` -gt 1 ]
        # playlist is longer than 1, we have music
        if [ "$1" = "music" ]
                # we already are at state "music". Play the playlist.
                mpc play
                # current playlist is music, we want to play a stream.
                # Save current playlist position
                mpc -f "[%position%]" | head -1 > /home/pi/lirc/playlistnumber
                # Save current playlist as music; clear playlist; load stream
                mpc save music || ( mpc rm music && mpc save music )
                mpc clear
                mpc load "$1"
                mpc play
        # playlist length is 1 or shorter, we are now in a stream or have an empty playlist
        if [ "$1" = "music" ]
                # clear current playlist, load music, play
                mpc clear
                mpc load music
                # Resume playing at the existing playlist position
                mpc play `cat /home/pi/lirc/playlistnumber` || mpc play                                          
                # clear current playlist, load stream 
                mpc clear
                mpc load "$1"
                mpc play

I assigned a button to start kodi.
However, I would not start as user root.
I made a script /usr/local/sbin/kodi-start to run it as user pi (hat tip):

mpc stop
runuser -l pi -c 'kodi-standalone & '

The mpc stop is so sound is stopped when starting kodi. Apparently both MPD and kodi “take hold” of the audio and can’t play at the same time.


Although installing this took multiple days of work, I was surprised at how easy it went and how little trouble I ran into.
I made the goal of having a full replacement for the MPDpi, which I shut down:

The raspberry Pi is now laying on top of my amplifier, which is not ideal, but I am amazed at the sound quality. Installing it in sucessive steps meant I could really hear the improvement of the new speakers, speaker cables (which I did not imagine a non-audiophile like me could hear), and the hifiberry over the built-in raspberry DAC (the difference was even noticable on the €9,97 3W speakers!).

Kodi works, but is not configured as I would like it yet.

The beamer also works (although it smelled after not having been used for three years). If possible, I would like it to spitch on and off automatically.

My bookcase looks a lot better now, but there is still a bare raspberry dangling in there. Also, I quicly tried installing scummvm (to play retro games) and that works.
What I would also like is stream audio and video from an android phone to the raspberry.

That will all come in a later blog post.

Key organizer from old shoes

I have a drawer cabinet near my front door. It’s top drawer has become my “messy drawer” and holds keys, bags for grocery shopping and face masks. And also, tens of (found) bicycle lights, a TomTom one I have not used (nor updated) since 2009, and a garbage pass for a municipality I don’t live in for almost 10 years.

I could never quickly find my keys.

Continue reading “Key organizer from old shoes”

A pouch for my passport

Since I lived in Belgium (from 2002), I have always carried my passport with me; it was mandatory there and it stuck. I never owned an ID Card. I have this in a pouch that originally belonged to my Rand McNally Streetfinder III Navman GPS unit. This was a GPS receiver that clicked onto the back of a Palm III (see ebay for example, as long as it’s available). I have long thrown away the Navman, but the pouch has been doing passport duty for 20 years, but it started to fray and tear apart. It was good, but I missed two things:

  • A little pocket for a SD card and a camera battery (I lost an empty SD card once because it had become lodged in my passport’s paged, then I dropped in when I opened the passport above a grating)
  • An outside pocket so you could have tickets ready instead of having to pull out 20 sheets of folded A4 paper and search for the right ones.
Old passport bag with contents
The Rand McNally bag, it usually carries my passport, a SwissCard, a metre of ducktape on a credit card and a few metres of toilet paper. In this case, it also carried my printed-out COVID vaccination passes and a multi USB charge cable.
Continue reading “A pouch for my passport”

Making a NAS out of my Raspberry Pi 4

I used to have a Raspberry Pi B (model 1) act as my NAS.
The PI (or probably it’s memory card) died on me, and I’ve always been appalled by it’s slow, slow data throughput, so I ordered a new Raspberry Pi 3B+. Literally two days after it ordered, the Pi 4B+ was announced. So I ordered that one too.

Finally, I have some time to put it together.

What I want is basically the same as the old:

Continue reading “Making a NAS out of my Raspberry Pi 4”

Downloading tile maps

I love the website Cartesius, which has a trove of old topographic maps of Belgium.
One of the maps that I consult the most is a stitch of all topographic maps of Belgium of 1969, zoomable and pannable like openstreetmaps.

The Cartesius map viewer

However, lately, the site has been acting strangely. The front portal continuously reloads, so it is hard to select anything. This has been going on for months and has not been fixed — so I guess it is no longer actively maintained, with bears the risk it might go offline soon.
Therefore, I wanted to download these maps for backup, if possible.

Continue reading “Downloading tile maps”

My railway edits on Openstreetmap

A list of all things railway-related I put on openstreetmap (since october 2021)

700mm Chreosoting railway, Vilvoorde
500mm Coal railway
700-750mm track, this was used for a loco that has since moved to Katwijk

Reasons for the housing shortage in the Netherlands

Sadly, there is not one single reason for the housing crisis in the Netherlands, or we could — with effort — fix that problem. There are reasons that have been building since the 1980’s.

In a recent discussion I came up with the following reasons for the housing crisis that each for themselves would not be too bad of a problem, but combined they form this cluster bomb:

  • Financial and policies:
    • Mortgage interest deduction which makes owning a house cheaper than renting one.
    • Low interest rates, people who have wealth can easily invest in housing (“buy to let”) and get a fair return on it. The low interest also makes this one of the few high return-low risk investment possibilities.
    • Social housing estates who had many dubious investments in the ’90’s-’00’s, had to be bailed out, and the government imposing a tax on them in the ’08 crisis means they can not really invest in new social housing, but have been selling off their inventory for the last two decades (I live in an ex-social-housing apartment), a supply that has now dried out.
    • New regulations on house financing (good) which make it so that people new on the housing market can no longer easily afford a house above a certain threshold (NHG-garantie) while the average is now far above that threshold, meaning even more pressure on the renting market.
    • The “Jubelton”, where parents can give their children a tax-free gift of €100.000 for buying a house. This has not made housing more accessible, but instead drove prices up.
    • Social rent gap: The social rent is pegged at about €700, but because there is a huge segment of people who can’t rent social (just too much income or too long a waiting list), and can’t buy (not eligible for mortgage because no wealth and too few income with current insane housing prices) there is a huge pressure on the underside of the “liberal housing market”, meaning there are basically no houses for rent between €700 and say €1100 (depending on the location).
    • “Wet Doorstroming Huurmarkt”, a law that increased the options for temporary rent contracts, hoping to improve the flow of renters to a more suitable house, but only having the effect of increasing rent, making investors richer and leaving renters unable to either live a stable live or build up any personal wealth.
    • Too much money and lending capacity available to both investors and genuine buyers (who want to live in their home).
    • House buying tax (Overdrachtsbelasting) went from 6% to 8% for investors and 2% for first-time-buyers under 35 last year (2020). Which meant a rush on houses from investors wanting to have the last cheap houses last year, then a rush on houses from first-time-buyers now (2021).
  • Social:
    • Race to the top, fear of missing out on a house so people overbid enormously for fear of not getting something else
    • A decade-long underconstruction of new housing, combined with a near-total stop of housing construction in the ’08-’10 financial crisis, which meant many (good) construction labour either retired or found other jobs, so there is still an immense shortage in skilled workforce.
    • Covid-19 which increased demands on houses with more space (inside and gardens), instead of the inner-city-studios of the “millennials”. These inside studios are still coveted (by investors) so still priced high, freeing them up don’t free up affordable space to renters.
  • Environmental
    • The nitrogen crisis is fairly recent and has not really added up to the housing crisis, but it won’t help either.
    • Pressure on greenfield building by competition from nature preservation, energy production (solar), industry (distribution parks) and agriculture

Repairing my fridge

I have a fridge I bought in 2009. In the door, there is a tray that holds heavy items like yoghurt cartons. That tray was held up with two tiny tabs on each side, which fall in a slot in the side of the tray. In 2013, those tabs broke off, which rendered the tray unusable. This means I had to put those cartons in the fridge proper, blocking access to the vegetable drawer (I had to remove all the cartons to access it) and making access to the bottom shelf more cumbersome.

This is annoying.

Ik heb in 2009 een koelkast gekocht. In de deur zit een rekje waar de zware dingen zoals yoghurtpakken op staan. Dat rekje werd vastgehouden met twee kleine tabjes aan elke kant, die in een sleuf aan de zijkant van het rekje passen. In 2013 zijn deze tabjes afgebroken, waardoor ik het rekje niet meer kon gebruiken. Dit betekende dat ik de yoghurtpakken in de koelkast zelf moest plaatsen, waardoor ik niet meer bij de groentela kon (ik moet alle pakken uit de koelkast halen voor ik hem open kan maken) en ook niet meer makkelijk bij de dingen op de onderste plank.

Dit is vervelend.

Continue reading “Repairing my fridge”

Using the LCD

I found an old beaten-up CD player a while back, and decided to take out the human interface card, with the LCD and buttons on it.

In a previous episode, I managed to get the LCD to do something. Now, I will try to let it do exactly what I want it to do!

The first task is to find out what segments is controlled by what segment to the chip(s). In Controlling the card, I found out how to send the chips data — basically I have to send an 80-bit sequence to the two chips, of which 2*4 bits are chip control data. This leaves 72 bits of data to control 57 segments, so some of the chip’s capacity was unused.

My first plan of attack is simple: in the previous episode I learnt how to listen for keypresses, so my idea was to make a simple keypress-driven loop trough all the 72 data bits, to see which segment will light up.

Continue reading “Using the LCD”

Scanning keys

Now that I deciphered where everything goes and how everything works, it was time to make sure I build a foundation to make the I/O a little more usable, instead of fetching raw data. Fist stop: make the input buttons accessible.

Working with keypresses is actually not as simple as I intuitively thought. If you have one button attached to one input pin and do a simple digitalRead(pin);, then you know your button is pressed. But if you want to do an action only once on every key press? You could have a little variable that keeps track of whether the key was not pressed last time and is now — basically working on the leading edge. But then you still have the problem of key bounce to take care of.

And what if you want to detect long presses (e.g. to go into a settings menu) or held presses (press once to increase a counter, keep pressing to keep increasing it)?

But first, the basics, how to detect a simple keypress with the scan matrix used in this board?

Continue reading “Scanning keys”