Skip to content

Commit 6637533

Browse files
committed
feat: add segment utilization settings toggle
1 parent 0afeab6 commit 6637533

File tree

16 files changed

+130
-11
lines changed

16 files changed

+130
-11
lines changed

app/blueprints/segment_bp.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ def api_segment_utilization():
4343
return jsonify({"error": t.get("seg_unavailable", "Configuration unavailable.")}), 503
4444
if config.get("modem_type") != "fritzbox":
4545
return jsonify({"error": t.get("seg_unsupported_driver", "This view is only available for FRITZ!Box cable devices.")}), 400
46+
if not config.is_segment_utilization_enabled():
47+
return jsonify({"error": t.get("seg_disabled", "Segment utilization is disabled in Settings.")}), 400
4648

4749
storage = _get_storage()
4850
if not storage:

app/collectors/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,13 @@ def discover_collectors(config_mgr, storage, event_detector, mqtt_pub, web, anal
112112
# Segment utilization collector (FritzBox only)
113113
if modem_type == "fritzbox":
114114
from .segment_utilization import SegmentUtilizationCollector
115-
collectors.append(SegmentUtilizationCollector(
115+
segment_collector = SegmentUtilizationCollector(
116116
config_mgr=config_mgr,
117117
storage=storage,
118118
web=web,
119-
))
119+
)
120+
if segment_collector.is_enabled():
121+
collectors.append(segment_collector)
120122

121123
# ── Module collectors ──
122124
module_loader = web.get_module_loader() if hasattr(web, 'get_module_loader') else None

app/collectors/segment_utilization.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def name(self):
3737
return "segment_utilization"
3838

3939
def is_enabled(self):
40-
return self._config.get("modem_type") == "fritzbox"
40+
return self._config.get("modem_type") == "fritzbox" and self._config.is_segment_utilization_enabled()
4141

4242
def collect(self):
4343
url = self._config.get("modem_url")

app/config.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"admin_password": "",
3838
"demo_mode": False,
3939
"gaming_quality_enabled": True,
40+
"segment_utilization_enabled": True,
4041
"notify_webhook_url": "",
4142
"notify_webhook_token": "",
4243
"notify_min_severity": "warning",
@@ -74,6 +75,7 @@
7475
"booked_upload": "BOOKED_UPLOAD",
7576
"demo_mode": "DEMO_MODE",
7677
"gaming_quality_enabled": "GAMING_QUALITY_ENABLED",
78+
"segment_utilization_enabled": "SEGMENT_UTILIZATION_ENABLED",
7779
"bnetz_enabled": "BNETZ_ENABLED",
7880
"notify_webhook_url": "NOTIFY_WEBHOOK_URL",
7981
"notify_webhook_token": "NOTIFY_WEBHOOK_TOKEN",
@@ -103,7 +105,7 @@
103105
}
104106

105107
INT_KEYS = {"poll_interval", "web_port", "history_days", "notify_cooldown", "health_hysteresis"}
106-
BOOL_KEYS = {"demo_mode", "gaming_quality_enabled"}
108+
BOOL_KEYS = {"demo_mode", "gaming_quality_enabled", "segment_utilization_enabled"}
107109

108110
URL_KEYS = {"modem_url", "bqm_url", "speedtest_tracker_url", "notify_webhook_url"}
109111
_ALLOWED_URL_SCHEMES = {"http", "https"}
@@ -334,6 +336,13 @@ def is_gaming_quality_enabled(self):
334336
val = val.lower() in ("true", "1", "yes")
335337
return bool(val) or self.is_demo_mode()
336338

339+
def is_segment_utilization_enabled(self):
340+
"""True if FRITZ!Box segment utilization is enabled."""
341+
val = self.get("segment_utilization_enabled")
342+
if isinstance(val, str):
343+
val = val.lower() in ("true", "1", "yes")
344+
return bool(val)
345+
337346
def is_bnetz_enabled(self):
338347
"""True if BNetzA broadband measurement feature is enabled."""
339348
val = self.get("bnetz_enabled")

app/i18n/de.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,8 @@
567567
"modules_available": "Verfügbar",
568568
"modules_requires_fritzbox": "Benötigt FRITZ!Box",
569569
"modules_managed_in": "Verwaltet unter",
570+
"segment_utilization_enabled_label": "Segment-Auslastung erfassen",
571+
"segment_utilization_enabled_hint": "Zeigt die Ansicht Segment-Auslastung an und fragt alle 5 Minuten die FRITZ!Box-Segmentlast ab.",
570572
"active_issues": "Aktive Probleme",
571573
"report_bug": "Fehler melden",
572574
"support_kofi_title": "Unterstützen auf Ko-fi",
@@ -760,6 +762,7 @@
760762
"seg_range_30d": "30d",
761763
"seg_range_all": "Alle",
762764
"seg_note": "Die Auslastungswerte sind Schaetzungen der FRITZ!Box und koennen von der tatsaechlichen Segmentauslastung abweichen.",
765+
"seg_disabled": "Segment-Auslastung ist in den Einstellungen deaktiviert.",
763766
"seg_unsupported_driver": "Diese Ansicht ist nur fuer FRITZ!Box-Kabelgeraete verfuegbar.",
764767
"seg_unavailable": "Konfiguration nicht verfuegbar.",
765768
"seg_correlation_ds": "Segment DS Last (%)",

