Login to MELcloud

Hello everyone,

As a new Gladys user I tried to configure MELCloud but when I enter my username and password I get no connection (username and password verified by logging in directly to MELCloud).
The MELCloud documentation leads me to a page not found on the Gladys site and I can’t find MELCloud in the list of integrations on the Gladys site.
Did I miss a step? Do I need to do anything beforehand?
Thanks for your help.

Romain

Hello @manoredge :slight_smile:

Welcome to Gladys!

Do you have any additional information so I can help you?

Which page can’t be found? :slight_smile:

Hello, yes of course,

On the configuration page: dashboard/integration/device/melcloud/setup: I enter my MELcloud username and password, it spins for 1 second then returns to the same page with my ID and password displayed but nothing happened. I have no information about either a successful connection or a failure.
When I click on « documentation MELcloud » (4th tab at the bottom left) it takes me to a page not found: https://gladysassistant.com/fr/docs/integrations/melcloud
Finally on the integrations page: Intégrations | Gladys Assistant I can’t find MELcloud.
Do I need to perform any action before entering my MELcloud username and password? Am I supposed to receive a connection message once the ID and password are entered?

@manoredge Thanks for the information — would you mind giving me your username/password so I can run the test and debug this issue on my side? (change the password temporarily for this test)

I don’t have MELCloud at home, and the developer who created this integration is unfortunately no longer active in the community so there’s not much choice :smiley:

(If yes, send me all that in a private message)

Thanks @manoredge for your credentials, I made a PR that fixes the issue:

I’m available to do a real test with turning the air conditioning on/off as soon as you’re home

Thanks for the quick call @manoredge, since that fixes the issue I’ll release this fix in the next Gladys version, probably next week :slight_smile:

Thanks to you @pierre-gilles, extremely efficient, successful test

It’s available in Gladys Assistant 4.42:

Hello,
je déterre le sujet car depuis aujourd’hui j’ai des PAC Mitsubishi :cold_face: :hot_face: :grimacing:

Donc je mets mes id/pwd, je clique sur Enregistrer la configurationet .. rien. Rien ne se passe et quand je vais dans Découverte MELCloud, ça me dit que je ne suis pas connecté :frowning:

Je précise que dans mon email j’ai un + et mon login fonctionne sur l’appli Melcloud Home et aussi via le web.
En parallèle j’ai aussi testé avec le plugin matterbridge et ça ne fonctionne pas non plus.

Voici les logs de Gladys :

2026-05-21T18:29:47+0200 <info> index.js:27 (Object.start) Starting MELCloud service 52848819-9e44-4ed8-a74d-4f6cfdcc6023

2026-05-21T18:29:47+0200 <error> melcloud.connect.js:44 (MELCloudHandler.connect) Error connecting to Tuya: null

