This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Belevo\EnelixEMS\Tests;
|
||||
|
||||
use Belevo\EnelixEMS\WarmwasserRegler;
|
||||
use DateTimeImmutable;
|
||||
use DateTimeZone;
|
||||
use InvalidArgumentException;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
final class WarmwasserReglerTest extends TestCase
|
||||
{
|
||||
public function testLeistungsstufenWerdenValidiertUndAufsteigendSortiert(): void
|
||||
{
|
||||
$stufen = WarmwasserRegler::dekodiereLeistungsstufen(json_encode([
|
||||
['Stufe' => 2, 'Leistung' => 6000, 'Schaltkontakt_Stufe' => 102],
|
||||
['Stufe' => 1, 'Leistung' => 3000, 'Schaltkontakt_Stufe' => 101],
|
||||
], JSON_THROW_ON_ERROR));
|
||||
|
||||
self::assertSame(
|
||||
[
|
||||
['Stufe' => 1, 'Leistung_W' => 3000, 'KontaktID' => 101],
|
||||
['Stufe' => 2, 'Leistung_W' => 6000, 'KontaktID' => 102],
|
||||
],
|
||||
$stufen
|
||||
);
|
||||
self::assertSame([0, 3000, 6000], WarmwasserRegler::leistungswerte($stufen));
|
||||
self::assertSame(2, WarmwasserRegler::stufeFuerLeistung($stufen, 6000));
|
||||
self::assertSame(0, WarmwasserRegler::stufeFuerLeistung($stufen, 0));
|
||||
}
|
||||
|
||||
public function testDoppelteKontakteWerdenAbgewiesen(): void
|
||||
{
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
WarmwasserRegler::dekodiereLeistungsstufen(json_encode([
|
||||
['Stufe' => 1, 'Leistung' => 3000, 'Schaltkontakt_Stufe' => 101],
|
||||
['Stufe' => 2, 'Leistung' => 6000, 'Schaltkontakt_Stufe' => 101],
|
||||
], JSON_THROW_ON_ERROR));
|
||||
}
|
||||
|
||||
public function testNichtKonfigurierteSollleistungWirdAbgewiesen(): void
|
||||
{
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
WarmwasserRegler::stufeFuerLeistung([
|
||||
['Stufe' => 1, 'Leistung_W' => 3000, 'KontaktID' => 101],
|
||||
], 1500);
|
||||
}
|
||||
|
||||
public function testPt1VerwendetRegelintervallUndZeitkonstante(): void
|
||||
{
|
||||
self::assertEqualsWithDelta(20.4, WarmwasserRegler::pt1(20.0, 30.0, 5, 120), 0.001);
|
||||
}
|
||||
|
||||
public function testEnergieWirdInKWhBerechnet(): void
|
||||
{
|
||||
self::assertEqualsWithDelta(3.0, WarmwasserRegler::energieKWh(3000.0, 3600), 0.000001);
|
||||
}
|
||||
|
||||
public function testThermischePrognose(): void
|
||||
{
|
||||
self::assertTrue(WarmwasserRegler::kannZielErreichen(300.0, 50.0, 60.0, 7200, 3000));
|
||||
self::assertFalse(WarmwasserRegler::kannZielErreichen(300.0, 20.0, 60.0, 3600, 3000));
|
||||
}
|
||||
|
||||
public function testNaechsterZeitplaneintragIstHeuteOderMorgen(): void
|
||||
{
|
||||
$jetzt = new DateTimeImmutable('2026-09-16 10:00:00', new DateTimeZone('Europe/Zurich'));
|
||||
$eintrag = WarmwasserRegler::naechsterZeitplaneintrag(json_encode([
|
||||
['Uhrzeit' => '08:00', 'Solltemperatur' => 50],
|
||||
['Uhrzeit' => '11:00', 'Solltemperatur' => 55],
|
||||
], JSON_THROW_ON_ERROR), $jetzt);
|
||||
|
||||
self::assertNotNull($eintrag);
|
||||
self::assertSame(
|
||||
(new DateTimeImmutable('2026-09-16 11:00:00', new DateTimeZone('Europe/Zurich')))->getTimestamp(),
|
||||
$eintrag['Zeitpunkt']
|
||||
);
|
||||
self::assertSame(55.0, $eintrag['Solltemperatur']);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user