fix(easee): Initialstatus der Ladestation laden
Tests / test (push) Successful in 48s

This commit is contained in:
dh
2026-09-29 07:55:31 +00:00
parent 18c34b32e7
commit 6f76e6cd86
3 changed files with 88 additions and 10 deletions
+1
View File
@@ -17,6 +17,7 @@ Alle wesentlichen Aenderungen an Enelix EMS werden in dieser Datei dokumentiert.
- Stufenlose Leistungsbereiche fuer Batteriespeicher. - Stufenlose Leistungsbereiche fuer Batteriespeicher.
- Ladefreigabe neuer Ladestationsinstanzen standardmaessig aktiviert. - Ladefreigabe neuer Ladestationsinstanzen standardmaessig aktiviert.
- Easee-Ladestationen laden einen fehlenden Initialstatus ueber die Observations-API nach.
- Vollstaendige PHP-, Struktur- und Symcon-Modultests fuer alle Module. - Vollstaendige PHP-, Struktur- und Symcon-Modultests fuer alle Module.
### Hinweise ### Hinweise
+74 -10
View File
@@ -530,6 +530,25 @@ class EaseeGateway extends IPSModule
return; return;
} }
$this->speichereBeobachtungImCache($seriennummer, $id, $wert);
$this->SendDataToChildren(json_encode([
'DataID' => self::CHILD_EVENT_DATA_ID,
'Buffer' => json_encode([
'type' => 'Observation',
'serialNumber' => $seriennummer,
'id' => $id,
'value' => $wert,
'timestamp' => time(),
], JSON_THROW_ON_ERROR),
], JSON_THROW_ON_ERROR));
}
private function speichereBeobachtungImCache(
string $seriennummer,
int $id,
$wert
): void {
$cache = $this->leseAttributArray('ObservationCache'); $cache = $this->leseAttributArray('ObservationCache');
if (!isset($cache[$seriennummer]) || !is_array($cache[$seriennummer])) { if (!isset($cache[$seriennummer]) || !is_array($cache[$seriennummer])) {
$cache[$seriennummer] = []; $cache[$seriennummer] = [];
@@ -545,21 +564,66 @@ class EaseeGateway extends IPSModule
'ObservationCache', 'ObservationCache',
json_encode($cache, JSON_THROW_ON_ERROR) json_encode($cache, JSON_THROW_ON_ERROR)
); );
}
$this->SendDataToChildren(json_encode([ private function stelleAktuellenStatusSicher(string $seriennummer): void
'DataID' => self::CHILD_EVENT_DATA_ID, {
'Buffer' => json_encode([ $cache = $this->leseAttributArray('ObservationCache');
'type' => 'Observation', $zustand = $cache[$seriennummer] ?? [];
'serialNumber' => $seriennummer, if (
'id' => $id, (is_array($zustand) && array_key_exists('109', $zustand))
'value' => $wert, || $this->ReadPropertyBoolean('Testmodus')
'timestamp' => time(), || $this->GetBuffer('SignalRReady') !== '1'
], JSON_THROW_ON_ERROR), ) {
], JSON_THROW_ON_ERROR)); return;
}
$antwort = $this->autorisierteApiAnfrage(
'GET',
'/state/' . rawurlencode($seriennummer) . '/observations?ids='
. rawurlencode(implode(',', EaseeGatewayProtokoll::BEOBACHTUNGEN)),
''
);
if (!($antwort['success'] ?? false)) {
$this->setzeLetztenFehler(
'Easee-Status konnte nicht geladen werden: '
. (string) ($antwort['error'] ?? 'Unbekannter API-Fehler.')
);
return;
}
$daten = json_decode((string) ($antwort['body'] ?? ''), true);
if (!is_array($daten)) {
$this->setzeLetztenFehler('Easee-Statusantwort ist ungueltig.');
return;
}
$beobachtungen = EaseeGatewayProtokoll::extrahiereBeobachtungen(
$daten,
[$seriennummer],
$seriennummer
);
$betriebsstatusGeladen = false;
foreach ($beobachtungen as $beobachtung) {
$this->speichereBeobachtungImCache(
$beobachtung['Seriennummer'],
$beobachtung['ID'],
$beobachtung['Wert']
);
$betriebsstatusGeladen = $betriebsstatusGeladen
|| $beobachtung['ID'] === 109;
}
if (!$betriebsstatusGeladen) {
$this->setzeLetztenFehler(
'Easee-Statusantwort enthaelt keinen Betriebsstatus (109).'
);
return;
}
$this->setzeLetztenFehler('');
} }
private function erstelleStatusantwort(string $seriennummer): string private function erstelleStatusantwort(string $seriennummer): string
{ {
$this->stelleAktuellenStatusSicher($seriennummer);
$cache = $this->leseAttributArray('ObservationCache'); $cache = $this->leseAttributArray('ObservationCache');
return json_encode([ return json_encode([
'success' => true, 'success' => true,
+13
View File
@@ -45,6 +45,19 @@ final class EaseeGatewayProtokollTest extends TestCase
self::assertSame([], $beobachtungen); self::assertSame([], $beobachtungen);
} }
public function testRestBeobachtungenVerwendenAngefragteSeriennummer(): void
{
$beobachtungen = EaseeGatewayProtokoll::extrahiereBeobachtungen([
['id' => 109, 'value' => 1],
['observationId' => 110, 'value' => 30],
], ['EU2FGKEU'], 'EU2FGKEU');
self::assertSame([
['Seriennummer' => 'EU2FGKEU', 'ID' => 109, 'Wert' => 1],
['Seriennummer' => 'EU2FGKEU', 'ID' => 110, 'Wert' => 30],
], $beobachtungen);
}
public function testSeriennummerWirdNormalisiert(): void public function testSeriennummerWirdNormalisiert(): void
{ {
self::assertSame( self::assertSame(