Skip to content

Commit 279f6a8

Browse files
Dennis Braunclaude
andcommitted
Merge dev into main for v2026-02-11.19 release
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2 parents 6a1dbe0 + d135304 commit 279f6a8

File tree

17 files changed

+1319
-110
lines changed

17 files changed

+1319
-110
lines changed

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,22 @@ 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-11.19]
8+
9+
### Added
10+
- **Incident Report Export**: Two-step flow — editable ISP complaint letter with customer data fields + downloadable technical PDF report with channel tables, worst values, and DIN threshold references
11+
- **Report i18n**: Full PDF report localization in 4 languages (EN/DE/FR/ES) with locale-appropriate regulatory authorities (Bundesnetzagentur, ARCEP, etc.)
12+
- **Language selector in topbar**: Country flag dropdown (🇬🇧🇩🇪🇫🇷🇪🇸) for quick language switching
13+
- **BQM setup guide**: Sidebar link always visible; when not configured, opens modal with benefits and step-by-step setup instructions (DynDNS, WAN ping, ThinkBroadband registration)
14+
- **Bundled DejaVu fonts**: PDF generation works in Docker without host font dependencies
15+
16+
### Changed
17+
- **Settings moved to sidebar bottom**: Following common UI convention
18+
- **Report modal redesign**: Split into complaint letter (copyable text) + technical report (PDF attachment) for easier ISP communication
19+
20+
### Fixed
21+
- **BQM modal HTML rendering**: i18n strings with HTML tags now render correctly via Jinja2 safe filter
22+
723
## [2026-02-09.18]
824

925
### Added

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ DOCSight can optionally publish all channel data to Home Assistant via MQTT Auto
167167
- [ ] **Ingress/Return Path Scoring**: Composite score based on upstream power levels, modulation quality, and channel count to detect return path interference before total failure
168168

169169
### Diagnosis & Reporting
170-
- [ ] **Incident Report Export**: One-click PDF/report with worst modulation values, max power levels, error sums, and auto-generated ISP complaint text referencing DIN thresholds — ready to email to your ISP's tech support
170+
- [x] **Incident Report Export**: Two-step flow — editable ISP complaint letter with customer data fields + downloadable technical PDF with channel tables, worst values, and DIN threshold references (EN/DE/FR/ES)
171171
- [ ] **Ping Correlation**: Built-in latency monitor (ping to configurable targets) overlaid on error graphs to prove causality between physical layer issues and packet loss — replaces manual PingPlotter usage
172172
- [ ] **Before/After Comparison**: Side-by-side overlay of two time periods (e.g. week before vs. after technician visit) to quantify improvements
173173
- [ ] **FritzBox Event Log Parser**: Extract and display T3/T4 Timeout events, Ranging Request failures, and other DOCSIS error codes from the modem's event log

app/fonts/DejaVuSans-Bold.ttf

692 KB
Binary file not shown.

app/fonts/DejaVuSans-Oblique.ttf

623 KB
Binary file not shown.

app/fonts/DejaVuSans.ttf

742 KB
Binary file not shown.

app/i18n/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
_DIR = os.path.dirname(__file__)
77
_TRANSLATIONS = {}
88
LANGUAGES = {}
9+
LANG_FLAGS = {}
910

1011
# Load all *.json files in this directory
1112
for _fname in sorted(os.listdir(_DIR)):
@@ -17,6 +18,7 @@
1718
_meta = _data.pop("_meta", {})
1819
_TRANSLATIONS[_code] = _data
1920
LANGUAGES[_code] = _meta.get("language_name", _code)
21+
LANG_FLAGS[_code] = _meta.get("flag", "")
2022

2123

2224
def get_translations(lang="en"):

app/i18n/de.json

