[
  {
    "id": "novelide-temperature",
    "type": "tab",
    "label": "Temperature practice",
    "disabled": false,
    "info": "Numeric test inputs; no hardware output."
  },
  {
    "id": "sample-0",
    "type": "inject",
    "z": "novelide-temperature",
    "name": "25 C",
    "props": [
      {
        "p": "payload"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": 0.1,
    "topic": "",
    "payload": "25",
    "payloadType": "num",
    "x": 140,
    "y": 80,
    "wires": [
      [
        "temperature-rule"
      ]
    ]
  },
  {
    "id": "sample-1",
    "type": "inject",
    "z": "novelide-temperature",
    "name": "29 C",
    "props": [
      {
        "p": "payload"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": 0.1,
    "topic": "",
    "payload": "29",
    "payloadType": "num",
    "x": 140,
    "y": 140,
    "wires": [
      [
        "temperature-rule"
      ]
    ]
  },
  {
    "id": "sample-2",
    "type": "inject",
    "z": "novelide-temperature",
    "name": "27 C",
    "props": [
      {
        "p": "payload"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": 0.1,
    "topic": "",
    "payload": "27",
    "payloadType": "num",
    "x": 140,
    "y": 200,
    "wires": [
      [
        "temperature-rule"
      ]
    ]
  },
  {
    "id": "sample-3",
    "type": "inject",
    "z": "novelide-temperature",
    "name": "26 C",
    "props": [
      {
        "p": "payload"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": 0.1,
    "topic": "",
    "payload": "26",
    "payloadType": "num",
    "x": 140,
    "y": 260,
    "wires": [
      [
        "temperature-rule"
      ]
    ]
  },
  {
    "id": "sample-4",
    "type": "inject",
    "z": "novelide-temperature",
    "name": "Invalid text",
    "props": [
      {
        "p": "payload"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": 0.1,
    "topic": "",
    "payload": "disconnected",
    "payloadType": "str",
    "x": 140,
    "y": 320,
    "wires": [
      [
        "temperature-rule"
      ]
    ]
  },
  {
    "id": "temperature-rule",
    "type": "function",
    "z": "novelide-temperature",
    "name": "Warm at 28; clear at 26",
    "func": "const value = msg.payload;\nif (typeof value !== \"number\" || !Number.isFinite(value)) {\n    node.warn(\"Expected a finite numeric temperature\");\n    return null;\n}\nlet warm = context.get(\"warm\") === true;\nif (value >= 28) warm = true;\nelse if (value <= 26) warm = false;\ncontext.set(\"warm\", warm);\nmsg.payload = { temperatureC: value, warm: warm };\nreturn msg;",
    "outputs": 1,
    "timeout": 0,
    "noerr": 0,
    "initialize": "",
    "finalize": "",
    "libs": [],
    "x": 420,
    "y": 170,
    "wires": [
      [
        "temperature-debug"
      ]
    ]
  },
  {
    "id": "temperature-debug",
    "type": "debug",
    "z": "novelide-temperature",
    "name": "Result",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "x": 710,
    "y": 170,
    "wires": []
  }
]
