uniFiAP  

Developer: Karl's Plugins     Like this plugin? Show your appreciation!
Category: Location and Presence
Github: Github Repo
License: MIT License
Assistance: Get help!   
Plugin ID: com.karlwachs.uniFiAP
Latest release: v2026.54.443 released on July 14, 2026
Release downloaded: 1 times
Requires: Indigo v2022.1.0 or higher
(Check the Releases tab below for older releases that may have different requirements)
  Download latest release

uniFiAP — Indigo Plugin

Integrates a UniFi network installation with the Indigo home-automation platform. Monitors UniFi access points, switches, gateways, cameras, and UniFi Protect sensors/relays; exposes device states as Indigo sensor/relay devices; and provides actions for controlling ports, cameras, clients, and relay outputs.

Plugin ID: com.karlwachs.uniFiAP Version: 2026.54.443 Indigo Server API: 3.0


Requirements

  • Indigo 2022.1 or later
  • UniFi Network controller (self-hosted or UDM/UDM-Pro)
  • UniFi Protect (optional — for cameras and USL sensors/relays)
  • SSH access enabled on switches for port power-cycle actions
  • Python 3 (bundled with Indigo)

Device Types

Network Infrastructure

  • UniFi (generic) — catch-all UniFi device; reports status, firmware, MAC, IP, uptime
  • Access Point (Device-AP) — per-AP device with signal stats, client counts, uptime, LED state, radio band info
  • Switch (Device-SW-4 through Device-SW-52) — per-port PoE/power state, traffic counters, uptime; variants for 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 26, and 52-port models
  • Gateway — WAN/LAN stats, uptime, CPU/memory, DHCP leases
  • Neighbor — neighboring UniFi devices discovered by the controller
  • SuperLink Gateway — dedicated device for the UniFi SuperLink gateway
  • Controller System — overall controller health and version info
  • Protect System — UniFi Protect NVR/application status and version; CPU temperature/load, memory, and disk usage update live from the Protect WebSocket (no SSH poll needed)

