| Developer: | Karl's Plugins Like this plugin? Show your appreciation! |
| Category: | A/V and IR Equipment |
| Assistance: | Get help! |
| Plugin ID: | com.karlwachs.networkscanner |
| Latest release: | v2025.0.2 released on April 15, 2026 |
| Requires: | Indigo v2022.1.0 or higher |
| Download latest release |
Discovers all devices on the local LAN and creates one Indigo device per unique MAC address found. The device's on/off state reflects whether the physical device is currently reachable on the network.
No third-party packages required. All discovery uses macOS built-in tools:
Tool Purpose/usr/sbin/tcpdump
Passive ARP sniffing — flags: -i interface, -n no name resolution, -e ethernet header (gives MAC), -l line-buffered, filter arp
/sbin/ping
Subnet sweep and reachability checks — flags: -c 1 one packet, -W wait ms per packet, -t overall timeout s
/usr/sbin/arp
Reads ARP cache after sweep — flags: -a all entries, -i limit to interface
/sbin/ifconfig
Determine local subnet — parses inet line for IP and netmask (hex or dotted decimal)
MAC2Vendor.py
Bundled OUI vendor lookup — auto-downloads IEEE tables on first run, caches locally, refreshes every 10 days
Passive ARP sniffing — listens for ARP broadcasts via tcpdump. No traffic generated; devices are seen as they communicate. Parses both ARP Reply lines (definitive MAC→IP) and ARP Request lines (sender MAC + IP).
Active ARP sweep — sends parallel pings to every host on the subnet, then reads the kernel ARP cache with arp -a. Only devices that responded to ping have their last_seen updated. Stale ARP cache entries (devices that appear in the cache but did not ping-respond) are recorded for discovery only — they never falsely extend a device's online status.
Periodic ping check — runs every scan-interval seconds to keep online/offline states current between sweeps.
Plugins → Network Scanner → Configure…
Setting Description Default Network Interface Interface to sniff (e.g.en0, eth0). Leave blank to auto-detect.
en0
Scan Interval (s)
How often to ping known devices. Options: 30 / 60 / 90 / 120
60
Enable ARP Sweep
Active subnet sweep each scan cycle
on
Enable Passive Sniffing
Listen for ARP traffic between sweeps
on
Offline Threshold (s)
Unreachable for this long → marked offline. Options: 30–420
180
Ignore offline changes at startup (s)
Suppress all offline decisions for N seconds after plugin start, giving ARP time to re-confirm devices. Options: 20 / 40 / 60 / 80
60
Auto-Create Devices
Create an Indigo device for each new MAC address discovered
on
Device Folder Name
Indigo folder for Net_* devices (created automatically). Leave blank for root.
Network Devices
plugin.log only — or — plugin.log + Indigo event log
Log IP Address Changes
Log when a device's IP address changes
Log Every Device Seen
Verbose per-packet log (can be noisy)
Log ARP Sweep Activity
Log sweep start / finish with device counts
Log Ignored MACs Skipped
Log each time an ignored MAC is seen and skipped
Double-click any Net_* device
Controls how periodic pings affect the online/offline state of this device.
Option Behaviour When to use Online + Offline Ping sets both online and offline state Verbose ping tracking; device responds reliably Online only Ping can mark online, not offline Get devices back to "on" fast after they reappear (e.g. phone leaving and returning home) Offline only Ping can mark offline, not online Make devices go offline fast when they disappear Confirm offline (default) Ping only fires when ARP timeout is exceeded; logged to plugin.log when ping keeps device online Devices that tend to be quiet — prevents premature offline Not at all Ping ignored; ARP timeout alone decides offline Device is reliably detected by ARP aloneHow ping failure and ARP timeout combine to decide offline.
Option Behaviour AND (default) ARP timeout expired AND ping failed — fewest false alarms OR ARP timeout expired OR ping failed — faster offline detection1
Offline Threshold (s)
Per-device override. 0 = use plugin-wide default.
0
Comment
Free-text note stored in the comment device state
—
Suppress IP Change Logging
Silence IP-change log entries for this device only
off
Log Every Seen Event to File
Write a plugin.log entry each time this device is seen
off
onOffState
Boolean
True = online / reachable, False = offline
ipAddress
String
Last seen IP address
macAddress
String
MAC address
localName
String
mDNS / Bonjour hostname from arp -a (e.g. iPhone.local); populated during ARP sweep; empty if device has not announced a name
vendorName
String
Manufacturer name from bundled OUI table
lastOnOffChange
String
Timestamp of last online ↔ offline transition
created
String
Timestamp when the Indigo device was first created
openPorts
String
Comma-separated open TCP ports from last port scan
comment
String
Free-text note set in device edit
Net_AA:BB:CC:DD:EE:FF (or Net_AA:BB:CC:DD:EE:FF VendorName once vendor is known)192.168.1.005 — so that alphabetical sort on Notes gives correct numeric IP orderPlugins → Network Scanner
Menu Item Description List All Discovered Devices Prints all known MACs with IP, local name, vendor, on/off state and last-seen to plugin.log Force Immediate Rescan Triggers an ARP sweep + ping check immediately Scan Open Ports on All Online Devices… Port-scans every currently online device; stores results in theopenPorts device state
Set a State of Device…
Manually overwrite any state on any Net_* device
Print Seen-Interval Statistics…
Histogram of how often each device is seen; sort by IP / device name / last seen
Reset Seen-Interval Statistics
Clears histogram counters for all devices
Manage Ignored MAC Addresses…
Exclude / re-include specific MACs from scanning
Help…
Prints full help text to plugin.log
Tracks the time between consecutive sightings of each device, bucketed into:
≤10s · ≤30s · ≤60s · ≤90s · ≤120s · ≤180s · ≤240s · ≤300s · >300s
Use Print Seen-Interval Statistics… to view (sorted by IP address, device name or last seen); Reset Seen-Interval Statistics to clear all counters.
Plugins → Network Scanner → Manage Ignored MAC Addresses…
Ignored MACs are neither created nor updated by the scanner.
The localName device state is populated from the first field of arp -a output. On macOS, this field is filled in by the OS from its mDNS/Bonjour cache (mdnsResponder). Devices that advertise themselves via Bonjour (Apple devices, Sonos speakers, many routers, smart home devices) will show names like iPhone.local, MacBook-Pro.local, or router.local. Devices that do not announce a Bonjour name show ? in the arp output and will have an empty localName state.
The name is only updated when a real name is found — a sweep that returns ? for a device will not erase a previously discovered name.
known_devices.json state file is loaded at startup so previously discovered devices are immediately available without waiting for a sweep.The plugin saves all discovered device data (IP, last-seen timestamp, vendor, local name, ping-fail streak, seen-interval statistics) to:
<Indigo install>/Preferences/Plugins/com.karlwachs.networkscanner/known_devices.json
This file is saved after every scan cycle and on shutdown (including SIGTERM). On a clean shutdown the save is lock-safe; on SIGTERM a lockless fast-save is used to avoid deadlock.
Author: Karl Wachs — Version 2026.0.5
| v2025.0.2 | Requires Indigo v2022.1.0+ | Released April 15, 2026 | Discovers LAN devices via ARP sniffing, sweep and ping. Creates one Indigo device per MAC address; t |
| Released on: | April 15, 2026 |
| Requires: | Indigo v2022.1.0+ |
| Download this release | |
first release