Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Verification Request: homebridge-tovala #753

Closed
kylewhirl opened this issue Aug 28, 2024 · 15 comments
Closed

Verification Request: homebridge-tovala #753

kylewhirl opened this issue Aug 28, 2024 · 15 comments
Labels
verified use when a plugin meets the criteria - adds the verified badge text

Comments

@kylewhirl
Copy link

Plugin Name

homebridge-tovala

Link To GitHub Repo

https://github.com/kylewhirl/homebridge-tovala

Plugin Icon (Optional)

https://raw.githubusercontent.com/kylewhirl/homebridge-tovala/main/tovala-icon.png

The plugin does not offer the same nor less functionality than that of any existing verified plugin.

🟢 Yes

The plugin successfully installs and does not start unless it is configured.

🟢 Yes

The plugin does not require the user to run Homebridge in a TTY or with non-standard startup parameters, even for initial configuration.

🟢 Yes

The plugin does not contain any analytics or calls that enable you to track the user.

🟢 Yes

If the plugin needs to write files to disk (cache, keys, etc.), it stores them inside the Homebridge storage directory.

🟢 Yes

The plugin does not throw unhandled exceptions, the plugin must catch and log its own errors.

🟢 Yes

More Information

No response

@kylewhirl kylewhirl added the pending the label given to a new verification/icon request label Aug 28, 2024
Copy link

🔴 The following checks failed:

  • GitHub Repo: should contain releases

🟢 The following checks passed:

  • Installation: successfully installed
  • Package JSON: homepage exists
  • Package JSON: bugs.url exists and seems a valid URL
  • Package JSON: keywords exist and contain 'homebridge-plugin'
  • Package JSON: 'preinstall' in scripts is not present
  • Package JSON: 'install' in scripts is not present
  • Package JSON: 'postinstall' in scripts is not present
  • Package JSON: engines.node property is compatible with Node 18
  • Package JSON: engines.node property is compatible with Node 20
  • Package JSON: engines.homebridge property is compatible with Homebridge 1.8.4
  • Package JSON: initializer function found
  • GitHub Repo: repository is public
  • GitHub Repo: repository is not archived
  • GitHub Repo: issues are enabled
  • NPM Package: has not been deprecated
  • Config Schema JSON: exists and is valid JSON
  • Config Schema JSON: contains a valid pluginAlias
  • Config Schema JSON: the pluginType is set to 'platform'
  • Config Schema JSON: contains a name schema property
  • Dependencies: homebridge was not installed as a dependency
  • Dependencies: hap-nodejs was not installed as a dependency

⚠️ Please action these failures and then comment /check to run the checks again. Let us know if you need any help.

If updating your package.json and config.schema.json files, don't forget to publish a new version to NPM.

@github-actions github-actions bot added awaiting-changes use after review has started - awaiting user to make changes to plugin and removed pending the label given to a new verification/icon request labels Aug 28, 2024
@bwp91
Copy link
Contributor

bwp91 commented Aug 28, 2024

what’s going on with all the spam (?) messages?

@kylewhirl
Copy link
Author

/check

@github-actions github-actions bot added pending the label given to a new verification/icon request and removed awaiting-changes use after review has started - awaiting user to make changes to plugin labels Aug 28, 2024
Copy link

🟢 The following checks passed:

  • Installation: successfully installed
  • Package JSON: homepage exists
  • Package JSON: bugs.url exists and seems a valid URL
  • Package JSON: keywords exist and contain 'homebridge-plugin'
  • Package JSON: 'preinstall' in scripts is not present
  • Package JSON: 'install' in scripts is not present
  • Package JSON: 'postinstall' in scripts is not present
  • Package JSON: engines.node property is compatible with Node 18
  • Package JSON: engines.node property is compatible with Node 20
  • Package JSON: engines.homebridge property is compatible with Homebridge 1.8.4
  • Package JSON: initializer function found
  • GitHub Repo: repository is public
  • GitHub Repo: repository is not archived
  • GitHub Repo: issues are enabled
  • GitHub Repo: contains releases
  • NPM Package: has not been deprecated
  • Config Schema JSON: exists and is valid JSON
  • Config Schema JSON: contains a valid pluginAlias
  • Config Schema JSON: the pluginType is set to 'platform'
  • Config Schema JSON: contains a name schema property
  • Dependencies: homebridge was not installed as a dependency
  • Dependencies: hap-nodejs was not installed as a dependency