2026-05-21T18:29:47+0200 <warn> service.start.js:44 (Service.start) Unable to start service melcloud AxiosError: Request failed with status code 401

    at settle (/src/server/services/melcloud/node_modules/axios/lib/core/settle.js:19:12)

    at IncomingMessage.handleStreamEnd (/src/server/services/melcloud/node_modules/axios/lib/adapters/http.js:570:11)

    at IncomingMessage.emit (node:events:531:35)

    at endReadableNT (node:internal/streams/readable:1698:12)

    at processTicksAndRejections (node:internal/process/task_queues:89:21) {

  code: 'ERR_BAD_REQUEST',

  config: {

    transitional: {

      silentJSONParsing: true,

      forcedJSONParsing: true,

      clarifyTimeoutError: false

    },

    adapter: [ 'xhr', 'http' ],

    transformRequest: [ [Function: transformRequest] ],

    transformResponse: [ [Function: transformResponse] ],

    timeout: 5000,

    xsrfCookieName: 'XSRF-TOKEN',

    xsrfHeaderName: 'X-XSRF-TOKEN',

    maxContentLength: -1,

    maxBodyLength: -1,

    env: { FormData: [Function], Blob: [class Blob] },

    validateStatus: [Function: validateStatus],

    headers: AxiosHeaders {

      Accept: 'application/json, text/javascript, */*; q=0.01',

      'Content-Type': 'application/json',

      'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:73.0) ',

      'Accept-Language': 'en-US,en;q=0.5',

      'Accept-Encoding': 'gzip, deflate, br',

      'X-MitsContextKey': null,

      'X-Requested-With': 'XMLHttpRequest',

      Cookie: 'policyaccepted=true'

    },

    baseURL: 'https://app.melcloud.com/Mitsubishi.Wifi.Client/',

    method: 'get',

    url: 'https://app.melcloud.com/Mitsubishi.Wifi.Client//User/ListDevices',

    data: undefined

  },

  request: <ref *1> ClientRequest {

    _events: [Object: null prototype] {

      abort: [Function (anonymous)],

      aborted: [Function (anonymous)],

      connect: [Function (anonymous)],

      error: [Function (anonymous)],

      socket: [Function (anonymous)],

      timeout: [Function (anonymous)],

      finish: [Function: requestOnFinish]

    },

    _eventsCount: 7,

    _maxListeners: undefined,

    outputData: [],

    outputSize: 0,

    writable: true,

    destroyed: true,

    _last: true,

    chunkedEncoding: false,

    shouldKeepAlive: true,

    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: true,

    _header: 'GET /Mitsubishi.Wifi.Client//User/ListDevices HTTP/1.1\r\n' +

      'Accept: application/json, text/javascript, */*; q=0.01\r\n' +

      'Content-Type: application/json\r\n' +

      'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:73.0) \r\n' +

      'Accept-Language: en-US,en;q=0.5\r\n' +

      'Accept-Encoding: gzip, deflate, br\r\n' +

      'X-Requested-With: XMLHttpRequest\r\n' +

      'Cookie: policyaccepted=true\r\n' +

      'Host: app.melcloud.com\r\n' +

      'Connection: keep-alive\r\n' +

      '\r\n',

    _keepAliveTimeout: 0,

    _onPendingData: [Function: nop],

    agent: Agent {

      _events: [Object: null prototype],

      _eventsCount: 2,

      _maxListeners: undefined,

      options: [Object: null prototype],

      defaultPort: 443,

      protocol: 'https:',

      requests: [Object: null prototype] {},

      sockets: [Object: null prototype] {},

      freeSockets: [Object: null prototype],

      keepAliveMsecs: 1000,

      keepAlive: true,

      maxSockets: Infinity,

      maxFreeSockets: 256,

      scheduling: 'lifo',

      maxTotalSockets: Infinity,

      totalSocketCount: 1,

      agentKeepAliveTimeoutBuffer: 1000,

      maxCachedSessions: 100,

      _sessionCache: [Object],

      [Symbol(shapeMode)]: false,

      [Symbol(kCapture)]: false

    },

    socketPath: undefined,

    method: 'GET',

    maxHeaderSize: undefined,

    insecureHTTPParser: undefined,

    joinDuplicateHeaders: undefined,

    path: '/Mitsubishi.Wifi.Client//User/ListDevices',

    _ended: true,

    res: IncomingMessage {

      _events: [Object],

      _readableState: [ReadableState],

      _maxListeners: undefined,

      socket: null,

      httpVersionMajor: 1,

      httpVersionMinor: 1,

      httpVersion: '1.1',

      complete: true,

      rawHeaders: [Array],

      rawTrailers: [],

      joinDuplicateHeaders: undefined,

      aborted: false,

      upgrade: false,

      url: '',

      method: null,

      statusCode: 401,

      statusMessage: 'Unauthorized',

      client: [TLSSocket],

      _consuming: false,

      _dumped: false,

      req: [Circular *1],

      _eventsCount: 4,

      responseUrl: 'https://app.melcloud.com/Mitsubishi.Wifi.Client//User/ListDevices',

      redirects: [],

      [Symbol(shapeMode)]: true,

      [Symbol(kCapture)]: false,

      [Symbol(kHeaders)]: [Object],

      [Symbol(kHeadersCount)]: 24,

      [Symbol(kTrailers)]: null,

      [Symbol(kTrailersCount)]: 0

    },

    aborted: false,

    timeoutCb: null,

    upgradeOrConnect: false,

    parser: null,

    maxHeadersCount: null,

    reusedSocket: true,

    host: 'app.melcloud.com',

    protocol: 'https:',

    _redirectable: Writable {

      _events: [Object],

      _writableState: [WritableState],

      _maxListeners: undefined,

      _options: [Object],

      _ended: true,

      _ending: true,

      _redirectCount: 0,

      _redirects: [],

      _requestBodyLength: 0,

      _requestBodyBuffers: [],

      _eventsCount: 3,

      _onNativeResponse: [Function (anonymous)],

      _currentRequest: [Circular *1],

      _currentUrl: 'https://app.melcloud.com/Mitsubishi.Wifi.Client//User/ListDevices',

      _timeout: null,

      [Symbol(shapeMode)]: true,

      [Symbol(kCapture)]: false

    },

    [Symbol(shapeMode)]: false,

    [Symbol(kCapture)]: false,

    [Symbol(kBytesWritten)]: 0,

    [Symbol(kNeedDrain)]: false,

    [Symbol(corked)]: 0,

    [Symbol(kChunkedBuffer)]: [],

    [Symbol(kChunkedLength)]: 0,

    [Symbol(kSocket)]: TLSSocket {

      _tlsOptions: [Object],

      _secureEstablished: true,

      _securePending: false,

      _newSessionPending: false,

      _controlReleased: true,

      secureConnecting: false,

      _SNICallback: null,

      servername: 'app.melcloud.com',

      alpnProtocol: false,

      authorized: true,

      authorizationError: null,

      encrypted: true,

      _events: [Object: null prototype],

      _eventsCount: 9,

      connecting: false,

      _hadError: false,

      _parent: null,

      _host: 'app.melcloud.com',

      _closeAfterHandlingError: false,

      _readableState: [ReadableState],

      _writableState: [WritableState],

      allowHalfOpen: false,

      _maxListeners: undefined,

      _sockname: null,

      _pendingData: null,

      _pendingEncoding: '',

      server: undefined,

      _server: null,

      ssl: [TLSWrap],

      _requestCert: true,

      _rejectUnauthorized: true,

      timeout: 5000,

      parser: null,

      _httpMessage: null,

      autoSelectFamilyAttemptedAddresses: [Array],

      [Symbol(alpncallback)]: null,

      [Symbol(res)]: [TLSWrap],

      [Symbol(verified)]: true,

      [Symbol(pendingSession)]: null,

      [Symbol(async_id_symbol)]: -1,

      [Symbol(kHandle)]: [TLSWrap],

      [Symbol(lastWriteQueueSize)]: 0,

      [Symbol(timeout)]: Timeout {

        _idleTimeout: 5000,

        _idlePrev: [TimersList],

        _idleNext: [Timeout],

        _idleStart: 269871797,

        _onTimeout: [Function: bound ],

        _timerArgs: undefined,

        _repeat: null,

        _destroyed: false,

        [Symbol(refed)]: false,

        [Symbol(kHasPrimitive)]: false,

        [Symbol(asyncId)]: 15098503,

        [Symbol(triggerId)]: 15098501,

        [Symbol(kAsyncContextFrame)]: undefined

      },

      [Symbol(kBuffer)]: null,

      [Symbol(kBufferCb)]: null,

      [Symbol(kBufferGen)]: null,

      [Symbol(shapeMode)]: true,

      [Symbol(kCapture)]: false,

      [Symbol(kSetNoDelay)]: false,

      [Symbol(kSetKeepAlive)]: true,

      [Symbol(kSetKeepAliveInitialDelay)]: 1,

      [Symbol(kBytesRead)]: 0,

      [Symbol(kBytesWritten)]: 0,

      [Symbol(connect-options)]: [Object]

    },

    [Symbol(kOutHeaders)]: [Object: null prototype] {

      accept: [Array],

      'content-type': [Array],

      'user-agent': [Array],

      'accept-language': [Array],

      'accept-encoding': [Array],

      'x-requested-with': [Array],

      cookie: [Array],

      host: [Array]

    },

    [Symbol(errored)]: null,

    [Symbol(kHighWaterMark)]: 65536,

    [Symbol(kRejectNonStandardBodyWrites)]: false,

    [Symbol(kUniqueHeaders)]: null

  },

  response: {

    status: 401,

    statusText: 'Unauthorized',

    headers: AxiosHeaders {

      date: 'Thu, 21 May 2026 16:29:47 GMT',

      'content-type': 'text/html',

      'content-length': '1293',

      connection: 'keep-alive',

      'cache-control': 'no-cache, no-store, must-revalidate',

      pragma: 'no-cache',

      expires: '-1',

      server: 'Microsoft-IIS/10.0',

      'strict-transport-security': 'max-age=63072000; includeSubDomains',

      'x-robots-tag': 'noindex, nofollow, noimageindex',

      'x-content-type-options': 'nosniff',

      'access-control-allow-origin': '*'

    },

    config: {

      transitional: [Object],

      adapter: [Array],

      transformRequest: [Array],

      transformResponse: [Array],

      timeout: 5000,

      xsrfCookieName: 'XSRF-TOKEN',

      xsrfHeaderName: 'X-XSRF-TOKEN',

      maxContentLength: -1,

      maxBodyLength: -1,

      env: [Object],

      validateStatus: [Function: validateStatus],

      headers: [AxiosHeaders],

      baseURL: 'https://app.melcloud.com/Mitsubishi.Wifi.Client/',

      method: 'get',

      url: 'https://app.melcloud.com/Mitsubishi.Wifi.Client//User/ListDevices',

      data: undefined

    },

    request: <ref *1> ClientRequest {

      _events: [Object: null prototype],

      _eventsCount: 7,

      _maxListeners: undefined,

      outputData: [],

      outputSize: 0,

      writable: true,

      destroyed: true,

      _last: true,

      chunkedEncoding: false,

      shouldKeepAlive: true,

      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: true,

      _header: 'GET /Mitsubishi.Wifi.Client//User/ListDevices HTTP/1.1\r\n' +

        'Accept: application/json, text/javascript, */*; q=0.01\r\n' +

        'Content-Type: application/json\r\n' +

        'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:73.0) \r\n' +

        'Accept-Language: en-US,en;q=0.5\r\n' +

        'Accept-Encoding: gzip, deflate, br\r\n' +

        'X-Requested-With: XMLHttpRequest\r\n' +

        'Cookie: policyaccepted=true\r\n' +

        'Host: app.melcloud.com\r\n' +

        'Connection: keep-alive\r\n' +

        '\r\n',

      _keepAliveTimeout: 0,

      _onPendingData: [Function: nop],

      agent: [Agent],

      socketPath: undefined,

      method: 'GET',

      maxHeaderSize: undefined,

      insecureHTTPParser: undefined,

      joinDuplicateHeaders: undefined,

      path: '/Mitsubishi.Wifi.Client//User/ListDevices',

      _ended: true,

      res: [IncomingMessage],

      aborted: false,

      timeoutCb: null,

      upgradeOrConnect: false,

      parser: null,

      maxHeadersCount: null,

      reusedSocket: true,

      host: 'app.melcloud.com',

      protocol: 'https:',

      _redirectable: [Writable],

      [Symbol(shapeMode)]: false,

      [Symbol(kCapture)]: false,

      [Symbol(kBytesWritten)]: 0,

      [Symbol(kNeedDrain)]: false,

      [Symbol(corked)]: 0,

      [Symbol(kChunkedBuffer)]: [],

      [Symbol(kChunkedLength)]: 0,

      [Symbol(kSocket)]: [TLSSocket],

      [Symbol(kOutHeaders)]: [Object: null prototype],

      [Symbol(errored)]: null,

      [Symbol(kHighWaterMark)]: 65536,

      [Symbol(kRejectNonStandardBodyWrites)]: false,

      [Symbol(kUniqueHeaders)]: null

    },

    data: '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r\n' +

      '<html xmlns="http://www.w3.org/1999/xhtml">\r\n' +

      '<head>\r\n' +

      '<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>\r\n' +

      '<title>401 - Unauthorized: Access is denied due to invalid credentials.</title>\r\n' +

      '<style type="text/css">\r\n' +

      '<!--\r\n' +

      'body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}\r\n' +

      'fieldset{padding:0 15px 10px 15px;} \r\n' +

      'h1{font-size:2.4em;margin:0;color:#FFF;}\r\n' +

      'h2{font-size:1.7em;margin:0;color:#CC0000;} \r\n' +

      'h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;} \r\n' +

      '#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;\r\n' +

      'background-color:#555555;}\r\n' +

      '#content{margin:0 0 0 2%;position:relative;}\r\n' +

      '.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}\r\n' +

      '-->\r\n' +

      '</style>\r\n' +

      '</head>\r\n' +

      '<body>\r\n' +

      '<div id="header"><h1>Server Error</h1></div>\r\n' +

      '<div id="content">\r\n' +

      ' <div class="content-container"><fieldset>\r\n' +

      '  <h2>401 - Unauthorized: Access is denied due to invalid credentials.</h2>\r\n' +

      '  <h3>You do not have permission to view this directory or page using the credentials that you supplied.</h3>\r\n' +

      ' </fieldset></div>\r\n' +

      '</div>\r\n' +

      '</body>\r\n' +

      '</html>\r\n'

  }

}

