Skip to content

Commit 633cb0f

Browse files
itsDNNSclaude
andcommitted
Rename project from fritzbox-docsis-monitor to DOCSight
Remove FritzBox trademark from project name, branding, Docker image, MQTT identifiers, and all user-facing text. Generic enough for future support of other cable modems. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent c48b4f3 commit 633cb0f

File tree

11 files changed

+69
-60
lines changed

11 files changed

+69
-60
lines changed

.env.example

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# FritzBox DOCSIS Monitor - Environment Variables (optional)
1+
# DOCSight - Environment Variables (optional)
22
# Copy to .env and edit. All values can also be set via the web UI setup wizard.
33
# Environment variables override config.json values.
44

@@ -12,7 +12,7 @@ MQTT_HOST=localhost
1212
MQTT_PORT=1883
1313
MQTT_USER=
1414
MQTT_PASSWORD=
15-
MQTT_TOPIC_PREFIX=fritzbox/docsis
15+
MQTT_TOPIC_PREFIX=docsight
1616

1717
# General
1818
POLL_INTERVAL=300

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
44

55
Versioning: `YYYY-MM-DD.N` (date + sequential build number per day)
66

7+
## [2026-02-09.11]
8+
9+
### Changed
10+
- **Project renamed to DOCSight**: Removed FritzBox trademark from project name, repo, Docker image, MQTT identifiers
11+
- **MQTT entities renamed**: `fritzbox_docsis_*``docsight_*`, device name now "DOCSight"
12+
- **Default MQTT topic prefix**: Changed from `fritzbox/docsis` to `docsight`
13+
714
## [2026-02-09.10]
815

916
### Changed

README.md

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# FritzBox DOCSIS Monitor
1+
# DOCSight
22

3-
Docker container that monitors DOCSIS channel health on AVM FRITZ!Box Cable routers and publishes per-channel sensor data to Home Assistant via MQTT Auto-Discovery.
3+
Docker container that monitors DOCSIS channel health on cable modems and publishes per-channel sensor data to Home Assistant via MQTT Auto-Discovery. Currently supports AVM FRITZ!Box Cable routers.
44

55
## Features
66

@@ -10,13 +10,15 @@ Docker container that monitors DOCSIS channel health on AVM FRITZ!Box Cable rout
1010
- **Web UI**: Built-in dashboard on port 8765 with timeline navigation and light/dark mode
1111
- **Setup Wizard**: Browser-based configuration - no .env file needed
1212
- **Settings Page**: Change all settings at runtime, test connections, toggle themes
13+
- **Internationalization**: English and German UI
14+
- **LLM Export**: Generate structured reports for AI analysis
1315
- **MQTT Auto-Discovery**: Zero-config integration with Home Assistant
1416

1517
## Quick Start
1618

1719
```bash
18-
git clone https://github.com/dbraun-lab/fritzbox-docsis-monitor.git
19-
cd fritzbox-docsis-monitor
20+
git clone https://github.com/itsDNNS/docsight.git
21+
cd docsight
2022
docker compose up -d
2123
```
2224

@@ -30,7 +32,7 @@ Configuration is stored in `config.json` inside the Docker volume and persists a
3032

3133
1. Start the container - the setup wizard opens automatically
3234
2. Enter FritzBox URL, username, and password - test the connection
33-
3. Enter MQTT broker details - test the connection
35+
3. Optionally enter MQTT broker details - test the connection
3436
4. Set poll interval and history retention
3537
5. Done - monitoring starts immediately
3638

@@ -49,7 +51,7 @@ Copy `.env.example` to `.env` and edit:
4951
| `MQTT_PORT` | `1883` | MQTT broker port |
5052
| `MQTT_USER` | - | MQTT username (optional) |
5153
| `MQTT_PASSWORD` | - | MQTT password (optional) |
52-
| `MQTT_TOPIC_PREFIX` | `fritzbox/docsis` | MQTT topic prefix |
54+
| `MQTT_TOPIC_PREFIX` | `docsight` | MQTT topic prefix |
5355
| `POLL_INTERVAL` | `300` | Polling interval in seconds |
5456
| `WEB_PORT` | `8765` | Web UI port |
5557
| `HISTORY_DAYS` | `7` | Snapshot retention in days |
@@ -58,22 +60,22 @@ Copy `.env.example` to `.env` and edit:
5860

5961
### Per-Channel (~37 DS + 4 US)
6062

