Universelle Infrarot Fernbedienung mit Tasmota steuert AppleTV mit Alexa Integration

Ziel: universelle Fernbedienung mit Alexa Integration

Mein Ziel ist es, dass ich eine universelle Fernbedienung mit Tasmota realisiere. Dazu verwende ich die auvisio WLAN Fernbedienung von Pearl, auch unter dem Namen URC-150.app. Die Produktseite ist hier zu finden https://www.pearl.de/a-NX4519-3103.shtml

Flashen der IR Fernbedienung mit Tasmota

Auch diese ungefähr Streichholzschachtel große Box basiert auf einem ESP8266 und der Tuya Software, mit den gleichen Sicherheitslücken wie etliche Steckdosen und kann mittels Tuya-Convert mit Tasmota geflasht werden. Wie das gemacht werden kann habe ich hier am Beispiel einer Teckin SP21 Steckdose beschrieben.

Das Flashen geht leicht von der Hand und klappte im zweiten Anlauf, nachdem ich den Resetknopf an der Unterseite der auvision WLAN Fernbedienung lange gedrückt hielt. Ggf. muss man hier etwas probieren (lange drücken, gedrückt halten bis der Flashvorgang startet, mehrfach drücken…. wer hier genaueres weiß gerne in die Kommentare schreiben).

Nach dem Flashen macht Tasmota wie gehabt einen WLAN Accesspoint TASMOTA-XXXX auf, mit dem man sich z.B. mit dem Handy verbindet und den Zugang zum lokalen WLAN konfiguriert. Anschließend startet Tasmota neu und ist ab sofort im lokalen WLAN unter der per DHCP zugewiesenen IP Adresse erreichbar.

Um die IP Adresse des neuen Geräts im lokalen Netzwerk herauszufinden schaut man im Router in der Liste der Netzwerkgeräte nach. Alternativ verwende ich dafür die App Fing die das lokale Netzwerk nach Geräten scannt. Schön ist, dass man hier auch gleich noch nach offenen Ports scannen kann uvm.

Hat man die IP des neuen Geräts herausgefunden ruft man diese im Browser auf und kann das Tasmota für die IR Fernbedienung konfigurieren.

Konfiguration von Tasmota für die IR Fernbedienung

Nach dem ersten Flashen mit tasmota.bin habe ich per Over The Air Update das tasmota-ir Binary geflasht. Ansonsten war das senden per irsend nicht möglich. Um das IR Binary einzuspielen muss nur unter Firmware Upgrade die OTA Url http://thehackbox.org/tasmota/tasmota-ir.bin angegeben werden,

Als Template habe ich unter Configuration / Configure Other das Template für auvisio S06 eingetragen (Haken „Activate“ nicht vergessen!):

{"NAME":"NX-4519-675","GPIO":[255,255,255,255,52,51,0,0,255,255,8,255,255],"FLAG":1,"BASE":18}

Hier aktiviere ich auch MQTT, das ich für die Steuerung später benötige. Unter Configuration / Configure MQTT trage ich noch meinen MQTT Broker ein und vergebe ein Topic. In meinem Fall nenne ich das Topic infrarot.

Fernbedienung auslesen

Nun beginnt der spannende Teil, das Auslesen von Infrarot Kommandos. Dazu öffne in Tasmota die Console, halte die Fernbedienung in Richtung der auvisio Box und drücke die gewünschten Tasten an der Fernbedienung. In der Console werden daraufhin die empfangenen IR Kommandos geloggt. Diese Kommandos verwenden wir dann, um sie mit IRsend zu versenden. Beispielhaft habe ich nach dem Druck auf Taste 1 meiner Fernbedienung in der Console diese Ausgabe erhalten:

17:47:09 MQT: tele/infrarot/RESULT = {"IrReceived":{"Protocol":"RC5","Bits":12,"Data":"0x201","DataLSB":"0x4080","Repeat":0}}

Um nun über die auvisio Box das Kommando für Taste 1 zu senden kann in der Console einfach das Kommando in der Form IRsend {"Protocol":"<value>","Bits":<value>,"Data":<value>} abgesetzt werden. Konkret für die oben empfangenen Daten also: IRsend {"Protocol":"RC5","Bits":12,"Data":0x201}, Auf der Konsole wird die Aktion entsprechend protokolliert und das Gerät entsprechend geschaltet:

