{"id":18645914,"url":"https://github.com/humpheh/nest-observe","last_synced_at":"2025-10-12T03:36:54.907Z","repository":{"id":35162139,"uuid":"214865741","full_name":"Humpheh/nest-observe","owner":"Humpheh","description":"Unofficial API for observing Google Nest devices which works with Google authentication","archived":false,"fork":false,"pushed_at":"2022-06-25T08:23:45.000Z","size":61,"stargazers_count":13,"open_issues_count":5,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-12T03:36:50.799Z","etag":null,"topics":["api","google-auth","google-nest","nest","nest-thermostat","nest-thermostat-e","nest-thermostat-temperature"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Humpheh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-10-13T17:46:29.000Z","updated_at":"2024-07-09T12:31:45.000Z","dependencies_parsed_at":"2022-09-11T07:00:31.933Z","dependency_job_id":null,"html_url":"https://github.com/Humpheh/nest-observe","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Humpheh/nest-observe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Humpheh%2Fnest-observe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Humpheh%2Fnest-observe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Humpheh%2Fnest-observe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Humpheh%2Fnest-observe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Humpheh","download_url":"https://codeload.github.com/Humpheh/nest-observe/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Humpheh%2Fnest-observe/sbom","scorecard":{"id":63820,"data":{"date":"2025-08-11","repo":{"name":"github.com/Humpheh/nest-observe","commit":"62205bb426be0d95718b7d54276093aa4e6aeffc"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/2 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-w7rc-rwvf-8q5r","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-15T02:13:17.326Z","repository_id":35162139,"created_at":"2025-08-15T02:13:17.326Z","updated_at":"2025-08-15T02:13:17.326Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279010144,"owners_count":26084692,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-12T02:00:06.719Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","google-auth","google-nest","nest","nest-thermostat","nest-thermostat-e","nest-thermostat-temperature"],"created_at":"2024-11-07T06:17:38.153Z","updated_at":"2025-10-12T03:36:54.853Z","avatar_url":"https://github.com/Humpheh.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# nest-observe\n\n\u003e Unofficial API for observing Google Nest devices which works with Google authentication\n\nIt provides a simple interface to create an event emitter which will stream updates whenever\na device in your home changes.\n\n## About\n\nThis repository contains a proof-of-concept library that uses the https://home.nest.com\ngrpc-web API to observe Nest devices. This is the same API that is used on the app \nhomepage, which comes with a few of benefits:\n\n- Access to data using a Google authenticated account (Nest API access was recently removed \n  for migrated accounts)\n- Access to data from the EU/UK version of the _Nest Thermostat E_, which is unavailable \n  through the official API\n  \nThis library was created by examining the https://home.nest.com source code to retrieve \nprotobuf specs for the publically exposed `GatewayService` used by the app. \nThe library pretends to be a client on the web app to access the api. I have used it \nhere solely for the `Observe` rpc call, which is a streaming endpoint that pushes new states\nof devices in your home to the client, other endpoints exist on the service which may allow\nfor updating the state of the home, however this is yet to be explored (feel free to open\na PR!).\n\nThe endpoint returns a list of 'traits' for each device in the home. This includes information\nsuch as current temperature, current humidity, room names, device names, target temperatures,\neco modes and more.\n\nCaveats about this library:\n- This has only been tested in a home using EU/UK versions of the Nest Thermostat E and \n  Heat Link E. While it has been shown to provide access to this data, it would be good \n  to confirm what other devices work with this.\n- Not all of the trait protobuf specs have been implemented. Please feel free to open am\n  issue/PR to add them, or contact me about my method of extracting the protobuf \n  specs from the source code.\n  \nThere is still a lot of opportunity for this method of accessing your nest data - \nplease feel free to contribute!\n\n## Installation\n\n```\nnpm install nest-observe\n```\n\n## Usage\n\nAuthentication is done using the method outlined by the `homebridge-nest` library to retrieve\nthe values for `issueToken`, `cookie` and `apikey`. Thankfully\nyou will only need to do this once _(note that the other authentication methods on that \npage are currently unsupported)_: \nhttps://github.com/chrisjshull/homebridge-nest#using-a-google-account\n\n```js\nconst { authGoogle, observe } = require('nest-observe');\n\n// Use auth details to get JWT token. Returned object contains {token, expiry, refresh}\n// where refresh is a function to get a new token object\nconst token = await authGoogle(issueToken, cookie, apikey);\n\n// Create the observer. Can also be done using promises\nconst observer = await observe(token.token, {\n    protobuf: false, // set true to return protobuf object as value\n    debug: false // set true to log a lot more\n});\n\n// Event emitted for new updates which include only the new values\nobserver.on('data', state =\u003e {\n    console.log('New state:', state);\n});\n\n// Event emitted when the streaming is stopped \nobserver.on('end', () =\u003e {\n    console.log('Streaming ended');\n});\n```\n\nFor each data event, the state is an object which contains mappings of `DEVICE/STRUCTURE` to\nvalues. An example of the state:\n\n```json5\n{\n  \"DEVICE_XXXX\": {\n     \"traits\": [\n       { \n         // Name of the protobuf trait type\n         \"type\": \"nest.trait.sensor.TemperatureTrait\",\n\n         // Label provided by observe endpoint\n         \"label\": \"temperature\",\n\n         // Value of the trait (spec is defined in the .proto files)\n         \"value\": {\n            \"temperatureValue\": {\n               \"temperature\": {\n                  \"value\": 19.8700008392334\n               }\n            }\n         }\n       },\n        // ...  \n     ],\n\n     // List of traits which have no corresponding protobuf spec yet\n     \"ignored\": [\n       {\n          // Name of the protobuf trait type\n          \"type\": \"nest.trait.hvac.UtilitySettingsTrait\",\n\n          // Base64 encoded message\n          \"value\": \"CAEQARgB\"\n       },\n       // ...\n     ],\n    },\n    // more devices and structures...\n}\n```\n\n## Feedback\n\nThere is a lot more we could do with this library and it is still very young and buggy. Please \nfeel free to contribute or contact me!\n\n## Acknowledgement\n\nThanks to https://github.com/chrisjshull/homebridge-nest for the method of authenticating to\nGoogle.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhumpheh%2Fnest-observe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhumpheh%2Fnest-observe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhumpheh%2Fnest-observe/lists"}