61-
- `sensor.docsis_ds_ch{id}` - State: Power (dBmV), Attributes: frequency, modulation, snr, errors, docsis_version, health
62-
- `sensor.docsis_us_ch{id}` - State: Power (dBmV), Attributes: frequency, modulation, multiplex, docsis_version, health
63+
- `sensor.docsight_ds_ch{id}` - State: Power (dBmV), Attributes: frequency, modulation, snr, errors, docsis_version, health
64+
- `sensor.docsight_us_ch{id}` - State: Power (dBmV), Attributes: frequency, modulation, multiplex, docsis_version, health
6365

6466
### Summary (14)
6567

6668
| Sensor | Unit | Description |
6769
|---|---|---|
68-
| `docsis_health` | - | Overall health (Gut/Grenzwertig/Schlecht) |
69-
| `docsis_health_details` | - | Detail text |
70-
| `docsis_ds_total` | - | Number of downstream channels |
71-
| `docsis_ds_power_min/max/avg` | dBmV | Downstream power range |
72-
| `docsis_ds_snr_min/avg` | dB | Downstream signal-to-noise |
73-
| `docsis_ds_correctable_errors` | - | Total correctable errors |
74-
| `docsis_ds_uncorrectable_errors` | - | Total uncorrectable errors |
75-
| `docsis_us_total` | - | Number of upstream channels |
76-
| `docsis_us_power_min/max/avg` | dBmV | Upstream power range |
70+
| `docsight_health` | - | Overall health (good/marginal/poor) |
71+
| `docsight_health_details` | - | Detail text |
72+
| `docsight_ds_total` | - | Number of downstream channels |
73+
| `docsight_ds_power_min/max/avg` | dBmV | Downstream power range |
74+
| `docsight_ds_snr_min/avg` | dB | Downstream signal-to-noise |
75+
| `docsight_ds_correctable_errors` | - | Total correctable errors |
76+
| `docsight_ds_uncorrectable_errors` | - | Total uncorrectable errors |
77+
| `docsight_us_total` | - | Number of upstream channels |
78+
| `docsight_us_power_min/max/avg` | dBmV | Upstream power range |
7779

7880
## Reference Values
7981

@@ -86,17 +88,17 @@ Copy `.env.example` to `.env` and edit:
8688
## Web UI
8789

8890
Access at `http://<host>:8765`. Auto-refreshes every 60 seconds. Shows:
89-
- Health status with color indicator
90-
- Summary metrics
91+
- Health status with actionable recommendations
92+
- Summary metrics and tariff info
9193
- Full downstream/upstream channel tables with per-row health indicators
92-
- Timeline navigation for historical snapshots
93-
- Reference value table
94+
- Trend charts (day/week/month)
95+
- Calendar navigation for historical snapshots
96+
- LLM export for AI-powered analysis
9497

9598
## Requirements
9699

97100
- AVM FRITZ!Box Cable router (tested with 6690 Cable)
98-
- MQTT broker (e.g., Mosquitto)
99-
- Home Assistant with MQTT integration
101+
- MQTT broker (e.g., Mosquitto) - optional, for Home Assistant integration
100102

101103
## License
102104

app/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"mqtt_port": 1883,
2424
"mqtt_user": "",
2525
"mqtt_password": "",
26-
"mqtt_topic_prefix": "fritzbox/docsis",
26+
"mqtt_topic_prefix": "docsight",
2727
"poll_interval": 300,
2828
"web_port": 8765,
2929
"history_days": 7,

app/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def main():
114114
data_dir = os.environ.get("DATA_DIR", "/data")
115115
config_mgr = ConfigManager(data_dir)
116116

117-
log.info("FritzBox DOCSIS Monitor starting")
117+
log.info("DOCSight starting")
118118

119119
# Initialize snapshot storage
120120
db_path = os.path.join(data_dir, "docsis_history.db")