17:54:01 CMD: IRsend {"Protocol":"RC5","Bits":12,"Data":0x201}
17:54:01 MQT: stat/infrarot/RESULT = {"IRSend":"Done"}

Details zu IRsend gibt es im Tasmota Wiki

Exkurs – Protocol: unknown

Mit einer Fernbedienung für meinen Samsung Fernseher hatte ich die Schwierigkeit, dass als Protocol „unknown“ angezeigt wurde. Meine Recherche hat mich zur Möglichkeit Raw Daten auszulesen geführt. Hierzu wird über die Console mittels SetOption58 1 (Doku zur Option hier) der Empfang von Raw-Daten eingeschaltet. Die Ausgabe unten zeigt, wie diese Raw Daten dann aussehen.

 17:47:35 CMD: SetOption58 1
 17:47:35 MQT: stat/infrarot/RESULT = {"SetOption58":"ON"}
 17:47:55 MQT: tele/infrarot/RESULT = {"Time":"2019-12-14T17:47:55","IrReceived":{"Protocol":"UNKNOWN","Bits":34,"Hash":"0xF4BA2988","RawData":[4446,4468,596,1644,600,1642,598,1640,596,524,568,572,574,524,572,544,572,572,548,1670,570,1670,598,1640,576,550,590,548,576,524,592,522,600,522,570,550,596,1646,596,522,596,526,594,524,572,550,594,546,550,570,572,1644,598,524,570,1668,598,1642,602,1640,594,1648,570,1668,572,1670,598],"RawDataInfo":[67,67,0]}}

Aus diesen Raw-Daten habe ich wie im Tasmota Wiki beschrieben die notwendigen Parameter ermittelt …

Header mark 4446
Header space 4468
Bit mark: 585
Zero space: 540
One space: 1650
Bitcode: 11100000111000000100000010111111

… um damit schließlich dieses Kommando abzusetzen IRsend raw,0,4446,4468,585,540,1650,11100000111000000100000010111111

Und siehe da – der Fernseher ging an. Yippieh!

Wie ich allerdings später festgestellt habe hätte ich mir das komplizierte Vorgehen auch sparen können. Ein langer Druck auf die entsprechenden Tasten auf der Fernbedienung führen dazu, dass einige Male das Protokoll als „Samsung“ erkannt wurde. Vielleicht hätte auch SetOption38 zur Anpassung der Protokoll-Erkenn-Empfindlichkeit weitergeholfen über die ich aber leider erst jetzt gestolpert bin.

Nun ja…. ging auch so … und ich habe einige über IR Protokolle gelernt.

Und jetzt wird per MQTT ferngesteuert

Auf der Console in Tasmota haben wir nun der Reihe nach alle Tasten gedrückt und uns alle benötigten Codes aus den „Data“ Strings besorgt. Wie wir sehen können werden sie über Tasmota dank eingeschaltetem MQTT auch direkt an das Topic tele/infrarot/RESULT gepublished.

17:47:09 MQT: tele/infrarot/RESULT = {"IrReceived":{"Protocol":"RC5","Bits":12,"Data":"0x201","DataLSB":"0x4080","Repeat":0}}

Also versuchen wir jetzt einfach den anderen Weg und publishen an das cmnd Topic cmnd/infrarot/irsend {"Protocol":"RC5","Bits":12,"Data": 0x201}. Hierzu verwende ich zunächst den MQTT Explorer als Client.

Das klappt ja schon mal prima!

Mittlerweile habe ich Node Red installiert (bei mir als Service in IOBroker im Docker Container auf der Synology DS718+) und lege mir daher einen Flow für meine Fernbedienung an. Wer einen Einstieg in Node Red sucht, dem kann ich die Videos von haus-automatisierung.com zu Node Red sehr empfehlen.

Nun habe ich einen schönen Knopf auf meinem Node Red Dashboard, um meinen Fernseher ein- und auszuschalten. Aber ich will mehr: Jetzt soll AppleTV gesteuert werden.

AppleTV per MQTT fernsteuern

