|
Bogdan Timofte
authored
2 weeks ago
|
1
|
<script type="text/x-red" data-template-name="presence-detector">
|
|
|
2
|
<div class="form-row">
|
|
|
3
|
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
|
|
|
4
|
<input type="text" id="node-input-name" placeholder="Name">
|
|
|
5
|
</div>
|
|
|
6
|
<div class="form-row">
|
|
|
7
|
<label for="node-input-motionTimeout">Motion timeout (ms)</label>
|
|
|
8
|
<input type="number" id="node-input-motionTimeout" placeholder="30000">
|
|
|
9
|
</div>
|
|
|
10
|
<div class="form-row">
|
|
|
11
|
<label for="node-input-delayBetween">Delay between timeout payloads (ms)</label>
|
|
|
12
|
<input type="number" id="node-input-delayBetween" placeholder="3000">
|
|
|
13
|
</div>
|
|
|
14
|
<div class="form-row">
|
|
|
15
|
<label for="node-input-payload1Text">Payload #1 (sent on timeout first)</label>
|
|
|
16
|
<textarea id="node-input-payload1Text" rows="3" placeholder='{"cmd":"leave"}'></textarea>
|
|
|
17
|
</div>
|
|
|
18
|
<div class="form-row">
|
|
|
19
|
<label for="node-input-payload2Text">Payload #2 (sent on timeout after delay, and also on presence)</label>
|
|
|
20
|
<textarea id="node-input-payload2Text" rows="3" placeholder='{"cmd":"clear"}'></textarea>
|
|
|
21
|
</div>
|
|
|
22
|
<div class="form-row">
|
|
|
23
|
<label for="node-input-treatMissingDoorAsOpen">Treat missing door as open</label>
|
|
|
24
|
<input type="checkbox" id="node-input-treatMissingDoorAsOpen" checked>
|
|
|
25
|
</div>
|
|
|
26
|
<div class="form-row">
|
|
|
27
|
<label for="node-input-resetOnMotion">Reset timer on motion</label>
|
|
|
28
|
<input type="checkbox" id="node-input-resetOnMotion" checked>
|
|
|
29
|
</div>
|
|
|
30
|
<div class="form-row">
|
|
|
31
|
<label for="node-input-resetOnDoorOpen">Reset timer on door open</label>
|
|
|
32
|
<input type="checkbox" id="node-input-resetOnDoorOpen" checked>
|
|
|
33
|
</div>
|
|
|
34
|
</script>
|
|
|
35
|
|
|
|
36
|
<script type="text/x-red" data-help-name="presence-detector">
|
|
|
37
|
<p>
|
|
|
38
|
Determines presence from motion and door sensor inputs.
|
|
|
39
|
</p>
|
|
|
40
|
<p>
|
|
|
41
|
Outputs:
|
|
|
42
|
<ol>
|
|
|
43
|
<li>Presence message: <code>msg.payload.presenceDetected = true|false</code> (sent on every presence change)</li>
|
|
|
44
|
<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>
|
|
|
45
|
</ol>
|
|
|
46
|
</p>
|
|
|
47
|
<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>
|
|
|
48
|
<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>
|
|
|
49
|
</script>
|
|
|
50
|
|
|
|
51
|
<script>
|
|
|
52
|
RED.nodes.registerType('presence-detector', {
|
|
|
53
|
category: 'function',
|
|
|
54
|
color: '#a6bbcf',
|
|
|
55
|
defaults: {
|
|
|
56
|
name: {value: ""},
|
|
|
57
|
motionTimeout: {value: 30000},
|
|
|
58
|
delayBetween: {value: 3000},
|
|
|
59
|
payload1Text: {value: ""},
|
|
|
60
|
payload2Text: {value: ""},
|
|
|
61
|
treatMissingDoorAsOpen: {value: true},
|
|
|
62
|
resetOnMotion: {value: true},
|
|
|
63
|
resetOnDoorOpen: {value: true}
|
|
|
64
|
},
|
|
|
65
|
inputs: 1,
|
|
|
66
|
outputs: 2,
|
|
|
67
|
icon: "font-awesome/fa-users",
|
|
|
68
|
label: function() {
|
|
|
69
|
return this.name||"presence-detector";
|
|
|
70
|
}
|
|
|
71
|
});
|
|
|
72
|
</script>
|