Mint 21 + Kodi 19 + Intel NUC i3

January 8, 2023 2:24 pm

The latest in my series on the subject, this follows the last upgrade in 2018: Mint 19 + Kodi 18 + Intel NUC i3.

Not much has changed in how I got my set up the way I want since 4 years ago. There is a minor change on how to get the TrueHD and DTS-HD MA audio passthrough working.

Update NUC’s UEFI

I grabbed the latest firmware from Intel (version 54) and flashed it onto the NUC. One issue I ran into (which presumably isn't new, just not noted previously), is that the NUC wasn't negotiating a display signal through my receiver and I had to plug it directly into the TV to see anything in order to do the firmware upgrade.

Next I went on a wild goose chase because after upgrading the firmware nothing could see the internal mSATA drive on which the OS is installed. After an hour and a half of messing with it (including downgrading the firmware) I eventually disconnected everything, opened it up, re-seated the drive, and put it back together and everything was fine. No idea what that was about.

Install Linux Mint 21.1

I then installed Mint 21.1.  I won't cover that in this post.  Plenty of better places to find that information.  I'm using the 64-bit distribution.

Install Kodi 19

The Kodi Wiki install guide is pretty clear:

$ sudo apt install software-properties-common
$ sudo add-apt-repository ppa:team-xbmc/ppa
$ sudo apt update
$ sudo apt install kodi

ALSA, PulseAudio, TrueHD, DTS-HD MA

Since last time some minor details about how to accomplish forcing Kodi to use ALSA have changed. I still use a custom session launcher, but instead of rather forcefully killing pulseaudio it uses pasuspender and sets an environment variable for Kodi.

Create our custom session launcher:

$ nano ~/kodi_custom_session_launcher

Paste in:

#!/bin/bash
pasuspender -- env KODI_AE_SINK=ALSA kodi

Make the launcher executable:

$ chmod +x ~/kodi_custom_session_launcher

Now create the custom XSession entry:

$ sudo nano /usr/share/xsessions/Kodi_ALSA.desktop

And paste in:

[Desktop Entry]
Name=Kodi with ALSA
Comment=This session will start KODI Media Center
# Note: Change "kyle" to your username
Exec=/home/kyle/kodi_custom_session_launcher
TryExec=/home/kyle/kodi_custom_session_launcher
Type=Application

Now if you log out you should be able to select "Kodi with ALSA" as a session option from your login manager.  In Mint, this is accomplished by clicking the circle to the right of the user name.

After a little fussing and some restarts I eventually saw the correct audio targets in the Kodi settings and everything seems to be happy with the audio passthrough support.

Kodi Configuration

I setup some stuff in Kodi's advanced settings file to disable the splash screen, hide the ext4 file system's "lost+found" directories, and increase the network streaming buffer.

Create the file:

$ nano ~/.kodi/userdata/advancedsettings.xml

And paste in:

<?xml version="1.0" encoding="UTF-8"?>
<advancedsettings>
  <splash>false</splash>
  <video>
    <excludefromlisting>
      <regexp>lost\+found</regexp>
    </excludefromlisting>
    <excludefromscan>
      <regexp>lost\+found</regexp>
    </excludefromscan>
    <excludetvshowsfromscan>
      <regexp>lost\+found</regexp>
    </excludetvshowsfromscan>
  </video>
  <network>
    <cachemembuffersize>15728640</cachemembuffersize>
  </network>
</advancedsettings>

NUC's Remote Control IR Receiver

To use the NUC's built-in IR receiver we need to install the ir-keytable utility:

$ sudo apt install ir-keytable

Then we define the keytable we need for the Onkyo RC-764M remote using the Xbox keycode 33003.  Create the file:

$ sudo mkdir /etc/rc_keymaps
$ sudo nano /etc/rc_keymaps/onkyo_rc-764m_nec_33003

And paste in:

# table onkyo_rc-764m_nec_33003, type: NEC
# Using Onkyo Remote Code 33003
# Code mappings match same buttons when using Original Xbox Dongle Remote Code
# ScanCode LIRC_KEY # Remote button text
# LIRC_KEY is modified to get correct action in XBMC using LIRC-in-kernel fake-keyboard actions

0x2d2d3a KEY_I #Display
0x2d2d59 KEY_LEFT #Left
0x2d2d5a KEY_RIGHT #Right
0x2d2d47 KEY_UP #Up
0x2d2d48 KEY_DOWN #Down
0x2d2d4a KEY_C #Guide/Top Menu -- Context Menu
0x2d2d4b KEY_ESC #Prev CH/Menu
0x2d2d45 KEY_BACK #Return
0x2d2d56 KEY_O #Setup -- Codec Info
0x2d2d58 KEY_ENTER #Enter
# UNUSED 0x2d2d4f #Audio
0x2d2d35 KEY_COMMA #Skip Left
0x2d2d34 KEY_PERIOD #Skip Right
0x2d2d32 KEY_R #Rewind
0x2d2d33 KEY_F #Fastforward
0x2d2d31 KEY_P #Play
0x2d2d38 KEY_SPACE #Pause
0x2d2d39 KEY_X #Stop
0x2d2d3b KEY_1 #1
0x2d2d3c KEY_2 #2
0x2d2d3d KEY_3 #3
0x2d2d3e KEY_4 #4
0x2d2d3f KEY_5 #5
0x2d2d40 KEY_6 #6
0x2d2d41 KEY_7 #7
0x2d2d42 KEY_8 #8
0x2d2d43 KEY_9 #9
0x2d2d44 KEY_0 #0
# UNUSED 0x2d2d4e #+10
# UNUSED 0x2d2d46 #CLR
# UNUSED 0x2d2d7c #Search
# UNUSED 0x2d2d7d #Repeat
# UNUSED 0x2d2d7f #Random
# UNUSED 0x2d2d7e #Play Mode

Now configure a systemd service to load the keytable at boot.  Create the service file:

$ sudo nano /etc/systemd/system/ir_receiver.service

And paste in:

[Unit]
Description=Configure the IR Receiver for the desired keytable

[Service]
Type=oneshot
ExecStart=/usr/bin/ir-keytable -c -p NEC -w /etc/rc_keymaps/onkyo_rc-764m_nec_33003

[Install]
WantedBy=multi-user.target

ExecStart needs the absolute path to the ir-keytable executable.  Here's what the command options do:  "-c" clears the existing keytable.  "-p NEC" puts the receiver in NEC mode. "-w /etc/rc_keymaps/onkyo_rc-764m_nec_33003" loads our custom keytable.

And enable the new service:

$ sudo systemctl enable ir_receiver.service

Bonus: Logitech Media Server

I also run Logitech Media Server for the fleet of Squeezebox Radios in the house.  I

The information for LMS is a mess.  Lots of out-of-date information and lack of clarity on recommended approaches.  The wiki linked to in the previous post is now out of date.

However, the package repository still seems to be the right place. This XML file contains the details on the latest release: http://downloads.slimdevices.com/releases/latest.xml

I grabbed the 8.3.0 DEB release for amd64 from: http://downloads.slimdevices.com/LogitechMediaServer_v8.3.0/

$ sudo apt install ./logitechmediaserver_8.3.0_amd64.deb

Misc. Errata

My external USB3 hard-drive enclosure (a Mediasonic ProBox HF2-SU3S2) had been working rock solid under Mint 19. Unfortunately now it's randomly being disconnected. It immediately reconnects and I can re-mount the drives, but it's a major annoyance. The transfer speeds are about 50% faster than before (~120MB/s vs ~80MB/s, so we're hitting the very max of my gigabit networking--which is cool--but, I'd rather have it be stable).

After trying a few things (disabling auto-suspend, checking for the UAS driver [not in use]) and making no progress I wrote a cronjob to check if the disks had become unmounted and, if so, to remount them. The job runs every minute.

Ugly, but so far it's been effective. It could, obviously, be done with an array and a loop instead, but I just wanted it done and not have to try to remember the exact syntax for that.

#!/usr/bin/bash
needed_to_remount=false
if ! mountpoint -q /mnt/TV; then
  needed_to_remount=true
  mount /mnt/TV
fi

if ! mountpoint -q /mnt/General; then
  needed_to_remount=true
  mount /mnt/General
fi

if ! mountpoint -q /mnt/Movies; then
  needed_to_remount=true
  mount /mnt/Movies
fi

if ! mountpoint -q /mnt/4TB_Storage; then
  needed_to_remount=true
  mount /mnt/4TB_Storage
fi

if [ "$needed_to_remount" == "true" ]; then
  echo "$(date) Needed to remount disks"
fi

And the entry in /etc/crontab to run it:

# Workaround external drives being unmounted randomly
* * * * * root /home/kyle/Scripts/remount_disks.sh >> /var/log/remount_disks.log

Which logs when it detects the drives have been unmounted so I can at least monitor how often this is happening. So far it's been happening 3-7 times a day with what-appears-to-be entirely random intervals. Maybe the log file will reveal some pattern I can work with.

My Christmas Tree Tells me when it's Thirsty - Redux

December 18, 2022 8:02 am

Last year, I built a float sensor to tell me when the tree needed water.

This year I found a water sensor that accepts leads and I thought I'd try it out and see if it would work or if being wet would drain the battery. I grabbed an Aqara Zigbee water leak sensor ($15 at time of purchase) and some old wire to use as leads; hooked up the leads and ran them into the tree stand and mounted the sensor on the outside.

I left the float sensor in from last year, but it seems to be getting gummed up and not rising/falling smoothly, so it's not really working anymore. It looks a bit messy, but the tree skirt completely hides it.

I also bought a funnel, spray-painted it green, and stuck a hose on the end. The funnel sits about 4.5 feet up the tree around the back and the hose runs down into the stand. It was like $15 for the funnel, spray-paint, and hose. Well worth it.

So now the tree sends us a notification when it's thirsty and we add water through the funnel until it says it's happy. It's amazingly convenient. One of my best ideas. No more crawling under the tree trying to see how much water is there, finagle a pitcher around the branches, or figure out how much more to add!

My Home Assistant automation is really simple, when the sensor goes dry, send a notification to my tablet and to Jess' phone. Since it's a real water sensor I don't have to muck about telling the system to pretend it is one.

Someone should make a tree-stand water-level sensor that just lines up five sets of leads onto a piece of plastic, then you would get readings for "full", "3/4 full", "1/2 full", "1/4 full", and "dead empty." I'll probably add a 2nd sensor next year so I get "low" and "full" at least.

Hero Forge Miniatures

May 1, 2022 4:45 pm

At the end of March we started playing the Dungeons & Dragons Starter Set which contains 5 pre-generated characters, a slimmed-down rule book, and the adventure "The Lost Mine of Phandelver." Heather is playing as Zulak, a human fighter. Jess and Corinne are playing Riswynn, a dwarf cleric. And our friends are Zorien, another human fighter; Ara, an elf wizard; and Reedawn, a halfling rogue. I'm the Dungeon Master.

To make the experience more engaging and fun I used Hero Forge to design and purchase custom miniatures which match each character's detail. Each miniature has the character name, real name, and the year on the bottom and they'll keep them as souvenirs when we're done. I hadn't purchased anything from Hero Forge before and wasn't sure what to expect. I ordered the "standard" quality miniatures and I'm really pleased with them. If this is the "standard" quality, the high-quality/high-resolution versions must be really impressive.

Left to right: Ara, Riswynn, Zorien, Reedawn, Zulak

Each miniature was $20. Which is a little pricey if you were trying to make an army, but is quite reasonable for a one-off special character at this quality level and customizability (and they are crazily customizable). The Hero Forge UI for customizing the characters is an impressive feat by itself and that you can then have that custom character 3-D printed and shipped to you is really cool.

I probably won't paint them--maybe I'll get around to the one's for Heather and Corinne--but I suggested perhaps we could have a painting party during which each person could choose 2 or 3 parts of the character to paint and provide some pop. I don't know if that will happen or not though.

I'm quite pleased with them and now I can happily and heartily recommend Hero Forge for custom miniatures.