Der erste Versuch über den Node https://flows.nodered.org/node/node-red-contrib-apple-tv ist fehlgeschlagen. Node Red lief zu der Zeit auf einem Raspberry Pi und die Installation des Node ist bei sodium fehlgeschlagen. Hier dann einen für mich viel einfacheren Weg gegangen, indem ich die auvision Box als Fernbedienung im AppleTV angelernt habe. Hierzu habe ich mir eine Reihe von Codes „ausgedacht“, die ich per MQTT oder Tasmota Console wie oben beschrieben an das AppleTV geschickt habe.

IRSend {"Protocol":"PANASONIC","Bits":48,"Data":0x100BCBD}

Nachfolgende Data-Codes habe ich mit dem Protokoll Panasonic mit 48 Bit zum Anlernen der neuen Fernbedienung an. das Apple TV verwendet.

TasteData
Pfeil hoch0x100BCBD
Pfeil runter0x400401004C4D
Pfeil links0x400401000405
Pfeil rechts0x400401008485
Select0x400401002C2D
Menu0x40040100ACAD
KommandoData
Play0x400401007273
Pause0x40040100F2F3
Stop0x400401005253
zurückspulen0x40040100D2D3
vorspulen0x400401009293
Skip zurück0x400401004A4B
Skip vorwärts0x400401000E0F
zurückspringen0x400401004E4F
vorspringen0x400401008E8F

Untenstehend ist der Node-Red Flow beigefügt, den ich zur Fernbedienung verwende.

