Ansible Rolle hass für die Installation von Home Assistant

Wie im letzten Artikel beschrieben verwende ich die manuelle Installation von Home Assistant. Um ein System schnell wieder herstellen zu können kann Ansible verwendet werden. Dazu habe ich eine Rolle erstellt. Diese ist als Github Repository verfügbar. Im gleichen Repository finden sich (in naher Zukunft) noch andere Rollen die für eine Home Assistant Installation sinnvoll sein können. Eine Beschreibung der Variablen befindet sich in der README.

Weiterlesen gblog_arrow_right

Vorstellung Home Assistant und Installationsvarianten

Mein Einstieg in die Heimautomatisierung war die Messung von Temperaturen und später die Schaltung von Steckdosen per 433 MHz Funk (diese und diese). Um die Werte zu betrachten und die Steckdosen zu schalten habe ich mit Python einen eigenen kleinen Webserver geschrieben. Für richtige Automatisierungen bietet es sich jedoch an ein bereits bestehendes System zu benutzen. Meine Wahl fiel auf Home Assistant.

Screenshot meiner Home Assistant Installation

Home Assistant ist ein auf Python basierendes Open Source System mit dem viele Produkte zur Heimautomatisierung unterschiedlicher Hersteller in einem System zentral gesteuert werden können. Die verschiedenen Produkte werden als Components eingebunden. Für diese können dann z.B. Automatisierungen erstellt werden. Beim Eintreten von Bedingungen (Trigger) können diese automatisch ausgeführt werden. So kann z.B. automatisch Musik gestartet werden, wenn man nach Hause kommt. Die Seite Components gibt einen Überblick über die Geräte die eingebunden werden können. Mit der Suche kann man schauen ob bereits vorhandene Produkte unterstützt werden und erhält die passende Dokumentation (z.B. Sonos). Ähnliche Systeme sind z.B. openHAB, ioBroker oder FHEM.

Weiterlesen gblog_arrow_right

Dynamischer DNS Client für IPv6

Dynamisches DNS wird genutzt um den DNS Eintrag für einen Host dessen IP sich regelmäßig und häufig ändert zu aktualisieren. Dies ermöglicht z.B. das Bereitstellen von Diensten hinter einem (V)DSL-Anschluss unter einem gleich bleibenden Namen. Es gibt mehrere Anbieter die einen solchen Dienst anbieten. Ich nutze z.B. SPDyn. Die Aktualisierung des DNS-Eintrags kann durch einen Client wie z.B. ddclient oder auch direkt über eine Fritzbox erfolgen. Für IPv4 Hosts ist das Verfahren einfach, die IP ist immer die des Routers der dann bestimmte Ports an interne Hosts weiterleitet (Portforwarding). Da ich von meinem Provider einen Dual-Stack Anschluss erhalten habe, hatte ich in der Vergangenheit auch einen AAAA-Record für IPv6 bei SPDyn angelegt. Worauf ich allerdings nicht achtete: mein Provider vergibt bei jedem Neuverbinden ein anderes IPv6 Präfix. Dadurch ändert sich also auch jedes mal die IPv6-Adresse meines internen Hosts. Aufmerksam auf diese Problematik wurde ich durch einen Fehler beim Erneuern meines Let’s Encrypt Zertifikats (vgl. Artikel zu acme-tiny).

Wenn ein AAAA-Record vorhanden ist bevorzugt Let’s Encrypt seit kurzem diesen um die Domain zu verifizieren (API Announcements). Da mein vor langer Zeit angelegter AAAA-Record sich mittlerweile (schon oft) geändert hat, schlug das Erneuern des Zertifikats also fehl.

Parsing account key...
Parsing CSR...
Registering account...
Already registered!
Verifying domain.com...
Traceback (most recent call last):
  File "acme_tiny.py", line 199, in 
    main(sys.argv[1:])
  File "acme_tiny.py", line 195, in main
    signed_crt = get_crt(args.account_key, args.csr, args.acme_dir, log=LOGGER, CA=args.ca)
  File "acme_tiny.py", line 150, in get_crt
    domain, challenge_status))
ValueError: domain.com challenge did not pass: {u'status': u'invalid', u'validationRecord': [{u'addressesResolved': [u'217.251.47.207', u'2003:86:2455:9c00:d1:3ff:fe81:bd3f'], u'url': u'http://domain.com/.well-known/acme-challenge/PDUNtwiHq5dncDrvs4V2NE9nSR9vLF2WhnAbX1jQ7f0', u'hostname': u'domain.com', u'addressesTried': [], u'addressUsed': u'2003:86:2455:9c00:d1:3ff:fe81:b46f', u'port': u'80'}], u'keyAuthorization': u'PDUNtwiHq5dncDrvs4V2NE9nSR9vLF2WhnAbX1jQ7f0.YW7Ac9LxjjuWvWzD542ZzSKxcFKDIdehVVzAuYA0vHI', u'uri': u'https://acme-v01.api.letsencrypt.org/acme/challenge/-yjij3RP1r4YC_TkQrUemgjhfWI17pQZSjMZ8kr-Lps/1441804350', u'token': u'PDUNtwiHq5dncDrvs4V2NE9nSR9vLF2WhnAbX1jQ7f0', u'error': {u'status': 400, u'type': u'urn:acme:error:connection', u'detail': u'Fetching http://domain.com/.well-known/acme-challenge/PDUNtwiHq5dncDrvs4V2NE9nSR9vLF2WhnAbX1jQ7f0: Timeout'}, u'type': u'http-01'}

In der Fehlerausgabe ist bei addressUsed zu sehen, dass eine IPv6-Adresse zur Überprüfung verwendet wird. Da die Adresse falsch ist kommt es zu einem Timeout.

Um diesen Fehler zu beheben und in Zukunft auch per IPv6 auf meinen Host zu Hause zugreifen zu können muss nicht nur der A-Record für IPv4 sondern eben auch der AAAA-Record für IPv6 bei einer Änderung aktualisiert werden.

Weiterlesen gblog_arrow_right

Geschwindigkeit bei Zugriff von Mac OS X auf Samba Share

Ich nutze meinen Cubietruck als Samba Server. Irgendwann fiel mir auf, dass die Geschwindigkeit beim Kopieren von meinem Mac mit OS X El Capitan nur knapp über 10 MB/s lag. Da der Cubietruck eine Gigabit-Netzwerkkarte hat, sollte das um einiges schneller gehen. Außerdem war ich der Meinung früher schon Werte um die 30 MB/s gesehen zu haben. Der Gigabit-Anschluss wäre damit zwar auch noch nicht ausgelastet, aber immerhin.

Weiterlesen gblog_arrow_right

PowerShell Scripte mit WhatIf

Manchmal ist es sinnvoll den Aufruf eines eigenen PowerShell Scripts nur zu simulieren. Statt die Aktionen wirklich auszuführen möchte man lediglich sehen was passieren würde. Viele Cmdlets unterstützen den Parameter -WhatIf. Benutzt man diesen z.B. beim Anlegen eines Verzeichnis wird dieses nicht erstellt, sondern lediglich die im Beispiel angezeigte Meldung ausgegeben:

1
New-Item -ItemType Directory -Name "test" -Path "c:\temp" -WhatIf
PS C:\> New-Item -ItemType Directory -Name "test" -Path "c:\temp" -WhatIf
What if: Performing the operation "Create Directory" on target "Destination: C:\temp\test".
Weiterlesen gblog_arrow_right