Tuya-Gerä­te: MQTT lokal - ohne Cloud

Tuya ist den Smart-Home-Betrei­bern seit lan­gem ein Begriff. Die chi­ne­si­sche Fir­ma stellt smar­te Gerä­te wie Lam­pen, Sen­so­ren, Schal­ter und Steck­do­sen her. Die Steue­rung erfolgt nor­ma­ler­wei­se über die Tuya-Cloud.

4fach-Steck­do­se von essentials

Zudem bie­tet Tuya ande­ren Fir­men an, die Gerä­te unter ihrem eige­nen Mar­ken­na­men zu ver­kau­fen und ihren Kun­den eine eige­ne, gebran­de­te Ver­si­on der Cloud-Funk­tio­nen anzu­bie­ten. So fin­det man Tuya-Gerä­te unter vie­len Namen, unter ande­ren auch als „essen­ti­als Smart Home Solu­ti­ons”.

Was die Tuya-Gerä­te inter­es­sant macht, ist ihre leich­te Umrüst­bar­keit auf ande­re Firm­ware. Damit befreit man sich vom Zwang, die chi­ne­si­sche Cloud-Lösung benut­zen zu müs­sen, die nach vie­le Berich­ten mit­un­ter lang­sam und unzu­ver­läs­sig ist. Unter ande­rem bei Tas­mo­ta, einer der alter­na­ti­ven Firm­ware-Lösun­gen, wer­den die ver­schie­de­nen Mög­lich­kei­ten beschrieben.

Tuya-Local

Es geht aber noch ein­fa­cher. Wer sich die Umrüs­tung nicht zutraut oder sich ein­fach die Mühe erspa­ren will, kann auch mit der Ori­gi­nal-Firm­ware ohne Umwe­ge über die Cloud arbei­ten. Grund­la­ge dafür ist die Soft­ware TuyA­PI, die den Zugriff auf die Tuya-Gerä­te für ver­schie­de­ne Sys­te­me bereitstellt.

Die Kom­mu­ni­ka­ti­on erfolgt dabei direkt vom loka­len Sys­tem über WLAN zum Tuya-Gerät; die Tuya-Cloud ist dann nicht mehr beteiligt.

Ein­zi­ge Hür­de ist die Beschaf­fung der nöti­gen Gerä­te-IDs und -Keys. Die TuyA­PI-Sei­te beschreibt den Vor­gang zwar aus­führ­lich, aber ich fas­se das unten noch­mal mit Abbil­dun­gen in Deutsch zusammen.

Wo Inte­grie­ren?

Die TuyA­PI kann in ver­schie­de­ne Soft­ware-Sys­te­me inte­griert wer­den. Ich habe mir das für die Kom­man­do­zei­le (tuyAPI/cli), homeas­si­stant (local tuya), Node-Red (node-red-con­trib-tuya-smart) und MQTT (tuya-mqtt) ange­se­hen und getes­tet. Alle Lösun­gen funk­tio­nier­ten (nach etwas Ein­ar­bei­tung) ohne Pro­ble­me. Wei­te­re Lösun­gen gibt es u.a. auch für Open­HAB und FHEM.

Für jedes Gerät kann aber immer nur eine Lösung aktiv sein, weil tuyA­PI stän­dig Ver­bin­dung zum Gerä­te-Inter­face hält. Akti­viert man eine zwei­te Instanz, bekommt die­se kei­ne Ver­bin­dung. Will man also die Tuya-Lösung par­al­lel etwa in homeas­si­stant und Node-Red nut­zen, bleibt eigent­lich nur die MQTT-Vari­an­te als uni­ver­sel­le Basis-Lösung übrig. In homeas­si­stant, Node-Red und ande­re über­ge­ord­ne­te Steu­er­sys­te­me wer­den die Gerä­te dann über die jewei­li­ge MQTT-Inte­gra­ti­on eingebunden.

IDs und Keys besorgen