Note: every device type in this plugin is created automatically by the plugin itself — none of them can be added manually via Indigo's "New Device" dialog. Switches and APs, in particular, can either be created automatically by enabling Auto-detect in the plugin configuration's Switch/AP sections (the plugin reads the controller's device list and creates matching devices itself), or — when auto-detect is off — by entering the switch/AP IP addresses in the plugin configuration's per-slot fields, after which the plugin creates and matches the device the next time it reads the controller. See Plugin Configuration below.

Cameras

  • Camera (Protect) — camera connected via UniFi Protect; reports connection state, recording mode, firmware, and Protect-specific stats. WiFi cameras additionally report wifiSignalStrength (dBm), wifiSignalQuality (%), wifiLinkSpeed (Mbps), and wifiChannel. Smart detections fill lastSmartDetectType (person/vehicle/…), lastSmartDetectConfidence (%), lastSmartDetectZone, and lastSmartDetectAt
  • Camera (legacy) — camera managed directly by the network controller

UniFi Protect Sensors (USL family)

Each sensor device reports status, isConnected, isAdopted, MAC, firmwareVersion, lastSeen, created, and sensor-specific states. The device-state column in Indigo shows the displayStatus text with a change-stamped timestamp, e.g. 21.5ºC 26-07-03 11:42:00, GLASS BREAK! 26-07-03 …, open 26-07-03 … — the trailing date-time updates only when the state actually changes, not on every poll:

  • All-In-One Sensor (UP-Sense) — motion, contact, temperature, humidity, ambient light (light state), battery, sensorButtonPressedAt / sensorButtonPressedAt_Last (datetime of last/previous function-button press). Water leak: waterDetected, waterDetectedAt, waterDetectedAt_Last, waterDetectedEnabled. When leak detection is enabled (exclusive mode on this sensor) the device behaves like a water sensor: onOffState on = wet, display shows dry/LEAK!
  • Entry Sensor (USL-Entry) — door/window contact open/closed state, battery
  • Motion Sensor (USL-Motion) — motion detected state, battery
  • Environmental Sensor (USL-Environmental) — temperature, humidity, battery, sensorButtonPressedAt. Water leak: waterDetected + timestamps (combined — Protect does not report which probe fired) and per-probe enable flags waterDetectedInternalEnabled (built-in contacts) / waterDetectedExternalEnabled (wired probe)
  • Glass Break Sensor (USL-Glassbreak) — glass break detection (glassBreakAt / glassBreakAt_Last), battery, sensorButtonPressedAt
  • Remote Key Fob (USL-Fob) — button press events (buttonPressed always as "number/name", e.g. 2/night; display selectable as names or numbers, Auto follows the Protect "Button Labels" setting), battery
  • Smoke / CO Alarm (sensor_protect_smoke_co)smokeAlarm, coAlarm, smokeValue, coValue, alarmEnabled, batteryLow, endOfLife, sensor-fault and tamper states + alarm-onset timestamps; onOffState/display trip on smoke or CO (SMOKE+CO! / SMOKE! / CO! / ok). Future CO-only models (UP-CO / USL-CO variants) map onto this same type
  • Vape / Air Quality (UP-AirQuality)aqi, vapeIndex/vapeDetected, co2, voc/nox/tvoc, pm1/pm2.5/pm4/pm10, temperature, humidity; PoE powered; display selectable (AQI / vape / CO2 / temp+humidity)

Protect Relay (USL-Relay)

The relay creates three Indigo devices:

  • Protect Relay (relay_protect) — parent device for output 1; states include onOffState, lastCommand, status, isConnected, MAC, id, firmwareVersion, btSignal, lastSeen, created
  • Protect Relay Output 2 (relay_protect_output2) — independent on/off control for output 2; states include onOffState, lastCommand, MAC, created (only the parent device carries status)
  • Protect Relay Inputs (relay_protect_input) — ONE combined device for both dry-contact inputs: input1State/input2State, per-channel input1At/input2At (+ _Last) and input1PressType/input2PressType, plus sensorButtonPressedAt. A device setting selects which channel drives onOffState/display (shown as e.g. in1:ON 26-07-03 …)

Relay Input Behaviour

Input events are delivered exclusively via the UniFi Protect WebSocket (sensorButtonPressed). Each press sets the channel's input{n}State to true, records the press type (press, longPress, or doublePress) in input{n}PressType, and stores a timestamp in input{n}At (previous press in input{n}At_Last). The state automatically resets to false after ~3 seconds, creating a clean on→off pulse suitable for Indigo triggers.

Relay Output Behaviour

Outputs are controlled via the UniFi Protect Integration API (/proxy/protect/integration/v1/relays). On success, onOffState is updated and lastCommand is set to e.g. on sent 2026-07-03 17:42:11. The timestamp is captured immediately before the API call so it reflects when the command was sent, not when the response arrived.

FloodLight (UP FloodLight)

  • Protect FloodLight (light_protect) — Indigo dimmer device: the six LED levels map proportionally onto the percent scale (level×100/6 → 17/33/50/67/83/100 %, 0 = off; any percent set rounds to the nearest level, Brighten/Dim steps one level). onOffState/brightnessLevel follow the physical light (isLightOn, including motion-triggered activations); Turn On/Off/Set Brightness control the light via the internal Protect API (lightOnSettings.isLedForceOn / lightDeviceSettings.ledLevel; off releases it back to its configured mode). States: motionDetected (live PIR — usable as an Indigo motion trigger even when the light mode is off), lastMotionAt/_Last, isDark, ledLevel (1–6), lightMode (off/motion/always), pirSensitivity/pirDuration/luxSensitivity, isLightForceOn, plus connection/firmware/ip/lastSeen. Also controllable via the "FLOODLIGHT Protect set light ON / off" action and menu item

Siren

  • Protect Siren (USL-Siren) — siren/alarm device; on/off state and volume level

Plugin Configuration

Open the plugin's configuration dialog from Indigo's Plugins menu.

Quick Setup

The fastest way to configure the plugin: open the QUICK SETUP section at the top of the dialog, pick what your controller device has built in from one menu —

  • controller hosted on Mac/rPi (no Protect, no events)
  • CloudKey (controller only, no built-in switch/AP)
  • controller w. built-in switch / w. built-in switch + AP
  • UDM-Pro / UCG (built-in gateway + switch) / UDM (gateway + switch + AP)

— enter the few required parameters (controller IP, web login, SSH login, UDM unix login, and optionally Protect IP/login/API key with with cameras / with sensors checkboxes), then press execute. This fills in all the regular configuration sections below; nothing is saved until you press SAVE, so everything can be reviewed and adjusted first. Notes:

  • The menu describes only the controller box itself. External switches/APs are found by auto-detect and are never changed by the wizard; the controller's own built-in switch/AP use the reserved slots SW#13/AP#20, filled automatically
  • The wizard resets on every dialog open and prefills its fields from the current settings, so nothing has to be retyped; the result line shows how many parameters actually changed (details in the Indigo log)
  • with cameras / with sensors map to the prefs protectCreateCameras / protectCreateSensors (both default on) which gate the creation of new Protect camera resp. sensor/relay/speaker/SuperLink devices — existing devices keep updating either way

Key settings

  • Controller address and credentials — IP/hostname, username, password for the UniFi Network controller
  • Switch / AP auto-detect — optional, off by default, found in the Switch and AP sections respectively. When on, the plugin reads the controller's device list and automatically creates and fills in the matching Indigo switch/AP devices, instead of requiring the IP to be entered manually in a slot below. When off, switches/APs must be added by entering their IP in a free slot in the Switch/AP section (the device itself is still created automatically the next time the controller is read — manual creation via Indigo's "New Device" dialog is not available for these types). Either way, already-configured devices keep being matched and updated automatically. A small number of switch/AP slots are reserved internally for UDM-integrated controllers and are never used by auto-detect or available for manual entry
  • Protect API key — X-API-KEY for the UniFi Protect Integration API (required for relay control)
  • Poll intervals — how often to refresh AP, switch, gateway, camera, and sensor states
  • WebSocket — the plugin maintains a persistent WebSocket connection to UniFi Protect for real-time sensor and relay-input events
  • Controller event tracking — opens a second WebSocket to the Network controller's event stream (client connect/disconnect/roam, security alerts, admin actions). Buffers the last 500 events, enables the live monitor and print-events menu. Can be toggled at runtime without a plugin restart
  • Use controller WS events for client presence detection — optional (visible only when event tracking is on): feeds controller WiFi events into client presence tracking instead of the SSH log listener. WARNING: adds roughly 10 seconds of latency vs the SSH listener; only useful when direct SSH access to the APs is unavailable. Changing this setting restarts the plugin
  • Debug areas — individual checkboxes to enable verbose logging per subsystem (AP, Switch, Gateway, Protect, WebSocket, etc.). Two of them append raw controller resp. Protect WebSocket events to EVENTS-controllerWS.json / EVENTS-protectWS.json in the prefs dir (both off by default). The files start with [ and every line ends with , — append ] to get valid JSON. At 50 MB the oldest half is dropped automatically. Per-device debug logging (and, for switches, the mini-switch/no-SSH override) is configured on the individual switch/AP device's own Edit Device dialog, not here — see below
  • SSH settings — credentials and port for switch port power-cycle actions that use SSH

