This commit is contained in:
@@ -14,8 +14,6 @@ final class DokumentationsstrukturTest extends TestCase
|
||||
return [
|
||||
['Batterie'],
|
||||
['Waermepumpe'],
|
||||
['Ladestation-Gateway'],
|
||||
['Easee-Gateway'],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -48,9 +46,23 @@ final class DokumentationsstrukturTest extends TestCase
|
||||
self::assertStringContainsString('Fake-HTTP-Transport', $inhalt);
|
||||
}
|
||||
|
||||
public function testEaseeModuleDokumentierenDenImplementiertenStand(): void
|
||||
{
|
||||
foreach (['Easee-Gateway', 'Ladestation-Gateway'] as $modul) {
|
||||
$inhalt = file_get_contents(
|
||||
__DIR__ . '/../docs/module/' . $modul . '/README.md'
|
||||
);
|
||||
self::assertNotFalse($inhalt);
|
||||
self::assertStringContainsString('Status: implementiert', $inhalt);
|
||||
self::assertStringContainsString('Properties', $inhalt);
|
||||
self::assertStringContainsString('Tests', $inhalt);
|
||||
}
|
||||
}
|
||||
|
||||
public function testSchnittstellenDokumentiertSind(): void
|
||||
{
|
||||
self::assertFileExists(__DIR__ . '/../docs/Schnittstelle.md');
|
||||
self::assertFileExists(__DIR__ . '/../docs/Schnittstelle-Easee-Gateway.md');
|
||||
self::assertFileExists(__DIR__ . '/../docs/Obere-Anschluesse.md');
|
||||
self::assertFileExists(__DIR__ . '/../libs/VerbraucherBasisTrait.php');
|
||||
}
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Belevo\EnelixEMS\Tests;
|
||||
|
||||
use Belevo\EnelixEMS\EaseeGatewayProtokoll;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
final class EaseeGatewayProtokollTest extends TestCase
|
||||
{
|
||||
public function testVerschachtelteSignalRBeobachtungenWerdenExtrahiert(): void
|
||||
{
|
||||
$beobachtungen = EaseeGatewayProtokoll::extrahiereBeobachtungen([
|
||||
'arguments' => [
|
||||
'EH123456',
|
||||
[
|
||||
['id' => 109, 'value' => 3],
|
||||
['ObservationId' => 110, 'Value' => 30],
|
||||
],
|
||||
],
|
||||
], ['EH123456']);
|
||||
|
||||
self::assertSame([
|
||||
['Seriennummer' => 'EH123456', 'ID' => 109, 'Wert' => 3],
|
||||
['Seriennummer' => 'EH123456', 'ID' => 110, 'Wert' => 30],
|
||||
], $beobachtungen);
|
||||
}
|
||||
|
||||
public function testNichtAbonnierteStationenUndUnbekannteIdsWerdenIgnoriert(): void
|
||||
{
|
||||
$beobachtungen = EaseeGatewayProtokoll::extrahiereBeobachtungen([
|
||||
[
|
||||
'serialNumber' => 'EH999999',
|
||||
'id' => 109,
|
||||
'value' => 3,
|
||||
],
|
||||
[
|
||||
'serialNumber' => 'EH123456',
|
||||
'id' => 999,
|
||||
'value' => 1,
|
||||
],
|
||||
], ['EH123456']);
|
||||
|
||||
self::assertSame([], $beobachtungen);
|
||||
}
|
||||
|
||||
public function testSeriennummerWirdNormalisiert(): void
|
||||
{
|
||||
self::assertSame(
|
||||
'EH123456',
|
||||
EaseeGatewayProtokoll::seriennummer(' eh123456 ')
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Belevo\EnelixEMS\Tests;
|
||||
|
||||
use Belevo\EnelixEMS\EaseeLadestatus;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
final class EaseeLadestatusTest extends TestCase
|
||||
{
|
||||
public function testFahrzeugUndEinphasigesLadenKommenDirektAusApiWerten(): void
|
||||
{
|
||||
$status = EaseeLadestatus::ausBeobachtungen([
|
||||
'109' => 3,
|
||||
'110' => 10,
|
||||
'120' => 2.3,
|
||||
'182' => 10.1,
|
||||
], 16);
|
||||
|
||||
self::assertTrue($status['FahrzeugVerbunden']);
|
||||
self::assertFalse($status['FahrzeugGeladen']);
|
||||
self::assertSame(3, $status['Fahrzeugstatus']);
|
||||
self::assertSame(1, $status['Phasenzahl']);
|
||||
self::assertEqualsWithDelta(2300.0, $status['Istleistung_W'], 0.01);
|
||||
self::assertEqualsWithDelta(10.1, $status['Ladestrom_A'], 0.01);
|
||||
}
|
||||
|
||||
public function testDreiphasigesLadenWirdNichtAusLeistungGeschaetzt(): void
|
||||
{
|
||||
$status = EaseeLadestatus::ausBeobachtungen([
|
||||
'109' => 3,
|
||||
'110' => 30,
|
||||
'120' => 1.0,
|
||||
'182' => 2.0,
|
||||
'183' => 2.2,
|
||||
'184' => 2.1,
|
||||
], 32);
|
||||
|
||||
self::assertSame(3, $status['Phasenzahl']);
|
||||
self::assertEqualsWithDelta(2.2, $status['Ladestrom_A'], 0.01);
|
||||
}
|
||||
|
||||
public function testZweiphasigerApiWertWirdNichtAlsEinOderDreiGeschaetzt(): void
|
||||
{
|
||||
$status = EaseeLadestatus::ausBeobachtungen([
|
||||
'109' => 3,
|
||||
'110' => 20,
|
||||
'120' => 4.6,
|
||||
], 16);
|
||||
|
||||
self::assertSame(0, $status['Phasenzahl']);
|
||||
}
|
||||
|
||||
public function testGetrenntUndGeladenFolgenDemEaseeBetriebszustand(): void
|
||||
{
|
||||
$getrennt = EaseeLadestatus::ausBeobachtungen(['109' => 1, '110' => 30], 16);
|
||||
$geladen = EaseeLadestatus::ausBeobachtungen(['109' => 4, '110' => 30], 16);
|
||||
|
||||
self::assertFalse($getrennt['FahrzeugVerbunden']);
|
||||
self::assertSame(0, $getrennt['Phasenzahl']);
|
||||
self::assertTrue($geladen['FahrzeugVerbunden']);
|
||||
self::assertTrue($geladen['FahrzeugGeladen']);
|
||||
self::assertSame(4, $geladen['Fahrzeugstatus']);
|
||||
}
|
||||
|
||||
public function testUnbekannterApiBetriebszustandGibtRegelungNichtFrei(): void
|
||||
{
|
||||
$status = EaseeLadestatus::ausBeobachtungen([
|
||||
'109' => 99,
|
||||
'110' => 30,
|
||||
], 16);
|
||||
|
||||
self::assertFalse($status['StatusGueltig']);
|
||||
self::assertFalse($status['FahrzeugVerbunden']);
|
||||
self::assertSame(0, $status['Fahrzeugstatus']);
|
||||
self::assertSame(0, $status['Phasenzahl']);
|
||||
}
|
||||
|
||||
public function testApiUndKabelgrenzenBegrenzenDenKonfiguriertenStrom(): void
|
||||
{
|
||||
$status = EaseeLadestatus::ausBeobachtungen([
|
||||
'109' => 2,
|
||||
'110' => 10,
|
||||
'47' => 25.0,
|
||||
'104' => 13.7,
|
||||
], 32);
|
||||
|
||||
self::assertSame(13, $status['ApiMaximalstrom_A']);
|
||||
}
|
||||
|
||||
public function testNurSolarladenIstFestErzwungen(): void
|
||||
{
|
||||
self::assertFalse(EaseeLadestatus::solarladenErzwungen(0));
|
||||
self::assertTrue(EaseeLadestatus::solarladenErzwungen(1));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Belevo\EnelixEMS\Tests;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
final class EaseeModuleStrukturTest extends TestCase
|
||||
{
|
||||
public function testGatewayUndLadestationSindVollstaendigeModule(): void
|
||||
{
|
||||
foreach (['EaseeGateway', 'LadestationGateway'] as $modul) {
|
||||
foreach (['module.json', 'form.json', 'module.php'] as $datei) {
|
||||
self::assertFileExists(__DIR__ . '/../' . $modul . '/' . $datei);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function testDatenSchnittstellenPassenZusammen(): void
|
||||
{
|
||||
$gateway = $this->module('EaseeGateway');
|
||||
$ladestation = $this->module('LadestationGateway');
|
||||
|
||||
self::assertContains(
|
||||
'{7AEF3DF7-DA5B-47C5-BCDC-0110D06DDC04}',
|
||||
$gateway['implemented']
|
||||
);
|
||||
self::assertContains(
|
||||
'{107D5CFA-8F3D-4E38-8643-90DDFE6A3B4D}',
|
||||
$gateway['childRequirements']
|
||||
);
|
||||
self::assertContains(
|
||||
'{7AEF3DF7-DA5B-47C5-BCDC-0110D06DDC04}',
|
||||
$ladestation['parentRequirements']
|
||||
);
|
||||
self::assertContains(
|
||||
'{107D5CFA-8F3D-4E38-8643-90DDFE6A3B4D}',
|
||||
$ladestation['implemented']
|
||||
);
|
||||
}
|
||||
|
||||
public function testZugangsdatenLiegenNurImGateway(): void
|
||||
{
|
||||
$gatewayForm = (string) file_get_contents(
|
||||
__DIR__ . '/../EaseeGateway/form.json'
|
||||
);
|
||||
$ladestationForm = (string) file_get_contents(
|
||||
__DIR__ . '/../LadestationGateway/form.json'
|
||||
);
|
||||
|
||||
self::assertStringContainsString('PasswordTextBox', $gatewayForm);
|
||||
self::assertStringNotContainsString('PasswordTextBox', $ladestationForm);
|
||||
self::assertStringNotContainsString('Username', $ladestationForm);
|
||||
}
|
||||
|
||||
public function testLadestationVerwendetApiStatusUndGemeinsamenVertrag(): void
|
||||
{
|
||||
$modul = (string) file_get_contents(
|
||||
__DIR__ . '/../LadestationGateway/module.php'
|
||||
);
|
||||
|
||||
self::assertStringContainsString('implements VerbraucherSchnittstelle', $modul);
|
||||
self::assertStringContainsString('EaseeLadestatus::ausBeobachtungen', $modul);
|
||||
self::assertStringContainsString("'FahrzeugVerbunden'", $modul);
|
||||
self::assertStringContainsString("'Phasenzahl'", $modul);
|
||||
self::assertStringNotContainsString('7500', $modul);
|
||||
self::assertStringNotContainsString('Abfrageintervall', $modul);
|
||||
}
|
||||
|
||||
/** @return array<string, mixed> */
|
||||
private function module(string $name): array
|
||||
{
|
||||
return json_decode(
|
||||
(string) file_get_contents(__DIR__ . '/../' . $name . '/module.json'),
|
||||
true,
|
||||
512,
|
||||
JSON_THROW_ON_ERROR
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,25 @@
|
||||
declare(strict_types=1);
|
||||
|
||||
return [
|
||||
'EaseeGateway' => [
|
||||
'file' => __DIR__ . '/modules/EaseeGateway.php',
|
||||
'paths' => [
|
||||
'EaseeGateway/*',
|
||||
'libs/EaseeGatewayProtokoll.php',
|
||||
],
|
||||
],
|
||||
'LadestationGateway' => [
|
||||
'file' => __DIR__ . '/modules/LadestationGateway.php',
|
||||
'paths' => [
|
||||
'LadestationGateway/*',
|
||||
'libs/EaseeGatewayProtokoll.php',
|
||||
'libs/EaseeLadestatus.php',
|
||||
'libs/LadestationRegler.php',
|
||||
'libs/VerbraucherBasisTrait.php',
|
||||
'libs/VerbraucherSchnittstelle.php',
|
||||
'libs/Nachrichtenvertrag.php',
|
||||
],
|
||||
],
|
||||
'LadestationStandAlone' => [
|
||||
'file' => __DIR__ . '/modules/LadestationStandAlone.php',
|
||||
'paths' => [
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Belevo\EnelixEMS\SymconTest\TestContext;
|
||||
|
||||
return static function (TestContext $test): void {
|
||||
$gateway = $test->createInstance(
|
||||
'{B7552FC9-87BC-49D0-8CCB-076BBB045BBE}',
|
||||
'Easee Gateway Test',
|
||||
[
|
||||
'Active' => true,
|
||||
'Testmodus' => true,
|
||||
]
|
||||
);
|
||||
|
||||
$test->runCase('Testgateway ist ohne Zugangsdaten aktiv', static function (
|
||||
TestContext $test
|
||||
) use ($gateway): void {
|
||||
$test->assertInstanceStatus($gateway);
|
||||
$test->assertSame(
|
||||
true,
|
||||
GetValue($test->objectByIdent('Connected', $gateway))
|
||||
);
|
||||
});
|
||||
|
||||
$test->runCase('Abonnement liefert injizierten API-Zustand', static function (
|
||||
TestContext $test
|
||||
) use ($gateway): void {
|
||||
ENELIXEASEE_ProcessStationRequest($gateway, json_encode([
|
||||
'action' => 'Subscribe',
|
||||
'serialNumber' => 'EH123456',
|
||||
], JSON_THROW_ON_ERROR));
|
||||
foreach ([109 => 3, 110 => 30, 120 => 1.0] as $id => $value) {
|
||||
IPS_RequestAction($gateway, 'TestObservation', json_encode([
|
||||
'serialNumber' => 'EH123456',
|
||||
'id' => $id,
|
||||
'value' => $value,
|
||||
], JSON_THROW_ON_ERROR));
|
||||
}
|
||||
|
||||
$antwort = json_decode(ENELIXEASEE_ProcessStationRequest(
|
||||
$gateway,
|
||||
json_encode([
|
||||
'action' => 'GetState',
|
||||
'serialNumber' => 'EH123456',
|
||||
], JSON_THROW_ON_ERROR)
|
||||
), true, 512, JSON_THROW_ON_ERROR);
|
||||
|
||||
$test->assertSame(true, $antwort['success']);
|
||||
$test->assertSame(3, $antwort['state']['109']);
|
||||
$test->assertSame(30, $antwort['state']['110']);
|
||||
$test->assertSame(
|
||||
1,
|
||||
GetValue($test->objectByIdent('SubscriptionCount', $gateway))
|
||||
);
|
||||
});
|
||||
|
||||
$test->runCase('Stromvorgabe wird ueber Gateway angenommen', static function (
|
||||
TestContext $test
|
||||
) use ($gateway): void {
|
||||
$antwort = json_decode(ENELIXEASEE_ProcessStationRequest(
|
||||
$gateway,
|
||||
json_encode([
|
||||
'action' => 'SetDynamicChargerCurrent',
|
||||
'serialNumber' => 'EH123456',
|
||||
'amps' => 13,
|
||||
], JSON_THROW_ON_ERROR)
|
||||
), true, 512, JSON_THROW_ON_ERROR);
|
||||
|
||||
$test->assertSame(true, $antwort['success']);
|
||||
$test->assertSame(200, $antwort['httpCode']);
|
||||
});
|
||||
|
||||
$test->runCase('Gebrochene Stromvorgabe wird abgelehnt', static function (
|
||||
TestContext $test
|
||||
) use ($gateway): void {
|
||||
$antwort = json_decode(ENELIXEASEE_ProcessStationRequest(
|
||||
$gateway,
|
||||
json_encode([
|
||||
'action' => 'SetDynamicChargerCurrent',
|
||||
'serialNumber' => 'EH123456',
|
||||
'amps' => 6.5,
|
||||
], JSON_THROW_ON_ERROR)
|
||||
), true, 512, JSON_THROW_ON_ERROR);
|
||||
|
||||
$test->assertSame(false, $antwort['success']);
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,155 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Belevo\EnelixEMS\SymconTest\TestContext;
|
||||
|
||||
return static function (TestContext $test): void {
|
||||
$gateway = $test->createInstance(
|
||||
'{B7552FC9-87BC-49D0-8CCB-076BBB045BBE}',
|
||||
'Easee Gateway fuer Ladestation',
|
||||
[
|
||||
'Active' => true,
|
||||
'Testmodus' => true,
|
||||
]
|
||||
);
|
||||
$station = $test->createInstance(
|
||||
'{32F65988-BE55-4FD6-9FFF-CF1C4C8628F8}',
|
||||
'Easee Ladestation',
|
||||
[
|
||||
'Betriebsmodus' => 0,
|
||||
'Ladestationskennung' => 'EH123456',
|
||||
'MaximalerLadestrom' => 16,
|
||||
'Ladefreigabe' => true,
|
||||
'Solarladen' => true,
|
||||
'EinstellungenInVisu' => true,
|
||||
'DiagnosevariablenAnzeigen' => true,
|
||||
]
|
||||
);
|
||||
IPS_ConnectInstance($station, $gateway);
|
||||
IPS_ApplyChanges($station);
|
||||
|
||||
$nurSolar = $test->createInstance(
|
||||
'{32F65988-BE55-4FD6-9FFF-CF1C4C8628F8}',
|
||||
'Easee nur Solarladen',
|
||||
[
|
||||
'Betriebsmodus' => 1,
|
||||
'Ladestationskennung' => 'EH654321',
|
||||
'MaximalerLadestrom' => 16,
|
||||
'Ladefreigabe' => true,
|
||||
'Solarladen' => false,
|
||||
'EinstellungenInVisu' => true,
|
||||
'DiagnosevariablenAnzeigen' => true,
|
||||
]
|
||||
);
|
||||
IPS_ConnectInstance($nurSolar, $gateway);
|
||||
IPS_ApplyChanges($nurSolar);
|
||||
|
||||
$sendeBeobachtung = static function (
|
||||
string $seriennummer,
|
||||
int $id,
|
||||
$value
|
||||
) use ($gateway): void {
|
||||
IPS_RequestAction($gateway, 'TestObservation', json_encode([
|
||||
'serialNumber' => $seriennummer,
|
||||
'id' => $id,
|
||||
'value' => $value,
|
||||
], JSON_THROW_ON_ERROR));
|
||||
};
|
||||
|
||||
foreach (['EH123456', 'EH654321'] as $seriennummer) {
|
||||
$sendeBeobachtung($seriennummer, 47, 16.0);
|
||||
$sendeBeobachtung($seriennummer, 104, 32.0);
|
||||
$sendeBeobachtung($seriennummer, 109, 3);
|
||||
$sendeBeobachtung($seriennummer, 110, 30);
|
||||
$sendeBeobachtung($seriennummer, 120, 1.0);
|
||||
$sendeBeobachtung($seriennummer, 182, 2.1);
|
||||
$sendeBeobachtung($seriennummer, 183, 2.0);
|
||||
$sendeBeobachtung($seriennummer, 184, 2.2);
|
||||
}
|
||||
|
||||
$test->runCase('Fahrzeug und drei Phasen folgen direkt den API-Ereignissen', static function (
|
||||
TestContext $test
|
||||
) use ($station): void {
|
||||
$test->assertSame(
|
||||
true,
|
||||
GetValue($test->objectByIdent('FahrzeugVerbunden', $station))
|
||||
);
|
||||
$test->assertSame(
|
||||
3,
|
||||
GetValue($test->objectByIdent('Phasenzahl', $station))
|
||||
);
|
||||
$test->assertSame(
|
||||
3,
|
||||
GetValue($test->objectByIdent('Fahrzeugstatus', $station))
|
||||
);
|
||||
$test->assertEquals(
|
||||
2.2,
|
||||
(float) GetValue($test->objectByIdent('Ladestrom', $station)),
|
||||
0.01
|
||||
);
|
||||
});
|
||||
|
||||
$test->runCase('Event erzeugt ohne Polling ein dreiphasiges Leistungsangebot', static function (
|
||||
TestContext $test
|
||||
) use ($station): void {
|
||||
IPS_RequestAction($station, 'Aktiv', true);
|
||||
$test->assertSame(
|
||||
'[0,4150,4850,5550,6250,6950,7600,8300,9000,9700,10300,11000]',
|
||||
(string) GetValue(
|
||||
$test->objectByIdent('LeistungsangebotDiagnose', $station)
|
||||
)
|
||||
);
|
||||
$test->assertTrue(str_contains(
|
||||
(string) GetValue(
|
||||
$test->objectByIdent('LetzterGeraetebefehl', $station)
|
||||
),
|
||||
'"Ampere":0'
|
||||
));
|
||||
});
|
||||
|
||||
$test->runCase('Nur-Solar-Variante laesst Solarladen nicht abschalten', static function (
|
||||
TestContext $test
|
||||
) use ($nurSolar): void {
|
||||
IPS_RequestAction($nurSolar, 'Solarladen', false);
|
||||
$test->assertSame(
|
||||
true,
|
||||
GetValue($test->objectByIdent('Solarladen', $nurSolar))
|
||||
);
|
||||
});
|
||||
|
||||
$test->runCase('Unbekannter API-Status sperrt die Regelung', static function (
|
||||
TestContext $test
|
||||
) use ($sendeBeobachtung, $station): void {
|
||||
$sendeBeobachtung('EH123456', 109, 99);
|
||||
$test->assertSame(
|
||||
false,
|
||||
GetValue($test->objectByIdent('FahrzeugVerbunden', $station))
|
||||
);
|
||||
$test->assertInstanceStatus($station, 203);
|
||||
|
||||
$sendeBeobachtung('EH123456', 109, 3);
|
||||
$test->assertSame(
|
||||
true,
|
||||
GetValue($test->objectByIdent('FahrzeugVerbunden', $station))
|
||||
);
|
||||
$test->assertInstanceStatus($station);
|
||||
});
|
||||
|
||||
$test->runCase('Gateway-Ausfall verwirft Fahrzeug- und Phasenstatus', static function (
|
||||
TestContext $test
|
||||
) use ($gateway, $station): void {
|
||||
IPS_SetProperty($gateway, 'Active', false);
|
||||
IPS_ApplyChanges($gateway);
|
||||
|
||||
$test->assertSame(
|
||||
false,
|
||||
GetValue($test->objectByIdent('FahrzeugVerbunden', $station))
|
||||
);
|
||||
$test->assertSame(
|
||||
0,
|
||||
GetValue($test->objectByIdent('Phasenzahl', $station))
|
||||
);
|
||||
$test->assertInstanceStatus($station, 202);
|
||||
});
|
||||
};
|
||||
@@ -58,7 +58,14 @@ final class SymconTestContractTest extends TestCase
|
||||
public function testAffectedModuleResolverSelectsAllMatches(): void
|
||||
{
|
||||
self::assertSame(
|
||||
['LadestationStandAlone', 'Manager', 'Pufferspeicher', 'VerbraucherEinStufig', 'Warmwassererwaermer'],
|
||||
[
|
||||
'LadestationGateway',
|
||||
'LadestationStandAlone',
|
||||
'Manager',
|
||||
'Pufferspeicher',
|
||||
'VerbraucherEinStufig',
|
||||
'Warmwassererwaermer',
|
||||
],
|
||||
$this->resolveAffectedModules(['libs/Nachrichtenvertrag.php'])
|
||||
);
|
||||
}
|
||||
@@ -74,7 +81,15 @@ final class SymconTestContractTest extends TestCase
|
||||
public function testAffectedModuleResolverSelectsAllModulesForFrameworkChanges(): void
|
||||
{
|
||||
self::assertSame(
|
||||
['LadestationStandAlone', 'Manager', 'Pufferspeicher', 'VerbraucherEinStufig', 'Warmwassererwaermer'],
|
||||
[
|
||||
'EaseeGateway',
|
||||
'LadestationGateway',
|
||||
'LadestationStandAlone',
|
||||
'Manager',
|
||||
'Pufferspeicher',
|
||||
'VerbraucherEinStufig',
|
||||
'Warmwassererwaermer',
|
||||
],
|
||||
$this->resolveAffectedModules(['tests/Symcon/TestContext.php'])
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user