{"_id":"@bldgblocks/node-red-contrib-quietcool","_rev":"2-0eebabc96732764693c855fe60c6b268","name":"@bldgblocks/node-red-contrib-quietcool","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@bldgblocks/node-red-contrib-quietcool","version":"0.1.0","keywords":["node-red","quietcool","ble","bluetooth","fan","hvac","whole-house-fan","home-automation"],"author":{"name":"BldgBlocks"},"license":"MIT","_id":"@bldgblocks/node-red-contrib-quietcool@0.1.0","maintainers":[{"name":"bldgblocks","email":"passmail.dreary136@proton.me"}],"homepage":"https://github.com/BldgBlocks/node-red-contrib-quietcool#readme","bugs":{"url":"https://github.com/BldgBlocks/node-red-contrib-quietcool/issues"},"dist":{"shasum":"ab5aab1e6590e9946b4c7a5ba4197fb4e807b54a","tarball":"https://registry.npmjs.org/@bldgblocks/node-red-contrib-quietcool/-/node-red-contrib-quietcool-0.1.0.tgz","fileCount":12,"integrity":"sha512-PsTXIgpPrMaOEWjbwuq/aw3ROqZLp+1JL1Qx7ZVWsOPaCxzsVJIheAI+chDTqI0uDknVJsdNIGiOs/AmhT4YNA==","signatures":[{"sig":"MEQCIBO79EMYCZxSKjgOaycm0dWBRu13I4hqA7WKgSvzbyiBAiBUvy8uvKZ4eGke6xw0E5FR2o1YYd9j50Px6uTkl/8aDA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62385},"engines":{"node":">=18.0.0"},"gitHead":"ce9a4b60ef4b6651550e7d8d91d910a321558256","scripts":{"postinstall":"bash python/setup_venv.sh","preuninstall":"pkill -f 'python.*bridge\\.py' 2>/dev/null; rm -rf python/.venv 2>/dev/null; echo 'QuietCool BLE: Cleaned up.'; true"},"_npmUser":{"name":"bldgblocks","email":"passmail.dreary136@proton.me"},"node-red":{"nodes":{"quietcool-config":"nodes/quietcool-config.js","quietcool-sensor":"nodes/quietcool-sensor.js","quietcool-control":"nodes/quietcool-control.js"},"version":">=3.0.0"},"repository":{"url":"git+https://github.com/BldgBlocks/node-red-contrib-quietcool.git","type":"git"},"_npmVersion":"10.8.2","description":"Node-RED nodes for controlling QuietCool whole house fans over BLE","directories":{},"_nodeVersion":"20.19.6","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-quietcool_0.1.0_1771278267929_0.6009549730430328","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bldgblocks/node-red-contrib-quietcool","version":"0.2.0","description":"Node-RED nodes for controlling QuietCool whole house fans over BLE","keywords":["node-red","quietcool","ble","bluetooth","fan","hvac","whole-house-fan","home-automation"],"license":"MIT","author":{"name":"BldgBlocks"},"repository":{"type":"git","url":"git+https://github.com/BldgBlocks/node-red-contrib-quietcool.git"},"publishConfig":{"access":"public"},"engines":{"node":">=18.0.0"},"node-red":{"version":">=3.0.0","nodes":{"quietcool-config":"nodes/quietcool-config.js","quietcool-control":"nodes/quietcool-control.js","quietcool-sensor":"nodes/quietcool-sensor.js"}},"scripts":{"postinstall":"bash python/setup_venv.sh","preuninstall":"pkill -f 'python.*bridge\\.py' 2>/dev/null; rm -rf python/.venv 2>/dev/null; echo 'QuietCool BLE: Cleaned up.'; true"},"_id":"@bldgblocks/node-red-contrib-quietcool@0.2.0","gitHead":"a5c7a1f8901f6df732875e20fa64771671828ba9","bugs":{"url":"https://github.com/BldgBlocks/node-red-contrib-quietcool/issues"},"homepage":"https://github.com/BldgBlocks/node-red-contrib-quietcool#readme","_nodeVersion":"20.19.6","_npmVersion":"10.8.2","dist":{"integrity":"sha512-Gw3UWY8MqF2SUg2vkyKVQKp6p1VsOFUeuociR/mVbcBXf8y3U4HjKIkjNs9Sjrr3y1ceoXygq7hdOMAmITK3rw==","shasum":"aafa4023d368fed9dc17ed6df37f057762e160ec","tarball":"https://registry.npmjs.org/@bldgblocks/node-red-contrib-quietcool/-/node-red-contrib-quietcool-0.2.0.tgz","fileCount":12,"unpackedSize":62794,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFdUyJ45go17lfIB1vWziNqca6g2qESgAQi2SC5bb/xMAiEA4m0njQhxQtcRri2V38DLdylk0e01sN90ArM/hoKxnS0="}]},"_npmUser":{"name":"bldgblocks","email":"passmail.dreary136@proton.me"},"directories":{},"maintainers":[{"name":"bldgblocks","email":"passmail.dreary136@proton.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/node-red-contrib-quietcool_0.2.0_1771278763359_0.3772138484152443"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-16T21:44:27.855Z","modified":"2026-02-16T21:52:43.626Z","0.1.0":"2026-02-16T21:44:28.086Z","0.2.0":"2026-02-16T21:52:43.505Z"},"bugs":{"url":"https://github.com/BldgBlocks/node-red-contrib-quietcool/issues"},"author":{"name":"BldgBlocks"},"license":"MIT","homepage":"https://github.com/BldgBlocks/node-red-contrib-quietcool#readme","keywords":["node-red","quietcool","ble","bluetooth","fan","hvac","whole-house-fan","home-automation"],"repository":{"type":"git","url":"git+https://github.com/BldgBlocks/node-red-contrib-quietcool.git"},"description":"Node-RED nodes for controlling QuietCool whole house fans over BLE","maintainers":[{"name":"bldgblocks","email":"passmail.dreary136@proton.me"}],"readme":"# node-red-contrib-quietcool\n\nNode-RED nodes for controlling QuietCool whole house fans over BLE.\n\n## Requirements\n\n- Raspberry Pi (or Linux with BLE)\n- Python 3.9+\n- BlueZ (pre-installed on Raspberry Pi OS)\n- A QuietCool fan with BLE (AFG SMT ES-3.0 or similar)\n\n## Installation\n\n```bash\ncd ~/.node-red\nnpm install /path/to/quietcool-ble/node-red-contrib-quietcool\n```\n\nThe `postinstall` script automatically creates a Python virtual environment and installs the `bleak` BLE library.\n\nRestart Node-RED after installation:\n\n```bash\nnode-red-restart\n```\n\n## Setup\n\n### Quick Setup (recommended)\n\nNo phone app or HCI snoop needed — pair directly from Node-RED:\n\n1. Drag a **fan control** or **fan sensor** node onto the canvas\n2. Double-click and create a new fan configuration\n3. Click **Scan** to find your fan — select it from the dropdown\n4. Click **New** to generate a Phone ID\n5. On the fan controller, hold the **Pair** button for ~5 seconds until the LED blinks\n6. Click **Pair with Fan** in the editor\n7. Save and deploy — you're done!\n\n### Alternative: Extract Phone ID from existing app pairing\n\nIf you've already paired with the QuietCool mobile app, you can extract the Phone ID:\n\n1. Enable *Bluetooth HCI snoop log* in Android Developer Options\n2. Open the QuietCool app and connect to the fan\n3. Pull the log: `adb bugreport bugreport.zip`\n4. Extract and parse `btsnoop_hci.log` to find the `PhoneID` in a `Login` command\n\n### Manual fan discovery\n\nIf the Scan button doesn't work, find the address manually:\n\n```bash\nbluetoothctl scan on\n```\n\nLook for a device named `ATTICFAN_*`. Note the MAC address (e.g., `XX:XX:XX:XX:XX:XX`).\n\n## Nodes\n\n### fan control (`quietcool-control`)\n\nSend commands to the fan. Available actions:\n\n| Action | Description |\n|--------|-------------|\n| Turn Off | Sets fan to Idle mode |\n| Smart Mode (TH) | Temperature/humidity auto mode |\n| Run High | Continuous run at high speed |\n| Run Medium | Continuous run at medium speed (3-speed fans) |\n| Run Low | Continuous run at low speed |\n| Timer | Run for a set duration |\n| Apply Preset | Apply a named profile (Summer, Winter, etc.) |\n| Set Thresholds | Set custom temp/humidity thresholds |\n| Pair | Pair with fan (must be in pairing mode) |\n| Raw | Send any raw API command |\n\nActions can be overridden via `msg.payload`:\n\n```json\n{\n  \"action\": \"preset\",\n  \"args\": { \"name\": \"Summer\" }\n}\n```\n\n```json\n{\n  \"action\": \"timer\",\n  \"args\": { \"hours\": 2, \"minutes\": 0, \"speed\": \"HIGH\" }\n}\n```\n\n### fan sensor (`quietcool-sensor`)\n\nRead data from the fan. Available queries:\n\n| Query | Returns |\n|-------|---------|\n| State | Mode, speed, temperature (°F), humidity (%) |\n| Full Status | Complete status with fan info, firmware, presets |\n| Fan Info | Name, model, serial number |\n| Firmware | Firmware and hardware version |\n| Parameters | Current temp/humidity thresholds |\n| Presets | List of preset profiles |\n| Timer Remaining | Time left on active timer |\n\nFor State and Full Status queries, convenience fields are added:\n- `msg.temperature` — Temperature in °F\n- `msg.humidity` — Humidity %\n- `msg.mode` — Current mode (Idle, Timer, TH)\n- `msg.range` — Current speed (LOW, HIGH, CLOSE)\n\nOptional **polling**: set a poll interval (seconds) to auto-query without input triggers.\n\n## Architecture\n\nThe Node-RED nodes communicate with the fan through a Python bridge process:\n\n```\nNode-RED → stdin JSON → bridge.py → BLE/bleak → QuietCool Fan\nNode-RED ← stdout JSON ← bridge.py ← BLE/bleak ← QuietCool Fan\n```\n\nThe bridge maintains a persistent BLE connection, avoiding the ~3 second reconnect overhead for each command. It spawns automatically when nodes are deployed and shuts down when they're removed.\n\n## Protocol\n\nQuietCool fans use plain JSON over BLE GATT. All communication goes through a single characteristic (`0000ff01`) on service `000000ff`. The protocol requires a `Login` with a `PhoneID` before any commands are accepted.\n\nTested with firmware `IT-BLT-ATTICFAN_V2.6`.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}