2 Commits
Author SHA1 Message Date
dh 59eec738ab chore(release): erste Beta vorbereiten
Tests / test (push) Successful in 51s
2026-09-29 06:25:29 +00:00
dh 40c6a17dd1 fix(energiediagramm): Symcon-8-Darstellung korrigieren 2026-09-29 06:24:29 +00:00
15 changed files with 125 additions and 28 deletions
+8
View File
@@ -21,6 +21,14 @@ jobs:
- name: Abhaengigkeiten installieren
run: composer install --no-interaction --no-progress --prefer-dist
- name: Composer-Metadaten pruefen
run: composer validate --strict
- name: Abhaengigkeiten auf Sicherheitsmeldungen pruefen
run: |
composer audit --no-interaction
composer audit --working-dir=Verbrauchskostenreport/libs --locked --no-interaction
- name: Unit-Tests und Syntaxpruefung ausfuehren
run: composer check
+26
View File
@@ -0,0 +1,26 @@
# Changelog
Alle wesentlichen Aenderungen an Enelix Utils werden in dieser Datei dokumentiert.
## 0.1 Build 1 - Erste Beta - 2026-09-29
### Enthalten
- Verbrauchskostenreport mit PDF-Ausgabe und Schweizer QR-Zahlteil nach SIX 2.3.
- Verbrauchskostenreport mit Grundlizenz sowie Strom- und Nebenzaehlerkontingenten.
- Virtuelle Batterie und VGT-Schnittstelle.
- CC100 Hardware und generisches Shelly Modul.
- Energiediagramm fuer die IP-Symcon-Kachelvisualisierung.
### Beta-Aenderungen
- Dezimale IP-Symcon-Farbwerte werden im Energiediagramm korrekt verarbeitet.
- Kachelabstand fuer den Symcon-Kopf und versionsabhaengiger Vollbildmodus.
- Vollstaendige PHP-, Struktur- und Symcon-Modultests fuer alle Module.
- Composer-Metadaten- und Abhaengigkeitspruefung in der CI.
### Hinweise
- Diese Version ist fuer kontrollierte Anlagen- und Feldtests bestimmt.
- Vor produktivem Einsatz sind Sicherung und anlagenspezifische Abnahme erforderlich.
- Korrekturen werden vorwaerts ueber `develop` und anschliessend `beta` verteilt.
+12 -5
View File
@@ -24,14 +24,21 @@ zusaetzlich ein frei waehlbarer inklusiver Datumsbereich und die Navigation
durch abgeschlossene Zeitraeume zur Verfuegung.
Die Farben fuer Eigenverbrauchsquote und Autarkiegrad werden mit den beiden
Farbauswahlen in der Instanzkonfiguration festgelegt.
Farbauswahlen in der Instanzkonfiguration festgelegt. Das Modul verarbeitet
sowohl aktuelle Hex-Farbwerte als auch die von IP-Symcon 8.0 gespeicherten
dezimalen Farbwerte.
## Darstellung
Die Kachel und ihre vergroesserte Ansicht erhalten beim Aufbau sofort einen
vollstaendigen Datenstand. Beim Oeffnen und beim erneuten Sichtbarwerden wird
die Darstellung aktualisiert. Das Diagrammraster wechselt bei geringer Breite
automatisch von zwei Spalten auf eine Spalte.
Der Inhalt beginnt unterhalb des von Symcon eingeblendeten Kachelkopfs, damit
Zeitraum und Datum vollstaendig bedienbar bleiben. Beim Oeffnen und beim erneuten
Sichtbarwerden wird die Darstellung aktualisiert. Das Diagrammraster wechselt
bei geringer Breite automatisch von zwei Spalten auf eine Spalte.
IP-Symcon 8.x unterstuetzt HTML-SDK-Darstellungen nur in der normalen Kachel.
Der vom Client angebotene Vergroesserungsdialog kann deshalb leer bleiben.
Ab IP-Symcon 9.0 aktiviert das Modul automatisch den zusaetzlichen
HTML-SDK-Vollbildmodus.
## Berechnung
+13 -3
View File
@@ -118,9 +118,19 @@ final class EnergyChartCalculator
public static function normalizeColor(string $color, string $fallback): string
{
return preg_match('/^#[0-9A-Fa-f]{6}$/', $color) === 1
? strtoupper($color)
: strtoupper($fallback);
$color = trim($color);
if (preg_match('/^#[0-9A-Fa-f]{6}$/', $color) === 1) {
return strtoupper($color);
}
if (preg_match('/^[0-9]+$/', $color) === 1) {
$legacyColor = (int) $color;
if ($legacyColor >= 0 && $legacyColor <= 0xFFFFFF) {
return sprintf('#%06X', $legacyColor);
}
}
return strtoupper($fallback);
}
private static function date(string $date): DateTimeImmutable
+2 -2
View File
@@ -71,7 +71,7 @@
width: 100%;
min-height: 100%;
box-sizing: border-box;
padding: 14px;
padding: 58px 14px 14px;
overflow: auto;
font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
color: inherit;
@@ -234,7 +234,7 @@
@media (max-width: 560px) {
#energy-app {
padding: 10px;
padding: 58px 10px 10px;
}
.toolbar,
+4 -1
View File
@@ -37,7 +37,10 @@ class Energiediagramm extends IPSModule
$this->RegisterAttributeString(self::ATTR_CUSTOM_START, $today);
$this->RegisterAttributeString(self::ATTR_CUSTOM_END, $today);
$this->SetVisualizationType(1);
$visualizationType = version_compare(IPS_GetKernelVersion(), '9.0', '>=')
? 2
: 1;
$this->SetVisualizationType($visualizationType);
$this->RegisterTimer(
'Refresh',
0,
+9 -3
View File
@@ -4,9 +4,11 @@ Unabhaengige Zusatzmodule fuer IP-Symcon. Dieses Repository ist nicht vom Enelix
## Status
Das Repository befindet sich im Aufbau. Verbrauchskostenreport, Virtuelle
Batterie, CC100 Hardware, Energiediagramm, VGT-Schnittstelle und Shelly Modul
sind als installierbare IP-Symcon-Module enthalten.
Version 0.1 Build 1 ist die erste Beta fuer kontrollierte Anlagen- und
Feldtests. Verbrauchskostenreport, Virtuelle Batterie, CC100 Hardware,
Energiediagramm, VGT-Schnittstelle und Shelly Modul sind als installierbare
IP-Symcon-Module enthalten. Produktiver Einsatz setzt eine anlagenspezifische
Pruefung und Sicherung voraus.
## Module
@@ -23,6 +25,10 @@ Punkten stehen in der [Modulübersicht](docs/module/README.md).
Prognose, Lizenzierung und Störüberwachung sind keine Module dieses
Repositories. Die Utils-Module bleiben auch untereinander unabhängig.
## Release-Hinweise
Die Aenderungen der ersten Beta stehen im [Changelog](CHANGELOG.md).
## Voraussetzungen
- IP-Symcon ab Version 8.0
+8
View File
@@ -19,6 +19,13 @@ Abmelden des WebHooks beim Löschen einer Instanz.
- erzeugt optional einen Schweizer QR-Zahlteil
- unterstützt den konfigurierbaren MWST-Ausweis
## Lizenzierung
Der Report benoetigt eine Grundlizenz. Zusaetzlich prueft das Modul getrennte
Kontingente fuer konfigurierte Stromzaehler und Nebenzaehler. Lizenzcodes werden
zur Laufzeit gegen `https://license.enelix.ch` geprueft; Zugangsdaten oder
Lizenzcodes werden nicht im Repository gespeichert.
## QR-Zahlteil
Der QR-Zahlteil verwendet strukturierte Adressen (`S`) nach SIX SPS 2.3.
@@ -30,6 +37,7 @@ Benutzer- und Zahlungsempfängeradresse benötigen Name, PLZ, Ort und ISO-2-Land
| Property | Beschreibung |
|---|---|
| `Lizenzcode` | Laufzeitparameter fuer die Freigabe am Lizenzdienst |
| `Users` | Benutzerliste |
| `PowerMeters` | Stromzählerliste |
| `WaterMeters` | Nebenkostenzähler |
+1
View File
@@ -2,6 +2,7 @@
"name": "belevo/enelix-utils",
"description": "Unabhaengige Zusatzmodule fuer IP-Symcon",
"type": "library",
"license": "proprietary",
"require": {
"php": ">=8.0"
},
@@ -7,6 +7,12 @@
Der Modulpräfix lautet `VKR`. Der Report wird über die Aktion `CreateReport`
erstellt und im Medium `ReportPDF` bereitgestellt.
## Lizenzierung
Die Freigabe besteht aus einer Grundlizenz und getrennten Kontingenten fuer
Stromzaehler und Nebenzaehler. Der konfigurierte Umfang darf die vom
Lizenzdienst bestaetigten Mengen nicht ueberschreiten.
## Variablen
| Technischer Ident / Anzeige | Typ / Zugriff | Beschreibung |
@@ -28,6 +34,7 @@ erstellt und im Medium `ReportPDF` bereitgestellt.
| Technischer Ident / Anzeige | Typ | Standard / Beschreibung |
| --- | --- | --- |
| `Lizenzcode` / Lizenzcode | String | leer; wird zur Laufzeit am Lizenzdienst geprueft. |
| `Users` / Benutzer | String/JSON | `[]`; Benutzerstruktur. |
| `PowerMeters` / Stromzähler | String/JSON | `[]`; Zuordnungen. |
| `WaterMeters` / Wasserzähler | String/JSON | `[]`; Zuordnungen. |
+9 -9
View File
@@ -43,7 +43,7 @@ werden, wenn sie vor dem Lauf nicht existierten.
- `affected`: die durch geänderte Pfade ermittelten Module
Verfügbare Module: `CC100Hardware`, `Energiediagramm`, `ShellyModul`,
`Verbrauchskostenreport`.
`VGTSchnittstelle`, `Verbrauchskostenreport` und `VirtuelleBatterie`.
Die Utils-Module werden jeweils eigenständig und ohne Abhängigkeit zu Enelix EMS getestet.
@@ -84,15 +84,15 @@ Zusätzlich schreibt der Runner die Zusammenfassung in das IP-Symcon-Log.
## CI-Regeln
Bei jedem Push laufen sämtliche PHPUnit-Tests. Auf `develop` werden zusätzlich
die von den geänderten Pfaden betroffenen Symcon-Modultests ausgeführt. Bei
gemeinsamen Framework- oder Vertragsänderungen läuft die vollständige Suite.
Für `beta` ist immer `all` vorgeschrieben.
Bei jedem Push laufen sämtliche PHPUnit-Tests und die PHP-Syntaxprüfung. Die
Symcon-Modultests werden bis zur Verfügbarkeit eines geschützten Runners auf
der isolierten IP-Symcon-8.0-Instanz des Agent-Servers ausgeführt. Vor jeder
Übernahme nach `beta` ist ein erfolgreicher Lauf im Modus `all` verbindlich.
Der erzeugte JSON- und JUnit-Bericht gehört zum Freigabenachweis.
Die Symcon-Jobs benötigen einen geschützten Runner mit dem Label `symcon-8`,
lokalem Zugriff auf eine isolierte IP-Symcon-8.x-Instanz und den installierten
Repository-Stand. Ohne diesen Runner ist die Richtlinie dokumentiert, aber
nicht technisch durchsetzbar.
Eine spätere CI-Automatisierung benötigt einen geschützten Runner mit dem Label
`symcon-8`, lokalem Zugriff auf die isolierte IP-Symcon-Instanz und den exakt
zu prüfenden Repository-Stand.
## Checkliste für neue Module
+2 -2
View File
@@ -7,6 +7,6 @@
"version": "8.0"
},
"version": "0.1",
"build": 0,
"date": 0
"build": 1,
"date": 1790662541
}
+8 -2
View File
@@ -49,11 +49,13 @@ final class EnergiediagrammModulstrukturTest extends TestCase
self::assertStringContainsString('__ENELIX_INITIAL_STATE__', $html);
self::assertStringContainsString('ResizeObserver', $html);
self::assertStringContainsString('grid-template-columns: minmax(0, 1fr)', $html);
self::assertStringContainsString('padding: 58px 14px 14px', $html);
self::assertStringContainsString('padding: 58px 10px 10px', $html);
self::assertStringContainsString('SetCustomRange', $html);
self::assertStringNotContainsString("addEventListener('load'", $html);
}
public function testModuleEmbedsInitialPayloadForTileAndPopup(): void
public function testModuleEmbedsInitialPayloadAndEnablesSupportedVisualization(): void
{
$module = file_get_contents(__DIR__ . '/../Energiediagramm/module.php');
self::assertNotFalse($module);
@@ -61,7 +63,11 @@ final class EnergiediagrammModulstrukturTest extends TestCase
"str_replace('__ENELIX_INITIAL_STATE__'",
$module
);
self::assertStringContainsString('GetVisualizationPopup', $module);
self::assertStringContainsString(
"version_compare(IPS_GetKernelVersion(), '9.0', '>=')",
$module
);
self::assertStringContainsString('SetVisualizationType($visualizationType)', $module);
self::assertStringContainsString('Standardzeitraum', $module);
self::assertStringContainsString('CustomStart', $module);
self::assertStringContainsString('CustomEnd', $module);
+13 -1
View File
@@ -110,9 +110,21 @@ final class EnergiediagrammTest extends TestCase
'#2F80ED',
EnergyChartCalculator::normalizeColor('#2f80ed', '#000000')
);
self::assertSame(
'#00FF4C',
EnergyChartCalculator::normalizeColor('65356', '#000000')
);
self::assertSame(
'#000000',
EnergyChartCalculator::normalizeColor('0', '#FFFFFF')
);
self::assertSame(
'#22A06B',
EnergyChartCalculator::normalizeColor('transparent', '#22a06b')
EnergyChartCalculator::normalizeColor('16777216', '#22a06b')
);
self::assertSame(
'#22A06B',
EnergyChartCalculator::normalizeColor('-1', '#22a06b')
);
}
}
+3
View File
@@ -16,6 +16,9 @@ final class LibraryMetadataTest extends TestCase
$daten = json_decode($inhalt, true, 512, JSON_THROW_ON_ERROR);
self::assertSame('Enelix Utils', $daten['name']);
self::assertSame('8.0', $daten['compatibility']['version']);
self::assertSame('0.1', $daten['version']);
self::assertSame(1, $daten['build']);
self::assertGreaterThan(0, $daten['date']);
self::assertMatchesRegularExpression('/^\{[0-9A-F-]{36}\}$/', $daten['id']);
}