🎉 All checks passed successfully, nice work! Your plugin and/or icon will now be manually reviewed by the Homebridge team.

@kylewhirl kylewhirl changed the title Verification Request: homebridge- Verification Request: homebridge-tovala Aug 28, 2024
@bwp91
Copy link
Contributor

bwp91 commented Sep 22, 2024

Hi @kylewhirl I would like to suggest adding a .gitignore file into your plugin and adding at least the following

dist
node_modules
.DS_Store

It is not normal (and not needed) to have these files/folders as part of the github repo.

@bwp91
Copy link
Contributor

bwp91 commented Sep 22, 2024

/check

Copy link

🟢 The following checks passed:

  • Installation: successfully installed
  • Package JSON: homepage exists
  • Package JSON: bugs.url exists and seems a valid URL
  • Package JSON: keywords exist and contain 'homebridge-plugin'
  • Package JSON: 'preinstall' in scripts is not present
  • Package JSON: 'install' in scripts is not present
  • Package JSON: 'postinstall' in scripts is not present
  • Package JSON: engines.node property is compatible with Node 18
  • Package JSON: engines.node property is compatible with Node 20
  • Package JSON: engines.homebridge property is compatible with Homebridge 1.8.4
  • Package JSON: initializer function found
  • GitHub Repo: repository is public
  • GitHub Repo: repository is not archived
  • GitHub Repo: issues are enabled
  • GitHub Repo: contains releases
  • NPM Package: has not been deprecated
  • Config Schema JSON: exists and is valid JSON
  • Config Schema JSON: contains a valid pluginAlias
  • Config Schema JSON: the pluginType is set to 'platform'
  • Config Schema JSON: contains a name schema property
  • Dependencies: homebridge was not installed as a dependency
  • Dependencies: hap-nodejs was not installed as a dependency

🎉 All checks passed successfully, nice work! Your plugin and/or icon will now be manually reviewed by the Homebridge team.

@bwp91 bwp91 added currently-reviewing use for starting a review - adds a comment with the verification list with empty checkboxes and removed pending the label given to a new verification/icon request labels Sep 22, 2024
Copy link

github-actions bot commented Sep 22, 2024

  • General
    • The plugin must be of type dynamic platform.
    • The plugin must not offer the same nor less functionality than that of any existing verified plugin.
  • Repo
    • The plugin must be published to NPM and the source code available on a GitHub repository, with issues enabled.
    • A GitHub release should be created for every new version of your plugin, with release notes.
  • Environment
    • The plugin must run on all supported LTS versions of Node.js, at the time of writing this is Node v18 and v20.
    • The plugin must successfully install and not start unless it is configured.
    • The plugin must not execute post-install scripts that modify the users' system in any way.
    • The plugin must not require the user to run Homebridge in a TTY or with non-standard startup parameters, even for initial configuration.
  • Codebase
    • The plugin must implement the Homebridge Plugin Settings GUI.
    • The plugin must not contain any analytics or calls that enable you to track the user.
    • If the plugin needs to write files to disk (cache, keys, etc.), it must store them inside the Homebridge storage directory.
    • The plugin must not throw unhandled exceptions, the plugin must catch and log its own errors.

@bwp91
Copy link
Contributor

bwp91 commented Sep 22, 2024

The only other thing I would suggest is slightly shorter logs on the event on an HTTP request failure. For example here I used invalid credentials to test the plugin, and is great that the plugin catches the error instead of crashing, but the resulting logs are:

