Files
Symcon_Belevo_Energiemanage…/Int_VGT/module.php
2025-11-13 10:17:01 +01:00

201 lines
6.3 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
declare(strict_types=1);
class Int_VGT extends IPSModule
{
public function Create()
{
parent::Create();
$this->RegisterPropertyString('DeviceID', '');
/** -------------------------------------------
* STATUS Variablen (schreibbar)
* ------------------------------------------*/
$this->RegisterVariableInteger('PowerProduction', 'Power Production', '', 10);
$this->EnableAction('PowerProduction');
$this->RegisterVariableBoolean('IsReady', 'Is Ready', '', 11);
$this->EnableAction('IsReady');
$this->RegisterVariableBoolean('IsRunning', 'Is Running', '', 12);
$this->EnableAction('IsRunning');
$this->RegisterVariableInteger('StateOfCharge', 'State of Charge', '', 13);
$this->EnableAction('StateOfCharge');
$this->RegisterVariableInteger('MinSOC', 'Min SOC', '', 14);
$this->EnableAction('MinSOC');
$this->RegisterVariableInteger('MaxSOC', 'Max SOC', '', 15);
$this->EnableAction('MaxSOC');
/** -------------------------------------------
* REMOTE CONTROL Variablen (read-only)
* ------------------------------------------*/
$this->RegisterVariableInteger('PowerSetpoint', 'Power Setpoint', '', 20);
$this->RegisterVariableString('Strategy', 'Strategy', '', 21);
// Debug
$this->RegisterVariableString('RemoteControlPayload', 'Remote Control Payload', '', 30);
/** -------------------------------------------
* FEEDBACK REQUEST Variablen (read-only)
* ------------------------------------------*/
$this->RegisterVariableString('FeedbackRequestPayload', 'Feedback Request Payload', '', 40);
/** -------------------------------------------
* MQTT SERVER verbinden
* ------------------------------------------*/
$this->ConnectParent('{C6D2AEB3-6E1F-4B2E-8E69-3A1A00246850}');
}
public function ApplyChanges()
{
parent::ApplyChanges();
$this->ConnectParent('{C6D2AEB3-6E1F-4B2E-8E69-3A1A00246850}');
$device = $this->ReadPropertyString('DeviceID');
if ($device === '') {
return;
}
// READ
$this->Subscribe("feedback-request/$device");
// WRITE
$this->Subscribe("remote-control-request/$device");
}
/** -------------------------------------------
* VARIABLE WRITE SUPPORT
* ------------------------------------------*/
public function RequestAction($Ident, $Value)
{
$this->SetValue($Ident, $Value);
}
/** -------------------------------------------
* MQTT SUBSCRIBE
* ------------------------------------------*/
private function Subscribe(string $topic): void
{
$packet = [
'PacketType' => 8,
'QualityOfService' => 0,
'Retain' => false,
'Topic' => $topic,
'Payload' => ''
];
$this->SendDataToParent(json_encode([
'DataID' => '{043EA491-0325-4ADD-8FC2-A30C8EEB4D3F}'
] + $packet));
}
/** -------------------------------------------
* MQTT PUBLISH
* ------------------------------------------*/
private function Publish(string $topic, string $payload): void
{
$packet = [
'PacketType' => 3,
'QualityOfService' => 0,
'Retain' => false,
'Topic' => $topic,
'Payload' => $payload
];
$this->SendDataToParent(json_encode([
'DataID' => '{043EA491-0325-4ADD-8FC2-A30C8EEB4D3F}'
] + $packet));
}
/** -------------------------------------------
* RECEIVE DATA
* ------------------------------------------*/
public function ReceiveData($JSONString)
{
$data = json_decode($JSONString, true);
if (!is_array($data)) return;
$topic = $data['Topic'] ?? '';
$payload = $data['Payload'] ?? '';
$device = $this->ReadPropertyString('DeviceID');
/** -------------------------------------------
* 1⃣ FEEDBACK REQUEST
* request: feedback-request/deviceId
* response: feedback-response/deviceId
* ------------------------------------------*/
if ($topic === "feedback-request/$device") {
// 1. Payload speichern
$this->SetValue('FeedbackRequestPayload', $payload);
// 2. JSON interpretieren (falls vorhanden)
$json = json_decode($payload, true);
if (!is_array($json)) {
$json = [];
}
// 3. Antwort-Mix erstellen (Payload + Status)
$response = array_merge($json, [
"power_production" => $this->GetValue('PowerProduction'),
"is_ready" => $this->GetValue('IsReady'),
"is_running" => $this->GetValue('IsRunning'),
"state_of_charge" => $this->GetValue('StateOfCharge'),
"min_soc" => $this->GetValue('MinSOC'),
"max_soc" => $this->GetValue('MaxSOC')
]);
// 4. Antwort senden
$this->Publish("feedback-response/$device", json_encode($response));
return;
}
/** -------------------------------------------
* 2⃣ REMOTE CONTROL REQUEST
* request: remote-control-request/deviceId
* response: remote-control-response/deviceId
* ------------------------------------------*/
if ($topic === "remote-control-request/$device") {
// 1. Payload speichern
$this->SetValue('RemoteControlPayload', $payload);
$json = json_decode($payload, true);
if (is_array($json)) {
if (array_key_exists('power_setpoint', $json)) {
$this->SetValue('PowerSetpoint', (int)$json['power_setpoint']);
}
if (array_key_exists('strategy', $json)) {
$this->SetValue('Strategy', (string)$json['strategy']);
}
}
// 2. Echo Response
$this->Publish("remote-control-response/$device", $payload);
return;
}
}
}