Tuya-Integration einrichten

Hallo @pierre-gilles
Nach der Konfiguration der Cloud-Integration von Tuya in Gladys, wenn ich die Option „Tuya-Erkennung“ auswähle, erhalte ich die Meldung „Keine Geräte wurden entdeckt“, selbst nach dem Scan.

Ich habe dieselbe Integration für HA, die funktioniert. Zuerst habe ich die Informationen Access Key, Secret Key, App-Account UID des für HA erstellten Projekts abgerufen. Dann habe ich ein neues Projekt für Gladys mit einer neuen Konfiguration erstellt. Die Tuya-Geräte sind mit dem Projekt verknüpft, aber sie erscheinen nicht in Gladys. In den Tuya-Diensten gibt es einen Fehler.

Auszug aus den Docker-Logs von gladys
2024-10-26T12:19:33+0200 tuya.discoverDevices.js:38 (TuyaHandler.discoverDevices) Unable to load Tuya devices TypeError: Cannot destructure property ‹ list › of ‹ result › as it is undefined.
at TuyaHandler.loadDevices (/src/server/services/tuya/lib/tuya.loadDevices.js:25:11)
at processTicksAndRejections (node:internal/process/task_queues:95:5)
at TuyaHandler.discoverDevices (/src/server/services/tuya/lib/tuya.discoverDevices.js:35:15)
at discover (/src/server/services/tuya/api/tuya.controller.js:10:21)

Vielen Dank im Voraus für die Hilfe

Ich verweise dich auf die Nachricht von @pierre-gilles zu diesem Thema…
Es scheint, dass Tuya momentan nicht nutzbar ist, bis sich jemand damit beschäftigt!

Danke für die Antwort, ich werde geduldig sein.

Hallo @Francis66, danke für dein Feedback!

Tatsächlich haben seit diesem Sommer alle Nutzer das gleiche Problem wie du.

Ich habe bereits im Sommer daran gearbeitet, aber es war unmöglich herauszufinden, was nicht stimmte. Ich war bis dahin überzeugt, dass die Tuya-API für diesen Zweck nicht mehr geöffnet war.

Aber ich bin sehr neugierig zu erfahren, wie HA das macht.

Hast du etwas Besonderes auf HA-Seite gemacht? Als du die API-Schlüssel für HA erstellt hast, war das derselbe Prozess wie in Gladys oder machen sie etwas mehr?

Nein, ich sehe keinen nennenswerten Unterschied. HA hat eine neue Tuya Smart Life Integration entwickelt, um die erneute Validierung der Berechtigungen in Tuya IOT zu vermeiden.
Ich habe gerade drei Calex-Lampen wegen ihres Designs gekauft, ich werde mich auf Tuya Covert konzentrieren, um zu sehen, ob ich die Cloud eliminieren kann. Derzeit rüste ich hauptsächlich mit Zigbee2Mqtt aus.

Wenn ich mir das Node.js-Paket ansehe, das wir für die Verbindung zu Tuya verwenden, beschweren sich alle über dasselbe Problem, wir sind nicht die Einzigen:

Das ist frustrierend mit diesen Cloud-Produkten, denn wir haben diesen Dienst im Juli 2023 entwickelt (Quelle: Gladys Assistant 4.26: Gladys devient compatible Tuya/SmartLife/LSC Connect!), und ein Jahr später ist es bereits unbrauchbar, gut genug, um neu geschrieben zu werden…

Das ist nicht ernsthaft mit diesen nicht standardisierten Cloud-APIs.

Entschuldigung für meine Anfrage und die verlorene Zeit, denn schließlich funktioniert die TUYA-Integration in Gladys sehr gut.

Die Fehlfunktion war auf zwei Probleme zurückzuführen.

  1. Ich hatte keine Berechtigungen mehr für die API-Ressourcen
  • Zugriff auf Cloud Develop Base Resource und IoT Core, da die Testphase abgelaufen war.
  1. Für die Region: Ich hatte Westeuropa statt Mitteleuropa angegeben

Ich habe meine Lampen in « Tuya Discovery » gefunden

Unglaublich! Denn du bist nicht der Einzige, der sich beschwert hat! Ich werde deinen Beitrag an die anderen Nutzer weiterleiten.