IDs und Keys wer­den für den Auf­bau der Kom­mu­ni­ka­ti­on zu den Tuya-Gerä­ten benö­tigt. Die ID ist eine ein­deu­ti­ge Adres­se im Tuya-Netz, wäh­rend der Key zur Authen­ti­sie­rung nötig ist. Bei­des bekommt man über die Tuya-Ent­wick­lungs­um­ge­bung. Und das läuft so:

  1. Gerä­te über die Tuya-Smart-App regis­trie­ren:
    - App auf eurem Smart­pho­ne instal­lie­ren
    - Kon­to erstel­len und akti­vie­ren
    - Gerä­te­re­gis­trie­rung nach Anwei­sung
    Die Tuya-App funk­tio­niert auch für alle ande­ren Tuya-basier­ten Marken.
  2. Auf der Tuya-Ent­wick­lungs­platt­form iot​.tuya​.com regis­trie­ren und anmelden
  3. Ein neu­es Cloud Pro­jekt anle­gen und öffnen
  4. Unter dem Pro­jekt­na­men ste­hen Access ID und Access Secret - für spä­te­ren Gebrauch kopieren
  5. Unter Link Devices den Tab Link Devices by App Account wäh­len und nach den Anwei­sun­gen die Tuya-Smart-App verlinken
  6. Auf dem Tab Device List erschei­nen dann die Gerä­te aus der App - die ID unter dem Device Name für jedes Gerät notieren

Unse­re notier­te Lis­te ent­hält jetzt die Access ID, das Access Secret und für jedes Gerät eine Device ID. Damit kön­nen wir uns spä­ter die Local IDs erzeu­gen lassen.

Soft­ware installieren

Die Soft­ware kann auf einem belie­bi­gen Linux Ser­ver instal­liert wer­den - bei mir läuft sie auf dem glei­chen Raspber­ry, auf dem sich auch MQTT befindet.

Die Soft­ware selbst holt ihr aus ihrem git-Repo­si­to­ry und instal­liert sie in /opt:

cd /opt
sudo git clone https://github.com/TheAgentK/tuya-mqtt
cd tuya-mqtt
sudo npm install
cd ..
sudo chown -R pi:pi tuya-mqtt

Kopiert die Kon­fi­gu­ra­ti­ons­da­tei und tragt die Zugangs­da­ten für euren MQTT-Ser­ver ein:

cp config.json.sample config.json
vi config.json

Der Inhalt sieht dann in etwa so aus:

{
     "host": "localhost",
     "port": 1883,
     "topic": "tuya/",
     "mqtt_user": "user",
     "mqtt_pass": "secret"
}

Zuletzt muss noch die Gerä­te­kon­fi­gu­ra­ti­on ange­legt wer­den. Dafür ist der Out­put von tuya-cli nötig, den ihr ein­fach in devices.conf umlei­ten könnt - sie­he nächs­ter Abschnitt. 

Local IDs erzeugen

Für die Berech­nung der Local IDs wird das Kom­man­do­zei­len­pro­gramm tuya-cli benutzt, das schon mit tuya-mqtt instal­liert wurde:

$ tuya-cli wizard > devices.conf
 ? The API key from tuya.com: owieuqfgcbe78etrcbeoqwe
 ? The API secret from tuya.com: hfiwe8764ucrbewuiortqcb
 ? Provide a 'virtual ID' of a device currently registered in the app: 1234567890abcdefghijkl
$ 

In der devices.conf fin­det ihr dann folgendes:

[
   {
     name: 'device1',
     id: '1234567890abcdefghijkl',
     key: 'f48af11f51cf2813'
   }
]

Der Name kann belie­big ange­passt wer­den; er bil­det spä­ter einen Teil der MQTT-Topics.

Ers­ter Start

Der ers­te Start kann, um die Funk­ti­on zu prü­fen, auf der Kom­man­do­zei­le mit Debug-Aus­ga­ben erfolgen:

DEBUG=tuya-mqtt:* node tuya-mqtt.js

Die Aus­ga­be soll­te etwa so aussehen:

tuya-mqtt:info Connection established to MQTT server +0ms
   tuya-mqtt:tuyapi Search for device id 1234567890abcdefghijkl +0ms
   tuya-mqtt:tuyapi Found device id 1234567890abcdefghijkl +1s
   tuya-mqtt:tuyapi Received JSON data from device 1234567890abcdefghijkl -> {"1":false,"2":false,"3":false,"4":false,"5":false,"6":0,"7":0,"8":0,"9":0,"10":0} +57ms
   tuya-mqtt:tuyapi Connected to device device1 (1234567890abcdefghijkl, abcdefghi123456) +957ms
   tuya-mqtt:tuyapi Received JSON data from device 1234567890abcdefghijkl -> {"1":false,"2":false,"3":false,"4":false,"5":false,"6":0,"7":0,"8":0,"9":0,"10":0} +32ms
   tuya-mqtt:state MQTT DPS JSON: tuya/mp1/dps/state ->  {"1":false,"2":false,"3":false,"4":false,"5":false,"6":0,"7":0,"8":0,"9":0,"10":0} +0ms
   tuya-mqtt:state MQTT DPS1: tuya/mp1/dps/1/state ->  false +1ms
   tuya-mqtt:state MQTT DPS2: tuya/mp1/dps/2/state ->  false +1ms
   tuya-mqtt:state MQTT DPS3: tuya/mp1/dps/3/state ->  false +1ms
   tuya-mqtt:state MQTT DPS4: tuya/mp1/dps/4/state ->  false +1ms
   tuya-mqtt:state MQTT DPS5: tuya/mp1/dps/5/state ->  false +1ms
   tuya-mqtt:state MQTT DPS6: tuya/mp1/dps/6/state ->  0 +0ms
   tuya-mqtt:state MQTT DPS7: tuya/mp1/dps/7/state ->  0 +1ms
   tuya-mqtt:state MQTT DPS8: tuya/mp1/dps/8/state ->  0 +1ms
   tuya-mqtt:state MQTT DPS9: tuya/mp1/dps/9/state ->  0 +1ms
   tuya-mqtt:state MQTT DPS10: tuya/mp1/dps/10/state ->  0 +0ms

