Node-RED与uibuilder构建自定义UI

这篇具有很好参考价值的文章主要介绍了Node-RED与uibuilder构建自定义UI。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

Node-RED是一款可以进行可视化编程的低代码工具, 在快速构建原型和做小型应用有着较大优势. 在Node-RED中构建图形化(GUI)界面通常使用Dashboard完成, 其UI简约好看, 但其界面无法自定义, 只能使用现有的节点组件, 对于特殊界面无法满足. 因此Node-RED社区推出了uibuilder. 其可以使用HTML/JS/CSS等自定义构建页面, 同时也可以引入其它框架(Vue, React等)和组件库(Vue-Bootstrap等), 在通讯层面则通过封装的socket.io与Node-RED通讯. 在本文中就uibuilder与Node-RED的使用做出简要说明.

uibuilder安装

  1. 点击右上角打开菜单, 进入节点管理页面
    uibuilder,Node-RED,IoT,ui,javascript,IoT,node.js
  2. 点击安装, 在输入框输入uibuilder, 点击安装
    uibuilder,Node-RED,IoT,ui,javascript,IoT,node.js
    [注] 如果安装遇到问题, 切换网络再次尝试, 如果仍有问题, 可以参照官网安装教程

uibuilder初始项目解析

实例化uibuilder

从左侧找到uibuilder节点, 双击进行配置.
URL为访问地址, 不可重复. 配置完成后, 点击完成.
uibuilder,Node-RED,IoT,ui,javascript,IoT,node.js
再点击部署后, uibuilder即可正常使用. 访问对应的URL即可看到如下页面.
uibuilder,Node-RED,IoT,ui,javascript,IoT,node.js

文件结构

如果Template 选择的是 ‘Blank template, no framework’ 即 空白模板, 不使用框架. 则uibuilder对于该节点仅有三个文件

  • index.html 页面结构
  • index.js 完成对应功能
  • index.css 页面样式(美化)
    uibuilder,Node-RED,IoT,ui,javascript,IoT,node.js

页面结构

<!doctype html>
<html lang="en"><head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Blank template - Node-RED uibuilder</title>
    <meta name="description" content="Node-RED uibuilder - Blank template">
    <link rel="icon" href="./images/node-blue.ico">
    <link type="text/css" rel="stylesheet" href="./index.css" media="all">
</head><body class="uib">
    <h1>uibuilder Blank Template</h1>
    <button onclick="fnSendToNR('A message from the sharp end!')">Send a msg back to Node-RED</button>
    <pre id="msg" class="syntax-highlight">Waiting for a message from Node-RED</pre>
    <script src="../uibuilder/vendor/socket.io/socket.io.js"></script>
    <script src="./uibuilderfe.min.js"></script>
    <script src="./index.js"></script>
</body></html>

该HTML分为两部分<head><body>. <head>制定页面的元信息, 标题/ICON/引入样式等.
<body>为页面实际主体, 最主要的是<button><pre>; <button>即为按钮, 其onclick(点击)绑定为fnSendToNR('A message from the sharp end!'). 当点击该按钮时, 会调用函数fnSendToNR, 并且以'A message from the sharp end!'为参数.
<pre>为后续显示消息的容器, 绑定idmsg, 后续会根据id查找到该元素进行操作.
其次引入了三个外部的JavaScript文件, socket.io.js用于和Node-RED通信, uibuilderfe.min.jsuibuilder自身依赖提供简单易用接口, index.js为自定义的JavaScript文件.

页面功能

// Send a message back to Node-RED
window.fnSendToNR = function fnSendToNR(payload) {
    uibuilder.send({
        'topic': 'msg-from-uibuilder-front-end',
        'payload': payload,
    })
}
// run this function when the document is loaded
window.onload = function() {
    // Start up uibuilder - see the docs for the optional parameters
    uibuilder.start()

    // Listen for incoming messages from Node-RED
    uibuilder.onChange('msg', function(msg){
        console.info('[indexjs:uibuilder.onChange] msg received from Node-RED server:', msg)

        // dump the msg as text to the "msg" html element
        const eMsg = document.getElementById('msg')
        eMsg.innerHTML = window.syntaxHighlight(msg)
    })
}

index.js中较为核心的是两个函数fnSendToNR window.onload.
index.html中, <button>onclick属性绑定的方法具体实现就在这里. 调用该方法既是调用uibuild.send(该接口来自于uibuilderfe.min.js), 其向Node-RED发送一个对象, 其中payload对应函数的参数, 即index.html中的'A message from the sharp end!'; window.onload为一个回调函数, 当页面加载完成后会调用该函数, 在该函数中, 首先通过uibuilder.start()与Node-RED建立socket.io通信, 之后通过uibuilder.onChange('msg', function(msg){ ... })监听来自Node-RED的数据. 收到数据后, 首先通过document.getElementById获取到放置消息的容器, 之后通过eMsg.innerHTML = window.syntaxHighlight(msg)将收到的数据放入该容器.

