Unterstützung von Geräten mit der Smartlife/Tuya-App

Hier ist die Dokumentation, um die Informationen zur Verwendung von Tuya zu erhalten.

  1. Erstellen Sie ein Konto auf http://iot.tuya.com

  2. Erstellen Sie ein Cloud-Projekt im Abschnitt « Cloud » → « Entwicklung » → « Cloud-Projekt erstellen »

  3. Wählen Sie einen Projektnamen und füllen Sie die verschiedenen Felder aus:

    • Projektname: Der Name Ihres Projekts (z. B.: Gladys)
    • Branche: Smart Home;
    • Entwicklungsmethode: Smart Home;
    • Rechenzentrum: Zentrales Europa-Rechenzentrum (auch wenn Sie in Westeuropa leben, ist das besser, andernfalls wählen Sie das Rechenzentrum in Ihrer Nähe).
      Klicken Sie auf « Erstellen ».
  4. Autorisieren Sie die folgenden API-Dienste:
    (Sie sind normalerweise standardmäßig ausgewählt)

  5. Kopieren Sie die Informationen von « Access Key » und « Secret Key » in Gladys

  6. Gehen Sie zum Tab Geräte und dann zu Tuya App-Konto verknüpfen und klicken Sie auf die Schaltfläche App-Konto hinzufügen rechts.

  7. Scannen Sie den QR-Code mit Ihrer Smart Life-App, indem Sie zu Profil gehen und dann zum Scanner oben rechts.

  8. Wählen Sie Automatische Verknüpfung und dann Lesen, Schreiben und Verwalten und bestätigen Sie mit OK.

  9. Kopieren Sie die Information « App-Konto UID » in Gladys.

  10. Speichern Sie die Konfiguration in Gladys, gehen Sie zum Tab « Tuya-Erkennung » und TADAM… Ihre Geräte sind erschienen

@pierre-gilles: Und hier ist das Ergebnis in Gladys:

Danke für die Änderungen, es ist viel klarer! Hast du das Docker-Image aktualisiert? :slight_smile:

Falls ja, teile ich es mit der Community!

Ich habe gerade das Docker-Image aktualisiert :slight_smile:

Danke @Lokkye :folded_hands:

Ich kommuniziere heute zum Thema und füge es dem Newsletter hinzu, der am Wochenende rausgeht!

Hallo,

Vielen Dank für die Entwicklung dieser Funktion. Ich erwarte einen Smart-Stecker mit Verbrauchsdatenauslesung (Ein/Aus, Stromstärke, Spannung, verbrauchte Energie…) bis nächste Woche.

Dann kann ich testen :slight_smile:

Hallo,

Ich habe gerade meinen Stecker (Modell PE-01E) erhalten.

Ich habe das Tutorial zur Erstellung des Entwicklerkontos gut verfolgt; alles ist klar. Ein Hinweis, « Smart Home Scene Linkage » ist veraltet (ist aber immer noch vorhanden, denke ich, mit der neuen API « Smart Home Basic Service »).

Nachdem alle Elemente in Gladys im Konfigurationsbereich ausgefüllt sind, hätte ich eine Meldung begrüßt, die bestätigt, dass alle angegebenen Elemente die grüne Verbindung ermöglichen, wenn es funktioniert, und rot im gegenteiligen Fall (ich habe das Gefühl, dass man die Info beim Scannen findet?). Es ist ein Detail, wenn man bedenkt, wie viel Zeit man auf diesem Bildschirm verbringen wird, aber es wäre ein echtes Plus, um jeden Zweifel an einer falschen Konfiguration auszuräumen.

Dann gehe ich zum Abschnitt « Tuya Discovery »; eine Animation zeigt mir an, dass ein Scan läuft. Leider wird kein Gerät gefunden (obwohl es in der Tuya-App vorhanden ist); liegt das daran, dass es noch nicht unterstützt wird oder gibt es eine Verzögerung zwischen der Erstellung und dem Auftauchen in der Tuya-Cloud?

Nochmals vielen Dank für die laufende Entwicklung :slight_smile:

Bearbeitung: Mein Stecker wird in der Tuya-Cloud angezeigt

