Repurposing the Mycroft Mark II as a Home Assistant voice satellite — mark2-assist

Hi everyone,

Long-time happy community member — going back to the Mycroft days where I made a few skills (auto-volume, Google AIY voicekit, Auto-Volume and a few others). I’ve been lurking through the OVOS years and have a lot of respect for what the team has built.

I recently dug out my Mark II and decided to give it a new life. I want to share what I’ve built, because I think it might be interesting to people here — even though the approach is a bit different from the OVOS path.


The idea

Instead of running OVOS on the device, I wanted to use the Mark II as a Home Assistant Assist satellite — meaning the voice pipeline lives entirely in HA, and the Mark II is a smart endpoint: mic, speaker, touchscreen, LED ring and buttons.

The key insight is that HA Assist is actually very flexible about what runs each step of the pipeline. You can mix and match:

  • Wake word: local on the device (openWakeWord)

  • STT: Whisper locally, or cloud, or whatever

  • Conversation: HA’s own, OpenAI, Claude, or OVOS as a conversation agent

  • TTS: Piper locally, Nabu Casa, or OVOS TTS plugins

So OVOS is absolutely still in the picture — just as a backend component in HA rather than running natively on the device. That opens up some interesting possibilities, especially for people who already have HA running.


What mark2-assist does

It’s a set of shell scripts that turns a fresh Raspberry Pi OS Lite (Trixie/Debian 13) install into a fully configured Mark II satellite. A bit like the old PiCorft, but this is way more understandable and can be extended with modules for more funktionality:

Core:

  • SJ201 hardware drivers (VocalFusion kernel module, XVF-3510 firmware, TAS5806 amp, WirePlumber profile) — converted from the ovos-installer Ansible roles, credit to that team

  • Linux Voice Assistant (ESPHome protocol) as the satellite — replaces the old Wyoming satellite, auto-discovered by HA

  • Weston Wayland compositor + Chromium kiosk showing your HA dashboard on the touchscreen

  • Hardware test suite covering all 10 Mark II components before you proceed

  • Kernel watchdog that auto-rebuilds the VocalFusion module after kernel updates

Optional modules:

  • LED ring reacting to voice states (idle/wake/listen/think/speak/error)

  • Animated face overlay that reacts to voice and dances to music

  • Volume overlay (on-screen bar when volume changes)

  • Screensaver with clock + live weather from HA

  • MQTT sensors publishing voice state, audio playback, CPU/temp etc. to HA

  • Snapcast multiroom audio client

  • AirPlay receiver (shairport-sync)

  • MPD local music player

  • KDE Connect phone integration

The installer handles everything: asks all questions upfront, runs hardware setup, reboots automatically, resumes and installs the rest, reboots to the finished system. Total time around 20-40 minutes.


Why not just run OVOS?

Honest answer: I wanted to keep my existing HA setup as the brain, and I already had pipelines, automations and integrations there. The Mark II becomes one of several voice endpoints alongside other satellites around the house.

That said — nothing stops you from pointing the HA conversation agent at OVOS, using OVOS TTS for the voice responses, or using OVOS STT for speech recognition. The pipeline is fully configurable in HA. I think of it as complementary rather than competing.

For people who want OVOS running natively on the device, the OVOS installer and Neon AI are still the right paths. This is for people who are already deep in the HA ecosystem and want their Mark II to fit into that.


The hardware situation

One thing worth documenting for the community: the Mark II hardware is actually in pretty good shape for this kind of repurposing.

The VocalFusion DTBO overlays that OpenVoiceOS maintains include the PWM fan overlay — so thermal management is handled automatically by the kernel with no extra code needed. The SJ201 runs fine on Trixie once the VocalFusion driver is built. The DSI touchscreen works with the Waveshare overlay.

The trickiest parts were:

  • Getting the XMOS XVF-3510 audio routing right in PipeWire on Trixie

  • The LED ring uses NeoPixel on GPIO 12, not I2C as some older docs suggest

  • The TAS5806 amplifier needs specific initialization before audio works

  • Weston vs labwc for the Wayland compositor (ended up on Weston)

All of these are now solved and documented in the repo.


Repo

https://github.com/andlo/mark2-assist

