Technology Apr 28, 2026 · 3 min read

I Replaced My Monitoring Dashboard With a Factory Warning Light

I replaced my monitoring dashboard with a factory warning light. Not metaphorically. Literally. It's a Patlite LA6-POE — the kind of stacked warning light you see on Japanese factory floors that flashes red when the line stops. Five segments, one PoE cable, ~30 cm tall. Mine doesn't warn. It show...

DE
DEV Community
by Kusnaware
I Replaced My Monitoring Dashboard With a Factory Warning Light

I replaced my monitoring dashboard with a factory warning light.

Not metaphorically. Literally.

It's a Patlite LA6-POE — the kind of stacked warning light you see on Japanese factory floors that flashes red when the line stops. Five segments, one PoE cable, ~30 cm tall.

Mine doesn't warn. It shows.

Patlite LA6-POE — 4 segments lit at ~80 Mbps

The Inversion

Warning lights are designed to stay dark until something is wrong, then scream.

So I inverted it.

I wanted a light that stays always on, showing current bandwidth as a stack. The more layers lit, the more the network is active.

When 1 segment is lit, things are quiet.

When all 5 are lit and the top one flashes, someone is pushing a lot of traffic.

I barely open the dashboard anymore. The corner of the room tells me what I need to know.

The Build

  • Hardware: Patlite LA6-POE, one PoE switch port (power + data in a single cable)
  • Software: ~200 lines of Python on the monitoring host
  • Protocol: Patlite's obscure PNS binary protocol over TCP/10000. Reverse-engineered from the manufacturer PDFs. One round-trip is ~11 ms.

Data path:

PRTG (sFlow/SNMP from edge router)
    ↓ XML API polled every 5 seconds
    ↓ Python daemon + hysteresis logic
    ↓ PNS command over TCP
    ↓ Patlite LA6-POE

Colors (fixed by hardware):

Bottom → Blue → Green → Yellow → Pink → Red (top)

The PRTG Trap

PRTG's XML for traffic sensors contains <lastvalue_raw> twice per channel:

  • First: cumulative bytes since sensor start
  • Second: current rate in bytes/second
# WRONG — you will see 8 million Mbps and question reality
rate = channel.find('lastvalue_raw').text

# RIGHT
raw_values = channel.findall('lastvalue_raw')
rate_bps = float(raw_values[1].text)

I lost half a day.

This kind of bug is the worst — it doesn't crash, it just lies.

Thresholds with Hysteresis

I didn't design this for precision. I designed it for perception.

Naive thresholds make the light flicker like a broken Christmas tree. Hysteresis (separate UP/DOWN thresholds with ~10% gap) fixes it.

Level UP (Mbps) DOWN (Mbps) Segments Flash Buzzer
0 < 18 none
1 ≥ 20 < 27 1
2 ≥ 30 < 45 2
3 ≥ 50 < 72 3
4 ≥ 80 < 90 4
5 ≥ 100 < 135 5 ON
6 ≥ 150 < 135 5 ON 0.6s chirp

Result

This device solves zero tickets.

Sends zero notifications.

Improves no SLAs.

But I open the dashboard far less — and I notice problems earlier.

It does nothing useful, and everything I wanted.

It turned a factory warning light — originally designed to scream until somebody makes the screaming stop — into a device I actually want to glance at.

And that, in 2026, is more than enough.

(Six months ago, I solved a Cloudflare Wrangler problem with X11 forwarding instead of API tokens. Apparently this is my brand now: solving modern problems with historically inappropriate tools. This is the second time.)

If people are interested, I can share the exact setup and code.

DE
Source

This article was originally published by DEV Community and written by Kusnaware.

Read original article on DEV Community
Back to Discover

Reading List