2026-05-21T18:30:00+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:27 (EnergyMonitoringHandler.calculateConsumptionFromIndex) Calculating consumption from index in timezone Europe/Paris for window Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:00+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:34 (EnergyMonitoringHandler.calculateConsumptionFromIndex) Found 50 energy devices

2026-05-21T18:30:00+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:65 (EnergyMonitoringHandler.calculateConsumptionFromIndex) Found 16 devices with both INDEX and THIRTY_MINUTES_CONSUMPTION features

2026-05-21T18:30:00+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0 for device Borne VE at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:00+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0 for device Clim mobile at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:00+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0 for device Climatisation at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0 for device Leds cuisine at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0.07999999999992724 for device Prise congélateur at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0 for device Prise lave-linge at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0 for device Téléinformation at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0.7830000000000006 for device Téléinformation at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0 for device Téléinformation at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0 for device Téléinformation at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0 for device Téléinformation at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0 for device Téléinformation at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0.010000000000005116 for device ampli freebox at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0 for device prise compresseur at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0 for device prise_04 at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:149 () Saved consumption 0 for device relais_fp_01 at Thu May 21 2026 18:30:00 GMT+0200 (Central European Summer Time)

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateConsumptionFromIndex.js:160 (EnergyMonitoringHandler.calculateConsumptionFromIndex) Finished calculating consumption from index for 16 devices

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateCostFrom.js:34 (EnergyMonitoringHandler.calculateCostFrom) Calculating cost in timezone Europe/Paris