Still work in progress — there are known issues tracked in KNOWN_ISSUES.md and contributions are very welcome, especially from people who know the Mark II hardware well.

/Andreas

4 Likes

WAW, amazing project! This was exactely what I was looking for!

I did have quite some difficulties getting it to install. The setup trew several errors:

MARK2_LOG unbound variable: I declared it at the start of the script, which worked fine.

several permission errors: Error: [Errno 13] Permission denied: ‘/home/xxxxx/.venvs/sj201/.gitignore’
I ended up setting the venv manually and leaving it out of the setup script.

the test script would sometimes pass or fail the microphone without changing anything in between.
the touchscreen does not turn on after a sudo reboot, only a cold reboot works.

At startup launching HA did not work: the weston section in bash_profile had a missing end of the if statement. Once fixed I get the lockscreen with date and weather, but it’s in Norwegian (I think :wink: )
When I tap the screen I get the login screen for HA, although I copied the suggested HA config section as suggested. Turns out type: homeassistant needs to be put after trusted_networks for it to work. see https://www.home-assistant.io/docs/authentication/providers/

Is there a way to just keep the HA dashboard on screen? Now it reverts to the lock screen after a few seconds.

The sound sounds a little distorted. I remember from when it was running neon it was clearer. Unfortunately I don’t now enough about it to make the necessary adjustments.

Anyways, thanks again for your impressive work!

1 Like

Thank you so much for the detailed feedback — this is incredibly helpful! I’ve gone through each point:

MARK2_LOG unbound variable — Bug confirmed, will be fixed. Thanks for the workaround.

Permission errors on venv — This is a known area of improvement. The venv should be owned by the user, not root. Fix coming.

Microphone test flaky — Yes, this is a known issue. The microphone is sometimes busy (held by another process). We’re working on it.

Touchscreen needs cold reboot — Not seen this before, thanks for reporting. Added as a known issue to investigate.

Missing fi in .bash_profile — Bug confirmed, will be fixed shortly.

Norwegian language — The UI picks up language from Home Assistant. If your HA is set to Norwegian, that’s what you’ll see. Making this more configurable is on the roadmap.

Auth provider order — Great catch! The HA config example in the docs needs updating. type: homeassistant must come after trusted_networks. Will fix.

Dashboard reverts to lock screen — This is the passive/active mode behavior. There’s a timeout that returns to the passive “clock” screen. We’re working on making this configurable. For now you can adjust the timeout in the config.

Distorted audio — Likely an EQ/gain issue specific to the SJ201 hardware. Added as an issue to investigate. Did you notice if it’s all audio or just TTS?

Thanks again — really valuable report!

Thank you for fixing stuff so quickly!

About the language, I have not set my HA in Norwegian, nor has it ever been as I don’t speak the language. It’s set up in Dutch, but if I change the mark2 user to English, the lock screen stays in Norwegian (maybe it needs a reinstall?). But I would not use the lock screen, as I have a clock and weather in the dashboard, so it’s not much of a problem. And I’m learning the days of the week in Norwegian in the meantime :wink:

About the audio, yes, it’s for all audio, even when playing songs. I don’t have USB speakers so unfortunately I can’t test if that makes a difference.

Thanks for the follow-up! Good to know the fixes landed quickly.

On the language — interesting that it shows Norwegian when your HA is set to Dutch. The passive display fetches language/locale from HA’s REST API, so it should follow HA’s language setting. Norwegian showing up for a Dutch HA is unexpected — I’ll investigate whether something is being cached from the OVOS image’s locale settings. A reinstall after the recent fixes should clear it, but since you’re not using the lock screen it’s low priority.

On the audio distortion — since it affects all audio including music playback, it’s likely a gain/EQ setting on the TAS5806 amplifier or the ALSA mixer rather than a TTS-specific issue. We have an open issue for it (#22). If you get a chance, it would help to know: does the distortion happen at all volume levels or only at higher volumes? That would tell us whether it’s a clipping issue or something in the DSP chain.

We’re also currently deep in debugging wake word detection — turns out the XVF3510 → PipeWire audio routing has a subtle conflict that we’re close to resolving. Will post an update once that’s stable.