Starting dashboard…
Send your Device ID to hello@pralungolabs.com. I will send the activation code as soon as possible. Paste the supplied code in the Activate box below.
Your Device ID — send this to your supplier, or type in the activation key supplied
…
Step 1 of 5
Tailscale is connected.
Secure remote access with Tailscale
This system joins Tailscale as Home-Security. Tailscale is installed from here. You only paste the .ts.net address.
.ts.net name is the HTTPS address this system needs for the secure line. On the Machines tab, click Home-Security and copy that address into the field below.Tailscale is not linked yet. This page will show the link. Open it on the phone in your hand.
Type the full address including https:// (example: https://home-security.your-tailnet.ts.net).
Password
One 4-digit password for sign-in. Fingerprint is registered on the login screen after setup restarts onto Tailscale.
On mobile over HTTPS you can sign in with fingerprint / Face ID after setup.
Site & alerts
Navbar branding first — then alert identity used in push notifications.
Floor plan
How many floors does this site use? Unused floors are hidden from the 3D view.
Ground floor · default sample plan
Quick tour
Full reference: Menu → Site Manual (below Restart server).
Guide
Floor plan
Pralunga Labs
loading..
AUTHENTICATING
Secure access
Leave the app and return to the home screen?
Install app — faster repeat visits (cached shell, full screen)
Layers
Sky & camera
Lights on plan
Manual scenes Tap to run · automated scenes are not listed
Siren and strobe are on. Cancel here or use Stop panic on the notification.
Electric fence
On now
Line-up
Irrigation
One zone at a time · 3 second hand-off
Cameras
Live feeds on the floor plan — move with the 3D view
Pi 3B/4B BCM GPIO only (safe pins — no I2C/SPI/UART/EEPROM straps). Pick a pin, choose type (door, motion, fence, doorbell, panic…), set NO/NC. One pin = one sensor. Vera lights are not GPIO. Click a name to place on the plan · Active = included when arming.
Vera lamps stay under Home automation. Sonoff / Zigbee / Z-Wave USB later.
Lights, switches, garage doors, and irrigation already on this system. History stores the start and end of each time a device is on.
Siren + strobe. Confirm to start the panic scene.
Dbl-click solo · dbl-click again to show all
Click a zone to draw its water pipe. Click corners, then double-click or Enter to finish. Drag a zone onto the plan to place the head. Add pipe places another head and draws the pipe. Colour and distance are in Settings → Demo or Layout → Irrigation range.
Hold 1s · drag onto plan · drag edges to resize
Drag onto plan · drag top/right edges to resize
Upload a flat floor-plan image per story. Enable Extract walls from image to turn wall lines into 3D walls — set Blueprint ink to the colour your plan uses for walls (e.g. gray) and adjust the tolerance until all walls appear.
Hidden stories keep all plans and edits — use the tabs below to keep working on any floor, then re-enable it on the dashboard.
Height of the upright floor-name text on the front of each plan (e.g. GROUND FLOOR).
No file uploaded
Opacity makes the plate see-through (1st / 2nd over the ground plan). Grid / slab colour is the fill when Display mode is Grid only. Frost blurs the storey below through a grid-only plate — no image. Draw a custom floor shape from Structure editor → Slab.
Thickness applies to extracted walls, perimeter, and new doors/windows in the structure editor. Use Structure editor → Erase to remove unwanted auto-walls.
No file uploaded
Opacity makes the plate see-through so the floor below shows. Grid / slab colour is the fill when Display mode is Grid only. Frost blurs the storey below through a grid-only plate. Custom outline: Structure editor → Slab.
Thickness applies to extracted walls, perimeter, and new doors/windows. Structure editor → Erase removes unwanted auto-walls.
No file uploaded
Opacity + Grid / slab colour work the same as the floors below. Frost blurs the storey below through a grid-only plate. Custom outline: Structure editor → Slab.
Thickness applies to extracted walls, perimeter, and new doors/windows. Structure editor → Erase removes unwanted auto-walls.
Height, opacity, and colour of the 3D coverage fan. Reach, span, and heading stay on each motion node.
Trail drawn during trigger-history playback. It stays above the floor, routes around walls, and passes through doorways and openings.
Scale and rotation of the floor card. Leave rotation blank to keep facing the camera. Turn on edit mode, then drag the card. Rotation snaps every 10°. Size snaps every 0.5 m. Position snaps to a 0.5 m frame.
Water rises from the bottom of the pipe to the lip while the borehole controller is on. Assign that light or switch in Borehole flow meter → Controller. Auto uses a device whose name includes borehole.
ACES tone map, warmer key light, depth fog, quieter tree/sensor glow. No bloom/SSAO — those hitch on a phone.
Raises dropped nodes so they sit above walls / furniture. Per-node height is on the node slider when you select a marker in Edit layout.
Pick a built-in 3D icon per type, or upload a custom image sprite.
This machine is Home-Security. Paste the .ts.net HTTPS address from Machines. No auth key.
Values load from the device .env when present, and saves write back to .env.
ESP32 / MQTT use the local LAN IP — Tailscale 100.x is only for phones/laptops, not WiFi sensors.
Name each site (e.g. MK8) and give it an HTTPS address, a direct IP, or both. Named systems appear in a picker on the login screen so a security team can jump between locations. HTTPS is required for fingerprint sign-in; the direct IP works without it.
Compares this Pi to the private GitHub repo. Install is manual: a full backup downloads first, then the update runs and the dashboard restarts. ESP boards, sensors, and the floor layout stay.
Installed build —
Latest on GitHub —
Open this screen to check.
This runs on the Pi itself (Samba).
The folder is share/ inside this app. Name it, set a user and password, and phones, TVs, and PCs
on the same Wi‑Fi can open it. It is not exposed to the public internet.
Away from home, put Tailscale on the phone and use the 100.x address — do not port-forward SMB.
Folder on disk:
16 zones · one valve at a time · 3 second hand-off · ESP32-S3
Not added
Schedules use Africa/Johannesburg. Set stores the four times as standby. The slider range comes from Settings.
Five named cycles. Pick up to eight active zones for each one. Cycle 1 starts as Front garden: zones 1, 4 and 5. The left irrigation button lists them under Cycles, then the zone switches under Manual.
These minutes are the ends of the slider on each zone.
This is the same Wi-Fi the fence, siren, doorbell, and other ESP boards use. A new sketch download bakes it in.
Loading…
Signal —
Uses the active zones. With this on, the bottom-left irrigation button stays on the dashboard so you can drop a zone and add a pipe, even with no controller attached.
A board shows up here after it announces itself. Use it, or add the id you flashed.
Drive relays from the ESP32. Do not put mains or the pump coil straight on a GPIO.
| ESP32-S3 | Role |
|---|---|
| GPIO 4, 5, 6, 7 | Zones 1–4 relay IN |
| GPIO 8, 9, 10, 11 | Zones 5–8 relay IN |
| GPIO 12, 13, 14, 15 | Zones 9–12 relay IN |
| GPIO 16, 17, 18, 21 | Zones 13–16 relay IN |
| GPIO 38 | Pump relay, on while any zone is on |
Share ground between the relay board and the ESP. Keep the 24 V valve supply off the ESP pins.
Board: ESP32S3 Dev Module. Library: PubSubClient. The Pi decides duration and sends off until this board reports the valve closed. The sketch also has a local duration backstop.
home-security/irrigation/command ← {"zone":1,"on":true,"durationSec":600}
home-security/irrigation/status → {"deviceId":"esp-irrigation-1","zones":[0,1,0,...]}
home-security/devices/esp-irrigation-1/hello
JVA gateway · arm/disarm · kV · ESP32 firmware
DISARMED
— · updated —
Dashboard → MQTT home-security/fence/command → ESP32 relay → JVA control input (arm/disarm).
ESP32 publishes home-security/fence/status with kvLeft / kvRight (kV, not kW).
Hover fence wires or markers on the plan to see live kV.
Demo values (8.0 / 7.8 kV) show until the ESP is online.
When an ESP32 connects over WiFi/MQTT it announces itself. Assign it to fence left/right and a floor, then Place on floor to drop the zone markers on that plan.
Never connect fence high-voltage (kV) wires to the ESP32. Only dry contacts, isolated LV scalers, and relay-isolated control.
KV_PER_ADC_VOLT in the sketch against a known kV meter.| ESP32 | Role | JVA side |
|---|---|---|
| GPIO 10 | Arm relay | Control IN (energizer ON) |
| GPIO L/R* | Alarm IN | Alarm dry contact → GND |
| GPIO 1 | ADC left kV | Isolated 0–3.3 V scaler |
| GPIO 2 | ADC right kV | Isolated 0–3.3 V scaler |
* Fence left/right GPIOs: Sensor inventory → Unassigned · ESP32 → assign dropdown.
Resolving Tailscale connection…
Doors, indoor/outdoor motion and lights stay on the Raspberry Pi.
This ESP32 arms/disarms the energizer, reads zone kV, and publishes alarm + telemetry over MQTT.
Downloads and MQTT_HOST use the Tailscale IP from Menu → Tailscale.
1. Install Arduino IDE 2.x 2. Boards Manager → search "esp32" (Espressif) → Install 3. Library Manager → PubSubClient (Nick O'Leary) → Install 4. Download Arduino zip (button above) → unzip 5. File → Open → esp32-fence/esp32-fence.ino 6. Tools → Board → ESP32S3 Dev Module 7. Edit WIFI_SSID / WIFI_PASSWORD — MQTT_HOST is prefilled from Tailscale 8. Calibrate KV_PER_ADC_VOLT against a known fence meter 9. Upload
home-security/fence/command ← {"command":"arm"|"disarm"}
home-security/fence/status → {armed,kvLeft,kvRight,alarmLeft,alarmRight}
home-security/sensors/fence-left/state → open | closed
home-security/sensors/fence-right/state → open | closed
home-security/devices/esp-fence-1/hello → ESP devices registry
cd /opt/home-security pkill -f "node server/index.js"; npm start curl http://127.0.0.1:3000/api/health curl http://127.0.0.1:3000/api/fence
Two buttons · ESP32-C3 · camera popup
Assign a camera to each bell. A press shows a movable snapshot (top-left) and opens live on tap — no background blur. History always logs the press, armed or not.
GPIOs are assigned in Sensor inventory → Doorbell GPIOs · ESP32-C3. Phone alerts need the PWA installed + HTTPS (Tailscale HTTPS or localhost); then unlock once so the device can subscribe.
Dry contacts / buttons only. Active LOW to GND. Do not feed 12 V doorbell transformers into the C3 — use a relay or isolated dry contact.
| ESP32-C3 | Role | Bell side |
|---|---|---|
| GPIO 2* | INPUT_PULLUP | Doorbell 1 → GND when pressed |
| GPIO 3* | INPUT_PULLUP | Doorbell 2 → GND when pressed |
| GND | Common | Both button COM |
* Pins come from Sensor inventory → Doorbell GPIOs · ESP32-C3.
Loading…
Saved credentials are injected into the doorbell firmware zip — no sketch edits needed.
Resolving Tailscale connection…
Publishes home-security/sensors/doorbell-1/state and doorbell-2/state
as triggered / closed. MQTT_HOST uses Tailscale from Menu → Tailscale.
1. Install Arduino IDE 2.x 2. Boards Manager → search "esp32" (Espressif) → Install 3. Library Manager → PubSubClient (Nick O'Leary) → Install 4. Download Arduino zip (button above) → unzip 5. File → Open → esp32c3-doorbell/esp32c3-doorbell.ino 6. Tools → Board → ESP32C3 Dev Module 7. Tools → USB CDC On Boot → Enabled 8. Wi‑Fi prefilled from WiFi settings tab · MQTT_HOST from Tailscale 9. Upload
home-security/sensors/doorbell-1/state → triggered | closed home-security/sensors/doorbell-2/state → triggered | closed home-security/devices/esp-doorbell-1/hello → ESP devices registry
Doors and PIRs over MQTT · safe GPIOs only · Pi picks it up on the LAN
Sensor wires go to the MCP23017 chips, not to ESP32 strapping pins. Forbidden on the module: GPIO 0, 3, 45, 46 (strap), 19–20 (USB), 26–37 (flash/PSRAM), 43–44 (UART). GPIO 0 is the BOOT button only.
| ESP32-S3 | Use |
|---|---|
| GPIO 8 | I2C SDA → both MCP23017, 4.7k to 3.3V |
| GPIO 9 | I2C SCL → both MCP23017, 4.7k to 3.3V |
| GPIO 47 | Blue LED = MQTT linked (330Ω to GND, active HIGH) |
| GPIO 48 | Red LED = no MQTT (330Ω to GND, active HIGH) |
| 3.3V | Green LED = power on (1kΩ to GND, no GPIO) |
| GPIO 19 / 20 | USB-C D− / D+ for flashing only |
Chip 0x20 is T0–T15. Chip 0x21 is T16–T31. Address 0x20: A2=A1=A0 to GND. Address 0x21: A0 to 3.3V, A2=A1 to GND. Each terminal is +5V, SIG, GND. After the Pi sees the board, assign terminals in Sensor inventory. Unassign the ones you are not using.
Loading…
Same SSID store as the other ESP firmware. Re-download the zip after saving. MQTT host is the Pi LAN address from Tailscale settings, not the Tailscale IP.
Label: ESP32-S3 Extender
Resolving connection…
1. Arduino IDE 2.x 2. Boards Manager → esp32 by Espressif 3. Library Manager → PubSubClient, and Adafruit MCP23017 4. Open esp32s3-extender/esp32s3-extender.ino 5. Board: ESP32S3 Dev Module 6. Upload over USB-C 7. Wi‑Fi and the chosen device id are already in the zip. Do not edit pins. 8. Blue LED = talking to the Pi. Red = not linked. 9. Assign T0–T31 in Sensor inventory after Seen by this Pi lists the board.
home-security/devices/esp-extender-N/hello home-security/extender/esp-extender-N/pin/0 … pin/31 payload 1 = terminal active, 0 = idle
Sunsynk, Deye, Victron, SMA, Huawei · Modbus TCP · read-only
— · updated —
—
Same email and password as sunsynk.net. The password stays on the Pi. Inverter size is read from the account unless you pick one.
Size shows here after a successful account poll.
LAN IP of a Modbus gateway. The E-Linter Wi-Fi stick does not listen on port 502.
Sunsynk and Deye share one register map. Unit ID is usually 1.
Turn the dock / mobile sun FAB off here (removed from the ☰ menu). Desktop: left-edge dock · Mobile: sun button top-right.
See deploy/SOLAR-INVERTER.md for WiFi dongle stability tips and register notes.
HomGar / RainPoint cloud · HCS008 flow sensor · read-only
— · — · — · updated —
—
HomGar uses the RainPoint cloud — the hub has no local API.
Pick a light or a switch as the borehole controller. The pipe, the flow guard, and the other borehole actions follow that device.
After this controller turns off, the meter is checked. If water is still moving, the off did not take.
ESP32 relays · MQTT panic · live node status
— · updated —
Dashboard → MQTT home-security/siren/command → every siren ESP32.
Add another board for the other side of the house. Panic drives all of them together.
All ESP32 devices on this broker — live Wi‑Fi via MQTT hello / status (5 min window).
Never put 12 V or mains on an ESP GPIO. The ESP only drives relay IN pins (3.3 V). The siren and strobe run from their own supply through the relay contacts.
RELAY_ACTIVE_LOW if your board is active HIGH.| ESP32 | Role | Load side |
|---|---|---|
| GPIO 4 | Siren relay IN | Relay CH1 → siren circuit |
| GPIO 5 | Strobe relay IN | Relay CH2 → strobe circuit |
| GND | Logic ground | Relay GND |
| 5 V | Relay VCC | Module supply (not the 12 V siren) |
Loading…
Saved credentials are injected into the siren firmware zip.
Resolving Tailscale connection…
Subscribes to home-security/siren/command
({"siren":true,"strobe":true} or {"command":"panic"} / silence).
Publishes home-security/siren/status and a device hello so it shows in Connection status.
MQTT_HOST uses the LAN / Tailscale IP from Menu → Tailscale.
1. Install Arduino IDE 2.x 2. Boards Manager → search "esp32" (Espressif) → Install 3. Library Manager → PubSubClient (Nick O'Leary) → Install 4. Download Arduino zip (button above) → unzip 5. File → Open → esp32-siren/esp32-siren.ino 6. Tools → Board → ESP32 Dev Module (or ESP32S3 Dev Module) 7. Wi‑Fi prefilled from WiFi settings tab · MQTT_HOST from Tailscale 8. Upload
home-security/siren/command ← dashboard / panic / scenes
home-security/siren/status → { siren, strobe, online }
home-security/devices/esp-siren-1/hello → ESP devices registry (role: siren)
home-security/devices/esp-siren-1/status → Wi‑Fi presence
Timer starts whenever this switch turns on
Presets (minutes)
When → only if → then · triggers · conditions · actions · traces
Build rules like Home Assistant: pick a trigger, optional conditions (time window, weekdays, device state, solar SOC, borehole flow), then actions (devices, delay, notify, siren). Per-switch auto-off timers live on Lights on plan tiles.
Configure trigger, devices, timers, and notifications
Sun orbits map center from your address · real time sky path
—
Tilt the sky path on each axis to align sun & orbit with your floor plan. Changes apply instantly.
The path is a tilted ring (real sky arc), not flat on the ground — it looks oval from most camera angles. Night: sun drops below the floor. Align plan north with the compass (bottom-right): drag the rose so your floor plan’s north matches reality, or set Map north (°) in Settings → Floors.
Last 3 months · manual, schedule, sensor, and doorbell snapshots
Find your Vera / Ezlo hub on the LAN, then import Z-Wave lights and switches — no URL pasting.
Paste Vera HTTP URLs for on/off/status. Toggle on the plan when Edit layout is off. Drag markers when Edit layout is on.
Topic map · ESP32 relay firmware · Wi‑Fi
Map devices that already speak MQTT (Tasmota, ESPHome, Shelly MQTT, custom ESP).
Use the same broker as this dashboard (MQTT_URL). Command topic turns things on/off; state topic is optional feedback.
Loading…
Resolving connection…
After upload, add a device above with command topic home-security/switches/esp-mqtt-switch-1/set and state …/state.
One ESP32 · two sensors · add another board for more tanks
Each ESP32 has two sensors. + Add ESP32 for another board. Hold a tank on the plan to place more markers that share that same reading (tanks plumbed as one).
Ultrasonic module is 5 V — use a level shifter on ECHO if needed. DFRobot runs at 3.3–5 V; digital OUT to GPIO only.
Loading…
Resolving…
Save Control config first — sensor names, types and GPIOs are baked into the zip. Wi‑Fi + MQTT_HOST prefilled.
home-security/jojo/{sensorId}/level.23% with [23% Full] embossed label.Measure empty-tank distance sensor-to-floor, enter as tank height. Percent = (height − distance) / height.
Fix sensor at the minimum level you care about (e.g. 20% mark). When water reaches the face, dashboard shows 100% at that point.
LAN HTTP discovery · Plus / Gen1 / Gen2
Put Shelly devices on the same Wi‑Fi / LAN as the Pi. Disable Shelly Cloud in the Shelly app if you want local-only.
Scan probes /shelly and /rpc/Shelly.GetDeviceInfo across your /24 subnet.
Not scanned yet
Philips Hue · local LAN API · no cloud required after pair
Not configured
Sonoff / eWeLink cloud switches via CoolKit Open API
https://your-host.ts.net/ alone. You must include the path /ewelink-oauth.html.http:// is rejected except localhost lab tests..html.CoolKit no longer accepts plain username/password on the API for most accounts — OAuth via your own developer app is required. Sign in (legacy) uses the same App ID + Secret above with email/password; it only works if CoolKit still allows password login for your app (most accounts need OAuth).
Paste App ID + Secret, then Sign in with eWeLink.
Developer app registration lasts ~1 year. Each OAuth sign-in issues a separate access token (~30 days). Enable auto-renew to refresh the token in the background when 1–2 days remain (no browser popup).
Local control — no Tuya cloud subscription · same keys as Homebridge
bash deploy/homebridge/install.sh — installs Homebridge + homebridge-tuya-lan.tuya-lan-find on the Pi to capture each device id + local key (one-time). Full steps: wiki · also deploy/homebridge/README.md.TuyaLan platform and click Import from Homebridge.homebridge-gsh relay.Uses your free developer project to fetch local_key for all linked devices. Credentials are not saved — LAN control only after import.
No devices configured
USB stick · inclusion / exclusion · serial path
sudo usermod -aG dialout $USER then re-login so Node can open the serial port./dev/serial/by-id/… (listed when you refresh ports).Idle — not including
Zigbee 3.0 + Z-Wave dual USB · install & pairing
Dual-radio USB sticks expose two serial interfaces (or one composite device): one for Zigbee 3.0 (Zigbee2MQTT / zigbee-herdsman) and one for Z-Wave (zwave-js). The “Z-Stick 10 Pro” class covers Zooz / Aeotec / multi-protocol dongles that appear as USB-ACM or dual CDC ports on the Pi.
lsusb should show the vendor. Then ls -l /dev/serial/by-id/ — you often see two by-id links (Zigbee + Z-Wave).sudo usermod -aG dialout $USER · log out/in · restart this Node app.Runtime control (zigbee-herdsman / zwave-js) is prepared via these settings and pair flags. Install those stacks on the Pi when you are ready to drive live traffic; the UI already stores ports and pairing state.
Zigbee idle
Z-Wave idle
After idle time, the camera slowly orbits. Height is the pivot above the floor plane (not slab center).
—
Link a motion sensor to a camera. Capture runs only while the system is armed.
Select a PIR on the left and a camera on the right, then link them. One PIR, one camera.
PIRs
Cameras
Plays about 5 seconds from every linked camera. This does not arm the system.
Auto save keeps a copy on this Pi
Use Settings → Download full backup for a portable file (DB, PINs, controllers, layouts, automations, notes, Tailscale, push keys).
Erases settings, layouts, sensors, cameras, automations, smart devices, logs, and admin branding. Downloads a full backup to this browser first · admin PIN required.
Step-by-step guides for every menu
Ideas & reminders · autosaves
LAN IP · username · password · snapshot via server proxy
Live video: the Pi pulls RTSP from your DVR/camera with ffmpeg and re-packages it to HLS for the browser —
smooth video, nothing recorded. Needs ffmpeg on the Pi: sudo apt install -y ffmpeg.
Analog cameras on a Hikvision / Pro-Vision DVR: enter the DVR's IP + login, then
Pull all cameras — every enabled channel is imported. Or set Channel manually (1–128).
Digital/IP cameras: pick IP Camera and set the RTSP path or a full RTSP URL.
Drag header to move · dbl-click fullscreen · corner to resize · × to close
Gmail SMTP · recipients · server-side delivery
Create an app password at myaccount.google.com → Security → 2-Step Verification → App passwords.
One Gmail account sends for this site. Add one email address per line — all receive alerts.
Placeholders: {sensor}, {type}, {floor}, {status}, {location}, {armed}
Appends the current state of every placed sensor (doors, windows, motion) below the alert details.
Choose which sensors can trigger emails (topics above still apply).
One summary per day to all recipients — armed state, open doors, hot motion. Time uses South Africa (SAST) on the Pi.
Push, toast, and sound per event category.
Enter PIN to continue.
Branding, alerts, and the one site password.
Used in push / toast notifications — house name, directions link, and contact info.
Panic push: tap opens the app. Buttons: Call, Map, Open app. Android shows two buttons — expand the notification if you only see the title.
Square image works best (e.g. 512×512) · PNG, JPG, WebP or SVG · max 5 MB. Height controls the round mark in the header (20–96 px).
After a successful PIN login, the camera does a short orbit around the house, then settles into the normal standby view.
Installed apps can reopen straight to the dashboard. Turn on the option below if you want the PIN keypad every time (recommended on shared tablets).
One 4-digit password for sign-in, the admin menu, and this panel. There is no default: you create it the first time the dashboard opens.
Walks a virtual person through the house, or record your own break-in by tapping nodes. Logged steps go to History for later playback — no emails or push. Eagle-eye flies node-to-node.
Command center
Drop here to remove from floor plan
Click the timeline to set the playhead, then ▶