iobroker.utility-monitor 1.4.4 → 1.4.6

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/README.md CHANGED
@@ -61,10 +61,55 @@ Gefällt dir dieser Adapter? Du kannst mich gerne mit einem Kaffee unterstützen
61
61
 
62
62
  ---
63
63
 
64
+ ## ⚠️ Breaking Changes in Version 1.4.6
65
+
66
+ **WICHTIG:** Version 1.4.6 ändert die State-Struktur grundlegend!
67
+
68
+ ### Was hat sich geändert?
69
+
70
+ **Vorher (bis 1.4.5):**
71
+ ```
72
+ gas.consumption.daily
73
+ gas.costs.monthly
74
+ wasser.consumption.daily
75
+ ```
76
+
77
+ **Jetzt (ab 1.4.6):**
78
+ ```
79
+ gas.main.consumption.daily ← Hauptzähler mit Namen "main"
80
+ gas.main.costs.monthly
81
+ wasser.main.consumption.daily
82
+ ```
83
+
84
+ ### 🔧 Migration erforderlich
85
+
86
+ 1. **Config öffnen**: Neue Felder "Name des Hauptzählers" für Gas/Wasser/Strom/PV
87
+ 2. **Namen eingeben**: Standard ist "main" (empfohlen), oder eigener Name wie "wohnung", "haus"
88
+ 3. **Skripte anpassen**: Alle Verweise auf States müssen angepasst werden
89
+ ```javascript
90
+ // Alt:
91
+ getState('utility-monitor.0.gas.consumption.daily')
92
+
93
+ // Neu:
94
+ getState('utility-monitor.0.gas.main.consumption.daily')
95
+ ```
96
+ 4. **Visualisierungen updaten**: VIS, Grafana, etc. auf neue Pfade anpassen
97
+
98
+ ### 💡 Warum diese Änderung?
99
+
100
+ - **Konsistenz**: Alle Zähler (Haupt + Zusätzlich) verwenden jetzt die gleiche Struktur
101
+ - **Flexibilität**: Hauptzähler kann jetzt frei benannt werden (z.B. "erdgeschoss", "gesamt")
102
+ - **Klarheit**: Keine Special-Case Logik mehr im Code
103
+ - **Multi-Meter**: Bessere Unterstützung für mehrere Zähler pro Typ
104
+
105
+ ---
106
+
64
107
  ## 📊 Datenpunkte erklärt
65
108
 
66
109
  Für jede aktivierte Verbrauchsart (Gas/Wasser/Strom/PV) werden folgende Ordner angelegt:
67
110
 
111
+ **Wichtig:** Seit Version 1.4.6 beinhalten alle Pfade den Zähler-Namen (z.B. `gas.main.*` statt `gas.*`)
112
+
68
113
  ### 🗂️ **consumption** (Verbrauch)
69
114
 
70
115
  | Datenpunkt | Beschreibung | Beispiel |
@@ -96,11 +141,11 @@ Für jede aktivierte Verbrauchsart (Gas/Wasser/Strom/PV) werden folgende Ordner
96
141
  | `daily` | Kosten **heute** | daily × Arbeitspreis | 2,27 € |
97
142
  | `monthly` | Kosten **diesen Monat** | monthly × Arbeitspreis | 21,61 € |
98
143
  | `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 |
144
+ | `totalYearly` | **Gesamtkosten Jahr** (Verbrauch + alle Fixkosten) | yearly-cost + basicCharge + annualFee | 212,64 € |
145
+ | `basicCharge` | **Grundgebühr akkumuliert** | Grundgebühr × Monate | 15,03 € |
146
+ | `annualFee` | **Jahresgebühr** (fester Wert pro Jahr) | Jahresgebühr (aus Config) | 60,00 |
102
147
  | `paidTotal` | **Bezahlt** via Abschlag | Abschlag × Monate | 150,00 € |
103
- | `balance` | **🎯 WICHTIGSTER Wert!**<br>Nachzahlung (+) oder Guthaben (-) | totalYearly - paidTotal | **+12,64 €**<br>→ Nachzahlung! |
148
+ | `balance` | **🎯 WICHTIGSTER Wert!**<br>Nachzahlung (+) oder Guthaben (-) | totalYearly - paidTotal | **+62,64 €**<br>→ Nachzahlung! |
104
149
 
105
150
  #### 🔍 **balance** genauer erklärt:
106
151
 
@@ -112,13 +157,14 @@ Für jede aktivierte Verbrauchsart (Gas/Wasser/Strom/PV) werden folgende Ordner
112
157
 
113
158
  ```
114
159
  Verbrauchskosten: 137,61 € (yearly)
115
- Grundgebühr: + 15,03 € (basicCharge)
160
+ Grundgebühr: + 15,03 € (basicCharge - 1 Monat × 15,03€)
161
+ Jahresgebühr: + 60,00 € (annualFee - fester Wert)
116
162
  ────────────────────────────
117
- Gesamtkosten: 152,64 €
163
+ Gesamtkosten: 212,64 € (totalYearly)
118
164
 
119
- Bezahlt (Abschlag): 150,00 € (paidTotal)
165
+ Bezahlt (Abschlag): 150,00 € (paidTotal - 1 Monat × 150€)
120
166
  ────────────────────────────
