{"id":13799958,"url":"https://github.com/andrei-tatar/node-red-contrib-smartnora","last_synced_at":"2026-01-28T05:19:38.636Z","repository":{"id":41111465,"uuid":"330404071","full_name":"andrei-tatar/node-red-contrib-smartnora","owner":"andrei-tatar","description":"Node Red Google Home integration","archived":false,"fork":false,"pushed_at":"2025-11-23T09:03:06.000Z","size":3123,"stargazers_count":113,"open_issues_count":2,"forks_count":25,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-11-23T09:20:02.765Z","etag":null,"topics":["google-home","google-home-assistant","node-red"],"latest_commit_sha":null,"homepage":"https://smart-nora.eu/","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andrei-tatar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-01-17T14:02:15.000Z","updated_at":"2025-11-23T09:03:06.000Z","dependencies_parsed_at":"2024-01-05T21:04:45.951Z","dependency_job_id":"9478b31e-2d88-4777-ba5c-037faeb03d3d","html_url":"https://github.com/andrei-tatar/node-red-contrib-smartnora","commit_stats":{"total_commits":322,"total_committers":5,"mean_commits":64.4,"dds":"0.11801242236024845","last_synced_commit":"fdd265680db32d6ceba22a2bb5a133ae6fb429bf"},"previous_names":[],"tags_count":90,"template":false,"template_full_name":null,"purl":"pkg:github/andrei-tatar/node-red-contrib-smartnora","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrei-tatar%2Fnode-red-contrib-smartnora","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrei-tatar%2Fnode-red-contrib-smartnora/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrei-tatar%2Fnode-red-contrib-smartnora/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrei-tatar%2Fnode-red-contrib-smartnora/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andrei-tatar","download_url":"https://codeload.github.com/andrei-tatar/node-red-contrib-smartnora/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrei-tatar%2Fnode-red-contrib-smartnora/sbom","scorecard":{"id":192678,"data":{"date":"2025-08-11","repo":{"name":"github.com/andrei-tatar/node-red-contrib-smartnora","commit":"b0aef0402c9d553ffab5711b43c881d5383d0219"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.6,"checks":[{"name":"Maintained","score":3,"reason":"0 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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/30 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":"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":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/node.js.yml:1","Warn: no topLevel permission defined: .github/workflows/npm-publish.yml:1","Warn: no topLevel permission defined: .github/workflows/stale.yml:1","Info: no jobLevel write permissions found"],"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node.js.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/andrei-tatar/node-red-contrib-smartnora/node.js.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node.js.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/andrei-tatar/node-red-contrib-smartnora/node.js.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/andrei-tatar/node-red-contrib-smartnora/npm-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/andrei-tatar/node-red-contrib-smartnora/npm-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/stale.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/andrei-tatar/node-red-contrib-smartnora/stale.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/node.js.yml:30","Warn: npmCommand not pinned by hash: .github/workflows/npm-publish.yml:20","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 npmCommand dependencies pinned"],"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":"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":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"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":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-xffm-g5w8-qvg7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw"],"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-16T21:07:24.324Z","repository_id":41111465,"created_at":"2025-08-16T21:07:24.324Z","updated_at":"2025-08-16T21:07:24.324Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28840088,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T02:10:51.810Z","status":"ssl_error","status_checked_at":"2026-01-28T02:10:50.806Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["google-home","google-home-assistant","node-red"],"created_at":"2024-08-04T00:01:07.666Z","updated_at":"2026-01-28T05:19:38.617Z","avatar_url":"https://github.com/andrei-tatar.png","language":"HTML","funding_links":[],"categories":["Nodes"],"sub_categories":["Smarthome"],"readme":"Smart NORA integration plugin for Node RED\n=====================\n\n[![Node.js CI](https://github.com/andrei-tatar/node-red-contrib-smartnora/actions/workflows/node.js.yml/badge.svg)](https://github.com/andrei-tatar/node-red-contrib-smartnora/actions/workflows/node.js.yml)\n[![npm](https://img.shields.io/npm/v/node-red-contrib-smartnora.svg?logo=npm)](https://www.npmjs.com/package/node-red-contrib-smartnora)\n[![GitHub last commit](https://img.shields.io/github/last-commit/andrei-tatar/node-red-contrib-smartnora)](https://github.com/andrei-tatar/node-red-contrib-smartnora/commits/master)\n[![downloads](https://img.shields.io/npm/dm/node-red-contrib-smartnora.svg)](https://www.npmjs.com/package/node-red-contrib-smartnora)\n\nThis module provides a set of nodes in Node-RED for Google smart home Action integration via [Smart NORA](https://smart-nora.eu/).\n\n## Features\n- support for multiple devices/traits (On/Off, Brightness, Color, Open/Close, etc.) and many more to come\n- local execution path to reduce latency to a minimum\n- web push notifications to mobile devices so you don't need yet another service to be informed about the important things\n- better performance with capability of scaling up for tens of thousands of users\n\n## Smart NORA is NOT\n- a way to directly interface to your devices added to Google Home. If you already have devices linked to your Google Home from other providers, there is no way for NORA to control them. This package only provides new virtual devices in Node-RED and it's your job to link them together with the real devices you may want to control.\n- a way to create custom conversations with Google. Smart NORA implements the [Google Smart Home](https://developers.google.com/assistant/smarthome/overview) API which comes with predefined device types/traits/commands/responses. Everything that falls outside of this API can't be done with Smart NORA.\n\n## Setup\n\n[Here's a short guide](./doc/setup/README.md) on how to get started with Smart NORA.\n\n## Subscription\n\nA paid subscription is required to have more than 5 devices synchronized with Google Home. This was added to cover the cloud costs of the service, the business overhead (starting and owning a business, accounting, taxes, VAT, payment processor fees, etc.), offer a bit of support to the ongoing development and hopefully a beer or two at the end of the month 🍻.\n\nThere are two ways of using the service:\n1. Free. This will limit the devices synced with Google to **5**. There is no way to determine which will be synced if you have more than 5 devices defined in node-red (note that not all nodes are a device).\n2. Subscription based (monthly or yearly recurring payment) integration via Stripe. \n\nOnce you create a subscription, you can cancel/change it at any time from https://smart-nora.eu/my-nora. You will see a *Manage subscription* button that will take you to Stripe Customer Portal where you can cancel, change the plan (monthly vs yearly), change billing information, etc.\n\nCanceling a subscription maintains it active until the end of the paid period, it's not immediate. So if you pay for one year and don't want a recurring payment, you can just cancel it and the subscription will remain active for the rest of the year. \n\n**Please use first the free subscription**, check that NORA works on your setup, play with the devices you may want to use and only once you are satisfied with everything, upgrade to a paid subscription. \n\n## Supported nodes\n\n[Here's a list](./doc/nodes) and documentation on the supported nodes. \nIf a device that you want is not on the list, you can [create a new discussion](https://github.com/andrei-tatar/node-red-contrib-smartnora/discussions/new) to discuss it. Contributions are appreciated, especially around the node-red configuration node code (html file) and documentation.\n\n## Changelog\n\nYou can see all the releases and the changes made over on the [releases page](https://github.com/andrei-tatar/node-red-contrib-smartnora/releases).\n\n## Discussions\n\n[Github Discussions](https://github.com/andrei-tatar/node-red-contrib-smartnora/discussions)\n\n## I'm having an issue\n\nFor any issues you might encounter, please check the [FAQ section](./doc/faq/README.md), check [the existing issues](https://github.com/andrei-tatar/node-red-contrib-smartnora/issues) or [open a new issue](https://github.com/andrei-tatar/node-red-contrib-smartnora/issues/new/choose) on this repository.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrei-tatar%2Fnode-red-contrib-smartnora","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandrei-tatar%2Fnode-red-contrib-smartnora","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrei-tatar%2Fnode-red-contrib-smartnora/lists"}