Brother DCP-9017CDW und Linux

Das alte Faxgerät meines Vater ging leider kaputt und wurde zuletzt eh nur noch als Kopierer verwendet. Als Ersatz wurde ein Brother DCP-9017CDW auserkoren, da dieses Gerät:

  1. ein duplexfähigen Farblaser zur Ausgabe verwendet (trocknet einfach nicht ein),
  2. einen moderaten Anschaffungspreis besitzt,
  3. per WLAN auch mit Linux als Drucker verwendet werden kann und
  4. über ein einfaches Touch Display bedient werden kann.

Kurz um, das Gerät scheint das richtige zu sein, zumal auch eine Funktion “Scan2Email” auf der Funktionsliste steht. Leider sagt das Kleingedruckte “Benötigt Brother-Software” und verweist auf einen optionalen kostenlosen Download für Linux aus dem Brother Solutions Center. Ebenso leider existiert dann kein Download für Linux im Brother Solutions Center (Stand 25.12.2017). Ergo kein offizieller Weg für Scan2Email. Na danke.

Ohne Brother Software kann das Gerät allerdings auf (lokale) FTP-Server scannen. Lokal deshalb, da FTP als unsicher einzustufen ist (Link, Link, …).

Die Idee ist nun: vom Brother DCP-9017CDW wird in ein FTP-Verzeichnis pro Email-Adresse gescannt. Auf dem FTP-Server wird auf eingehende Dateien reagiert und diese per Mail versendet.

Folgende Software wurde ausgewählt:

  • vsftpd als FTP-Server,
  • mpack zum Versand der Dateien als Anhang,
  • exim4 mit Smarthost zum Versand der Mails und
  • incron zum Reagieren auf neue Dateien.

Zunächst erlaubt man dem vsftpd in seiner Konfiguration das Schreiben von Dateien (write_enable=YES) sowie lokale User (local_enable=YES). Somit kann auf dem DCP-9017CDW testweise auf den FTP-Server gescannt werden.

Anschließend exim so einrichten, dass er Mails nach außen versenden kann. Das passiert in diesem Szenario mit einem Smarthost. Dann sollte man testen, ob mpack auch Anhänge versenden kann:

mpack -s SUBJECT /PATH/TO/FILE MAILADRESSE

Kurz danach sollte die Datei als Anhang eintreffen.

Abschließend noch incron konfigurieren, damit auf neue Dateien reagiert werden kann:

  • den Nutzernamen, unter dem per FTP die Dateien abgelegt werden, in der Datei /etc/incron.allow vermerken
  • mit incrontab -e pro Verzeichnis bzw. Email Adresse eine Zeile der Form
    $PFAD IN_CLOSE_WRITE $Script $@/$# $MAIL

    eintragen

Das Script übergibt mpack die Datei und die Mailadresse und löscht die Datei nach dem Versand.

Et voilà, Scan2Mail funktioniert doch.

Urlaub in Südafrika 2017

Mein kleiner Reisebericht mit Bildern zu meinem Urlaub in Südafrika 2017.

Anreise (3.12. – 5.12.)

Eigentlich sollte das ja weniger als 24h zwischen Straßenbahnhaltestelle bis zur Landung in Johannesburg sein, aber der Reihe nach.

Bis zum 1. Boarding in Frankfurt lief alles glatt (Straßenbahn und ICE fuhren pünktlich, Check-In und Sicherheitsgedöns liefen gut), also rein in die Maschine. Direkt hinter mir eine Karlsruherin auf 8 Monatsweltreise.

Leider konnte die Maschine wegen technischer Probleme und einiger “we have to delay by 30 minutes” Ansagen wegen des Nachtflugverbots in Frankfurt nicht mehr starten. Dann eine Ansage, es würden Busse organisiert, wohin war unklar. Am Ende waren wir statt über den Wolken um 1 Uhr früh im Maritim (als einer der letzten bekam ich eine Suite). Allerdings war die Nacht viel zu kurz, die Busse kamen nach dem Frühstück gegen 9 und am Flughafen ging es zum Erneuten Check-In und Sicherheitsgedöns. Leider hoben wir wieder nicht wie geplant ab, da einige Passagiere nicht mehr eingecheckt hatten und so das Gepäck wieder aus der Maschine geholt werden musste. Also Abflug erst nach 15 Uhr Richtung Addis Abeba.