2026-05-21T18:30:01+0200 <info> energy-monitoring.calculateCostFrom.js:38 (EnergyMonitoringHandler.calculateCostFrom) Found 21 energy devices

2026-05-21T18:30:02+0200 <info> energy-monitoring.calculateCostFrom.js:126 () Device 2b993985-4690-47e0-89ab-523e35ade901 has tempo prices and Map is empty, getting EDF tempo historical

2026-05-21T18:30:02+0200 <info> contracts.buildEdfTempoDayMap.js:19 (buildEdfTempoDayMap) Building EDF tempo historical map from 2026-05-20

2026-05-21T18:30:02+0200 <info> contracts.buildEdfTempoDayMap.js:52 (buildEdfTempoDayMap) All 2 EDF tempo days found in cache (from 2026-05-20 to 2026-05-21)

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = 7393b8a6-31cd-484f-a6a5-4748b897820b.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = b17ed9a0-bb8f-4eab-aa18-49e1e360322c.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = 7647d3f1-2e5c-4773-94dc-d53ddcc24b32.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = 2dea3c15-23d8-4a9e-a9b6-90f0c0d5593f.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = 0883c4ae-66b7-475d-a8ca-7ab3ef09dadb.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = bdb4a7d1-bb27-4132-96c2-e09e4f40f381.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = c7ab8f9e-0f99-4927-b8f3-de864b85e9c3.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = edff3d91-ae7c-4599-aea2-216d2e442786.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = a1e3f62f-5cd2-4c73-b0e8-b988bfed5d3f.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = c9a07104-f362-404f-bac4-7fc4a7f79f3e.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = 8c223390-c8ad-4bfe-ad28-644baf931376.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = d5684fbf-a0f8-414f-b45c-ef28555fe7f1.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = f8b9c646-7fe2-4e86-8aaa-b49e3aa0f910.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = a5113c01-711c-4552-9e06-dfe03819d4a8.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = 27d71bd3-11f9-48d2-b59d-c6257bf5177e.

2026-05-21T18:30:02+0200 <info> index.js:156 () DuckDB : Inserting chunk 0 for deviceFeature = e1c91792-0b39-4b09-b583-1003d9ab50a0.

