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
HTML
<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>