├── .github ├── ISSUE_TEMPLATE.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .jscsrc ├── .jshintrc ├── .npmignore ├── .travis.yml ├── Gruntfile.js ├── LICENSE ├── README.md ├── aws ├── LICENSE ├── README.md ├── aws.html ├── aws.js ├── icons │ └── amazon.png ├── locales │ ├── de │ │ └── aws.json │ └── en-US │ │ ├── aws.html │ │ └── aws.json └── package.json ├── box ├── LICENSE ├── README.md ├── box.html ├── box.js ├── locales │ └── en-US │ │ ├── box.html │ │ └── box.json └── package.json ├── darksky ├── LICENSE ├── README.md ├── darksky.html ├── darksky.js ├── locales │ └── en-US │ │ ├── darksky.html │ │ └── darksky.json └── package.json ├── delicious ├── LICENSE ├── README.md ├── delicious.html ├── delicious.js ├── icons │ └── delicious.png ├── locales │ └── en-US │ │ ├── delicious.html │ │ └── delicious.json └── package.json ├── dropbox ├── LICENSE ├── README.md ├── dropbox.html ├── dropbox.js ├── icons │ └── dropbox.png ├── locales │ ├── de │ │ └── dropbox.json │ └── en-US │ │ ├── dropbox.html │ │ └── dropbox.json ├── package.json └── resources │ └── sha256.js ├── fitbit ├── LICENSE ├── README.md ├── fitbit.html ├── fitbit.js ├── locales │ ├── de │ │ └── fitbit.json │ └── en-US │ │ ├── fitbit.html │ │ └── fitbit.json └── package.json ├── flickr ├── LICENSE ├── README.md ├── flickr.html ├── flickr.js ├── icons │ └── flickr.png ├── locales │ ├── de │ │ └── flickr.json │ └── en-US │ │ ├── flickr.html │ │ └── flickr.json └── package.json ├── forecast ├── LICENSE ├── README.md ├── forecastio.html ├── forecastio.js ├── locales │ └── en-US │ │ ├── forecastio.html │ │ └── forecastio.json └── package.json ├── foursquare ├── LICENSE ├── README.md ├── foursquare.html ├── foursquare.js ├── icons │ ├── foursquare.png │ └── swarm.png ├── locales │ └── en-US │ │ ├── foursquare.html │ │ ├── foursquare.json │ │ ├── swarm.html │ │ └── swarm.json ├── package.json ├── swarm.html └── swarm.js ├── google ├── LICENSE ├── README.md ├── calendar.html ├── calendar.js ├── directions.html ├── directions.js ├── geocoding.html ├── geocoding.js ├── google.html ├── google.js ├── icons │ ├── logo_maps.png │ └── logo_plus.png ├── locales │ ├── de │ │ ├── calendar.json │ │ ├── directions.json │ │ ├── geocoding.json │ │ ├── google.json │ │ ├── places.json │ │ └── plus.json │ └── en-US │ │ ├── calendar.html │ │ ├── calendar.json │ │ ├── directions.html │ │ ├── directions.json │ │ ├── geocoding.html │ │ ├── geocoding.json │ │ ├── google.json │ │ ├── places.html │ │ ├── places.json │ │ ├── plus.html │ │ └── plus.json ├── package.json ├── places.html ├── places.js ├── plus.html └── plus.js ├── instagram ├── LICENSE ├── README.md ├── icons │ └── instagram.png ├── instagram.html ├── instagram.js ├── locales │ ├── de │ │ └── instagram.json │ └── en-US │ │ ├── instagram.html │ │ └── instagram.json └── package.json ├── jawboneup ├── LICENSE ├── README.md ├── icons │ └── up.png ├── jawboneup.html ├── jawboneup.js ├── locales │ └── en-US │ │ ├── jawboneup.html │ │ └── jawboneup.json └── package.json ├── openweathermap ├── LICENSE ├── README.md ├── icons │ └── weather.png ├── locales │ ├── de │ │ └── weather.json │ └── en-US │ │ ├── weather.html │ │ └── weather.json ├── package.json ├── weather.html └── weather.js ├── package.json ├── pinboard ├── LICENSE ├── README.md ├── icons │ └── pinboard.png ├── locales │ └── en-US │ │ ├── pinboard.html │ │ └── pinboard.json ├── package.json ├── pinboard.html └── pinboard.js ├── strava ├── LICENSE ├── README.md ├── icons │ └── strava.png ├── locales │ ├── de │ │ └── strava.json │ └── en-US │ │ ├── strava.html │ │ └── strava.json ├── package.json ├── strava.html └── strava.js ├── test ├── aws │ └── aws_spec.js ├── box │ └── box_spec.js ├── darksky │ └── darksky_spec.js ├── delicious │ └── delicious_spec.js ├── dropbox │ └── dropbox_spec.js ├── fitbit │ └── fitbit_spec.js ├── flickr │ └── flickr_spec.js ├── forecast │ └── forecastio_spec.js ├── foursquare │ ├── foursquare_spec.js │ └── swarm_spec.js ├── google │ ├── calendar_spec.js │ ├── directions_spec.js │ ├── geocoding_spec.js │ ├── google_spec.js │ ├── places_spec.js │ └── plus_spec.js ├── instagram │ └── instagram_spec.js ├── jawboneup │ └── jawboneup_spec.js ├── openweathermap │ └── weather_spec.js ├── pinboard │ └── pinboard_spec.js ├── strava │ └── strava_spec.js └── tfl │ ├── tfl-bus_spec.js │ ├── tfl-underground-response.xml │ └── tfl-underground_spec.js ├── tfl ├── LICENSE ├── README.md ├── icons │ ├── tfl-bus.png │ └── train.png ├── locales │ └── en-US │ │ ├── tfl-bus.json │ │ └── tfl-underground.json ├── package.json ├── tfl-bus.html ├── tfl-bus.js ├── tfl-underground.html └── tfl-underground.js └── weatherunderground ├── LICENSE ├── README.md ├── icons └── wu.png ├── locales └── en-US │ └── wunder.json ├── package.json ├── wunder.html └── wunder.js /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 20 | 21 | ### Which node are you reporting an issue on? 22 | 23 | ### What are the steps to reproduce? 24 | 25 | ### What happens? 26 | 27 | ### What do you expect to happen? 28 | 29 | ### Please tell us about your environment: 30 | 31 | - [ ] Node-RED version: 32 | - [ ] node.js version: 33 | - [ ] npm version: 34 | - [ ] Platform/OS: 35 | - [ ] Browser: 36 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 12 | 13 | - [ ] Bugfix (non-breaking change which fixes an issue) 14 | - [ ] New feature (non-breaking change which adds functionality) 15 | 16 | 23 | 24 | ## Proposed changes 25 | 26 | 27 | 28 | ## Checklist 29 | 30 | 31 | - [ ] I have read the [contribution guidelines](https://github.com/node-red/node-red-nodes/blob/master/CONTRIBUTING.md) 32 | - [ ] For non-bugfix PRs, I have discussed this change on the forum/slack team. 33 | - [ ] I have run `grunt` to verify the unit tests pass 34 | - [ ] I have added suitable unit tests to cover the new/changed functionality 35 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .npm 2 | .jshintignore 3 | .project 4 | .settings 5 | .tern-project 6 | coverage 7 | node_modules 8 | npm_debug.log 9 | package-lock.json 10 | .DS_Store 11 | aws/node-red-node-aws-0.3.0.tgz 12 | -------------------------------------------------------------------------------- /.jscsrc: -------------------------------------------------------------------------------- 1 | { 2 | "fileExtensions": [ ".js", "jscs" ], 3 | "excludeFiles": [ "node_modules/**" ], 4 | "validateIndentation": 4, 5 | "disallowKeywordsOnNewLine": [], 6 | "disallowMixedSpacesAndTabs": true, 7 | "disallowMultipleSpaces": {"allowEOLComments": true}, 8 | "disallowNewlineBeforeBlockStatements": true, 9 | "disallowTabs": true, 10 | "disallowTrailingWhitespace": true, 11 | "requireCurlyBraces": true, 12 | //"requireKeywordsOnNewLine": ["else", "catch"], 13 | //"requireSemicolons": true, 14 | //"requireSpaceAfterBinaryOperators": true, 15 | //"requireSpaceAfterComma": {"allExcept": ["trailing"]}, 16 | "requireSpaceAfterKeywords": ["do","for","if","else","switch","case","try","while"], 17 | "requireSpaceBeforeBlockStatements": 1, 18 | "requireSpaceBeforeObjectValues": false, 19 | "requireSpacesInForStatement": true, 20 | "requireSpacesInFunction": { "beforeOpeningCurlyBrace": true }, 21 | //"validateParameterSeparator": ", ", 22 | //"validateQuoteMarks": false, 23 | "maximumLineLength": 280 24 | } 25 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "asi": true, // allow missing semicolons 3 | "curly": true, // require braces 4 | "eqnull": true, // ignore ==null 5 | //"eqeqeq": true, // enforce === 6 | "freeze": true, // don't allow override 7 | "indent": 4, // default indent of 4 8 | "forin": true, // require property filtering in "for in" loops 9 | "immed": true, // require immediate functions to be wrapped in ( ) 10 | "nonbsp": true, // warn on unexpected whitespace breaking chars 11 | //"strict": true, // commented out for now as it causes 100s of warnings, but want to get there eventually 12 | //"unused": true, // Check for unused functions and variables 13 | "loopfunc": true, // allow functions to be defined in loops 14 | //"expr": true, // allow ternery operator syntax... 15 | "shadow": true, // allow variable shadowing (re-use of names...) 16 | "sub": true, // don't warn that foo['bar'] should be written as foo.bar 17 | "proto": true, // allow setting of __proto__ in node < v0.12, 18 | "esversion": 11 // allow es11(ES2020) 19 | } 20 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .settings 2 | .jshintignore 3 | .jshintrc 4 | .project 5 | .tern-project 6 | .travis.yml 7 | .git 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | matrix: 4 | allow_failures: 5 | - node_js: 16 6 | include: 7 | - node_js: 16 8 | - node_js: 14 9 | - node_js: 12 10 | - node_js: 10 11 | before_install: 12 | - npm i -g npm 13 | before_script: 14 | # Remove the './node_modules/.bin:' entry, see https://github.com/travis-ci/travis-ci/issues/8813 15 | - export PATH=`echo ${PATH} | sed -re 's,(^|:)(./)?node_modules/.bin($|:),\1,'` 16 | - npm install -g nyc grunt-cli coveralls 17 | - npm install node-red 18 | script: 19 | # - istanbul cover grunt --report lcovonly && istanbul report text && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage 20 | - nyc grunt && nyc report --reporter=text-lcov | coveralls 21 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | 2 | // Configuration for Node-RED-web-nodes project 3 | module.exports = function(grunt) { 4 | 5 | // Project configuration. 6 | grunt.initConfig({ 7 | pkg: grunt.file.readJSON('package.json'), 8 | simplemocha: { 9 | options: { 10 | globals: ['expect'], 11 | timeout: 3000, 12 | ignoreLeaks: false, 13 | ui: 'bdd', 14 | reporter: 'spec' 15 | }, 16 | all: { src: ['test/*/*_spec.js'] } 17 | }, 18 | jshint: { 19 | options: { 20 | jshintrc:true // Use external jshinrc file configured as below 21 | // http://www.jshint.com/docs/options/ 22 | //"asi": true, // allow missing semicolons 23 | //"curly": true, // require braces 24 | //"eqnull": true, // ignore ==null 25 | //"forin": true, // require property filtering in "for in" loops 26 | //"immed": true, // require immediate functions to be wrapped in ( ) 27 | //"nonbsp": true, // warn on unexpected whitespace breaking chars 28 | ////"strict": true, // commented out for now as it causes 100s of warnings, but want to get there eventually 29 | //"loopfunc": true, // allow functions to be defined in loops 30 | //"sub": true // don't warn that foo['bar'] should be written as foo.bar 31 | }, 32 | all: { 33 | src: ['*/*.js'], 34 | filter: function(filepath) { // on some developer machines the test coverage HTML report utilities cause further failures 35 | if ((filepath.indexOf("coverage/") !== -1) || (filepath.indexOf("node_modules") !== -1)) { 36 | console.log( "\033[30m filtered out \033[32m:\033[37m " + filepath + "\033[0m"); 37 | return false; 38 | } else { 39 | return true; 40 | } 41 | } 42 | } 43 | }, 44 | inlinelint: { 45 | html: ['*/*.html'] 46 | } 47 | }); 48 | 49 | grunt.loadNpmTasks('grunt-simple-mocha'); 50 | grunt.loadNpmTasks('grunt-contrib-jshint'); 51 | grunt.loadNpmTasks('grunt-lint-inline'); 52 | 53 | grunt.registerTask('default', ['jshint:all', 'inlinelint:html', 'simplemocha:all']); 54 | }; 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | node-red-web-nodes 2 | ================== 3 | 4 | A collection of [node-red](http://nodered.org) nodes aimed at web services 5 | 6 | ### Installation 7 | 8 | This repository acts as an overall store for these nodes - and is not 9 | intended as a way to install them - unless you really do want some development. 10 | 11 | These nodes are separated into individual npms and available to 12 | install from [npm](https://www.npmjs.com/search?q=node-red-node-). 13 | 14 | To install - either use the manage palette option in the editor, or change to 15 | your Node-RED user directory - this is usually `~/.node-red` 16 | 17 | cd ~/.node-red 18 | npm install node-red-node-{nodename} 19 | 20 | 21 | ### Nodes 22 | 23 | The install name is node-red-node-*(the name in braces)*. For example 24 | 25 | cd ~/.node-red 26 | npm install node-red-node-weather-underground 27 | 28 | - Amazon S3 (aws) 29 | - Box (box) 30 | - Delicious (delicious) 31 | - Dropbox (dropbox) 32 | - FitBit (fitbit) 33 | - Flickr (flicker) 34 | - Forecast.io (forecastio) 35 | - FourSquare/Swarm (foursquare) 36 | - Google Calendar (google) 37 | - Google Directions (google) 38 | - Google Geocoding (google) 39 | - Google Places (google) 40 | - Google Plus (google) 41 | - Instagram (instagram) 42 | - Jawbone (jawboneup) 43 | - OpenWeatherMap (openweathermap) 44 | - Pinboard (pinboard) 45 | - Strava (strava) 46 | - Transport for London (tfl) 47 | - Weather Underground (weather-underground) 48 | 49 | 50 | ### Running Tests 51 | To run tests on all of the nodes you will need the node-red runtime: 52 | 53 | npm i node-red-web-nodes 54 | npm test 55 | 56 | 57 | ### Contributing / Fixes 58 | 59 | Now that we support npm installaton of nodes we recommend people create and post their own 60 | via [npm](https://www.npmjs.org/). Please read 61 | the [packaging guide notes](http://nodered.org/docs/creating-nodes/packaging.html). 62 | 63 | For simple typos and single line fixes please just raise an issue pointing out 64 | our mistakes. If you need to raise a pull request please read our 65 | [contribution guidelines](https://github.com/node-red/node-red/blob/master/CONTRIBUTING.md) 66 | before doing so. 67 | 68 | ### Copyright and license 69 | 70 | Copyright JS Foundation and other contributors, http://js.foundation under [the Apache 2.0 license](LICENSE). 71 | -------------------------------------------------------------------------------- /aws/README.md: -------------------------------------------------------------------------------- 1 | node-red-node-aws 2 | ================= 3 | 4 | A Node-RED node to watch, send 5 | and receive files from an Amazon S3 bucket. 6 | 7 | Install 8 | ------- 9 | 10 | Run the following command in the root directory of your Node-RED install 11 | 12 | npm install node-red-node-aws 13 | 14 | Usage 15 | ----- 16 | 17 | ### Amazon S3 watch node 18 | 19 | Watches for file events on an Amazon S3 bucket. By default all 20 | file events are reported, but the filename pattern can be supplied 21 | to limit the events to files which have full filenames that match 22 | the glob pattern. The event messages consist of the full filename 23 | in `msg.payload` property, the filename in `msg.file`, 24 | the event type in `msg.event`. 25 | 26 | ### Amazon S3 input node 27 | 28 | Downloads content from an Amazon S3 bucket. The bucket name can be specified in 29 | the node **bucket** property or in the `msg.bucket` property. 30 | The name of the file to download is taken from the node filename property 31 | or the `msg.filename` property. The downloaded content is sent as `msg.payload` 32 | property. If the download fails `msg.error` will contain an error object. 33 | 34 | 35 | ### Amazon S3 out node. 36 | 37 | Uploads content to an Amazon S3 bucket. The bucket name can be specified in the 38 | node bucket property or in the `msg.bucket` property. The filename on 39 | Amazon S3 is taken from the node filename property or the 40 | `msg.filename` property. The content is taken from either the node 41 | localFilename property, the `msg.localFilename` property or 42 | the `msg.payload` property. 43 | -------------------------------------------------------------------------------- /aws/icons/amazon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/aws/icons/amazon.png -------------------------------------------------------------------------------- /aws/locales/de/aws.json: -------------------------------------------------------------------------------- 1 | { 2 | "aws": { 3 | "label": { 4 | "aws": "AWS", 5 | "bucket": "Bucket", 6 | "pattern": "Datei-Namensmuster", 7 | "name": "Name", 8 | "filename": "Dateiname", 9 | "region": "Region", 10 | "local": "Lokaler Dateiname", 11 | "keyid": "Access Key ID", 12 | "secret": "Secret Access Key" 13 | }, 14 | "placeholder": { 15 | "bucket": "Bucket-Name", 16 | "pattern": "Datei-Namensmuster (Pattern)", 17 | "name": "Name", 18 | "filename": "Dateiname", 19 | "region": "Region", 20 | "local": "Lokaler Dateiname" 21 | }, 22 | "tip": { 23 | "config1": "
Zum Erhalt der Berechtigungen nach Anmeldung auf Amazon Web Services kann man entweder
", 24 | "config2": "To obtain these credentials, sign up to Amazon Web Services, Then either:
", 27 | "config2": "If you would like to use a s3 compatible storage solution, you can set a different endpoint here.
", 29 | "config4": "Regarding Force Path Style, some s3 compatible storage solution needs id (e.g. minio)." 30 | }, 31 | "status": { 32 | "initializing": "initializing", 33 | "error": "error", 34 | "checking-for-changes": "checking for changes", 35 | "downloading": "downloading", 36 | "checking-credentials": "checking credentials", 37 | "uploading": "uploading", 38 | "failed": "failed" 39 | }, 40 | "warn": { 41 | "missing-credentials": "Missing AWS credentials" 42 | }, 43 | "error": { 44 | "failed-to-fetch": "failed to fetch S3 state: __err__", 45 | "no-bucket-specified": "No bucket specified", 46 | "no-filename-specified": "No filename specified", 47 | "download-failed": "download failed: __err__", 48 | "aws-s3-error": "AWS S3 error: __err__" 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /aws/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-red-node-aws", 3 | "version": "0.4.0", 4 | "description": "A Node-RED node to watch, save and retreive files from an Amazon S3 bucket", 5 | "dependencies": { 6 | "aws-sdk": "^2.1662.0", 7 | "minimatch": "^9.0.5" 8 | }, 9 | "bundledDependecies": [ "aws-sdk", "minimatch"], 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/node-red/node-red-web-nodes/tree/master/aws" 13 | }, 14 | "license": "Apache-2.0", 15 | "keywords": [ 16 | "node-red", 17 | "aws", 18 | "s3" 19 | ], 20 | "node-red": { 21 | "version": ">=3.0", 22 | "nodes": { 23 | "amazon s3": "aws.js" 24 | } 25 | }, 26 | "author": { 27 | "name": "Mark Hindess", 28 | "email": "HINDESM@uk.ibm.com", 29 | "url": "http://nodered.org" 30 | }, 31 | "engines": { 32 | "node": ">=18" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /box/README.md: -------------------------------------------------------------------------------- 1 | node-red-node-box 2 | ================= 3 | 4 | A Node-RED node to watch, send 5 | and receive files from Box.com. 6 | 7 | Install 8 | ------- 9 | 10 | Run the following command in the root directory of your Node-RED install 11 | 12 | npm install node-red-node-box 13 | 14 | Usage 15 | ----- 16 | 17 | ### Box watch node 18 | 19 | Watches for file events on Box. By default all 20 | file events are reported, but the filename pattern can be supplied 21 | to limit the events to files which have full filenames that match 22 | the glob pattern. 23 | 24 | The event messages consist of the full filename 25 | in `msg.payload` property, the filename in `msg.file`, 26 | the event type in `msg.event` and the full event entry as 27 | returned by the event 28 | API in `msg.data`. 29 | 30 | ### Box input node 31 | 32 | Downloads content from Box. 33 | 34 | The filename on Box is taken from 35 | the node **filename** property or the `msg.filename` property. 36 | The content is sent as `msg.payload` property. 37 | 38 | ### Box output node 39 | 40 | Uploads content to Box. 41 | 42 | The filename on Box is taken from the node **filename** property or the `msg.filename` property. 43 | 44 | The content is taken from either the file pointed at by the node **localFilename** property, the 45 | `msg.localFilename` property, or the actual contents of the `msg.payload` property. 46 | -------------------------------------------------------------------------------- /box/locales/en-US/box.html: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 17 | 18 | 24 | -------------------------------------------------------------------------------- /box/locales/en-US/box.json: -------------------------------------------------------------------------------- 1 | { 2 | "box": { 3 | "label": { 4 | "box": "Box", 5 | "pattern": "Filename Pattern", 6 | "name": "Name", 7 | "filename": "Filename", 8 | "local": "Local Filename", 9 | "create": "Create your own app at", 10 | "copy": "Copy the project credentials here", 11 | "clientid": "Client Id", 12 | "secret": "Secret", 13 | "authenticate": "Authenticate with Box", 14 | "boxuser": "Box User" 15 | }, 16 | "placeholder": { 17 | "pattern": "Filepattern", 18 | "name": "Name", 19 | "filename": "Filename", 20 | "local": "Local Filename" 21 | }, 22 | "tip": { 23 | "redirect": "
Please configure the authorized Redirect URIs of your app to include the following url:
\n__callback__
"
24 | },
25 | "status": {
26 | "initializing": "initializing",
27 | "failed": "failed",
28 | "error": "error",
29 | "checking-for-events": "checking for events",
30 | "resolving-path": "resolving path",
31 | "downloading": "downloading",
32 | "uploading": "uploading",
33 | "overwriting": "overwriting"
34 | },
35 | "warn": {
36 | "refresh-token": "trying to refresh token due to expiry",
37 | "refresh-401": "refreshing access token after 401 error",
38 | "missing-credentials": "Missing box credentials",
39 | "old-path-failed": "failed to resolve old path: __err__"
40 | },
41 | "error": {
42 | "not-found": "not found",
43 | "missing-filename": "missing filename?",
44 | "no-credentials": "ERROR: no credentials - should never happen",
45 | "profile-fetch-failed": "auth worked but profile fetching failed",
46 | "authorized": "Authorised - you can close this window and return to Node-RED",
47 | "token-mismatch": "CSRF token mismatch, possible cross-site request forgery attempt.",
48 | "no-refresh-token": "No refresh token to regain Box access",
49 | "token-request-error": "refresh token request error: __err__",
50 | "refresh-token-error": "refresh token error: __message__",
51 | "too-many-refresh-attempts": "too many refresh attempts, giving up",
52 | "something-broke": "Something went wrong in the authentication process. Please try again.",
53 | "event-stream-initialize-failed": "failed to initialize event stream: __err__",
54 | "events-fetch-failed": "failed to fetch events: __err__",
55 | "no-filename-specified": "No filename specified",
56 | "path-resolve-failed": "failed to resolve path: __err__",
57 | "download-failed": "download failed: __err__",
58 | "upload-failed": "failed upload: __err__"
59 | }
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/box/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name" : "node-red-node-box",
3 | "version" : "0.1.3",
4 | "description" : "Node-RED nodes to watch, download and save files to Box",
5 | "dependencies" : {
6 | "minimatch": "^3.0.4",
7 | "request":"~2.85.0"
8 | },
9 | "repository" : {
10 | "type":"git",
11 | "url":"https://github.com/node-red/node-red-web-nodes/tree/master/box"
12 | },
13 | "license": "Apache-2.0",
14 | "keywords": [ "node-red", "box", "bookmark" ],
15 | "node-red" : {
16 | "nodes" : {
17 | "box": "box.js"
18 | }
19 | },
20 | "author": {
21 | "name": "Mark Hindess",
22 | "email": "HINDESM@uk.ibm.com",
23 | "url": "http://nodered.org"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/darksky/README.md:
--------------------------------------------------------------------------------
1 | node-red-node-darksky
2 | =====================
3 |
4 | A Node-RED node that gets the
5 | weather forecast from the Dark Sky weather API.
6 |
7 | Now DEPRECATED as their [website](https://darksky.net/dev) says - "Support for the Dark Sky API will be ending on March 31st, 2023. Learn more about Apple’s new WeatherKit API."
8 |
9 | Pre-requisites
10 | --------------
11 |
12 | You will need an API key from Dark Sky developer portal.
13 |
14 | This allows 1000 requests per day. The polling node makes a request every 5 minutes = 288 requests.
15 |
16 | Install
17 | -------
18 |
19 | Run the following command in the root directory of your Node-RED install.
20 | This is usually `~/.node-red`
21 |
22 | npm install node-red-node-darksky
23 |
24 | Usage
25 | -----
26 |
27 | Two nodes that get the weather forecast from the Dark Sky weather API.
28 |
29 | One node polls the Dark Sky api every 15 minutes, the other is triggered
30 | to request weather forecast data when an input is received.
31 |
32 | The user has the option of providing a date to the node instead of returning data for the next day.
33 | The node will always prioritise the node settings if they are present.
34 |
35 | The node is configured using a latitude and longitude set of coordinates, an
36 | optional date/time combination, and a set of units with which to format the response.
37 |
38 | These can be passed in as settings on the node, or as:
39 |
40 | - **msg.location.lat**, **msg.location.lon** and **msg.time** or **msg.payload**.
41 |
42 | If using *msg.time* it should be a javascript Date object. If using *msg.payload*
43 | it must be a string or number of milliseconds since 1970 (epoch time in mS.)
44 |
45 | The node sets the following properties of **msg.payload**:
46 |
47 | ### Results
48 |
49 | Both will return
50 |
51 | - **weather** - a single word representation of the current weather forecast.
52 | - **detail** - a more detailed explanation of what the weather is forecast to be.
53 | - **humidity** - a current humidity forecast in decimal (0-1).
54 | - **maxtemp** - the current forecast max temperature for the location in Fahrenheit.
55 | - **mintemp** - the current forecast minimum temperature for the location in Fahrenheit.
56 | - **windspeed** - the current forecast windspeed at the location in metres per second
57 | - **winddirection** - the current forecast wind direction for the location in degrees.
58 | - **lon** - the longitude of the location from which the forecast was sourced.
59 | - **lat** - the latitude of the location from which the forecast was sourced.
60 | - **clouds** - the current forecast cloud coverage of the location in percent.
61 | - **precipitation** - the current forecast precipitation chance
62 | - **sunrise** - the time at which the is forecast to rise in Unix UTC format.
63 | - **sunset** - the time at which the sun is forecast to set in Unix UTC format.
64 | - **units** - the units of the returned data, as requested.
65 |
66 | The node also sets the following properties of **msg.location**.
67 |
68 | - **lat** - the latitude of the location from which the data was sourced.
69 | - **lon** - the longitude of the location from which the data was sourced.
70 | - **city** - the city from which the data was sourced.
71 | - **country** - the country from which the data was sourced.
72 |
73 | Finally, the node sets:
74 |
75 | - **msg.time** - the time at which the weather data was received by Dark Sky.
76 | - **msg.data** - the full JSON returned by the API. This is VERY rich...
77 |
78 | Weather data Powered by Dark Sky
79 |
--------------------------------------------------------------------------------
/darksky/locales/en-US/darksky.json:
--------------------------------------------------------------------------------
1 | {
2 | "darksky": {
3 | "label": {
4 | "darksky": "Credentials",
5 | "name": "Name",
6 | "forecast": "Forecast",
7 | "tomorrow": "Tomorrow",
8 | "datetime": "Specific date and time",
9 | "input": "Input defined",
10 | "date": "Date",
11 | "time": "Time (UTC)",
12 | "latitude": "Latitude",
13 | "longitude": "Longitude",
14 | "register": "Register to get your key at",
15 | "copy": "Copy the key here and give it a name",
16 | "key": "Key",
17 | "lang": "Language",
18 | "units": "Units"
19 | },
20 | "placeholder": {
21 | "name": "Name",
22 | "latitude": "Latitude",
23 | "longitude": "Longitude"
24 | },
25 | "warn": {
26 | "more-than-60-years": "Date more than 60 years in the past. Results may be unreliable",
27 | "more-than-10-years": "Date more than 10 years in the future. Results may be unreliable"
28 | },
29 | "error": {
30 | "settings-invalid-lat_lon": "Invalid lat/lon in node settings",
31 | "msg-invalid-lat_lon": "Invalid lat/lon in msg.location",
32 | "no-credentials": "missing Dark Sky credentials",
33 | "invalid-lat_lon": "Invalid lat/lon provided",
34 | "invalid-time": "Invalid time provided",
35 | "invalid-date": "Invalid date provided",
36 | "incorrect-apikey": "Incorrect API key provided",
37 | "invalid-url": "invalid url",
38 | "api-response": "Error parsing response from API: __response__"
39 | },
40 | "message": {
41 | "weather-forecast": "Weather Forecast Information",
42 | "weather-info": "Weather forecast information for: __time__ at coordinates: __lat__, __lon__"
43 | },
44 | "lang": {
45 | "ar": "Arabic",
46 | "az": "Azerbaijani",
47 | "be": "Belarusian",
48 | "bs": "Bosnian",
49 | "ca": "Catalan",
50 | "cs": "Czech",
51 | "da": "Danish",
52 | "de": "German",
53 | "el": "Greek",
54 | "en": "English (default)",
55 | "es": "Spanish",
56 | "et": "Estonian",
57 | "fr": "French",
58 | "hr": "Croatian",
59 | "hu": "Hungarian",
60 | "id": "Indonesian",
61 | "it": "Italian",
62 | "is": "Icelandic",
63 | "kw": "Cornish",
64 | "nb": "Norwegian Bokmål",
65 | "nl": "Dutch",
66 | "pl": "Polish",
67 | "pt": "Portuguese",
68 | "ru": "Russian",
69 | "sk": "Slovak",
70 | "sl": "Slovenian",
71 | "sr": "Serbian",
72 | "sv": "Swedish",
73 | "tet": "Tetum",
74 | "tr": "Turkish",
75 | "uk": "Ukrainian",
76 | "x-pig-latin": "Igpay Atinlay",
77 | "zh": "simplified Chinese",
78 | "zh-tw": "traditional Chinese"
79 | },
80 | "units": {
81 | "us": "us - imperial us units",
82 | "si": "si - SI metric units",
83 | "ca": "ca - SI units, wind in km/h",
84 | "uk": "uk - SI units, wind in mph, distances in miles",
85 | "auto": "auto - automatic, based on location"
86 | }
87 | }
88 | }
89 |
--------------------------------------------------------------------------------
/darksky/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name" : "node-red-node-darksky",
3 | "version" : "0.1.19",
4 | "description" : "A Node-RED node that gets the weather forecast from the DarkSky API",
5 | "dependencies" : {
6 | },
7 | "repository" : {
8 | "type":"git",
9 | "url":"https://github.com/node-red/node-red-web-nodes/tree/master/darksky"
10 | },
11 | "license": "Apache-2.0",
12 | "keywords": [ "node-red", "weather", "forecast", "darksky" ],
13 | "node-red" : {
14 | "nodes" : {
15 | "darksky": "darksky.js"
16 | }
17 | },
18 | "author": {
19 | "name": "Ben Perry",
20 | "email": "BENJAMIP@uk.ibm.com",
21 | "url": "http://nodered.org"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/delicious/README.md:
--------------------------------------------------------------------------------
1 | node-red-node-delicious
2 | =======================
3 |
4 | A Node-RED node to save bookmarks
5 | to Delicious.
6 |
7 | Install
8 | -------
9 |
10 | Run the following command in the root directory of your Node-RED install
11 |
12 | npm install node-red-node-delicious
13 |
14 | Usage
15 | -----
16 |
17 | Saves bookmarks to Delicious.
18 |
19 | The incoming message can provide the following properties:
20 |
21 | - **payload** - the url to save (required)
22 | - **title** - the title for the bookmark (required)
23 | - **description** - the description for the bookmark (optional)
24 |
--------------------------------------------------------------------------------
/delicious/delicious.html:
--------------------------------------------------------------------------------
1 |
16 |
17 |
18 |
28 |
29 |
48 |
49 |
85 |
--------------------------------------------------------------------------------
/delicious/delicious.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2014 IBM Corp.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | **/
16 |
17 | module.exports = function(RED) {
18 | "use strict";
19 | var request = require("request");
20 |
21 | function DeliciousUserNode(n) {
22 | RED.nodes.createNode(this,n);
23 | this.username = n.username;
24 | }
25 | RED.nodes.registerType("delicious-user",DeliciousUserNode,{
26 | credentials: {
27 | password: { type:"password"}
28 | }
29 | });
30 |
31 |
32 | function DeliciousOutNode(n) {
33 | RED.nodes.createNode(this,n);
34 | var node = this;
35 | this.tags = n.tags;
36 | this.toread = n.toread;
37 | this.private = n.private;
38 |
39 | this.user = RED.nodes.getNode(n.user);
40 | if (this.user) {
41 | this.on("input", function(msg) {
42 | if (!msg.payload) {
43 | node.error(RED._("delicious.error.missing-url"),msg);
44 | return;
45 | }
46 | if (!msg.title) {
47 | node.error(RED._("delicious.error.missing-title"),msg);
48 | return;
49 | }
50 | var options = {
51 | url: "https://api.delicious.com/v1/posts/add?"+
52 | "url="+encodeURIComponent(msg.payload)+
53 | "&description="+encodeURIComponent(msg.title)+
54 | "&auth_token="+node.user.credentials.token+
55 | "&shared="+((node.private !== false)?"no":"yes"),
56 | auth: {
57 | user: node.user.username,
58 | password: node.user.credentials.password
59 | }
60 | };
61 | // TODO: allow tags to be added by the message
62 | if (node.tags) {
63 | options.url += "&tags="+encodeURIComponent(node.tags);
64 | }
65 | if (msg.description) {
66 | options.url += "&extended="+encodeURIComponent(msg.description);
67 | }
68 |
69 | node.status({fill:"blue",shape:"dot",text:"delicious.status.saving"});
70 |
71 | request.get(options, function(err,res,body) {
72 | if (err) {
73 | node.error(err,msg);
74 | node.status({fill:"red",shape:"ring",text:"delicious.status.failed"});
75 | } else {
76 | if (body.indexOf('code="done"') != -1) {
77 | node.status({});
78 | } else {
79 | //TODO: This API only returns XML. Need to parse out error messages
80 | node.error(body,msg);
81 | node.status({fill:"red",shape:"ring",text:"delicious.status.failed"});
82 | }
83 | }
84 | }).on('error',function(err) {
85 | node.error(err,msg);
86 | node.status({fill:"red",shape:"ring",text:err.code});
87 | });
88 |
89 | });
90 | } else {
91 | this.error(RED._("delicious.error.missing-credentials"));
92 | }
93 |
94 | }
95 | RED.nodes.registerType("delicious out",DeliciousOutNode);
96 | };
97 |
--------------------------------------------------------------------------------
/delicious/icons/delicious.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/delicious/icons/delicious.png
--------------------------------------------------------------------------------
/delicious/locales/en-US/delicious.html:
--------------------------------------------------------------------------------
1 |
2 |
12 |
--------------------------------------------------------------------------------
/delicious/locales/en-US/delicious.json:
--------------------------------------------------------------------------------
1 | {
2 | "delicious": {
3 | "label": {
4 | "delicious": "Delicious",
5 | "user": "User",
6 | "password": "Password",
7 | "tags": "Tags",
8 | "name": "Name",
9 | "private": "Mark as private?"
10 | },
11 | "placeholder": {
12 | "tags": "comma-separated tags to add",
13 | "name": "Name"
14 | },
15 | "status": {
16 | "saving": "saving",
17 | "failed": "failed"
18 | },
19 | "error": {
20 | "missing-url": "url must be provided in msg.payload",
21 | "missing-title": "msg.title must be provided",
22 | "missing-credentials": "missing credentials"
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/delicious/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name" : "node-red-node-delicious",
3 | "version" : "0.1.1",
4 | "description" : "A Node-RED node to save bookmarks to Delicious",
5 | "dependencies" : {
6 | "request":"~2.74.0"
7 | },
8 | "repository" : {
9 | "type":"git",
10 | "url":"https://github.com/node-red/node-red-web-nodes/tree/master/delicious"
11 | },
12 | "license": "Apache-2.0",
13 | "keywords": [ "node-red", "delicious", "bookmark" ],
14 | "node-red" : {
15 | "nodes" : {
16 | "delicious": "delicious.js"
17 | }
18 | },
19 | "author": {
20 | "name": "Nicholas O'Leary",
21 | "email": "knolleary@gmail.com",
22 | "url": "http://nodered.org"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/dropbox/README.md:
--------------------------------------------------------------------------------
1 | node-red-node-dropbox
2 | =====================
3 |
4 | Node-RED nodes to watch, save
5 | and retrieve files from Dropbox.
6 |
7 | Install
8 | -------
9 |
10 | Search for `node-red-node-dropbox` in the Palette Manager, or run the following
11 | command in your Node-RED user directory, ``~/.node-red`:
12 |
13 | npm install node-red-node-dropbox
14 |
15 | Usage
16 | -----
17 |
18 | ### Watch node
19 |
20 | Watches for file events on Dropbox.
21 |
22 | By default all file events are reported, but the filename pattern can
23 | be supplied to limit the events to files which have full filenames
24 | that match the glob pattern.
25 |
26 | The event messages consist of the full filename in `msg.payload` property, the
27 | filename in `msg.file` and the event type in `msg.event`.
28 |
29 | ### Input node
30 |
31 | Downloads content from Dropbox.
32 |
33 | The filename on Dropbox is taken from the node **filename**
34 | property or the `msg.filename` property.
35 |
36 | The downloaded content is sent as `msg.payload` property. If the download
37 | fails `msg.error` will contain an error object.
38 |
39 | ### Output node
40 |
41 | Uploads content to Dropbox.
42 |
43 | The filename on Dropbox is taken from the node **filename** property or the `msg.filename` property.
44 |
45 | You can pass in content either as a filename by setting the **localFilename** field or
46 | `msg.localFilename` property, or you can pass in content directly using `msg.payload`.
47 |
48 | The file will be uploaded to a directory on Dropbox called `Apps/{appname}/{appfolder}`
49 | where {appname} and {appfolder} are set when you set up the Dropbox application key and token.
50 |
51 | ## Dropbox security introduction
52 |
53 | ### Refresh tokens vs Access tokens
54 | The Dropbox security model - to protect access to your files and folders - is improved continiously, which means new versions of this node will need to be implemented to support these changes:
55 | + Version ***1.x*** of this node used long-live access tokens to access the files and folders of your Dropbox account.
56 | However Dropbox [announced](https://dropbox.tech/developers/migrating-app-permissions-and-access-tokens) to retire those long-live access tokens on September 30th, 2021. From then on Dropbox requires you to request once a long-live refresh token, which can be used infinitely do request short-live access tokens (which will be valid for only 4 hours).
57 | + Version ***2.0.0*** of this node was developed to support refresh tokens.
58 | This version only allowed refresh tokens to be requested from Dropbox, if your flow editor was opened via a https connection to your Node-RED system. Moreover self signed certificates were not allowed by Dropbox.
59 | + Version ***2.1.0*** of this node further improved this mechanism, by allowing refresh tokens to be requested via both http and https connections to Node-RED.
60 |
61 | To request once such a refresh token, create a Dropbox config node and follow the instructions on the config node screen step by step. The diagram below summarizes all these steps that need to be executed:
62 |
63 | 
64 |
65 | ### Permissions
66 | The tokens only give you access to your Dropbox account, but you still need to apply permissions to these tokens. Which means that you need to specify in your Dropbox account which actions are allowed when somebody logs in via that token. For example:
67 | + `files.content.write`: Edit content of your Dropbox files and folders
68 | + `files.content.read`: View content of your Dropbox files and folders
69 |
70 | ## Troubleshooting
71 | Some error messages explained:
72 | + `This app has reached its user limit`. By default your Dropbox account is only accessible via one domain (e.g. http://my_node_red_domain:1880):
73 |
74 | 
75 |
76 | As a result, you will get this error when you try to access it via multiple domains. In that case you can allow multiple clients via the above *"Enable additional users"* button.
77 |
--------------------------------------------------------------------------------
/dropbox/icons/dropbox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/dropbox/icons/dropbox.png
--------------------------------------------------------------------------------
/dropbox/locales/de/dropbox.json:
--------------------------------------------------------------------------------
1 | {
2 | "dropbox": {
3 | "label": {
4 | "dropbox": "Dropbox",
5 | "pattern": "Datei-Namensmuster",
6 | "name": "Name",
7 | "filename": "Dateiname",
8 | "local": "Lokaler Dateiname",
9 | "appkey": "App Key",
10 | "appsecret": "App Secret",
11 | "accesstoken": "Access Token"
12 | },
13 | "placeholder": {
14 | "pattern": "Datei-Namensmuster (Pattern)",
15 | "name": "Name",
16 | "filename": "Dateiname",
17 | "local": "Lokaler Dateiname"
18 | },
19 | "tip": {
20 | "cred1": "Zum Erhalt des Access-Tokens ist nach Anmeldung auf Dropbox developer home:", 21 | "cred2": "
Irgendetwas ist schief gelaufen beim Authentifizierungs-Prozess. Der folgende Fehler wurde rückgegeben:
__statusCode__: __errorData__
Ein bekannter Grund für diesen Fehlertyp könnte sein, dass die Uhrzeit des Systems falsch ist, auf dem Node-RED läuft.
", 31 | "authorized": "Erfolgreich authorisiert bei Fitbit. Dieses Fenster kann jetzt geschlossen werden." 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /fitbit/locales/en-US/fitbit.html: -------------------------------------------------------------------------------- 1 | 2 | 20 | 21 | 46 | -------------------------------------------------------------------------------- /fitbit/locales/en-US/fitbit.json: -------------------------------------------------------------------------------- 1 | { 2 | "fitbit": { 3 | "label": { 4 | "fitbit": "Fitbit", 5 | "type": "Type", 6 | "goals": "goals", 7 | "sleep": "sleep", 8 | "badges": "badges", 9 | "activities": "activities", 10 | "name": "Name", 11 | "create": "Create your own app at", 12 | "copy": "Copy the app details here", 13 | "key": "Key", 14 | "secret": "Secret", 15 | "authenticate": "Authenticate with Fitbit", 16 | "fitbitid": "Fitbit ID" 17 | }, 18 | "status": { 19 | "initializing": "initializing", 20 | "failed": "failed", 21 | "querying": "querying" 22 | }, 23 | "warn": { 24 | "missing-credentials": "Missing fitbit credentials", 25 | "no-sleep-record": "no main sleep record found" 26 | }, 27 | "error": { 28 | "unsupported-data-type": "Unsupported data type", 29 | "missing-credentials": "Missing fitbit credentials", 30 | "oautherror": "Something went wrong with the authentication process. The following error was returned:
__statusCode__: __errorData__
One known cause of this type of failure is if the clock is wrong on system running Node-RED.
", 31 | "authorized": "Authorised - you can close this window and return to Node-RED" 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /fitbit/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "node-red-node-fitbit", 3 | "version" : "0.1.1", 4 | "description" : "Node-RED nodes that get information from a Fitbit", 5 | "dependencies" : { 6 | "oauth":"~0.9.15" 7 | }, 8 | "repository" : { 9 | "type":"git", 10 | "url":"https://github.com/node-red/node-red-web-nodes/tree/master/fitbit" 11 | }, 12 | "license": "Apache-2.0", 13 | "keywords": [ "node-red", "fitbit", "exercise", "biometric" ], 14 | "node-red" : { 15 | "nodes" : { 16 | "fitbit": "fitbit.js" 17 | } 18 | }, 19 | "author": { 20 | "name": "Mark Hindess", 21 | "email": "HINDESSM@uk.ibm.com", 22 | "url": "http://nodered.org" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /flickr/README.md: -------------------------------------------------------------------------------- 1 | node-red-node-flickr 2 | ==================== 3 | 4 | A Node-RED node to upload 5 | pictures to Flickr. 6 | 7 | Install 8 | ------- 9 | 10 | Run the following command in the root directory of your Node-RED install 11 | 12 | npm install node-red-node-flickr 13 | 14 | Usage 15 | ----- 16 | 17 | Saves photos to Flickr. 18 | 19 | The incoming message can provide the following properties: 20 | 21 | - **msg.payload** - a Buffer containing the image (required) 22 | - **msg.title** - the title for the photo (optional) 23 | - **msg.description** - the description for the photo (optional) 24 | - **msg.tags** - tags to be applied to the photo. Can be either a string containing space-separated tags, or an array of tags. (optional) 25 | -------------------------------------------------------------------------------- /flickr/icons/flickr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/flickr/icons/flickr.png -------------------------------------------------------------------------------- /flickr/locales/de/flickr.json: -------------------------------------------------------------------------------- 1 | { 2 | "flickr": { 3 | "label": { 4 | "flickr": "Flickr", 5 | "tags": "Tags", 6 | "privacy": "Privatsphäre", 7 | "default": "Benutzerstandard", 8 | "public": "Öffentlich", 9 | "private": "Privat", 10 | "friends": "Freunde", 11 | "family": "Familie", 12 | "frfa": "Freunde & Familie", 13 | "name": "Name", 14 | "create": "Eigene App erzeugen bei", 15 | "copy": "App-Details hierher kopieren", 16 | "key": "Key", 17 | "secret": "Secret", 18 | "authenticate": "Bei Flickr authentifizieren", 19 | "flickrid": "Flickr-ID" 20 | }, 21 | "placeholder": { 22 | "tags": "Komma-getrennte Tags" 23 | }, 24 | "status": { 25 | "uploading": "uploading", 26 | "failed": "Fehlgeschlagen" 27 | }, 28 | "error": { 29 | "missing-credentials": "Fehlende Flickr-Berechtigungen", 30 | "something-broke": "Irgendetwas ist schief gelaufen beim Authentifizierungs-Prozess. Bitte erneut probieren.", 31 | "oautherror": "Irgendetwas ist schief gelaufen beim Authentifizierungs-Prozess. Der folgende Fehler wurde rückgegeben:
__statusCode__: __errorData__
Ein bekannter Grund für diesen Fehlertyp könnte sein, dass die Uhrzeit des Systems falsch ist, auf dem Node-RED läuft.
", 32 | "authorized": "Erfolgreich authorisiert bei Flickr. Dieses Fenster kann jetzt geschlossen werden." 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /flickr/locales/en-US/flickr.html: -------------------------------------------------------------------------------- 1 | 2 | 14 | -------------------------------------------------------------------------------- /flickr/locales/en-US/flickr.json: -------------------------------------------------------------------------------- 1 | { 2 | "flickr": { 3 | "label": { 4 | "flickr": "Flickr", 5 | "tags": "Tags", 6 | "privacy": "Privacy", 7 | "default": "User default", 8 | "public": "Public", 9 | "private": "Private", 10 | "friends": "Friends", 11 | "family": "Family", 12 | "frfa": "Friends & Family", 13 | "name": "Name", 14 | "create": "Create your own app at", 15 | "copy": "Copy the app details here", 16 | "key": "Key", 17 | "secret": "Secret", 18 | "authenticate": "Authenticate with Flickr", 19 | "flickrid": "Flickr ID" 20 | }, 21 | "placeholder": { 22 | "tags": "space-separated tags to add" 23 | }, 24 | "status": { 25 | "uploading": "uploading", 26 | "failed": "failed" 27 | }, 28 | "error": { 29 | "missing-credentials": "Missing flickr credentials", 30 | "something-broke": "Something went wrong in the authentication process. Please try again.", 31 | "oautherror": "Something went wrong with the authentication process. The following error was returned:
__statusCode__: __errorData__
One known cause of this type of failure is if the clock is wrong on system running Node-RED.
", 32 | "authorized": "Authorised - you can close this window and return to Node-RED" 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /flickr/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "node-red-node-flickr", 3 | "version" : "0.1.2", 4 | "description" : "A Node-RED node to save pictures to Flickr", 5 | "dependencies" : { 6 | "request": "2.74.x", 7 | "oauth":"~0.9.11" 8 | }, 9 | "repository" : { 10 | "type":"git", 11 | "url":"https://github.com/node-red/node-red-web-nodes/tree/master/flickr" 12 | }, 13 | "license": "Apache-2.0", 14 | "keywords": [ "node-red", "flickr", "photo", "picture" ], 15 | "node-red" : { 16 | "nodes" : { 17 | "flickr": "flickr.js" 18 | } 19 | }, 20 | "author": { 21 | "name": "Nick O'Leary", 22 | "email": "knolleary@gmail.com", 23 | "url": "http://nodered.org" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /forecast/README.md: -------------------------------------------------------------------------------- 1 | node-red-node-forecastio 2 | ======================== 3 | 4 | A Node-RED node that gets the 5 | weather forecast from Forecast.io. 6 | 7 | Now Deprecated in favour of node-red-node-darksky - see http://status.darksky.net/2016/09/20/forecast-api-is-now-dark-sky-api.html for details 8 | 9 | Pre-requisites 10 | -------------- 11 | 12 | You will need an API key from forecast.io. 13 | 14 | This allows 1000 requests per day. The polling node makes a request every 5 minutes = 288 requests. 15 | 16 | Install 17 | ------- 18 | 19 | Run the following command in the root directory of your Node-RED install. 20 | This is usually `~/.node-red` 21 | 22 | npm install node-red-node-forecastio 23 | 24 | Usage 25 | ----- 26 | 27 | Two nodes that get the weather forecast from Forecast.io. 28 | 29 | One node polls forecast.io every 5 minutes, the other is triggered 30 | to request weather forecast data when an input is received. 31 | 32 | The user has the option of providing a date to the node instead of returning data for the next day. 33 | The node will always prioritise the node settings if they are present. 34 | 35 | The node is configured using a latitude and longitude set of coordinates, an 36 | optional date/time combination, and a set of units with which to format the response. 37 | 38 | These can be passed in as settings on the node, or as: 39 | 40 | - **msg.location.lat**, **msg.location.lon** and **msg.time** or **msg.payload**. 41 | 42 | If using *msg.time* it should be a javascript Date object. If using *msg.payload* 43 | it must be a string or number of milliseconds since 1970 (epoch time in mS.) 44 | 45 | The node sets the following properties of **msg.payload**: 46 | 47 | ### Results 48 | 49 | Both will return 50 | 51 | - **weather** - a single word representation of the current weather forecast. 52 | - **detail** - a more detailed explanation of what the weather is forecast to be. 53 | - **humidity** - a current humidity forecast in decimal (0-1). 54 | - **maxtemp** - the current forecast max temperature for the location in Fahrenheit. 55 | - **mintemp** - the current forecast minimum temperature for the location in Fahrenheit. 56 | - **windspeed** - the current forecast windspeed at the location in metres per second 57 | - **winddirection** - the current forecast wind direction for the location in degrees. 58 | - **lon** - the longitude of the location from which the forecast was sourced. 59 | - **lat** - the latitude of the location from which the forecast was sourced. 60 | - **clouds** - the current forecast cloud coverage of the location in percent. 61 | - **precipitation** - the current forecast precipitation chance 62 | - **sunrise** - the time at which the is forecast to rise in Unix UTC format. 63 | - **sunset** - the time at which the sun is forecast to set in Unix UTC format. 64 | - **units** - the units of the returned data, as requested. 65 | 66 | The node also sets the following properties of **msg.location**. 67 | 68 | - **lat** - the latitude of the location from which the data was sourced. 69 | - **lon** - the longitude of the location from which the data was sourced. 70 | - **city** - the city from which the data was sourced. 71 | - **country** - the country from which the data was sourced. 72 | 73 | Finally, the node sets: 74 | 75 | - **msg.time** - the time at which the weather data was received by Forecast.io. 76 | - **msg.data** - the full JSON returned by the API. This is VERY rich... 77 | 78 | Weather data provided by Forecast.io/ 79 | -------------------------------------------------------------------------------- /forecast/locales/en-US/forecastio.json: -------------------------------------------------------------------------------- 1 | { 2 | "forecastio": { 3 | "label": { 4 | "forecastio": "Forecastio", 5 | "name": "Name", 6 | "forecast": "Forecast", 7 | "tomorrow": "Tomorrow", 8 | "datetime": "Specific date and time", 9 | "input": "Input defined", 10 | "date": "Date", 11 | "time": "Time (UTC)", 12 | "latitude": "Latitude", 13 | "longitude": "Longitude", 14 | "register": "Register to get your key at", 15 | "copy": "Copy the key here and give it a name", 16 | "key": "Key", 17 | "units": "Units" 18 | }, 19 | "placeholder": { 20 | "name": "Name", 21 | "latitude": "Latitude", 22 | "longitude": "Longitude" 23 | }, 24 | "warn": { 25 | "more-than-60-years": "Date more than 60 years in the past. Results may be unreliable", 26 | "more-than-10-years": "Date more than 10 years in the future. Results may be unreliable" 27 | }, 28 | "error": { 29 | "settings-invalid-lat_lon": "Invalid lat/lon in node settings", 30 | "msg-invalid-lat_lon": "Invalid lat/lon in msg.location", 31 | "no-credentials": "missing forecast.io credentials", 32 | "invalid-lat_lon": "Invalid lat/lon provided", 33 | "invalid-time": "Invalid time provided", 34 | "invalid-date": "Invalid date provided", 35 | "incorrect-apikey": "Incorrect API key provided", 36 | "invalid-url": "invalid url", 37 | "api-response": "Error parsing response from API: __response__" 38 | }, 39 | "message": { 40 | "weather-forecast": "Weather Forecast Information", 41 | "weather-info": "Weather forecast information for: __time__ at coordinates: __lat__, __lon__" 42 | }, 43 | "units": { 44 | "us": "us - imperial us units", 45 | "si": "si - SI metric units", 46 | "ca": "ca - SI units, wind in km/h", 47 | "uk": "uk - SI units, wind in mph, distances in miles", 48 | "auto": "auto - automatic, based on location" 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /forecast/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "node-red-node-forecastio", 3 | "version" : "0.1.13", 4 | "description" : "A Node-RED node that gets the weather forecast from Forecast.io", 5 | "dependencies" : { 6 | }, 7 | "repository" : { 8 | "type":"git", 9 | "url":"https://github.com/node-red/node-red-web-nodes/tree/master/forecast" 10 | }, 11 | "license": "Apache-2.0", 12 | "keywords": [ "node-red", "weather", "forecastio", "forecast" ], 13 | "node-red" : { 14 | "nodes" : { 15 | "forecastio": "forecastio.js" 16 | } 17 | }, 18 | "author": { 19 | "name": "Ben Perry", 20 | "email": "BENJAMIP@uk.ibm.com", 21 | "url": "http://nodered.org" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /foursquare/README.md: -------------------------------------------------------------------------------- 1 | node-red-node-foursquare 2 | ==================== 3 | 4 | Node-RED nodes to get Foursquare 5 | recommendations and check Swarm checkins 6 | 7 | Install 8 | ------- 9 | 10 | Run the following command in the root directory of your Node-RED install 11 | 12 | npm install node-red-node-foursquare 13 | 14 | Usage 15 | ----- 16 | 17 | ### Foursquare query node 18 | 19 | Can be used to 20 | 21 | - explore recommended venues of a particular type near a given latitude and longitude 22 | 23 | The type of venue to explore can be passed in as settings on the node or as the 24 | `msg.payload.section` of the message input. Valid entries are: 25 | 26 | - food 27 | - drinks 28 | - coffee 29 | - shops 30 | - arts 31 | - outdoors 32 | - sights 33 | - all 34 | 35 | The value set on the node will take precedence over the contents of `msg.payload.section`. 36 | 37 | The number of results to return from the query and how to return them (either as a single message 38 | or as multiple messages) are settings on the node. 39 | 40 | The node sets the following properties 41 | 42 | - **payload** - the JSON of the recommended venue 43 | - **title** - the name of the recommended venue 44 | - **location.lat** - the latitude of the recommended venue 45 | - **location.lon** - the longitude of the recommended venue 46 | - **location.city** - the city where the recommended venue is 47 | - **location.country** - the country where the recommended venue is 48 | - **location.name** - the name of the recommended venue 49 | 50 | The exact location of these properties depends on the number of results chosen to be returned along 51 | with how to return them: 52 | 53 | - If the node output value is set to one then for both returning as a single message and as multiple 54 | messages, the node returns a msg for the first in an ordered list of recommended venues near the provided 55 | latitude and longitude. The returned msg has the payload, location and name properties. 56 | 57 | - If the node output value is set to more than one to be returned as a single message 58 | the node sets `msg.payload` 59 | to be an array of msgs, each one corresponding to a recommended venue and ordered according to the 60 | Foursquare venues explore API. The first element in the array is 61 | the most highly recommended venue and the length of the array is the output value set on the node or the 62 | number of venues found, whichever is smaller. Each element in this array has the *payload, 63 | title, location and name* properties. 64 | 65 | - If the node output value is set to more than one but to be returned as a multiple then the node sends 66 | multiple msgs, each one representing a recommended venue. 67 | 68 | For further information about the Foursquare API see 69 | Explore Recommended and Popular Venues. 70 | 71 | 72 | ### Swarm input node 73 | 74 | Polls every 15 minutes for the latest Swarm check-ins that have been registered by the authenticated 75 | user since the node was registered. If a new check-in has been made within the polling interval 76 | then `msg.payload` is set to be the JSON of the most recent new check-in. 77 | 78 | The properties of the Swarm check-in are documented at 79 | Checkin Response. 80 | 81 | ### Swarm query node 82 | 83 | Can be used to search 84 | 85 | - all Swarm check-ins by the authenticated user. 86 | 87 | The node sets msg.payload to be the JSON of the most recent check-in. If no check-ins 88 | are found then the returned msg will have a null payload. The properties of the 89 | Swarm check-in are documented at 90 | Checkin Response. 91 | 92 | Data provided by Foursquare. 93 | -------------------------------------------------------------------------------- /foursquare/icons/foursquare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/foursquare/icons/foursquare.png -------------------------------------------------------------------------------- /foursquare/icons/swarm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/foursquare/icons/swarm.png -------------------------------------------------------------------------------- /foursquare/locales/en-US/foursquare.html: -------------------------------------------------------------------------------- 1 | 2 | 56 | -------------------------------------------------------------------------------- /foursquare/locales/en-US/foursquare.json: -------------------------------------------------------------------------------- 1 | { 2 | "foursquare": { 3 | "label": { 4 | "foursquare": "foursquare", 5 | "loginas": "Log in as", 6 | "explore": "Explore", 7 | "recommended": "recommended", 8 | "food": "food venues", 9 | "drinks": "drink venues", 10 | "coffee": "coffee shops", 11 | "shops": "shops", 12 | "arts": "cultural venues", 13 | "outdoors": "outdoor venues", 14 | "sights": "sights", 15 | "all": "venues", 16 | "nearby": "nearby", 17 | "open": "which are open", 18 | "today": "today", 19 | "anyday": "on any day of the week", 20 | "at": "at", 21 | "currenttime": "the current time of day", 22 | "anytime": "any time of day", 23 | "output": "Output", 24 | "resultas": "result(s) as", 25 | "multiple": "multiple messages", 26 | "single": "a single message", 27 | "name": "Name", 28 | "create": "Create your own app at", 29 | "copy": "Copy the app details here", 30 | "clientid": "Client Id", 31 | "clientsecret": "Client Secret", 32 | "authenticate": "Authenticate with Foursquare", 33 | "foursquareuser": "Foursquare User" 34 | }, 35 | "tip": { 36 | "redirect": "Please configure the authorized Redirect URIs of your app to include the following url:
\n__callback__
"
37 | },
38 | "status": {
39 | "failed": "failed"
40 | },
41 | "warn": {
42 | "no-credentials": "no credentials for node"
43 | },
44 | "error": {
45 | "no-accesstoken": "No access token available",
46 | "section-not-defined": "problem with node input: section is not defined correctly",
47 | "lat_lon-not-set": "problem with node input: latitude and/or longitude not set",
48 | "errorcode": "Error code: __metaCode__, errorDetail: __errorDetail__",
49 | "incorrect-number": "Incorrect number of messages to output or incorrect choice of how to output them",
50 | "no-parameters": "ERROR: request does not contain the required parameters",
51 | "id_secret-not-defined": "ERROR: client ID and client secret are not defined",
52 | "query-error": "ERROR: __queryError__: __description__",
53 | "no-credentials": "ERROR: no credentials - should never happen",
54 | "oauth-error-status": "Something went wrong with the authentication process. The following error was returned:
__statusCode__: __errorData__
", 55 | "oauth-error-meta": "Something went wrong with the authentication process. Http return code:
__metaCode__
", 56 | "token-mismatch": "CSRF token mismatch, possible cross-site request forgery attempt." 57 | }, 58 | "message": { 59 | "authorized": "Authorised - you can close this window and return to Node-RED" 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /foursquare/locales/en-US/swarm.html: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 24 | -------------------------------------------------------------------------------- /foursquare/locales/en-US/swarm.json: -------------------------------------------------------------------------------- 1 | { 2 | "swarm": { 3 | "label": { 4 | "swarm": "swarm", 5 | "loginas": "Log in as", 6 | "request": "Request", 7 | "recent": "get most recent check in", 8 | "name": "Name" 9 | }, 10 | "status": { 11 | "failed": "failed" 12 | }, 13 | "warn": { 14 | "no-credentials": "no credentials for node" 15 | }, 16 | "error": { 17 | "no-accesstoken": "No access token available", 18 | "errorcode": "Error code: __metaCode__, errorDetail: __errorDetail__" 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /foursquare/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "node-red-node-foursquare", 3 | "version" : "0.1.1", 4 | "description" : "Node-RED nodes to talk to Foursquare and Swarm", 5 | "dependencies" : { 6 | "oauth":"~0.9.11", 7 | "request":"~2.74.0" 8 | }, 9 | "repository" : { 10 | "type":"git", 11 | "url":"https://github.com/node-red/node-red-web-nodes/tree/master/foursquare" 12 | }, 13 | "license": "Apache-2.0", 14 | "keywords": [ "node-red", "foursquare", "swarm", "food", "checkin" ], 15 | "node-red" : { 16 | "nodes" : { 17 | "foursquare": "foursquare.js", 18 | "swarm": "swarm.js" 19 | } 20 | }, 21 | "author": { 22 | "name": "Helen Beeken", 23 | "email": "hbeeken@uk.ibm.com", 24 | "url": "http://nodered.org" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /foursquare/swarm.html: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 28 | 29 | 45 | 46 | 47 | 63 | 64 | 81 | -------------------------------------------------------------------------------- /google/icons/logo_maps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/google/icons/logo_maps.png -------------------------------------------------------------------------------- /google/icons/logo_plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/google/icons/logo_plus.png -------------------------------------------------------------------------------- /google/locales/de/calendar.json: -------------------------------------------------------------------------------- 1 | { 2 | "calendar": { 3 | "label": { 4 | "google-calendar": "Google Kalender", 5 | "google": "Google", 6 | "calendar": "Kalender", 7 | "inject-message": "Nachricht", 8 | "the": "dem", 9 | "each-event": "eines jeden Ereignisses", 10 | "option_at": "bei", 11 | "option_before": "vor", 12 | "option_after": "nach", 13 | "option_start": "Beginn", 14 | "option_end": "Ende", 15 | "seconds": "Sekunden", 16 | "minutes": "Minuten", 17 | "hours": "Stunden", 18 | "days": "Tage", 19 | "name": "Name", 20 | "count": "Ereignisse", 21 | "incl-og-events": "Laufende Ereignisse einschließen" 22 | }, 23 | "status": { 24 | "querying": "Abfrage", 25 | "invalid-calendar": "Ungültiger Kalender", 26 | "next-event": "Abfrage nächstes Ereignis", 27 | "no-event": "Kein Ereignis", 28 | "creating": "Erzeugung", 29 | "failed": "Fehlgeschlagen" 30 | }, 31 | "warn": { 32 | "no-credentials": "Fehlende Google-Berechtigungen" 33 | }, 34 | "error": { 35 | "invalid-calendar": "Ungültiger Kalender", 36 | "error": "FEHLER: __error__", 37 | "no-event": "FEHLER: Kein Ereignis gefunden", 38 | "fetch-failed": "Fehler bei Abfrage der Kalenderliste: __message__", 39 | "error-details": "Fehler __code__: __message__" 40 | }, 41 | "helptext": { 42 | "count": "Anzahl der zurückzugebenden Ereignisse [1-10]" 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /google/locales/de/directions.json: -------------------------------------------------------------------------------- 1 | { 2 | "directions": { 3 | "label": { 4 | "directions": "Google Directions", 5 | "name": "Name", 6 | "apikey": "Google API Key", 7 | "origin": "Startpunkt", 8 | "destination": "Zielpunkt", 9 | "mode": "Modus", 10 | "driving": "Fahrend (z.B. Auto)", 11 | "walking": "Gehend", 12 | "bicycling": "Fahrrad fahrend", 13 | "transit": "Transit", 14 | "waypoints": "Wegpunkte", 15 | "alternatives": "Alternativen", 16 | "avoid": "Vermeiden", 17 | "language": "Sprache", 18 | "units": "Einheiten", 19 | "metric": "Metrisch (Meter)", 20 | "imperial": "Imperial (Meilen usw.)", 21 | "region": "Region", 22 | "departuretime": "Abfahrtszeit", 23 | "arraivaltime": "Ankunftszeit", 24 | "transitmode": "Transitmodus", 25 | "transitpref": "Transit-Routen-Präferenzen" 26 | }, 27 | "placeholder": { 28 | "name": "Name" 29 | }, 30 | "status": { 31 | "failed": "Fehlgeschlagen", 32 | "success": "Erfolgreich" 33 | }, 34 | "error": { 35 | "no-origin": "Bitte Startpunkt angeben", 36 | "no-destination": "Bitte Zielpunkt angeben", 37 | "no-waypoint": "Startpunkt, Zielpunkt oder Wegpunkte nicht gefunden", 38 | "too-many-waypoints": "Zu viele Wegpunkte vorgegeben. Es sind maximal 8 erlaubt.", 39 | "invalid-request": "Ungültige Anfrage. Bitte auf ungültige Parameterangaben überprüfen.", 40 | "too-many-requests": "Zu viele Anfragen über den vorgegebenen API Key", 41 | "request-denied": "Anfrage abgelehnt von Google", 42 | "unknown-error": "Unbekannter Fehler aufgetreten. Bitte erneut versuchen." 43 | }, 44 | "message": { 45 | "travel-directions": "Travel directions via" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /google/locales/de/geocoding.json: -------------------------------------------------------------------------------- 1 | { 2 | "geocoding": { 3 | "label": { 4 | "geocoding": "Google Geocoding", 5 | "geocodeby-address": "Geocodierung anhand Adresse", 6 | "geocodeby-coordinates": "Geocodierung anhand Koordinate", 7 | "name": "Name", 8 | "geocodeby": "Geocodierung anhand", 9 | "byaddress": "Adresse", 10 | "bycoordinates": "Koordinate", 11 | "address": "Adresse", 12 | "latitude": "Breitengrad", 13 | "longitude": "Längengrad", 14 | "apikey": "Google API Key", 15 | "bounds": "Grenze", 16 | "language": "Sprache", 17 | "region": "Region", 18 | "components": "Komponenten" 19 | }, 20 | "placeholder": { 21 | "name": "Name", 22 | "address": "Adresse", 23 | "latitude": "Breitengrad", 24 | "longitude": "Längengrad", 25 | "bounds": "Grenze (Bounds)", 26 | "language": "Sprache", 27 | "region": "Region", 28 | "components": "Komponenten" 29 | }, 30 | "status": { 31 | "failed": "Fehlgeschlagen" 32 | }, 33 | "error": { 34 | "no-lan_lon": "Bitte Längengrad und Breitengrad angeben", 35 | "no-address": "Bitte Adresse angeben" 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /google/locales/de/google.json: -------------------------------------------------------------------------------- 1 | { 2 | "google": { 3 | "label": { 4 | "google": "Google", 5 | "googleapi": "Google-API", 6 | "create": "Zum Erzeugen eines eigenen Projekts siehe", 7 | "instructions": "Anleitung", 8 | "copy": "Projekt-Berechtigungen hierher kopieren", 9 | "clientid": "Client Id", 10 | "secret": "Secret", 11 | "authenticate": "Bei Google authentifizieren", 12 | "googleuser": "Google-Benutzer", 13 | "apikey": "API Key" 14 | }, 15 | "tip": { 16 | "privateip": "Es scheint so, dass Node-RED unter einer privaten IP-Adresse läuft, die der Google-Service nicht erreichen kann. Bitte die authorisierte Weiterleitungs-URI (Redirect URIs) der App so konfigurieren, dass die folgende URL enthalten ist:
\n__callback__
Sie werden Ihre hosts file so editieren und einen Eintrag __dummyDomain__ hinzufügen müssen, welcher auf __actualIP__ zeigt.
Sie müssen ebenfalls die Google+ API Ihres neuen Projekts in der Google Developers Console aktivieren.
", 17 | "configure": "Bitte die authorisierte Weiterleitungs-URI (Redirect URIs) der App so konfigurieren, dass die folgende URL enthalten ist:
\n__callback__
Außerdem muss die Google+ API beim neuen Projekt in der Google Developers Console aktiviert sein.
", 18 | "api1": "Diese Berechtigungen sind in der Google Developer Console abrufbar. Nach Anmeldung muss man:", 19 | "api2": "Zuletzt den neuen API Key oben hinkopieren.
" 21 | }, 22 | "warn": { 23 | "refreshing-accesstoken": "Aktualisiere Zugriff-Token nach 401-Fehler", 24 | "retry-request": "__number__ fehlgeschlagene Versuche. Warte __delay__ ms vor nächsten Versuch." 25 | }, 26 | "error": { 27 | "no-refresh-token": "Kein Aktualisierungs-Token, um den Google-Zugriff wiederherzustellen", 28 | "token-request-error": "Aktualisierungs-Token-Anfragefehler: __err__", 29 | "refresh-token-error": "Aktualisierungs-Token-Fehler: __message__", 30 | "too-many-refresh-attempts": "Zu viele Aktualisierungsversuche. Abgebrochen.", 31 | "error": "FEHLER: __error__: __description__", 32 | "no-credentials": "FEHLER: Keine Berechtigungen - sollte niemals passieren", 33 | "something-broke": "Bei der Authentifizierung ist ein Fehler aufgetreten. Bitte erneut versuchen.", 34 | "profile-fetch-failed": "Die Authentifizierung funktioniert, aber der Profilabruf ist fehlgeschlagen", 35 | "httperror": "HTTP-Fehler __statusCode__", 36 | "apierror": "API-Fehler, __status__", 37 | "token-mismatch": "Keine Übereinstimmung des CSRF-Tokens, möglicherweise gefälschter Cross-Site-Anfrageversuch" 38 | }, 39 | "message": { 40 | "authorized": "Erfolgreich authorisiert bei Google. Dieses Fenster kann jetzt geschlossen werden." 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /google/locales/de/places.json: -------------------------------------------------------------------------------- 1 | { 2 | "places": { 3 | "label": { 4 | "places": "Google Places", 5 | "nearbysearch": "Nahbereichssuche", 6 | "textsearch": "Ortstextsuche", 7 | "detailssearch": "Ortsdetailsuche", 8 | "nodename": "Node Name", 9 | "requesttype": "Anfragetyp", 10 | "nearby": "Nahbereich (Places Nearby)", 11 | "text": "Ortstext (Places Text)", 12 | "details": "Ortsdetail (Places Details)", 13 | "apikey": "Google API Key", 14 | "query": "Abfrage", 15 | "latitude": "Breitengrad", 16 | "longitude": "Längengrad", 17 | "placeid": "Orts-ID", 18 | "radius": "Radius (m)", 19 | "rankby": "Sortierung", 20 | "prominence": "Bekanntheit", 21 | "distance": "Entfernung", 22 | "keyword": "Schlüsselwort", 23 | "language": "Sprache", 24 | "minprice": "Min. Preis", 25 | "maxprice": "Max. Preis", 26 | "name": "Name", 27 | "types": "Typen", 28 | "extensions": "Erweiterungen", 29 | "opennow": "Jetzt geöffnet", 30 | "output": "Ausgabe", 31 | "resultas": "Ergebnis(se) als", 32 | "multiple": "multiple Nachrichten", 33 | "single": "eine einzige Nachrichten" 34 | }, 35 | "placeholder": { 36 | "nodename": "Node Name", 37 | "query": "Abfrage (Query)", 38 | "latitude": "Breitengrad", 39 | "longitude": "Längengrad", 40 | "placeid": "Orts-ID (Place Id)", 41 | "radius": "Radius", 42 | "keyword": "Schlüsselwort", 43 | "language": "Sprache", 44 | "minprice": "Min. Preis", 45 | "maxprice": "Max. Preis", 46 | "name": "Name", 47 | "types": "Typen", 48 | "extensions": "Erweiterungen (Extensions)" 49 | }, 50 | "status": { 51 | "querying": "Abfrage", 52 | "failed": "Fehlgeschlagen" 53 | }, 54 | "error": { 55 | "no-apikey": "Bitte API Key angeben", 56 | "no-lat_lon": "Bitte Längen- und Breitengrad angeben", 57 | "radius-not-allowed": "Bei Sortierung nach Entfernung ist Radius bei der Anfrage nicht erlaubt. Stattdessen muss Schlüsselwort, Name und/oder Typ angegeben werden.", 58 | "no-keyword_name_type": "Bei Sortierung nach Entfernung muss Schlüsselwort, Name und/oder Typ angegeben werden.", 59 | "no-prominence_distance": "Die erlaubten Optionen bei der Sortierung sind 'Bekanntheit' (Standardwert) und 'Entfernung'", 60 | "no-placeid": "Bitte eine Orts-ID (Place Id) angeben", 61 | "no-text": "Bitte eine Abfrage (Query) für die Ort-Textsuche angeben", 62 | "invalid-placeid": "Bitte eine gültige Orts-ID (Place Id) angeben" 63 | }, 64 | "message": { 65 | "results-returned": "Ergebnisse rückgegeben" 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /google/locales/de/plus.json: -------------------------------------------------------------------------------- 1 | { 2 | "plus": { 3 | "label": { 4 | "plus": "Google Plus", 5 | "name": "Name", 6 | "credentials": "Google-Berechtigungen", 7 | "requesttype": "Anfragetyp", 8 | "people": "Menschen", 9 | "activities": "Aktivitäten", 10 | "comments": "Kommentare", 11 | "action": "Aktion", 12 | "get": "Holen (Get)", 13 | "search": "Suchen", 14 | "list": "Auflisten", 15 | "query": "Abfrage", 16 | "collection": "Kollektion", 17 | "userid": "Benutzer-ID", 18 | "activityid": "Aktivitäts-ID", 19 | "commentid": "Kommentar-ID", 20 | "language": "Sprache", 21 | "maxresults": "Max. Ergebnisse", 22 | "orderby": "Sortierung", 23 | "alphabetical": "Alphabetisch", 24 | "best": "Beste", 25 | "sortorder": "Sortierung", 26 | "ascending": "Aufsteigend", 27 | "descending": "Absteigend", 28 | "pagetoken": "Seiten-Token" 29 | }, 30 | "status": { 31 | "failed": "Fehlgeschlagen" 32 | }, 33 | "error": { 34 | "no-query": "Bitte Abfrage angegeben", 35 | "no-collection": "Bitte Kollektion angegeben", 36 | "no-activityid": "Bitte Aktivitäts-ID angegeben", 37 | "no-commentid": "Bitte Kommentar-ID angegeben", 38 | "no-accesstoken": "Bitte Abfrage-Token bereitstellen" 39 | }, 40 | "message": { 41 | "ok": "OK", 42 | "comment": "Kommentar" 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /google/locales/en-US/calendar.html: -------------------------------------------------------------------------------- 1 | 2 | 25 | 26 | 56 | 57 | 67 | -------------------------------------------------------------------------------- /google/locales/en-US/calendar.json: -------------------------------------------------------------------------------- 1 | { 2 | "calendar": { 3 | "label": { 4 | "google-calendar": "Google Calendar", 5 | "google": "Google", 6 | "calendar": "Calendar", 7 | "inject-message": "Inject message", 8 | "the": "the", 9 | "each-event": "of each event.", 10 | "option_at": "at", 11 | "option_before": "before", 12 | "option_after": "after", 13 | "option_start": "start", 14 | "option_end": "end", 15 | "seconds": "seconds", 16 | "minutes": "minutes", 17 | "hours": "hours", 18 | "days": "days", 19 | "name": "Name", 20 | "count": "Events", 21 | "incl-og-events": "Include ongoing events" 22 | }, 23 | "status": { 24 | "querying": "querying", 25 | "invalid-calendar": "invalid calendar", 26 | "next-event": "querying next event", 27 | "no-event": "no event", 28 | "creating": "creating", 29 | "failed": "failed" 30 | }, 31 | "warn": { 32 | "no-credentials": "Missing google credentials" 33 | }, 34 | "error": { 35 | "invalid-calendar": "invalid calendar", 36 | "error": "Error: __error__", 37 | "no-event": "Error: no event found", 38 | "fetch-failed": "failed to fetch calendar list: __message__", 39 | "error-details": "Error __code__: __message__" 40 | }, 41 | "helptext": { 42 | "count": "Number of events to return [1-10]" 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /google/locales/en-US/directions.json: -------------------------------------------------------------------------------- 1 | { 2 | "directions": { 3 | "label": { 4 | "directions": "Google Directions", 5 | "name": "Name", 6 | "apikey": "Google API Key", 7 | "origin": "Origin", 8 | "destination": "Destination", 9 | "mode": "Mode", 10 | "driving": "Driving", 11 | "walking": "Walking", 12 | "bicycling": "Bicycling", 13 | "transit": "Transit", 14 | "waypoints": "Waypoints", 15 | "alternatives": "Alternatives", 16 | "avoid": "Avoid", 17 | "language": "Language", 18 | "units": "Units", 19 | "metric": "Metric", 20 | "imperial": "Imperial", 21 | "region": "Region", 22 | "departuretime": "Departure Time", 23 | "arraivaltime": "Arrival Time", 24 | "transitmode": "Transit Mode", 25 | "transitpref": "Transit Routing Preferences" 26 | }, 27 | "placeholder": { 28 | "name": "Name" 29 | }, 30 | "status": { 31 | "failed": "failed", 32 | "success": "success" 33 | }, 34 | "error": { 35 | "no-origin": "Please supply an origin value", 36 | "no-destination": "Please supply an destination value", 37 | "no-waypoint": "Could not find origin, destination, or waypoint", 38 | "too-many-waypoints": "Too many waypoints provided. The maximum allowed is 8", 39 | "invalid-request": "Invalid request. Check for an invalid parameter or parameter value", 40 | "too-many-requests": "Too many requests from provided application key", 41 | "request-denied": "Request denied by Google", 42 | "unknown-error": "An unknown error occured. Please try again" 43 | }, 44 | "message": { 45 | "travel-directions": "Travel directions via" 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /google/locales/en-US/geocoding.html: -------------------------------------------------------------------------------- 1 | 2 | 29 | -------------------------------------------------------------------------------- /google/locales/en-US/geocoding.json: -------------------------------------------------------------------------------- 1 | { 2 | "geocoding": { 3 | "label": { 4 | "geocoding": "Google Geocoding", 5 | "geocodeby-address": "Geocode by Address", 6 | "geocodeby-coordinates": "Geocode by Coordinates", 7 | "name": "Name", 8 | "geocodeby": "Geocode by", 9 | "byaddress": "Address", 10 | "bycoordinates": "Coordinates", 11 | "address": "Address", 12 | "latitude": "Latitude", 13 | "longitude": "Longitude", 14 | "apikey": "Google API Key", 15 | "bounds": "Bounds", 16 | "language": "Language", 17 | "region": "Region", 18 | "components": "Components" 19 | }, 20 | "placeholder": { 21 | "name": "Name", 22 | "address": "Address", 23 | "latitude": "Latitude", 24 | "longitude": "Longitude", 25 | "bounds": "Bounds", 26 | "language": "Language", 27 | "region": "Region", 28 | "components": "Components" 29 | }, 30 | "status": { 31 | "failed": "failed" 32 | }, 33 | "error": { 34 | "no-lan_lon": "Please provide a longitude and latitude.", 35 | "no-address": "Please provide an address." 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /google/locales/en-US/google.json: -------------------------------------------------------------------------------- 1 | { 2 | "google": { 3 | "label": { 4 | "google": "Google", 5 | "googleapi": "Google API", 6 | "create": "Create your own project by following these", 7 | "instructions": "instructions", 8 | "copy": "Copy the project credentials here", 9 | "clientid": "Client Id", 10 | "secret": "Secret", 11 | "authenticate": "Authenticate with Google", 12 | "googleuser": "Google User", 13 | "apikey": "API key" 14 | }, 15 | "tip": { 16 | "privateip": "It appears you are running on a private IP address that the Google service cannot reach. Please configure the authorized Redirect URIs of your app to include the following url:
\n__callback__
You will need to edit your hosts file and add an entry for __dummyDomain__ that points to __actualIP__ .
You also need to enable the Google+ API for your new project in the Google Developers Console.
", 17 | "configure": "Please configure the authorized Redirect URIs of your app to include the following url:
\n__callback__
You also need to enable the Google+ API for your new project in the Google Developers Console.
", 18 | "api1": "To obtain these credentials, visit the Google Developer Console. Once signed up:", 19 | "api2": "The subsequent app page will contain the new API key to be copied here.
" 21 | }, 22 | "warn": { 23 | "refreshing-accesstoken": "refreshing access token after 401 error", 24 | "retry-request": "__number__. failed attempts. Waiting __delay__ ms before next attempt." 25 | }, 26 | "error": { 27 | "no-refresh-token": "No refresh token to regain Google access", 28 | "token-request-error": "refresh token request error: __err__", 29 | "refresh-token-error": "refresh token error: __message__", 30 | "too-many-refresh-attempts": "too many refresh attempts, giving up", 31 | "error": "ERROR: __error__: __description__", 32 | "no-credentials": "ERROR: no credentials - should never happen", 33 | "something-broke": "Something went wrong in the authentication process. Please try again.", 34 | "profile-fetch-failed": "auth worked but profile fetching failed", 35 | "httperror": "HTTP Error __statusCode__", 36 | "apierror": "API error, __status__", 37 | "token-mismatch": "CSRF token mismatch, possible cross-site request forgery attempt." 38 | }, 39 | "message": { 40 | "authorized": "Authorised - you can close this window and return to Node-RED" 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /google/locales/en-US/places.json: -------------------------------------------------------------------------------- 1 | { 2 | "places": { 3 | "label": { 4 | "places": "Google Places", 5 | "nearbysearch": "Places Nearby Search", 6 | "textsearch": "Places Text Search", 7 | "detailssearch": "Places Details Search", 8 | "nodename": "Node Name", 9 | "requesttype": "Request Type", 10 | "nearby": "Places Nearby", 11 | "text": "Places Text", 12 | "details": "Places Details", 13 | "apikey": "Google API Key", 14 | "query": "Query", 15 | "latitude": "Latitude", 16 | "longitude": "Longitude", 17 | "placeid": "Place Id", 18 | "radius": "Radius (m)", 19 | "rankby": "Rank by", 20 | "prominence": "Prominence", 21 | "distance": "Distance", 22 | "keyword": "Keyword", 23 | "language": "Language", 24 | "minprice": "Min Price", 25 | "maxprice": "Max Price", 26 | "name": "Name", 27 | "types": "Types", 28 | "extensions": "Extensions", 29 | "opennow": "Open Now?", 30 | "output": "Output", 31 | "resultas": "result(s) as", 32 | "multiple": "multiple messages", 33 | "single": "a single message" 34 | }, 35 | "placeholder": { 36 | "nodename": "Node Name", 37 | "query": "Query", 38 | "latitude": "Latitude", 39 | "longitude": "Longitude", 40 | "placeid": "Place Id", 41 | "radius": "Radius", 42 | "keyword": "Keyword", 43 | "language": "Language", 44 | "minprice": "Min Price", 45 | "maxprice": "Max Price", 46 | "name": "Name", 47 | "types": "Types", 48 | "extensions": "Extensions" 49 | }, 50 | "status": { 51 | "querying": "querying", 52 | "failed": "failed" 53 | }, 54 | "error": { 55 | "no-apikey": "Please provide your application API key.", 56 | "no-lat_lon": "Please provide a longitude and latitude.", 57 | "radius-not-allowed": "If rankby is set to distance, then radius is not allowed in the request. Instead, you are required to provide at least one of keyword/name/types.", 58 | "no-keyword_name_type": "If rankby is set to distance, you are required to provide at least one of keyword/name/types.", 59 | "no-prominence_distance": "The allowed options for rankby are 'prominence'(default) and 'distance'", 60 | "no-placeid": "Please provide a placeid.", 61 | "no-text": "Please provide a query for the places text search.", 62 | "invalid-placeid": "Please provide a valid placeid." 63 | }, 64 | "message": { 65 | "results-returned": "results returned" 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /google/locales/en-US/plus.html: -------------------------------------------------------------------------------- 1 | 2 | 20 | -------------------------------------------------------------------------------- /google/locales/en-US/plus.json: -------------------------------------------------------------------------------- 1 | { 2 | "plus": { 3 | "label": { 4 | "plus": "Google Plus", 5 | "name": "Name", 6 | "credentials": "Google Credentials", 7 | "requesttype": "Request Type", 8 | "people": "People", 9 | "activities": "Activities", 10 | "comments": "Comments", 11 | "action": "Action", 12 | "get": "Get", 13 | "search": "Search", 14 | "list": "List", 15 | "query": "Query", 16 | "collection": "Collection", 17 | "userid": "User Id", 18 | "activityid": "Activity Id", 19 | "commentid": "Comment Id", 20 | "language": "Language", 21 | "maxresults": "Max Results", 22 | "orderby": "Order by", 23 | "alphabetical": "Alphabetical", 24 | "best": "Best", 25 | "sortorder": "Sort Order", 26 | "ascending": "Ascending", 27 | "descending": "Descending", 28 | "pagetoken": "Page Token" 29 | }, 30 | "status": { 31 | "failed": "failed" 32 | }, 33 | "error": { 34 | "no-query": "Please supply a query.", 35 | "no-collection": "Please supply a collection.", 36 | "no-activityid": "Please supply an activityId.", 37 | "no-commentid": "Please supply a commentId.", 38 | "no-accesstoken": "Please provide an accessToken." 39 | }, 40 | "message": { 41 | "ok": "OK", 42 | "comment": "Comment" 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /google/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "node-red-node-google", 3 | "version" : "0.2.3", 4 | "description" : "A set of Node-RED nodes to access various Google services", 5 | "dependencies" : { 6 | "clone": "^0.1.11", 7 | "minimatch": "^3.0.4", 8 | "request":"^2.88.2", 9 | "backoff":"^2.5.0" 10 | }, 11 | "repository" : { 12 | "type":"git", 13 | "url":"https://github.com/node-red/node-red-web-nodes/tree/master/google" 14 | }, 15 | "license": "Apache-2.0", 16 | "keywords": [ "node-red", "google", "calendar", "directions", "places", "geocoding", "google plus" ], 17 | "node-red" : { 18 | "nodes" : { 19 | "google plus": "plus.js", 20 | "google places": "places.js", 21 | "google-api-config": "google.js", 22 | "google geocoding": "geocoding.js", 23 | "google directions": "directions.js", 24 | "google calendar": "calendar.js" 25 | } 26 | }, 27 | "author": { 28 | "name": "Cody Walker", 29 | "email": "cmwalker@us.ibm.com", 30 | "url": "http://nodered.org" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /instagram/README.md: -------------------------------------------------------------------------------- 1 | node-red-node-instagram 2 | ======================= 3 | 4 | Node-RED nodes that get photos 5 | from Instagram. 6 | 7 | Install 8 | ------- 9 | 10 | Run the following command in the root directory of your Node-RED install 11 | 12 | npm install node-red-node-instagram 13 | 14 | Usage 15 | ----- 16 | 17 | Two nodes that get photos from Instagram 18 | 19 | 20 | ### Input Node 21 | 22 | Get photos from Instagram. 23 | 24 | This node automatically checks for new content in a user's account every 15 minutes. 25 | 26 | It can be configured to either retrieve new photos uploaded by the user, or 27 | photos the user has liked. Each message sent by the node contains a single 28 | photo in its payload, either as a Buffer containing the photo or its URL. 29 | 30 | When the metadata is available within Instagram's service, the photo's capture time and location 31 | are also forwarded in the form of **msg.time**, **msg.lat** and **msg.lon**. 32 | 33 | 34 | ### Query node 35 | 36 | Get photos from Instagram. 37 | 38 | This node checks for new content in a user's account whenever it receives a 39 | message. 40 | 41 | It can be configured to either retrieve new photos uploaded by the user, or 42 | photos the user has liked. Each message sent by the node contains a single 43 | photo in its payload, either as a Buffer containing the photo or its URL. 44 | 45 | When the metadata is available within Instagram's service, the photo's capture time and location 46 | are also forwarded in the form of **msg.time**, **msg.lat** and **msg.lon**. 47 | 48 | 49 | ### Note: 50 | 51 | Videos are currently not supported and are ignored. 52 | -------------------------------------------------------------------------------- /instagram/icons/instagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/instagram/icons/instagram.png -------------------------------------------------------------------------------- /instagram/locales/de/instagram.json: -------------------------------------------------------------------------------- 1 | { 2 | "instagram": { 3 | "label": { 4 | "instagram": "Instagram", 5 | "user": "Benutzer", 6 | "type": "Typ", 7 | "userphoto": "Benutzerfotos", 8 | "likedphoto": "Liked-Fotos", 9 | "output": "Ausgabe", 10 | "buffer": "Foto als ein Buffer", 11 | "url": "Foto-URL", 12 | "name": "Name", 13 | "create": "Eigene App erzeugen bei", 14 | "copy": "App-Details hierher kopieren", 15 | "clientid": "Client ID", 16 | "clientsecret": "Client Secret", 17 | "redirecturi": "Weiterleitungs-URI", 18 | "authenticate": "Bei Instagram authentifizieren", 19 | "instagramuser": "Instagram-Benutzer" 20 | }, 21 | "placeholder": { 22 | "name": "Name" 23 | }, 24 | "tip": { 25 | "redirect": "Bitte bei Instagram einstellen, dass folgende Weiterleitungs-URL zur Authentifikation dieser App akzeptiert wird:
\n__constructedURI__
"
26 | },
27 | "warn": {
28 | "image-not-sent": "Instagram-Node ist fehlgeschlagen beim Puffern eines Bildes. Bild wurde nicht gesendet.\n__error__\n__response__",
29 | "missing-accesstoken": "Fehlender Instagram-Access-Token. Authorisierung war nicht abgeschlossen vor der Node-Initialisierung.",
30 | "missing-configuration": "Fehlende Instagram-Konfiguration or -Berechtigung. Authorisierung war nicht abgeschlossen vor der Node-Initialisierung.",
31 | "userphoto-fetch-fail": "Instagram-Node ist fehlgeschlagen beim Abruf des letzten Benutzerfotos: __err__",
32 | "ignoring-media": "Die Instagram-API lieferte nicht alle erforderlichen Daten zur Erstellung der URL des Fotos, weswegen es ignoriert wird",
33 | "not-a-photo": "Das letzte Medium auf Instagram ist kein Foto, weswegen es ignoriert wird",
34 | "not-uploaded-yet": "Der Benutzer hat bislang keine Medien nach Instagram hochgeladen, weswegen keine Nutzdaten (Payload) gesendet wurden",
35 | "likedphoto-fetch-fail": "Instagram-Node ist fehlgeschlagen beim Abruf des letzten Liked-Foto: __err__",
36 | "not-liked-photo": "Das letzte Liked-Medium auf Instagram ist kein Foto, weswegen es ignoriert wird",
37 | "not-liked-yet": "Der Benutzer hat bislang keine Liked-Medien auf Instagram, weswegen keine Nutzdaten (Payload) gesendet wurden",
38 | "latest-media-fetch-failed": "Instagram-Node ist fehlgeschlagen beim Abruf des letzten Mediums: __err__",
39 | "media-fetch-failed": "Instagram-Node ist fehlgeschlagen beim Abruf irgendeines Mediums",
40 | "missing-credentials": "Fehlende Instagram-Berechtigungen"
41 | },
42 | "error": {
43 | "csrf-token-mismatch": "Keine Übereinstimmung des CSRF-Tokens, möglicherweise gefälschter Cross-Site-Anfrageversuch",
44 | "no-required-code": "Die Rückfrage von Instagram enthielt nicht den erforderlichen Code",
45 | "unexpected-statuscode": "Instagram antwortete mit einem unerwarteten HTTP-Status-Code von __statusCode__\nDetails:\n__data__",
46 | "request-error": "Anfragefehler:__err__",
47 | "oauth-error": "OAuth-Fehler: __error__",
48 | "no-ui-credentials": "FEHLER: Abfrage von Benutzeroberfläche (UI) ohne die benötigten Berechtigungen empfangen",
49 | "no-credentials": "FEHLER: Keine Berechtigungen - sollte niemals passieren",
50 | "username-fetch-fail": "FEHLER: Instagram-Node ist fehlgeschlagen beim Abruf des Benutzernamens",
51 | "accesstoken-fetch-fail": "FEHLER: Instagram-Node ist fehlgeschlagen beim Abruf eines gültigen Access-Tokens"
52 | },
53 | "message": {
54 | "authorized": "Erfolgreich authorisiert bei Instagram. Dieses Fenster kann jetzt geschlossen werden."
55 | }
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/instagram/locales/en-US/instagram.html:
--------------------------------------------------------------------------------
1 |
2 |
17 |
18 |
32 |
--------------------------------------------------------------------------------
/instagram/locales/en-US/instagram.json:
--------------------------------------------------------------------------------
1 | {
2 | "instagram": {
3 | "label": {
4 | "instagram": "Instagram",
5 | "user": "User",
6 | "type": "Type",
7 | "userphoto": "User photos",
8 | "likedphoto": "Liked photos",
9 | "output": "Output",
10 | "buffer": "the photo as a buffer",
11 | "url": "the photo url",
12 | "name": "Name",
13 | "create": "Create your own app at",
14 | "copy": "Copy the app details here",
15 | "clientid": "Client Id",
16 | "clientsecret": "Client Secret",
17 | "redirecturi": "Redirect URI",
18 | "authenticate": "Authenticate with Instagram",
19 | "instagramuser": "Instagram User"
20 | },
21 | "placeholder": {
22 | "name": "Name"
23 | },
24 | "tip": {
25 | "redirect": "Please configure Instagram to accept the following Redirect URL for authentication of your application:
\n__constructedURI__
"
26 | },
27 | "warn": {
28 | "image-not-sent": "Instagram node has failed to buffer up an image. Image was not sent.\n__error__\n__response__",
29 | "missing-accesstoken": "Missing Instagram access token. Authorization has not been completed before node initialization.",
30 | "missing-configuration": "Missing Instagram configuration or credentials. Authorization has not been completed before node initialization.",
31 | "userphoto-fetch-fail": "Instagram node has failed to fetch latest user photo : __err__",
32 | "ignoring-media": "The Instagram API has not provided all the required data to establish the URL of the photo. Ignoring media.",
33 | "not-a-photo": "The most recent media on Instagram is not a photo, therefore it has been ignored.",
34 | "not-uploaded-yet": "The user has not uploaded any media to Instagram yet, null payload has been sent",
35 | "likedphoto-fetch-fail": "Instagram node has failed to fetch latest liked photo : __err__",
36 | "not-liked-photo": "The most recently liked media on Instagram is not a photo, therefore it has been ignored.",
37 | "not-liked-yet": "The user has not liked any media on Instagram yet, null payload has been sent",
38 | "latest-media-fetch-failed": "Instagram node has failed to fetch latest media : __err__",
39 | "media-fetch-failed": "Instagram node has failed to fetch any media",
40 | "missing-credentials": "Missing Instagram credentials"
41 | },
42 | "error": {
43 | "csrf-token-mismatch": "CSRF token mismatch, possible cross-site request forgery attempt.",
44 | "no-required-code": "The callback from Instagram did not contain a required code",
45 | "unexpected-statuscode": "Instagram replied with the unexpected HTTP status code of __statusCode__\nDetails:\n__data__",
46 | "request-error": "request error:__err__",
47 | "oauth-error": "oauth error: __error__",
48 | "no-ui-credentials": "ERROR: Received query from UI without the needed credentials",
49 | "no-credentials": "ERROR: no credentials - should never happen",
50 | "username-fetch-fail": "Error! Instagram node has failed to fetch the username.",
51 | "accesstoken-fetch-fail": "Error! Instagram node has failed to fetch a valid access token."
52 | },
53 | "message": {
54 | "authorized": "Successfully authorized with Instagram. You can close this window now."
55 | }
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/instagram/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name" : "node-red-node-instagram",
3 | "version" : "0.1.1",
4 | "description" : "Node-RED nodes that get photos from Instagram",
5 | "dependencies" : {
6 | "request":"~2.74.0",
7 | "instagram-node":"~0.5.1"
8 | },
9 | "repository" : {
10 | "type":"git",
11 | "url":"https://github.com/node-red/node-red-web-nodes/tree/master/instagram"
12 | },
13 | "license": "Apache-2.0",
14 | "keywords": [ "node-red", "instagram", "photo" ],
15 | "node-red" : {
16 | "nodes" : {
17 | "instagram": "instagram.js"
18 | }
19 | },
20 | "author": {
21 | "name": "Zoltan Balogh",
22 | "email": "zoltan.balogh@uk.ibm.com",
23 | "url": "http://nodered.org"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/jawboneup/README.md:
--------------------------------------------------------------------------------
1 | node-red-node-jawboneup
2 | =======================
3 |
4 | A Node-RED node to retrieve
5 | workout information from Jawbone.
6 |
7 | Install
8 | -------
9 |
10 | Run the following command in the root directory of your Node-RED install
11 |
12 | npm install node-red-node-jawboneup
13 |
14 | Usage
15 | -----
16 |
17 | Jawbone Up node.
18 |
19 | Can be used to retrieve the workouts completed since the provided time (given as epoch time). This
20 | time can be passed in as settings on the node or as the `msg.starttime` section of the message input.
21 | The value set on the node will take precedence over the contents of incoming message.
22 |
23 | The number of results to return from the query and how to return them (either as a single message
24 | or as multiple messages) are settings on the node.
25 |
26 | The node sets the following properties, if available,
27 |
28 | - `payload` - the JSON of the workout
29 | - `title` - the type of workout
30 | - `id` - the unique id for the workout
31 | - `location.lat` - the latitude of where the workout took place
32 | - `location.lon` - the longitude of where the workout took place
33 | - `payload.type` - the type of workout
34 | - `payload.starttime` - the start time of the workout as a Javascript Date object
35 | - `payload.duration` - the duration of the workout in seconds
36 | - `payload.distance` - the distance of the workout in meters
37 | - `payload.calories` - the total calories burned during the workout
38 | - `data` - the JSON of the workout
39 |
40 | The exact location of these properties depends on the number of results chosen to be returned along
41 | with how to return them:
42 |
43 | - If the node output value is set to one then for both returning as a single message and as multiple
44 | messages, the node returns a msg for the latest workout since the provided start time. The returned msg
45 | has the properties set on it.
46 | - If the node output value is set to more than one to be returned as a single message
47 | the node sets `msg.payload`
48 | to be an array of msg's, each one corresponding to a workout. The first element in the array is
49 | the latest workout and the length of the array is the output value set on the node or the
50 | number of workouts found, whichever is smaller. Each element in this array has the properties on them.
51 | - If the node output value is set to more than one but to be returned as a multiple then the node sends
52 | multiple msgs, each one representing a workout found.
53 |
54 | Jawbone and Up are trademarks of Jawbone.
55 |
--------------------------------------------------------------------------------
/jawboneup/icons/up.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/jawboneup/icons/up.png
--------------------------------------------------------------------------------
/jawboneup/locales/en-US/jawboneup.html:
--------------------------------------------------------------------------------
1 |
2 |
42 |
--------------------------------------------------------------------------------
/jawboneup/locales/en-US/jawboneup.json:
--------------------------------------------------------------------------------
1 | {
2 | "jawboneup": {
3 | "label": {
4 | "jawboneup": "jawbone up",
5 | "loginas": "Log in as",
6 | "get": "Get",
7 | "workouts": "the workouts completed since",
8 | "epoch": "(epoch)",
9 | "output": "Output",
10 | "resultas": "result(s) as",
11 | "multiple": "multiple messages",
12 | "single": "a single message",
13 | "name": "Name",
14 | "create": "Create an account on",
15 | "signin": ", then sign in via the link",
16 | "under": "under \"Account\" on the left side of the developer portal",
17 | "see": "see",
18 | "copy": "Copy the app details here",
19 | "clientid": "Client Id",
20 | "appsecret": "App Secret",
21 | "authenticate": "Authenticate with Jawbone",
22 | "jawboneuser": "Jawbone User"
23 | },
24 | "tip": {
25 | "redirect": "Please configure the authorized OAuth Redirect URIs of your app to include the following url:
\n__callback__
"
26 | },
27 | "status": {
28 | "failed": "failed"
29 | },
30 | "error": {
31 | "errorinfo": "Error code: __code__, error type: __type__, error detail: __detail__, message: __message__",
32 | "incorrect-output": "Incorrect number of messages to output or incorrect choice of how to output them",
33 | "credentials-error": "problem with credentials being set: __credentials__, ",
34 | "no-parameters": "ERROR: request does not contain the required parameters",
35 | "id_secret-not-defined": "ERROR: client ID and client secret are not defined",
36 | "error": "ERROR: __error__: __description__",
37 | "no-credentials": "ERROR: no credentials - should never happen",
38 | "csrf-token-mismatch": "CSRF token mismatch, possible cross-site request forgery attempt",
39 | "oautherrorinfo": "Something went wrong with the authentication process. The following error was returned:
__statusCode__: __errorData__
", 40 | "oautherrorcode": "Something went wrong with the authentication process. Http return code:
__metaCode__
" 41 | }, 42 | "message": { 43 | "authorized": "Authorised - you can close this window and return to Node-RED" 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /jawboneup/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "node-red-node-jawboneup", 3 | "version" : "0.1.1", 4 | "description" : "A Node-RED node to retrieve workout information from Jawbone.", 5 | "dependencies" : { 6 | "oauth":"~0.9.11", 7 | "request":"~2.74.0" 8 | }, 9 | "repository" : { 10 | "type":"git", 11 | "url":"https://github.com/node-red/node-red-web-nodes/tree/master/jawboneup" 12 | }, 13 | "license": "Apache-2.0", 14 | "keywords": [ "node-red", "jawboneup", "biometric" ], 15 | "node-red" : { 16 | "nodes" : { 17 | "jawboneup": "jawboneup.js" 18 | } 19 | }, 20 | "author": { 21 | "name": "Helen Beeken", 22 | "email": "hbeeken@uk.ibm.com", 23 | "url": "http://nodered.org" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /openweathermap/README.md: -------------------------------------------------------------------------------- 1 | node-red-node-openweathermap 2 | ============================ 3 | 4 | A Node-RED node that gets the 5 | weather report and forecast from OpenWeatherMap. 6 | 7 | Install 8 | ------- 9 | 10 | Run the following command in the root directory of your Node-RED install 11 | 12 | npm install node-red-node-openweathermap 13 | 14 | Usage 15 | ----- 16 | 17 | Two nodes that get the weather report and forecast from OpenWeatherMap. 18 | 19 | **Note:** An API key is required to use these nodes. To obtain an API key 20 | go to OpenWeatherMap. 21 | 22 | 23 | ### Input Node 24 | 25 | Fetches the current weather or 5 day forecast at a location specified by `city and country` or 26 | `latitude and longitude` every 10 minutes - and outputs a **msg** if something has changed. 27 | 28 | ### Query node 29 | 30 | Accepts an input to trigger fetching the current weather either 31 | from a specified `city and country` or `latitude and longitude` or passed in on 32 | 33 | msg.location.city and msg.location.country 34 | or 35 | msg.location.lat and msg.location.lon 36 | 37 | ### Results 38 | 39 | Current conditions will return 40 | 41 | - **description** - a brief verbal description of the current weather for human reading. 42 | - **weather** - a very short description of the current weather. 43 | - **icon** - the weather icon code for the current conditions. 44 | - **id** - the id given to the current weather by OpenWeatherMap 45 | - **tempc** - the current ground temperature at that location in Celsius. 46 | - **tempk** - the current ground temperature at that location in Kelvin. 47 | - **humidity** - the current relative humidity at the location in percent. 48 | - **windspeed** - the current wind speed at the location in metres per second. 49 | - **winddirection** - the current wind direction at the location in meteorological degrees. 50 | - **location** - the name of the location from which the data was sourced. 51 | - **rain** - the precipitation amount in mm/h (only present if it is raining). 52 | 53 | 5 day Forecast will return a 5 part array, each with 54 | 55 | - **dt** - epoch timestamp 56 | - **pressure** - in hPa 57 | - **humidity** - in % 58 | - **speed** - wind speed in metres per second 59 | - **deg** - wind direction in degrees 60 | - **clouds** - cloudiness in % 61 | - **temp** - an object with various temperatures in degC, 62 | - day, min, max, night, eve, morn 63 | - **weather** - an object with some misc. data, 64 | - description, icon, main, id 65 | 66 | 67 | 68 | The node also sets the following properties of **msg.location**. 69 | 70 | - **lat** - the latitude of the location from which the data was sourced. 71 | - **lon** - the longitude of the location from which the data was sourced. 72 | - **city** - the city from which the data was sourced. 73 | - **country** - the country from which the data was sourced. 74 | 75 | Finally, the node sets: 76 | 77 | - **msg.time** - the time at which the weather data was received by OpenWeatherMap. 78 | - **msg.data** - the full JSON returned by the API. This is VERY rich... 79 | 80 | Weather data provided by OpenWeatherMap.org/ 81 | -------------------------------------------------------------------------------- /openweathermap/icons/weather.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/openweathermap/icons/weather.png -------------------------------------------------------------------------------- /openweathermap/locales/de/weather.json: -------------------------------------------------------------------------------- 1 | { 2 | "weather": { 3 | "label": { 4 | "weather": "openweathermap", 5 | "name": "Name", 6 | "location": "Ort", 7 | "option_current": "Aktuelles Wetter für", 8 | "option_5dayforecast": "5-Tage-Vorhersage für", 9 | "option_onecall": "Kombiniertes Aktual-/Vorhersage-Wetter für", 10 | "option_city": "Stadt, Land", 11 | "option_coordinates": "Koordinaten", 12 | "city": "Stadt", 13 | "country": "Land", 14 | "latitude": "Breitengrad", 15 | "longitude": "Längengrad", 16 | "apikey": "API Key", 17 | "language": "Sprache", 18 | "option_lang_en": "Englisch", 19 | "option_lang_ru": "Russisch", 20 | "option_lang_it": "Italienisch", 21 | "option_lang_es": "Spanisch", 22 | "option_lang_uk": "Ukrainisch", 23 | "option_lang_de": "Deutsch", 24 | "option_lang_pt": "Portugiesisch", 25 | "option_lang_ro": "Rumänisch", 26 | "option_lang_pl": "Polnisch", 27 | "option_lang_fi": "Finnisch", 28 | "option_lang_nl": "Niederländisch", 29 | "option_lang_fr": "Französisch", 30 | "option_lang_bg": "Bulgarisch", 31 | "option_lang_sv": "Schwedisch", 32 | "option_lang_zh_tw": "Chinesisch traditionell", 33 | "option_lang_zh": "Chinesisch vereinfacht", 34 | "option_lang_tr": "Türkisch", 35 | "option_lang_hr": "Kroatisch", 36 | "option_lang_ca": "Katalanisch", 37 | "option_lang_hu": "Ungarisch", 38 | "option_lang_ar": "Arabisch", 39 | "option_lang_cz": "Tschechisch", 40 | "option_lang_el": "Griechisch", 41 | "option_lang_fa": "Persisch (Farsi)", 42 | "option_lang_gl": "Galizisch", 43 | "option_lang_ja": "Japanisch", 44 | "option_lang_kr": "Koreanisch", 45 | "option_lang_la": "Lettisch", 46 | "option_lang_lt": "Lithauisch", 47 | "option_lang_mk": "Mazedonisch", 48 | "option_lang_sk": "Slovakisch", 49 | "option_lang_sl": "Slovenisch", 50 | "option_lang_vi": "Vietnamesisch", 51 | "option_lang_xx": "Gesetzt via msg.language" 52 | }, 53 | "placeholder": { 54 | "name": "Name", 55 | "city": "Stadt", 56 | "country": "Land", 57 | "latitude": "Breitengrad", 58 | "longitude": "Längengrad" 59 | }, 60 | "status": { 61 | "requesting": "Anfragend" 62 | }, 63 | "error": { 64 | "invalid-lat": "Ungültiger Breitengrad (lat) vorgegeben", 65 | "invalid-lon": "Ungültiger Längengrad (lon) vorgegeben", 66 | "invalid-json": "Der API-Abruf lieferte ungültigen JSON", 67 | "invalid-key": "Ungültiger API-Key vorgegeben", 68 | "invalid-city_country": "Ungültige(s) Stadt/Land", 69 | "invalid-location": "Ungültige Ortsinformation vorgegeben", 70 | "no-api-key": "Kein API-Key vorgegeben" 71 | }, 72 | "message": { 73 | "title": "Aktuelle Wetter-Information", 74 | "forecast": "5-Tage-Vorhersage", 75 | "description": "Aktuelle Wetter-Information bei Koordinaten: __lat__, __lon__", 76 | "payload": "Das Wetter in __name__ bei Koordinaten: __lat__, __lon__ ist __main__ (__description__)." 77 | }, 78 | "tip": "Tipp: Es empfiehlt sich, vorab manuell den (in Englisch geschriebenen) Ort zu suchen, um zu prüfen, dass er auch gefunden wird. Oftmals funktioniert auch der 2-Zeichen-Ländercode am besten.", 79 | "note": "Notiz: Der API-Key ist möglicherweise nicht sofort einsatzbereit nach der Erzeugung. Die FAQ sagen dazu: Your API key will be activated automatically, between 10 minutes and 2 hours after your successful registration. Einfach etwas warten." 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /openweathermap/locales/en-US/weather.json: -------------------------------------------------------------------------------- 1 | { 2 | "weather": { 3 | "label": { 4 | "weather": "openweathermap", 5 | "name": "Name", 6 | "location": "Location", 7 | "option_current": "Current weather for", 8 | "option_5dayforecast": "5 day forecast for", 9 | "option_onecall": "combined current weather/forecast for", 10 | "option_city": "City, Country", 11 | "option_coordinates": "Coordinates", 12 | "city": "City", 13 | "country": "Country", 14 | "latitude": "Latitude", 15 | "longitude": "Longitude", 16 | "apikey": "API Key", 17 | "language": "Language", 18 | "option_lang_en": "English", 19 | "option_lang_ru": "Russian", 20 | "option_lang_it": "Italian", 21 | "option_lang_es": "Spanish", 22 | "option_lang_uk": "Ukrainian", 23 | "option_lang_de": "German", 24 | "option_lang_pt": "Portuguese", 25 | "option_lang_ro": "Romanian", 26 | "option_lang_pl": "Polish", 27 | "option_lang_fi": "Finnish", 28 | "option_lang_nl": "Dutch", 29 | "option_lang_fr": "French", 30 | "option_lang_bg": "Bulgarian", 31 | "option_lang_sv": "Swedish", 32 | "option_lang_zh_tw": "Chinese Traditional", 33 | "option_lang_zh": "Chinese Simplified", 34 | "option_lang_tr": "Turkish", 35 | "option_lang_hr": "Croatian", 36 | "option_lang_ca": "Catalan", 37 | "option_lang_hu": "Hungarian", 38 | "option_lang_ar": "Arabic", 39 | "option_lang_cz": "Czech", 40 | "option_lang_el": "Greek", 41 | "option_lang_fa": "Persian (Farsi)", 42 | "option_lang_gl": "Galician", 43 | "option_lang_ja": "Japanese", 44 | "option_lang_kr": "Korean", 45 | "option_lang_la": "Latvian", 46 | "option_lang_lt": "Lithuanian", 47 | "option_lang_mk": "Macedonian", 48 | "option_lang_sk": "Slovak", 49 | "option_lang_sl": "Slovenian", 50 | "option_lang_vi": "Vietnamese", 51 | "option_lang_xx": "Set by msg.language" 52 | }, 53 | "placeholder": { 54 | "name": "Name", 55 | "city": "City", 56 | "country": "Country", 57 | "latitude": "Latitude", 58 | "longitude": "Longitude" 59 | }, 60 | "status": { 61 | "requesting": "requesting" 62 | }, 63 | "error": { 64 | "invalid-lat": "Invalid latitude (lat) provided", 65 | "invalid-lon": "Invalid longitude (lon) provided", 66 | "invalid-json": "The API call returned invalid JSON", 67 | "invalid-key": "Invalid API Key provided", 68 | "invalid-city_country": "Invalid city/country", 69 | "invalid-location": "Invalid location information provided", 70 | "no-api-key": "No API key set" 71 | }, 72 | "message": { 73 | "title": "Current Weather Information", 74 | "forecast": "5 day Forecast", 75 | "description": "Current weather information at coordinates: __lat__, __lon__", 76 | "payload": "The weather in __name__ at coordinates: __lat__, __lon__ is __main__ (__description__)." 77 | }, 78 | "tip": "Tip: you may want to manually search for the location first to check it can be found. Often two character country codes work best.", 79 | "note": "Note: The API Key may not immediately ready to use after creation. As FAQ said: Your API key will be activated automatically, between 10 minutes and 2 hours after your successful registration. Just wait a little bit." 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /openweathermap/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-red-node-openweathermap", 3 | "version": "1.0.1", 4 | "description": "A Node-RED node that gets the weather report from openweathermap", 5 | "dependencies": { 6 | "request": "~2.88.2" 7 | }, 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/node-red/node-red-web-nodes/tree/master/openweathermap" 11 | }, 12 | "license": "Apache-2.0", 13 | "keywords": [ 14 | "node-red", 15 | "weather", 16 | "openweathermap" 17 | ], 18 | "node-red": { 19 | "version": ">=0.14.0", 20 | "nodes": { 21 | "openweathermap": "weather.js" 22 | } 23 | }, 24 | "author": { 25 | "name": "Ben Perry", 26 | "email": "BENJAMIP@uk.ibm.com", 27 | "url": "http://nodered.org" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-red-node-web-nodes", 3 | "version": "0.4.3", 4 | "description": "A collection of Node-RED nodes for popular web services.", 5 | "homepage": "http://nodered.org", 6 | "license": "Apache-2.0", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/node-red/node-red-web-nodes.git" 10 | }, 11 | "scripts": { 12 | "test": "grunt" 13 | }, 14 | "keywords": [ 15 | "node-red-web", 16 | "nodes", 17 | "flow", 18 | "flickr", 19 | "pinboard", 20 | "dropbox", 21 | "aws", 22 | "s3", 23 | "swarm", 24 | "foursquare", 25 | "instagram", 26 | "google", 27 | "tfl", 28 | "strava", 29 | "forecastio", 30 | "jawbone" 31 | ], 32 | "devDependencies": { 33 | "aws-sdk": "^2.1659.0", 34 | "backoff": "^2.5.0", 35 | "clone": "^2.1.2", 36 | "dropbox": "^10.20.0", 37 | "fs-extra": "^9.0.1", 38 | "grunt": "^1.2.0", 39 | "grunt-cli": "^1.4.3", 40 | "grunt-contrib-jshint": "^2.1.0", 41 | "grunt-jscs": "^3.0.1", 42 | "grunt-lint-inline": "^1.0.0", 43 | "grunt-simple-mocha": "^0.4.1", 44 | "instagram-node": "^0.5.8", 45 | "is-utf8": "^0.2.1", 46 | "minimatch": "^9.0.0", 47 | "mocha": "^6.2.3", 48 | "nock": "^11.9.1", 49 | "node-red": "^4.0.2", 50 | "node-red-node-test-helper": "~0.3.4", 51 | "oauth": "~0.9.11", 52 | "request": "^2.88.2", 53 | "should": "^13.2.3", 54 | "should-sinon": "^0.0.6", 55 | "sinon": "~8.0.4", 56 | "supertest": "^4.0.2", 57 | "xml2js": "^0.4.0" 58 | }, 59 | "engines": { 60 | "node": ">=8.0.0" 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /pinboard/README.md: -------------------------------------------------------------------------------- 1 | node-red-node-pinboard 2 | ====================== 3 | 4 | A Node-RED node to save bookmarks to Pinboard. 5 | 6 | Install 7 | ------- 8 | 9 | Run the following command in your Node-RED user directory - typically `~/.node-red` 10 | 11 | npm i node-red-node-pinboard 12 | 13 | Usage 14 | ----- 15 | 16 | Saves bookmarks to Pinboard.in. 17 | 18 | The incoming message can provide the following properties: 19 | 20 | - `msg.payload` - the url to save (required) 21 | - `msg.title` - the title for the bookmark (required) 22 | - `msg.description` - the description for the bookmark (optional) 23 | -------------------------------------------------------------------------------- /pinboard/icons/pinboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/pinboard/icons/pinboard.png -------------------------------------------------------------------------------- /pinboard/locales/en-US/pinboard.html: -------------------------------------------------------------------------------- 1 | 2 | 12 | -------------------------------------------------------------------------------- /pinboard/locales/en-US/pinboard.json: -------------------------------------------------------------------------------- 1 | { 2 | "pinboard": { 3 | "label": { 4 | "pinboard": "Pinboard", 5 | "user": "User", 6 | "tags": "Tags", 7 | "private": "Mark as private?", 8 | "later": "Read later?", 9 | "name": "Name", 10 | "token": "Token" 11 | }, 12 | "placeholder": { 13 | "tags": "space-separated tags to add", 14 | "name": "Name" 15 | }, 16 | "tip": { 17 | "apitoken": "You can find your API Token here: https://pinboard.in/settings/password." 18 | }, 19 | "status": { 20 | "saving": "saving" 21 | }, 22 | "error": { 23 | "no-url": "url must be provided in msg.payload", 24 | "no-title": "msg.title must be provided", 25 | "no-apitoken": "missing api token", 26 | "server-error": "server returned error response", 27 | "invalid-json": "server returned invalid json" 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /pinboard/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "node-red-node-pinboard", 3 | "version" : "0.1.2", 4 | "description" : "A Node-RED node to save bookmarks to Pinboard", 5 | "dependencies" : { 6 | }, 7 | "repository" : { 8 | "type":"git", 9 | "url":"https://github.com/node-red/node-red-web-nodes/tree/master/pinboard" 10 | }, 11 | "license": "Apache-2.0", 12 | "keywords": [ "node-red", "pinboard", "bookmark" ], 13 | "node-red" : { 14 | "nodes" : { 15 | "pinboard": "pinboard.js" 16 | } 17 | }, 18 | "author": { 19 | "name": "Nicholas O'Leary", 20 | "email": "knolleary@gmail.com", 21 | "url": "http://nodered.org" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /pinboard/pinboard.html: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 31 | 32 | 56 | 57 | 94 | -------------------------------------------------------------------------------- /pinboard/pinboard.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2014 IBM Corp. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | **/ 16 | 17 | module.exports = function(RED) { 18 | "use strict"; 19 | var https = require("https"); 20 | 21 | function PinboardUserNode(n) { 22 | RED.nodes.createNode(this,n); 23 | } 24 | RED.nodes.registerType("pinboard-user",PinboardUserNode,{ 25 | credentials: { 26 | token: { type:"password" } 27 | } 28 | }); 29 | 30 | 31 | function PinboardOutNode(n) { 32 | RED.nodes.createNode(this,n); 33 | var node = this; 34 | this.tags = n.tags; 35 | this.toread = n.toread; 36 | this.private = n.private; 37 | 38 | this.user = RED.nodes.getNode(n.user); 39 | if (this.user) { 40 | this.on("input", function(msg) { 41 | if (!msg.payload) { 42 | node.error(RED._("pinboard.error.no-url"),msg); 43 | return; 44 | } 45 | if (!msg.title) { 46 | node.error(RED._("pinboard.error.no-title"),msg); 47 | return; 48 | } 49 | var options = { 50 | method: 'GET', 51 | protocol: "https:", 52 | hostname: "api.pinboard.in", 53 | path: "/v1/posts/add?"+ 54 | "url="+encodeURIComponent(msg.payload)+ 55 | "&description="+encodeURIComponent(msg.title)+ 56 | "&auth_token="+node.user.credentials.token+ 57 | "&format=json"+ 58 | "&shared="+((node.private !== false)?"no":"yes")+ 59 | "&toread="+((node.toread === true)?"yes":"no"), 60 | headers: { 61 | "Accept":"application/json" 62 | } 63 | } 64 | // TODO: allow tags to be added by the message 65 | if (node.tags) { 66 | options.path += "&tags="+encodeURIComponent(node.tags); 67 | } 68 | if (msg.description) { 69 | options.path += "&extended="+encodeURIComponent(msg.description); 70 | } 71 | 72 | node.status({fill:"blue",shape:"dot",text:"pinboard.status.saving"}); 73 | 74 | var req = https.request(options, function(res) { 75 | var m = ""; 76 | res.on('data',function(chunk) { 77 | m += chunk; 78 | }); 79 | res.on('end',function() { 80 | var httpStatusMessage, result; 81 | if (res.statusCode < 200 || res.statusCode > 299) { 82 | httpStatusMessage = res.statusMessage || ('Server Error, Status ' + res.statusCode ); 83 | node.error(httpStatusMessage); 84 | node.status({fill:"red",shape:"ring",text:RED._("pinboard.error.server-error")}); 85 | return; 86 | } 87 | try { 88 | result = JSON.parse(m); 89 | } catch (e) { 90 | node.error(e.message, msg); 91 | node.status({fill:"red",shape:"ring",text:RED._("pinboard.error.invalid.json")}); 92 | return; 93 | } 94 | 95 | if (result.result_code == "done") { 96 | node.status({}); 97 | } else { 98 | node.error(result.result_code,msg); 99 | node.status({fill:"red",shape:"ring",text:result.result_code}); 100 | } 101 | }); 102 | }); 103 | req.on('error',function(err) { 104 | node.error(err,msg); 105 | node.status({fill:"red",shape:"ring",text:err.code}); 106 | }); 107 | req.end(); 108 | 109 | }); 110 | } else { 111 | this.error(RED._("pinboard.error.no-apitoken")); 112 | } 113 | 114 | } 115 | RED.nodes.registerType("pinboard out",PinboardOutNode); 116 | }; 117 | -------------------------------------------------------------------------------- /strava/README.md: -------------------------------------------------------------------------------- 1 | node-red-node-strava 2 | ==================== 3 | 4 | A Node-RED node to get your latest 5 | data from Strava. 6 | 7 | Install 8 | ------- 9 | 10 | Run the following command in the root directory of your Node-RED install 11 | 12 | npm install node-red-node-strava 13 | 14 | Usage 15 | ----- 16 | 17 | Get your most recent activity from Strava. 18 | 19 | This node returns the most recent activity in the authenticated user's account 20 | whenever it receives a message. 21 | 22 | Should an activity be available, the following is set on the message: 23 | 24 | - `msg.payload` is set to the JavaScript Activity object as served by Strava. 25 | - `msg.location.lat` and `msg.location.lon` is set to the activity's start location if such location is available 26 | - `msg.time` is a JavaScript date object representing the start of the activity, if such data is available. The date is set in UTC (zulu) time. 27 | 28 | If there are no available activities, or if an error occurs, the node simply forwards the incoming message. 29 | 30 | Data provided by Strava. 31 | -------------------------------------------------------------------------------- /strava/icons/strava.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/strava/icons/strava.png -------------------------------------------------------------------------------- /strava/locales/de/strava.json: -------------------------------------------------------------------------------- 1 | { 2 | "strava": { 3 | "label": { 4 | "strava": "Strava", 5 | "user": "Benutzer", 6 | "request": "Abfrage", 7 | "activity": "Letzte Aktivitäten", 8 | "name": "Name", 9 | "create": "Eigene App erzeugen bei", 10 | "copy": "App-Details hierher kopieren", 11 | "clientid": "Client Id", 12 | "clientsecret": "Client Secret", 13 | "redirecturi": "Weiterleitungs-URI", 14 | "authenticate": "Bei Strava authentifizieren", 15 | "stravauser": "Strava-Benutzer" 16 | }, 17 | "placeholder": { 18 | "name": "Name" 19 | }, 20 | "tip": { 21 | "redirect": "Bitte bei Strava einstellen, dass die folgende Authorization Callback Domain zur Authentifikation dieser App akzeptiert wird:
\n__constructedURIToShow__
"
22 | },
23 | "warn": {
24 | "no-accesstoken": "Fehlender Strava-Access-Token. Authorisierung war nicht abgeschlossen vor der Node-Initialisierung.",
25 | "no-configuration": "Fehlende Strava-Konfiguration or -Berechtigung. Authorisierung war nicht abgeschlossen vor der Node-Initialisierung."
26 | },
27 | "error": {
28 | "no-credentials-ui": "FEHLER: Abfrage von Benutzeroberfläche (UI) ohne die benötigten Berechtigungen empfangen",
29 | "no-credentials": "FEHLER: Keine Berechtigungen - sollte niemals passieren",
30 | "username-error": "FEHLER: Strava-Node ist fehlgeschlagen beim Abruf des Benutzernamens",
31 | "accesstoken-error": "FEHLER: Strava-Node ist fehlgeschlagen beim Abruf eines gültigen Access-Tokens",
32 | "no-id": "Keine Aktivitäts-ID",
33 | "csrf-token-mismatch": "Keine Übereinstimmung des CSRF-Tokens, möglicherweise gefälschter Cross-Site-Anfrageversuch",
34 | "no-code": "Die Rückfrage von Strava enthielt nicht den erforderlichen Code",
35 | "request-error": "Anfragefehler:__err__",
36 | "oauth-error": "OAuth-Fehler: __error__",
37 | "unexpected-statuscode": "Strava antwortete mit einem unerwarteten HTTP-Status-Code von __statusCode__"
38 | },
39 | "message": {
40 | "authorized": "Erfolgreich authorisiert bei Strava. Dieses Fenster kann jetzt geschlossen werden."
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/strava/locales/en-US/strava.html:
--------------------------------------------------------------------------------
1 |
2 |
20 |
--------------------------------------------------------------------------------
/strava/locales/en-US/strava.json:
--------------------------------------------------------------------------------
1 | {
2 | "strava": {
3 | "label": {
4 | "strava": "Strava",
5 | "user": "User",
6 | "request": "Request",
7 | "activity": "get the most recent activity",
8 | "name": "Name",
9 | "create": "Create your own app at",
10 | "copy": "Copy the app details here",
11 | "clientid": "Client Id",
12 | "clientsecret": "Client Secret",
13 | "redirecturi": "Redirect URI",
14 | "authenticate": "Authenticate with Strava",
15 | "stravauser": "Strava User"
16 | },
17 | "placeholder": {
18 | "name": "Name"
19 | },
20 | "tip": {
21 | "redirect": "Please configure Strava to accept the following Authorization Callback Domain for authentication of your application:
\n__constructedURIToShow__
"
22 | },
23 | "warn": {
24 | "no-accesstoken": "Missing Strava access token. Authorization has not been completed before node initialization.",
25 | "no-configuration": "Missing Strava configuration or credentials. Authorization has not been completed before node initialization."
26 | },
27 | "error": {
28 | "no-credentials-ui": "ERROR: Received query from UI without the needed credentials",
29 | "no-credentials": "ERROR: no credentials - should never happen",
30 | "username-error": "Error! Strava node has failed to fetch the authenticated user's name.",
31 | "accesstoken-error": "Error! Strava node has failed to fetch a valid access token.",
32 | "no-id": "No activity ID",
33 | "csrf-token-mismatch": "CSRF token mismatch, possible cross-site request forgery attempt.",
34 | "no-code": "The callback from Strava did not contain a required code",
35 | "request-error": "request error: __err__",
36 | "oauth-error": "oauth error: __dataError__",
37 | "unexpected-statuscode": "Strava replied with the unexpected HTTP status code of __statusCode__"
38 | },
39 | "message": {
40 | "authorized": "Successfully authorized with Strava. You can close this window now."
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/strava/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name" : "node-red-node-strava",
3 | "version" : "0.1.1",
4 | "description" : "A Node-RED node to get your activity from Strava",
5 | "dependencies" : {
6 | "request":"~2.74.0"
7 | },
8 | "repository" : {
9 | "type":"git",
10 | "url":"https://github.com/node-red/node-red-web-nodes/tree/master/strava"
11 | },
12 | "license": "Apache-2.0",
13 | "keywords": [ "node-red", "strava", "biometric", "exercise" ],
14 | "node-red" : {
15 | "nodes" : {
16 | "strava": "strava.js"
17 | }
18 | },
19 | "author": {
20 | "name": "Zoltan Balogh",
21 | "email": "zoltan.balogh@uk.ibm.com",
22 | "url": "http://nodered.org"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/test/darksky/darksky_spec.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/test/darksky/darksky_spec.js
--------------------------------------------------------------------------------
/test/flickr/flickr_spec.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2014 IBM Corp.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | **/
16 |
17 | var should = require("should");
18 | var flickrNode = require("../../flickr/flickr.js");
19 | var helper = require("node-red-node-test-helper");
20 |
21 | describe('flickr nodes', function() {
22 |
23 | beforeEach(function (done) { helper.startServer(done); });
24 |
25 | afterEach(function(done) {
26 | helper.unload();
27 | helper.stopServer(done);
28 | });
29 |
30 | describe('out node', function() {
31 | it('can be loaded', function(done) {
32 | helper.load(flickrNode,
33 | [{id:"n1", type:"helper", wires:[["n2"]]},
34 | {id:"n2", type:"flickr out"}], function() {
35 | var n2 = helper.getNode("n2");
36 | n2.should.have.property('id', 'n2');
37 | done();
38 | });
39 | });
40 | });
41 | });
42 |
--------------------------------------------------------------------------------
/test/forecast/forecastio_spec.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/test/forecast/forecastio_spec.js
--------------------------------------------------------------------------------
/tfl/README.md:
--------------------------------------------------------------------------------
1 | node-red-node-tfl
2 | =================
3 |
4 | Node-RED nodes to interrogate Transport-for-London (TfL) transport APIs for bus and Underground information.
5 |
6 | Install
7 | -------
8 |
9 | Run the following command in the root directory of your Node-RED install
10 |
11 | npm install node-red-node-tfl
12 |
13 | Usage
14 | -----
15 |
16 | ### Buses
17 |
18 | Transport for London Buses and River Buses query node.
19 | Get live bus departure/arrival info for your bus stop.
20 |
21 | This node enables the user to get bus or river bus arrival information for
22 | selected lines arriving at selected stops. The node returns the first vehicle/vessel
23 | to arrive at a particular stop. The data is provided by
24 | Transport for London.
25 |
26 | If bus departures are scheduled from the specified stop then
27 | the node sets `msg.payload` to provide information about this bus:
28 |
29 | - **StopPointName** : The name of the stop the bus is departing from.
30 | - **lineID** : The bus line's number.
31 | - **DestinationText** : The bus's destination text as displayed on the bus.
32 | - **RegistratoinNumber** : The vehicle's registration plate.
33 | - **EstimatedTime** : The Estimated Arrival Time of arrival at the specified stop as a JavaScript object.
34 |
35 | In order to select your bus stop and line, you need to find bus stops first by searching
36 | for them based on a given GPS coordinate and a search radius around specified coordinate.
37 |
38 | Before using this node, please sign up to Transport for London
39 | and accept the terms and conditions to gain access to the live feeds.
40 |
41 | ### Underground
42 |
43 | Transport for London Underground query node.
44 |
45 | This node enables the user to get the Transport for London
46 | status information for the selected London underground line. The node then sets the following properties:
47 |
48 | - `msg.description` - text stating which line the status information is about
49 | - `msg.payload.status` - the TfL CssClass, for example "GoodService", "DisruptedService"
50 | - `msg.payload.goodservice` - a boolean, true if msg.payload.status is "GoodService", false otherwise
51 | - `msg.payload.description` - the description of the status, for example "Good Service", "Part Suspended"
52 | - `msg.payload.details` - the status details if they exist (they are only present when msg.payload.description is not "Good Service")
53 | - `msg.payload.branchdisruptions` - an array of information about the disruptions if any exist
54 | - `msg.data` - object containing the full information about the requested line
55 |
56 | The line can be selected from a list on the node UI, or fed into the node as the `msg.payload.tubeline` of the message input when "Input Defined" is chosen in the UI.
57 |
58 | Before using this node, please sign up to Transport for London
59 | and accept the terms and conditions to gain access to the live feeds.
60 |
61 | Powered by TfL Open Data.
62 |
--------------------------------------------------------------------------------
/tfl/icons/tfl-bus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/tfl/icons/tfl-bus.png
--------------------------------------------------------------------------------
/tfl/icons/train.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/node-red/node-red-web-nodes/f545cad1044c3a9031d89989626ad2ae0fe9b52a/tfl/icons/train.png
--------------------------------------------------------------------------------
/tfl/locales/en-US/tfl-bus.json:
--------------------------------------------------------------------------------
1 | {
2 | "tfl-bus": {
3 | "label": {
4 | "tfl-bus": "TfL Bus",
5 | "latitude": "Latitude",
6 | "longitude": "Longitude",
7 | "radius": "Radius (m)",
8 | "find": "Find bus stops",
9 | "select": "Select Stop",
10 | "findfirst": "Please find a bus stop first",
11 | "line": "Line",
12 | "selectfirst": "Please select a bus stop first",
13 | "name": "Name"
14 | },
15 | "placeholder": {
16 | "latitude": "Latitude of stop",
17 | "longitude": "Longitude of stop",
18 | "radius": "Search radius in metres",
19 | "name": "Name"
20 | },
21 | "tip": {
22 | "signup": "Before using this node please sign up to Transport for London
and accept the terms and conditions to gain access to the live feeds.
Before using this node please sign up to Transport for London
\n and accept the terms and conditions to gain access to the live feeds.