@PhilippeMA: Danke, dass du es schon getestet hast :slight_smile:
Könntest du mir deine Konfiguration in Gladys zeigen?
Könntest du mir die Gladys-Logs schicken, wenn du auf die Schaltfläche zum Scannen der Geräte klickst?

Hallo @Lokkye,

Hier sind die Logs:

2023-06-26T12:25:35+0200 <error> tuya.discoverDevices.js:38 (TuyaHandler.discoverDevices) Unable to load Tuya devices Error: getaddrinfo EAI_AGAIN openapi-weaz.tuyaeu.com
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26) {
  errno: -3001,
  code: 'EAI_AGAIN',
  syscall: 'getaddrinfo',
  hostname: 'openapi-weaz.tuyaeu.com',
  config: {
    url: 'https://openapi-weaz.tuyaeu.com/v1.0/token?grant_type=1',
    method: 'get',
    headers: {
      Accept: 'application/json, text/plain, */*',
      t: '1687775130691',
      sign: 'MONSIGN',
      client_id: 'MONCLIENTID',
      sign_method: 'HMAC-SHA256',
      access_token: '',
      Dev_lang: 'Nodejs',
      Dev_channel: 'SaaSFramework',
      'Signature-Headers': '',
      'User-Agent': 'axios/0.21.4'
    },
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 0,
    adapter: [Function: httpAdapter],
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    validateStatus: [Function: validateStatus],
    transitional: {
      silentJSONParsing: true,
      forcedJSONParsing: true,
      clarifyTimeoutError: false
    },
    data: undefined
  },
  request: <ref *1> Writable {
    _writableState: WritableState {
      objectMode: false,
      highWaterMark: 16384,
      finalCalled: false,
      needDrain: false,
      ending: false,
      ended: false,
      finished: false,
      destroyed: false,
      decodeStrings: true,
      defaultEncoding: 'utf8',
      length: 0,
      writing: false,
      corked: 0,
      sync: true,
      bufferProcessing: false,
      onwrite: [Function: bound onwrite],
      writecb: null,
      writelen: 0,
      afterWriteTickInfo: null,
      buffered: [],
      bufferedIndex: 0,
      allBuffers: true,
      allNoop: true,
      pendingcb: 0,
      constructed: true,
      prefinished: false,
      errorEmitted: false,
      emitClose: true,
      autoDestroy: true,
      errored: null,
      closed: false,
      closeEmitted: false,
      [Symbol(kOnFinished)]: []
    },
    _events: [Object: null prototype] {
      response: [Function: handleResponse],
      error: [Function: handleRequestError]
    },
    _eventsCount: 2,
    _maxListeners: undefined,
    _options: {
      maxRedirects: 21,
      maxBodyLength: 10485760,
      protocol: 'https:',
      path: '/v1.0/token?grant_type=1',
      method: 'GET',
      headers: [Object],
      agent: undefined,
      agents: [Object],
      auth: undefined,
      hostname: 'openapi-weaz.tuyaeu.com',
      port: null,
      nativeProtocols: [Object],
      pathname: '/v1.0/token',
      search: '?grant_type=1'
    },
    _ended: true,
    _ending: true,
    _redirectCount: 0,
    _redirects: [],
    _requestBodyLength: 0,
    _requestBodyBuffers: [],
    _onNativeResponse: [Function (anonymous)],
    _currentRequest: ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 7,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      destroyed: false,
      _last: true,
      chunkedEncoding: false,
      shouldKeepAlive: false,
      maxRequestsOnConnectionReached: false,
      _defaultKeepAlive: true,
      useChunkedEncodingByDefault: false,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      strictContentLength: false,
      _contentLength: 0,
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      _closed: false,
      socket: [TLSSocket],
      _header: 'GET /v1.0/token?grant_type=1 HTTP/1.1\r\n' +
        'Accept: application/json, text/plain, */*\r\n' +
        't: 1687775130691\r\n' +
        'sign: MONSIGN\r\n' +
        'client_id: MONCLIENTID\r\n' +
        'sign_method: HMAC-SHA256\r\n' +
        'access_token: \r\n' +
        'Dev_lang: Nodejs\r\n' +
        'Dev_channel: SaaSFramework\r\n' +
        'Signature-Headers: \r\n' +
        'User-Agent: axios/0.21.4\r\n' +
        'Host: openapi-weaz.tuyaeu.com\r\n' +
        'Connection: close\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: nop],
      agent: [Agent],
      socketPath: undefined,
      method: 'GET',
      maxHeaderSize: undefined,
      insecureHTTPParser: undefined,
      joinDuplicateHeaders: undefined,
      path: '/v1.0/token?grant_type=1',
      _ended: false,
      res: null,
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'openapi-weaz.tuyaeu.com',
      protocol: 'https:',
      _redirectable: [Circular *1],
      [Symbol(kCapture)]: false,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(kNeedDrain)]: false,
      [Symbol(corked)]: 0,
      [Symbol(kOutHeaders)]: [Object: null prototype],
      [Symbol(errored)]: null,
      [Symbol(kUniqueHeaders)]: null
    },
    _currentUrl: 'https://openapi-weaz.tuyaeu.com/v1.0/token?grant_type=1',
    [Symbol(kCapture)]: false
  },
  response: undefined,
  isAxiosError: true,
  toJSON: [Function: toJSON]
}

Die Konfiguration in Glayds:

@PhilippeMA: Das Tuya-Konto ist auf Mitteleuropa eingestellt (was sehr gut ist), aber bei Gladys ist es auf Westeuropa eingestellt. Könntest du es auf Mitteleuropa ändern und mir sagen, ob das das Problem gelöst hat?

Die Fehlermeldung ist dieselbe.

Ich habe diese Meldung sowohl auf dem Konfigurationsbildschirm als auch auf dem Scan-Bildschirm erhalten.

Was kann ich tun, um dir zu helfen?

Zur Info, dieser Fehler ist ein Timeout bei der DNS-Auflösung.

Der Domainname ist jedoch gültig:

@PhilippeMA hast du eine Netzwerkkonfiguration/einen DNS-Blocker auf deinem Gerät/deinem Netzwerk (z. B. PiHole) konfiguriert?

Nein, mir ist kein Blockierer bekannt. Gibt es eine Möglichkeit, dies mit einer App oder einem Befehl zu überprüfen?

Du kannst einen einfachen curl ausführen:

curl -I https://openapi-weaz.tuyaeu.com/

Du solltest sehen:

HTTP/2 200 
content-type: application/json;charset=UTF-8
date: Tue, 27 Jun 2023 15:43:03 GMT

Der Befehl gibt mir zurück:

HTTP/2 200 
content-type: application/json;charset=UTF-8
date: Thu, 29 Jun 2023 07:26:31 GMT
access-control-allow-credentials: true
access-control-allow-headers: 
access-control-allow-headers: access_token,Content-Type
access-control-allow-methods: POST
access-control-allow-methods: OPTIONS
access-control-allow-methods: GET
access-control-allow-methods: DELETE
access-control-allow-methods: PUT
access-control-allow-origin: https://iot.tuya.com
gateway-info: highway
strict-transport-security: max-age=31536000;includeSubDomains;preload 

Okay, alles scheint gut zu sein also… Wir sind uns einig, dass du auf demselben Rechner getestet hast, auf dem Gladys läuft?

Hast du immer noch denselben Fehler in den Logs?

Nein, auf meinem Laptop.

Vielleicht liegt es an der Installation?

Hier ist, was ich gemacht habe (aus der Dokumentation übernommen):

docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--cgroupns=host \
--restart=always \
--privileged \
--network=host \
--name gladys \
-e NODE_ENV=production \
-e SERVER_PORT=80 \
-e TZ=Europe/Paris \
-e SQLITE_FILE_PATH=/var/lib/gladysassistant/gladys-production.db \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/lib/gladysassistant:/var/lib/gladysassistant \
-v /dev:/dev \
-v /run/udev:/run/udev:ro \
delogzway/gladys:tuya

Kannst du es auf dem Gerät testen, auf dem Gladys läuft?

Ich glaube nicht, dass das etwas damit zu tun hat, das sieht für mich sehr gut aus :slight_smile:

@Lokkye Bestätigst du, dass du bei dir jeden Server getestet hast und es funktioniert hat?

Ja, es funktioniert alles, außer für China, das nur mit chinesischen IP-Adressen kompatibel ist

@Lokkye ich habe dir einen kleinen Hinweis zur PR hinzugefügt, es wäre gut, die Variablen mit TUYA_ zu präfixieren, damit es in der DB klarer ist