121
- Balance: +2,64 € → Nachzahlung
167
+ Balance: +62,64 € → Nachzahlung
122
168
  ```
123
169
 
124
170
  ---
@@ -228,23 +274,47 @@ Der Adapter setzt Zähler automatisch zurück:
228
274
 
229
275
  ## Changelog
230
276
 
231
- ### **WORK IN PROGRESS**
232
-
233
- ### 1.4.4 (2026-01-18)
234
-
235
- - **FIX:** 🐛 **lastYearStart Recalculation Bug** - Fixed incorrect month count in paidTotal:
236
- - `lastYearStart` is now always recalculated from `contractStart` on adapter initialization
237
- - Fixes cases where `lastYearStart` was set incorrectly (e.g., 01.01.2026 instead of contract date)
238
- - Ensures `monthsSinceYearStart` is always calculated correctly based on actual contract date
239
- - Resolves issue where `paidTotal` showed only 1 month payment instead of correct accumulated amount
240
-
241
- ### 1.4.3 (2026-01-18)
242
-
243
- - **FIX:** 🐛 **Critical paidTotal Calculation Bug** - Fixed incorrect paidTotal after sensor updates:
244
- - `paidTotal` was stored as string instead of timestamp, causing parsing errors in `updateCosts()`
245
- - Changed `lastYearStart`, `lastMonthStart`, `lastDayStart` to store timestamps (number) instead of formatted strings
246
- - Now correctly calculates `paidTotal = monthlyPayment × monthsSinceYearStart` for both adapter restart and sensor updates
247
- - Backward compatible: existing string values auto-convert to timestamps on next update
277
+ ### 1.4.6 (2026-01-20)
278
+
279
+ - **⚠️ BREAKING CHANGE:** 🔄 **Main Meter Naming** - Hauptzähler benötigt jetzt einen Namen:
280
+ - **State-Pfade geändert**: `gas.*` → `gas.METER_NAME.*` (z.B. `gas.main.*`)
281
+ - **Neue Config-Felder**: "Name des Hauptzählers" für Gas/Wasser/Strom/PV
282
+ - **Default-Name**: "main" (wird automatisch verwendet wenn leer gelassen)
283
+ - **Konsistente Struktur**: Alle Zähler (Haupt + Zusätzlich) verwenden jetzt `type.meterName.*`
284
+ - **Flexibilität**: Hauptzähler kann jetzt frei benannt werden (z.B. "wohnung", "erdgeschoss", "gesamt")
285
+ - **Keine Special-Cases**: Vereinfachter Code ohne `meterName === 'main'` Bedingungen
286
+ - **NEW:** 🔔 **Smart Notifications** - Zählerauswahl für Benachrichtigungen:
287
+ - Wähle pro Utility-Typ aus, welche Zähler benachrichtigt werden sollen
288
+ - Multi-Select Dropdown zeigt alle konfigurierten Zähler
289
+ - Wenn leer: Alle Zähler werden benachrichtigt (Standard)
290
+ - Wenn ausgewählt: Nur gewählte Zähler erhalten Benachrichtigungen
291
+ - Gilt für Abrechnungsende, Vertragswechsel und monatliche Berichte
292
+ - **IMPROVED:** 🏗️ **Code-Architektur** - Entfernung von 19 Special-Case Checks in 7 Dateien:
293
+ - Vereinfachte basePath-Berechnungen in multiMeterManager, billingManager, stateManager
294
+ - Vereinheitlichter Config-Zugriff (alle Meter nutzen `meter.config.contractStart`)
295
+ - HT/NT-Logik basiert jetzt auf `config.htNtEnabled` statt Meter-Name
296
+ - Button-Trigger erkennt nur noch einheitliche Pfadstruktur
297
+ - Legacy-Code entfernt: updateBillingCountdown, updateCurrentPrice jetzt per-meter
298
+ - **MIGRATION:** 📋 **Upgrade-Hinweise**:
299
+ - Bei Neuinstallation: Namen für Hauptzähler eingeben (oder "main" akzeptieren)
300
+ - Bei Upgrade: Adapter neu konfigurieren + Skripte/Visualisierungen anpassen
301
+ - History: Alte States bleiben erhalten, neue States werden parallel erstellt
302
+ - Empfehlung: "main" als Namen verwenden für einfachere Migration
303
+
304
+ ### 1.4.5 (2026-01-20)
305
+
306
+ - **FIX:** 🐛 **Critical Multi-Meter Cost Calculation Bugs** - Comprehensive fixes for multi-meter functionality:
307
+ - **Main Meter Sync Issue**: Removed duplicate initialization that prevented `lastSync` updates on main meter
308
+ - **basicCharge Accumulation**: Now correctly calculates `basicCharge = grundgebuehr × months` (was showing only 1 month)
309
+ - **paidTotal Accumulation**: Now correctly calculates `paidTotal = abschlag × months` (was showing only 1 month)
310
+ - **annualFee as Fixed Value**: Jahresgebühr is now used as fixed yearly value (e.g., 60€ stays 60€)
311
+ - Previously incorrectly treated as monthly fee and multiplied by months
312
+ - User-entered value in config (e.g., 60€) is now used directly as intended
313
+ - **Balance Formula Corrected**: Fixed reversed formula `balance = totalYearly - paidTotal`
314
+ - Positive balance = Nachzahlung (you owe money)
315
+ - Negative balance = Guthaben (you get money back)
316
+ - **IMPROVED:** 📦 **Dev-Dependencies**: Updated from tilde (~) to caret (^) versioning for better security updates
317
+ - **CLEANUP:** 🧹 **Repository Compliance**: Removed unpublished versions from changelog (resolves ioBroker Bot Issue #1)
248
318
 
249
319
  ### 1.4.2 (2026-01-18)
250
320
 
@@ -268,44 +338,6 @@ Der Adapter setzt Zähler automatisch zurück:
268
338
  - Prevents silent failures in StateManager
269
339
  - **IMPROVED:** 🧪 **Code Quality** - All tests passing (31 unit + 57 package tests)
270
340
 
271
- ### 1.4.1 (2026-01-18)
272
-
273
- - **FIX:** 🐛 **Multi-Meter Critical Bugs** - Comprehensive fixes for multi-meter functionality:
274
- - Fixed `updateCosts()` to correctly delegate to multiMeterManager for all meters
275
- - Fixed `closeBillingPeriod()` to archive totals instead of only main meter values
276
- - Fixed `checkMonthlyReport()` to display totals in reports for multi-meter setups
277
- - Fixed state type mismatch: `lastDayStart`, `lastMonthStart`, `lastYearStart` now use number (timestamp) instead of string
278
- - **NEW:** 🎯 **Per-Meter Billing Closure** - Each meter can now be closed individually with its own `billing.closePeriod` button
279
- - Main meter: `gas.billing.closePeriod`
280
- - Additional meters: `gas.erdgeschoss.billing.closePeriod`, `gas.keller.billing.closePeriod`, etc.
281
- - Each meter uses its own contract date for yearly resets
282
- - **NEW:** 📅 **Individual Contract Anniversary Resets** - Each meter resets on its own contract date
283
- - Primary: Manual `closePeriod` triggers yearly reset immediately
284
- - Fallback: Automatic reset on contract anniversary if user forgets to close period
285
- - Contract date is preserved when closing period early (no drift)
286
- - **IMPROVED:** 💰 **Billing Period Closure** - No longer resets `basicCharge` and `annualFee` to zero
287
- - These values now persist from config (user must update config if tariff changes)
288
- - Helpful reminder message added after closing period
289
- - **FIX:** 🤖 **ioBroker Bot Compliance** - All bot checker issues resolved:
290
- - Removed non-existent version 1.3.4 from news
291
- - Added complete translations for all news entries (9 languages)
292
- - Removed `.npmignore` file (using `files` field in package.json)
293
- - DevDependencies already use `~` syntax (compliant)
294
-
295
- ### 1.4.0 (2026-01-17)
296
-
297
- - **NEW:** 🎉 **Multi-Meter Support** - Verwende mehrere Zähler pro Typ (z.B. Gas Hauptzähler + Werkstatt-Zähler)
298
- - Beliebig viele zusätzliche Zähler mit eigenen Namen konfigurierbar
299
- - Separate Kostenberechnung und Statistiken pro Zähler
300
- - Automatische Totals-Berechnung über alle Zähler
301
- - **NEW:** ✨ **Komma-Dezimaltrenner Support** - Admin UI akzeptiert jetzt sowohl Komma als auch Punkt (z.B. `12,50` oder `12.50`)
302
- - **NEW:** 📊 **Pro-Meter Billing** - Jeder Zähler hat eigene `billing.daysRemaining` und `billing.periodEnd` Werte
303
- - **NEW:** 🔧 **Config-Parser** - Automatische Konvertierung von String→Number mit Komma-Support
304
- - **FIX:** 💰 **Balance-Berechnung korrigiert** - Nutzt jetzt begonnene Monate statt volle Monate (17 Tage = 1 Monat gezahlt)
305
- - **FIX:** 🐛 **String-Type Fehler** behoben - Config-Werte werden korrekt als Numbers verarbeitet
306
- - **IMPROVED:** 🔍 **Debug-Logging** - Hilfreiche Debug-Logs für Troubleshooting (nur in Debug-Modus sichtbar)
307
- - **CLEANUP:** 🧹 Repository aufgeräumt - Alte Backup-Dateien und temporäre Scripts entfernt
308
-
309
341
  ---
310
342
 
311
343
  ## License
@@ -21,6 +21,19 @@
21
21
  "lg": 6,
22
22
  "xl": 6
23
23
  },
24
+ "gasMainMeterName": {
25
+ "type": "text",
26
+ "label": "📝 Name des Hauptzählers",
27
+ "placeholder": "z.B. main, wohnung, haus, gesamt",
28
+ "help": "Technischer Name für den Hauptzähler. Wird Teil des State-Pfads (gas.DIESER_NAME.*). Nur Kleinbuchstaben und Zahlen, max 20 Zeichen.",
29
+ "default": "main",
30
+ "hidden": "!data.gasAktiv",
31
+ "sm": 12,
32
+ "md": 6,
33
+ "xs": 12,
34
+ "lg": 6,
35
+ "xl": 4
36
+ },
24
37
  "_gasSensorHeader": {
25
38
  "type": "header",
26
39
  "text": "Sensor-Konfiguration",
@@ -451,6 +464,19 @@
451
464
  "lg": 6,
452
465
  "xl": 6
453
466
  },
467
+ "wasserMainMeterName": {
468
+ "type": "text",
469
+ "label": "📝 Name des Hauptzählers",
470
+ "placeholder": "z.B. main, wohnung, haus, gesamt",
471
+ "help": "Technischer Name für den Hauptzähler. Wird Teil des State-Pfads (wasser.DIESER_NAME.*). Nur Kleinbuchstaben und Zahlen, max 20 Zeichen.",
472
+ "default": "main",
473
+ "hidden": "!data.wasserAktiv",
474
+ "sm": 12,
475
+ "md": 6,
476
+ "xs": 12,
477
+ "lg": 6,
478
+ "xl": 4
479
+ },
454
480
  "_wasserSensorHeader": {
455
481
  "type": "header",
456
482
  "text": "Sensor-Konfiguration",
@@ -745,6 +771,19 @@
745
771
  "lg": 6,
746
772
  "xl": 6
747
773
  },
774
+ "stromMainMeterName": {
775
+ "type": "text",
776
+ "label": "📝 Name des Hauptzählers",
777
+ "placeholder": "z.B. main, wohnung, haus, gesamt",
778
+ "help": "Technischer Name für den Hauptzähler. Wird Teil des State-Pfads (strom.DIESER_NAME.*). Nur Kleinbuchstaben und Zahlen, max 20 Zeichen.",
779
+ "default": "main",
780
+ "hidden": "!data.stromAktiv",
781
+ "sm": 12,
782
+ "md": 6,
783
+ "xs": 12,
784
+ "lg": 6,
785
+ "xl": 4
786
+ },
748
787
  "_stromSensorHeader": {
749
788
  "type": "header",
750
789
  "text": "Sensor-Konfiguration",
@@ -1132,6 +1171,19 @@
1132
1171
  "lg": 6,
1133
1172
  "xl": 6
1134
1173
  },
1174
+ "pvMainMeterName": {
1175
+ "type": "text",
1176
+ "label": "📝 Name des Hauptzählers",
1177
+ "placeholder": "z.B. main, einspeisung, pv",
1178
+ "help": "Technischer Name für den Hauptzähler. Wird Teil des State-Pfads (pv.DIESER_NAME.*). Nur Kleinbuchstaben und Zahlen, max 20 Zeichen.",
1179
+ "default": "main",
1180
+ "hidden": "!data.pvAktiv",
1181
+ "sm": 12,
1182
+ "md": 6,
1183
+ "xs": 12,
1184
+ "lg": 6,
1185
+ "xl": 4
1186
+ },
1135
1187
  "_pvSensorHeader": {
1136
1188
  "type": "header",
1137
1189
  "text": "Sensor-Konfiguration",
@@ -1423,6 +1475,20 @@
1423
1475
  "lg": 4,
1424
1476
  "xl": 4
1425
1477
  },
1478
+ "notificationGasMeters": {
1479
+ "type": "selectSendTo",
1480
+ "label": "Welche Gas-Zähler benachrichtigen?",
1481
+ "command": "getMeters",
1482
+ "jsonData": "{\"type\": \"gas\"}",
1483
+ "multiple": true,
1484
+ "help": "Wähle die Zähler aus, für die du Benachrichtigungen erhalten möchtest. Wenn leer, werden ALLE Zähler benachrichtigt.",
1485
+ "hidden": "!data.notificationEnabled || !data.notificationGasEnabled || !data.gasAktiv",
1486
+ "sm": 12,
1487
+ "md": 8,
1488
+ "xs": 12,
1489
+ "lg": 8,
1490
+ "xl": 8
1491
+ },
1426
1492
  "notificationWasserEnabled": {
1427
1493
  "type": "checkbox",
1428
1494
  "label": "Wasser-Erinnerung",
@@ -1433,6 +1499,20 @@
1433
1499
  "lg": 4,
1434
1500
  "xl": 4
1435
1501
  },
1502
+ "notificationWasserMeters": {
1503
+ "type": "selectSendTo",
1504
+ "label": "Welche Wasser-Zähler benachrichtigen?",
1505
+ "command": "getMeters",
1506
+ "jsonData": "{\"type\": \"water\"}",
1507
+ "multiple": true,
1508
+ "help": "Wähle die Zähler aus, für die du Benachrichtigungen erhalten möchtest. Wenn leer, werden ALLE Zähler benachrichtigt.",
1509
+ "hidden": "!data.notificationEnabled || !data.notificationWasserEnabled || !data.wasserAktiv",
1510
+ "sm": 12,
1511
+ "md": 8,
1512
+ "xs": 12,
1513
+ "lg": 8,
1514
+ "xl": 8
1515
+ },
1436
1516
  "notificationStromEnabled": {
1437
1517
  "type": "checkbox",
1438
1518
  "label": "Strom-Erinnerung",
@@ -1443,6 +1523,20 @@
1443
1523
  "lg": 4,
1444
1524
  "xl": 4
1445
1525
  },
1526
+ "notificationStromMeters": {
1527
+ "type": "selectSendTo",
1528
+ "label": "Welche Strom-Zähler benachrichtigen?",
1529
+ "command": "getMeters",
1530
+ "jsonData": "{\"type\": \"electricity\"}",
1531
+ "multiple": true,
1532
+ "help": "Wähle die Zähler aus, für die du Benachrichtigungen erhalten möchtest. Wenn leer, werden ALLE Zähler benachrichtigt.",
1533
+ "hidden": "!data.notificationEnabled || !data.notificationStromEnabled || !data.stromAktiv",
1534
+ "sm": 12,
1535
+ "md": 8,
1536
+ "xs": 12,
1537
+ "lg": 8,
1538
+ "xl": 8
1539
+ },
1446
1540
  "notificationPVEnabled": {
1447
1541
  "type": "checkbox",
1448
1542
  "label": "PV-Erinnerung",
@@ -1452,40 +1546,20 @@
1452
1546
  "xs": 12,
1453
1547
  "lg": 4,
1454
1548
  "xl": 4
1455
- }
1456
- }
1457
- },
1458
- "tabImport": {
1459
- "type": "panel",
1460
- "label": "📥 Import",
1461
- "items": {
1462
- "_importInfo": {
1463
- "type": "header",
1464
- "text": "CSV-Daten importieren",
1465
- "size": 3
1466
1549
  },
1467
- "_importLink": {
1468
- "type": "staticLink",
1469
- "label": "🚀 Import-Seite öffnen",
1470
- "button": true,
1471
- "variant": "contained",
1472
- "color": "primary",
1473
- "href": "/adapter/utility-monitor/tab-import.html",
1474
- "target": "_blank",
1475
- "sm": 12,
1476
- "md": 6,
1477
- "lg": 4
1478
- },
1479
- "_importDescription": {
1480
- "type": "staticText",
1481
- "text": "Klicke auf den Button oben, um die Import-Seite in einem neuen Tab zu öffnen. Dort kannst du CSV-Dateien mit historischen Zählerständen hochladen.",
1482
- "newLine": true,
1550
+ "notificationPVMeters": {
1551
+ "type": "selectSendTo",
1552
+ "label": "Welche PV-Zähler benachrichtigen?",
1553
+ "command": "getMeters",
1554
+ "jsonData": "{\"type\": \"pv\"}",
1555
+ "multiple": true,
1556
+ "help": "Wähle die Zähler aus, für die du Benachrichtigungen erhalten möchtest. Wenn leer, werden ALLE Zähler benachrichtigt.",
1557
+ "hidden": "!data.notificationEnabled || !data.notificationPVEnabled || !data.pvAktiv",
1483
1558
  "sm": 12,
1484
- "style": {
1485
- "fontSize": "0.9em",
1486
- "color": "#666",
1487
- "marginTop": "20px"
1488
- }
1559
+ "md": 8,
1560
+ "xs": 12,
1561
+ "lg": 8,
1562
+ "xl": 8
1489
1563
  }
1490
1564
  }
1491
1565
  },
@@ -1495,12 +1569,12 @@
1495
1569
  "items": {
1496
1570
  "_infoHeader": {
1497
1571
  "type": "header",
1498
- "text": "Utility Monitor",
1572
+ "text": "Nebenkosten-Monitor",
1499
1573
  "size": 3
1500
1574
  },
1501
1575
  "_infoVersion": {
1502
1576
  "type": "staticText",
1503
- "text": "**Version:** 1.4.4\n\n**Autor:** fischi87",
1577
+ "text": "**Version:** 1.4.6\n\n**Autor:** fischi87\n\n⚠️ **Breaking Change in v1.4.6:** State-Pfade haben sich geändert! Siehe unten.",
1504
1578
  "sm": 12,
1505
1579
  "xs": 12,
1506
1580
  "md": 12,
@@ -1509,7 +1583,7 @@
1509
1583
  },
1510
1584
  "donation": {
1511
1585
  "type": "staticText",
1512
- "text": "☕ [PayPal Spenden](https://paypal.me/bigplay87) | 📁 [GitHub Repository](https://github.com/fischi87/ioBroker.utility-monitor)",
1586
+ "text": "☕ [PayPal Spenden](https://paypal.me/bigplay87) | 📁 [GitHub Repository](https://github.com/fischi87/ioBroker.nebenkosten-monitor)",
1513
1587
  "xs": 12,
1514
1588
  "sm": 12,
1515
1589
  "md": 12,
@@ -1526,7 +1600,7 @@
1526
1600
  },
1527
1601
  "_features": {
1528
1602
  "type": "staticText",
1529
- "text": "📊 **Verbrauchsüberwachung** - Gas, Wasser, Strom & PV/Einspeisung\n\n💰 **Automatische Kostenberechnung** - Mit Arbeitspreis & Grundgebühren\n\n☀️ **PV-Integration** - Überwachung von Einspeisung & Vergütung\n\n💳 **Abschlagsüberwachung** - Direkter Vergleich: Bezahlt vs. Verbraucht\n\n🔄 **Gas-Spezial** - Automatische m³ zu kWh Umrechnung\n\n⚡ **HT/NT-Unterstützung** - Volle Unterstützung für Doppeltarife\n\n📅 **Jahres-Historie** - Automatische Archivierung zum Vertragsbeginn",
1603
+ "text": "📊 **Verbrauchsüberwachung** - Gas, Wasser, Strom & PV/Einspeisung\n\n🔢 **Multi-Meter Support** *(NEU in 1.4.6)* - Mehrere Zähler pro Typ (z.B. Haus + Werkstatt)\n\n📛 **Konfigurierbare Namen** *(NEU in 1.4.6)* - Gib jedem Zähler einen individuellen Namen\n\n💰 **Automatische Kostenberechnung** - Mit Arbeitspreis & Grundgebühren\n\n☀️ **PV-Integration** - Überwachung von Einspeisung & Vergütung\n\n💳 **Abschlagsüberwachung** - Direkter Vergleich: Bezahlt vs. Verbraucht\n\n🔄 **Gas-Spezial** - Automatische m³ zu kWh Umrechnung\n\n⚡ **HT/NT-Unterstützung** - Volle Unterstützung für Doppeltarife\n\n📅 **Jahres-Historie** - Automatische Archivierung zum Vertragsbeginn\n\n🔔 **Smart Notifications** - Wähle für welche Zähler du benachrichtigt werden möchtest",
1530
1604
  "sm": 12,
1531
1605
  "xs": 12,
1532
1606
  "md": 12,
@@ -1536,14 +1610,31 @@
1536
1610
  "_divider2": {
1537
1611
  "type": "divider"
1538
1612
  },
1613
+ "_breakingHeader": {
1614
+ "type": "header",
1615
+ "text": "⚠️ Breaking Changes v1.4.6",
1616
+ "size": 4
1617
+ },
1618
+ "_breakingChanges": {
1619
+ "type": "staticText",
1620
+ "text": "**State-Pfade haben sich geändert:**\n\n**Vorher:** `gas.consumption.daily`, `gas.costs.yearly`\n\n**Neu:** `gas.METER_NAME.consumption.daily`, `gas.METER_NAME.costs.yearly`\n\n**Standardname:** Wenn du keinen Namen vergibst, wird automatisch \"main\" verwendet.\n\n**Was du tun musst:**\n• Skripte anpassen die States verwenden\n• Visualisierungen (VIS, Grafana) aktualisieren\n• History-Adapter neu konfigurieren\n\n**Mehrere Zähler:** Bei mehreren Zählern wird automatisch eine `totals/` Struktur mit Summen erstellt.",
1621
+ "sm": 12,
1622
+ "xs": 12,
1623
+ "md": 12,
1624
+ "lg": 12,
1625
+ "xl": 12
1626
+ },
1627
+ "_divider2a": {
1628
+ "type": "divider"
1629
+ },
1539
1630
  "_usageHeader": {
1540
1631
  "type": "header",
1541
- "text": "Benachrichtigungen (Neu)",
1632
+ "text": "📬 Benachrichtigungen",
1542
1633
  "size": 4
1543
1634
  },
1544
1635
  "_usage": {
1545
1636
  "type": "staticText",
1546
- "text": "**1. Abrechnungsende** 📅\n• Erinnert dich (z.B. 7 Tage vorher) daran, den Zählerstand abzulesen und den Zeitraum abzuschließen.\n\n**2. Vertragswechsel** 📋\n• Erinnert dich frühzeitig (z.B. 60 Tage vorher) daran, Tarife zu vergleichen oder die Kündigungsfrist zu prüfen.\n\n**3. Monatlicher Bericht** 📈\n• Optionaler Status-Bericht am 1. jedes Monats via Benachrichtigung.\n\n**💡 Tipp:** Nutze den **Test-Button** zum Prüfen deiner Einstellungen. Du bekommst sofort ein Popup mit dem Ergebnis!",
1637
+ "text": "**1. Abrechnungsende** 📅\n• Erinnert dich (z.B. 7 Tage vorher) daran, den Zählerstand abzulesen und den Zeitraum abzuschließen.\n\n**2. Vertragswechsel** 📋\n• Erinnert dich frühzeitig (z.B. 60 Tage vorher) daran, Tarife zu vergleichen oder die Kündigungsfrist zu prüfen.\n\n**3. Monatlicher Bericht** 📈\n• Optionaler Status-Bericht am 1. jedes Monats via Benachrichtigung.\n\n**4. Zählerauswahl** 🎯 *(NEU in 1.4.6)*\n• Wähle aus, für welche Zähler du Benachrichtigungen erhalten möchtest\n• Wenn leer: Alle Zähler werden benachrichtigt\n\n**💡 Tipp:** Nutze den **Test-Button** zum Prüfen deiner Einstellungen. Du bekommst sofort ein Popup mit dem Ergebnis!",
1547
1638
  "sm": 12,
1548
1639
  "xs": 12,
1549
1640
  "md": 12,
@@ -1560,7 +1651,7 @@
1560
1651
  },
1561
1652
  "_statesInfo": {
1562
1653
  "type": "staticText",
1563
- "text": "**📅 billing/** (Abrechnung)\n• **daysRemaining** - Tage bis zum Ende\n• **closePeriod** - Button zum Abschluss\n\n**💰 costs/** (Kosten)\n• **balance** - 🎯 Aktuelle Bilanz (Guthaben/Nachzahlung)\n• **totalYearly** - Prognose Gesamtkosten inkl. Gebühren\n\n**📈 statistics/** (Statistiken)\n• **lastDay** - Verbrauch gestern (kWh)\n• **lastDayVolume** - Verbrauch gestern in m³ (Gas)\n\n**☀️ PV / Einspeisung**\n• **earnings.totalYearly** - Akkumulierte Vergütung\n• **consumption.yearly** - Gesamte Einspeisung",
1654
+ "text": "**⚠️ Neue Struktur ab v1.4.6:**\n\nAlle Datenpunkte sind jetzt unter `TYPE.METER_NAME.*` zu finden!\n\n**Beispiel Single-Meter:**\n• `gas.main.consumption.daily`\n• `gas.main.costs.totalYearly`\n• `gas.main.billing.closePeriod`\n\n**Beispiel Multi-Meter:**\n• `gas.haus.consumption.yearly` ← Zähler 1\n• `gas.werkstatt.consumption.yearly` ← Zähler 2\n• `gas.totals.consumption.yearly` ← Summe\n\n**📅 billing/** (Abrechnung)\n• **daysRemaining** - Tage bis zum Vertragsende\n• **closePeriod** - Button zum Zeitraum-Abschluss\n• **endReading** - Hier Endzählerstand eintragen\n\n**💰 costs/** (Kosten)\n• **balance** - Aktuelle Bilanz (Nachzahlung/Guthaben)\n• **totalYearly** - Gesamtkosten inkl. Gebühren\n• **yearly** - Nur Verbrauchskosten\n\n**📈 statistics/** (Statistiken)\n• **lastDay** - Gestern-Verbrauch\n• **averageDaily** - Durchschnitt pro Tag\n• **averageMonthly** - Durchschnitt pro Monat",
1564
1655
  "sm": 12,
1565
1656
  "xs": 12,
1566
1657
  "md": 12,
package/io-package.json CHANGED
@@ -1,33 +1,24 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "utility-monitor",
4
- "version": "1.4.4",
4
+ "version": "1.4.6",
5
5
  "news": {
6
- "1.4.4": {
7
- "en": "Fix: lastYearStart now always recalculated from contract date on adapter start - fixes wrong month count in paidTotal",
8
- "de": "Fix: lastYearStart wird jetzt immer aus Vertragsbeginn neu berechnet - behebt falsche Monatszahl in paidTotal",
9
- "ru": "Исправление: lastYearStart теперь всегда пересчитывается из даты договора при запуске - исправляет неправильный подсчет месяцев в paidTotal",
10
- "pt": "Correção: lastYearStart agora sempre recalculado da data do contrato na inicialização - corrige contagem incorreta de meses em paidTotal",
11
- "nl": "Fix: lastYearStart nu altijd herberekend vanaf contractdatum bij start - lost onjuiste maandtelling in paidTotal op",
12
- "fr": "Correction: lastYearStart maintenant toujours recalculé à partir de la date du contrat au démarrage - corrige le comptage incorrect des mois dans paidTotal",
13
- "it": "Correzione: lastYearStart ora sempre ricalcolato dalla data contratto all'avvio - corregge conteggio errato mesi in paidTotal",
14
- "es": "Corrección: lastYearStart ahora siempre recalculado desde fecha contrato al iniciar - corrige recuento incorrecto meses en paidTotal",
15
- "pl": "Naprawa: lastYearStart teraz zawsze przeliczany z daty umowy przy starcie - naprawia błędne liczenie miesięcy w paidTotal",
16
- "uk": "Виправлення: lastYearStart тепер завжди перераховується з дати договору при запуску - виправляє неправильний підрахунок місяців у paidTotal",
17
- "zh-cn": "修复:lastYearStart现在在启动时始终从合同日期重新计算 - 修复paidTotal中的错误月数计数"
6
+ "1.4.6": {
7
+ "en": "Breaking Change: Main meter now requires a name (default: 'main'). State paths changed from 'gas.*' to 'gas.METER_NAME.*'. All meters now use consistent naming structure.",
8
+ "de": "Breaking Change: Hauptzähler benötigt jetzt einen Namen (Standard: 'main'). State-Pfade geändert von 'gas.*' zu 'gas.METER_NAME.*'. Alle Zähler nutzen jetzt konsistente Namensstruktur."
18
9
  },
19
- "1.4.3": {
20
- "en": "Fix: Critical paidTotal calculation bug - now correctly calculates (monthly payment × months) after sensor updates",
21
- "de": "Fix: Kritischer paidTotal-Berechnungsfehler - berechnet jetzt korrekt (monatlicher Abschlag × Monate) nach Sensor-Updates",
22
- "ru": "Исправление: Критическая ошибка расчета paidTotal - теперь правильно вычисляет (ежемесячный платеж × месяцы) после обновлений датчика",
23
- "pt": "Correção: Bug crítico de cálculo paidTotal - agora calcula corretamente (pagamento mensal × meses) após atualizações do sensor",
24
- "nl": "Fix: Kritieke paidTotal-berekeningsfout - berekent nu correct (maandelijkse betaling × maanden) na sensor-updates",
25
- "fr": "Correction: Bug critique de calcul paidTotal - calcule maintenant correctement (paiement mensuel × mois) après les mises à jour du capteur",
26
- "it": "Correzione: Bug critico calcolo paidTotal - ora calcola correttamente (pagamento mensile × mesi) dopo aggiornamenti sensore",
27
- "es": "Corrección: Bug crítico de cálculo paidTotal - ahora calcula correctamente (pago mensual × meses) después de actualizaciones del sensor",
28
- "pl": "Naprawa: Krytyczny błąd obliczania paidTotal - teraz poprawnie oblicza (płatność miesięczna × miesiące) po aktualizacjach czujnika",
29
- "uk": "Виправлення: Критична помилка розрахунку paidTotal - тепер правильно обчислює (щомісячний платіж × місяці) після оновлень датчика",
30
- "zh-cn": "修复:关键的paidTotal计算错误 - 现在在传感器更新后正确计算(月付款×月数)"
10
+ "1.4.5": {
11
+ "en": "Fix: Critical multi-meter cost calculation bugs (main meter sync, basicCharge/paidTotal accumulation, annualFee as fixed yearly value). Fix: Balance formula corrected. Fix: Removed duplicate initialization causing sync issues.",
12
+ "de": "Fix: Kritische Multi-Meter Kostenberechnungsfehler (Hauptzähler-Sync, basicCharge/paidTotal Akkumulation, Jahresgebühr als fester Jahreswert). Fix: Balance-Formel korrigiert. Fix: Doppelte Initialisierung entfernt.",
13
+ "ru": "Исправление: Критические ошибки расчета затрат multi-meter (синхронизация главного счетчика, накопление basicCharge/paidTotal, annualFee как фиксированное годовое значение). Исправление: Формула баланса исправлена. Исправление: Удалена дублирующая инициализация.",
14
+ "pt": "Correção: Bugs críticos de cálculo de custos multi-medidor (sincronização medidor principal, acumulação basicCharge/paidTotal, annualFee como valor anual fixo). Correção: Fórmula de saldo corrigida. Correção: Inicialização duplicada removida.",
15
+ "nl": "Fix: Kritieke multi-meter kostenberekeningsfouten (hoofdmeter sync, basicCharge/paidTotal accumulatie, annualFee als vaste jaarwaarde). Fix: Balans formule gecorrigeerd. Fix: Dubbele initialisatie verwijderd.",
16
+ "fr": "Correction: Bugs critiques calcul coûts multi-compteurs (sync compteur principal, accumulation basicCharge/paidTotal, annualFee comme valeur annuelle fixe). Correction: Formule de solde corrigée. Correction: Initialisation en double supprimée.",
17
+ "it": "Correzione: Bug critici calcolo costi multi-contatore (sync contatore principale, accumulazione basicCharge/paidTotal, annualFee come valore annuale fisso). Correzione: Formula bilancio corretta. Correzione: Inizializzazione duplicata rimossa.",
18
+ "es": "Corrección: Bugs críticos cálculo costos multi-medidor (sincronización medidor principal, acumulación basicCharge/paidTotal, annualFee como valor anual fijo). Corrección: Fórmula balance corregida. Corrección: Inicialización duplicada eliminada.",
19
+ "pl": "Naprawa: Krytyczne błędy obliczania kosztów multi-meter (synchronizacja głównego licznika, akumulacja basicCharge/paidTotal, annualFee jako stała wartość roczna). Naprawa: Formuła salda poprawiona. Naprawa: Usunięto podwójną inicjalizację.",
20
+ "uk": "Виправлення: Критичні помилки розрахунку витрат multi-meter (синхронізація головного лічильника, накопичення basicCharge/paidTotal, annualFee як фіксоване річне значення). Виправлення: Формула балансу виправлена. Виправлення: Видалено подвійну ініціалізацію.",
21
+ "zh-cn": "修复:关键多表成本计算错误(主表同步、basicCharge/paidTotal累积、annualFee作为固定年值)。修复:余额公式已更正。修复:删除重复初始化。"
31
22
  },
32
23
  "1.4.2": {
33
24
  "en": "Fix: Critical multi-meter balance bug (hardcoded 12 months). Fix: TypeScript errors resolved. New: Enhanced input validation. New: Extended constants. New: Error handling wrapper.",
@@ -41,32 +32,6 @@
41
32
  "pl": "Naprawa: Krytyczny błąd salda multi-meter (zakodowane 12 miesięcy). Naprawa: Naprawione błędy TypeScript. Nowe: Ulepszona walidacja danych. Nowe: Rozszerzone stałe. Nowe: Wrapper obsługi błędów.",
42
33
  "uk": "Виправлення: Критична помилка балансу multi-meter (жорстко задані 12 місяців). Виправлення: Усунено помилки TypeScript. Нове: Покращена перевірка даних. Нове: Розширені константи. Нове: Обробник помилок.",
43
34
  "zh-cn": "修复:关键多表余额错误(硬编码12个月)。修复:解决TypeScript错误。新增:增强输入验证。新增:扩展常量。新增:错误处理包装器。"
44
- },
45
- "1.4.1": {
46
- "en": "Fix: Multi-meter bugs (cost calculation, billing period closure, monthly reports, yearly resets). Fix: Per-meter billing closure support. Fix: State type corrections (lastDayStart). Fix: ioBroker Bot compliance.",
47
- "de": "Fix: Multi-Meter-Fehler (Kostenberechnung, Periodenabschluss, Monatsberichte, Jahres-Resets). Fix: Zähler-individuelle Periodenabschlüsse. Fix: State-Typ-Korrekturen (lastDayStart). Fix: ioBroker Bot-Compliance.",
48
- "ru": "Исправление: Ошибки нескольких счетчиков (расчет затрат, закрытие периода, ежемесячные отчеты, годовые сбросы). Исправление: Поддержка закрытия периода для каждого счетчика. Исправление: Исправления типов состояний. Исправление: Соответствие ioBroker Bot.",
49
- "pt": "Correção: Bugs multi-medidor (cálculo custos, fechamento período, relatórios mensais, resets anuais). Correção: Suporte fechamento período por medidor. Correção: Correções tipo estado. Correção: Conformidade Bot ioBroker.",
50
- "nl": "Fix: Multi-meter bugs (kostenberekening, periode afsluiting, maandraporten, jaarlijkse resets). Fix: Per-meter periode afsluiting. Fix: State type correcties. Fix: ioBroker Bot compliance.",
51
- "fr": "Correction: Bugs multi-compteurs (calcul coûts, clôture période, rapports mensuels, réinitialisations annuelles). Correction: Support clôture période par compteur. Correction: Corrections type d'état. Correction: Conformité Bot ioBroker.",
52
- "it": "Correzione: Bug multi-contatore (calcolo costi, chiusura periodo, report mensili, reset annuali). Correzione: Supporto chiusura periodo per contatore. Correzione: Correzioni tipo stato. Correzione: Conformità Bot ioBroker.",
53
- "es": "Corrección: Bugs multi-medidor (cálculo costos, cierre período, informes mensuales, reinicios anuales). Corrección: Soporte cierre período por medidor. Corrección: Correcciones tipo estado. Corrección: Cumplimiento Bot ioBroker.",
54
- "pl": "Naprawa: Błędy wielu liczników (obliczanie kosztów, zamknięcie okresu, raporty miesięczne, resety roczne). Naprawa: Wsparcie zamknięcia okresu dla licznika. Naprawa: Poprawki typu stanu. Naprawa: Zgodność z Bot ioBroker.",
55
- "uk": "Виправлення: Помилки кількох лічильників (розрахунок витрат, закриття періоду, місячні звіти, річні скидання). Виправлення: Підтримка закриття періоду для лічильника. Виправлення: Виправлення типу стану. Виправлення: Відповідність ioBroker Bot.",
56
- "zh-cn": "修复:多表错误(成本计算、期间关闭、月度报告、年度重置)。修复:每表期间关闭支持。修复:状态类型更正。修复:ioBroker Bot合规性。"
57
- },
58
- "1.4.0": {
59
- "en": "New: Multi-Meter Support! Add unlimited custom-named meters per utility type (gas, water, electricity). Automatic totals calculation. Fully backward compatible.",
60
- "de": "Neu: Multi-Meter-Unterstützung! Unbegrenzt viele Zähler pro Medium (Gas, Wasser, Strom) mit benutzerdefinierten Namen. Automatische Gesamt-Summen. Vollständig rückwärtskompatibel.",
61
- "ru": "Новое: Поддержка нескольких счетчиков! Добавьте неограниченное количество пользовательских счетчиков для каждого типа коммунальных услуг (газ, вода, электричество). Автоматический расчет итогов. Полная обратная совместимость.",
62
- "pt": "Novo: Suporte Multi-Medidor! Adicione medidores personalizados ilimitados por tipo de utilidade (gás, água, eletricidade). Cálculo automático de totais. Totalmente compatível com versões anteriores.",
63
- "nl": "Nieuw: Multi-Meter Ondersteuning! Voeg onbeperkt aangepaste meters toe per type (gas, water, elektriciteit). Automatische totaalberekening. Volledig achterwaarts compatibel.",
64
- "fr": "Nouveau: Support Multi-Compteur! Ajoutez des compteurs personnalisés illimités par type de service (gaz, eau, électricité). Calcul automatique des totaux. Entièrement rétrocompatible.",
65
- "it": "Nuovo: Supporto Multi-Contatore! Aggiungi contatori personalizzati illimitati per tipo di servizio (gas, acqua, elettricità). Calcolo automatico dei totali. Completamente retrocompatibile.",
66
- "es": "Nuevo: Soporte Multi-Medidor! Agregue medidores personalizados ilimitados por tipo de servicio (gas, agua, electricidad). Cálculo automático de totales. Totalmente compatible con versiones anteriores.",
67
- "pl": "Nowe: Obsługa Wielu Liczników! Dodaj nieograniczoną liczbę niestandardowych liczników dla każdego typu mediów (gaz, woda, prąd). Automatyczne obliczanie sum. Pełna kompatybilność wsteczna.",
68
- "uk": "Нове: Підтримка кількох лічильників! Додайте необмежену кількість власних лічильників для кожного типу комунальних послуг (газ, вода, електрика). Автоматичний розрахунок підсумків. Повна зворотна сумісність.",
69
- "zh-cn": "新增:多表支持!为每种公用事业类型(燃气、水、电)添加无限的自定义计量表。自动总计计算。完全向后兼容。"
70
35
  }
71
36
  },
72
37
  "titleLang": {
@@ -130,6 +95,7 @@
130
95
  },
131
96
  "native": {
132
97
  "gasAktiv": false,
98
+ "gasMainMeterName": "main",
133
99
  "gasSensorDP": "",
134
100
  "gasOffset": 0,
135
101
  "gasInitialReading": 0,
@@ -139,6 +105,7 @@
139
105
  "gasGrundgebuehr": 0,
140
106
  "gasAbschlag": 0,
141
107
  "wasserAktiv": false,
108
+ "wasserMainMeterName": "main",
142
109
  "wasserSensorDP": "",
143
110
  "wasserOffset": 0,
144
111
  "wasserInitialReading": 0,
@@ -146,6 +113,7 @@
146
113
  "wasserGrundgebuehr": 0,
147
114
  "wasserAbschlag": 0,
148
115
  "stromAktiv": false,
116
+ "stromMainMeterName": "main",
149
117
  "stromSensorDP": "",
150
118
  "stromOffset": 0,
151
119
  "stromInitialReading": 0,
@@ -153,6 +121,7 @@
153
121
  "stromGrundgebuehr": 0,
154
122
  "stromAbschlag": 0,
155
123
  "pvAktiv": false,
124
+ "pvMainMeterName": "main",
156
125
  "pvSensorDP": "",
157
126
  "pvOffset": 0,
158
127
  "pvInitialReading": 0,
@@ -164,8 +133,13 @@
164
133
  "notificationInstance": "",
165
134
  "notificationDaysBefore": 30,
166
135
  "notificationGasEnabled": false,
136
+ "notificationGasMeters": [],
167
137
  "notificationWasserEnabled": false,
138
+ "notificationWasserMeters": [],
168
139
  "notificationStromEnabled": false,
140
+ "notificationStromMeters": [],
141
+ "notificationPVEnabled": false,
142
+ "notificationPVMeters": [],
169
143
  "notificationBillingEnabled": true,
170
144
  "notificationBillingDays": 7,
171
145
  "notificationChangeDays": 60