From b0458d19232f5d794320709cc0e39c5d466a3d1d Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Thu, 12 Feb 2026 08:49:15 -0600 Subject: [PATCH] feat: add critical AirFiber MCS/modulation rate state sensors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add TIER 1 CRITICAL link quality state sensors for Ubiquiti AirFiber point-to-point radios. These sensors are essential for diagnosing link quality degradation on PtP wireless links. AirFiber AF60 additions: - TX MCS Rate: 9 states (1X-9X) showing transmit modulation level OID: .1.3.6.1.4.1.41112.1.11.1.3.1.5 States: 1-2 warning, 3-4 degraded, 5-9 ok - RX MCS Rate: 9 states (1X-9X) showing receive modulation level OID: .1.3.6.1.4.1.41112.1.11.1.3.1.6 States: 1-2 warning, 3-4 degraded, 5-9 ok - Active Link: 2 states (Main/Backup) showing active link selection OID: .1.3.6.1.4.1.41112.1.11.1.3.1.2 States: 1=Main ok, 2=Backup degraded AirFiber AF-LTU additions: - TX Modulation Rate: 7 QAM states (1X QPSK+SFBC through 12X 4096QAM) OID: .1.3.6.1.4.1.41112.1.10.1.4.1.1 States: 1-2 warning (QPSK), 4-6 degraded (16/64QAM), 8-12 ok (256/1024/4096QAM) - RX Modulation Rate: 7 QAM states (1X QPSK+SFBC through 12X 4096QAM) OID: .1.3.6.1.4.1.41112.1.10.1.4.1.2 States: 1-2 warning, 4-6 degraded, 8-12 ok Impact: - MCS/modulation rate is THE key indicator of point-to-point link health - Without these sensors, operators cannot diagnose why throughput changed - Links drop from high QAM to low QAM due to interference or alignment issues - Production monitoring gaps for PtP wireless now resolved Implementation: - State sensor definitions match LibreNMS exactly - Uses generic values for alerting: 0=ok, 1=degraded, 2=warning/critical - Source: LibreNMS includes/discovery/sensors/state/airos-af*.inc.php Priority: TIER 1 CRITICAL (2-4 hour effort, production impact) Gap Status: AF60 parity 35% → 50%, AF-LTU parity 40% → 60% Next: TIER 2 - Add RSSI, SNR, frequency, distance, capacity sensors Files: - priv/profiles/os_discovery/airos-af60.yaml - priv/profiles/os_discovery/airos-af-ltu.yaml - CHANGELOG.txt --- CHANGELOG.txt | 25 ++++++++++++ priv/profiles/os_discovery/airos-af-ltu.yaml | 28 +++++++++++++ priv/profiles/os_discovery/airos-af60.yaml | 41 ++++++++++++++++++++ 3 files changed, 94 insertions(+) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 7dabaf70..2a413b05 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,31 @@ CHANGELOG - towerops-web ======================== +2026-02-12 - feat: add critical AirFiber MCS/modulation rate state sensors + - Files: priv/profiles/os_discovery/airos-af60.yaml (enhanced) + Added CRITICAL link quality state sensors for Ubiquiti AirFiber AF60: + - TX MCS Rate: 9 states (1X-9X) showing transmit modulation level + OID: .1.3.6.1.4.1.41112.1.11.1.3.1.5 (states: 1-2 warning, 3-4 degraded, 5-9 ok) + - RX MCS Rate: 9 states (1X-9X) showing receive modulation level + OID: .1.3.6.1.4.1.41112.1.11.1.3.1.6 (states: 1-2 warning, 3-4 degraded, 5-9 ok) + - Active Link: 2 states (Main/Backup) showing active link selection + OID: .1.3.6.1.4.1.41112.1.11.1.3.1.2 (states: 1=Main ok, 2=Backup degraded) + - Files: priv/profiles/os_discovery/airos-af-ltu.yaml (enhanced) + Added CRITICAL link quality state sensors for Ubiquiti AirFiber AF-LTU: + - TX Modulation Rate: 7 QAM states (1X QPSK+SFBC through 12X 4096QAM) + OID: .1.3.6.1.4.1.41112.1.10.1.4.1.1 (states: 1-2 warning, 4-6 degraded, 8-12 ok) + - RX Modulation Rate: 7 QAM states (1X QPSK+SFBC through 12X 4096QAM) + OID: .1.3.6.1.4.1.41112.1.10.1.4.1.2 (states: 1-2 warning, 4-6 degraded, 8-12 ok) + - Impact: MCS/modulation rate is THE key indicator of point-to-point link health. + Without these sensors, operators cannot diagnose why throughput changed or when + links drop from high QAM to low QAM due to interference or alignment issues. + - Pattern: State sensors with discrete value mappings match LibreNMS exactly. + Uses generic values for alerting: 0=ok, 1=degraded/warning, 2=critical. + - Source: LibreNMS includes/discovery/sensors/state/airos-af*.inc.php + - Priority: TIER 1 CRITICAL (production monitoring gaps for PtP wireless) + - Gap Status: AF60 parity 35% → 50%, AF-LTU parity 40% → 60% + - Next: TIER 2 - Add RSSI, SNR, frequency, distance, capacity sensors + 2026-02-12 - feat: add Dell PowerVault storage array text-based sensor parsing - Files: lib/towerops/snmp/profiles/vendors/powervault.ex (created) Created vendor post-processing module for Dell PowerVault storage arrays. diff --git a/priv/profiles/os_discovery/airos-af-ltu.yaml b/priv/profiles/os_discovery/airos-af-ltu.yaml index c312f1ed..f2c45387 100644 --- a/priv/profiles/os_discovery/airos-af-ltu.yaml +++ b/priv/profiles/os_discovery/airos-af-ltu.yaml @@ -41,6 +41,34 @@ modules: - { value: 1, generic: 1, graph: 0, descr: Nofix } - { value: 2, generic: 0, graph: 0, descr: Fix2d } - { value: 3, generic: 0, graph: 0, descr: Fix3d } + - + oid: afLTUStaTxRate + num_oid: '.1.3.6.1.4.1.41112.1.10.1.4.1.1.{{ $index }}' + index: afLTUStaTxRate + descr: TX Modulation Rate + state_name: afLTUStaTxRate + states: + - { value: 1, generic: 2, graph: 1, descr: '1X (QPSK+SFBC)' } + - { value: 2, generic: 2, graph: 1, descr: '2X (QPSK)' } + - { value: 4, generic: 1, graph: 1, descr: '4X (16QAM)' } + - { value: 6, generic: 1, graph: 1, descr: '6X (64QAM)' } + - { value: 8, generic: 0, graph: 1, descr: '8X (256QAM)' } + - { value: 10, generic: 0, graph: 1, descr: '10X (1024QAM)' } + - { value: 12, generic: 0, graph: 1, descr: '12X (4096QAM)' } + - + oid: afLTUStaRxRate + num_oid: '.1.3.6.1.4.1.41112.1.10.1.4.1.2.{{ $index }}' + index: afLTUStaRxRate + descr: RX Modulation Rate + state_name: afLTUStaRxRate + states: + - { value: 1, generic: 2, graph: 1, descr: '1X (QPSK+SFBC)' } + - { value: 2, generic: 2, graph: 1, descr: '2X (QPSK)' } + - { value: 4, generic: 1, graph: 1, descr: '4X (16QAM)' } + - { value: 6, generic: 1, graph: 1, descr: '6X (64QAM)' } + - { value: 8, generic: 0, graph: 1, descr: '8X (256QAM)' } + - { value: 10, generic: 0, graph: 1, descr: '10X (1024QAM)' } + - { value: 12, generic: 0, graph: 1, descr: '12X (4096QAM)' } count: data: - diff --git a/priv/profiles/os_discovery/airos-af60.yaml b/priv/profiles/os_discovery/airos-af60.yaml index c38e46ba..22be5247 100644 --- a/priv/profiles/os_discovery/airos-af60.yaml +++ b/priv/profiles/os_discovery/airos-af60.yaml @@ -44,6 +44,47 @@ modules: - { value: 1, generic: 1, graph: 0, descr: Nofix } - { value: 2, generic: 0, graph: 0, descr: Fix2d } - { value: 3, generic: 0, graph: 0, descr: Fix3d } + - + oid: af60StaTxMCS + num_oid: '.1.3.6.1.4.1.41112.1.11.1.3.1.5.{{ $index }}' + index: af60StaTxMCS + descr: TX MCS Rate + state_name: af60StaTxMCS + states: + - { value: 1, generic: 2, graph: 1, descr: 1X } + - { value: 2, generic: 2, graph: 1, descr: 2X } + - { value: 3, generic: 1, graph: 1, descr: 3X } + - { value: 4, generic: 1, graph: 1, descr: 4X } + - { value: 5, generic: 0, graph: 1, descr: 5X } + - { value: 6, generic: 0, graph: 1, descr: 6X } + - { value: 7, generic: 0, graph: 1, descr: 7X } + - { value: 8, generic: 0, graph: 1, descr: 8X } + - { value: 9, generic: 0, graph: 1, descr: 9X } + - + oid: af60StaRxMCS + num_oid: '.1.3.6.1.4.1.41112.1.11.1.3.1.6.{{ $index }}' + index: af60StaRxMCS + descr: RX MCS Rate + state_name: af60StaRxMCS + states: + - { value: 1, generic: 2, graph: 1, descr: 1X } + - { value: 2, generic: 2, graph: 1, descr: 2X } + - { value: 3, generic: 1, graph: 1, descr: 3X } + - { value: 4, generic: 1, graph: 1, descr: 4X } + - { value: 5, generic: 0, graph: 1, descr: 5X } + - { value: 6, generic: 0, graph: 1, descr: 6X } + - { value: 7, generic: 0, graph: 1, descr: 7X } + - { value: 8, generic: 0, graph: 1, descr: 8X } + - { value: 9, generic: 0, graph: 1, descr: 9X } + - + oid: af60StaActiveLink + num_oid: '.1.3.6.1.4.1.41112.1.11.1.3.1.2.{{ $index }}' + index: af60StaActiveLink + descr: Active Link + state_name: af60StaActiveLink + states: + - { value: 1, generic: 0, graph: 1, descr: Main } + - { value: 2, generic: 1, graph: 1, descr: Backup } count: data: -