1 contributor
<script type="text/x-red" data-template-name="presence-detector">
<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-motionTimeout">Motion timeout (ms)</label>
<input type="number" id="node-input-motionTimeout" placeholder="30000">
</div>
<div class="form-row">
<label for="node-input-delayBetween">Delay between timeout payloads (ms)</label>
<input type="number" id="node-input-delayBetween" placeholder="3000">
</div>
<div class="form-row">
<label for="node-input-payload1Text">Payload #1 (sent on timeout first)</label>
<textarea id="node-input-payload1Text" rows="3" placeholder='{"cmd":"leave"}'></textarea>
</div>
<div class="form-row">
<label for="node-input-payload2Text">Payload #2 (sent on timeout after delay, and also on presence)</label>
<textarea id="node-input-payload2Text" rows="3" placeholder='{"cmd":"clear"}'></textarea>
</div>
<div class="form-row">
<label for="node-input-treatMissingDoorAsOpen">Treat missing door as open</label>
<input type="checkbox" id="node-input-treatMissingDoorAsOpen" checked>
</div>
<div class="form-row">
<label for="node-input-resetOnMotion">Reset timer on motion</label>
<input type="checkbox" id="node-input-resetOnMotion" checked>
</div>
<div class="form-row">
<label for="node-input-resetOnDoorOpen">Reset timer on door open</label>
<input type="checkbox" id="node-input-resetOnDoorOpen" checked>
</div>
</script>
<script type="text/x-red" data-help-name="presence-detector">
<p>
Determines presence from motion and door sensor inputs.
</p>
<p>
Outputs:
<ol>
<li>Presence message: <code>msg.payload.presenceDetected = true|false</code> (sent on every presence change)</li>
<li>Control payloads: on timeout sends payload #1 then after delay payload #2 (if configured); sends payload #2 immediately when presence is detected (if configured)</li>
</ol>
</p>
<p>Supported message shapes: send an object in <code>msg.payload</code> with fields like <code>motionDetected</code>, <code>doorOpen</code>, or <code>presenceDetected</code>. Example: <code>{"motionDetected":true,"doorOpen":false}</code>.</p>
<p>When a timeout is counting down, the node status shows the remaining time in <code>HH:MM:SS</code> format. Status updates occur every 10s while more than 10s remain, and every 1s when 10s or less remain.</p>
</script>
<script>
RED.nodes.registerType('presence-detector', {
category: 'function',
color: '#a6bbcf',
defaults: {
name: {value: ""},
motionTimeout: {value: 30000},
delayBetween: {value: 3000},
payload1Text: {value: ""},
payload2Text: {value: ""},
treatMissingDoorAsOpen: {value: true},
resetOnMotion: {value: true},
resetOnDoorOpen: {value: true}
},
inputs: 1,
outputs: 2,
icon: "font-awesome/fa-users",
label: function() {
return this.name||"presence-detector";
}
});
</script>