app/mqtt_publisher.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def __init__(self, host, port=1883, user=None, password=None,
1919

2020
self.client = mqtt.Client(
2121
mqtt.CallbackAPIVersion.VERSION2,
22-
client_id="fritzbox-docsis-monitor",
22+
client_id="docsight",
2323
)
2424
if user:
2525
self.client.username_pw_set(user, password)
@@ -57,8 +57,8 @@ def disconnect(self):
5757
def publish_discovery(self, device_info=None):
5858
"""Publish HA MQTT Auto-Discovery for all sensors."""
5959
device = {
60-
"identifiers": ["fritzbox_docsis"],
61-
"name": "FritzBox DOCSIS",
60+
"identifiers": ["docsight"],
61+
"name": "DOCSight",
6262
"manufacturer": "AVM",
6363
"model": (device_info or {}).get("model", "FRITZ!Box"),
6464
}
@@ -68,28 +68,28 @@ def publish_discovery(self, device_info=None):
6868

6969
# --- Summary sensors ---
7070
summary_sensors = [
71-
("ds_total", "Downstream Kanaele", None, "mdi:arrow-down-bold"),
71+
("ds_total", "Downstream Channels", None, "mdi:arrow-down-bold"),
7272
("ds_power_min", "DS Power Min", "dBmV", "mdi:signal"),
7373
("ds_power_max", "DS Power Max", "dBmV", "mdi:signal"),
74-
("ds_power_avg", "DS Power Durchschnitt", "dBmV", "mdi:signal"),
74+
("ds_power_avg", "DS Power Avg", "dBmV", "mdi:signal"),
7575
("ds_snr_min", "DS SNR Min", "dB", "mdi:ear-hearing"),
76-
("ds_snr_avg", "DS SNR Durchschnitt", "dB", "mdi:ear-hearing"),
77-
("ds_correctable_errors", "DS Korrigierbare Fehler", None, "mdi:alert-circle-check"),
78-
("ds_uncorrectable_errors", "DS Nicht-korrigierbare Fehler", None, "mdi:alert-circle"),
79-
("us_total", "Upstream Kanaele", None, "mdi:arrow-up-bold"),
76+
("ds_snr_avg", "DS SNR Avg", "dB", "mdi:ear-hearing"),
77+
("ds_correctable_errors", "DS Correctable Errors", None, "mdi:alert-circle-check"),
78+
("ds_uncorrectable_errors", "DS Uncorrectable Errors", None, "mdi:alert-circle"),
79+
("us_total", "Upstream Channels", None, "mdi:arrow-up-bold"),
8080
("us_power_min", "US Power Min", "dBmV", "mdi:signal"),
8181
("us_power_max", "US Power Max", "dBmV", "mdi:signal"),
82-
("us_power_avg", "US Power Durchschnitt", "dBmV", "mdi:signal"),
83-
("health", "DOCSIS Gesundheit", None, "mdi:heart-pulse"),
82+
("us_power_avg", "US Power Avg", "dBmV", "mdi:signal"),
83+
("health", "DOCSIS Health", None, "mdi:heart-pulse"),
8484
("health_details", "DOCSIS Details", None, "mdi:information"),
8585
]
8686

8787
count = 0
8888
for key, name, unit, icon in summary_sensors:
89-
topic = f"{self.ha_prefix}/sensor/fritzbox_docsis/{key}/config"
89+
topic = f"{self.ha_prefix}/sensor/docsight/{key}/config"
9090
config = {
9191
"name": name,
92-
"unique_id": f"fritzbox_docsis_{key}",
92+
"unique_id": f"docsight_{key}",
9393
"state_topic": f"{self.topic_prefix}/{key}",
9494
"icon": icon,
9595
"device": device,
@@ -106,8 +106,8 @@ def publish_discovery(self, device_info=None):
106106
def publish_channel_discovery(self, ds_channels, us_channels, device_info=None):
107107
"""Publish HA MQTT Auto-Discovery for per-channel sensors."""
108108
device = {
109-
"identifiers": ["fritzbox_docsis"],
110-
"name": "FritzBox DOCSIS",
109+
"identifiers": ["docsight"],
110+
"name": "DOCSight",
111111
"manufacturer": "AVM",
112112
"model": (device_info or {}).get("model", "FRITZ!Box"),
113113
}
@@ -119,10 +119,10 @@ def publish_channel_discovery(self, ds_channels, us_channels, device_info=None):
119119
for ch in ds_channels:
120120
ch_id = ch["channel_id"]
121121
obj_id = f"ds_ch{ch_id}"
122-
topic = f"{self.ha_prefix}/sensor/fritzbox_docsis/{obj_id}/config"
122+
topic = f"{self.ha_prefix}/sensor/docsight/{obj_id}/config"
123123
config = {
124-
"name": f"DS Kanal {ch_id}",
125-
"unique_id": f"fritzbox_docsis_{obj_id}",
124+
"name": f"DS Channel {ch_id}",
125+
"unique_id": f"docsight_{obj_id}",
126126
"state_topic": f"{self.topic_prefix}/channel/{obj_id}",
127127
"value_template": "{{ value_json.power }}",
128128
"json_attributes_topic": f"{self.topic_prefix}/channel/{obj_id}",
@@ -137,10 +137,10 @@ def publish_channel_discovery(self, ds_channels, us_channels, device_info=None):
137137
for ch in us_channels:
138138
ch_id = ch["channel_id"]
139139
obj_id = f"us_ch{ch_id}"
140-
topic = f"{self.ha_prefix}/sensor/fritzbox_docsis/{obj_id}/config"
140+
topic = f"{self.ha_prefix}/sensor/docsight/{obj_id}/config"
141141
config = {
142-
"name": f"US Kanal {ch_id}",
143-
"unique_id": f"fritzbox_docsis_{obj_id}",
142+
"name": f"US Channel {ch_id}",
143+
"unique_id": f"docsight_{obj_id}",
144144
"state_topic": f"{self.topic_prefix}/channel/{obj_id}",
145145
"value_template": "{{ value_json.power }}",
146146
"json_attributes_topic": f"{self.topic_prefix}/channel/{obj_id}",

app/templates/index.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<head>
44
<meta charset="utf-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1">
6-
<title>FritzBox DOCSIS Monitor</title>
6+
<title>DOCSight</title>
77
<style>
88
:root, [data-theme="dark"] {
99
--bg: #1a1a2e;
@@ -341,7 +341,7 @@
341341
<!-- Sidebar -->
342342
<nav class="sidebar" id="sidebar">
343343
<div class="sidebar-header">
344-
<span>DOCSIS Monitor</span>
344+
<span>DOCSight</span>
345345
<button class="sidebar-toggle" id="sidebar-collapse" title="Collapse">&#10094;</button>
346346
</div>
347347
<div class="sidebar-content">
@@ -391,7 +391,7 @@
391391
<span class="date-label" id="date-label" title="{{ t.open_calendar }}">{{ t.live }}</span>
392392
<button id="date-next">&#8250;</button>
393393
</div>
394-
<span class="topbar-title">DOCSIS Monitor</span>
394+
<span class="topbar-title">DOCSight</span>
395395
<span class="topbar-meta" id="topbar-meta">
396396
{% if last_update %}{{ t.last_update }}: {{ last_update }} | {{ poll_interval }}s{% endif %}
397397
</span>

app/templates/settings.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<head>
44
<meta charset="utf-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1">
6-
<title>FritzBox DOCSIS Monitor - {{ t.settings }}</title>
6+
<title>DOCSight - {{ t.settings }}</title>
77
<style>
88
:root, [data-theme="dark"] {
99
--bg: #1a1a2e;

app/templates/setup.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<head>
44
<meta charset="utf-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1">
6-
<title>FritzBox DOCSIS Monitor - {{ t.initial_setup }}</title>
6+
<title>DOCSight - {{ t.initial_setup }}</title>
77
<style>
88
:root, [data-theme="dark"] {
99
--bg: #1a1a2e;
@@ -180,7 +180,7 @@
180180

181181
<div class="top-row">
182182
<div>
183-
<h1>FritzBox DOCSIS Monitor</h1>
183+
<h1>DOCSight</h1>
184184
<p class="subtitle">{{ t.initial_setup }}</p>
185185
</div>
186186
<select class="lang-select" onchange="location.href='?lang='+this.value">

app/web.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""Flask web UI for DOCSIS channel monitoring."""
1+
"""Flask web UI for DOCSight – DOCSIS channel monitoring."""
22

33
import logging
44
import time
@@ -280,10 +280,10 @@ def api_export():
280280
us_mbps = conn.get("max_upstream_kbps", 0) // 1000 if conn else 0
281281

282282
lines = [
283-
"# DOCSIS Cable Connection Status Report",
283+
"# DOCSight – DOCSIS Cable Connection Status Report",
284284
"",
285285
"## Context",
286-
"This is a status report from a DOCSIS cable modem (FritzBox Cable).",
286+
"This is a status report from a DOCSIS cable modem generated by DOCSight.",
287287
"DOCSIS (Data Over Cable Service Interface Specification) is the standard for internet over coaxial cable.",
288288
"Analyze this data and provide insights about connection health, problematic channels, and recommendations.",
289289
"",

0 commit comments

Comments
 (0)