2026-05-21T18:30:07+0200 <info> device.newStateEvent.js:17 (DeviceManager.newStateEvent) DeviceFeature "zwavejs-ui:41:0:binary_sensor:general_purpose" not found (or not added to Gladys), skipping state update.

2026-05-21T18:30:12+0200 <info> netatmo.loadDevices.js:155 (NetatmoHandler.loadDevices) Netatmo devices not supported : 0

2026-05-21T18:30:37+0200 <info> device.newStateEvent.js:17 (DeviceManager.newStateEvent) DeviceFeature "zwavejs-ui:41:0:binary_sensor:general_purpose" not found (or not added to Gladys), skipping state update.

2026-05-21T18:30:40+0200 <error> handleMqttMessage.js:123 () Failed to convert value for device capteur_humidite: Error: Zigbee2mqqt expose not found on device "capteur_humidite" with property "soil_moisture".

    at Zigbee2mqttManager.readValue (/src/server/services/zigbee2mqtt/lib/readValue.js:16:11)

    at /src/server/services/zigbee2mqtt/lib/handleMqttMessage.js:119:31

    at Array.forEach (<anonymous>)

    at Zigbee2mqttManager.handleMqttMessage (/src/server/services/zigbee2mqtt/lib/handleMqttMessage.js:111:41)

    at MqttClient.<anonymous> (/src/server/services/zigbee2mqtt/lib/connect.js:60:12)

    at MqttClient.emit (node:events:519:28)

    at MqttClient._handlePublish (/src/server/services/zigbee2mqtt/node_modules/mqtt/lib/client.js:1277:12)

    at MqttClient._handlePacket (/src/server/services/zigbee2mqtt/node_modules/mqtt/lib/client.js:410:12)

    at work (/src/server/services/zigbee2mqtt/node_modules/mqtt/lib/client.js:321:12)

    at Writable.writable._write (/src/server/services/zigbee2mqtt/node_modules/mqtt/lib/client.js:335:5)

    at doWrite (/src/server/services/zigbee2mqtt/node_modules/readable-stream/lib/_stream_writable.js:409:139)

    at writeOrBuffer (/src/server/services/zigbee2mqtt/node_modules/readable-stream/lib/_stream_writable.js:398:5)

    at Writable.write (/src/server/services/zigbee2mqtt/node_modules/readable-stream/lib/_stream_writable.js:307:11)

    at Socket.ondata (node:internal/streams/readable:1009:22)

    at Socket.emit (node:events:519:28)

    at addChunk (node:internal/streams/readable:561:12)

    at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)

    at Socket.Readable.push (node:internal/streams/readable:392:5)

    at TCP.onStreamRead (node:internal/stream_base_commons:189:23)

2026-05-21T18:31:09+0200 <info> device.newStateEvent.js:17 (DeviceManager.newStateEvent) DeviceFeature "zwavejs-ui:41:0:binary_sensor:general_purpose" not found (or not added to Gladys), skipping state update.

2026-05-21T18:31:10+0200 <info> device.newStateEvent.js:17 (DeviceManager.newStateEvent) DeviceFeature "zwavejs-ui:41:0:binary_sensor:general_purpose" not found (or not added to Gladys), skipping state update.

2026-05-21T18:31:10+0200 <info> device.newStateEvent.js:17 (DeviceManager.newStateEvent) DeviceFeature "zwavejs-ui:41:0:binary_sensor:general_purpose" not found (or not added to Gladys), skipping state update.

2026-05-21T18:31:10+0200 <info> device.newStateEvent.js:17 (DeviceManager.newStateEvent) DeviceFeature "zwavejs-ui:41:0:binary_sensor:general_purpose" not found (or not added to Gladys), skipping state update.

2026-05-21T18:31:10+0200 <info> device.newStateEvent.js:17 (DeviceManager.newStateEvent) DeviceFeature "zwavejs-ui:41:0:binary_sensor:general_purpose" not found (or not added to Gladys), skipping state update.

2026-05-21T18:31:13+0200 <info> index.js:27 (Object.start) Starting MELCloud service 52848819-9e44-4ed8-a74d-4f6cfdcc6023

2026-05-21T18:31:13+0200 <error> melcloud.connect.js:44 (MELCloudHandler.connect) Error connecting to Tuya: null