Die Soft­ware mel­det sich am MQTT-Ser­ver an, ver­bin­det sich dann mit jedem Device in devices.conf und lis­tet schließ­lich die ver­füg­ba­ren Topics auf.

Tes­tet die Funk­ti­on, indem ihr von einem MQTT-Cli­ent (auf Linux z.B. MQTT­fx oder MQTT-Explo­rer) Messages an Topics des neu­en Geräts schickt und prüft die Reaktion.

Am Ende stoppt ihr tuya-mqtt mit Ctrl-C.

Ser­vice einrichten

Ist alles erfolg­reich gelau­fen, wird tuya-mqtt noch als Ser­vice instal­liert, damit er bei jedem Sys­tem­start mit­ge­star­tet wird.

Erzeugt dafür die Datei /etc/systemd/system/tuya-mqtt.service
mit fol­gen­dem Inhalt:

[Unit]
Description=tuya-mqtt
[Service]
ExecStart=/opt/tuya-mqtt/tuya-mqtt.js
Restart=always
User=pi
Group=pi
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/opt/tuya-mqtt
[Install]
WantedBy=multi-user.target

Star­tet den Ser­vice mit

sudo service tuya-mqtt start

und prüft mit

sudo service tuya-mqtt status

ob der Zustand des Ser­vice nor­mal ist. Das soll­te etwa so aussehen:

$ sudo service tuya-mqtt status
 ● tuya-mqtt.service - tuya-mqtt
    Loaded: loaded (/etc/systemd/system/tuya-mqtt.service; disabled; vendor preset: enabled)
    Active: active (running) since Mon 2021-01-18 19:23:01 CET; 1s ago
  Main PID: 22318 (node)
     Tasks: 7 (limit: 3859)
    CGroup: /system.slice/tuya-mqtt.service
            └─22318 node /opt/tuya-mqtt/tuya-mqtt.js
 Jan 18 19:23:01 node systemd[1]: Started tuya-mqtt.
$

Schließ­lich akti­viert ihr den Ser­vice mit

sudo systemctl enable tuya-mqtt

Falls neue Gerä­te auf­ge­nom­men wer­den sol­len, fügt ihr sie eurem Tuya-Cloud-Pro­jekt hin­zu und ermit­telt die Local ID mit tuya-cli. Die Aus­ga­be hängt ihr an devices.conf an und star­tet tuya-mqtt neu. Danach soll­ten sie in MQTT ver­füg­bar sein.

Fazit

Den Umweg über die chi­ne­si­sche Cloud sind wir mit die­ser Metho­de los. Aller­dings bleibt die Firm­ware der Gerä­te wei­ter­hin ein poten­ti­el­les Ein­falls­tor in unser LAN. Sie mel­det jede Sta­tus­än­de­rung wei­ter an die Cloud und kann unbe­kann­te Funk­tio­nen besit­zen oder durch ein Firm­ware-Update bekommen.

Wenn man sich ganz von der frem­den Cloud lösen will, kann man Ver­bin­dun­gen und DNS-Abfra­gen mit einer Fire­wall wie pi-hole blo­ckie­ren oder eben doch die gründ­li­che Lösung des Flas­hens mit einer alter­na­ti­ven Firm­ware wählen.

Veröffentlicht am
Kategorisiert in SmartHome