页面样式

@import url("./uib-styles.css");

页面样式较为简单, 仅引入了uibuilder公共样式.

案例

为了更完整的介绍uibuilder使用, 这里通过一个小案例引入. 假如我们需要实现一个显示当前温度的页面, 如下图(项目来自于CodePen).
uibuilder,Node-RED,IoT,ui,javascript,IoT,node.js
其代码可以在CodePen找到.
首先将index.html的代码进行合并(删除原有buttonpre, 新增span, inputp).

<!doctype html>
<html lang="en"><head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Blank template - Node-RED uibuilder</title>
    <meta name="description" content="Node-RED uibuilder - Blank template">
    <link rel="icon" href="./images/node-blue.ico">
    <link type="text/css" rel="stylesheet" href="./index.css" media="all">
</head><body class="uib">
    <span class="emoji" role="img" aria-label="happy face">😊</span>
    <input type="range" class="slider" min="0" max="40" value="20" aria-label="temperature in degrees celsius">
    <p class="temperature"><span class="temperature-output">20</span>&deg;C</p>
    <script src="../uibuilder/vendor/socket.io/socket.io.js"></script>
    <script src="./uibuilderfe.min.js"></script>
    <script src="./index.js"></script>
</body></html>

修改index.js

document.addEventListener("DOMContentLoaded", () => {
    const emoji = document.querySelector('.emoji'),
        slider = document.querySelector('.slider'),
        tempOutput = document.querySelector('.temperature-output'),
        displayTemp = temperature => {
            //Display temperature
            tempOutput.textContent = temperature;

            //Display emoji
            if (temperature >= 0 && temperature <= 8) {
                emoji.textContent = '🥶';
                emoji.setAttribute('aria-label', 'freezing face');
            } else if (temperature > 8 && temperature <= 16) {
                emoji.textContent = '😬';
                emoji.setAttribute('aria-label', 'cold face');
            } else if (temperature > 16 && temperature <= 24) {
                emoji.textContent = '😊';
                emoji.setAttribute('aria-label', 'happy face');
            } else if (temperature > 24 && temperature <= 32) {
                emoji.textContent = '😅';
                emoji.setAttribute('aria-label', 'warm face');
            } else {
                emoji.textContent = '🥵';
                emoji.setAttribute('aria-label', 'hot face');
            }

            uibuilder.send({
                'topic': 'msg-from-uibuilder-front-end',
                'payload': temperature,
            })
        }

    // Start up uibuilder - see the docs for the optional parameters
    uibuilder.start()

    // Listen for incoming messages from Node-RED
    uibuilder.onChange('msg', function (msg) {
        console.info('[indexjs:uibuilder.onChange] msg received from Node-RED server:', msg)

        // dump the msg as text to the "msg" html element

        displayTemp(msg.payload);
        slider.value = msg.payload;
        
        // const eMsg = document.getElementById('msg')
        // eMsg.innerHTML = window.syntaxHighlight(msg)
    })
    slider.addEventListener('input', () => displayTemp(slider.value));
});

// Send a message back to Node-RED
window.fnSendToNR = function fnSendToNR(payload) {
    uibuilder.send({
        'topic': 'msg-from-uibuilder-front-end',
        'payload': payload,
    })
}

替换index.css

