mynodes / presence-detector / presence-detector.html
1 contributor
72 lines | 3.129kb
<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>