Hi, I would like to know if I can simultaneously add an oled static display with values of cpu, temperature, wifi, etc. to Volumio for Raspberry pi 4B. Thanks for the info and help, I’m starting with RPI thanks
Why, why, why you want to see all this on music “player”? Volume, bitrate, album, song, track I understand, but values of cpu?
On the main panel, only the song, artist, etc. On another small OLED display, these system values.
Yes, you can do this! Here’s how
- Go to GitHub - antiprism/mpd_oled: MPD, Volumio, RuneAudio and Moode OLED status and spectrum display for Raspberry Pi (and similar) and download the source code
- Make your changes to the code
- Build
- Copy
mpd_oledto/usr/bin/mpd_oled - Restart the plugin
Install the plugin first and then go into the plugin settings, click on the I2C OLED wiring button and then attach the screen as per instructions. Once completed try the different screen types, one of them will definitely work.
Ok, will the oled show wifi, cpu, temperature? thanks for the help
The oled can display anything you like! Do you have any C++ experience?
here is a scribble in Python I’ve played with many moons ago. It’s just as starter. it’s untested and not supported by me:
import busio
import adafruit_ssd1306
import gpiozero as gz
import time
import psutil
import socket
import netifaces as ni
from board import SCL, SDA
from PIL import Image, ImageDraw, ImageFont
# Create the I2C interface.
i2c = busio.I2C(SCL, SDA)
# Create the SSD1306 OLED class.
# The first two parameters are the pixel width and pixel height.
disp = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)
# Clear display.
disp.fill(0)
disp.show()
# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
width = disp.width
height = disp.height
img = Image.new("1", (width, height))
# Get drawing object to draw on image.
draw = ImageDraw.Draw(img)
# Load fonts.
fonta = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 10)
fontb = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 12)
fontc = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 14)
fontd = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 16)
fonte = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 18)
fontf = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 20)
fontg = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 22)
fonth = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 24)
fonti = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 26)
fontj = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 28)
fontk = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 30)
fontl = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 32)
fontm = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 34)
fontn = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 36)
fonto = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 38)
fontp = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 40)
def get_size(bytes, suffix="B"):
"""
Scale bytes to its proper format
e.g:
1253656 => '1.20MB'
1253656678 => '1.17GB'
"""
factor = 1024
for unit in ["", "K", "M", "G", "T", "P"]:
if bytes < factor:
return f"{bytes:.2f}{unit}{suffix}"
bytes /= factor
def cputemp():
cmd = gz.CPUTemperature().temperature
result = str('{0:.1f}'.format(cmd))
return result
def cpuload():
cmd = psutil.cpu_percent()
return str('{:.1f}'.format(cmd)).zfill(4)
def getip(interface):
ni.ifaddresses(interface)
ip = ni.ifaddresses(interface)[ni.AF_INET][0]['addr']
return ip
def gethostname():
hostname = socket.gethostname()
return hostname
def bytes_sent():
net_io = psutil.net_io_counters()
return get_size(net_io.bytes_sent)
def bytes_received():
net_io = psutil.net_io_counters()
return get_size(net_io.bytes_recv)
def bytesread():
disk_io = psutil.disk_io_counters()
return get_size(disk_io.read_bytes)
def byteswritten():
disk_io = psutil.disk_io_counters()
return get_size(disk_io.write_bytes)
def memtotal():
svmem = psutil.virtual_memory()
return get_size(svmem.total)
def memuavailable():
svmem = psutil.virtual_memory()
return get_size(svmem.available)
def memperc():
svmem = psutil.virtual_memory()
return str(svmem.percent) + " %"
draw.text(( 0, 0), "CPU:" , font=fontb, fill=255)
draw.text(( 40, 0), cputemp() , font=fontk, fill=255)
draw.text((115, 0), "°" , font=fontk, fill=255)
draw.text(( 30, 32), cpuload() , font=fontk, fill=255)
draw.text((110, 40), "%" , font=fontd, fill=255)
disp.image(img)
disp.show()
time.sleep(6)
img = Image.new("1", (width, height))
draw = ImageDraw.Draw(img)
draw.text(( 0, 0), "Network IP:" , font=fontb, fill=255)
draw.text(( 0, 17), gethostname() , font=fontc, fill=255)
draw.text(( 0, 34), getip('eth0') + "-W" , font=fontb, fill=255)
draw.text(( 0, 51), getip('wlan0') + "-WL" , font=fontb, fill=255)
disp.image(img)
disp.show()
time.sleep(6)
img = Image.new("1", (width, height))
draw = ImageDraw.Draw(img)
draw.text(( 0, 0), "Network data: " , font=fontb, fill=255)
draw.text(( 0, 20), "o: " + bytes_sent() , font=fontc, fill=255)
draw.text(( 0, 40), "i: " + bytes_received() , font=fontc, fill=255)
disp.image(img)
disp.show()
time.sleep(6)
img = Image.new("1", (width, height))
draw = ImageDraw.Draw(img)
draw.text(( 0, 0), "Disk data: " , font=fontb, fill=255)
draw.text(( 0, 20), "w: " + byteswritten() , font=fontc, fill=255)
draw.text(( 0, 40), "r: " + bytesread() , font=fontc, fill=255)
disp.image(img)
disp.show()
time.sleep(6)
img = Image.new("1", (width, height))
draw = ImageDraw.Draw(img)
draw.text(( 0, 0), "Memory:" , font=fontb, fill=255)
draw.text(( 0, 17), "t: " + memtotal() , font=fontc, fill=255)
draw.text(( 0, 34), "a: " + memuavailable() , font=fontb, fill=255)
draw.text(( 0, 51), "p: " + memperc() , font=fontb, fill=255)
disp.image(img)
disp.show()
time.sleep(5)
I’m a beginner learning
Hi guys, I have an issue with this plugin.
I installed it fine and works as expected, the problem comes when I restart the system.
It starts fine and screen comes on and shows time etc., but when I try to play music it comes up with this error

If I disable the plugin, restart the device and then enable the plugin again, then it’s fine
Can you try to disable startup sound and /or mutliroom playback
Thank you, disabling the startup sound fixed it
I know this thread is about MPD OLED, but “you’re my only hope.” I have a OLED SSD1322. My hardware only has enough room for it, so I have no choice. I found an absolutely wonderful NR1UI project by Maschine2501https://github.com/Maschine2501/NR1-UI. I don’t know, the guy must be Tony Stark—his knowledge is killer. After many attempts, I got it working on Volumio 3.251 on an RPI 3b+. Everything works, but the visualization with the Spotify 4.2.2 plugin doesn’t. Why? Any ideas?
Yeah, you’re right! He did a wonderful job on that solution but I have no idea how to fix your issue. I think it’s something to do with sending the spotify audio into the CAVA process to generate visualisation ![]()
Will this plugin work on a RPI 5 using i2C?
Yes it does
Thank-you what about V4 Bookworm?