Switch / AP per-device settings

Each switch and AP device's own Edit Device dialog (not the plugin configuration) has two settings:

  • log debug msg from this device — enables verbose logging for just this one device
  • Mini-switch (no SSH) override (switches only)Auto (default) follows the controller's own report of whether the switch supports SSH; Force: Mini-switch (no SSH) and Force: Regular switch (SSH-capable) override that detection for this device. The dialog also shows a read-only label with the currently auto-detected status, so it's easy to tell what Auto is currently resolving to before overriding it. Mini/flex switches that don't support SSH get their port and client data from the controller's own API instead of an SSH session; this is normally detected automatically and the override is rarely needed

Actions

Camera Actions

  • LED set ON/OFF — turn the camera LED on or off
  • Speaker volume — set the camera speaker volume (0–100)
  • IR ON/OFF — enable or disable infrared night vision
  • Set Contrast / Brightness / Saturation / Sharpness / Hue — adjust image settings
  • Mic volume — set microphone sensitivity
  • Record ON/OFF — start or stop recording
  • Get Snapshot — fetch a still image from the camera
  • General command — send an arbitrary camera command
  • Pan/Tilt command — PTZ pan and tilt
  • Zoom command — PTZ zoom
  • Pan/Tilt/Zoom to preset — move to a named PTZ preset position

Network Client Actions

  • Power-cycle a switch port (SSH) — cycle PoE power on a specific switch port using SSH
  • Power-cycle a switch port (controller) — same via the controller API
  • Reconnect a WiFi client — kick a client off the network so it reconnects
  • Block a client — block a MAC address at the controller
  • Unblock a client — remove a MAC block

AP / Device Actions

  • Disable a UniFi AP — take an AP offline
  • Enable a UniFi AP — bring an AP back online
  • Reboot a UniFi device — send a reboot command
  • LED: switch all AP LEDs on — turn on LEDs for all access points
  • LED: switch all AP LEDs off — turn off LEDs for all access points
  • LED: blink one AP LED on/off — blink a specific AP's LED

Relay Actions

  • RELAY Protect set output 1/2 — set a relay output to on or off

Suspend/Activate

  • Suspend a system device — mark a device as suspended in the plugin (plugin takes no further action for it)
  • Unsuspend a system device — return it to normal polling

Available under Plugins → uniFiAP:

  • Print parameters to log — dump current plugin configuration values to the Indigo log
  • Print & get info from controller DB / UGA — query and print raw controller database records
  • Print communication and processing stats — show timing and throughput metrics
  • Track info for specific MAC — log all activity for a given MAC address
  • (Un)Ignore clients — add or remove clients from the ignore list
  • Reset SSH known-hosts file — clear the SSH known-hosts cache
  • Listeners — Manage — configure event listeners
  • Groups — Manage device types / individual devices — assign devices to polling groups
  • Protect — Info, settings, actions — Protect-specific diagnostics and commands
  • Protect cameras — send test commands — send test commands to Protect cameras
  • Copy controller backup files — copy controller backups to the Indigo preferences directory
  • Set all UniFi device props — bulk-update plugin properties across devices
  • Power-cycle a switch port — interactive menu version of the port-cycle action
  • Reconnect a WiFi client — menu version of the kick action
  • (Un)Block a client — menu version of the block/unblock action
  • Enable/disable/reboot a UniFi device — menu version of the device control action
  • Suspend/Activate a system device — menu version of the suspend action
  • Set AP LEDs on/off — menu version of the LED action

