serverinfo icon indicating copy to clipboard operation
serverinfo copied to clipboard

Adding custom metric

Open oleua opened this issue 6 months ago • 3 comments

Hi! I would like to add LTE modem signal strength to the available data (metrics) provided on the page serverinfo. I have a Python function which gets this data from LTE modem which can be run as modem_signal.py http://192.168.0.1 and provides the output like Orange PL LTE ▂▃▄.

#!/usr/bin/env python3

"""
Display 4G/5G modem signal strength using vertical bars and show operator + access mode.
Example usage:
python3 modem_signal.py http://admin:[email protected]/
"""

from argparse import ArgumentParser
from huawei_lte_api.Connection import Connection
from huawei_lte_api.Client import Client
import re

SIGNAL_LEVELS = {
    0: "     ",
    1: "â–‚    ",
    2: "â–‚â–ƒ   ",
    3: "▂▃▄  ",
    4: "▂▃▄▅ ",
    5: "▂▃▄▅▇"
}

def parse_dbm(value):
    if value is None:
        return None
    match = re.search(r'-?\d+', str(value))
    return int(match.group()) if match else None

def get_signal_level(rsrp: int) -> int:
    if rsrp is None:
        return 0
    if rsrp >= -80:
        return 5
    elif rsrp >= -90:
        return 4
    elif rsrp >= -100:
        return 3
    elif rsrp >= -110:
        return 2
    elif rsrp >= -120:
        return 1
    else:
        return 0

def generate_signal_bars(level: int, total: int = 5) -> str:
    """
    Create a vertical bar chart (like a phone signal icon).
    Each bar grows higher from left to right.
    """
    result = []
    for row in range(total, 0, -1):
        line = ""
        for col in range(1, total + 1):
            if col <= level and row <= col:
                line += "â–‡ "
            else:
                line += "  "
        result.append(line.rstrip())
    return "\n".join(result)

def main():
    parser = ArgumentParser()
    parser.add_argument('url', type=str)
    parser.add_argument('--username', type=str)
    parser.add_argument('--password', type=str)
    args = parser.parse_args()

    with Connection(args.url, username=args.username, password=args.password) as connection:
        client = Client(connection)

        # Get signal and network info
        signal_info = client.device.signal()
        status_info = client.monitoring.status()
        network_type_raw = str(status_info.get('CurrentNetworkType', '0'))

        network_type_map = {
          '0': 'No Service',
          '1': 'GSM', '2': 'GPRS', '3': 'EDGE',
          '4': 'WCDMA', '5': 'HSDPA', '6': 'HSUPA', '7': 'HSPA',
          '8': 'TDSCDMA', '9': 'HSPA+',
          '10': 'EVDO Rev.0', '11': 'EVDO Rev.A', '12': 'EVDO Rev.B',
          '13': '1xRTT', '14': 'UMB', '15': '1xEVDV', '16': '3xRTT',
          '17': 'HSPA+ 64QAM', '18': 'HSPA+ MIMO',
          '19': 'LTE', '41': 'LTE CA',
          '101': 'NR5G NSA', '102': 'NR5G SA'
        }
        plmn_info = client.net.current_plmn()

        # Parse and determine values
        rsrp = parse_dbm(signal_info.get('rsrp'))
        rsrq = signal_info.get('rsrq')
        sinr = signal_info.get('sinr')

        level = get_signal_level(rsrp)
#        bars = generate_signal_bars(level)
        bars = SIGNAL_LEVELS[level]

        operator_name = plmn_info.get('FullName') or plmn_info.get('ShortName') or "Unknown"

        # Map internal mode codes (if any) to readable labels
        mode_map = {
           "LTE": "4G",
           "WCDMA": "3G",
           "GSM": "2G",
           "NR5G": "5G",
           "NR": "5G"
        }
        readable_mode = network_type_map.get(network_type_raw, f"Unknown ({network_type_raw})")

        # Display
        print(f"{operator_name} {readable_mode} {bars}")
#        print(bars)
#        print(f"\n  RSRP: {signal_info.get('rsrp')}")
#        if rsrq: print(f"  RSRQ: {rsrq}")
#        if sinr: print(f"  SINR: {sinr}")

if __name__ == "__main__":
    main()

What is the best way to embed it to the serverinfo page?

oleua avatar Jun 16 '25 10:06 oleua