Up in the air

Der Flug dauerte rund 6,5h war dafür sehr ruhig und entspannend. Viele schöne Blicke aus dem Fenster auf die Alpen, den Balkan und Griechenland. Später dann Blicke auf helle Siedlungen in der Wüste und der Anflug auf Addis Abeba zwischen 2 Bergen hindurch war sehenswert.

Addis Abeba bei Nacht

Nach der Landung war unklar, ob direkt weiter geflogen würde oder wieder ein Hotel auf uns wartet. Es war ein Hotel, also raus aus dem Flughafen, ein nach Äthiopien mit Sondervisum auf der Boardkarte (nichts im Pass). Im Hotel um 1 Uhr noch ein Bier und ab ins Bett. Abfahrt zum Flughafen war um 6:40 und nur knapp 4h Schlaf. Es folgt 2 mal das Durchleuchten (Sicherheit wird großgeschrieben) und die Passkontrolle. Boarding war geplant ab 7:40 also alles mit Eile. Leider hakte es auch hier und Boarding war erst 8:30. Aber es ging immerhin (wenn auch mit 24h Verspätung) los nach Johannesburg. Auch dieser Flug war ruhig und relativ ereignislos.

Boing 787-8 der Ethiopian Airlines in Addis Abeba

Nach der Ankunft in Johannesburg die erste Überraschung: der Sommer fiel leicht ins Wasser. Nach Passkontrolle und dem ersten Stempel im Pass die nächste Überraschung: Gepäck weg… Na, das läuft ja super, immerhin mal angekommen. Waren ja nur 24h mehr als geplant.

Regen in O. R. Tambo / Johannesburg
Überflutungen in Johannesburg

Notfallshopping in der Southgate Mall in Johannesburg um wenigstens das Nötigste zu haben. Anschließend die Fahrt nach Potchefstroom in der Provinz Northwest.

Sunset after the rain

Zum Glück zeigte sich das Wetter auch noch von seiner schönen Seite, wie man am Sonnenuntergang gut erkennen kann.

Drakensberge & Golden Gate Highland NP (6.12. – 8.12.)

Am nächsten Tag die südafrikanische SIM-Karte erneut per RICA freischalten lassen, da der erste Versuch nicht erfolgreich war. Anschließend noch ein Paar Hosen und T-Shirt und ab auf den Weg zur Witsieshoek Mountain Lodge gemacht.

Der Weg führte durch den Golden Gate Highland National Park mit landschaftlich sehr schönen Felsformationen.

Panorama aus dem Golden Gate NP
Versteinerung in einem Restroom in der Nähe des Glen Reenen Campsite
Niedrig hängende Wolken (aufgenommen auf knapp 2000m ü. NN)

Weiter ging die Fahrt über Phuthaditjhaba zur Lodge. Diese befindet sich auf ca. 2200m ü. NN und auch hier befanden wir uns zunächst mitten in den Wolken. Das Wasser fiel beim Aufsteigen aus und so war das Wetter sehr ungemütlich und wir zweifelten an unseren Plänen für die Wanderung am nächsten Tag. Das Dinner im Restaurant war Entschädigung genug, landestypisch gab es Filetsteak mit Beilagen und dazu ein Windhoek Lager.

Am nächsten Früh erwiesen sich die Bedenken zum Glück als unbegründet. Zwar schien die Sonne nicht, aber die Wolken hingen höher als am Vortag und nach dem Frühstück sind wir aufgebrochen.

Der Name der Drakensberge (oder auch Drachenberge) ergibt sich aus den Bergen, die aus der Ferne wie die Rückenschuppen eines schlafenden Drachen aussehen. Zusätzlich sieht man viele “Dracheneier” wie dieses:

Ein Ei eines Drachen?

Zunächst begann die Wanderung bergab, da wir uns unterhalb der Wolken

Blick ins Tal
Blick auf die Tiefebene

bewegen wollten. Das hat sich zu 100% ausgezahlt, da wir dadurch ideales Wanderwetter hatten, nicht zu heiß, nicht zu feucht. Es gab hervorragende Aussichten vom Hochplateau in Richtung Tiefebene und in wunderschöne Täler.

Anfang eines ausgewaschenen Überhangs