2026-05-21T18:31:13+0200 <warn> service.start.js:44 (Service.start) Unable to start service melcloud AxiosError: Request failed with status code 401

    at settle (/src/server/services/melcloud/node_modules/axios/lib/core/settle.js:19:12)

    at IncomingMessage.handleStreamEnd (/src/server/services/melcloud/node_modules/axios/lib/adapters/http.js:570:11)

    at IncomingMessage.emit (node:events:531:35)

    at endReadableNT (node:internal/streams/readable:1698:12)

    at processTicksAndRejections (node:internal/process/task_queues:89:21) {

  code: 'ERR_BAD_REQUEST',

  config: {

    transitional: {

      silentJSONParsing: true,

      forcedJSONParsing: true,

      clarifyTimeoutError: false

    },

    adapter: [ 'xhr', 'http' ],

    transformRequest: [ [Function: transformRequest] ],

    transformResponse: [ [Function: transformResponse] ],

    timeout: 5000,

    xsrfCookieName: 'XSRF-TOKEN',

    xsrfHeaderName: 'X-XSRF-TOKEN',

    maxContentLength: -1,

    maxBodyLength: -1,

    env: { FormData: [Function], Blob: [class Blob] },

    validateStatus: [Function: validateStatus],

    headers: AxiosHeaders {

      Accept: 'application/json, text/javascript, */*; q=0.01',

      'Content-Type': 'application/json',

      'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:73.0) ',

      'Accept-Language': 'en-US,en;q=0.5',

      'Accept-Encoding': 'gzip, deflate, br',

      'X-MitsContextKey': null,

      'X-Requested-With': 'XMLHttpRequest',

      Cookie: 'policyaccepted=true'

    },

    baseURL: 'https://app.melcloud.com/Mitsubishi.Wifi.Client/',

    method: 'get',

    url: 'https://app.melcloud.com/Mitsubishi.Wifi.Client//User/ListDevices',

    data: undefined

  },

  request: <ref *1> ClientRequest {

    _events: [Object: null prototype] {

      abort: [Function (anonymous)],

      aborted: [Function (anonymous)],

      connect: [Function (anonymous)],

      error: [Function (anonymous)],

      socket: [Function (anonymous)],

      timeout: [Function (anonymous)],

      finish: [Function: requestOnFinish]

    },

    _eventsCount: 7,

    _maxListeners: undefined,

    outputData: [],

    outputSize: 0,

    writable: true,

    destroyed: true,

    _last: true,

    chunkedEncoding: false,

    shouldKeepAlive: true,

    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: true,

    _header: 'GET /Mitsubishi.Wifi.Client//User/ListDevices HTTP/1.1\r\n' +

      'Accept: application/json, text/javascript, */*; q=0.01\r\n' +

      'Content-Type: application/json\r\n' +

      'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:73.0) \r\n' +

      'Accept-Language: en-US,en;q=0.5\r\n' +

      'Accept-Encoding: gzip, deflate, br\r\n' +

      'X-Requested-With: XMLHttpRequest\r\n' +

      'Cookie: policyaccepted=true\r\n' +

      'Host: app.melcloud.com\r\n' +

      'Connection: keep-alive\r\n' +

      '\r\n',

    _keepAliveTimeout: 0,

    _onPendingData: [Function: nop],

    agent: Agent {

      _events: [Object: null prototype],

      _eventsCount: 2,

      _maxListeners: undefined,

      options: [Object: null prototype],

      defaultPort: 443,

      protocol: 'https:',

      requests: [Object: null prototype] {},

      sockets: [Object: null prototype] {},

      freeSockets: [Object: null prototype],

      keepAliveMsecs: 1000,

      keepAlive: true,

      maxSockets: Infinity,

      maxFreeSockets: 256,

      scheduling: 'lifo',

      maxTotalSockets: Infinity,

      totalSocketCount: 1,

      agentKeepAliveTimeoutBuffer: 1000,

      maxCachedSessions: 100,

      _sessionCache: [Object],

      [Symbol(shapeMode)]: false,

      [Symbol(kCapture)]: false

    },

    socketPath: undefined,

    method: 'GET',

    maxHeaderSize: undefined,

    insecureHTTPParser: undefined,

    joinDuplicateHeaders: undefined,

    path: '/Mitsubishi.Wifi.Client//User/ListDevices',

    _ended: true,

    res: IncomingMessage {

      _events: [Object],

      _readableState: [ReadableState],

      _maxListeners: undefined,

      socket: null,

      httpVersionMajor: 1,

      httpVersionMinor: 1,

      httpVersion: '1.1',

      complete: true,

      rawHeaders: [Array],

      rawTrailers: [],

      joinDuplicateHeaders: undefined,

      aborted: false,

      upgrade: false,

      url: '',

      method: null,

      statusCode: 401,

      statusMessage: 'Unauthorized',

      client: [TLSSocket],

      _consuming: false,

      _dumped: false,

      req: [Circular *1],

      _eventsCount: 4,

      responseUrl: 'https://app.melcloud.com/Mitsubishi.Wifi.Client//User/ListDevices',

      redirects: [],

      [Symbol(shapeMode)]: true,

      [Symbol(kCapture)]: false,

      [Symbol(kHeaders)]: [Object],

      [Symbol(kHeadersCount)]: 24,

      [Symbol(kTrailers)]: null,

      [Symbol(kTrailersCount)]: 0

    },

    aborted: false,

    timeoutCb: null,

    upgradeOrConnect: false,

    parser: null,

    maxHeadersCount: null,

    reusedSocket: true,

    host: 'app.melcloud.com',

    protocol: 'https:',

    _redirectable: Writable {

      _events: [Object],

      _writableState: [WritableState],

      _maxListeners: undefined,

      _options: [Object],

      _ended: true,

      _ending: true,

      _redirectCount: 0,

      _redirects: [],

      _requestBodyLength: 0,

      _requestBodyBuffers: [],

      _eventsCount: 3,

      _onNativeResponse: [Function (anonymous)],

      _currentRequest: [Circular *1],

      _currentUrl: 'https://app.melcloud.com/Mitsubishi.Wifi.Client//User/ListDevices',

      _timeout: null,

      [Symbol(shapeMode)]: true,

      [Symbol(kCapture)]: false

    },

    [Symbol(shapeMode)]: false,

    [Symbol(kCapture)]: false,

    [Symbol(kBytesWritten)]: 0,

    [Symbol(kNeedDrain)]: false,

    [Symbol(corked)]: 0,

    [Symbol(kChunkedBuffer)]: [],

    [Symbol(kChunkedLength)]: 0,

    [Symbol(kSocket)]: TLSSocket {

      _tlsOptions: [Object],

      _secureEstablished: true,

      _securePending: false,

      _newSessionPending: false,

      _controlReleased: true,

      secureConnecting: false,

      _SNICallback: null,

      servername: 'app.melcloud.com',

      alpnProtocol: false,

      authorized: true,

      authorizationError: null,

      encrypted: true,

      _events: [Object: null prototype],

      _eventsCount: 9,

      connecting: false,

      _hadError: false,

      _parent: null,

      _host: 'app.melcloud.com',

      _closeAfterHandlingError: false,

      _readableState: [ReadableState],

      _writableState: [WritableState],

      allowHalfOpen: false,

      _maxListeners: undefined,

      _sockname: null,

      _pendingData: null,

      _pendingEncoding: '',

      server: undefined,

      _server: null,

      ssl: [TLSWrap],

      _requestCert: true,

      _rejectUnauthorized: true,

      timeout: 5000,

      parser: null,

      _httpMessage: null,

      autoSelectFamilyAttemptedAddresses: [Array],

      [Symbol(alpncallback)]: null,

      [Symbol(res)]: [TLSWrap],

      [Symbol(verified)]: true,

      [Symbol(pendingSession)]: null,

      [Symbol(async_id_symbol)]: -1,

      [Symbol(kHandle)]: [TLSWrap],

      [Symbol(lastWriteQueueSize)]: 0,

      [Symbol(timeout)]: Timeout {

        _idleTimeout: 5000,

        _idlePrev: [TimersList],

        _idleNext: [Timeout],

        _idleStart: 269958086,

        _onTimeout: [Function: bound ],

        _timerArgs: undefined,

        _repeat: null,

        _destroyed: false,

        [Symbol(refed)]: false,

        [Symbol(kHasPrimitive)]: false,

        [Symbol(asyncId)]: 15104056,

        [Symbol(triggerId)]: 15104054,

        [Symbol(kAsyncContextFrame)]: undefined

      },

      [Symbol(kBuffer)]: null,

      [Symbol(kBufferCb)]: null,

      [Symbol(kBufferGen)]: null,

      [Symbol(shapeMode)]: true,

      [Symbol(kCapture)]: false,

      [Symbol(kSetNoDelay)]: false,

      [Symbol(kSetKeepAlive)]: true,

      [Symbol(kSetKeepAliveInitialDelay)]: 1,

      [Symbol(kBytesRead)]: 0,

      [Symbol(kBytesWritten)]: 0,

      [Symbol(connect-options)]: [Object]

    },

    [Symbol(kOutHeaders)]: [Object: null prototype] {

      accept: [Array],

      'content-type': [Array],

      'user-agent': [Array],

      'accept-language': [Array],

      'accept-encoding': [Array],

      'x-requested-with': [Array],

      cookie: [Array],

      host: [Array]

    },

    [Symbol(errored)]: null,

    [Symbol(kHighWaterMark)]: 65536,

    [Symbol(kRejectNonStandardBodyWrites)]: false,

    [Symbol(kUniqueHeaders)]: null

  },

  response: {

    status: 401,

    statusText: 'Unauthorized',

    headers: AxiosHeaders {

      date: 'Thu, 21 May 2026 16:31:13 GMT',

      'content-type': 'text/html',

      'content-length': '1293',

      connection: 'keep-alive',

      'cache-control': 'no-cache, no-store, must-revalidate',

      pragma: 'no-cache',

      expires: '-1',

      server: 'Microsoft-IIS/10.0',

      'strict-transport-security': 'max-age=63072000; includeSubDomains',

      'x-robots-tag': 'noindex, nofollow, noimageindex',

      'x-content-type-options': 'nosniff',

      'access-control-allow-origin': '*'

    },

    config: {

      transitional: [Object],

      adapter: [Array],

      transformRequest: [Array],

      transformResponse: [Array],

      timeout: 5000,

      xsrfCookieName: 'XSRF-TOKEN',

      xsrfHeaderName: 'X-XSRF-TOKEN',

      maxContentLength: -1,

      maxBodyLength: -1,

      env: [Object],

      validateStatus: [Function: validateStatus],

      headers: [AxiosHeaders],

      baseURL: 'https://app.melcloud.com/Mitsubishi.Wifi.Client/',

      method: 'get',

      url: 'https://app.melcloud.com/Mitsubishi.Wifi.Client//User/ListDevices',

      data: undefined

    },

    request: <ref *1> ClientRequest {

      _events: [Object: null prototype],

      _eventsCount: 7,

      _maxListeners: undefined,

      outputData: [],

      outputSize: 0,

      writable: true,

      destroyed: true,

      _last: true,

      chunkedEncoding: false,

      shouldKeepAlive: true,

      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: true,

      _header: 'GET /Mitsubishi.Wifi.Client//User/ListDevices HTTP/1.1\r\n' +

        'Accept: application/json, text/javascript, */*; q=0.01\r\n' +

        'Content-Type: application/json\r\n' +

        'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:73.0) \r\n' +

        'Accept-Language: en-US,en;q=0.5\r\n' +

        'Accept-Encoding: gzip, deflate, br\r\n' +

        'X-Requested-With: XMLHttpRequest\r\n' +

        'Cookie: policyaccepted=true\r\n' +

        'Host: app.melcloud.com\r\n' +

        'Connection: keep-alive\r\n' +

        '\r\n',

      _keepAliveTimeout: 0,

      _onPendingData: [Function: nop],

      agent: [Agent],

      socketPath: undefined,

      method: 'GET',

      maxHeaderSize: undefined,

      insecureHTTPParser: undefined,

      joinDuplicateHeaders: undefined,

      path: '/Mitsubishi.Wifi.Client//User/ListDevices',

      _ended: true,

      res: [IncomingMessage],

      aborted: false,

      timeoutCb: null,

      upgradeOrConnect: false,

      parser: null,

      maxHeadersCount: null,

      reusedSocket: true,

      host: 'app.melcloud.com',

      protocol: 'https:',

      _redirectable: [Writable],

      [Symbol(shapeMode)]: false,

      [Symbol(kCapture)]: false,

      [Symbol(kBytesWritten)]: 0,

      [Symbol(kNeedDrain)]: false,

      [Symbol(corked)]: 0,

      [Symbol(kChunkedBuffer)]: [],

      [Symbol(kChunkedLength)]: 0,

      [Symbol(kSocket)]: [TLSSocket],

      [Symbol(kOutHeaders)]: [Object: null prototype],

      [Symbol(errored)]: null,

      [Symbol(kHighWaterMark)]: 65536,

      [Symbol(kRejectNonStandardBodyWrites)]: false,

      [Symbol(kUniqueHeaders)]: null

    },

    data: '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r\n' +

      '<html xmlns="http://www.w3.org/1999/xhtml">\r\n' +

      '<head>\r\n' +

      '<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>\r\n' +

      '<title>401 - Unauthorized: Access is denied due to invalid credentials.</title>\r\n' +

      '<style type="text/css">\r\n' +

      '<!--\r\n' +

      'body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}\r\n' +

      'fieldset{padding:0 15px 10px 15px;} \r\n' +

      'h1{font-size:2.4em;margin:0;color:#FFF;}\r\n' +

      'h2{font-size:1.7em;margin:0;color:#CC0000;} \r\n' +

      'h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;} \r\n' +

      '#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;\r\n' +

      'background-color:#555555;}\r\n' +

      '#content{margin:0 0 0 2%;position:relative;}\r\n' +

      '.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}\r\n' +

      '-->\r\n' +

      '</style>\r\n' +

      '</head>\r\n' +

      '<body>\r\n' +

      '<div id="header"><h1>Server Error</h1></div>\r\n' +

      '<div id="content">\r\n' +

      ' <div class="content-container"><fieldset>\r\n' +

      '  <h2>401 - Unauthorized: Access is denied due to invalid credentials.</h2>\r\n' +

      '  <h3>You do not have permission to view this directory or page using the credentials that you supplied.</h3>\r\n' +

      ' </fieldset></div>\r\n' +

      '</div>\r\n' +

      '</body>\r\n' +

      '</html>\r\n'

  }

}