[
    {
        "id": "3b9c6e64.3a6a02",
        "type": "tab",
        "label": "AppleTV",
        "disabled": false,
        "info": ""
    },
    {
        "id": "8cd74408.1f0058",
        "type": "comment",
        "z": "3b9c6e64.3a6a02",
        "name": "AppleTV angelernte Codes",
        "info": "Verwendungsbeispiel auf Tasmota Console:\nIRSend {\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\":0x100BCBD}\n\nAllgemeine Tasten\n\n0x100BCBD =„Pfeil hoch“\n0x400401004C4D =„Pfeil runter“\n0x400401000405 =„Pfeil links“\n0x400401008485 =„Pfeil rechts“\n0x400401002C2D =„Select“\n0x40040100ACAD =„Menu“\n\nWiedergabetasten\n\n0x400401007273=„Play“\n0x40040100F2F3=„Pause“\n0x400401005253=„Stop“\n0x40040100D2D3=„zurückspulen“\n0x400401009293=„vorspulen“\n0x400401004A4B=„Skip zurück„\n0x400401000E0F=„Skip vorwärts“\n0x400401004E4F=„zurückspringen“\n0x400401008E8F=„vorspringen“",
        "x": 150,
        "y": 120,
        "wires": []
    },
    {
        "id": "3923891d.98ce66",
        "type": "mqtt out",
        "z": "3b9c6e64.3a6a02",
        "name": "",
        "topic": "cmnd/infrarot/irsend",
        "qos": "",
        "retain": "",
        "broker": "",
        "x": 560,
        "y": 520,
        "wires": []
    },
    {
        "id": "a89a8e3b.33991",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "Menu",
        "group": "c296a358.3a5d9",
        "order": 1,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "AppleTV an",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\":0x40040100ACAD}",
        "payloadType": "str",
        "topic": "",
        "x": 90,
        "y": 160,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "1e51cb20.b2b7c5",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "Pfeil hoch",
        "group": "c296a358.3a5d9",
        "order": 3,
        "width": 2,
        "height": 2,
        "passthru": false,
        "label": "",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "arrow_upwards",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\": 0x100BCBD}",
        "payloadType": "str",
        "topic": "",
        "x": 100,
        "y": 220,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "4b0c2bfc.435f44",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "Pfeil links",
        "group": "c296a358.3a5d9",
        "order": 7,
        "width": 2,
        "height": 2,
        "passthru": false,
        "label": "",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "arrow_back",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\": 0x400401000405}",
        "payloadType": "str",
        "topic": "",
        "x": 100,
        "y": 260,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "7013e84b.2c3038",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "Pfeil rechts",
        "group": "c296a358.3a5d9",
        "order": 9,
        "width": 2,
        "height": 2,
        "passthru": false,
        "label": "",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "arrow_forward",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\": 0x400401008485}",
        "payloadType": "str",
        "topic": "",
        "x": 110,
        "y": 300,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "26ccfc3c.7f7734",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "Pfeil unten",
        "group": "c296a358.3a5d9",
        "order": 11,
        "width": 2,
        "height": 2,
        "passthru": false,
        "label": "",
        "tooltip": "",
        "color": "",
        "bgcolor": "000000",
        "icon": "arrow_downward",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\": 0x400401004C4D}",
        "payloadType": "str",
        "topic": "",
        "x": 110,
        "y": 340,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "f9e5e55e.7bcea8",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "Select",
        "group": "c296a358.3a5d9",
        "order": 8,
        "width": 2,
        "height": 2,
        "passthru": false,
        "label": "",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "lens",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\": 0x400401002C2D}",
        "payloadType": "str",
        "topic": "",
        "x": 90,
        "y": 380,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "276541f1.71092e",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "Play",
        "group": "c296a358.3a5d9",
        "order": 16,
        "width": 2,
        "height": 1,
        "passthru": false,
        "label": "",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "play_circle_outline",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\": 0x400401007273}",
        "payloadType": "str",
        "topic": "",
        "x": 90,
        "y": 460,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "637bb77c.937d78",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "Pause",
        "group": "c296a358.3a5d9",
        "order": 17,
        "width": 2,
        "height": 1,
        "passthru": false,
        "label": "",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "pause_circle_outline",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\": 0x40040100F2F3}",
        "payloadType": "str",
        "topic": "",
        "x": 90,
        "y": 500,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "371d0ee6.d097e2",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "Stop",
        "group": "c296a358.3a5d9",
        "order": 18,
        "width": 2,
        "height": 1,
        "passthru": false,
        "label": "",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "stop",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\": 0x400401005253}",
        "payloadType": "str",
        "topic": "",
        "x": 90,
        "y": 540,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "777ffc46.bb5fc4",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "FastForward",
        "group": "c296a358.3a5d9",
        "order": 22,
        "width": 1,
        "height": 1,
        "passthru": false,
        "label": "",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "fast_forward",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\": 0x400401009293}",
        "payloadType": "str",
        "topic": "",
        "x": 210,
        "y": 580,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "9df23bbb.83e028",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "FastRewind",
        "group": "c296a358.3a5d9",
        "order": 21,
        "width": 1,
        "height": 1,
        "passthru": false,
        "label": "",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "fast_rewind",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\": 0x40040100D2D3}",
        "payloadType": "str",
        "topic": "",
        "x": 210,
        "y": 620,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "e0cad414.ae0238",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "Skip previous",
        "group": "c296a358.3a5d9",
        "order": 20,
        "width": 1,
        "height": 1,
        "passthru": false,
        "label": "",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "skip_previous",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\": 0x400401004A4B}",
        "payloadType": "str",
        "topic": "",
        "x": 220,
        "y": 700,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "18e246cc.9c4d39",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "Skip next",
        "group": "c296a358.3a5d9",
        "order": 23,
        "width": 1,
        "height": 1,
        "passthru": false,
        "label": "",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "skip_next",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\": 0x400401000E0F}",
        "payloadType": "str",
        "topic": "",
        "x": 200,
        "y": 660,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "f8972401.86fe68",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "Redo / Jump forward",
        "group": "c296a358.3a5d9",
        "order": 27,
        "width": 1,
        "height": 1,
        "passthru": false,
        "label": "",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "redo",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\": 0x400401008E8F}",
        "payloadType": "str",
        "topic": "",
        "x": 240,
        "y": 740,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "8db698db.f95d88",
        "type": "ui_button",
        "z": "3b9c6e64.3a6a02",
        "name": "Undo / Jump back",
        "group": "c296a358.3a5d9",
        "order": 26,
        "width": 1,
        "height": 1,
        "passthru": false,
        "label": "",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "undo",
        "payload": "{\"Protocol\":\"PANASONIC\",\"Bits\":48,\"Data\": 0x400401004E4F}",
        "payloadType": "str",
        "topic": "",
        "x": 230,
        "y": 780,
        "wires": [
            [
                "3923891d.98ce66"
            ]
        ]
    },
    {
        "id": "c296a358.3a5d9",
        "type": "ui_group",
        "z": "",
        "name": "AppleTV Fernbedienung",
        "tab": "3eb961f3.61695e",
        "order": 1,
        "disp": true,
        "width": 6,
        "collapse": false
    },
    {
        "id": "3eb961f3.61695e",
        "type": "ui_tab",
        "z": "",
        "name": "AppleTV",
        "icon": "apple",
        "order": 4,
        "disabled": false,
        "hidden": false
    }
]