State Lifecycle Notes

  • lastSeen — updated every poll cycle from the controller; reflects the controller's own last-seen timestamp, not the plugin's
  • isConnected — USL-Relay uses Bluetooth; Protect may return null for this field. The plugin treats null as true (connected) since adoption implies connectivity for Bluetooth devices
  • input{n}At / input{n}At_Last — the relay inputs device records the timestamp of the most recent press per channel, and the previous one in _Last
  • lastCommand — relay output devices only; format "on sent YYYY-MM-DD HH:MM:SS" or "off sent …"

WiFi Client Signal States (UniFi devices)

Read from the AP's per-client station table every dict poll cycle:

  • signalWiFi — absolute received signal strength in dBm (e.g. -41); closer to 0 is stronger, below about -75 dBm connections get flaky
  • noiseWiFi — noise floor in dBm (typically around -95)
  • signal2NoiseWiFi — signal-to-noise ratio in dB (Ubiquiti calls this "rssi"): signalWiFi - noiseWiFi. Higher is better: above 25 dB solid, 15–25 dB usable, below 15 dB problems. Usually the most meaningful quality number since it accounts for the local noise floor
  • satisfactionWiFi — UniFi's own 0–100 connection quality score for the client
  • channelWiFi — actual WiFi channel the client is on (e.g. 11, 44)
  • stateWiFi — the AP driver's per-station flags as an 8-bit binary string (e.g. 00011111, bit 0 rightmost). Bit meanings (Atheros/madwifi node flags, not officially documented by Ubiquiti):
    • bit 0 (0x01) — authenticated
    • bit 1 (0x02) — QoS/WMM negotiated
    • bit 2 (0x04) — ERP / 802.11g protection (set on 2.4 GHz clients only)
    • bit 3 (0x08) — U-APSD power-save capable
    • bit 4 (0x10) — power management currently active (client is dozing; matches the AP's state_pwrmgt field)
    • Example: 00011111 = authenticated 2.4 GHz client with WMM, currently power-saving (typical IoT device napping between beacons)

Architecture Notes

  • Communication with the UniFi Network controller uses the controller's REST API (cookie-based session auth)
  • Communication with UniFi Protect uses two paths:
    • REST Integration API (/proxy/protect/integration/v1/) with X-API-KEY for read and write operations
    • WebSocket (/proxy/protect/ws/updates) for real-time events (sensor triggers, relay inputs, camera motion)
  • An optional second WebSocket connects to the Network controller's event stream (/proxy/network/wss/s/default/events). It powers:
    • the live event monitor and print-events menu (last 500 events buffered)
    • security alerts (IPS/IDS, threats) logged as Indigo warnings with source IP, country, and signature
    • instant blocked state updates plus an audit log line when an admin blocks/unblocks a client
    • optional client presence detection (EVT_WU_Connected/Disconnected/Roam) as a replacement for the SSH log listener — slower by ~10 s, intended for setups without AP SSH access
  • Per-device polling runs on background threads; one thread per controller IP and device type
  • Relay input events do not use polling — they arrive exclusively via WebSocket
  • Sensor button presses arrive on two WebSocket paths (a sensorButtonPressed event and a functionButtonPressedAt field in sensor updates) — both update the sensorButtonPressed state
  • Delayed state resets (e.g. relay input auto-off after 3 s) are handled by a dedicated daemon thread checking a time-stamped action queue every 0.5 s

File Layout

uniFiAP.indigoPlugin/
  Contents/
    Info.plist                  plugin metadata and version
    Server Plugin/
      plugin.py                 main plugin code
      Devices.xml               device type definitions
      Actions.xml               action definitions
      MenuItems.xml             menu item definitions
      Events.xml                event definitions
      PluginConfig.xml          plugin preferences UI
      MAC2Vendor.py             MAC-to-vendor lookup
      *.exp                     expect scripts for SSH operations
      unifi_dpi.json            DPI application ID map
Release details
Released on: July 14, 2026
Requires: Indigo v2022.1.0+
Downloaded: 1 times 
Changes in this release

changes in V2026.54.443 @ 2026-07-11

NEW: - prepared for a future CO-only Protect sensor: plausible model identifiers (UP-CO/USL-CO variants, CARBON-MONOXIDE) map to the existing Smoke/CO device type, plus a token-safe "CO" fallback for unknown spellings (matches USL-CO-EU but can never mis-grab CONTACT). The smoke_co type already carries all CO states/display - once the hardware exists, only its status-block name may need adapting - new device type "Protect FloodLight (UP FloodLight)" (light_protect, Protect modelKey "light"): an Indigo DIMMER: the 6 led levels map proportionally onto the percent scale (level100/6: 17/33/50/67/83/100%, 0=off; any percent set rounds to the nearest level; Brighten/Dim steps one level). onOffState follows isLightOn (Indigo on/off sends lightOnSettings.isLedForceOn via the internal protect api PATCH /proxy/protect/api/lights/, same as brightness), display "ON/off + timestamp"; states: motionDetected + lastMotionAt/_Last (PIR), isDark, ledLevel (1..6), lightMode (off/motion/always), pirSensitivity/pirDuration/luxSensitivity, isLightForceOn, isConnected/status, firmware/ip/lastSeen. Created at bootstrap (gated by protectCreateSensors), updated live via WebSocket; a newly adopted floodlight schedules a protect refresh automatically. New action "FLOODLIGHT Protect set light ON / off" and menu item "FLOODLIGHT set light ON / off.." (same as the device on/off command: forces the light on / releases it to its configured mode; both can also set the brightness, ledLevel 1..6, via the internal protect api - on/off and brightness independently selectable) - every newly created Indigo device is now logged (info level): created new device "" type: address: - covers all 27 creation paths (auto-detect, Protect sensors/cameras/relays/speakers, clients, ...) via one shared wrapper, independent of debug settings - QUICK SETUP section in plugin config: pick what your controller device has built in from one menu (hosted Mac/rPi | CloudKey | controller w. built-in switch | +AP | UDM-Pro/UCG gateway+switch | UDM gateway+switch+AP), enter only the needed parameters (controller IP, web login, ssh login, UDM unix login, Protect IP/login/API key), optional Protect block (enabled / same machine / with cameras / with sensors), then one button fills all the regular config sections below - nothing is saved until SAVE is pressed, so everything can be reviewed first. External switches/APs are found by auto-detect and are never changed by the wizard; the controller's built-in switch/AP use the reserved slots SW#13/AP#20 (filled automatically). The wizard resets on every dialog open and prefills its entry fields from the current settings, so nothing has to be retyped; the result line reports how many parameters actually changed (details in the log) - new prefs protectCreateCameras / protectCreateSensors (both default true, existing installs unchanged): gate the creation of NEW Protect camera resp. sensor/relay/speaker/SuperLink devices - existing devices keep updating either way; set by the quick setup "with cameras" / "with sensors" checkboxes - Protect on/off sensors now show a change-stamped timestamp in displayStatus: " YY-MM-DD HH:MM:SS" (open/closed, MOTION/clear, GLASS BREAK!/ok, ACTIVE/idle, SMOKE/CO, LEAK!/dry, connected/disconnected). The time re-stamps only when the state word actually changes (not every poll) - same change-stamped timestamp added to: analog sensor displays (temperature/humidity, AQI/vape/CO2), the Protect speaker (idle/playing/vol%), the SuperLink gateway (lower-case connected/disconnected + onOffState from isConnected), relay inputs (in1:ON/off) and relay outputs (on/off in the onOffState display) - displayStatus padding is now measured, not guessed: when PyObjC/AppKit is available the plugin measures each status word's real pixel width in the 13pt system font and pads with spaces to a common ~80px target (one formula for every word, incl. keyfob/speaker/relay strings that the hand-tuned table never covered; results land within +-2px). Without PyObjC it falls back to the per-word table as before - the displayStatus shown in the State column uses a 2-digit year (YY-MM-DD, space restrictions); all timestamp STATES (lastStatusChange, lastCommand, keyfob press, leak/glassbreak/relay-input times, created/upSince) keep the full 4-digit year - the year is shortened only at display-render time. Status words are padded per word (padDisplay) so the date-times roughly line up in the State column; at startup stored displayStatus values are reformatted once (and interim 2-digit state values expanded back to 20xx) - plugin config dialog opens much faster: the dynamic refresh callback (refreshCallbackMethod -> setfilterunifiCloudKeyListOfSiteNames), which the Indigo client fired on every field change/initialisation with a full client->plugin round-trip each time, is removed entirely. The 8 combined-condition visibility flags (showUidUDM, showCtrlActive, ...) are replaced by direct client-side bindings to their section checkbox - no plugin round-trips at all while the dialog is open; everything else happens once at dialog open. Cosmetic trade-off: a few conditional fields (e.g. UDM unix login, Protect login) now simply show whenever their section is open, instead of also depending on controller type / camera system - removed the curl transport option entirely (requestOrcurl / curl path config options are gone): all controller/Protect http access now uses python requests only - curl was a fallback for OS X El Capitan-era SSL and hasn't been needed for years. The OS/port probe now uses a requests HEAD call as well - sensor/relay state bridgeId renamed to bridge_used and now holds the SuperLink bridge's Indigo device NAME instead of the raw Protect id; updates live via WebSocket when the sensor switches bridges. The Bluetooth all-in-one UP-Sense (no LoRa bridge) has no bridge_used / bridgeCandidate states - only its btSignal states - keyfob: new device-edit option "Button display": Auto (default - follows the fob's buttonLabels field from Protect: securityActions=names, positionHint=numbers, i.e. the "Button Labels" selection in the Protect UI, tracked live via a new buttonLabels state) | names | numbers. Numbers mapping: 1=arm, 2=night, 3=disarm, 4=panic. The buttonPressed state ALWAYS shows "number/name" (e.g. 2/night) regardless of the option. Saving the device dialog re-renders the display immediately (The Protect UI "Button Labels" setting is cosmetic only - the API always sends the internal names) - more sensor info states: mountType + openStatusChangedAt/_Last (entry, allInOne), tamperingDetectedAt/_Last (siren, smoke/CO), temperature/humidity alarm thresholds (environmental, allInOne), ledEnabled + firmwareUpdateState (all LoRa devices) - filled at bootstrap and updated live via WebSocket - new states bridgeCandidate1/2/3 on the LoRa Protect devices (entry, motion, environmental, glassbreak, keyfob, siren, smoke/CO, relay - NOT the Bluetooth all-in-one UP-Sense): which SuperLink bridges the device can currently hear, best signal first, as " " (from wirelessConnectionState.bridgeCandidates; resolved to the Indigo bridge device name when known, filled at bootstrap and live via WebSocket, unused slots empty) - raw Protect WebSocket events are no longer ALWAYS appended to EVENTS-protectWS.json: new debug checkbox "(17) append raw Protect WS events ..." (default off, like the existing controller-WS one) - saves constant disk writes on normal operation - debug options reorganized into labeled groups by data source: GENERAL | CLIENT presence tracking | SSH to unifi devices | CONTROLLER http/WS | PROTECT | WRITE FILES to prefs dir | DEVELOPMENT - checkbox ids unchanged, saved prefs unaffected. New checkbox for the BroadCast debug (existed in code but could never be enabled); removed the dead debugVideo pref - removed the FINGSCAN integration entirely (config options, Fing debug area, sendUpdatetoFingscanNOW, the "fing" flag on status updates)

MAJOR fix: - all SSH-read switch/AP/gateway dicts were being silently dropped: loads_resilient returns a (obj, dropped_count) tuple, but the caller stored the whole tuple as the dict; every downstream handler then rejected it ("mac" in (dict, 0) is False), so no SSH-read switch, AP or gateway (nor their self UniFi clients) had updated in ~13 days. Only the controller-fed mini switch, which doesn't go through this parse path, still worked. Now the tuple is unpacked

fixes: - adding a NEW relay no longer floods the log with "WS UNHANDLED modelKey:relay" during adoption: an unknown relay id now schedules a protect bootstrap refresh (so the Indigo devices get created once adoption completes) with a rate-limited info line instead - status changes on devices without a lastStatusChange state (e.g. the Protect relay) no longer produce the Indigo error "state key lastStatusChange not defined"; also fixed a typo ("fistSeen") that prevented the firstSeen state from ever being seeded by the status path - keyfob: the FIRST button press on a sleeping (disconnected/away) fob looked lost - the event actually arrives, but the display rebuild still saw isConnected=false (the awayState:ONLINE update only follows after the press event) and rendered DISCONN instead of the press. A button press now asserts isConnected/status=CONNECTED before the display is rebuilt, so the first wake-press shows immediately - the http target IP and port are now LOCAL variables handed through the call chain (executeCMDOnController -> getunifiOSAndPort) instead of the shared useIPForhttpCmd/usePortforhttpCmd instance variables - eliminates any remaining cross-thread contamination (e.g. controller vs Protect commands racing each other on setups where they use different IPs/ports). Also fixed on the way: the port scan referenced an undefined useTimeout (latent NameError, now a parameter), the Protect branch no longer overwrites the controller port (only visible when controller and Protect ports differ), and a freshly discovered controller port is now used for the login in the same pass instead of the pre-discovery value - controller logins were intermittently sent to switch IPs (LOGIN failed ... url:https://:443/api/auth/login): the switch-dict processing thread wrote the shared useIPForhttpCmd variable (its scratch copy of the switch IP) while executeCMDOnController in another thread was between setting the controller IP and issuing the login. The dict functions now use their local ipNumber parameter; only executeCMDOnController sets the URL host (controller or Protect IP). Latent for weeks - it only surfaced once the loads_resilient fix revived the SSH dict processing - relay outputs/inputs from the Protect WebSocket were mapped by a nonexistent "index" field (always defaulting to 0), so output 2 never updated and the parent showed the wrong output's state; the payload identifies them by "id" (0/1), which is now used (with index fallback) - switch self-clients read over SSH stayed expired while only the mini-switch (controller-fed) worked: SSH switch dumps often carry no timestamp, so the _doSWdictSELF dedup skipped every read after the first and the self-client was marked up only once. The self-client is now marked up on every successful SSH read (before the dedup); the controller/mini path still respects the dedup so a lingering snapshot of an offline device doesn't hold its client up - switch/AP self UniFi clients: setStatusUpForSelfUnifiDev now matches case-insensitively (MACs are stored mixed-case) and is also called where the read is confirmed fresh (it was only reached in a branch that is skipped for new/unmatched devices); if no client matches but one exists whose MAC differs only in the last octet, a log line reports it instead of silently leaving the client expired - auto-detect: an auto-created switch/AP was created but never enabled/polled (stayed blank until manual restart) because the "reboot" flag was cleared right after creation; the plugin now restarts as intended - auto-detect: switches/APs plugged in after plugin start are now discovered on the periodic scan (previously, with no mini-switch present, discovery only ran at startup) - auto-detect: a slot is claimed only after the Indigo device is actually created; deferred creation (e.g. no port_table yet) leaves the slot free for a clean retry - auto-detect: deleting a switch/AP Indigo device now recreates it (occupied-slot path rebuilds the missing device); a guard prevents duplication into a lower free slot - auto-detect: an actual (re)creation always triggers the restart that enables and polls it - the createUnifiDevicesCounter cap (anti-thrash for the gateway branch) can no longer swallow a genuine creation - switch port-count snapping in _doSWdictSELF was missing its break, so any switch with an unlisted port count ran up to 52 ports instead of the next-highest supported size - port command on controller wrote the updated device dict to the wrong list index (off by one, could also raise IndexError on the last device)

changes in V2026.52.441 @ 2026-06-30

  • new switch/AP auto-detect: optional setting (off by default) per section in plugin config to automatically discover and create Device-SW-XX / Device-AP Indigo devices straight from the controller's device list, instead of requiring manual device creation; matching/updating already-configured devices is unaffected by this setting either way
  • UDM-reserved switch/AP slot relocated from the middle of the slot list (AP-4, SW-12) to new dedicated tail slots (AP-20, SW-13); existing installs are migrated automatically on first run after update (old slot data moved, old slot freed for normal use, logged)
  • devices are now created with allowUserCreation="false" (plugin-wide, all device types) so they no longer appear in the manual "New Device" type picker; auto-created switch/AP devices also carry an internal allowUserCreation=False prop marker
  • mini-switch (no-SSH) override and per-device debug logging moved out of plugin config into each switch/AP device's own Edit Device dialog: new "Mini-switch (no SSH) override" menu (Auto / Force Mini / Force Regular) with a live auto-detected status label, and a "log debug msg from this device" checkbox; existing devices are migrated 1:1 from their old plugin-config values on first run (never silently reset to Auto)
Release details
Released on: June 29, 2026
Requires: Indigo v2022.1.0+
Downloaded: 2 times 
Changes in this release

changes in V2026.51.440 @ 2026-07-01

  • added support for set speaker volume and mic volume in menu and actions
  • added support for remote 4 button
Release details
Released on: June 10, 2026
Requires: Indigo v2022.1.0+
Downloaded: 32 times 
Changes in this release
  • controller event tracking via WebSocket (optional): client connect/disconnect/roam, security alerts (IPS/IDS logged as warnings), admin block/unblock with instant 'blocked' state update
  • optional: controller WS events can replace the SSH log listeners for client presence detection (~10s slower, for setups without AP ssh access); changing the option restarts the plugin
  • protect WS events are always logged to EVENTS-protectWS.json (option removed); controller events optional to EVENTS-controllerWS.json; files auto-trim at 50MB (drop oldest half)
  • water leak: fixed detection (protect sends leakDetectedAt timestamp, not booleans); new states waterDetectedAt / waterDetectedAt_Last; allInOne with leak detection enabled behaves as a water sensor (on=wet, display dry/LEAK!)
  • environmental sensor: per-probe enabled states waterDetectedInternalEnabled / waterDetectedExternalEnabled; removed leakEnabled (use waterDetectedEnabled)
  • renamed sensorButtonPressed -> sensorButtonPressedAt, added sensorButtonPressedAt_Last
  • new UniFi client states: signalWiFi/stateWiFi (restored), signal2NoiseWiFi, satisfactionWiFi, channelWiFi
  • new camera states: wifiSignalStrength/Quality/LinkSpeed/Channel, lastSmartDetectType/Confidence/Zone/At
  • protect system device: cpu/memory/disk update live from NVR WebSocket
  • allInOne sensor: new ambient light state
  • removed modelKey state from all devices; relay daughter devices: only parent carries status
  • sensor displayStatus now shown as onOffState ui value for all protect sensor types
  • plugin config: sections collapse on open; new show-section toggles for user IDs, controller info, UDM, gateway (Hue-style hidden flag pattern for multi-condition visibility); protect credentials moved to user IDs section
  • fixed device history failures (null btSignal values written to integer states)
  • removed cProfile; periodCheck refactored into per-device-type methods
  • prefs-dir file names normalized (EVENTS-xxx, WS-xxx, PROTECT-xxx)
Release details
Released on: March 24, 2026
Requires: Indigo v2022.1.0+
Downloaded: 32 times 
Changes in this release

performance improvements for poe on off

Release details
Released on: March 21, 2026
Requires: Indigo v2022.1.0+
Downloaded: 36 times 
Changes in this release
  • added update states for mini/flex switches through HTTP query to controller
  • fixed rx tx rates for port states
  • added power on off on switches through controller. The Flex and mini switches do not support ssh commands, hence there was noo support for that function before In config "".. use controler" has to be set to "ON"
Release details
Released on: Oct. 27, 2024
Requires: Indigo v2022.1.0+
Downloaded: 28 times 
Changes in this release
  • added devices for system controller an system protect (they can be the same but will show as 2) the relevant properties (like in config) can be set here important dev states are preseneted: disk space, memory utilization ..
  • added option for different userid/password and port for protect vs controller device if not specified it is set as same you can set them in config aand device edit for controller and proetct system devices
  • added error catch for bad read of disk space from unifi conroller / protect systemetc
Release details
Released on: Jan. 13, 2024
Requires: Indigo v2022.1.0+
Downloaded: 28 times 
Changes in this release

in case of http error, the plugin does not print a large dump anymore, but it will = check if timeout, retry 2 more times, if sucessful, a warning will occur .. fixed after xx tries = if not sucessfult it will try 30 more times (after some minutes) and if not sucesfull the plugin will reload eg when the unifi device is down, or you load a new software

Release details
Released on: Dec. 15, 2023
Requires: Indigo v2022.1.0+
Downloaded: 41 times 
Changes in this release

added option to select a differetnt way to set POE on/off switches. Some newer switch devices only support a unix command swctrl all of my older switches also support unix swctrl command.

Release details
Released on: Dec. 6, 2023
Requires: Indigo v2022.1.0+
Downloaded: 29 times 
Changes in this release
  • added check for protect camera: is properly defined? line 8953, in getProtectIntoIndigo cameraId = dev.states["id"] KeyError: 'key id not found in dict'
  • fixed mismatch for detecting dicts start end while listening to AP SW etc.
Release details
Released on: Dec. 1, 2023
Requires: Indigo v2022.1.0+
Downloaded: 35 times 
Changes in this release

added checks for setup a new install if not all parameters and devices are set.

Release details
Released on: July 19, 2023
Requires: Indigo v2022.1.0+
Downloaded: 34 times 
Changes in this release
  1. added config option in general section to set request - curl timeout to any value >=1 sec
  2. made error logging more verbose
  3. added option to supress test logging at startup, default is log, set in config under section debug
  4. fixed print parameters requests timeout was not properly formatted
Release details
Released on: July 19, 2023
Requires: Indigo v2022.1.0+
Downloaded: 35 times 
Changes in this release
  1. added config option in general section to set request - curl timeout to any value >=1 sec
  2. made error logging more verbose
Release details
Released on: July 19, 2023
Requires: Indigo v2022.1.0+
Downloaded: 28 times 
Changes in this release

added config option in general section to set request - curl timeout to any value >=1 sec

Release details
Released on: July 18, 2023
Requires: Indigo v2022.1.0+
Downloaded: 29 times 
Changes in this release

set http req timeout to 10 secs

Release details
Released on: May 8, 2023
Requires: Indigo v2022.1.0+
Downloaded: 35 times 
Changes in this release
  1. added menu item to clean up ~/.ssh/know_hostsfile if you have issues with ssh loging in to your unifi devices, you can now reset the entries in ~/.ssh/konwn_hosts file

  2. added config option in userid/password section to ignore known_hosts ie use ssh -o StrictHostKeyChecking=no userid@x.y.x.z instead of ssh userid@x.y.x.z

Release details
Released on: April 19, 2023
Requires: Indigo v2022.1.0+
Downloaded: 33 times 
Changes in this release

1. fixed error for unifi protect event thumbnails in some cisrcumstance the thumbnail is not available immedeately after event. the plugin now tests if the thumbnail image is ready, then they are copied. this might take up to 10 secs. in addition a "snapshot" is taken immediately. they can be requested at any time

2. removed code for old deprecated nvr video system. The plugin now only supports PROTECT

3. made config a little more readable

Release details
Released on: June 27, 2022
Requires: Indigo v2022.1.0+
Downloaded: 29 times 
Changes in this release

1. suppress error message that File suspended does not exist 2. added option to supress Exsessive time used ... set in config at the bottom 3. fixed error msg: state key previousStatusChange not defined