feat(manager): add gated short-lease V4 control trial and local fallback
This commit is contained in:
@@ -13,6 +13,7 @@ require_once __DIR__ . '/../libs/EnergieMessung.php';
|
||||
require_once __DIR__ . '/../libs/ManagerEnergieTrait.php';
|
||||
require_once __DIR__ . '/../libs/NetzfahrplanV4Betriebsdaten.php';
|
||||
require_once __DIR__ . '/../libs/ManagerNetzfahrplanV4Trait.php';
|
||||
require_once __DIR__ . '/../libs/ManagerNetzfahrplanV4TestTrait.php';
|
||||
|
||||
use Belevo\EnelixEMS\Anlagentopologie;
|
||||
use Belevo\EnelixEMS\EinspeiseRegler;
|
||||
@@ -28,6 +29,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
||||
{
|
||||
use ManagerEnergieTrait;
|
||||
use \Belevo\EnelixEMS\ManagerNetzfahrplanV4Trait;
|
||||
use \Belevo\EnelixEMS\ManagerNetzfahrplanV4TestTrait;
|
||||
|
||||
private const STATUS_AKTIV = 102;
|
||||
private const STATUS_MESSWERT_UNGUELTIG = 201;
|
||||
@@ -116,6 +118,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
||||
{
|
||||
parent::Create();
|
||||
$this->registriereNetzfahrplanV4();
|
||||
$this->registriereV4ManagerTest();
|
||||
|
||||
$this->RegisterPropertyInteger('Rolle', 0);
|
||||
$this->RegisterPropertyInteger('NetzleistungVariableID', 0);
|
||||
@@ -236,6 +239,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
||||
public function ApplyChanges(): void
|
||||
{
|
||||
parent::ApplyChanges();
|
||||
$this->v4ManagerTestAbbrechen('Manager neu initialisiert');
|
||||
$this->SetTimerInterval('NetzfahrplanV4Senden', 0);
|
||||
$this->stoppeNetzfahrplanV4Vorschau();
|
||||
|
||||
@@ -468,6 +472,14 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
||||
$this->aktualisiereNetzfahrplanV4Vorschau();
|
||||
return;
|
||||
|
||||
case 'NetzfahrplanV4TestStart':
|
||||
if (!is_string($wert)) throw new InvalidArgumentException('Explizite JSON-Testfreigabe erforderlich.');
|
||||
$this->V4ManagerTestStarten($wert);
|
||||
return;
|
||||
case 'NetzfahrplanV4TestStop':
|
||||
$this->V4ManagerTestStoppen();
|
||||
return;
|
||||
|
||||
case 'NetzfahrplanV4Senden':
|
||||
$this->sendeNetzfahrplanV4();
|
||||
return;
|
||||
@@ -703,6 +715,22 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
||||
}
|
||||
|
||||
private function regeln(bool $erneuern): void
|
||||
{
|
||||
$lock = 'ENELIX.V4.Control.' . $this->InstanceID;
|
||||
if (!IPS_SemaphoreEnter($lock, 0)) return;
|
||||
try {
|
||||
$this->regelnIntern($erneuern);
|
||||
if ($this->v4ManagerTestSession()
|
||||
&& (!$this->GetValue('Aktiv') || IPS_GetInstance($this->InstanceID)['InstanceStatus'] !== self::STATUS_AKTIV)) {
|
||||
$this->v4ManagerTestAbbrechen('Manager nicht mehr betriebsbereit');
|
||||
}
|
||||
} catch (Throwable $e) {
|
||||
$this->v4ManagerTestAbbrechen('Regelungsfehler');
|
||||
throw $e;
|
||||
} finally { IPS_SemaphoreLeave($lock); }
|
||||
}
|
||||
|
||||
private function regelnIntern(bool $erneuern): void
|
||||
{
|
||||
if (!$this->aktualisiereLizenzfreigabe($this->ReadPropertyString('Lizenzcode'), false)) {
|
||||
$this->SetValue('Betriebsart', ManagerRegler::BETRIEBSART_INAKTIV);
|
||||
@@ -807,6 +835,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
||||
: $this->nichtGeregelteGeraeteText($nichtGeregelt)
|
||||
);
|
||||
|
||||
$this->v4ManagerTestUebergabe($ergebnis, $verbraucher, $synchronisiert);
|
||||
$letzteSollwerte = $this->leseJsonAttribut('LetzteSollwerte');
|
||||
foreach ($ergebnis['Sollwerte'] as $instanzID => $sollleistung) {
|
||||
if (!$erneuern && ($letzteSollwerte[(string) $instanzID] ?? null) === $sollleistung) {
|
||||
@@ -816,6 +845,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
||||
$this->sendeManagerdaten((int) $instanzID, $betriebsart, $sollleistung);
|
||||
$letzteSollwerte[(string) $instanzID] = $sollleistung;
|
||||
} catch (Throwable $fehler) {
|
||||
$this->v4ManagerTestAbbrechen('Andere Verbraucher-Stellwertuebergabe fehlgeschlagen');
|
||||
$stoerungen[] = 'Sollwert an Instanz ' . $instanzID . ': ' . $fehler->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user