Und jetzt noch Alexa Integration

Mit Alexa mache ich es mir jetzt einfach. Ich verwende den IOBroker Adapter Alexa2, der entsprechende Nodes in Node Red zur Verfügung stellt, mit denen ich auf Routinen zugreifen kann, die ich in der Alexa App angelegt habe. So habe ich mir Routinen für „Alexa, Fernseher Pause“ und „Alexa, Fernseher Wiedergabe“ angelegt. Auf diese kann ich in Node Red zugreifen und reagieren. Hierzu prüfe ich den Wert der Alexa Routine reagiere auf „true“, schreibe meine Payload, die ich an MQTT schicke und setzte den Wert der Alexa Routine nach einer Sekunde auf false zurück.

Wahrscheinlich etwas komplizierter als es sein müsste, aber es klappt.

Ziel erreicht

Nach einigem hin-und her hat es also schließlich geklappt und ich steuere mein AppleTV zumindest in den wesentlichsten Funktionen per Alexa. Über Kommentare zu einfacheren Wegen oder Anregungen würde ich mich freuen.

Viel Spaß damit!

Tasmota Steckdose über MQTT in Domoticz einbinden

Was soll erreicht werden

Im Beitrag https://daniel-spitzer.de/blog/2019/12/01/teckin-sp21-steckdose-mit-tasmota-flashen-und-alexa-konfigurieren/ habe ich beschrieben, wie ich Tasmota auf Teckin SP21 Steckdosen ohne zu löten geflashed habe. Jetzt sollen die Steckdosen per MQTT mit einem Domoticz Frontend sprechen. Außerdem möchte ich meine Steckdosen gerne über eine App steuern können.

MQTT Server auf Synology NAS installieren

Da ich eine zwar ältere aber wunderbar zuverlässige Synology NAS Diskstation DS213j nutze installiere ich den MQTT Server zunächst einfach dort. Das Vorgehen ist im Detail hier beschrieben https://gist.github.com/ajumalp/0ad2517d15c999cfc440cdf3d623fab8

Im Wesentlichen:

  1. Das Community Paket mosquitto auf der Synology installieren
  2. Per SSH auf der Synology einloggen und die mosquitto.conf anpassen (allow_anonymous false und password_file <PFAD ZUR PASSWORTDATEI>)
  3. mosquitto über Paketmanager starten

Um einen Blick auf den Datentransfer zu werfen nutze ich den MQTT Client MQTT Explorer von Thomas Nordquist http://mqtt-explorer.com/

Domosticz installieren

Zunächst habe ich Domosticz ebenfalls auf der Synology installiert wie hier beschrieben: https://www.domoticz.com/wiki/Synology . Allerdings schien mir das System etwas instabil und daher entscheide ich mich doch für einen Raspberry B, der hier noch rumliegt.

Für die Installation entscheide ich mich für den „easy way“ mittels curl -L https://install.domoticz.com | bash wie hier beschrieben https://www.domoticz.com/wiki/Raspberry_Pi

Tasmota Geräte einrichten

Jetzt müssen nur noch die mit Tasmota geflashten Steckdosen für MQTT aktiviert und für Domoticz eingerichtet werden.

In Tasmota unter Configuration / Configure other => MQTT enable anhaken. Dann unter Configuration / Configure MQTT den Hostnamen (bei mir die IP der Diskstation) und Port sowie User und Passwort, die in der mosquitto Passwortdatei eingetragen wurden angeben. Als Topic habe ich zunächst tasmota eingetragen gelassen.

