UNPKG

node-red-contrib-symi

Version:

Node-RED nodes for smart home device communication with Home Assistant integration, supporting HassKit, Clowire, Alive, LF and complete Symi protocols

871 lines (830 loc) 36.5 kB
<script type="text/javascript"> RED.nodes.registerType('symi config', { category: 'config', defaults: { connectionType: { value: "tcp", required: true }, host: { value: "localhost" }, port: { value: 8666, validate: RED.validators.number() }, serialPort: { value: "/dev/ttyUSB0" }, baudRate: { value: 9600, validate: RED.validators.number() }, dataBits: { value: 8, validate: RED.validators.number() }, stopBits: { value: 1, validate: RED.validators.number() }, parity: { value: "none" } }, color: "#E91E63", icon: "font-awesome/fa-cog", label: function () { if (this.connectionType === "serial") { return this.serialPort + "@" + this.baudRate; } else { return this.host + ":" + this.port; } }, oneditprepare: function () { $("#node-config-input-connectionType").change(function () { const type = $(this).val(); if (type === "tcp") { $(".tcp-config").show(); $(".serial-config").hide(); } else { $(".tcp-config").hide(); $(".serial-config").show(); } }); // 初始化显示 $("#node-config-input-connectionType").trigger('change'); } }); </script> <script type="text/html" data-template-name="symi config"> <div class="form-row"> <label for="node-config-input-connectionType"><i class="fa fa-plug"></i> 连接方式</label> <select id="node-config-input-connectionType" style="width:125px !important"> <option value="tcp">TCP网络</option> <option value="serial">串口通信</option> </select> </div> <!-- TCP配置 --> <div class="tcp-config"> <div class="form-row"> <label for="node-config-input-host"><i class="fa fa-bookmark"></i> Host</label> <input type="text" id="node-config-input-host"> </div> <div class="form-row"> <label for="node-config-input-port"><i class="fa fa-bookmark"></i> Port</label> <input type="text" id="node-config-input-port"> </div> </div> <!-- 串口配置 --> <div class="serial-config"> <div class="form-row"> <label for="node-config-input-serialPort"><i class="fa fa-usb"></i> 串口路径</label> <input type="text" id="node-config-input-serialPort" placeholder="/dev/ttyUSB0 或 COM1"> </div> <div class="form-row"> <label for="node-config-input-baudRate"><i class="fa fa-tachometer"></i> 波特率</label> <select id="node-config-input-baudRate" style="width:125px !important"> <option value="1200">1200</option> <option value="2400">2400</option> <option value="4800">4800</option> <option value="9600">9600</option> <option value="19200">19200</option> <option value="38400">38400</option> <option value="57600">57600</option> <option value="115200">115200</option> </select> </div> <div class="form-row"> <label for="node-config-input-dataBits"><i class="fa fa-list-ol"></i> 数据位</label> <select id="node-config-input-dataBits" style="width:125px !important"> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> </select> </div> <div class="form-row"> <label for="node-config-input-stopBits"><i class="fa fa-stop"></i> 停止位</label> <select id="node-config-input-stopBits" style="width:125px !important"> <option value="1">1</option> <option value="2">2</option> </select> </div> <div class="form-row"> <label for="node-config-input-parity"><i class="fa fa-check"></i> 校验位</label> <select id="node-config-input-parity" style="width:125px !important"> <option value="none">无校验</option> <option value="even">偶校验</option> <option value="odd">奇校验</option> </select> </div> </div> </script> <script type="text/javascript"> RED.nodes.registerType('climate board', { category: 'symi', defaults: { name: { value: "" }, server: { value: "", type: "symi config", required: true }, entity_id: { value: "" }, uid: { value: "", required: true }, address: { value: "", required: true }, channel: { value: "" }, devtype: { value: "clowire", required: true }, }, color: "#2196F3", inputs: 1, outputs: 1, icon: "font-awesome/fa-thermometer-half", label: function () { return this.name || this.uid + '/' + this.entity_id; }, oneditprepare: function () { let n = this n.data = {} $("#node-input-devtype").change(function () { if(n.data.data) handleFn($(this).val()) }) function handleFn(val) { n.typeList = ['climate'] handleSelectData(n.data, n) } function handleSelectData(data, n, type) { data = data.data $('#node-input-entity_id').html('') if (data.homeAssistant) { let states = data.homeAssistant.states for (let state in states) { if (n.typeList.indexOf(states[state].entity_id.split('.')[0]) === -1) continue let $row = $(`<option value="${states[state].entity_id}">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) if (states[state].entity_id === n.entity_id) $row = $(`<option value="${states[state].entity_id}" selected = "selected">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) $('#node-input-entity_id').append($row) } } } $.getJSON('GetHaDevList', function (data) { n.data = data handleFn(n.devtype) }) }, }); </script> <script type="text/html" data-template-name="climate board"> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-row"> <label for="node-input-server"><i class="fa fa-tag"></i>通信服务</label> <input type="text" id="node-input-server" > </div> <div class="form-row"> <label for="node-input-uid"><i class="fa fa-tag"></i> 设备UID</label> <input type="text" id="node-input-uid" > </div> <div class="form-row"> <label for="node-input-address"><i class="fa fa-tag"></i> 设备地址</label> <input type="text" id="node-input-address" > </div> <div class="form-row"> <label for="node-input-channel"><i class="fa fa-tag"></i> 设备通道</label> <input type="text" id="node-input-channel" > </div> <div class="form-row"> <label for="node-input-devtype"><i class="fa fa-tag"></i> 设备类型</label> <select id="node-input-devtype" style="width:125px !important"> <option value="clowire">CLOWIRE</option> <option value="hasskit">HASSKIT</option> <option value="alive">ALIVE</option> <option value="lf">LF</option> <option value="symi">亖米(SYMI)</option> </select> </div> <div class="form-row"> <label for="node-input-entity_id"><i class="fa fa-tag"></i> entity_id</label> <select id="node-input-entity_id" style="width:70%"> </select> </div> </script> <script type="text/javascript"> RED.nodes.registerType('switch board', { category: 'symi', defaults: { name: { value: "" }, server: { value: "", type: "symi config", required: true }, entity_id: { value: "" }, uid: { value: "", required: true }, address: { value: "", required: true }, channel: { value: "" }, devtype: { value: "clowire", required: true }, }, color: "#4CAF50", inputs: 1, outputs: 1, icon: "font-awesome/fa-power-off", label: function () { return this.name || this.uid + '/' + this.address + '/' + this.entity_id; }, oneditprepare: function () { let self = this $.getJSON('GetHaDevList', function (data) { data = data.data if (data.homeAssistant) { let states = data.homeAssistant.states for (let state in states) { if (['switch', 'light'].indexOf(states[state].entity_id.split('.')[0]) === -1) continue let $row = $(`<option value="${states[state].entity_id}">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) if (states[state].entity_id === self.entity_id) $row = $(`<option value="${states[state].entity_id}" selected = "selected">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) $('#node-input-entity_id').append($row) } } }) }, }); </script> <script type="text/html" data-template-name="switch board"> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-row"> <label for="node-input-server"><i class="fa fa-tag"></i>通信服务</label> <input type="text" id="node-input-server" > </div> <div class="form-row"> <label for="node-input-uid"><i class="fa fa-tag"></i> 设备UID</label> <input type="text" id="node-input-uid" > </div> <div class="form-row"> <label for="node-input-address"><i class="fa fa-tag"></i> 设备地址</label> <input type="text" id="node-input-address" > </div> <div class="form-row"> <label for="node-input-channel"><i class="fa fa-tag"></i> 设备通道</label> <input type="text" id="node-input-channel" > </div> <div class="form-row"> <label for="node-input-devtype"><i class="fa fa-tag"></i> 设备类型</label> <select id="node-input-devtype" style="width:125px !important"> <option value="clowire">CLOWIRE</option> <option value="hasskit">HASSKIT</option> <option value="alive">ALIVE</option> <option value="lf">LF</option> <option value="symi">亖米(SYMI)</option> </select> </div> <div class="form-row" > <label for="node-input-entity_id" ><i class="fa fa-tag"></i> entity_id</label> <select id="node-input-entity_id" style="width:70%"> </select> </div> </script> <!-- 灯光设备节点 --> <script type="text/javascript"> RED.nodes.registerType('light board', { category: 'symi', defaults: { name: { value: "" }, server: { value: "", type: "symi config", required: true }, entity_id: { value: "" }, uid: { value: "", required: true }, address: { value: "", required: true }, channel: { value: "" }, devtype: { value: "clowire", required: true }, }, color: "#FFC107", inputs: 1, outputs: 1, icon: "font-awesome/fa-lightbulb-o", label: function () { return this.name || '灯光/' + this.uid + '/' + this.address + '/' + this.entity_id; }, oneditprepare: function () { let n = this n.data = {} $("#node-input-devtype").change(function () { if(n.data.data) handleFn($(this).val()) }) function handleFn(val) { n.typeList = ['light'] handleSelectData(n.data, n) } function handleSelectData(data, n, type) { data = data.data $('#node-input-entity_id').html('') if (data.homeAssistant) { let states = data.homeAssistant.states for (let state in states) { if (n.typeList.indexOf(states[state].entity_id.split('.')[0]) === -1) continue let $row = $(`<option value="${states[state].entity_id}">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) if (states[state].entity_id === n.entity_id) $row = $(`<option value="${states[state].entity_id}" selected = "selected">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) $('#node-input-entity_id').append($row) } } } $.getJSON('GetHaDevList', function (data) { n.data = data handleFn(n.devtype) }) }, }); </script> <script type="text/html" data-template-name="light board"> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-row"> <label for="node-input-server"><i class="fa fa-tag"></i>通信服务</label> <input type="text" id="node-input-server" > </div> <div class="form-row"> <label for="node-input-uid"><i class="fa fa-tag"></i> 设备UID</label> <input type="text" id="node-input-uid" > </div> <div class="form-row"> <label for="node-input-address"><i class="fa fa-tag"></i> 设备地址</label> <input type="text" id="node-input-address" > </div> <div class="form-row"> <label for="node-input-channel"><i class="fa fa-tag"></i> 设备通道</label> <input type="text" id="node-input-channel" > </div> <div class="form-row"> <label for="node-input-devtype"><i class="fa fa-tag"></i> 协议类型</label> <select id="node-input-devtype" style="width:125px !important"> <option value="clowire">CLOWIRE</option> <option value="hasskit">HASSKIT</option> <option value="alive">ALIVE</option> <option value="lf">LF</option> <option value="symi">亖米(SYMI)</option> </select> </div> <div class="form-row" > <label for="node-input-entity_id" ><i class="fa fa-tag"></i> entity_id</label> <select id="node-input-entity_id" style="width:70%"> </select> </div> </script> <!-- 空调设备节点 --> <script type="text/javascript"> RED.nodes.registerType('hvac board', { category: 'symi', defaults: { name: { value: "" }, server: { value: "", type: "symi config", required: true }, entity_id: { value: "" }, uid: { value: "", required: true }, address: { value: "", required: true }, channel: { value: "" }, devtype: { value: "clowire", required: true }, }, color: "#03A9F4", inputs: 1, outputs: 1, icon: "font-awesome/fa-snowflake-o", label: function () { return this.name || '空调/' + this.uid + '/' + this.address + '/' + this.entity_id; }, oneditprepare: function () { let n = this n.data = {} $("#node-input-devtype").change(function () { if(n.data.data) handleFn($(this).val()) }) function handleFn(val) { n.typeList = ['climate'] handleSelectData(n.data, n) } function handleSelectData(data, n, type) { data = data.data $('#node-input-entity_id').html('') if (data.homeAssistant) { let states = data.homeAssistant.states for (let state in states) { if (n.typeList.indexOf(states[state].entity_id.split('.')[0]) === -1) continue let $row = $(`<option value="${states[state].entity_id}">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) if (states[state].entity_id === n.entity_id) $row = $(`<option value="${states[state].entity_id}" selected = "selected">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) $('#node-input-entity_id').append($row) } } } $.getJSON('GetHaDevList', function (data) { n.data = data handleFn(n.devtype) }) }, }); </script> <script type="text/html" data-template-name="hvac board"> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-row"> <label for="node-input-server"><i class="fa fa-tag"></i>通信服务</label> <input type="text" id="node-input-server" > </div> <div class="form-row"> <label for="node-input-uid"><i class="fa fa-tag"></i> 设备UID</label> <input type="text" id="node-input-uid" > </div> <div class="form-row"> <label for="node-input-address"><i class="fa fa-tag"></i> 设备地址</label> <input type="text" id="node-input-address" > </div> <div class="form-row"> <label for="node-input-channel"><i class="fa fa-tag"></i> 设备通道</label> <input type="text" id="node-input-channel" > </div> <div class="form-row"> <label for="node-input-devtype"><i class="fa fa-tag"></i> 协议类型</label> <select id="node-input-devtype" style="width:125px !important"> <option value="clowire">CLOWIRE</option> <option value="hasskit">HASSKIT</option> <option value="alive">ALIVE</option> <option value="lf">LF</option> <option value="symi">亖米(SYMI)</option> </select> </div> <div class="form-row" > <label for="node-input-entity_id" ><i class="fa fa-tag"></i> entity_id</label> <select id="node-input-entity_id" style="width:70%"> </select> </div> </script> <!-- 窗帘设备节点 --> <script type="text/javascript"> RED.nodes.registerType('curtain board', { category: 'symi', defaults: { name: { value: "" }, server: { value: "", type: "symi config", required: true }, entity_id: { value: "" }, uid: { value: "", required: true }, address: { value: "", required: true }, channel: { value: "" }, devtype: { value: "clowire", required: true }, }, color: "#8BC34A", inputs: 1, outputs: 1, icon: "font-awesome/fa-window-maximize", label: function () { return this.name || '窗帘/' + this.uid + '/' + this.address + '/' + this.entity_id; }, oneditprepare: function () { let self = this $.getJSON('GetHaDevList', function (data) { data = data.data if (data.homeAssistant) { let states = data.homeAssistant.states for (let state in states) { if (['cover'].indexOf(states[state].entity_id.split('.')[0]) === -1) continue let $row = $(`<option value="${states[state].entity_id}">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) if (states[state].entity_id === self.entity_id) $row = $(`<option value="${states[state].entity_id}" selected = "selected">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) $('#node-input-entity_id').append($row) } } }) }, }); </script> <script type="text/html" data-template-name="curtain board"> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-row"> <label for="node-input-server"><i class="fa fa-tag"></i>通信服务</label> <input type="text" id="node-input-server" > </div> <div class="form-row"> <label for="node-input-uid"><i class="fa fa-tag"></i> 设备UID</label> <input type="text" id="node-input-uid" > </div> <div class="form-row"> <label for="node-input-address"><i class="fa fa-tag"></i> 设备地址</label> <input type="text" id="node-input-address" > </div> <div class="form-row"> <label for="node-input-channel"><i class="fa fa-tag"></i> 设备通道</label> <input type="text" id="node-input-channel" > </div> <div class="form-row"> <label for="node-input-devtype"><i class="fa fa-tag"></i> 协议类型</label> <select id="node-input-devtype" style="width:125px !important"> <option value="clowire">CLOWIRE</option> <option value="hasskit">HASSKIT</option> <option value="alive">ALIVE</option> <option value="lf">LF</option> <option value="symi">亖米(SYMI)</option> </select> </div> <div class="form-row" > <label for="node-input-entity_id" ><i class="fa fa-tag"></i> entity_id</label> <select id="node-input-entity_id" style="width:70%"> </select> </div> </script> <!-- 地暖设备节点 --> <script type="text/javascript"> RED.nodes.registerType('heating board', { category: 'symi', defaults: { name: { value: "" }, server: { value: "", type: "symi config", required: true }, entity_id: { value: "" }, uid: { value: "", required: true }, address: { value: "", required: true }, channel: { value: "" }, devtype: { value: "clowire", required: true }, }, color: "#FF5722", inputs: 1, outputs: 1, icon: "font-awesome/fa-fire", label: function () { return this.name || '地暖/' + this.uid + '/' + this.address + '/' + this.entity_id; }, oneditprepare: function () { let self = this $.getJSON('GetHaDevList', function (data) { data = data.data if (data.homeAssistant) { let states = data.homeAssistant.states for (let state in states) { if (['climate'].indexOf(states[state].entity_id.split('.')[0]) === -1) continue let $row = $(`<option value="${states[state].entity_id}">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) if (states[state].entity_id === self.entity_id) $row = $(`<option value="${states[state].entity_id}" selected = "selected">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) $('#node-input-entity_id').append($row) } } }) }, }); </script> <script type="text/html" data-template-name="heating board"> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-row"> <label for="node-input-server"><i class="fa fa-tag"></i>通信服务</label> <input type="text" id="node-input-server" > </div> <div class="form-row"> <label for="node-input-uid"><i class="fa fa-tag"></i> 设备UID</label> <input type="text" id="node-input-uid" > </div> <div class="form-row"> <label for="node-input-address"><i class="fa fa-tag"></i> 设备地址</label> <input type="text" id="node-input-address" > </div> <div class="form-row"> <label for="node-input-channel"><i class="fa fa-tag"></i> 设备通道</label> <input type="text" id="node-input-channel" > </div> <div class="form-row"> <label for="node-input-devtype"><i class="fa fa-tag"></i> 协议类型</label> <select id="node-input-devtype" style="width:125px !important"> <option value="clowire">CLOWIRE</option> <option value="hasskit">HASSKIT</option> <option value="alive">ALIVE</option> <option value="lf">LF</option> <option value="symi">亖米(SYMI)</option> </select> </div> <div class="form-row" > <label for="node-input-entity_id" ><i class="fa fa-tag"></i> entity_id</label> <select id="node-input-entity_id" style="width:70%"> </select> </div> </script> <!-- 新风设备节点 --> <script type="text/javascript"> RED.nodes.registerType('ventilation board', { category: 'symi', defaults: { name: { value: "" }, server: { value: "", type: "symi config", required: true }, entity_id: { value: "" }, uid: { value: "", required: true }, address: { value: "", required: true }, channel: { value: "" }, devtype: { value: "clowire", required: true }, }, color: "#009688", inputs: 1, outputs: 1, icon: "font-awesome/fa-leaf", label: function () { return this.name || '新风/' + this.uid + '/' + this.address + '/' + this.entity_id; }, oneditprepare: function () { let self = this $.getJSON('GetHaDevList', function (data) { data = data.data if (data.homeAssistant) { let states = data.homeAssistant.states for (let state in states) { if (['fan'].indexOf(states[state].entity_id.split('.')[0]) === -1) continue let $row = $(`<option value="${states[state].entity_id}">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) if (states[state].entity_id === self.entity_id) $row = $(`<option value="${states[state].entity_id}" selected = "selected">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) $('#node-input-entity_id').append($row) } } }) }, }); </script> <script type="text/html" data-template-name="ventilation board"> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-row"> <label for="node-input-server"><i class="fa fa-tag"></i>通信服务</label> <input type="text" id="node-input-server" > </div> <div class="form-row"> <label for="node-input-uid"><i class="fa fa-tag"></i> 设备UID</label> <input type="text" id="node-input-uid" > </div> <div class="form-row"> <label for="node-input-address"><i class="fa fa-tag"></i> 设备地址</label> <input type="text" id="node-input-address" > </div> <div class="form-row"> <label for="node-input-channel"><i class="fa fa-tag"></i> 设备通道</label> <input type="text" id="node-input-channel" > </div> <div class="form-row"> <label for="node-input-devtype"><i class="fa fa-tag"></i> 协议类型</label> <select id="node-input-devtype" style="width:125px !important"> <option value="clowire">CLOWIRE</option> <option value="hasskit">HASSKIT</option> <option value="alive">ALIVE</option> <option value="lf">LF</option> <option value="symi">亖米(SYMI)</option> </select> </div> <div class="form-row" > <label for="node-input-entity_id" ><i class="fa fa-tag"></i> entity_id</label> <select id="node-input-entity_id" style="width:70%"> </select> </div> </script> <!-- 场景设备节点 --> <script type="text/javascript"> RED.nodes.registerType('scene board', { category: 'symi', defaults: { name: { value: "" }, server: { value: "", type: "symi config", required: true }, entity_id: { value: "" }, uid: { value: "", required: true }, address: { value: "", required: true }, channel: { value: "" }, sceneId: { value: "" }, devtype: { value: "clowire", required: true }, }, color: "#9C27B0", inputs: 1, outputs: 1, icon: "font-awesome/fa-magic", label: function () { return this.name || '场景/' + this.uid + '/' + this.address + '/' + this.entity_id; }, oneditprepare: function () { let self = this $.getJSON('GetHaDevList', function (data) { data = data.data if (data.homeAssistant) { let states = data.homeAssistant.states for (let state in states) { if (['scene', 'script'].indexOf(states[state].entity_id.split('.')[0]) === -1) continue let $row = $(`<option value="${states[state].entity_id}">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) if (states[state].entity_id === self.entity_id) $row = $(`<option value="${states[state].entity_id}" selected = "selected">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) $('#node-input-entity_id').append($row) } } }) }, }); </script> <script type="text/html" data-template-name="scene board"> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-row"> <label for="node-input-server"><i class="fa fa-tag"></i>通信服务</label> <input type="text" id="node-input-server" > </div> <div class="form-row"> <label for="node-input-uid"><i class="fa fa-tag"></i> 设备UID</label> <input type="text" id="node-input-uid" > </div> <div class="form-row"> <label for="node-input-address"><i class="fa fa-tag"></i> 设备地址</label> <input type="text" id="node-input-address" > </div> <div class="form-row"> <label for="node-input-channel"><i class="fa fa-tag"></i> 设备通道</label> <input type="text" id="node-input-channel" > </div> <div class="form-row"> <label for="node-input-sceneId"><i class="fa fa-tag"></i> 场景ID</label> <input type="text" id="node-input-sceneId" > </div> <div class="form-row"> <label for="node-input-devtype"><i class="fa fa-tag"></i> 协议类型</label> <select id="node-input-devtype" style="width:125px !important"> <option value="clowire">CLOWIRE</option> <option value="hasskit">HASSKIT</option> <option value="alive">ALIVE</option> <option value="lf">LF</option> <option value="symi">亖米(SYMI)</option> </select> </div> <div class="form-row" > <label for="node-input-entity_id" ><i class="fa fa-tag"></i> entity_id</label> <select id="node-input-entity_id" style="width:70%"> </select> </div> </script> <script type="text/javascript"> RED.nodes.registerType('panel board', { category: 'symi', defaults: { name: { value: "" }, server: { value: "", type: "symi config", required: true }, entity_id: { value: "" }, uid: { value: "", required: true }, address: { value: "", required: true }, channel: { value: "" }, devtype: { value: "clowire", required: true }, }, color: "#9C27B0", inputs: 1, outputs: 1, icon: "font-awesome/fa-tablet", label: function () { return this.name || this.uid + '/' + this.address + '/' + this.entity_id; }, oneditprepare: function () { let self = this $.getJSON('GetHaDevList', function (data) { data = data.data if (data.homeAssistant) { let states = data.homeAssistant.states for (let state in states) { if (['switch', 'light', 'input_boolean'].indexOf(states[state].entity_id.split('.')[0]) === -1) continue let $row = $(`<option value="${states[state].entity_id}">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) if (states[state].entity_id === self.entity_id) $row = $(`<option value="${states[state].entity_id}" selected = "selected">${states[state].attributes.friendly_name}/${states[state].entity_id}</option>`) $('#node-input-entity_id').append($row) } } }) }, }); </script> <script type="text/html" data-template-name="panel board"> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-row"> <label for="node-input-server"><i class="fa fa-tag"></i>通信服务</label> <input type="text" id="node-input-server" > </div> <div class="form-row"> <label for="node-input-uid"><i class="fa fa-tag"></i> 设备UID</label> <input type="text" id="node-input-uid" > </div> <div class="form-row"> <label for="node-input-address"><i class="fa fa-tag"></i> 设备地址</label> <input type="text" id="node-input-address" > </div> <div class="form-row"> <label for="node-input-channel"><i class="fa fa-tag"></i> 设备通道</label> <input type="text" id="node-input-channel" > </div> <div class="form-row"> <label for="node-input-devtype"><i class="fa fa-tag"></i> 协议类型</label> <select id="node-input-devtype" style="width:125px !important"> <option value="clowire">CLOWIRE</option> <option value="hasskit">HASSKIT</option> <option value="alive">ALIVE</option> <option value="lf">LF</option> <option value="symi">亖米(SYMI)</option> </select> </div> <div class="form-row" > <label for="node-input-entity_id" ><i class="fa fa-tag"></i> entity_id</label> <select id="node-input-entity_id" style="width:70%"> </select> </div> </script>