iobroker.utility-monitor 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 fischi87 <axel.fischer@hotmail.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,384 @@
1
+ ![Logo](admin/utility-monitor.png)
2
+
3
+ # ioBroker.utility-monitor
4
+
5
+ [![NPM version](https://img.shields.io/npm/v/iobroker.utility-monitor.svg)](https://www.npmjs.com/package/iobroker.utility-monitor)
6
+ [![GitHub release](https://img.shields.io/github/v/release/fischi87/ioBroker.utility-monitor)](https://github.com/fischi87/ioBroker.utility-monitor/releases)
7
+ [![GitHub license](https://img.shields.io/github/license/fischi87/ioBroker.utility-monitor)](https://github.com/fischi87/ioBroker.utility-monitor/blob/main/LICENSE)
8
+ [![Test and Release](https://github.com/fischi87/ioBroker.utility-monitor/workflows/Test%20and%20Release/badge.svg)](https://github.com/fischi87/ioBroker.utility-monitor/actions)
9
+
10
+ ## Utility Monitor Adapter for ioBroker
11
+
12
+ Monitor gas, water, and electricity consumption with automatic cost calculation, advance payment monitoring, and detailed statistics.
13
+
14
+ ### ✨ Hauptfunktionen
15
+
16
+ - 📊 **Verbrauchsüberwachung** für Gas, Wasser, Strom und **PV/Einspeisung**
17
+ - 🎯 **Multi-Meter Support** - Mehrere Zähler pro Typ (z.B. Hauptzähler + Werkstatt)
18
+ - 💰 **Automatische Kostenberechnung** mit Arbeitspreis und Grundgebühr
19
+ - ☀️ **PV & Einspeisung** - Überwache deine Einspeisung und Vergütung
20
+ - 💳 **Abschlagsüberwachung** - Sehe sofort ob Nachzahlung oder Guthaben droht
21
+ - 🔄 **Flexible Sensoren** - Nutzt vorhandene Sensoren (Shelly, Tasmota, Homematic, etc.)
22
+ - ⚡ **HT/NT-Tarife** - Volle Unterstützung für Hoch- und Nebentarife (Tag/Nacht)
23
+ - 🔄 **Gas-Spezial** - Automatische Umrechnung von m³ in kWh
24
+ - 🕛 **Automatische Resets** - Täglich, monatlich und jährlich (Vertragsjubiläum)
25
+ - 🔔 **Intelligente Benachrichtigungen** - Getrennte Erinnerungen für Abrechnungsende (Zählerstand) und Vertragswechsel (Tarif-Check) mit einstellbaren Vorlaufzeiten
26
+ - ⌨️ **Komma-Support** - Admin UI akzeptiert `12,50` oder `12.50` für Dezimalzahlen
27
+
28
+ ---
29
+
30
+ ## 💝 Support
31
+
32
+ Gefällt dir dieser Adapter? Du kannst mich gerne mit einem Kaffee unterstützen! ☕
33
+
34
+ [![Donate](https://img.shields.io/badge/Donate-PayPal-blue.svg)](https://paypal.me/bigplay87)
35
+
36
+ ---
37
+
38
+ ## 🚀 Schnellstart
39
+
40
+ ### 1. Installation
41
+
42
+ 1. Adapter über die ioBroker Admin-Oberfläche installieren
43
+ 2. Instanz erstellen
44
+ 3. Konfiguration öffnen
45
+
46
+ ### 2. Grundkonfiguration (Beispiel: Gas)
47
+
48
+ 1. ✅ **Gas-Überwachung aktivieren**
49
+ 2. 🔍 **Sensor auswählen** - Deinen Gaszähler-Sensor (in m³)
50
+ 3. 📝 **Zählerstand bei Vertragsbeginn** - z.B. 10250 m³ (für korrekte Jahresberechnung)
51
+ 4. 📅 **Vertragsbeginn** - z.B. 01.01.2026 (für korrekten Jahresreset und Abschlagsberechnung)
52
+ 5. 🔧 **Offset** _(optional)_ - Falls dein Hardware-Zähler nicht bei 0 startet
53
+ 6. 🔥 **Brennwert & Z-Zahl** - Von deiner Gasrechnung (z.B. 11,5 und 0,95)
54
+ 7. 💶 **Preise eintragen**:
55
+ - Arbeitspreis: 0,1835 €/kWh
56
+ - Grundgebühr: 15,03 €/Monat
57
+ - Jahresgebühr: 60,00 €/Jahr (z.B. Zählermiete)
58
+ 8. 💳 **Abschlag** - Monatliche Vorauszahlung (z.B. 150 €)
59
+
60
+ **Fertig!** Der Adapter berechnet nun automatisch alle Kosten! 🎉
61
+
62
+ ---
63
+
64
+ ## 📊 Datenpunkte erklärt
65
+
66
+ Für jede aktivierte Verbrauchsart (Gas/Wasser/Strom/PV) werden folgende Ordner angelegt:
67
+
68
+ ### 🗂️ **consumption** (Verbrauch)
69
+
70
+ | Datenpunkt | Beschreibung | Beispiel |
71
+ | --------------- | ----------------------------------------------------- | ---------------- |
72
+ | `daily` | Verbrauch **heute** (seit 00:00 Uhr) | 12,02 kWh |
73
+ | `dailyVolume` | Verbrauch heute in m³ | 1,092 m³ |
74
+ | `monthly` | Verbrauch **diesen Monat** (seit 1. des Monats) | 117,77 kWh |
75
+ | `monthlyVolume` | Monatlicher Verbrauch in m³ | 10,69 m³ |
76
+ | `yearly` | Verbrauch **seit Vertragsbeginn** (this billing year) | 730,01 kWh |
77
+ | `yearlyVolume` | Jahresverbrauch in m³ | 66,82 m³ |
78
+ | `dailyHT` | Tagesverbrauch im **Haupttarif** (HT) | 8,40 kWh |
79
+ | `dailyNT` | Tagesverbrauch im **Nebentarif** (NT) | 3,62 kWh |
80
+ | `monthlyHT` | Monatsverbrauch im HT | 82,15 kWh |
81
+ | `monthlyNT` | Monatsverbrauch im NT | 35,62 kWh |
82
+ | `yearlyHT` | Jahresverbrauch im HT | 511,00 kWh |
83
+ | `yearlyNT` | Jahresverbrauch im NT | 219,01 kWh |
84
+ | `lastUpdate` | Letzte Aktualisierung | 06.01.2026 14:11 |
85
+
86
+ **💡 Tipp:** `yearly` wird automatisch als `(Aktueller Zählerstand - Offset) - Initial Reading` berechnet!
87
+
88
+ **📅 Wichtig:** Der Jahresreset erfolgt am **Vertragsbeginn-Datum** (z.B. 12. Mai), NICHT am 1. Januar!
89
+
90
+ ---
91
+
92
+ ### 💰 **costs** (Kosten)
93
+
94
+ | Datenpunkt | Was ist das? | Berechnung | Beispiel |
95
+ | ------------- | ------------------------------------------------------------- | ------------------------------------------ | ------------------------------ |
96
+ | `daily` | Kosten **heute** | daily × Arbeitspreis | 2,27 € |
97
+ | `monthly` | Kosten **diesen Monat** | monthly × Arbeitspreis | 21,61 € |
98
+ | `yearly` | **Verbrauchskosten** seit Vertragsbeginn | yearly × Arbeitspreis | 137,61 € |
99
+ | `totalYearly` | **Gesamtkosten Jahr** (Verbrauch + alle Fixkosten) | yearly-cost + basicCharge + annualFee | 162,64 € |
100
+ | `basicCharge` | **Grundgebühr akkumuliert** (inkl. Jahresgebühr anteilig) | (Grundgebühr + (Jahresgebühr/12)) × Monate | 19,20 € |
101
+ | `annualFee` | **Jahresgebühr akkumuliert** | (Jahresgebühr / 12) × Monate | 4,17 € |
102
+ | `paidTotal` | **Bezahlt** via Abschlag | Abschlag × Monate | 150,00 € |
103
+ | `balance` | **🎯 WICHTIGSTER Wert!**<br>Nachzahlung (+) oder Guthaben (-) | totalYearly - paidTotal | **+12,64 €**<br>→ Nachzahlung! |
104
+
105
+ #### 🔍 **balance** genauer erklärt:
106
+
107
+ - **Positiv (+50 €)** → ❌ **Nachzahlung**: Du musst am Jahresende zahlen
108
+ - **Negativ (-24 €)** → ✅ **Guthaben**: Du bekommst Geld zurück
109
+ - **Null (0 €)** → ⚖️ **Ausgeglichen**: Verbrauch = Abschlag
110
+
111
+ **Beispiel:**
112
+
113
+ ```
114
+ Verbrauchskosten: 137,61 € (yearly)
115
+ Grundgebühr: + 15,03 € (basicCharge)
116
+ ────────────────────────────
117
+ Gesamtkosten: 152,64 €
118
+
119
+ Bezahlt (Abschlag): 150,00 € (paidTotal)
120
+ ────────────────────────────
121
+ Balance: +2,64 € → Nachzahlung
122
+ ```
123
+
124
+ ---
125
+
126
+ ### ℹ️ **info** (Informationen)
127
+
128
+ | Datenpunkt | Beschreibung | Beispiel |
129
+ | -------------------- | ---------------------------- | ---------------- |
130
+ | `currentPrice` | Aktueller Arbeitspreis | 0,1885 €/kWh |
131
+ | `meterReading` | Zählerstand in kWh | 112711,26 kWh |
132
+ | `meterReadingVolume` | Zählerstand in m³ (nur Gas) | 10305,03 m³ |
133
+ | `lastSync` | Letzte Sensor-Aktualisierung | 06.01.2026 14:11 |
134
+ | `sensorActive` | Sensor verbunden? | ✅ true |
135
+
136
+ ---
137
+
138
+ ### 📈 **statistics** (Statistiken)
139
+
140
+ | Datenpunkt | Beschreibung |
141
+ | ---------------- | ------------------------------------ |
142
+ | `averageDaily` | Durchschnittlicher Tagesverbrauch |
143
+ | `averageMonthly` | Durchschnittlicher Monatsverbrauch |
144
+ | `lastDayStart` | Letzter Tages-Reset (00:00 Uhr) |
145
+ | `lastMonthStart` | Letzter Monats-Reset (1. des Monats) |
146
+ | `lastYearStart` | Vertragsbeginn / Jahresstart |
147
+
148
+ ---
149
+
150
+ ### 📅 **billing** (Abrechnungszeitraum)
151
+
152
+ | Datenpunkt | Beschreibung | Beispiel |
153
+ | ------------------- | ---------------------------------------- | ----------- |
154
+ | `endReading` | Endzählerstand (manuell eintragen) | 10316.82 m³ |
155
+ | `closePeriod` | Zeitraum jetzt abschließen (Button) | true/false |
156
+ | `periodEnd` | Abrechnungszeitraum endet am | 01.01.2027 |
157
+ | `daysRemaining` | Tage bis Abrechnungsende | 359 Tage |
158
+ | `newInitialReading` | Neuer Startwert (für Config übernehmen!) | 10316.82 m³ |
159
+
160
+ **💡 Workflow am Jahresende:**
161
+
162
+ 1. Physischen Zähler ablesen (z.B. 10316.82 m³)
163
+ 2. Wert in `endReading` eintragen
164
+ 3. `closePeriod` auf `true` setzen
165
+ 4. ✅ Adapter archiviert automatisch alle Daten in `history.{JAHR}.*`
166
+ 5. ⚠️ **Wichtig:** Config aktualisieren mit neuem `initialReading` (siehe `newInitialReading`)
167
+
168
+ ---
169
+
170
+ ### 📊 **history** (Jahres-Historie)
171
+
172
+ | Datenpunkt | Beschreibung | Beispiel |
173
+ | --------------------------- | --------------------------------------- | ---------- |
174
+ | `history.2024.yearly` | Jahresverbrauch 2024 | 730.01 kWh |
175
+ | `history.2024.yearlyVolume` | Jahresverbrauch 2024 in m³ (Gas/Wasser) | 66.82 m³ |
176
+ | `history.2024.totalYearly` | Gesamtkosten 2024 | 162.64 € |
177
+ | `history.2024.balance` | Bilanz 2024 (Nachzahlung/Guthaben) | +12.64 € |
178
+
179
+ **💡 Automatische Archivierung:**
180
+
181
+ - Wird beim Abschluss des Abrechnungszeitraums erstellt
182
+ - Speichert alle wichtigen Jahreshöchstwerte inkl. HT/NT
183
+ - Ermöglicht Jahresvergleiche
184
+
185
+ ---
186
+
187
+ ### 🔧 **adjustment** (Manuelle Anpassung)
188
+
189
+ Korrigiere Sensor-Abdrift durch manuelle Anpassung.
190
+
191
+ | Datenpunkt | Beschreibung | Beispiel |
192
+ | ---------- | ------------------------------------ | --------- |
193
+ | `value` | Korrekturwert (Differenz zum Zähler) | +4.2 m³ |
194
+ | `note` | Notiz/Grund für Anpassung (optional) | "Ausfall" |
195
+ | `applied` | Zeitstempel der letzten Anwendung | 17035... |
196
+
197
+ **💡 Workflow:**
198
+
199
+ 1. Physischen Zähler ablesen: **10350 m³**
200
+ 2. Adapter zeigt: **10346 m³**
201
+ 3. Differenz in `adjustment.value` eintragen: **+4**
202
+ 4. ✅ Alle Berechnungen werden automatisch korrigiert.
203
+ 5. **Dank der HT/NT-Integration** werden Anpassungen bei HT/NT-Tarifen automatisch dem Haupttarif (HT) angerechnet.
204
+
205
+ ---
206
+
207
+ ## ⚙️ Spezialfunktionen
208
+
209
+ ### ⚡ Gas: m³ → kWh Umrechnung
210
+
211
+ Gasverbrauch wird in **m³ gemessen**, aber in **kWh abgerechnet**.
212
+
213
+ **Formel:** `kWh = m³ × Brennwert × Z-Zahl`
214
+
215
+ 💡 **Tipp:** Brennwert und Z-Zahl findest du auf deiner Gasrechnung!
216
+
217
+ ### 🔄 Automatische Resets
218
+
219
+ Der Adapter setzt Zähler automatisch zurück:
220
+
221
+ | Zeitpunkt | Was passiert | Beispiel |
222
+ | --------------------- | ------------- | ------------------- |
223
+ | **00:00 Uhr** täglich | `daily` → 0 | Neuer Tag beginnt |
224
+ | **1. des Monats** | `monthly` → 0 | Neuer Monat beginnt |
225
+ | **Vertragsjubiläum** | `yearly` → 0 | Abrechnungsjahr neu |
226
+
227
+ ---
228
+
229
+ ## Changelog
230
+
231
+ ### **WORK IN PROGRESS**
232
+
233
+ ### 1.4.2 (2026-01-18)
234
+
235
+ - **FIX:** 🔧 **TypeScript Errors Resolved** - All TypeScript compilation errors fixed:
236
+ - Fixed `formatDateString()` missing argument in multiMeterManager
237
+ - Fixed Date arithmetic type errors (explicit timestamp conversion)
238
+ - Added `@ts-ignore` comments for intentional error tests
239
+ - **FIX:** 🐛 **Critical Multi-Meter Balance Bug** - Fixed incorrect balance calculation:
240
+ - `totalYearly` was using hardcoded 12 months for `basicCharge` instead of actual months since contract start
241
+ - Now correctly calculates `basicChargeAccumulated = grundgebuehr × monthsSinceYearStart`
242
+ - Fixes incorrect high balance values for users with mid-year contract start dates
243
+ - **NEW:** ✅ **Enhanced Input Validation** - Robust validation for configuration values:
244
+ - `isValidSensorDP()` - Validates sensor datapoint IDs
245
+ - `parseConfigDate()` - Validates German and ISO date formats
246
+ - `parseConfigPrice()` - Ensures prices are non-negative
247
+ - **NEW:** 📋 **Extended Constants** - Centralized constant definitions:
248
+ - Rounding precision, time constants, validation constraints
249
+ - Better maintainability and consistency across modules
250
+ - **NEW:** 🛡️ **Error Handling** - Safe wrapper for state creation:
251
+ - `safeSetObjectNotExists()` catches and logs state creation failures
252
+ - Prevents silent failures in StateManager
253
+ - **IMPROVED:** 🧪 **Code Quality** - All tests passing (31 unit + 57 package tests)
254
+
255
+ ### 1.4.1 (2026-01-18)
256
+
257
+ - **FIX:** 🐛 **Multi-Meter Critical Bugs** - Comprehensive fixes for multi-meter functionality:
258
+ - Fixed `updateCosts()` to correctly delegate to multiMeterManager for all meters
259
+ - Fixed `closeBillingPeriod()` to archive totals instead of only main meter values
260
+ - Fixed `checkMonthlyReport()` to display totals in reports for multi-meter setups
261
+ - Fixed state type mismatch: `lastDayStart`, `lastMonthStart`, `lastYearStart` now use number (timestamp) instead of string
262
+ - **NEW:** 🎯 **Per-Meter Billing Closure** - Each meter can now be closed individually with its own `billing.closePeriod` button
263
+ - Main meter: `gas.billing.closePeriod`
264
+ - Additional meters: `gas.erdgeschoss.billing.closePeriod`, `gas.keller.billing.closePeriod`, etc.
265
+ - Each meter uses its own contract date for yearly resets
266
+ - **NEW:** 📅 **Individual Contract Anniversary Resets** - Each meter resets on its own contract date
267
+ - Primary: Manual `closePeriod` triggers yearly reset immediately
268
+ - Fallback: Automatic reset on contract anniversary if user forgets to close period
269
+ - Contract date is preserved when closing period early (no drift)
270
+ - **IMPROVED:** 💰 **Billing Period Closure** - No longer resets `basicCharge` and `annualFee` to zero
271
+ - These values now persist from config (user must update config if tariff changes)
272
+ - Helpful reminder message added after closing period
273
+ - **FIX:** 🤖 **ioBroker Bot Compliance** - All bot checker issues resolved:
274
+ - Removed non-existent version 1.3.4 from news
275
+ - Added complete translations for all news entries (9 languages)
276
+ - Removed `.npmignore` file (using `files` field in package.json)
277
+ - DevDependencies already use `~` syntax (compliant)
278
+
279
+ ### 1.4.0 (2026-01-17)
280
+
281
+ - **NEW:** 🎉 **Multi-Meter Support** - Verwende mehrere Zähler pro Typ (z.B. Gas Hauptzähler + Werkstatt-Zähler)
282
+ - Beliebig viele zusätzliche Zähler mit eigenen Namen konfigurierbar
283
+ - Separate Kostenberechnung und Statistiken pro Zähler
284
+ - Automatische Totals-Berechnung über alle Zähler
285
+ - **NEW:** ✨ **Komma-Dezimaltrenner Support** - Admin UI akzeptiert jetzt sowohl Komma als auch Punkt (z.B. `12,50` oder `12.50`)
286
+ - **NEW:** 📊 **Pro-Meter Billing** - Jeder Zähler hat eigene `billing.daysRemaining` und `billing.periodEnd` Werte
287
+ - **NEW:** 🔧 **Config-Parser** - Automatische Konvertierung von String→Number mit Komma-Support
288
+ - **FIX:** 💰 **Balance-Berechnung korrigiert** - Nutzt jetzt begonnene Monate statt volle Monate (17 Tage = 1 Monat gezahlt)
289
+ - **FIX:** 🐛 **String-Type Fehler** behoben - Config-Werte werden korrekt als Numbers verarbeitet
290
+ - **IMPROVED:** 🔍 **Debug-Logging** - Hilfreiche Debug-Logs für Troubleshooting (nur in Debug-Modus sichtbar)
291
+ - **CLEANUP:** 🧹 Repository aufgeräumt - Alte Backup-Dateien und temporäre Scripts entfernt
292
+
293
+ ### 1.3.5 (2026-01-11)
294
+
295
+ - **NEW:** **Monatlicher Status-Bericht** - Optionaler monatlicher Bericht per Benachrichtigung.
296
+ - **NEW:** Datenpunkte `statistics.lastDay` (Verbrauch gestern) für alle Typen und `lastDayVolume` (Gas) hinzugefügt.
297
+ - **FIX:** **PV-Reset Bug** behoben (Tages- und Monatswerte wurden nicht zurückgesetzt).
298
+ - **FIX:** Schema-Validierung für Preisfelder korrigiert (Fix für Kommastellen).
299
+ - **FIX:** HT/NT-Anzeige korrigiert.
300
+ - **IMPROVED:** **Admin-UI Info-Tab** komplett optimiert (Sauberes Markdown & Layout).
301
+ - **IMPROVED:** Einheitliche Rundung berechneter Werte auf **2 Nachkommastellen** (daily, monthly, yearly).
302
+ - **ROBUSTNESS:** ioBroker Bot Compliance Check (Grid-Attribute in Admin-UI vereinheitlicht).
303
+
304
+ ### 1.3.4 (2026-01-10)
305
+
306
+ - **FIX:** Kritischer Fix: Kommastellen für Gebühren-Felder (Grundgebühr, Arbeitspreis) werden nun korrekt gespeichert (Erlaubt 4 Nachkommastellen).
307
+
308
+ ### 1.3.3 (2026-01-09)
309
+
310
+ - **IMPROVED:** Konfigurations-Reihenfolge optimiert (Gebühren logisch gruppiert).
311
+ - **NEW:** **PV-Benachrichtigungen** - Erhalte Erinnerungen auch für deine PV-Anlage (Abrechnung/Vertrag).
312
+
313
+ ### 1.3.2 (2026-01-09)
314
+
315
+ - **NEW:** **PV / Einspeise-Unterstützung** ☀️ - Neuer Tab für Photovoltaik:
316
+ - Überwache deine Netzeinspeisung (kWh).
317
+ - Berechne deine Vergütung (Earnings) automatisch.
318
+ - Volle Unterstützung für Zählerstände, Abrechnungszeiträume und Historie.
319
+
320
+ ### 1.3.1 (2026-01-09)
321
+
322
+ - **FIX:** Kritischer Fehler behoben: HT/NT-Datenpunkte wurden aufgrund eines internen Namensfehlers (electricity vs. strom) nicht angelegt.
323
+ - **FIX:** Warnungen im Log "State ... has no existing object" beseitigt.
324
+
325
+ ### 1.3.0 (2026-01-09)
326
+
327
+ - **NEW:** **Differenzierte Benachrichtigungen** - Zwei getrennte Erinnerungstypen:
328
+ - **Abrechnungsende**: Erinnerung zum Zählerstand ablesen (z.B. 7 Tage vorher).
329
+ - **Vertragswechsel**: Erinnerung zum Tarif-Check / Kündigen (z.B. 60 Tage vorher).
330
+ - **NEW:** **Interaktives Benachrichtigungs-Feedback** - Der Test-Button zeigt nun direkt Erfolgs- oder Fehlermeldungen via Popup an (inkl. SMTP-Fehler vom Email-Adapter).
331
+ - **NEW:** **Live-Test ohne Speichern** - Benachrichtigungen können jetzt sofort getestet werden, ohne die Konfiguration vorher speichern zu müssen.
332
+ - **NEW:** **Modularer Code-Aufbau** - Umstellung auf eine moderne Architektur mit spezialisierten Managern für bessere Performance und Wartbarkeit.
333
+ - **IMPROVED:** **Responsives Admin-UI** - Kompakteres Button-Design und optimierte Darstellung auf mobilen Geräten.
334
+ - **FIX:** Redundante Volumen-Datenpunkte (`dailyVolume` etc.) für Strom und Wasser entfernt, um Log-Warnungen zu vermeiden.
335
+ - **FIX:** Mandatory bot requirements (Changelog header, News cleanup).
336
+
337
+ ### 1.2.7 (2026-01-08)
338
+
339
+ - **NEW:** Universelles Benachrichtigungssystem für Abrechnungszeitraum-Erinnerungen (Telegram, Pushover, Email, etc.)
340
+ - **NEW:** Optionale PayPal-Unterstützung (Links in README und Config)
341
+ - **FIX:** Dezimalstellen für Tagesverbrauch auf 3 erhöht (bessere Unterstützung für Sensoren mit kleinen Deltas wie Shelly)
342
+ - **FIX:** Erlauben von leeren Preisen/Gebühren in der Konfiguration (verhindert Speicher-Fehler)
343
+
344
+ ### 1.2.6 (2026-01-08)
345
+
346
+ - **FIX:** Erlaube leere Felder für Grundgebühr/Jahresgebühr/Abschlag in der Konfiguration (verhindert Speicher-Block im Admin-UI)
347
+
348
+ ### 1.2.5 (2026-01-08)
349
+
350
+ - **NEW:** Transparente Anzeige des Vertragsbeginns bei jedem Adapter-Start im Log
351
+ - **NEW:** Unterstützung für zusätzliche **Jahresgebühren** (z.B. Zählermiete)
352
+ - **NEW:** Datenpunkt `costs.totalYearly` für die echten Gesamtkosten
353
+ - **FIX:** Kritischer Fehler in der Verbrauchs-Delta-Berechnung behoben (v1.2.4)
354
+ - **FIX:** Arbeitspreis-Anzeige bei Strom korrigiert
355
+ - **FIX:** Gas m³ → kWh Umrechnung für Anpassungswerte
356
+ - **FIX:** Korrekte Initialisierung des Vertragsjahres bei Neustart
357
+ - **FIX:** Vereinheitlichung der Konfigurationsschlüssel (`wasserInitialReading`)
358
+ - **ROBUSTNESS:** Schutz vor Datenverlust bei Adapter-Neustart (Zählerstand-Persistierung)
359
+ - **ROBUSTNESS:** Integration von manuellen Anpassungen in die HT/NT-Kostenrechnung
360
+ - **NEW:** Volle Unterstützung für **HT/NT-Tarife** für alle Energieträger (Strom, Gas, Wasser)
361
+ - **NEW:** Automatische Archivierung von HT/NT-Verbräuchen und Kosten in der Historie
362
+ - **DOCS:** Internationalisierung von Titel und Beschreibung
363
+
364
+ ### 1.2.2 (2026-01-08)
365
+
366
+ - **NEW:** Manuelle Anpassung für Sensor-Abdrift-Korrektur
367
+ - **NEW:** Abrechnungszeitraum-Management mit automatischer Archivierung
368
+ - **NEW:** Unterstützung für zusätzliche **Jahresgebühren** (z.B. Zählermiete)
369
+ - **NEW:** Datenpunkt `costs.totalYearly` für die echten Gesamtkosten
370
+ - **FIX:** Arbeitspreis-Anzeige bei Strom korrigiert
371
+ - **FIX:** Gas m³ → kWh Umrechnung für Anpassungswerte
372
+ - **DOCS:** Internationalisierung von Titel und Beschreibung
373
+
374
+ ---
375
+
376
+ - Initial release
377
+
378
+ ---
379
+
380
+ ## License
381
+
382
+ MIT License
383
+
384
+ Copyright (c) 2026 fischi87 <axel.fischer@hotmail.com>
@@ -0,0 +1,5 @@
1
+ {
2
+ "nebenkosten-monitor adapter settings": "Adaptereinstellungen für nebenkosten-monitor",
3
+ "option1": "Option1",
4
+ "option2": "Option2"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "nebenkosten-monitor adapter settings": "Adapter settings for nebenkosten-monitor",
3
+ "option1": "option1",
4
+ "option2": "option2"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "nebenkosten-monitor adapter settings": "Ajustes del adaptador para nebenkosten-monitor",
3
+ "option1": "opción1",
4
+ "option2": "opción2"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "nebenkosten-monitor adapter settings": "Paramètres d'adaptateur pour nebenkosten-monitor",
3
+ "option1": "option1",
4
+ "option2": "option2"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "nebenkosten-monitor adapter settings": "Impostazioni dell'adattatore per nebenkosten-monitor",
3
+ "option1": "opzione1",
4
+ "option2": "opzione2"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "nebenkosten-monitor adapter settings": "Adapterinstellingen voor nebenkosten-monitor",
3
+ "option1": "optie1",
4
+ "option2": "optie2"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "nebenkosten-monitor adapter settings": "Ustawienia adaptera dla nebenkosten-monitor",
3
+ "option1": "opcja 1",
4
+ "option2": "opcja 2"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "nebenkosten-monitor adapter settings": "Configurações do adaptador para nebenkosten-monitor",
3
+ "option1": "opção1",
4
+ "option2": "opção2"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "nebenkosten-monitor adapter settings": "Настройки адаптера для nebenkosten-monitor",
3
+ "option1": "вариант 1",
4
+ "option2": "вариант 2"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "nebenkosten-monitor adapter settings": "Налаштування адаптера для nebenkosten-monitor",
3
+ "option1": "варіант1",
4
+ "option2": "варіант2"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "nebenkosten-monitor adapter settings": "nebenkosten-monitor的适配器设置",
3
+ "option1": "选项1",
4
+ "option2": "选项2"
5
+ }