Anschließend in Domoticz (bei mir im Browser unter der IP meines Raspberry PI mit dem bei der Installation angegebenen Port zu erreichen) eine Hardware konfigurieren wie hier https://github.com/arendst/Tasmota/wiki/Domoticz beschrieben (Hardware / Client Gateway with LAN interface und Hardware / Dummy (used for virtual switches) hinzufügen und konfigurieren. Virtual Sensor erzeugen und unter Setup / Devices die Idx der Steckdose herausfinden. Das erste Device bekommt die Idx 1 und dann wird hochgezählt.

Im Tab Switches von Domoticz stehen die Devices zur Verfügung. Devices, die als Favorit markiert sind (Stern), stehen im Dashboard zur Verfügung und können dort mit einem Klick auf das Symbolbild später geschaltet werden.

Zurück zum Tasmota Gerät. Dort die Configuration / Cofigure Domoticz aufrufen und die Idx im entsprechenden Feld angeben. Speichern und fertig. Jetzt sollte mit einem Klick auf das Bild im Dashboard von Domotoicz die Steckdose geschaltet werden können.

Aufruf per App

Schlussendlich sollen die Steckdosen noch per App geschaltet werden können. Hierzu installiere ich die Domoticz App, konfiguriere IP und Port. Fertig. Schon stehen die Favoriten aus Domoticz zum Schalten zur Verfügung.

Teckin SP21 Steckdose mit Tasmota flashen und Alexa konfigurieren

Ziel: Teckin SP21 Steckdose mit Tasmota flashen

Das Teckin Smart Plug SP21 soll mit Tasmota geflashed werden. Vorteil ist, dass das Teckin auf Basis der Firmware von Tuya funktioniert. Die Firmware von Tuya kann ohne Löten geflashed werden. Wie das geht ist ausführlich in der c’t unter https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html beschrieben.

Wer es schneller mag befolgt einfach die Anleitung auf der Github Seite des Projektes: https://github.com/ct-Open-Source/tuya-convert

Raspberry Pi mit WLAN Adapter TL-WN823N von TP-Link vorbereiten

Ich verwende einen Raspberry Pi mit WLAN Adapter. Hierzu habe ich den TL-WN823N von TP-Link verwendet, der allerdings vom Raspian nicht automatisch erkannt wurde. Damit er funktioniert habe ich das bei http://romcheckfail.com/tl-wn823n-raspberry-pi-3-wireless-fix/ beschriebene Script installiert.

Teckin SP21 flashen

Anschließend das Script aus dem Github Repository des VTRUST / c’t Projektes ins aktuelle Verzeichnis auf dem Raspberry klonen und das Vorbereitungsscript ausführen und den Anweisungen des Scriptes folgen.

# git clone https://github.com/ct-Open-Source/tuya-convert
# cd tuya-convert
# ./install_prereq.sh

Durch das Script wird ein WLAN Access Point mit dem Namen vtrust-flash geöffnet. Mit diesem verbindet man sich nun mit einem Smartphone.

Ist das geschehen startet man den eigentlichen Flash-Vorgang mittels ./start-flash.sh. Die Teckin SP21 muss dazu in eine Steckdose gesteckt werden. Die blinkende blaue LED zeigt an, dass die Dose im Konfigurationsmodus ist.

Tasmota konfigurieren

Während des Flash Vorganges kann Tasmota oder Espurna als Firmware ausgewählt werden. Ich habe mich für Tasmota entschieden. Nach dem Flashvorgang öffnet der ESP8266 des Teckin SP21 einen WLAN Accesspoint mit Namen „Tasmota-XXXX“. Mit diesem verbinden wir uns nun. Ich verwende das gleiche Smartphone, das ich schon für den VTRUST Accesspoint verwendet habe.

Auf der Startseite des Accesspoint kann nun der Zugang zum eigenen WLAN-Router konfiguriert werden. Die Teckin Steckdose wird so in das eigene Netz gebracht. Nachdem die Zugangsdaten gespeichert wurden taucht die Steckdose mit eigener IP-Adresse im Router auf. Mit einem iPhone und der App „Fing“ kann man ebenfalls schnell das Netz scannen und die IP Adresse herausfinden.

Mit der IP Adresse im eigenen WLAN verbinden wir uns nun und schließen die Konfiguration ab.

Hierzu wählt man im Bereich „Configure“ den Punkt „Configure Module“ und wählt BlitzWolf SHP (45), da Teckin SP21 noch nicht in der Liste auftaucht. Ab sofort läßt sich die Teckin Steckdose über das Webfrontend von Tasmota schalten.

