{"version":3,"sources":["webpack:///./node_modules/copy-to-clipboard/index.js","webpack:///./src/assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_08.gif","webpack:///./src/assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_07.png","webpack:///./node_modules/toggle-selection/index.js","webpack:///./src/assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_03.png","webpack:///./node_modules/react-copy-to-clipboard/lib/index.js","webpack:///./src/assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_02.png","webpack:///./src/assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_Raz_01.png","webpack:///./src/assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_04.png","webpack:///./src/assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_05.png","webpack:///./src/assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_06.png","webpack:///./node_modules/react-copy-to-clipboard/lib/Component.js","webpack:///./src/components/Advanced_User/Node-RED_and_MQTT/Projects/FTP_Snapshot/global-login-raz.jsx","webpack:///./src/components/Advanced_User/Node-RED_and_MQTT/Projects/FTP_Snapshot/ftp-server-raz.jsx","webpack:///./src/components/Advanced_User/Node-RED_and_MQTT/Projects/FTP_Snapshot/upload-snapshot-raz.jsx","webpack:///./src/components/Advanced_User/Node-RED_and_MQTT/Projects/FTP_Snapshot/display-snapshot-raz.jsx","webpack:///./src/pages/Advanced_User/openHABian_on_Raspberry_Pi/Projects/FTP_Snapshot/index.jsx"],"names":["deselectCurrent","clipboardToIE11Formatting","module","exports","text","options","debug","message","reselectPrevious","range","selection","mark","success","document","createRange","getSelection","createElement","textContent","style","all","position","top","clip","whiteSpace","webkitUserSelect","MozUserSelect","msUserSelect","userSelect","addEventListener","e","stopPropagation","format","preventDefault","clipboardData","console","warn","window","clearData","setData","onCopy","body","appendChild","selectNodeContents","addRange","execCommand","Error","err","error","copyKey","test","navigator","userAgent","replace","prompt","removeRange","removeAllRanges","removeChild","rangeCount","active","activeElement","ranges","i","push","getRangeAt","tagName","toUpperCase","blur","type","forEach","focus","CopyToClipboard","Object","defineProperty","value","_react","_interopRequireDefault","_copyToClipboard","obj","__esModule","_typeof","Symbol","iterator","constructor","prototype","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","apply","_objectWithoutProperties","source","excluded","key","target","sourceKeys","length","indexOf","_objectWithoutPropertiesLoose","sourceSymbolKeys","propertyIsEnumerable","call","_classCallCheck","instance","Constructor","TypeError","_defineProperties","props","descriptor","configurable","writable","_possibleConstructorReturn","self","_assertThisInitialized","_getPrototypeOf","o","setPrototypeOf","getPrototypeOf","__proto__","ReferenceError","_setPrototypeOf","p","_defineProperty","_React$PureComponent","_getPrototypeOf2","_this","this","_len","arguments","args","Array","_key","concat","event","_this$props","children","elem","Children","only","result","onClick","protoProps","staticProps","subClass","superClass","create","_inherits","_this$props2","cloneElement","getOwnPropertyDescriptors","defineProperties","_objectSpread","PureComponent","undefined","GlobalLoginFlow","state","valuelogin","JSON","stringify","jsondatalogin","copied","render","classes","Fragment","className","root","Paper","alt","src","GlobalLogin","imgcard","setState","Button","variant","color","marginLeft","React","Component","withStyles","flexGrow","marginBottom","FTPServerFlow","valueserver","jsondataserver","FTPServer","SnapUploadFlow","valuedisplay","jsondatadisplay","SnapUp","seodata","imgStyle","SEOHelmet","title","description","image","location","pathname","Typography","id","pills","pill","link","to","href","aria-hidden","classNameName","height","version","viewBox","width","fillRule","d","UIOverview","rel","OpenHabItem","OpenHabSitemap","OpenHabInAction","previousTitle","previousLink","nextTitle","nextLink"],"mappings":"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","file":"component---src-pages-advanced-user-open-ha-bian-on-raspberry-pi-projects-ftp-snapshot-index-jsx-1a05d4b968c917df66d9.js","sourcesContent":["\"use strict\";\n\nvar deselectCurrent = require(\"toggle-selection\");\n\nvar clipboardToIE11Formatting = {\n \"text/plain\": \"Text\",\n \"text/html\": \"Url\",\n \"default\": \"Text\"\n};\nvar defaultMessage = \"Copy to clipboard: #{key}, Enter\";\n\nfunction format(message) {\n var copyKey = (/mac os x/i.test(navigator.userAgent) ? \"⌘\" : \"Ctrl\") + \"+C\";\n return message.replace(/#{\\s*key\\s*}/g, copyKey);\n}\n\nfunction copy(text, options) {\n var debug,\n message,\n reselectPrevious,\n range,\n selection,\n mark,\n success = false;\n\n if (!options) {\n options = {};\n }\n\n debug = options.debug || false;\n\n try {\n reselectPrevious = deselectCurrent();\n range = document.createRange();\n selection = document.getSelection();\n mark = document.createElement(\"span\");\n mark.textContent = text; // reset user styles for span element\n\n mark.style.all = \"unset\"; // prevents scrolling to the end of the page\n\n mark.style.position = \"fixed\";\n mark.style.top = 0;\n mark.style.clip = \"rect(0, 0, 0, 0)\"; // used to preserve spaces and line breaks\n\n mark.style.whiteSpace = \"pre\"; // do not inherit user-select (it may be `none`)\n\n mark.style.webkitUserSelect = \"text\";\n mark.style.MozUserSelect = \"text\";\n mark.style.msUserSelect = \"text\";\n mark.style.userSelect = \"text\";\n mark.addEventListener(\"copy\", function (e) {\n e.stopPropagation();\n\n if (options.format) {\n e.preventDefault();\n\n if (typeof e.clipboardData === \"undefined\") {\n // IE 11\n debug && console.warn(\"unable to use e.clipboardData\");\n debug && console.warn(\"trying IE specific stuff\");\n window.clipboardData.clearData();\n var format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting[\"default\"];\n window.clipboardData.setData(format, text);\n } else {\n // all other browsers\n e.clipboardData.clearData();\n e.clipboardData.setData(options.format, text);\n }\n }\n\n if (options.onCopy) {\n e.preventDefault();\n options.onCopy(e.clipboardData);\n }\n });\n document.body.appendChild(mark);\n range.selectNodeContents(mark);\n selection.addRange(range);\n var successful = document.execCommand(\"copy\");\n\n if (!successful) {\n throw new Error(\"copy command was unsuccessful\");\n }\n\n success = true;\n } catch (err) {\n debug && console.error(\"unable to copy using execCommand: \", err);\n debug && console.warn(\"trying IE specific stuff\");\n\n try {\n window.clipboardData.setData(options.format || \"text\", text);\n options.onCopy && options.onCopy(window.clipboardData);\n success = true;\n } catch (err) {\n debug && console.error(\"unable to copy using clipboardData: \", err);\n debug && console.error(\"falling back to prompt\");\n message = format(\"message\" in options ? options.message : defaultMessage);\n window.prompt(message, text);\n }\n } finally {\n if (selection) {\n if (typeof selection.removeRange == \"function\") {\n selection.removeRange(range);\n } else {\n selection.removeAllRanges();\n }\n }\n\n if (mark) {\n document.body.removeChild(mark);\n }\n\n reselectPrevious();\n }\n\n return success;\n}\n\nmodule.exports = copy;","module.exports = __webpack_public_path__ + \"static/Node-RED_OpenHAB_Projects_FTP_Upload_08-cd560388ffcef633ba0a9b2b39d1ab15.gif\";","module.exports = __webpack_public_path__ + \"static/Node-RED_OpenHAB_Projects_FTP_Upload_07-5c90f9a1404e917bf3cb5ab7b5b8485d.png\";","module.exports = function () {\n var selection = document.getSelection();\n\n if (!selection.rangeCount) {\n return function () {};\n }\n\n var active = document.activeElement;\n var ranges = [];\n\n for (var i = 0; i < selection.rangeCount; i++) {\n ranges.push(selection.getRangeAt(i));\n }\n\n switch (active.tagName.toUpperCase()) {\n // .toUpperCase handles XHTML\n case 'INPUT':\n case 'TEXTAREA':\n active.blur();\n break;\n\n default:\n active = null;\n break;\n }\n\n selection.removeAllRanges();\n return function () {\n selection.type === 'Caret' && selection.removeAllRanges();\n\n if (!selection.rangeCount) {\n ranges.forEach(function (range) {\n selection.addRange(range);\n });\n }\n\n active && active.focus();\n };\n};","module.exports = __webpack_public_path__ + \"static/Node-RED_OpenHAB_Projects_FTP_Upload_03-1ca5b73b0118eac4f05203cb0f93b4ba.png\";","\"use strict\";\n\nvar _require = require('./Component'),\n CopyToClipboard = _require.CopyToClipboard;\n\nCopyToClipboard.CopyToClipboard = CopyToClipboard;\nmodule.exports = CopyToClipboard;","module.exports = __webpack_public_path__ + \"static/Node-RED_OpenHAB_Projects_FTP_Upload_02-2c39ea2d8f56eb815e762aaad17821b9.png\";","module.exports = __webpack_public_path__ + \"static/Node-RED_OpenHAB_Projects_FTP_Upload_Raz_01-d9eebf114a3c556479fa6143debcfcfc.png\";","module.exports = __webpack_public_path__ + \"static/Node-RED_OpenHAB_Projects_FTP_Upload_04-68cd5eafaa37eb5b918f6ce1d35b7632.png\";","module.exports = __webpack_public_path__ + \"static/Node-RED_OpenHAB_Projects_FTP_Upload_05-fe6dbbabd4195255eb439e2987c6afc2.png\";","module.exports = __webpack_public_path__ + \"static/Node-RED_OpenHAB_Projects_FTP_Upload_06-def41bf21dfebf022f7878f7e016692d.png\";","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.CopyToClipboard = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _copyToClipboard = _interopRequireDefault(require(\"copy-to-clipboard\"));\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\n\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(source, true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(source).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n}\n\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nvar CopyToClipboard = /*#__PURE__*/function (_React$PureComponent) {\n _inherits(CopyToClipboard, _React$PureComponent);\n\n function CopyToClipboard() {\n var _getPrototypeOf2;\n\n var _this;\n\n _classCallCheck(this, CopyToClipboard);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(CopyToClipboard)).call.apply(_getPrototypeOf2, [this].concat(args)));\n\n _defineProperty(_assertThisInitialized(_this), \"onClick\", function (event) {\n var _this$props = _this.props,\n text = _this$props.text,\n onCopy = _this$props.onCopy,\n children = _this$props.children,\n options = _this$props.options;\n\n var elem = _react[\"default\"].Children.only(children);\n\n var result = (0, _copyToClipboard[\"default\"])(text, options);\n\n if (onCopy) {\n onCopy(text, result);\n } // Bypass onClick if it was present\n\n\n if (elem && elem.props && typeof elem.props.onClick === 'function') {\n elem.props.onClick(event);\n }\n });\n\n return _this;\n }\n\n _createClass(CopyToClipboard, [{\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n _text = _this$props2.text,\n _onCopy = _this$props2.onCopy,\n _options = _this$props2.options,\n children = _this$props2.children,\n props = _objectWithoutProperties(_this$props2, [\"text\", \"onCopy\", \"options\", \"children\"]);\n\n var elem = _react[\"default\"].Children.only(children);\n\n return _react[\"default\"].cloneElement(elem, _objectSpread({}, props, {\n onClick: this.onClick\n }));\n }\n }]);\n\n return CopyToClipboard;\n}(_react[\"default\"].PureComponent);\n\nexports.CopyToClipboard = CopyToClipboard;\n\n_defineProperty(CopyToClipboard, \"defaultProps\", {\n onCopy: undefined,\n options: undefined\n});","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport { withStyles } from '@material-ui/core/styles'\nimport Button from '@material-ui/core/Button'\nimport Paper from '@material-ui/core/Paper'\n\nimport { CopyToClipboard } from 'react-copy-to-clipboard'\nimport jsondatalogin from './node-red-flow-global-login-raz.json'\n\nimport GlobalLogin from '../../../../../assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_02.png'\n\nconst styles = ({\n root: {\n flexGrow: 1,\n },\n imgcard: {\n marginBottom: '-0.4rem',\n }\n})\n\nclass GlobalLoginFlow extends React.Component {\n state = {\n valuelogin: JSON.stringify(jsondatalogin),\n copied: false,\n };\n\n render() {\n const { classes } = this.props;\n return (\n \n \n
\n \n \n
\n \n this.setState({ copied: true })}>\n Copy Flow to Clipboard \n \n {this.state.copied ? Copied : null} \n \n \n );\n }\n}\n\n\nGlobalLoginFlow.propTypes = {\n classes: PropTypes.object.isRequired,\n}\n\nexport default withStyles(styles)(GlobalLoginFlow)\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport { withStyles } from '@material-ui/core/styles'\nimport Button from '@material-ui/core/Button'\nimport Paper from '@material-ui/core/Paper'\n\nimport { CopyToClipboard } from 'react-copy-to-clipboard'\nimport jsondataserver from './node-red-flow-ftp-server-raz.json'\n\nimport FTPServer from '../../../../../assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_03.png'\n\nconst styles = ({\n root: {\n flexGrow: 1,\n },\n imgcard: {\n marginBottom: '-0.4rem',\n }\n})\n\nclass FTPServerFlow extends React.Component {\n state = {\n valueserver: JSON.stringify(jsondataserver),\n copied: false,\n };\n\n render() {\n const { classes } = this.props;\n return (\n \n \n
\n \n \n
\n \n this.setState({ copied: true })}>\n Copy Flow to Clipboard \n \n {this.state.copied ? Copied : null} \n \n \n );\n }\n}\n\n\nFTPServerFlow.propTypes = {\n classes: PropTypes.object.isRequired,\n}\n\nexport default withStyles(styles)(FTPServerFlow)\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport { withStyles } from '@material-ui/core/styles'\nimport Button from '@material-ui/core/Button'\nimport Paper from '@material-ui/core/Paper'\n\nimport { CopyToClipboard } from 'react-copy-to-clipboard'\nimport jsondataserver from './node-red-flow-upload-snapshot-raz.json'\n\nimport FTPServer from '../../../../../assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_04.png'\n\nconst styles = ({\n root: {\n flexGrow: 1,\n },\n imgcard: {\n marginBottom: '-0.4rem',\n }\n})\n\nclass FTPServerFlow extends React.Component {\n state = {\n valueserver: JSON.stringify(jsondataserver),\n copied: false,\n };\n\n render() {\n const { classes } = this.props;\n return (\n \n \n
\n \n \n
\n \n this.setState({ copied: true })}>\n Copy Flow to Clipboard \n \n {this.state.copied ? Copied : null} \n \n \n );\n }\n}\n\n\nFTPServerFlow.propTypes = {\n classes: PropTypes.object.isRequired,\n}\n\nexport default withStyles(styles)(FTPServerFlow)\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport { withStyles } from '@material-ui/core/styles'\nimport Button from '@material-ui/core/Button'\nimport Paper from '@material-ui/core/Paper'\n\nimport { CopyToClipboard } from 'react-copy-to-clipboard'\nimport jsondatadisplay from './node-red-flow-display-snap-raz.json'\n\nimport SnapUp from '../../../../../assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_05.png'\n\nconst styles = ({\n root: {\n flexGrow: 1,\n },\n imgcard: {\n marginBottom: '-0.4rem',\n }\n})\n\nclass SnapUploadFlow extends React.Component {\n state = {\n valuedisplay: JSON.stringify(jsondatadisplay),\n copied: false,\n };\n\n render() {\n const { classes } = this.props;\n return (\n \n \n
\n \n \n
\n \n this.setState({ copied: true })}>\n Copy Flow to Clipboard \n \n {this.state.copied ? Copied : null} \n \n \n );\n }\n}\n\n\nSnapUploadFlow.propTypes = {\n classes: PropTypes.object.isRequired,\n}\n\nexport default withStyles(styles)(SnapUploadFlow)\n","import React from 'react'\nimport {Link} from 'gatsby'\n\nimport Paper from '@material-ui/core/Paper'\nimport Typography from '@material-ui/core/Typography'\n\nimport { OutboundLink } from 'gatsby-plugin-google-analytics'\n\nimport SEOHelmet from '../../../../../components/Layout/SEOHelmet'\nimport Footer from \"../../../../../components/Layout/footer\"\nimport BreadCrumbs from '../../../../../components/Layout/breadcrumbs/breadcrumbs'\nimport GlobalLoginFlow from '../../../../../components/Advanced_User/Node-RED_and_MQTT/Projects/FTP_Snapshot/global-login-raz'\nimport FTPServerFlow from '../../../../../components/Advanced_User/Node-RED_and_MQTT/Projects/FTP_Snapshot/ftp-server-raz'\nimport UploadFlow from '../../../../../components/Advanced_User/Node-RED_and_MQTT/Projects/FTP_Snapshot/upload-snapshot-raz'\nimport DisplaySnap from '../../../../../components/Advanced_User/Node-RED_and_MQTT/Projects/FTP_Snapshot/display-snapshot-raz'\n\nimport UIOverview from '../../../../../assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_Raz_01.png'\nimport OpenHabItem from '../../../../../assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_06.png'\nimport OpenHabSitemap from '../../../../../assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_07.png'\nimport OpenHabInAction from '../../../../../assets/images/Advanced_User/Node-RED_OpenHAB_Projects_FTP_Upload_08.gif'\n\nconst seodata = {\n title: 'Home Automation :: Triggered FTP Upload using Node-RED',\n description: 'You can use a Node-RED flow to set your trigger an FTP Upload from your camera and display the image in the Node-RED Dashboard.',\n image: '/images/Search/AU_SearchThumb_Node-RED.png'\n}\n\nconst imgStyle = {\n marginBottom: '-0.4rem',\n}\n\nexport default (props) => (\n \n \n \n Home Automation with Node-RED and OpenHAB on a Raspberry Pi\n \n \n\n\n \n \n \n Home Automation with Node-RED and OpenHAB \n \n Triggered FTP Upload using Node-RED \n \n Global Login \n FTP Server \n Snapshot Upload \n Display Snapshot \n \n Bonus :: OpenHAB Integration \n \n \n \n
\n \n \n Triggered FTP Upload using Node-RED\n \n \n \n The screenshot below shows the final UI that we are going to build using Node-RED and the Node-RED Dashboard on the Raspberry Pi.\n \n \n \n \n \n \n \n We will build a component that will store the camera login in a global variable and an interface that allows us to set the FTP server information that we want to use for our upload. In the example we use our Raspberry Pi as local FTP Server. You can, of course, also use your Router or NAS, or another external FTP server.\n To make sure that the server was set correctly, we want to send a request to our camera and display the currently set server. \n After that all we need is a button to trigger the FTP Upload and display the Image that was received in our Node-RED Dashboard.\n \n \n \n Be aware: that this flow uses the MQTT protocol to publish and subscribe to messages. This allows you to integrate the flow into other software platforms like the OpenHAB Home Automation. But you will have to install a MQTT Broker on your Pi to be able to use it. Those MQTT entry and endpoints can be replaced by Link Nodes, if you don't only want to use the Node-RED dashboard to control your camera.\n \n \n \n
\n \n \n Global Login\n \n \n \n \n This component takes your camera's IP address and your admin login and stores it in a global variable. This building block will be part of every project. But only has to be included once in your flow. Every flow that requires the login will have the MQTT Input Node with a subscription to the ipcam/login topic. We test this function by adding a HTML Template Node that is triggered by the Login MQTT Output Node to display the value of the currently set global variables for the camera login.\n \n \n
\n \n \n FTP Server\n \n \n \n \n This flow consists of two parts. The first one receives the FTP server information, through a form element in your dashboard, and writes them into a flow variable (unlike the camera login, that we use as a global variable, this will only be available to nodes on this tab of the Node-RED admin panel). The information is then used to set your FTP server inside your camera using a CGI Command. Your camera will respond with a success or error message that is then displayed on your dashboard. \n The second part of the component is triggered when you submitted your camera login, it then checks the currently set FTP server on your camera and displays those values. The same chain is triggered again, when you typed in new FTP values on the dashboard and submitted them. The dashboard will always show the currently active FTP Server information.\n \n \n
\n \n \n Snapshot Upload\n \n \n \n \n This component is fairly simple. We use a button to publish a MQTT message that then triggers an FTP upload using the global camera login in combination with the FTP Test CGI Command. We then display the success or error message on our dashboard and clear this message after 5s.\n \n \n
\n \n \n Display Snapshot\n \n \n \n \n To display the uploaded image on our dashboard, we can use a Watch Node. We are using node-red-contrib-wfwatch that can be installed using the Palette Menu in the Node-RED admin panel to watch our FTP upload folder for new files. \n Then comes the part that you will have to adjust according to your personal setup. You have to set the Watch Node to watch the receiving folder for your FTP upload. In our case we set up our Raspberry Pi as local FTP Server and created a root directory for our camera to upload the FTP snapshots to - we choose the installation directory of Node-RED /home/openhabian/.node-red/static/ftp/officecam/ . Whenever a file is changed in this folder the Watch Node will be triggered and return the absolute path to the file that was changed. We then use a String Node to build a URL from it - remember that we set the /static directory to be the public folder for the Node-RED webserver? That means that if we have a file with the name ./static/ftp/officecam/snapshot.jpg , then it will be available under http://{`<`}IP Address of your Raspberry Pi{`>`}:1880/ftp/snapshot.jpg . Given this URL, we then can use a HTML Template Node to display the image on our dashboard.\n \n \n
\n \n \n Bonus :: OpenHAB Integration\n \n \n \n \n \n \n \n \n {`Switch FTPSnap (MDGeneralControlGroup) {mqtt=\">[mosquitto:openhab/features/testftp/trigger:command:ON:1],>[mosquitto:openhab/features/testftp/trigger:command:OFF:0]\"}`}
\n {`String FTPSnapState \"FTP Snapshot [%s]\" (MDGeneralControlGroup) {mqtt=\"<[mosquitto:openhab/features/testftp:state:JSONPATH($.ftpsnap)]\"}`}
\n \n \n \n Adding to the OpenHAB tutorial we are now going to consume the Node-RED flow in our OpenHAB 2 Basic UI. As you might have noticed, there are two MQTT Nodes (Input & Output) labeled OpenHAB in the Snapshot Upload part of our flow. They are endpoints that we are now going to use to add a button to OpenHAB, that allows us to trigger the FTP Upload. First, add a String and a Switch item to the items file (see screenshot above). The trigger button is subscribed to the MQTT topic openhab/features/testftp/trigger . We are now using the OpenHAB switch to send a message under that topic and trigger the FTP Upload. \n The String Item has a subscription to openhab/features/testftp that carries the reply from our camera "ftpsnap" : "Upload Successful" . We use the JSONPath transformer to extract the value of ftpsnap and display it in the OpenHAB UI.\n \n \n \n \n \n \n \n \n {`Switch item=FTPSnap label=\"Upload Snapshot\"`}
\n {`Text item=FTPSnapState`}
\n \n \n \n We can now add both Elements to our sitemap (see above). Testing the UI we can see that both the Node-RED Dashboard and the OpenHAB 2 Interface both work in sync. Using the switch triggers the FTP Upload and seconds afterwards we can see the uploaded snapshot in the Node-RED Dashboard (see below).\n \n \n \n \n \n \n \n \n \n \n);"],"sourceRoot":""}