Lines changed: 55 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
{
2-
"_meta": { "language_name": "Deutsch" },
3-
2+
"_meta": {
3+
"language_name": "Deutsch",
4+
"flag": "🇩🇪"
5+
},
46
"nav": "Navigation",
57
"live_dashboard": "Live Dashboard",
68
"day_trend": "Tagesverlauf",
79
"week_trend": "Wochentrend",
810
"month_trend": "Monatstrend",
911
"settings": "Einstellungen",
1012
"reference_values": "Richtwerte",
11-
1213
"open_calendar": "Kalender oeffnen",
1314
"last_update": "Letztes Update",
14-
1515
"health_good": "Gut",
1616
"health_marginal": "Grenzwertig",
1717
"health_poor": "Schlecht",
@@ -22,7 +22,6 @@
2222
"health_poor_msg": "Ein oder mehrere Werte sind kritisch. Du koenntest Verbindungsprobleme wie langsame Geschwindigkeiten, Abbrueche oder hohe Latenz bemerken.",
2323
"all_ok": "Alle Kanaele arbeiten normal.",
2424
"issues_found": "Probleme erkannt",
25-
2625
"issue_ds_power_critical": "Downstream-Pegel ausserhalb der Spezifikation",
2726
"issue_ds_power_critical_desc": "Signalpegel ueberschreitet +/-10 dBmV. Das deutet meist auf ein Kabel- oder Verstaerkerproblem hin. Kontaktiere deinen Anbieter, wenn das Problem bestehen bleibt.",
2827
"issue_us_power_critical": "Upstream-Sendeleistung kritisch hoch",
@@ -35,19 +34,16 @@
3534
"issue_snr_warn_desc": "SNR zwischen 25-30 dB (ideal: ueber 30 dB). Verbindung funktioniert, hat aber weniger Fehlertoleranz. Pruefe die Kabelqualitaet.",
3635
"issue_uncorr_errors_high": "Hohe Anzahl unkorrigierbarer Fehler",
3736
"issue_uncorr_errors_high_desc": "Ueber 10.000 unkorrigierbare Fehler erkannt. Diese koennen nicht repariert werden und verursachen Datenverlust. Wenn diese Zahl schnell waechst, kontaktiere deinen Anbieter.",
38-
3937
"ch_power_critical": "Pegel kritisch ausserhalb des Bereichs",
4038
"ch_power_warning": "Pegel leicht erhoeht",
4139
"ch_snr_critical": "SNR kritisch niedrig",
4240
"ch_snr_warning": "SNR unter Idealwert",
43-
4441
"ds_channels": "Downstream Kanaele",
4542
"us_channels": "Upstream Kanaele",
4643
"ds_power_range": "DS Power (Min / Avg / Max)",
4744
"ds_snr_range": "DS SNR (Min / Avg)",
4845
"ds_errors_label": "DS Fehler (korr. / unkorr.)",
4946
"us_power_range": "US Power (Min / Avg / Max)",
50-
5147
"status": "Status",
5248
"channel": "Kanal",
5349
"frequency": "Frequenz",
@@ -60,18 +56,15 @@
6056
"channels": "Kanaele",
6157
"downstream": "Downstream",
6258
"upstream": "Upstream",
63-
6459
"metric": "Metrik",
6560
"good": "Gut",
6661
"marginal": "Grenz.",
6762
"poor": "Schlecht",
6863
"low": "niedrig",
69-
7064
"historical_view": "Historische Ansicht",
7165
"back_to_live": "Zurueck zu Live",
7266
"error_label": "Fehler",
7367
"waiting_msg": "Warte auf erste DOCSIS-Abfrage...",
74-
7568
"no_data": "Keine Daten fuer diesen Zeitraum vorhanden.",
7669
"trend_error": "Fehler beim Laden der Trenddaten.",
7770
"correctable": "Korrigierbar",
@@ -80,14 +73,24 @@
8073
"ds_power_avg": "DS Power Avg (dBmV)",
8174
"ds_snr_avg": "DS SNR Avg (dB)",
8275
"us_power_avg": "US Power Avg (dBmV)",
83-
8476
"live": "Live",
8577
"day": "Tag",
8678
"week": "Woche",
8779
"month": "Monat",
88-
"months": ["Januar", "Februar", "Maerz", "April", "Mai", "Juni",
89-
"Juli", "August", "September", "Oktober", "November", "Dezember"],
90-
80+
"months": [
81+
"Januar",
82+
"Februar",
83+
"Maerz",
84+
"April",
85+
"Mai",
86+
"Juni",
87+
"Juli",
88+
"August",
89+
"September",
90+
"Oktober",
91+
"November",
92+
"Dezember"
93+
],
9194
"initial_setup": "Ersteinrichtung",
9295
"modem_connection": "Modem-Verbindung",
9396
"modem_user_hint": "Tipp: Lege einen eigenen Benutzer fuer DOCSight an, anstatt deinen Haupt-Admin zu verwenden.",
@@ -118,7 +121,6 @@
118121
"unknown_error": "Unbekannt",
119122
"error_prefix": "Fehler",
120123
"default": "Standard",
121-
122124
"back_dashboard": "Zurueck zum Dashboard",
123125
"light_mode": "Light Mode",
124126
"dark_mode": "Dark Mode",
@@ -127,41 +129,45 @@
127129
"settings_saved": "Einstellungen gespeichert",
128130
"save_failed": "Speichern fehlgeschlagen",
129131
"saved_ph": "Gespeichert",
130-
131132
"language": "Sprache",
132-
133133
"isp_name": "Internetanbieter",
134134
"isp_hint": "Wird im LLM-Export angezeigt",
135135
"isp_other": "Andere",
136136
"isp_other_placeholder": "Anbietername eingeben",
137137
"isp_select": "Anbieter waehlen",
138-
"isp_options": ["Vodafone", "PYUR", "eazy", "O2", "1&1", "Telekom", "NetCologne", "M-net", "Wilhelm.tel"],
138+
"isp_options": [
139+
"Vodafone",
140+
"PYUR",
141+
"eazy",
142+
"O2",
143+
"1&1",
144+
"Telekom",
145+
"NetCologne",
146+
"M-net",
147+
"Wilhelm.tel"
148+
],
139149
"tariff": "Tarif",
140150
"max_downstream": "Max Downstream",
141151
"max_upstream": "Max Upstream",
142-
143152
"export_llm": "Export fuer LLM",
144153
"export_title": "LLM-Analyse Export",
145154
"export_hint": "Kopiere diesen Text und fuege ihn in dein bevorzugtes LLM (ChatGPT, Claude, Gemini, ...) ein, um Insights zu deiner Verbindung zu erhalten.",
146155
"copy_clipboard": "In Zwischenablage kopieren",
147156
"copied": "Kopiert!",
148157
"close": "Schliessen",
149158
"export_no_data": "Noch keine Daten vorhanden. Warte auf die erste Abfrage.",
150-
151159
"login_title": "Anmeldung",
152160
"login_hint": "Gib das Admin-Passwort ein, um auf DOCSight zuzugreifen.",
153161
"login_failed": "Falsches Passwort",
154162
"login_button": "Anmelden",
155163
"logout": "Abmelden",
156164
"admin_password": "Admin-Passwort",
157165
"admin_password_hint": "Leer lassen um Authentifizierung zu deaktivieren",
158-
159166
"bqm_title": "BQM-Graphen",
160167
"bqm_optional": "optional",
161168
"bqm_share_url": "BQM Share-URL",
162169
"bqm_url_hint": "ThinkBroadband BQM Share-Link einfuegen (.png)",
163170
"bqm_no_data": "Kein BQM-Graph fuer dieses Datum.",
164-
165171
"card_signal_quality": "Downstream",
166172
"card_upstream": "Upstream",
167173
"card_errors": "Fehler",
@@ -176,5 +182,29 @@
176182
"card_uncorr_exact": "Unkorrigierbar (exakt)",
177183
"card_corr_exact": "Korrigierbar (exakt)",
178184
"card_errors_note": "Unkorrigierbare Fehler koennen nicht wiederhergestellt werden. Hohe und steigende Werte deuten auf ein Kabelproblem hin.",
179-
"card_uptime": "Modem-Laufzeit"
180-
}
185+
"card_uptime": "Modem-Laufzeit",
186+
"incident_report": "Störungsbericht",
187+
"generate_report": "Bericht erstellen",
188+
"report_days": "Berichtszeitraum (Tage)",
189+
"report_description": "PDF-Bericht mit Signaldaten, Extremwerten und einem vorformulierten Beschwerdebrief an den Provider.",
190+
"bqm_setup_title": "Broadband Quality Monitor (BQM)",
191+
"bqm_setup_intro": "BQM von ThinkBroadband überwacht deine Verbindungsqualität, indem es deine öffentliche IP von externen Servern aus anpingt. DOCSight kann BQM-Graphen neben deinen Modemdaten anzeigen.",
192+
"bqm_setup_benefits_title": "Warum BQM nutzen?",
193+
"bqm_setup_benefit_1": "Unabhängiger Nachweis von Verbindungsproblemen (nicht nur modemseitig)",
194+
"bqm_setup_benefit_2": "Überwacht Latenz, Paketverlust und Durchsatz rund um die Uhr",
195+
"bqm_setup_benefit_3": "Stärkt ISP-Beschwerden mit Drittanbieter-Belegen",
196+
"bqm_setup_howto_title": "So richtest du es ein",
197+
"bqm_setup_step_1": "Richte <b>DynDNS</b> auf deinem Router ein (z.B. MyFRITZ! auf der Fritz!Box), damit BQM deine IP findet",
198+
"bqm_setup_step_2": "Aktiviere <b>WAN-Ping/ICMP</b> auf deinem Router, damit er auf externe Pings antwortet (Fritz!Box: Internet → Freigaben → \"Auf Ping reagieren\" aktivieren)",
199+
"bqm_setup_step_3": "Gehe zu <b>thinkbroadband.com/broadband/monitoring</b>, erstelle ein kostenloses Konto und registriere deine DynDNS-Adresse",
200+
"bqm_setup_step_4": "Sobald das Monitoring aktiv ist, kopiere deine <b>Share-URL</b> (endet auf .png) und füge sie in DOCSight unter <b>Einstellungen → BQM Share URL</b> ein",
201+
"report_language": "Berichtssprache",
202+
"report_customer_hint": "Optional: Deine Daten für das Beschwerdeschreiben",
203+
"report_name": "Dein Name",
204+
"report_customer_number": "Kunden-/Vertragsnummer",
205+
"report_address": "Deine Adresse",
206+
"report_edit_hint": "Prüfe und bearbeite das Beschwerdeschreiben. Kopiere es zum Versand per E-Mail oder lade den technischen Bericht als PDF-Anhang herunter.",
207+
"report_generate_letter": "Schreiben erstellen",
208+
"report_copy_letter": "Schreiben kopieren",
209+
"report_download_pdf": "Technischen Bericht (PDF) laden"
210+
}

0 commit comments

Comments
 (0)