Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

Adding custom metric

未关闭
#841 3 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
5/5
预计耗时
一周以上
新手友好度
25/100
Issue 类型
功能
描述清晰度
需要澄清
活跃度
停滞
技术栈
javascript, python
领域
observability

调研方向

首先定位 serverinfo 页面及其现有的指标入口,然后阅读 modem_signal.py,以了解所提议的 LTE 信号输入和输出。确定如何在页面上提供和呈现这些数据;当 LTE 调制解调器信号强度可作为 serverinfo 指标使用时,即视为完成。

由索引模型根据 Issue 内容生成。

描述

enhancement

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?

主要语言
JavaScript
星标
133
派生
67
平均合并
22 小时 55 分钟
30 天内合并 PR
53

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

nextcloud/serverinfo 的其他 Issue

查看 nextcloud/serverinfo 的全部 Issue

相似的 Issue

更多 JavaScript Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。