This commit is contained in:
@@ -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
@@ -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,
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user