app/i18n/en.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,8 @@
567567
"modules_available": "Available",
568568
"modules_requires_fritzbox": "Requires FRITZ!Box",
569569
"modules_managed_in": "Managed in",
570+
"segment_utilization_enabled_label": "Collect segment utilization",
571+
"segment_utilization_enabled_hint": "Show the Segment Utilization view and poll FRITZ!Box segment load data every 5 minutes.",
570572
"active_issues": "Active Issues",
571573
"report_bug": "Report a bug",
572574
"support_kofi_title": "Support on Ko-fi",
@@ -760,6 +762,7 @@
760762
"seg_range_30d": "30d",
761763
"seg_range_all": "All",
762764
"seg_note": "Segment utilization values are estimates provided by the FRITZ!Box and may differ from actual CMTS-wide load.",
765+
"seg_disabled": "Segment utilization is disabled in Settings.",
763766
"seg_unsupported_driver": "This view is only available for FRITZ!Box cable devices.",
764767
"seg_unavailable": "Configuration unavailable.",
765768
"seg_correlation_ds": "Segment DS Load (%)",

app/i18n/es.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,8 @@
562562
"modules_available": "Disponible",
563563
"modules_requires_fritzbox": "Requiere FRITZ!Box",
564564
"modules_managed_in": "Se gestiona en",
565+
"segment_utilization_enabled_label": "Recopilar utilizacion del segmento",
566+
"segment_utilization_enabled_hint": "Muestra la vista de utilizacion del segmento y consulta los datos de carga del segmento FRITZ!Box cada 5 minutos.",
565567
"active_issues": "Problemas activos",
566568
"report_bug": "Reportar un error",
567569
"support_kofi_title": "Apoyar en Ko-fi",
@@ -755,6 +757,7 @@
755757
"seg_range_30d": "30d",
756758
"seg_range_all": "Todo",
757759
"seg_note": "Los valores de utilizacion del segmento son estimaciones de la FRITZ!Box y pueden diferir de la carga real del CMTS.",
760+
"seg_disabled": "La utilizacion del segmento esta desactivada en Configuracion.",
758761
"seg_unsupported_driver": "Esta vista solo esta disponible para dispositivos cable FRITZ!Box.",
759762
"seg_unavailable": "Configuracion no disponible.",
760763
"seg_correlation_ds": "Carga segmento DS (%)",

app/i18n/fr.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,8 @@
559559
"modules_available": "Disponible",
560560
"modules_requires_fritzbox": "Nécessite FRITZ!Box",
561561
"modules_managed_in": "Géré dans",
562+
"segment_utilization_enabled_label": "Collecter l'utilisation du segment",
563+
"segment_utilization_enabled_hint": "Affiche la vue d'utilisation du segment et interroge la charge du segment FRITZ!Box toutes les 5 minutes.",
562564
"active_issues": "Problèmes actifs",
563565
"report_bug": "Signaler un bug",
564566
"support_kofi_title": "Soutenir sur Ko-fi",
@@ -752,6 +754,7 @@
752754
"seg_range_30d": "30j",
753755
"seg_range_all": "Tout",
754756
"seg_note": "Les valeurs d'utilisation du segment sont des estimations de la FRITZ!Box et peuvent differer de la charge reelle du CMTS.",
757+
"seg_disabled": "L'utilisation du segment est désactivée dans les paramètres.",
755758
"seg_unsupported_driver": "Cette vue n'est disponible que pour les appareils cable FRITZ!Box.",
756759
"seg_unavailable": "Configuration non disponible.",
757760
"seg_correlation_ds": "Charge segment DS (%)",

app/i18n/template.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,8 @@
535535
"modules_available": "",
536536
"modules_requires_fritzbox": "",
537537
"modules_managed_in": "",
538+
"segment_utilization_enabled_label": "",
539+
"segment_utilization_enabled_hint": "",
538540
"active_issues": "",
539541
"report_bug": "",
540542
"support_kofi_title": "",
@@ -704,5 +706,6 @@
704706
"localization": "",
705707
"localization_desc": "",
706708
"dashboard_features": "",
707-
"dashboard_features_desc": ""
709+
"dashboard_features_desc": "",
710+
"seg_disabled": ""
708711
}

app/templates/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@
101101
<i data-lucide="git-compare-arrows"></i> {{ t.get('docsight.comparison.title', 'Before/After Comparison') }}
102102
</a>
103103
{% endif %}
104-
{% if is_fritzbox %}
104+
{% if is_fritzbox and segment_utilization_enabled %}
105105
<a class="nav-item" data-view="segment-utilization" data-nav-icon="gauge" data-nav-title="{{ t.seg_title }}">
106106
<i data-lucide="gauge"></i> {{ t.seg_title }}
107107
</a>
@@ -1790,7 +1790,7 @@ <h3 class="gaming-section-title">{{ t.gaming_genres_title }}</h3>
17901790
{% endif %}
17911791

17921792
{# ── Segment Utilization (FritzBox core feature) ── #}
1793-
{% if is_fritzbox %}
1793+
{% if is_fritzbox and segment_utilization_enabled %}
17941794
<div id="view-segment-utilization" class="view">
17951795
{% include "segment_utilization_tab.html" %}
17961796
</div>

0 commit comments

Comments
 (0)