Et petite question mais pourquoi il y a une connexion avec Tuya, et Axios (que je ne connais pas) ?

EDIT : petite précision, j’utilise Melcloud Home et non pas l’ancien Melcloud.
EDIT 2 : d’après Claude, c’est le problème car Gladys utilise app.melcloud.comet moi je suis sur melcloudhome.com. Argh :frowning:
EDIT 3 : je viens de créer une issue sur github avec Claude : MELCloud integration incompatible with MELCloud Home (melcloudhome.com) · Issue #2532 · GladysAssistant/Gladys · GitHub

Let’s see what the factory does, but I wonder if it’s not a new plugin that needs to be created :slight_smile:

Good evening @mutmut. On my side, PaC Mitsubishi installed since January. I couldn’t connect it in gladys with the integration, and Pierre-Gilles told me it was due to the difference between Air-to-Air and Air-to-Water PaC. Since then, I managed to get around it by using Node-red. It’s this topic: Intégration MELCloud : PaC non prise en charge. A ajouter?

And I did like you at the beginning, I had connected my PaC to the new MEL Cloud, the app interface seeming more complete to me, or at least more modern (= less ugly). But with this cloud mail, no API available! At least not yet… So back to the old MEL Cloud, which does have an API. And therefore to the ugly app, but which I don’t actually use since I control it from Gladys.

Thanks @StephaneB! I think I’ll switch back to the old system then.

It’s still crazy how all these manufacturers try to lock everything down, just look at Daikin which could be controlled locally before their Onecta cloud solution came along.
It’s really a pain :weary_face:

Another solution I’ll look into, but more technical, is to go fully local with an ESP, I just need to find the info though.

For info, the Melcloud plugin dated back to the early days of the plugin factory, and since then, it has evolved a lot.
As a result, the plugin relied on old mechanisms that could reintroduce bugs already fixed in the meantime.

I closed the ticket to start over with something cleaner. I think the best would be to create a new one :+1:

Also note that there are quite a few Melcloud plugins on the Homebridge side, which can serve as interesting inspiration. However, they are not yet adapted to Matter :slight_smile: