📊 MetricsMonitor – Documentation v2.8
📊

MetricsMonitor

FMDX Webserver Monitor Plugin
Platform: FM-DX-Webserver
Version: 2.8
Author: Highpoint
Date: April 2026
v2.8

Table of Contents

1Overview
2Requirements & Hardware Configuration
2.1MPX Equipment Settings
3Installation Instructions
4Display Modules
4.10 · Audio Meter
4.21 · MPX Meters
4.32 · MPX Spectrum Analyzer
4.43 · Signal Meter
4.54 · Signal Analyzer
4.65 · MPX Oscilloscope
5Interaction & Navigation
5.1Module Switching
5.2Zoom & Pan Controls
5.3Canvas Panel (Overlay)
5.4Header Icons & Status Indicators
6Configuration Reference (metricsmonitor.json)
7Calibration Guide
8Advanced Technical Details
8.1Audio Backend (Web Audio API)
8.2WebSocket Protocol
8.3Admin Mode
8.4Debug & Logging
9Important Notes & Troubleshooting
10Full Changelog
11Credits & Contact

1 · Overview

MetricsMonitor is an FMDX Webserver Monitor plugin for displaying RDS and RF information, volume, equalizers, spectrum analyzer, and oscilloscope for FM audio, FM baseband, and MPX signals.

It extends the FM-DX-Webserver with a suite of professional-grade signal analysis tools. It captures MPX audio from a sound card or USB audio device, performs real-time FFT analysis on the server, and streams the results to all connected browser clients via WebSocket.

The plugin replaces the standard signal panel with a configurable multi-module display. Six display modes are available; they can be freely ordered, filtered by login state, and switched interactively by the user without a page reload.

2 · Requirements & Hardware Configuration

Server Requirements

Browser (Client) Requirements

ℹ️ Audio Device Note: The MPX input must be a direct IF/MPX composite output from an FM tuner or SDR, not a decoded stereo audio output. Supported sample rates: 48 000 Hz (audio), 96 000 Hz (FM baseband), 192 000 Hz (full MPX).

2.1 · MPX Equipment Settings

ESP32 Receiver

Make sure the correct PE5PVB firmware is installed. You can either use the software-based MPX switching ("MPXmode": "auto" or "on") or you can permanently activate the MPX output in the audio settings menu.

⚠️ Important note for ESP32 TEF receivers: To use the MPX switching option, this specific firmware version must be installed: BETA firmware v2.20.6 (or at least v2.20.5).

Headless TEF

If the Headless TEF has a line-level audio output, the MPX output can be permanently enabled via a jumper on the board. It is recommended to output the signal to a 192kHz compatible sound card, which is then configured as "MPXInputCard": "plughw:CARD=Device" (Linux) or "Microphone (HD USB Audio Device)" (Windows). Normal mono/stereo sound output continues to be handled by the i2s USB sound interface.

MPX Tool & Co.

Anyone wishing to perform stereo decoding using MPX Tool or similar should use the settings "MPXmode": "on" and "MPXStereoDecoder": "on". This will result in permanent MPX output and stereo signaling on the display.

3 · Installation Instructions

  1. Download: Download the latest repository as a zip from the releases page.
  2. Unpack: Unpack all files (MetricsMonitorPlugin.js + MetricsMonitor Folder) to ..fm-dx-webserver-main\plugins\.
  3. Stop Server: Stop or close the fm-dx-webserver.
  4. Start/Restart: Start/Restart the fm-dx-webserver with npm run webserver or node . on the node.js console, check the console information.
  5. Activate: Activate the MetricsMonitor plugin in the settings UI.
  6. Stop Server: Stop or close the fm-dx-webserver.
  7. Start/Restart: Start/Restart the fm-dx-webserver again.
  8. Configure: Configure your personal settings in the automatically created metricsmonitor.json (located in the folder: ../fm-dx-webserver-main/plugins_configs).
  9. Stop Server: Stop or close the fm-dx-webserver.
  10. Final Start: Start the fm-dx-webserver. Check the console information to confirm successful startup.
⚠️ helpers.js Patch: On first startup, the server automatically patches server/helpers.js to exempt 127.0.0.1 from the anti-spam filter. This is required for the internal WebSocket communication. A server restart is required after this patch is applied.
✅ Live Config Reload: After initial setup, any change saved to metricsmonitor.json is detected by a file watcher. Client JS files are regenerated and redeployed automatically — no restart needed.

4 · Display Modules

MetricsMonitor provides six numbered display modules (IDs 0–5). You control which modules appear and in what order via MODULE_SEQUENCE in the config file. The user can cycle through them by clicking the panel or pressing number keys.

4.1 · 0 · Audio Meter

5-Band Audio Meter (metricsmonitor-audiometer.js)
Stereo L/R VU meters using the Web Audio API (Float32 precision), an RF signal bar, and five isolated frequency-band meters centred at 64 Hz, 256 Hz, 1 kHz, 4 kHz, and 10 kHz. Corrects the treatment of signals with different phases. Peak hold with configurable decay. Logarithmic dB scale (+5 dB to −26 dB). Completely browser-driven — no MPX capture needed.

4.2 · 1 · MPX Meters

MPX Meters (metricsmonitor-meters.js)
Six segment bar meters: LEFT, RIGHT (stereo audio), RF (signal strength), PILOT (19 kHz deviation in kHz), MPX (total composite deviation in kHz), and RDS (57 kHz subcarrier deviation in kHz). Values are derived from the MPX capture binary. Each meter shows a numeric value. Peak hold with 2 s decay.

4.3 · 2 · MPX Spectrum Analyzer

MPX Spectrum Analyzer (metricsmonitor-analyzer.js)
Canvas-based FFT spectrum and revised waveform display of the FM composite signal. Horizontal range depends on sample rate: 48 kHz → 0–24 kHz, 96 kHz → 0–48 kHz, 192 kHz → 0–76 kHz. Smoothed with configurable attack/decay envelopes. Supports horizontal and vertical zoom, pan, hover cursor with frequency/dB readout.

4.4 · 3 · Signal Meter

Signal Meter (metricsmonitor-signalmeter.js)
Combined panel: LEFT/RIGHT stereo audio bars, ACI and CCI meters (replacing the previous RF/Multipath bars, based on R100DX/SignalGuard), a large numeric signal readout with highest-seen tracking, and status icons (RDS, Stereo, TP, TA, ECC flag).

4.5 · 4 · Signal Analyzer

Signal Analyzer (metricsmonitor-signal-analyzer.js)
A Chart.js realtime line chart plotting signal strength over time. Includes a graphical Channel Condition display plotting Signal value, Multipath (MP), ACI, and CCI. Supports horizontal zoom (time window), vertical zoom (dB range), and drag-to-pan.

4.6 · 5 · MPX Oscilloscope

MPX Oscilloscope (metricsmonitor-scope.js)
Time-domain waveform viewer of the MPX composite signal (up to 1024 samples/frame). Includes a switchable waveform display. Phosphor afterglow with up to 23 persistent traces. Peak-hold amplitude band in the background. REF level lines indicate 100 % modulation reference. Computes a 60-second windowed MPX power value (dBr).

⚠️ Modules 2 & 5 (MPX Spectrum & Oscilloscope): These require an active MPX capture connection. When EnableAnalyzerAdminMode is true, they are only accessible to authenticated admin users. When false, all users can see them.

5 · Interaction & Navigation

5.1 · Module Switching

Clicking the Panel

Click anywhere inside the signal panel (#level-meter-container) to advance to the next module in the configured MODULE_SEQUENCE. A 150 ms fade transition is applied between modes.

Keyboard Shortcuts

You can quickly switch between modules using the numeric keys. Which numbers are active depends on the number of activated modules. The counting always starts with the first value.

KeyAction
1Switch to the 1st module in MODULE_SEQUENCE
2Switch to the 2nd module
39Switch to the Nth module (if it exists)

5.2 · Zoom & Pan Controls

Press the CTRL key to select different zoom options in MPX + Signal analysis modes.

Spectrum & Oscilloscope

ActionEffect
Scroll wheelHorizontal zoom in/out
Ctrl + ScrollVertical zoom in/out (dB / amplitude axis)
Left-click + DragPan the view horizontally (and vertically when Y-zoomed)
Right-clickReset all zoom to 1.0×
Ctrl + Zoom in horizontally
Ctrl + Zoom out horizontally
Ctrl + Pan left (when zoomed in)
Ctrl + Pan right (when zoomed in)
Ctrl + SpaceReset zoom to 1.0×

Signal Analyzer (module 4)

ActionEffect
Scroll wheelHorizontal zoom (time window: 1 s – 120 s)
Ctrl + ScrollVertical zoom (dB range)
Left-click + DragPan dB range up/down (only when vertically zoomed)
Right-clickReset all zoom
Ctrl + / Decrease / increase time window

5.3 · Canvas Panel (Overlay)

A button labelled MPX/Signal toggles a full-width canvas overlay above the tuner that displays one of the canvas modules defined in CANVAS_SEQUENCE (IDs 2, 4, 5). Each click cycles through them. If EnableSpectrumOnLoad is true, the first canvas module starts automatically.

5.4 · Header Icons & Status Indicators

IconDescription
ECC flagCountry/ECC badge cloned from the page's .data-flag element.
Stereo/Mono iconReflects the current stereo lock state. Clicking it sends B1 (force mono) or B0 (release) to the server. When MPXStereoDecoder = "on" it toggles between B1/B2.
PTY labelShows the current RDS Programme Type as human-readable text.
TP / TA iconsTraffic Programme and Traffic Announcement flags from RDS.
RDS iconGreen when RDS lock is active. Also changes the signal panel background colour.

6 · Configuration Reference (metricsmonitor.json)

The following variables can be changed in the metricsmonitor.json config file. After making changes, a server restart is only necessary for selected settings; a browser reload may also be sufficient!

Audio & MPX Hardware Settings

"sampleRate": 48000,             // Supported sample rate of input audio card (48000 / 96000 / 192000)
"MPXmode": "off",                // MPX behavior: "off" / "auto" (switching) / "on" (always output)
"MPXChannel": "auto",            // Fixed channel for MPX signal ("left", "right", "auto")
"MPXStereoDecoder": "off",       // Set to "on" if decoding stereo signal from MPX
"MPXInputCard": "",              // Exclusive MPX input (e.g., "plughw:CARD=Device")
"MPXTiltCalibration": 0,         // Adjust input slope from -1000 µs to 1000 µs
"VisualDelayMs": 250,            // Client-side delay in ms to sync with audio playback

Calibration Offsets & Scales

"MeterInputCalibration": 0,      // Global input gain offset in dB for meters
"MeterPilotCalibration": 0,      // Offset for Pilot deviation
"MeterMPXCalibration": 0,        // Offset for MPX deviation
"MeterRDSCalibration": 0,        // Offset for RDS deviation

"MeterPilotScale": 400,          // Scale factor for Pilot deviation
"MeterMPXScale": 100,            // Scale factor for MPX deviation
"MeterRDSScale": 750,            // Scale factor for RDS deviation

FFT, Spectrum & Scope Settings

"fftSize": 512,                  // Frequency sampling rate (higher = better resolution, more CPU)
"SpectrumInputCalibration": 0,   // Input gain offset in dB for spectrum
"SpectrumAttackLevel": 3,        // Response rate as signal increases
"SpectrumDecayLevel": 15,        // Smoothing decay (higher = stronger smoothing)
"SpectrumSendInterval": 30,      // MS between WebSocket spectrum frames
"SpectrumYOffset": -40,          // Curve offset
"SpectrumYDynamics": 2,          // Curve dynamic multiplier
"ScopeInputCalibration": 0,      // Amplitude gain offset for oscilloscope

Meter Gains & Layout

"StereoBoost": 2,                // Gain factor for stereo L/R VU meter
"AudioMeterBoost": 1,            // Gain factor for equalizer display

"MODULE_SEQUENCE": "1,2,5,0,3,4",// Click-cycle order of modules inside panel
"CANVAS_SEQUENCE": "2,5,4",      // Cycle order for the canvas overlay
"MultipathMode": 0,              // 1 = TEF Radio smooth, 0 = Raw MP Data
"LockVolumeSlider": true,        // Lock main volume slider to prevent measurement distortion
"EnableSpectrumOnLoad": false,   // Automatically open canvas overlay on load
"EnableAnalyzerAdminMode": false,// Restricts canvas modules to admin users only

Colors & Peaks

"MeterColorSafe": "rgb(0, 255, 0)",       // Safe range color
"MeterColorWarning": "rgb(255, 255, 0)",  // Warning range color
"MeterColorDanger": "rgb(255, 0, 0)",     // Danger range color
"PeakMode": "dynamic",                    // "fixed" or "dynamic"
"PeakColorFixed": "rgb(251, 174, 38)",    // Custom color for peak if PeakMode is fixed

7 · Calibration Guide

Proper calibration ensures that the meter readings match real broadcast standards.

Step 1 – Input Level (MeterInputCalibration)

Inject a 100 % modulation test tone (typically ±75 kHz deviation at 1 kHz) into your tuner. Observe the MPX Total meter. If the Pilot, MPX, and RDS meters show no signal level, increase the MeterInputCalibration in increments of 5. If the meters are in the red zone, decrease the MeterInputCalibration in increments of 5.

Step 2 – Roughly adjust the meter readings

Step 3 – Fine-Tuning with the Calibration Tool (Recommended)

Now you can use the calibration tool to calculate the exact scale values ​​so that the calibration offset values ​​(MeterPilotCalibration, etc.) remain at 0:
Launch Metrics Monitor Calibration Tool

Step 4 – Manual Fine-Tuning (Alternative)

If you prefer not to use the tool, you can adjust the calibration variables directly in the decimal range (0.x). Note: The calibration variables should only be used for direct fine-tuning, as otherwise they will distort the measurement result.

Step 5 – Spectrum Visibility (Spectrum-Y-Offset)

The spectrum curve baseline (noise floor) should sit near the bottom of the display. Decrease Spectrum-Y-Offset (make more negative) to move the curve down if the noise floor is too high. Typical working value: -40 to -60.

Step 6 – Pre-Emphasis Tilt (MPXTiltCalibration)

If the spectrum shows a rising slope toward high frequencies, set MPXTiltCalibration to 50 (Europe) or 75 (Americas) to apply an inverse de-emphasis tilt. Set to 0 to disable.

8 · Advanced Technical Details

8.1 · Audio Backend (Web Audio API)

Modules 0 (Audio Meter), 3 (Signal Meter), and parts of module 1 (MPX Meters) use the browser's Web Audio API to measure the live audio stream directly — entirely independent of the MPX capture.

The plugin connects to Stream.Fallback.Player.Amplification (the gain node of the FM-DX-Webserver audio player). A ChannelSplitterNode feeds separate AnalyserNodes for left and right channels. Amplitude is extracted as Float32 time-domain data, converted to dBFS, and mapped to the 0–100 % meter scale (+5 dBFS to −26 dBFS).

8.2 · WebSocket Protocol

MetricsMonitor uses the existing FM-DX-Webserver WebSocket endpoint (/data_plugins) for real-time communication.

// Server → Client: MPX Packet
{
  "type": "MPX",
  "peak": 74.3,          // MPX total deviation in kHz
  "pilotKHz": 8.97,      // Pilot tone deviation in kHz
  "rdsKHz": 3.82,        // RDS subcarrier deviation in kHz
  "s": [ ... ],          // Spectrum magnitudes array (float32)
  "o": [ ... ]           // Oscilloscope waveform samples array
}

8.3 · Admin Mode

Setting EnableAnalyzerAdminMode to true restricts canvas modules (IDs 2, 4, 5) to authenticated admin users only. Non-admin visitors will still see the non-canvas modules (0, 1, 3) normally.

8.4 · Debug & Logging

9 · Important Notes & Troubleshooting

10 · Full Changelog

v2.8 Current

Many thanks to Bojcha for the ideas and the code!

v2.7

v2.6

v2.5a

v2.5

v2.4b

v2.4a

v2.4

v2.3d

v2.3c

v2.3b

v2.3a

v2.3

v2.2

v2.1

v2.0

v1.5

v1.4

v1.3

v1.2

v1.1 & v1.1a

v1.0 & v1.0a

11 · Credits & Contact

MetricsMonitor is developed by Highpoint.
GitHub: https://github.com/Highpoint2000/MetricsMonitor

Special thanks for support, testing, and ideas:

Released under the MIT License.
FM-DX-Webserver is an open-source project for FM radio DXing over the internet.

Contact

If you have any questions, would like to report problems, or have suggestions for improvement, please feel free to contact me! You can reach me by email at highpoint2000@googlemail.com. I look forward to hearing from you!

☕ Buy Me A Coffee