node-red-contrib-melview
Version:
Set of node red nodes to communicate with the melview API
187 lines (170 loc) • 16.2 kB
HTML
<script type="text/javascript">
RED.nodes.registerType('unit-command',{
category: 'melview',
defaults: {
melviewConnection: {value:"", type:"melview-connection"},
building: {value:""},
unit: {value:""},
staticconfiguration : {value:true},
power: {value:true},
testrun: {value:false},
mode: {value:"MD8"},
temperature:{value:"26", validate:function(v) {
if(isNaN(v))
return false;
const temp = parseFloat(v);
return temp >= 16 || temp <= 31;
}},
fanspeed: {value:"FS0"},
fandirection: {value:"AV0"},
},
inputs:1,
outputs:1,
icon: "file.png",
label: function() {
return this.name || " unit-command";
},
oneditprepare: function () {
const melviewConnectionNodeId = this.melviewConnection;
const nodeBuildingId = this.building;
const nodeUnitId = this.unit;
$('#node-input-power').change(function() {
const powerState = this.checked;
$('.power-dependant').each(function() {
$(this).prop('disabled', !powerState );
});
});
$('#node-input-staticconfiguration').change(function() {
const staticConfiguration = this.checked;
if(staticConfiguration) {
$("#static-configuration").show();
$("#dynamic-configuration").hide();
}
else {
$("#static-configuration").hide();
$("#dynamic-configuration").show();
}
});
$.ajax({
headers: {
Accept: 'application/json'
},
cache: !1,
url: 'melview/' + melviewConnectionNodeId + '/rooms',
success: function (buildings) {
let buildingSelectList = $('#node-input-building').empty();
let unitSelectList = $('#node-input-unit').empty();
const populateUnitSelectList = function(buildingId)
{
var building = $.grep(buildings, function (n, i) {
return (n.buildingid === buildingId);
});
building[0].units.forEach(function(r) {
const roomOption = $(`<option value=\'${r.unitid}\'> ${r.room} </option>`)
if(r.unitid === nodeUnitId)
{
roomOption.attr('selected', 'selected');
}
unitSelectList.append(roomOption);
});
};
buildings.forEach(function(b) {
const buildingOption = $(`<option value=\'${b.buildingid}\'> ${b.building} </option>`);
buildingSelectList.append(buildingOption);
if(b.buildingid === nodeBuildingId)
{
buildingOption.attr('selected', 'selected');
populateUnitSelectList(nodeBuildingId);
}
});
buildingSelectList.change(function () {
var buildingId = $(this).val();
populateUnitSelectList(buildingId);
});
}
});
}
});
</script>
<script type="text/html" data-template-name="unit-command">
<div class="form-row">
<label for="node-input-melviewConnection"><i class="icon-tag"></i> Name</label>
<input type="text" id="node-input-melviewConnection" placeholder="Melview Connection">
</div>
<div class="form-row">
<label for="node-input-building"><i class="icon-tag"></i> Building</label>
<select id="node-input-building">
<option>Select Building</option>
</select>
</div>
<div class="form-row">
<label for="node-input-unit"><i class="icon-tag"></i> Unit</label>
<select id="node-input-unit" >
<option>Select Unit</option>
</select>
</div>
<div class="form-row">
<label for="node-input-testrun"><i class="icon-tag"></i> Test Run</label>
<input type="checkbox" id="node-input-testrun" style="width: auto;">
</div>
<div class="form-row">
<label for="node-input-staticconfiguration"><i class="icon-tag"></i> Static Configuration</label>
<input type="checkbox" id="node-input-staticconfiguration" style="width: auto;">
</div>
<div id="static-configuration">
<div class="form-row">
<label for="node-input-power"><i class="icon-tag"></i> Power</label>
<input type="checkbox" id="node-input-power" class="static-configuration-dependant" style="width: auto;">
</div>
<div class="form-row">
<label for="node-input-mode"><i class="icon-tag"></i> Mode</label>
<select id="node-input-mode" class="power-dependant">
<option value="MD8">Auto</option>
<option value="MD1">Heat</option>
<option value="MD2">DRY</option>
<option value="MD7">FAN</option>
<option value="MD3">Cooling</option>
</select>
</div>
<div class="form-row">
<label for="node-input-temperature"><i class="icon-tag"></i> Set Temperature</label>
<input type="text" id="node-input-temperature" class="power-dependant">
</div>
<div class="form-row">
<label for="node-input-fanspeed"><i class="icon-tag"></i> Fan Speed</label>
<select id="node-input-fanspeed" class="power-dependant">
<option value="FS0">Auto</option>
<option value="FS1">One</option>
<option value="FS1">Two</option>
<option value="FS3">Tree</option>
<option value="FS5">Four</option>
<option value="FS6">Five</option>
</select>
</div>
<div class="form-row">
<label for="node-input-fandirection"><i class="icon-tag"></i> Fan Direction</label>
<select id="node-input-fandirection" class="power-dependant">
<option value="AV0">Auto</option>
<option value="AV7">Swing</option>
<option value="AV1">Direction 1 (top)</option>
<option value="AV2">Direction 2</option>
<option value="AV3">Direction 3</option>
<option value="AV4">Direction 4</option>
<option value="AV5">Direction 5</option>
</select>
</div>
</div>
<div id="dynamic-configuration">
<h2>Dynamic Configuration</h2>
This allows you to use a payload to configure the command that is sent to melview.
{<br/> "$schema": "http://json-schema.org/draft-07/schema",<br/> "$id": "http://gravypower.net/melviewcommand.json",<br/> "type": "object",<br/> "title": "Melview Command",<br/> "description": "Command to send to Melview ,<br/> "default": {},<br/> "examples": [<br/> {<br/> "power": false,<br/> "mode": "MD8",<br/> "temperature": "26",<br/> "fanspeed": "FS0",<br/> "fandirection": "AV0"<br/> }<br/> ],<br/> "required": [<br/> "power"<br/> ],<br/> "properties": {<br/> "power": {<br/> "$id": "#/properties/power",<br/> "type": "boolean",<br/> "title": "Power",<br/> "description": "Turn unit on or off",<br/> "default": false,<br/> "examples": [<br/> false<br/> ]<br/> },<br/> "mode": {<br/> "default": "",<br/> "description": "Sets the mode of a unit",<br/> "enum": [<br/> "MD8", //Auto<br/> "MD1", //Heat<br/> "MD2", //DRY<br/> "MD7", //FAN<br/> "MD3" //Cooling<br/> ],<br/> "examples": [<br/> "MD8"<br/> ],<br/> "title": "Mode",<br/> "type": "string"<br/> },<br/> "temperature": {<br/> "default": "",<br/> "description": "Sets the temperature of a unit",<br/> "examples": [<br/> "26"<br/> ],<br/> "maximum": 31,<br/> "minimum": 16,<br/> "title": "Temperature",<br/> "type": "number"<br/> },<br/> "fanspeed": {<br/> "default": "",<br/> "description": "Sets the fanspeed of a unit",<br/> "examples": [<br/> "FS0"<br/> ],<br/> "title": "Fanspeed",<br/> "enum": [<br/> "FS0", //Auto<br/> "FS1", //One<br/> "FS1", //Two<br/> "FS3", //Three<br/> "FS5", //Four<br/> "FS6" //Five<br/> ],<br/> "type": "string"<br/> },<br/> "fandirection": {<br/> "default": "",<br/> "description": "Sets the fandirection of a unit",<br/> "examples": [<br/> "AV0"<br/> ],<br/> "title": "fandirection",<br/> "enum": [<br/> "AV0", //Auto<br/> "AV7", //Swing<br/> "AV1", //Direction 1 (top)<br/> "AV2", //Direction 2<br/> "AV3", //Direction 3<br/> "AV4", //Direction 4<br/> "AV5" //Direction 5<br/> ]<br/> }<br/> },<br/> "additionalProperties": true<br/>}
</div>
</script>
<script type="text/html" data-help-name="unit-command">
<p>Sends a command to an heat pump</p>
<ul>
<li>
Unit set Temperature must be between 16 and 31 degrees celsius
</li>
</ul>
</script>