[22/09/2024, 10:10:26] [TovalaOven] Authentication failed: AxiosError: Request failed with status code 401
    at settle (file:///usr/local/lib/node_modules/homebridge-tovala/node_modules/axios/lib/core/settle.js:19:12)
    at Unzip.handleStreamEnd (file:///usr/local/lib/node_modules/homebridge-tovala/node_modules/axios/lib/adapters/http.js:599:11)
    at Unzip.emit (node:events:531:35)
    at endReadableNT (node:internal/streams/readable:1698:12)
    at processTicksAndRejections (node:internal/process/task_queues:90:21)
    at Axios.request (file:///usr/local/lib/node_modules/homebridge-tovala/node_modules/axios/lib/core/Axios.js:45:41)
    at processTicksAndRejections (node:internal/process/task_queues:105:5)
    at TovalaSmartOvenPlatform.authenticate (file:///usr/local/lib/node_modules/homebridge-tovala/src/platform.ts:58:24)
    at TovalaSmartOvenPlatform.initializePlatform (file:///usr/local/lib/node_modules/homebridge-tovala/src/platform.ts:37:21)
    at HomebridgeAPI.<anonymous> (file:///usr/local/lib/node_modules/homebridge-tovala/src/platform.ts:31:7) {
  code: 'ERR_BAD_REQUEST',
  config: {
    transitional: {
      silentJSONParsing: true,
      forcedJSONParsing: true,
      clarifyTimeoutError: false
    },
    adapter: [ 'xhr', 'http', 'fetch' ],
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 0,
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    env: { FormData: [Function], Blob: [class Blob] },
    validateStatus: [Function: validateStatus],
    headers: Object [AxiosHeaders] {
      Accept: 'application/json',
      'Content-Type': 'application/json',
      'X-Tovala-AppID': 'MyTovala',
      'User-Agent': 'axios/1.7.7',
      'Content-Length': '53',
      'Accept-Encoding': 'gzip, compress, deflate, br'
    },
    method: 'post',
    url: 'https://api.tovala.com/v0/getToken',
    data: '{"email":"njnjkn","password":"jhjkhjk","type":"user"}'
  },
  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: false,
    chunkedEncoding: false,
    shouldKeepAlive: true,
    maxRequestsOnConnectionReached: false,
    _defaultKeepAlive: true,
    useChunkedEncodingByDefault: true,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    strictContentLength: false,
    _contentLength: '53',
    _hasBody: true,
    _trailer: '',
    finished: true,
    _headerSent: true,
    _closed: true,
    _header: 'POST /v0/getToken HTTP/1.1\r\n' +
      'Accept: application/json\r\n' +
      'Content-Type: application/json\r\n' +
      'X-Tovala-AppID: MyTovala\r\n' +
      'User-Agent: axios/1.7.7\r\n' +
      'Content-Length: 53\r\n' +
      'Accept-Encoding: gzip, compress, deflate, br\r\n' +
      'Host: api.tovala.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,
      defaultPort: 443,
      protocol: 'https:',
      options: [Object: null prototype],
      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,
      maxCachedSessions: 100,
      _sessionCache: [Object],
      [Symbol(shapeMode)]: false,
      [Symbol(kCapture)]: false
    },
    socketPath: undefined,
    method: 'POST',
    maxHeaderSize: undefined,
    insecureHTTPParser: undefined,
    joinDuplicateHeaders: undefined,
    path: '/v0/getToken',
    _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://api.tovala.com/v0/getToken',
      redirects: [],
      [Symbol(shapeMode)]: true,
      [Symbol(kCapture)]: false,
      [Symbol(kHeaders)]: [Object],
      [Symbol(kHeadersCount)]: 18,
      [Symbol(kTrailers)]: null,
      [Symbol(kTrailersCount)]: 0
    },
    aborted: false,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    reusedSocket: false,
    host: 'api.tovala.com',
    protocol: 'https:',
    _redirectable: Writable {
      _events: [Object],
      _writableState: [WritableState],
      _maxListeners: undefined,
      _options: [Object],
      _ended: true,
      _ending: true,
      _redirectCount: 0,
      _redirects: [],
      _requestBodyLength: 53,
      _requestBodyBuffers: [],
      _eventsCount: 3,
      _onNativeResponse: [Function (anonymous)],
      _currentRequest: [Circular *1],
      _currentUrl: 'https://api.tovala.com/v0/getToken',
      [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: 'api.tovala.com',
      alpnProtocol: false,
      authorized: true,
      authorizationError: null,
      encrypted: true,
      _events: [Object: null prototype],
      _eventsCount: 9,
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'api.tovala.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: 3047,
        _onTimeout: [Function: bound ],
        _timerArgs: undefined,
        _repeat: null,
        _destroyed: false,
        [Symbol(refed)]: false,
        [Symbol(kHasPrimitive)]: false,
        [Symbol(asyncId)]: 495,
        [Symbol(triggerId)]: 493,
        [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],
      'x-tovala-appid': [Array],
      'user-agent': [Array],
      'content-length': [Array],
      'accept-encoding': [Array],
      host: [Array]
    },
    [Symbol(errored)]: null,
    [Symbol(kHighWaterMark)]: 65536,
    [Symbol(kRejectNonStandardBodyWrites)]: false,
    [Symbol(kUniqueHeaders)]: null
  },
  response: {
    status: 401,
    statusText: 'Unauthorized',
    headers: Object [AxiosHeaders] {
      'content-type': 'application/json',
      date: 'Sun, 22 Sep 2024 09:10:26 GMT',
      server: 'nginx/1.18.0',
      vary: 'Accept-Encoding',
      'x-powered-by': 'friendship',
      'x-request-id': 'ip-172-31-42-96/dPpm7azqCo-556306',
      'content-length': '70',
      connection: 'keep-alive'
    },
    config: {
      transitional: [Object],
      adapter: [Array],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 0,
      xsrfCookieName: 'XSRF-TOKEN',
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      maxBodyLength: -1,
      env: [Object],
      validateStatus: [Function: validateStatus],
      headers: [Object [AxiosHeaders]],
      method: 'post',
      url: 'https://api.tovala.com/v0/getToken',
      data: '{"email":"njnjkn","password":"jhjkhjk","type":"user"}'
    },
    request: <ref *1> ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 7,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      destroyed: true,
      _last: false,
      chunkedEncoding: false,
      shouldKeepAlive: true,
      maxRequestsOnConnectionReached: false,
      _defaultKeepAlive: true,
      useChunkedEncodingByDefault: true,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      strictContentLength: false,
      _contentLength: '53',
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      _closed: true,
      _header: 'POST /v0/getToken HTTP/1.1\r\n' +
        'Accept: application/json\r\n' +
        'Content-Type: application/json\r\n' +
        'X-Tovala-AppID: MyTovala\r\n' +
        'User-Agent: axios/1.7.7\r\n' +
        'Content-Length: 53\r\n' +
        'Accept-Encoding: gzip, compress, deflate, br\r\n' +
        'Host: api.tovala.com\r\n' +
        'Connection: keep-alive\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: nop],
      agent: [Agent],
      socketPath: undefined,
      method: 'POST',
      maxHeaderSize: undefined,
      insecureHTTPParser: undefined,
      joinDuplicateHeaders: undefined,
      path: '/v0/getToken',
      _ended: true,
      res: [IncomingMessage],
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'api.tovala.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: { message: 'UnauthorizedRequest', error: true }
  },
  status: 401
}
[22/09/2024, 10:10:26] [TovalaOven] Failed to initialize platform: AxiosError: Request failed with status code 401
    at settle (file:///usr/local/lib/node_modules/homebridge-tovala/node_modules/axios/lib/core/settle.js:19:12)
    at Unzip.handleStreamEnd (file:///usr/local/lib/node_modules/homebridge-tovala/node_modules/axios/lib/adapters/http.js:599:11)
    at Unzip.emit (node:events:531:35)
    at endReadableNT (node:internal/streams/readable:1698:12)
    at processTicksAndRejections (node:internal/process/task_queues:90:21)
    at Axios.request (file:///usr/local/lib/node_modules/homebridge-tovala/node_modules/axios/lib/core/Axios.js:45:41)
    at processTicksAndRejections (node:internal/process/task_queues:105:5)
    at TovalaSmartOvenPlatform.authenticate (file:///usr/local/lib/node_modules/homebridge-tovala/src/platform.ts:58:24)
    at TovalaSmartOvenPlatform.initializePlatform (file:///usr/local/lib/node_modules/homebridge-tovala/src/platform.ts:37:21)
    at HomebridgeAPI.<anonymous> (file:///usr/local/lib/node_modules/homebridge-tovala/src/platform.ts:31:7) {
  code: 'ERR_BAD_REQUEST',
  config: {
    transitional: {
      silentJSONParsing: true,
      forcedJSONParsing: true,
      clarifyTimeoutError: false
    },
    adapter: [ 'xhr', 'http', 'fetch' ],
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 0,
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    env: { FormData: [Function], Blob: [class Blob] },
    validateStatus: [Function: validateStatus],
    headers: Object [AxiosHeaders] {
      Accept: 'application/json',
      'Content-Type': 'application/json',
      'X-Tovala-AppID': 'MyTovala',
      'User-Agent': 'axios/1.7.7',
      'Content-Length': '53',
      'Accept-Encoding': 'gzip, compress, deflate, br'
    },
    method: 'post',
    url: 'https://api.tovala.com/v0/getToken',
    data: '{"email":"njnjkn","password":"jhjkhjk","type":"user"}'
  },
  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: false,
    chunkedEncoding: false,
    shouldKeepAlive: true,
    maxRequestsOnConnectionReached: false,
    _defaultKeepAlive: true,
    useChunkedEncodingByDefault: true,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    strictContentLength: false,
    _contentLength: '53',
    _hasBody: true,
    _trailer: '',
    finished: true,
    _headerSent: true,
    _closed: true,
    _header: 'POST /v0/getToken HTTP/1.1\r\n' +
      'Accept: application/json\r\n' +
      'Content-Type: application/json\r\n' +
      'X-Tovala-AppID: MyTovala\r\n' +
      'User-Agent: axios/1.7.7\r\n' +
      'Content-Length: 53\r\n' +
      'Accept-Encoding: gzip, compress, deflate, br\r\n' +
      'Host: api.tovala.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,
      defaultPort: 443,
      protocol: 'https:',
      options: [Object: null prototype],
      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,
      maxCachedSessions: 100,
      _sessionCache: [Object],
      [Symbol(shapeMode)]: false,
      [Symbol(kCapture)]: false
    },
    socketPath: undefined,
    method: 'POST',
    maxHeaderSize: undefined,
    insecureHTTPParser: undefined,
    joinDuplicateHeaders: undefined,
    path: '/v0/getToken',
    _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://api.tovala.com/v0/getToken',
      redirects: [],
      [Symbol(shapeMode)]: true,
      [Symbol(kCapture)]: false,
      [Symbol(kHeaders)]: [Object],
      [Symbol(kHeadersCount)]: 18,
      [Symbol(kTrailers)]: null,
      [Symbol(kTrailersCount)]: 0
    },
    aborted: false,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    reusedSocket: false,
    host: 'api.tovala.com',
    protocol: 'https:',
    _redirectable: Writable {
      _events: [Object],
      _writableState: [WritableState],
      _maxListeners: undefined,
      _options: [Object],
      _ended: true,
      _ending: true,
      _redirectCount: 0,
      _redirects: [],
      _requestBodyLength: 53,
      _requestBodyBuffers: [],
      _eventsCount: 3,
      _onNativeResponse: [Function (anonymous)],
      _currentRequest: [Circular *1],
      _currentUrl: 'https://api.tovala.com/v0/getToken',
      [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: 'api.tovala.com',
      alpnProtocol: false,
      authorized: true,
      authorizationError: null,
      encrypted: true,
      _events: [Object: null prototype],
      _eventsCount: 9,
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'api.tovala.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: 3047,
        _onTimeout: [Function: bound ],
        _timerArgs: undefined,
        _repeat: null,
        _destroyed: false,
        [Symbol(refed)]: false,
        [Symbol(kHasPrimitive)]: false,
        [Symbol(asyncId)]: 495,
        [Symbol(triggerId)]: 493,
        [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],
      'x-tovala-appid': [Array],
      'user-agent': [Array],
      'content-length': [Array],
      'accept-encoding': [Array],
      host: [Array]
    },
    [Symbol(errored)]: null,
    [Symbol(kHighWaterMark)]: 65536,
    [Symbol(kRejectNonStandardBodyWrites)]: false,
    [Symbol(kUniqueHeaders)]: null
  },
  response: {
    status: 401,
    statusText: 'Unauthorized',
    headers: Object [AxiosHeaders] {
      'content-type': 'application/json',
      date: 'Sun, 22 Sep 2024 09:10:26 GMT',
      server: 'nginx/1.18.0',
      vary: 'Accept-Encoding',
      'x-powered-by': 'friendship',
      'x-request-id': 'ip-172-31-42-96/dPpm7azqCo-556306',
      'content-length': '70',
      connection: 'keep-alive'
    },
    config: {
      transitional: [Object],
      adapter: [Array],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 0,
      xsrfCookieName: 'XSRF-TOKEN',
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      maxBodyLength: -1,
      env: [Object],
      validateStatus: [Function: validateStatus],
      headers: [Object [AxiosHeaders]],
      method: 'post',
      url: 'https://api.tovala.com/v0/getToken',
      data: '{"email":"njnjkn","password":"jhjkhjk","type":"user"}'
    },
    request: <ref *1> ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 7,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      destroyed: true,
      _last: false,
      chunkedEncoding: false,
      shouldKeepAlive: true,
      maxRequestsOnConnectionReached: false,
      _defaultKeepAlive: true,
      useChunkedEncodingByDefault: true,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      strictContentLength: false,
      _contentLength: '53',
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      _closed: true,
      _header: 'POST /v0/getToken HTTP/1.1\r\n' +
        'Accept: application/json\r\n' +
        'Content-Type: application/json\r\n' +
        'X-Tovala-AppID: MyTovala\r\n' +
        'User-Agent: axios/1.7.7\r\n' +
        'Content-Length: 53\r\n' +
        'Accept-Encoding: gzip, compress, deflate, br\r\n' +
        'Host: api.tovala.com\r\n' +
        'Connection: keep-alive\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: nop],
      agent: [Agent],
      socketPath: undefined,
      method: 'POST',
      maxHeaderSize: undefined,
      insecureHTTPParser: undefined,
      joinDuplicateHeaders: undefined,
      path: '/v0/getToken',
      _ended: true,
      res: [IncomingMessage],
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'api.tovala.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: { message: 'UnauthorizedRequest', error: true }
  },
  status: 401
}

@bwp91 bwp91 added verified use when a plugin meets the criteria - adds the verified badge text and removed currently-reviewing use for starting a review - adds a comment with the verification list with empty checkboxes labels Sep 22, 2024
Copy link

Congratulations! Your plugin has been verified!

You can now add one of the Verified by Homebridge badges to your plugin's README:

verified-by-homebridge

[![verified-by-homebridge](https://badgen.net/badge/homebridge/verified/purple)](https://github.com/homebridge/homebridge/wiki/Verified-Plugins)

verified-by-homebridge

[![verified-by-homebridge](https://img.shields.io/badge/homebridge-verified-blueviolet?color=%23491F59&style=for-the-badge&logoColor=%23FFFFFF&logo=homebridge)](https://github.com/homebridge/homebridge/wiki/Verified-Plugins)

Your plugin is now also eligible to display a ❤️ Donate button on its tile in the Homebridge UI. See https://github.com/homebridge/homebridge/wiki/Donation-Links for instructions.

If for any reason in the future you can no longer maintain your plugin, please consider transferring it to our unmaintained plugins repo. We can take ownership until another willing developer comes along.

Don't forget to join the official Homebridge Discord server, where plugin developers can get tips and advice from other developers and the Homebridge project team in the #plugin-development channel!

As a verified plugin, you can request a channel in the Discord server to discuss your plugin with users and other developers. Just ask in the #plugin-development channel.

Thank you for your contribution to the Homebridge community.

  • The Homebridge Team

bwp91 added a commit that referenced this issue Sep 22, 2024
@bwp91
Copy link
Contributor

bwp91 commented Sep 22, 2024

My two comments above are not part of the verification criteria so have verified the plugin 👍

@bwp91 bwp91 closed this as completed Sep 22, 2024
@kylewhirl
Copy link
Author

Okay I’ll fix both of those, thank you!

@kylewhirl
Copy link
Author

Also, the plugin icon is not showing in Homebridge but the plugin is shown is verified. Do I need to do anything to get it to show?

@bwp91
Copy link
Contributor

bwp91 commented Sep 22, 2024

Screenshot 2024-09-22 at 20 11 47

it's working for me - is it still not working for you?

You don't need to do anything extra

@kylewhirl
Copy link
Author

It’s working now, thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
verified use when a plugin meets the criteria - adds the verified badge text
Projects
None yet
Development

No branches or pull requests

4 participants
@bwp91 @kylewhirl and others