@Francis66 ich habe eine Nachricht in der Dokumentation hinzugefügt, die auf dieses Thema verweist:

https://gladysassistant.com/fr/docs/integrations/tuya/#le-scan-ne-fonctionne-pas-

Hallo @Francis66

Danke, dass du den Ursprung des Problems angegeben hast. Ich bestätige, dass ich dasselbe Problem habe.

Allerdings habe ich eine praktische Frage: Wie hast du es geschafft, den Dienst wieder zu aktivieren? Ich habe die Option gefunden, die Testphase zu verlängern, aber es wird mir nur eine Verlängerung um 6 Monate angeboten (die von Tuya bestätigt werden muss…); daher werde ich diese Aktion alle 6 Monate durchführen müssen, wenn es darauf hinausläuft.

Bitte bestätige die Antwort auf das Tuya-Integrationsproblem, das Pierre-Gilles Zeit sparen wird. Bevor ich mit dem Gladys-Startkit begann, war ich bei HA, das Verfahren zur Integration ist auf der Tuya-IoT-Seite identisch, mit einer „trial“-Phase für die Berechtigungen. Nach einer E-Mail von Tuya, in der mir die Ablaufdatum mitgeteilt wurde, habe ich eine Verlängerung um 6 Monate beantragt, die mir sofort gewährt wurde. Bei Ablauf der zweiten Validierung im Dezember 2023 funktionierten meine Befehle und Automatisierungen mit Tuya-Geräten weiterhin!!?
Bei der Integration in Gladys musste Tuya jedoch meine Rechte überprüfen. Ich konnte ein Formular mit einem außergewöhnlichen Antrag auf Verlängerung von 1 bis 6 Monaten ausfüllen. Die Anfrage wurde innerhalb der nächsten 10 Minuten akzeptiert. Ich hoffe, dass meine Integration in 6 Monaten weiterhin funktioniert…
Ich empfehle jedoch, die „Local Key“ zu sichern, die mit den „Id“ der Tuya-Geräte verbunden sind. Die Rechte sind gesperrt, wenn das Ablaufdatum der Berechtigungen erreicht ist. Das könnte für eine lokale Nutzung nützlich sein.

Entschuldigung, dass ich ein altes Thema wieder aufgreife, aber ich habe ein Problem mit der Tuya-Integration:
Ich habe kürzlich meinen Internetanbieter gewechselt und seitdem reagieren die Lampen, die ich mit der Tuya-Integration verwendet habe, nicht mehr.

Zuerst habe ich versucht, die Lampen in der « Geräte »-Sektion der Integration zu löschen, um sie neu zu entdecken, aber nichts wurde gefunden… Ich habe diesen Beitrag gesehen: also habe ich meinen Zugriff auf « IoT Core » überprüft (ich habe « Cloud Develop Base Resouce » nicht gefunden) und tatsächlich war die Testphase abgelaufen (auch war ich auf dem Cloud Europe Central). Ich habe eine Verlängerung beantragt, die akzeptiert wurde. Seitdem habe ich die Entdeckung erneut versucht und immer noch nichts…

Aber in den Gladys-Logs habe ich dies, wenn ich die Konfiguration bestätige:

 <warn> service.start.js:44 (Service.start) Unable to st                                                    art service tuya Error: connect ETIMEDOUT 2a05:d014:afa:af00:568a:5cc6:4603:c040                                                    :443
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1555:16) {
  errno: -110,
  code: 'ETIMEDOUT',
  syscall: 'connect',
  address: '2xxxx:dxxx:axxxx:af00:568a:5cc6:4603:c040',
  port: 443,
  config: {
    url: 'https://openapi.tuyaeu.com/v1.3/iot-03/devices?last_row_key=&source_id                                                    =euxxxxxxxxxxxx&source_type=tuyaUser',
    method: 'get',
    data: '{}',
    headers: {
      Accept: 'application/json, text/plain, */*',
      t: '1737148959580',
      sign: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
      client_id: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
      sign_method: 'HMAC-SHA256',
      access_token: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
      Dev_lang: 'Nodejs',
      Dev_channel: 'SaaSFramework',
      'Signature-Headers': '',
      'Content-Type': 'application/json',
      'User-Agent': 'axios/0.21.4',
      'Content-Length': 2
    },
    params: {},
    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
    }
  },
  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.3/iot-03/devices?last_row_key=&source_id=euxxxxxxxxxxxxxxxxxxx&s                                                    ource_type=tuyaUser',
      method: 'GET',
      headers: [Object],
      agent: undefined,
      agents: [Object],
      auth: undefined,
      hostname: 'openapi.tuyaeu.com',
      port: null,
      nativeProtocols: [Object],
      pathname: '/v1.3/iot-03/devices',
      search: '?last_row_key=&source_id=euxxxxxxxxxxxxxxxxxxxxxxx&source_type=tuyaUser'
    },
    _ended: false,
    _ending: true,
    _redirectCount: 0,
    _redirects: [],
    _requestBodyLength: 2,
    _requestBodyBuffers: [ [Object] ],
    _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: 2,
      _hasBody: true,
      _trailer: '',
      finished: false,
      _headerSent: true,
      _closed: false,
      socket: [TLSSocket],
      _header: 'GET /v1.3/iot-03/devices?last_row_key=&source_id=euxxxxxxxxxxxxxxx                                                    AowJC&source_type=tuyaUser HTTP/1.1\r\n' +
        'Accept: application/json, text/plain, */*\r\n' +
        't: 1737148959580\r\n' +
        'sign: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\                                                    r\n' +
        'client_id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n' +
        'sign_method: HMAC-SHA256\r\n' +
        'access_token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n' +
        'Dev_lang: Nodejs\r\n' +
        'Dev_channel: SaaSFramework\r\n' +
        'Signature-Headers: \r\n' +
        'Content-Type: application/json\r\n' +
        'User-Agent: axios/0.21.4\r\n' +
        'Content-Length: 2\r\n' +
        'Host: openapi.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.3/iot-03/devices?last_row_key=&source_id=euxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&s                                                    ource_type=tuyaUser',
      _ended: false,
      res: null,
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'openapi.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(kHighWaterMark)]: 16384,
      [Symbol(kRejectNonStandardBodyWrites)]: false,
      [Symbol(kUniqueHeaders)]: null
    },
    _currentUrl: 'https://openapi.tuyaeu.com/v1.3/iot-03/devices?last_row_key=&s                                                    ource_id=euxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&source_type=tuyaUser',
    [Symbol(kCapture)]: false
  },
  response: undefined,
  isAxiosError: true,
  toJSON: [Function: toJSON]
}

Es scheint, dass es sich um ein Timeout handelt, aber ich weiß nicht warum…

Es funktioniert problemlos mit der Smart Home-App meines Telefons und ich kann eine Lampe von Gladys aus problemlos pingen.

Ich frage mich, ob sich die API-URL geändert hat oder so etwas?! ^^

Hallo @Xenicle, bist du sicher, dass du kein Netzwerkproblem oder eine falsche Konfiguration hast?

Wenn ich die URL öffne, die du angibst, ist dort tatsächlich ein Server am Ende:

(okay, es fehlt ein Token zum Testen, aber der Server ist da)

Ich werde das überprüfen! Daran habe ich auch schon gedacht, aber noch nicht « gecheckt »…

Aber vom Mini-PC aus:

gladys:~$ httping -c 3 -g https://openapi.tuyaeu.com/v1.3/iot-03/devices?last_row_key=&source_id=&source_type=tuyaUser
[2] 181345
[3] 181346
gladys@gladys:~$ SSL automatisch aktiviert aufgrund der https-URL
PING openapi.tuyaeu.com:443 (/v1.3/iot-03/devices?last_row_key=):
verbunden mit 3.69.78.245:443 (617 Bytes), seq=0 time=132,80 ms
verbunden mit 3.69.78.245:443 (617 Bytes), seq=1 time= 72,15 ms
verbunden mit 3.69.78.245:443 (617 Bytes), seq=2 time= 70,65 ms
--- https://openapi.tuyaeu.com/v1.3/iot-03/devices?last_row_key= ping statistics ---
3 Verbindungen, 3 erfolgreich, 0,00% fehlgeschlagen, Zeit 3278ms
round-trip min/avg/max = 70,6/91,9/132,8 ms