Skip to main content

Privacy aware webdeveloper in the FOSS universe, part of, founder of (Nextcloud SaaS) and father of a daughter.

Learn more about me. Email me at




Recap of Plonator Sprint

1 min read

I recently joined the Plonator Sprint and helped working on new demosites for Plone. Here is a the german news on and here you can find the sprint report.


I started replacing Supervisor with systemd for Plone sites

1 min read

During the Plonator sprint i have started to replace Supervisor (a process manager) with systemd start/stop scripts.

Right now Supervisor does not work with Python 3 (Supervisor version 4 will work) and it has problems stopping a Zope4 instance (needs more testing).

A systemd script could look like this:

root@xxxy:~# cat /etc/systemd/system/demo-latest.service

ExecStart=/home/zope/ fg


I haven't digged deep into systemd start/stop scripts, but i think i will use it more often. Are you using Supervisor? Is systemd a good replacement?


Python Script zum Download der wöchentlichen Epub Ausgabe

2 min read

Seit ich ein 7,8 Zoll PocketBook Inkpad 3 besitze, lese ich auch die Zeit auf diesem Ebook-Reader. Um das wöchentlich erscheinde Epub auf den Reader zu bekommen, habe ich mir ein Download Python Script geschrieben.

Es versucht die Downlaod URL zu generieren und die Datei runterzuladen, im Fehlerfall schickt es mir eine E-Mail. Damit (und mit Hilfe meines alten Bash Scripts) bekomme ich die Zeit per Send-to-PocketBook auf meinen Reader.

Meine jetzige Lösung nutzt leider noch Server von dritten (Email über Sent-to-Pocket). Vielleicht bau ich es noch aus, um die Syncronisation über meine Nextcloud laufen zu lassen. Möglich scheint es zu sein.


# -*- coding: utf-8 -*-
import datetime

from email.mime.text import MIMEText
import requests
import smtplib
import sys
import os.path

email = sys.argv[1]
password = sys.argv[2]

def send_mail_to_me():
        msg = MIMEText('nt')
        msg['Subject'] = ' epub url does not exist'
        msg['From'] = email
        msg['To'] = email
        s = smtplib.SMTP('localhost')
        s.sendmail(msg['From'], [msg['To']], msg.as_string())

def download_file(url):
    local_filename = url.split('/')[-1]
    # NOTE the stream=True parameter
    r = requests.get(url, auth=(email, password), stream=True)
    with open(local_filename, 'wb') as f:
        for chunk in r.iter_content(chunk_size=1024):
            if chunk: # filter out keep-alive new chunks
    return local_filename

if __name__ == '__main__':
    now =
    wk = now.isocalendar()[1]
    url = '{}-{}/epub/die_zeit_2018_{}.epub'.format(now.year, wk, wk+1)
    local_filename = url.split('/')[-1]
    full_script_path = os.path.dirname(os.path.abspath(__file__))
    full_zeit_path = full_script_path + '/' + local_filename
    if not os.path.isfile(full_zeit_path):
        url_exits = requests.get(url, auth=(email, password))
        if url_exits.status_code not in [200, 201]:
            name = download_file(url)
            print name


Github Gist Link


How to use FHEM with Home Assistant

2 min read

I have started several years ago using FHEM to automate some of my devices. Last year though, I discovered Home Assistant. It fits much better my technology stack as it's written in Python instead of Perl, so I started to migrate to it.

As always I'm running against some walls. It was impossible to get my IR-bridge (which switches on the amp) running in Home Assistant, so I needed a way to use the existing FHEM within Home Assistant.

First I opened a new FHEMWEB port (bind only on localhost) with csrfToken check switched off:


define WEBapi FHEMWEB 8086 global
attr WEBapi csrfToken none
attr WEBapi allowFrom

Now it's possible to add shell commands to Home Assistant, it could look like this:


  fhem_shutdown_all: /usr/bin/wget -q 
  fhem_start_first: /usr/bin/wget -q

As I use homeatic I need to wire everything together in scripts.yaml:

# Use scripts with homeatic keypress as there is no delay
    - service: light.turn_off
      entity_id: light.living_room
    - service: shell_command.fhem_shutdown_all

And here I bind the turn_all_off to my Homematic Switch:

- alias: "Alle Geraete Aus"
    platform: event
    event_type: homematic.keypress
       name: WohnzimmerSchalter
       channel: 1
       param: PRESS_SHORT
     - service: script.turn_on
       entity_id: script.turn_all_off

This is my second post of my home automation series, I hope it helps someone :)


My road to a privacy voice assistant

2 min read

Mycroft as voice assistantSince ages I have worked sporadicly on my home automation system. My first and biggest motivation was   to get ONE button to start the music system and play my music. Meanwhile I got a bigger plan: TELLING the system to play music.

And it should not be a kitchen radio with a lousy speaker.  I got the button-press-music working, and it does a lot:

  • Switches on the power plug from the amp
  • Switches on the amp with a IR-bridge
  • It sends a WOL packet to the mediasystem (Kodi)
  • It chooses a album from my media collection and sends a API call to Kodi to start playing

Right now it's buried into fhem (my old home automation software) and some custom python scripts. To be honest I don't know how it works anymore :)

So, to get the music played, I now only need to press ONE button :) But my plan is to tell the system "play music", just like Alexa in the tv spots. But of course, Alexa, Spotify and all the other cloud services are not an option as I want my system to be open source and to protect one's privacy.

That is why I've baked the Mycroft Mark II at Kickstarter and I plan to get my home automation setup ready for it! Here is what Mycroft wants to be:

The open answer to Amazon Echo and Google Home. Mycroft brings you the power of voice while maintaining privacy and data independence.

If all goes well Mycroft Mark II will be shipped by the end of the year. To get ready for it I plan to do a series of blog posts about it:

  • Describe the system I use and what i have learned
  • Integration of Kodi as a media center