← Apps

Mutti

My personal assistant, bringing together the smart devices and services I use at home. The starting point for several of my other projects.

Private repository

Why I built it

Like a proper nerd, I've ended up buying all sorts of devices with built-in connectivity over the years. Their smart features gradually became scattered across a whole collection of apps. I wanted one system where I could use all my smart devices and get them out of their separate apps.

That became Mutti: my personal assistant, with connections to the smart home devices and other services I use at home. The idea is to bring them together so I can start with what I want to get done, rather than which app a particular device belongs to.

Working on Mutti has also become the starting point for several of my other projects. The first standalone library I built was pyskoleintra. My son's school uses Skoleintra, and I wanted access to messages and everyday school information through my own solution.

I also wanted to check the status of my Xiaomi vacuum cleaner and control it from Mutti. I couldn't find a complete library that gave me what I needed, so I built that too. It became mihome-cloud: another standalone library that grew out of a specific need in Mutti.

Automations across brands

Automations have become one of my favourite features in Mutti. I can take a Philips Hue controller and decide what its buttons should do across the devices and services I've connected. It can be the button for a Sonoff switch, the vacuum, or an entire sequence of actions. My automations decide what happens.

I build the workflows in a visual editor: choose an event, add any conditions and set the actions. They can run in sequence or in parallel and behave differently depending on things such as the time or sensor readings. The available actions come from what each connection supports.

There's something immensely satisfying about giving a physical button a new purpose, regardless of the brand printed on it. Once a workflow is defined, Mutti executes it directly. There is no language model interpreting every button press.

Talk to Mutti from my wrist

I've also built an app for my watch that can be selected as its digital assistant and opened from the assistant shortcut. That lets me ask Mutti to control things by voice, right from my wrist. It makes a real difference in everyday use when I don't have to get my phone out and find the right app first.

The recording travels through the companion app on my phone to Mutti, where speech recognition turns it into text. The request is then handled like any other message to the assistant, and the reply comes back to the watch. Speech recognition can run locally on the Mutti server. The watch listens when I open the recording screen and speak to it.

My own map of everyday life

The companion app can also record where I've been and send the points to my own Mutti server. That gives me a personal location history I can ask about and display on a map. If the server is unavailable, the phone keeps the points and delivers them later.

I like being able to look back over a day or a trip without putting my location history into a Google account. I keep the history on my own server and decide how long to retain it. Map backgrounds and optional address lookups can use external services; those parts can also be self-hosted.

Lights, switches and sensors

I've built connections to Philips Hue, Sonoff/eWeLink and Nedis SmartLife so lights, switches and sensors can be used from the same place. Hue can control individual lights, rooms and scenes. Sonoff and Nedis provide access to switches and readings from devices that support them.

There is also a separate local Zigbee integration for lights, sensors and events from buttons and remotes. That lets devices from different manufacturers take part in the same automations.

The practical things at home

The Xiaomi vacuum can report its status, clean specific rooms and return to its dock. The integration also tracks consumables and the maintenance functions supported by the model.

The BSK Zephyr connection covers ventilation, temperature, humidity and maintenance reminders. My Sony BRAVIA can be controlled with power, volume and remote-control functions. They are small things individually, but exactly the sort of things I want to bring together.

School, mail and calendar

Skoleintra and Tabulex/IST SFO provide access to messages, homework, timetables, reading logs and pickup arrangements. This is where pyskoleintra connects the school systems to Mutti.

The Gmail integration retrieves an inbox overview from multiple accounts, and Google Calendar brings appointments into features such as the daily brief. Both connections are read-only. They do not send Gmail messages or change Google Calendar events.

Energy, batteries and weather

Eloverblik retrieves historical electricity consumption from DataHub. Victron VRM provides insight into solar generation, battery charge and electricity flowing to and from the grid. I have also built monitoring for JK/Jikong battery management systems, so Mutti can track cell voltages, temperatures and alarms. That connection monitors the battery without changing its settings.

Weather data from Open-Meteo adds to the overview. The aim is to see things together and follow changes over time, instead of having to collect the numbers from several apps myself.

Cameras and images

The Ring integration brings together events from cameras and doorbells and can retrieve snapshots and recordings for automations. I have also built local image tools for cropping and enhancing images, extracting video frames, recognising number plates and comparing faces with selected reference photos. The image processing and recognition run locally.

Small helpers around it all

System monitoring tracks the host's load, memory and disk space, while an OpenAI Platform integration provides content screening in the Gmail workflow.

Together with Mutti's own tasks, reminders and daily brief, these connections make the assistant more than another remote control. It is still a personal project in development, and the Mutti repository is not public yet.

← All projects