Auf unserem weiterem Weg begegneten wir einheimischen Tieren und weiteren spektakulären Ansichten. Nach dem wir knapp 400 Höhenmeter abgestiegen waren, mussten wir diese entsprechend zur Lodge wieder aufsteigen. Auf diesen Höhen deutlich anstrengender, da die Luft hier bereits spürbar dünner ist, als auf den gewohnten knapp 200m ü. NN. Aber da mussten wir durch.

Krabbe im Wasser
Tausendfüßler

Am Nachmittag klarten die Wolken auf und ermöglichten einen Blick auf die Kulisse des Amphitheaters auf:

Blick aufs Amphitheater

Am 2. Tag erreichte uns die Nachricht, mein verlorenes Gepäck sei auf dem Weg nach Potchefstroom. Nach einem ausgiebigen Frühstück sind wir mit dem Auto zum Sentinel Car Park gefahren um dort noch eine kleine Wanderung zu machen. Hier gab es erneut geniale Aussichten, interessante Wolken und Tiere.

Blick auf den Parkplatz am Sentinel
Eine von vielen
Tief gehts hinab

Kurz vor der Abfahrt an der Lodge konnten wir noch einen Blick auf die von der Sonne beschienenen Felsen der Amphitheaters werfen:

Amphitheater in der Sonne

Auf dem Rückweg nach Potchefstroom haben wir beim Tanken in Clarens angehalten und von einer Maklerin noch ein paar Tipps für eine weiter kleine Runde bekommen. Auch hier wieder “wilde” Tiere und Felsformationen, aber seht selbst.

Überhang
Felsformationen
Flußkrebs
Dorfstraße

Der weitere Heimweg über die landesüblichen Dirt Roads mit kleinen Schlaglöchern mit Wasserfüllung hat uns dann noch an einem kleinen Sandsturm vorbeigeführt.

Im Golden Pond Guest Hause angekommen, stellt sich raus, dass das Gepäck nach der Landung in Johannesburg zunächst einen Umweg über Kapstadt eingelegt hat.

Pilanesberg Nationalpark (10.12.)

Nach einem Tag Pause in Potchefstroom ging es am 10. Dezember in den Pilansberge Nationpark. Da die Tiere die Mittagszeit normalerweise im Schatten der Büsche verbringen, ist es wichtig möglichst direkt nach Sonnenaufgang oder zumindest sehr früh durch die Gates des Nationalpark zu fahren. Wir sind deshalb kurz nach 5 Uhr los gefahren und waren ca. 7:30 im Nationalpark. Was man nicht vergessen sollte ist ein gutes Fernglas und eine gute Kamera.