12 Kommentare

  1. Hal­lo,
    dei­ne Beschrei­bung ist sehr gut, aller­dings fehlt etwas, zumin­dest nach dem Stand den ich her­aus­ge­fun­den habe. Um das device zu bekom­men muss man noch eine APP in der Tuya-Cloud kon­fi­gu­rie­ren bei der dann AUTHORIZATION akti­viert wer­den muss. Sonst geht der Auf­ruf um den eige­nen Key zu gene­rie­ren nicht. Wei­ter­hin kann man zwar den Sta­tus der Dosen sehen, aller­dings wird kein Schalt­vor­gang aus­ge­löst wenn man den Sta­tus aus einem Cli­ent her­aus ver­än­dert. Gibt es hier eine Lösung, falls bei dir das glei­che Pro­blem auf­ge­tre­ten ist.

    Vie­len Dank und Gruß
    Hol­ger Fiedler

  2. Hal­lo dan­ke erst­mal für den Bei­trag der hilft wirk­lich schon sehr wei­ter um Tuya Gerä­te per mqtt anzu­bin­den. ich habe aktu­ell aber ein Pro­blem und weiß nicht wie ich wei­ter kom­me, weil ich nicht weiß, was ich anstel­le von pi:pi ein­set­zen muss.
    An die­ser Stelle.:
    sudo chown -R pi:pi tuya-mqtt

    Kopiert die Kon­fi­gu­ra­ti­ons­da­tei und tragt die Zugangs­da­ten für euren MQTT-Ser­ver ein:

    cp config.json.sample config.json
    vi config.json

    1. Hal­lo Janßen,
      pi:pi ist der Nut­zer und die Grup­pe, unter dem der tuya-mqtt Ser­vice lau­fen soll. Das muss mit der Ein­tra­gung in dei­nem Ser­vice-File über­ein­stim­men (tuya-mqtt.service: User=pi Group=pi). Wel­cher Nut­zer das sein soll, hängt von dei­ner Sys­tem­kon­fi­gu­ra­ti­on ab. Beim Raspber­ry OS ist das übli­cher­wei­se der Nut­zer pi.
      Gruß
      Jörg

  3. Dan­ke für die Ant­wort habe es nun ans lau­fen bekommen.
    Nur weiß ich nicht wie das Topic heißt mit wel­chem ich aus Open­hab die Wer­te abfra­gen kann. habe schon alles aus pro­biert. bekom­me die chan­nels nicht zum laufen .

  4. Die topics hei­ßen bei mir für den Sta­tus tuya/mp1/dps/1/state und für die Kom­man­dos tuya/mp1/dps/1/command,wobei die Kanä­le (die Zahl zwi­schen dps und sta­te) von 1 bis 5 hochzählen.

    Am bes­ten Du ver­bin­dest dich mal mit z.B. dem MQTT-Explo­rer mit dei­nem Bro­ker und schaust, wel­che Nach­rich­ten beim Schal­ten der Steck­do­sen einlaufen.

  5. Hal­lo zusammen,
    ich habe lei­der auch ein Pro­blem. Zwar kann ich schein­bar per ´sudo ser­vice tuya-mqtt start´ den ser­vice star­ten, jedoch gibt ´ sudo ser­vice tuya-mqtt sta­tus´ fol­gen­des zurück:
    ● tuya-mqtt.service - tuya-mqtt
    Loa­ded: loa­ded (/etc/systemd/system/tuya-mqtt.service; enab­led; ven­dor pre­set: enabled)
    Acti­ve: fai­led (Result: exit-code) sin­ce Sat 2021-09-04 08:26:52 BST; 21s ago
    Pro­cess: 1580 ExecStart=/opt/tuya-mqtt/tuya-mqtt.js (code=exited, status=203/EXEC)
    Main PID: 1580 (code=exited, status=203/EXEC)
    Der Ser­vice star­tet also nicht, es erfolgt kei­ne Kom­mu­ni­ka­ti­on mit MQTT.
    Star­te ich ´DEBUG=tuya-mqtt:* node tuya-mqtt.js´ aus dem Ver­zeich­nis /op­t/­tu­ya-mqt­t/ so bekom­me ich fol­gen­de Ausgabe:
    tuya-mqtt:info Con­nec­tion estab­lis­hed to MQTT ser­ver +0ms
    tuya-mqtt:tuyapi Search for device id bf8a39f7310df6122cmthq +0ms
    tuya-mqtt:tuyapi Found device id bf8a39f7310df6122cmthq +1s
    tuya-mqtt:tuyapi Recei­ved JSON data from device bf8a39f7310df6122cmthq -> {„1”:true,„2”:„colour”,„3”:25,„4”:255,„5”:„00141c00c4ff19”,„101”:true} +146ms
    tuya-mqtt:tuyapi Con­nec­ted to device LED Smar­t­RGB (bf8a39f7310df6122cmthq, 3227646d21b6ba08) +972ms
    tuya-mqtt:tuyapi Recei­ved JSON data from device bf8a39f7310df6122cmthq -> {„1”:true,„2”:„colour”,„3”:25,„4”:255,„5”:„00141c00c4ff19”,„101”:true} +52ms

    Hier scheint also alles zu laufen.

    Mei­ne Fra­ge: Was muss ich tun damit die Ser­vices kor­rekt starten?

    1. Ist natür­lich aus der Fer­ne schwie­rig zu beur­tei­len, aber ich wür­de mal prü­fen, ob der User, unter dem der Ser­vice lau­fen soll, die nöti­gen Rech­te hat. Mög­li­cher­wei­se fin­dest Du auch im sys­log noch Hinweise.

    2. Hat­te das sel­be Pro­blem. Ich muss­te in mei­nem EXEC und PATH etwas anpas­sen. Anbei mei­ne Con­fig, Ach­tung ich füh­re es aktu­ell noch als ROOT aus.

      [Unit]
      Description=tuya-mqtt
      [Ser­vice]
      ExecStart=node /opt/tuya-mqtt/tuya-mqtt.js
      Restart=always
      User=root
      Group=root
      Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
      Environment=NODE_ENV=production
      WorkingDirectory=/opt/tuya-mqtt
      [Install]
      WantedBy=multi-user.target

  6. genau an die­ser Stel­le geht es bei mir auch nicht wei­ter - ich star­te tuya-cli … und bekom­me kei­ne Rück­mel­dung … d.h. ich muss den Pro­zess abbre­chen … und bekom­me kei­ne Ein­trä­ge in die devices.conf

  7. Hey, das war echt die Lösung mei­nes Pro­blems. Nur habe ich nun ein beson­de­res Problem:
    Ich kann nun den Switch ein­schal­ten über OH(klappt)
    Kli­cke ich nun auf aus, kommt kein Com­mand im MQTT an (klappt nicht)
    Schal­te ich wie­der ein, kommt der Com­mand im MQTT an (com­mand set:true) (klappt)
    Schal­te ich es wie­der aus, klappt es auch wie­der. (Com­mand set:false)

    Hier ein­mal mein Log.
    tuya-mqtt:command Recei­ved MQTT mes­sa­ge -> {„topic”:„tuya/kühlschrank_patrick/dps/1/command”,„message”:„true”} +13s
    tuya-mqtt:command Recei­ved com­mand for DPS1: true +13s
    tuya-mqtt:tuyapi Set device 04200098b4e62d1075c0 -> {„dps”:„1”,„set”:true} +13s
    tuya-mqtt:tuyapi Recei­ved JSON data from device 04200098b4e62d1075c0 -> {„1”:true} +53ms
    tuya-mqtt:state MQTT DPS JSON: tuya/kühlschrank_patrick/dps/state -> {„1”:true} +13s
    tuya-mqtt:state MQTT DPS1: tuya/kühlschrank_patrick/dps/1/state -> true +0ms

    tuya-mqtt:command Recei­ved MQTT mes­sa­ge -> {„topic”:„tuya/kühlschrank_patrick/dps/1/command”,„message”:„true”} +22s
    tuya-mqtt:command Recei­ved com­mand for DPS1: true +22s
    tuya-mqtt:tuyapi Set device 04200098b4e62d1075c0 -> {„dps”:„1”,„set”:true} +22s
    tuya-mqtt:tuyapi Recei­ved JSON data from device 04200098b4e62d1075c0 -> {„1”:true} +29ms
    tuya-mqtt:state MQTT DPS JSON: tuya/kühlschrank_patrick/dps/state -> {„1”:true} +22s
    tuya-mqtt:state MQTT DPS1: tuya/kühlschrank_patrick/dps/1/state -> true +0ms

    tuya-mqtt:command Recei­ved MQTT mes­sa­ge -> {„topic”:„tuya/kühlschrank_patrick/dps/1/command”,„message”:„false”} +9s
    tuya-mqtt:command Recei­ved com­mand for DPS1: fal­se +9s
    tuya-mqtt:tuyapi Set device 04200098b4e62d1075c0 -> {„dps”:„1”,„set”:false} +9s
    tuya-mqtt:tuyapi Recei­ved JSON data from device 04200098b4e62d1075c0 -> {„1”:false} +108ms
    tuya-mqtt:state MQTT DPS JSON: tuya/kühlschrank_patrick/dps/state -> {„1”:false} +9s
    tuya-mqtt:state MQTT DPS1: tuya/kühlschrank_patrick/dps/1/state -> fal­se +0ms

    Was kann das Pro­blem sein, ich steh grad wie ein Ochs vorm Berg.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

4 × drei =