:root {
    font-size: 20vmin;
}
body {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    height: 100vh;
}
.emoji {
    font-size: 1em;
    margin-bottom: 0.3em;
    text-align: center;
    text-shadow: 0.02em 0.02em 0.02em rgba(0, 0, 0, 0.3);
}
.slider {
    font:inherit;
    width: 4em;
    height: 0.2em;
    border-radius: 1em;  
    background-image: linear-gradient(90deg, #384bdc, #33994a, #df3b33); 
    box-shadow: inset 0 0 0.05em rgba(0, 0, 0, 0.6);
    -webkit-appearance: none;
       -moz-appearance: none;
            appearance: none;
}
.slider::-webkit-slider-thumb {
    position: relative;
    width: 0.25em;
    height: 0.38em;
    border-radius: 0.08em; 
    background-image: radial-gradient(#eee, #ccc);    
    filter: drop-shadow(0.02em 0.02em 0.02em rgba(0, 0, 0, 0.5));
    cursor: pointer;
    -webkit-appearance: none;
            appearance: none;
}
.slider::-moz-range-thumb {
    position: relative;
    width: 0.25em;
    height: 0.38em;
    border-radius: 0.08em; 
    background-image: radial-gradient(#eee, #bbb);    
    filter: drop-shadow(0.02em 0.02em 0.02em rgba(0, 0, 0, 0.5));
    cursor: pointer;
    border: none;
    -moz-appearance: none;
         appearance: none;
}
.temperature {
    font-family: 'Open Sans', Arial, sans-serif;
    font-size: 0.5em;
    font-weight: 400;
    margin-top: 0.45em;
    color: #111;
    text-shadow: 0.02em 0.02em 0.02em rgba(0, 0, 0, 0.1);
}

uibuilder,Node-RED,IoT,ui,javascript,IoT,node.js
uibuilder,Node-RED,IoT,ui,javascript,IoT,node.js文章来源地址https://www.toymoban.com/news/detail-799152.html

到了这里,关于Node-RED与uibuilder构建自定义UI的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker 安装 Node-RED

    Node-RED 是构建物联网应用程序的一个强大工具,使用可视化编程方法,连接起来执行任务。而homeassistant是家居智慧中枢,本文介绍如何安装Node-RED及HASS的插件 docker pull nodered/node-red # 2、部署镜像 创建目录 分配权限: 部署命令 端口是 18880 数据存储路径 /opt/node_red docker服务包

    2024年02月09日
    浏览(47)
  • node-red - 读写操作redis

    安装配置node-red环境: centos通过源文件的方式安装node-red nodered-环境搭建及使用 安装配置redis: centos - docker安装redis Windows10安装redis(图文教程) Redis支持的数据结构 回到目录 1.在node-red里面安装redis节点 : 2. 刷新node-red: 回到目录 3.1.1 List(列表)存储 :redis-out节点   redis

    2024年02月10日
    浏览(41)
  • Node-Red中Homeassistant节点使用

    谷歌解释:Home Assistant is an open-source home automation platform that focuses on privacy and local control. 是一个开源的家庭自动化控制管理平台。 Homeassistant简称HA,目前我们想要远程控制家里的电器等设备,首先需要购买智能家居,而智能家居市场上存在许多家居生态(米家、天猫、homeki

    2024年02月09日
    浏览(44)
  • 如何使用 Docker 安装 Node-RED

    安装 Node-RED 使用 Docker 是一种简便的方式,以下是基本的步骤: 安装 Docker: 确保已在系统上安装 Docker。可从 Docker 官方网站 或 Windows Docker 安装教程 获取安装指南。 拉取运行 Node-RED 镜像: 打开终端或命令行界面,运行以下命令安装 Node-RED。您可以使用官方的 nodered/node-r

    2024年04月22日
    浏览(48)
  • 在nodejs应用中集成node-red

    随着物联网(IoT)和边缘计算的快速发展,实时数据处理和可视化变得越来越重要。Node-RED是一个基于JavaScript的开源平台,用于创建实时数据流应用程序。它提供了一个可视化的开发环境,使用户可以轻松地构建、部署和管理数据流。本文将介绍如何在Node.js应用中集成Node-RED,以

    2024年02月14日
    浏览(49)
  • 【Node-RED】安全登陆时,账号密码设置

    Node-RED 在初始下载完成时,登录是无账号密码的。基于安全性考虑,本期博文介绍 在安全登陆时,如何进行账号密码设置 。当然,此处可以参考官方使用指南Securing Node-RED,里面有更为详细的介绍。 而本博文只对用到的进行日志记录,方便后续回顾查看 。 在使用指南中,对

    2024年02月19日
    浏览(39)
  • node-red安全部署方式-安全登录功能

      安装号的node-red,默认是没有用户登陆功能的,每次进入工作界面只需输入 服务器ip:端口号 即可登陆。但是假如其他人知道了我们的ip地址,岂不是任何人都可以访问我们的服务器呢?基于这种情况,我们需要给node-red添加安全认证,即安全登陆功能,使得每次进入node

    2024年02月15日
    浏览(49)
  • Node-Red与ModbusTCP设备通信——读数据

    一、内容简介 本篇内容主要介绍Node-Red通过node-red-contrib-modbus插件与ModbusTCP设备进行通讯,这里用Modbus Slave工具来模拟从站设备,Node-Red作为主站分别从0地址开始读取10个线圈状态和10个保持寄存器,分别用Modbus-Read、Modbus-Getter、Modbus-Flex-Getter三个节点以不同的方式来实现。

    2024年01月24日
    浏览(59)
  • Node-Red-访客、操作员和管理员登录

    要实现Node-Red识别图片内容,在这里我们需要下载安装有控件: node-red-dashboard 。 首先在左上角点击设置,并找到节点管理 ; 在节点管理中点击安装; 在安装界面的查询窗口输入node-red-dashboard控件,查询后选择下载,等待下载完成; 本案例主要实现的功能包含有模式选择及

    2023年04月08日
    浏览(83)
  • centos通过源文件的方式安装node-red

    [回到目录]  查看你的Linux系统是32位还是64位的,不要搞错版本了。执行命令: cat /proc/version  下载地址:【https://npm.taobao.org/mirrors/node/】  选择合适的版本下载: 记住查看你的Linux系统是32位还是64位的,不要搞错版本了。一般x86_64是64位,x86是32位的。 我的服务器是64位的

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包