node-red-contrib-freya-nodes
Version:
Custom nodes for Freya Vivarium Control System
61 lines (58 loc) • 2.46 kB
HTML
<script type="text/javascript">
RED.nodes.registerType('temperature controller',{
category: 'Freya Vivariums',
color: "#A2CA6F",
defaults: {
name: {value:""},
minimumTemperature: {value:"25", required:true, validate:RED.validators.number()},
maximumTemperature: {value:"30", required:true, validate:RED.validators.number()},
kp: {value:"10", required:false, validate:RED.validators.number()}
},
inputs:1,
outputs:2,
outputLabels:["control","status"],
icon: "font-awesome/fa-thermometer-half",
label: function() {
return this.name||"Temperature Controller";
}
});
</script>
<script type="text/html" data-template-name="temperature controller">
<div class="form-row">
<label for="node-input-name"><i class="icon-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<hr/>
<h2><i class="fa fa-thermometer-full"></i> Extremes</h2>
<p>The absolute maximum ratings</p>
<div class="form-row">
<label for="node-input-minimumTemperature"><i class="icon-cog"></i> Minimum (°C)</label>
<input type="number" id="node-input-minimumTemperature" placeholder="25">
</div>
<div class="form-row">
<label for="node-input-maximumTemperature"><i class="icon-cog"></i> Maximum (°C)</label>
<input type="number" id="node-input-maximumTemperature" placeholder="30">
</div>
<hr/>
<h2><i class="fa fa-sliders"></i> P-controller</h2>
<div class="form-row">
<label for="node-input-kp"><i class="icon-cogs"></i> Proportional Gain (Kp)</label>
<input type="number" id="node-input-kp" placeholder="10">
</div>
</script>
<script type="text/html" data-help-name="temperature controller">
<p>The <b>Temperature Controller</b> node implements a proportional (P) controller.</p>
<p><b>Inputs:</b>
<ul>
<li><code>msg.topic == 'temp'</code> (payload: number) → sensor reading</li>
<li><code>msg.topic == 'config'</code> (payload: { setpoint, kp }) → runtime configuration</li>
</ul>
</p>
<p><b>Outputs:</b>
<ol>
<li><code>control</code>: <code>msg.payload.effort</code> (-100 to +100)</li>
<li><code>status</code>: <code>msg.payload</code> object with <code>level</code>, <code>message</code>, and optional <code>details</code></li>
</ol>
</p>
<p>Configure the <i>Setpoint</i> (°C) and <i>Proportional Gain</i> (Kp) in the node's edit dialog.</p>
</script>