Pilanesberg
Karte des Nationalparks (von https://www.pilanesbergnationalpark.org/de/map/)

Ganz wichtiges Schild kurz nach der Fahrt in den Nationalpark. Diesem ist definitiv zu folgen, da die Tiere hier frei laufend und nicht gezähmt sind. Sie sind höchstens tolerant gegenüber Fahrzeugen.

Warnschild

An einigen Stellen sind Hütten (Look outs und Hides) errichtet worden, dort ist das Aussteigen explizit erlaubt.

Blick ins Tal

Von den “Big Five” haben wir nicht alle erwischt, aber das ist auch relativ unwahrscheinlich. Gesehen und auch photographiert haben wir Nashörner und Elefanten sowie Löwen. Diese findet man auf den folgenden Bildern. Interessanterweise verzieht sich der König der Tiere sicherheitshalber wenn ein grasendes Nashorn auftaucht.

Löwe direkt neben dem Fahrweg
Nashörner und Elefanten
Nashorn
Elefante mit Jungtier

Am Mankwe Damm konnten wir neben einigen Vögeln auch noch Flusspferde (leider zu weit weg für die Kamera), viele Schildkröten und ein Babzkrokodil:

Schildkröte und Krokodil

Auf den weiteren Wegen durch den Park sahen wir noch eine Zebraherde mit Jungtieren und auch Giraffen, Impalas, Wasserböcke, Warzenschweine sowie viele weitere Tierarten.

Zebras
Giraffe
Eule
Impala
Warzenschwein

Ein Besuch in einem Nationalpark ist definitiv sehens- und empfehlenswert!

Erholungstag (11.12)

Nachdem wir erst kurz vor Mitternacht wieder in Potchefstroom waren, haben wir den Montag sehr ruhig verbracht. Unter anderem nochmals die NWU besucht, den Mietwagen aufgeräumt. Falls jemand in Potchefstroom ein Guest House sucht, so kann ich den Golden Pond empfehlen.

Rückflug (12.12-13.12)

Den Rückflug von Johannesburg nach Frankfurt möchte ich deshalb erwähnen, da er absolut problemlos war. Also ein schöner Kontrast zum Hinflug, der ja doch recht nerven aufreibend war.

Update 25.12.2017:
Alle Links auf https umgestellt.

Wärmeleitpaste für ein 10 Jahre altes MacBook und weitere Mods

Das ist für viele sicher eigentlich keinen Blog-Eintrag wert, ich will es trotzdem kurz niederschreiben. Die Erneuerung der Wärmeleitpaste ist zwar aufwändig, kann aber sehr positive Effekte hervorrufen.

Demontage des Macbooks ist laut ifixit schwierig aber machbar. Wärmeleitpaste in einer Spritze mit Spatel kann bei einem bekannten Versandhändler von CoolerMaster für wenige Euros bekommen.

Als Ergebnis ist das MacBook subjektiv deutlich leiser und wohl auch kühler (an der CPU) da die Wärme schneller abgeleitet wird.

Fazit: Mit Anleitung machbar und bringt viel.

Thread Dumps – auch für Python

Thread Dumps sind Momentaufnahmen des Aufruf-Stacks für jeden Thread einer laufenden multi-thread Anwendung. Dies ist in vielen Situationen zur Analyse hilfreich. Diese gestaltet sich gerade bei multi-thread Anwendung meist komplizierter.

Für Java gibt es das Programm jstack (u.a. mit jps im JRE enthalten) um Thread Dumps zu erzeugen.

Unter Python kann ein ähnliches Verhalten (getestet unter Linux) mit einem kleinen Umweg über einen Signal-Handler erreicht werden:

...
import faulthandler 
import signal
import os
...

def handler(signum, frame):
  file ='/tmp/threads'
  print('Writing thread dump to ', file)
  with open(file, 'w') as f:
    faulthandler.dump_traceback(file=f, all_threads=True)

...
if __name__ == '__main__':
  with open('/tmp/pid', 'w') as f:
    f.write(str(os.getpid()))
  signal.signal(signal.SIGUSR1, handler)
  ...

Nach dem Starten des Programms kann man über die PID aus /tmp/pid einen Thread Dump erzeugen:

kill -USR1 `cat/tmp/pid`

Dieser sieht exemplarisch so aus (extra in kleinerer Schriftart um die Zeilen ohne Umbrüche zu erhalten):

Thread 0xb3ccb460 (most recent call first):
 File "/home/jlusiardi/.local/lib/python3.4/site-packages/zeroconf.py", line 1102 in run
 File "/usr/lib/python3.4/threading.py", line 920 in _bootstrap_inner
 File "/usr/lib/python3.4/threading.py", line 888 in _bootstrap

Thread 0xb44ff460 (most recent call first):
 File "/usr/lib/python3.4/socketserver.py", line 154 in _eintr_retry
 File "/usr/lib/python3.4/socketserver.py", line 236 in serve_forever
 File "/home/jlusiardi/sources/smarthome/homekit_link/__init__.py", line 142 in run
 File "/usr/lib/python3.4/threading.py", line 920 in _bootstrap_inner
 File "/usr/lib/python3.4/threading.py", line 888 in _bootstrap

Thread 0xb4cff460 (most recent call first):
 File "/home/jlusiardi/sources/smarthome/influxdb/__init__.py", line 109 in run
 File "/usr/lib/python3.4/threading.py", line 920 in _bootstrap_inner
 File "/usr/lib/python3.4/threading.py", line 888 in _bootstrap

Thread 0xb6025460 (most recent call first):
 File "/usr/lib/python3.4/socketserver.py", line 154 in _eintr_retry
 File "/usr/lib/python3.4/socketserver.py", line 236 in serve_forever
 File "/home/jlusiardi/sources/smarthome/homematic/callback.py", line 42 in run
 File "/usr/lib/python3.4/threading.py", line 920 in _bootstrap_inner
 File "/usr/lib/python3.4/threading.py", line 888 in _bootstrap

Current thread 0xb6fb6300 (most recent call first):
 File "./main.py", line 19 in handler
 File "/usr/lib/python3.4/cmd.py", line 126 in cmdloop
 File "/home/jlusiardi/sources/smarthome/cli/__init__.py", line 32 in cmdloop
 File "./main.py", line 50 in <module>

Auch hier bieten sich verbesserte Analysemöglichkeiten analog zu Java.

SanDisk iXpand 128 GB

Ich bin iPhone-User und kann mich an Android einfach nicht gewöhnen. Allerdings bin ich auch preisbewusst und habe mich dieses Jahr erstmals für ein neues iPhone SE mit 32GB entschieden. Der Speicherplatz ist eigentlich ausreichend.

Eigentlich…

Im Urlaub fallen ja dann mal doch mehr Bilder und Videos an, da können 32GB schon mal knapp werden. Alles in die Cloud? Laptop mit Windows oder OS X mitnehmen? Kann man sich dank des SanDisk iXpand 128 GB sparen. Dank iOS-App kann man u.a. Bilder und Videos vom iPhone auf den Stick sichern. Nach einem Backup lassen sich die gesicherten Dateien automatisch aus der App heraus löschen. Ein weiterer Vorteil: auch Linux-User kommen so an die Bilder und Videos des iPhones.

Fazit: gute, einfache Möglichkeit schnell Bilder und Videos vom iPhone zu sichern.

Sun Type 6 Keyboard (ohne USB) an modernen PCs (mit USB)

In meinem Keller befand sich noch eine Sun Type 6 Tastatur in der Variante mini-DIN Anschluss. Später hat Sun die Type 6 noch mit USB angeboten, aber so eine habe ich leider nicht.

Was kann man heute mit so einer Tastatur anfangen?

Direkt nicht viel, aber die SPARC Keyboard Specification Version 1 sagt, daß diese Tastaturen ein serielles Protokoll mit negativer Logik mit 1200 Baud sprechen. Ein Test mit einem Arduino ergab, dass die SoftwareSerial-Bibliothek dies unterstützt. Entsprechend kann man mit der Tastaturelektronik sprechen. Richtung PC hilft einem eine serielle Schnittstelle nicht viel, da PCs zunächst einen AT Anschluss, später dann PS/2 und schlussendlich USB für Tastaturen nutzen.

USB ist der aktuelle Standard für den Anschluss von Tastaturen an PCs. Also benutzen wir einen Arduino, der nativer USB Client und platzsparend  ist. Der Vorschlag: ein ATmega32u4 basierter Arduino Micro (oder ein kleinerer Klon).

Die Verkabelung ist einfach:

  • GND der Tastatur (Pin ganz recht) wird mit einen GND Anschluss des Arduinos verbunden
  • VCC der Tastatur (2. Pin von rechts) an den VCC des Arduinos anschließen (5V sind ok)
  • den RX Pin der Tastatur (4. von rechts) an den SoftwareSerial TX Pin (im Code ist dies Pin 15)
  • den TX Pin der Tastatur (5. von rechts) an den SoftwareSerial RX Pin (im Code ist dies Pin 14)

Für einfache Aufgaben reicht die Keyboard und Maus Bibliothek von Arduino. Allerdings nimmt diese intern bereits ein Mapping auf ASCII vor (“Note: Not every possible ASCII character, particularly the non-printing ones, can be sent with the Keyboard library.”). Dies bereitet dann prompt Probleme beim Umsetzen der kompletten Tastatur mit einem Arduino. Ebenso lässt sich die Kommunikation des Hosts mit der Tastatur (Schalten der LEDs) nicht abbilden. Dies wird durch Nico Hood’s HID Projekt (Version von Commit 3c5000c4b606b85054150a201f0c6229a9148068) ermöglicht.

Den Code des Sketches findet sich im GitHub Repository: sun-type6-to-USB

Nach dem Flashen des Sketches in den Arduino ist es möglich einen Text wie diesen auf einer Sun Type 6 an einem modernen PC zu schreiben.

Docker und IPv6

Zu meinem Root-Server gab es ein /64-IPv6 Netz (z.B. 2a03:4000:15:3b7/64)  und somit mehr als genug Adressen. Doch wie kann ich Docker-Container unter über diese Adressen ansprechen?

Zunächst fügt man eine IPv6-Adresse aus dem Netz der Netzwerkkarte hinzu:

ip -6 a a 2a03:4000:15:3b7::3/64 dev eth0

Dann startet man einen Container und ruft die IPv4 Adresse aus dem Docker-internen Netz ab:

docker run --name testnginx -d nginx
docker inspect --format '{{ .NetworkSettings.IPAddress }}'\
    testnginx

Anschließend leitet man mit socat die IP-Pakete von der IPv6-Adresse an die IPv4-Adresse des Containers weiter:

socat TCP6-LISTEN:80,reuseaddr,fork,bind=[2a03:4000:15:3b::3]\
    TCP4:172.17.0.15:80

Nun kann man direkt auf den Port des Containers über IPv6 zugreifen.

Influxdb und Grafana

Aus meinem beruflichen Umfeld ist mir Grafana als Lösung zur grafischen Aufbereitung gut bekannt. Daten beziehen wir klassisch aus Graphite.

Für ein Projekt habe ich nun die Daten über öffentliches Netz (also das Internet) in die Datensenke einliefern müssen. Zunächst auch hier an Graphite gedacht, jedoch ergab sich schnell die Überlegung, das der Graphite Port 2003 (hier lauscht der Carbon Daemon) jedwede Daten ohne Authentifizierung annimmt. In einem  öffentlichen Netz sicher kein akzeptabler Zustand, da hier jeder mit Kenntnis von Port und IP beliebige Stördaten einliefern kann. Also auf die Suche nach Alternativen.

InfluxDB bietet laut db-engines.com  als Berechtigungskonzept mit einer “einfache[n] Rechteverwaltung mit Benutzeraccounts” mehr als Graphite. Auch verspricht die Implementierung in Go mehr Performance. Grund genug, sich InfluxDB näher anzusehen.

InfluxDB

Dank des offiziellen Docker Images ist InfluxDB schnell probeweise gestartet. Hinweise liefert die Seite des Docker-Hub. Zunächst wird die Standardkonfiguration extrahiert:

docker run --rm influxdb influxd config > influxdb.conf

In dieser Datei muss die Option auth-enabled nun aktiviert werden:

...
[http] 
...
auth-enabled = true
...

In Kombination mit meinen beiden Projekten docker_nginx_auto_proxy und docker_ssl_endpoint kann man nun einen Docker Container starten, der Daten über TLS abgesichert entgegen nimmt:

docker run --name=influxdb_1 -d \
 -e PROXY_DATA=server_names:$INFLUXDOMAIN,port:8086 \
 -v /data/influxdb/data:/var/lib/influxdb \
 -v /data/influxdb/conf:/etc/influxdb/influxdb.conf:ro \
 influxdb -config /etc/influxdb/influxdb.conf

Nun müssen wir mindestens einen Admin-Nutzer anlegen. Zunächst verbinden wir uns auf die InfluxDB-CLI:

docker run --rm --link=influxdb_1 -it influxdb influx -host influxdb_1

Anschließend legt folgendes Statement den Admin-Nutzer bofh an:

CREATE USER bofh WITH PASSWORD 'rrzs42' 
  WITH ALL PRIVILEGES

Anschließend die CLI beenden und beim Neuverbinden zusätzlich die Parameter username und password zur Authentifizierung verwenden. Weitere Informationen zur Nutzerverwaltung von InfluxDB findet man in der offiziellen Dokumentation.

Eine Datenbank sollte in der CLI ebenfalls erstellt werden:

CREATE DATABASE datensenke

Testweise können nun bereits Daten eingeliefert werden:

curl -X POST -u bofh:rrzs42 \
  --data-binary 'wert,key=value wert=42.23'\
  'https://$INFLUXDOMAIN/write?db=datensenke'

Die genaue Beschreibung über das Schreiben von Daten findet man in der offiziellen Dokumentation.

Grafana

Für Grafana gibt es ebenfalls ein offizielles Docker-Image. Der erste Schritt ist das Extrahieren der Konfiguration:

docker run --rm --name grafana grafana/grafana
docker cp grafana:/etc/grafana/grafana.ini .

Die wichtigste Anpassung der Konfiguration bezieht sich auf das Abschalten des selbständigen Anmeldens neuer Nutzer (allow_sign_up = false in der Kategorie users). Somit ist nur noch der Administrator (Login: admin) in der Lage, neue Nutzer anzulegen.

Gestartet wird der Grafana-Container mit folgendem Kommando:

docker run --name=grafana -d \
    -e PROXY_DATA=server_names:$GRAFANADOMAIN,port:3000 \
    -v /data/grafana/lib:/var/lib/grafana/ \
    -v /data/grafana/conf:/etc/grafana/grafana.ini \ 
    -e "GF_SERVER_ROOT_URL=https://$GRAFANADOMAIN" \
    -e "GF_SECURITY_ADMIN_PASSWORD=s3cr3t" \
    grafana/grafana

Nun kann die Grafana-Instanz unter  https://$GRAFANADOMAIN aufgerufen werden und der Login funktioniert mit den Credentials admin:s3cr3t.

Der nächste Schritt sollte das Ändern des Passworts des Administrators sein und das Anlegen neuer Nutzer sein. Dies geschieht unter Grafana-MenuAdminGlobal Users.

Um wie die Daten aus InfluxDB in Grafana nutzen zu können, legt man eine Datenquelle unter Grafana-MenuData Sources an. Die Einstellungen für InfluxDB sind in unserem Fall:

  • Type: InfluxDB
  • URL: https://$INFLUXDOMAIN
  • Access: Proxy
  • Http Auth: With Credentials
  • InfluxDB Details:
    • Database: datensenke
    • User: bofh
    • Password: rrzs42

Jetzt sind wir in der Lage, über Dashboards wie gewohnt Graphen an zu legen. Beispielsweise:Et voilà, flexible und ansehnliche graphische Aufbereitung von Zeitseriendaten.

ioBroker: Ergänzung zu Open Source Hausautomatisierung im Vergleich

Im Artikel zu Open Source Hausautomatisierungslösungen wurden bereits einige Lösungen verglichen. Auf der diesjährigen 17. Gulaschprogrammiernacht  hat Bluefox ein weiteres System vorgestellt: ioBroker

ioBroker soll nun an den gleichen Kriterien wie die anderen 7 Systeme gemessen werden:

  1. Die Software muss quell-offen und frei sein (OpenSource)
  2. Dokumentation auf Englisch bzw. Deutsch und in ausreichenden Qualität und Detailtiefe vorhanden (Dokumentation)
  3. Größe der Community
  4. Support für Komponenten von eQ-3 für Homematic und Homematic IP (Hardware-Unterstützung), da diese bereits vorhanden ist.
  5. Apps für iOS bzw. Android (Apps)
  6. Verwendete Programmiersprachen & Technologien (Technologie)
  7. Die Software muss Graphen zur historischen Analyse von Messwerten bieten (Graphen)
  8. Die Software muss über Regeln erweiterbar sein, z.B. Verknüpfung von Schalter, Reaktion aufs Verlassen der Wohnung (Regeln)

ioBroker ist ein bei Github gehostetes OpenSource-Projekt unter MIT-Lizenz und basiert auf Node.js, einer Server-seitigen Implementierung von JavaScript.

Anleitungen zur Installation sind auf Deutsch, Englisch und Russisch vorhanden. Allerdings sollten die Autoren hier noch etwas Zeit investieren und Fehler ausbessern, da diese den Lesefluss beeinflussen.

Laut dem Vortrag von Bluefox (Videomitschnitt exisitiert) wächst die Community von ioBroker rasant an. Dazu trägt sicher auch bei, dass bereits eine Integration für Amazon Alexa existiert, was das Gesamtsystem deutlich smarter erscheinen lässt.

Homematic und Homematic-IP werden laut Forum unterstützt. Auch scheint Anwesenheitserkennung über Fritz!Box und das Steuern von Samsung TV Geräten unterstützt zu werden.

Wichtig sind natürlich auch Apps für:

Da ioBroker auf Node.js basiert kann beim Entwickeln sowohl Front- als auch Backend  in einer Sprache entwickelt werden. Daten werden sowohl in relationalen Datenbanken (MySQL, PostgreSQL oder SQLite) als auch in InfluxDB für zeitbasierte Daten abgelegt. Die transparenten Verbindungen über TCP erlauben es hierbei, Teile der Software modular auf mehreren Hosts zu betreiben.

Zur Visualisierung bietet ioBroker einen Editor, der komplett im Browser läuft. Hierbei werden unterschiedliche Darstellungen für Zielgeräte angeboten.  Diese Funktionalität wird über den VIS-Adapter bereit gestellt. Graphen stellt das System hierbei über den Flot-Adapter dar.

Zur Eigentlichen Automatisierung bietet ioBroker das Definieren von Szenen über den Szenen-Adapter aber auch das Erstellen komplexer über Adapter für Blockly und node-red.

Zusätzlich zu den, für den Vergleich wichtigen, Punkten bietet eine Integration in Apples Homekit. Diese ist ebenso ein Pluspunkt wie auch der optionalen Clound-Zusatz, der einen Zugriff aus der Ferne auch ohne eigenes VPN ermöglicht.

Alles in Allem ist ioBroker eine weitere Software mit guten Ansätzen, die ich aber aus Zeitgründen und da ich weder mit Node.js noch Javascript besonders viel Erfahrung besitze, nicht weiter betrachten werde.

Gehäuse “selbst” gemacht

Für eines meiner Projekte wahr mal wieder ein schickes Gehäuse gefragt. 160mm breit, 130mm hoch, 120mm tief, 2 Aussparungen: eine für ein Display, eine für eine Infrarotdiode. Aber selbst berechnen, aufzeichnen und selbst sägen? Heute mal nicht.

Berechnen und Zeichnen

Im großen Internet hat schon jemand ein Lösung für das Problem des Zeichnens bereitgestellt: Makercase.com ermöglicht über Eingabe von einigen Eckdaten (Höhe, Breite, Tiefe, Materialstärke, Innen- oder Außenmaß?) sowie optionaler Verzahnung das Anlegen des Korpus. Zusätzlich können noch Durchbrüche (Löcher) positioniert werden. Zum Abschluss kann das Modell als JSON gespeichert werden beziehungsweise als Schnittmuster für Laser-Cutter heruntergeladen werden.

Das ganze passiert in Javascript im Browser, entsprechend kann sich das auf älteren Maschinen etwas ziehen.

Ausdrucken des Schnittmusters auf Papier zum Testen der Position der Löcher und Verzahnungen wird empfohlen. Hier kam Inkscape zum Einsatz. Hier können (und müssen später) noch Anpassungen vorgenommen werden.

Ausschneiden (lassen)

Aussägen mit der Laubsäge von den Verzahnungen? Nein, dank FORMULOR* ist dies nicht mehr nötig. FORMULOR* kann die Schnittmuster von MakerCase nach einigen Anpassungen aus diversen Materialien ausschneiden.

Eine Anleitung für Inkscape findet sich in auch in Englisch. Wichtig ist es, die Vorlagen für Inkscape zu verwenden (der Link findet sich auf der Anleitungsseite neben dem Inhaltsverzeichnis), da hierdurch lt. FORMULOR* die Bearbeitung beschleunigt werden kann. In meinem Fall waren folgende Schritte notwendig:

  • Anordnen der einzelnen Teile auf einem 384x384mm großen Zeichenbereich (als Material 3mm Sperrholz)
  • Ändern der Schnittkanten auf Blau (RGB: 0,0,255)
  • Anpassen der Linienstärke auf 0.01mm (leider zeigt Inkscape diese dann nicht mehr an)

Lädt man eine Datei bei FORMULOR* hoch, wird diese zunächst auf Regelverstöße geprüft und entsprechend beanstandet.

Anschließend kann man den Bestellvorgang starten, in meinem Fall etwas über 30€ inkl. Versand.

Lieferung

Hat etwas gedauert, lag aber wohl daran, dass ich die Vorlage nicht verwendet habe (Errinnerung: Vorlagen für das jeweilige Programm befinden sich auf der entsprechenden Anleitungsseite neben dem Inhaltsverzeichnis). Qualitativ kann ich nicht meckern, hatte bisher aber auch keine Erfahrung mit Laser-Cut-Sperrholz. Riecht etwas verbrannt, aber das wird produktionsbedingt sein. Von daher: alles gut, wird sicher noch mal probiert.