Feinarbeit und Alexaintegration

Unter „Configure Other“ können wir das folgende Template eintragen{"NAME":"Teckin SP21","GPIO":[0,0,56,0,0,0,0,0,0,17,0,21,0],"FLAG":0,"BASE":45} das ich unter https://github.com/blakadder/templates/blob/master/_templates/teckin_SP21 gefunden habe.

Außerdem kann unter „Config Other“ auch gleich noch die Emulation für „Hue Bridge“ angehakt werden. Diese wird für die Integration in Alexa benötigt.

Ist das geschehen kann in der Alexa App nach neuen Phillips Geräten gesucht werden. Der Teckin Stecker taucht dann mit dem ebenfalls auf „Config Other“ eingestellten „Friendly Name“ als Lampe auf und kann dort geschaltet werden.

Alternativ zur HUE Emluation kann eine Belkon WeMo Emulation verwendet werden, die ich bisher jedoch noch nicht ausprobiert habe.

In der Alexa-App kann das Gerät wie üblich auch umbenannt werden, so dass man dort einen eigenen „Friendly Name“ konfigurieren kann.

Temperatursensor DHT11 am Raspberry Pi

Bestellung und Lieferung des Temperatursensors DHT11

Vor kurzem ist bei mir ein DHT11 Temperatursensor für 99 Cent aus China bei mir angekommen. Bestellt habe ich ihn bei Ebay. Wer ein paar Cent sparen möchte bestellt über ebay.com statt über ebay.de. Der Versand erfolgte bei mir Versandkostenfrei aus China und allzu lange hat die Lieferung nicht gedauert.

Doch jetzt soll der DHT11 auch  in Betrieb genommen werden.

Die obligatorische Google Suche

Die obligatorische Google Suche hat auf Adafruit eine eine prima Anleitung zur Einrichtung eines Temperatursensors zu Tage geführt, die mir als Grundlage für meine Experimente diente. Ganz ohne Hindernisse lief jedoch auch diesmal nicht alles ab … Aber daran bin ich ja mittlerweile gewöhnt.

https://github.com/adafruit/Adafruit_Python_DHT

Probleme und Lösungen

Temperatur und Luftfeuchtigkeit werden beim DHT11 nicht ausgelesen

Ein Fehler war, dass ich zunächst den DHT Treiber aus dem Paket https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code verwendet habe. In meiner Aufregung habe ich übersehen, dass der DHT Treiber hier deprecated ist. Wer lesen kann …. Der Temperatursensor hat zwar anfangs ein, zwei Mal ein Ergebnis geliefert, doch schließlich mehrten sich die Fehler, dass keine Temperatur ausgelesen wurde. Ich habe immer wieder Ausgaben wie diese erhalten:

pi@raspberrypi ~/Adafruit-Raspberry-Pi-Python-Code/Adafruit_DHT_Driver $ sudo ./Adafruit_DHT 11 4
Using pin #4
Data (39): 0x5c 0x0 0x32 0x0 0x44

Nur leider hat die Ausgabe auf der Konsole regelmäßig keine Temperatur und Luftfeuchtigkeit angezeigt. Offenbar bin ich aber nicht der Einzige, der dieses Problem hat oder hatte. Das gibt einem doch schon mal Hoffnung 😉

Nach einer kurzen Suche im Netz bin ich schließlich bei Chris Baume fündig geworden, mit dessen DHT11 Programm die Ausgabe von Temperatur und Luftfeuchtigkeit nun zuverlässig funktioniert.

Schließlich aber wollte ich doch auch die Daten in ein Google Spreadsheet hochladen und habe mir deshalb noch einmal die Adafruit Anleitung angeschaut. Hier ist mir dann mein Fehler aufgefallen. Nachdem ich das richtige Paket bei Adafruit geklont habe funktioniert auch hier das beigefügte fast direkt einwandfrei.

Punkt statt Komma in der Google Tabelle – das Problem mit dem Diagramm

Das Beispiel für das Google Spreadsheet von Adafruit schreibt als Temperaturwert z.B. „24.0“ in eine Tabelle. Soweit alles prima, solange nicht weiter tragisch, wenn man kein Diagramm ausgeben möchte. Denn hier gibt Google bei der Auswahl eines Liniendiagramms nur den Fehler „Das erforderliche Datenformat für „Liniendiagramm“ stimmt nicht mit den aktuellen Daten überein“ aus.

Klar, eine Zahl mit einem Punkt als Nachkommatrenner stimmt nicht mit dem Deutschen Zahlenformat überein. Auch hier eine Websuche zur Lösung bei Herr Thees geführt. Die Sprache der Tabelle muss in der Google Tabelle unter

Datei -> Tabelleneingenschaften -> Sprache

umgestellt werden. Ich habe hier „Vereinigte Staaten“ eingestellt und alles ist gut.

Also was hat zum Erfolg geführt?

Hier nochmal die Schritte, die bei mir zum erfolgreichen Auslesen des DHT11 mit dem Raspberry Pi geführt haben:

DHT11 mit einem 10K Ohm Wiederstand an den Raspberry Pi geknöpert. Ich verwende Pin 16 vom Pi, was GPIO4 entspricht. Außerdem noch mit GND und 3,3 V verbinden. Fertig. Der Raspberry ist dafür natürlich vom Strom entfernt.

DHT11 am Raspberry Pi_Steckplatine

Als nächstes das Adafruit DHT herunterladen, in das entsprechende Verzeichnis wechseln und das Installationsscript aufrufen (setzt installiertes Python und die notwendigen Python libraries voraus):

git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install

Im Ordner examples findet sich die Datei AdafruitDHT.py, mit der ein erster Test gemacht werden kann:

sudo ./AdafruitDHT.py 11 4

Die 11 steht dabei für den DHT11. Wer eine DHT22 verwendet muss hier eine 22 eingeben. Die 4 steht für den GPIO4. Das ganze führt zu folgender Ausgabe:

Temp=23.0*C  Humidity=46.0%

Prima, die Inbetriebnahme des DHT11 hat also funktioniert. Kuschelig warm. Ist halt Sommer 🙂

Als nächstes will ich die Daten noch in der Google Tabelle speichern. Also der OAuth2 Anleitung von hier gefolgt bis die notwendige JSON Datei auf meinem Rechner landete.

Die Datei habe ich mit Fugu (ich verwende einen Mac) auf den Raspberry in das Verzeichnis examples geschoben. Ach ja: ich verwende ein Mac-Book Air mit Intel Prozessor und Yosemite. Daher muss ich die Fugu unstable Version fugu-1.2.1pre1 verwenden. Aber fluppt prima.

Zwischendrin habe ich flott bei Google Docs eine neue Tabelle angelegt und ihr den Namen „DTH11 Temperatur und Luftfeuchtigkeit“ gegeben. Nicht vergessen, wie oben beschrieben die Google Tabelle auf Sprache „Vereinigte Staaten“ einzustellen.

In der JSON Datei findet sich ein Eintrag für „client_email“ etwa in der Form wie 12345678901-abcdefghijklmnop1234567890abcdefghijklmnop@developer.gserviceaccount.com

Für diese E-Mail muss die Google Tabelle zum lesen und schreiben freigegeben werden. Dazu in Google Spreadsheet auf „Freigeben“ klicken und diese E-Mail Adresse hineinkopieren.

Zuletzt muss noch die google_spreadsheet.py angepasst werden:

nano gogle_spreadsheet.py

Hier passe ich die folgenden Einträge an:

GDOCS_OAUTH_JSON       = 'DHT11Temprature-123456789012345.json' 

In der Zeile oben muss natürlich der Name der zuvor heruntergeladenen JSON Datei gegen euren Dateinamen ausgetauscht werden.

GDOCS_SPREADSHEET_NAME = 'DTH11 Temperatur und Luftfeuchtigkeit'

Und hier muss natürlich der Name eurer Google Tabelle eingetragen werden.

DHT_PIN = 4

Und hier schließlich der GPIO4. DHT_PIN ist etwas verwirrend wie ich finde. Tatsächlich muss hier der GPIO angegeben werden.  In meinem Beispiel von oben also 4.

Und los geht das Vergnügen:

sudo ./google_spreadsheet.py