no message
This commit is contained in:
@@ -10,6 +10,7 @@ declare(strict_types=1);
|
||||
* - Signed/Unsigned pro Register wählbar.
|
||||
* - Liest 32/64-Bit-Werte registerweise einzeln und setzt anschließend zusammen.
|
||||
* - Gelöschte Register-Variablen werden entfernt.
|
||||
* - Debug-Logs zeigen Raw-Response, um Slice-Position zu prüfen.
|
||||
*/
|
||||
class SofarWechselrichter extends IPSModule
|
||||
{
|
||||
@@ -100,6 +101,8 @@ class SofarWechselrichter extends IPSModule
|
||||
*/
|
||||
private function Query(): void
|
||||
{
|
||||
$this->LogMessage('Query invoked', KL_MESSAGE);
|
||||
|
||||
$ip = trim($this->ReadPropertyString('IPAddress'));
|
||||
$loggerNumberStr = trim($this->ReadPropertyString('LoggerNumber'));
|
||||
|
||||
@@ -125,10 +128,10 @@ class SofarWechselrichter extends IPSModule
|
||||
foreach ($registers as $entry) {
|
||||
$regNo = (int) $entry['RegisterNumber'];
|
||||
$label = trim((string)$entry['Label']);
|
||||
$scale = (string) $entry['ScalingFactor']; // kann negativ sein
|
||||
$scale = (string) $entry['ScalingFactor']; // kann negativ sein
|
||||
$endian = strtoupper(trim((string)$entry['Endian']));
|
||||
$bitLength = (int) $entry['BitLength']; // 16, 32 oder 64
|
||||
$signedness = trim((string)$entry['Signedness']); // "Signed" oder "Unsigned"
|
||||
$bitLength = (int) $entry['BitLength']; // 16, 32 oder 64
|
||||
$signedness = trim((string)$entry['Signedness']); // "Signed" oder "Unsigned"
|
||||
$ident = 'Reg' . $regNo;
|
||||
|
||||
if ($regNo < 0 || $label === '' || !in_array($bitLength, [16, 32, 64])) {
|
||||
@@ -140,16 +143,21 @@ class SofarWechselrichter extends IPSModule
|
||||
// Bytes registerweise einzeln abfragen und zusammenfügen:
|
||||
$dataBytes = '';
|
||||
for ($i = 0; $i < $numRegs; $i++) {
|
||||
$dataBytes .= $this->readSingleRegister($ip, $loggerNumberStr, $regNo + $i);
|
||||
$chunk = $this->readSingleRegister($ip, $loggerNumberStr, $regNo + $i);
|
||||
$dataBytes .= $chunk;
|
||||
}
|
||||
// Nun liegen 2 * $numRegs Bytes in $dataBytes
|
||||
$hex = strtoupper(bin2hex($dataBytes));
|
||||
// Debug: raw combined response hex
|
||||
$combinedHex = strtoupper(bin2hex($dataBytes));
|
||||
$this->LogMessage("Raw data for Reg {$regNo} ({$bitLength}bit): {$combinedHex}", KL_MESSAGE);
|
||||
|
||||
// Endian-Handling: falls LE, kehre gesamte Byte-Reihenfolge um
|
||||
if ($endian === 'LE') {
|
||||
$hex = $this->reverseByteOrder($hex);
|
||||
$combinedHex = $this->reverseByteOrder($combinedHex);
|
||||
$this->LogMessage("After LE reverse: {$combinedHex}", KL_MESSAGE);
|
||||
}
|
||||
|
||||
// Konvertiere Hex in Dezimal-String
|
||||
$rawDec = $this->hexToDecimal($hex);
|
||||
$rawDec = $this->hexToDecimal($combinedHex);
|
||||
|
||||
// Bei "Signed" → Zwei-Komplement-Umrechnung
|
||||
if ($signedness === 'Signed') {
|
||||
@@ -158,11 +166,13 @@ class SofarWechselrichter extends IPSModule
|
||||
if (bccomp($rawDec, $half) >= 0) {
|
||||
$rawDec = bcsub($rawDec, $fullRange, 0);
|
||||
}
|
||||
$this->LogMessage("Signed rawDec for Reg {$regNo}: {$rawDec}", KL_MESSAGE);
|
||||
}
|
||||
|
||||
// Skaliere (bc*-Multiplikation, 4 Nachkommastellen)
|
||||
$valueStr = bcmul($rawDec, $scale, 4);
|
||||
SetValueFloat($this->GetIDForIdent($ident), (float)$valueStr);
|
||||
$this->LogMessage("Final value for Reg {$regNo}: {$valueStr}", KL_MESSAGE);
|
||||
} catch (Exception $e) {
|
||||
$this->LogMessage(
|
||||
"Fehler Lesen Reg {$regNo} ({$bitLength}bit, {$signedness}): " . $e->getMessage(),
|
||||
@@ -258,7 +268,11 @@ class SofarWechselrichter extends IPSModule
|
||||
throw new Exception("Keine Antwort vom Inverter erhalten.");
|
||||
}
|
||||
|
||||
// 6) Slice-Logik: l = 2*1 + 4 = 6, dann slice(-6, -4) → 2 Bytes
|
||||
// Debug: log raw response hex
|
||||
$respHex = strtoupper(bin2hex($response));
|
||||
$this->LogMessage("Raw response for single reg {$reg}: {$respHex}", KL_MESSAGE);
|
||||
|
||||
// 6) Slice-Logik: l = 2*1 + 4 = 6, slice(-6, 2) → 2 Bytes
|
||||
$lModbus = 2 * 1 + 4; // = 6
|
||||
$numBytes = 2;
|
||||
if (strlen($response) < $lModbus) {
|
||||
@@ -268,6 +282,9 @@ class SofarWechselrichter extends IPSModule
|
||||
if (strlen($dataBytes) < $numBytes) {
|
||||
throw new Exception("Data-Segment enthält weniger als {$numBytes} Bytes.");
|
||||
}
|
||||
$dataHex = strtoupper(bin2hex($dataBytes));
|
||||
$this->LogMessage("Sliced data for single reg {$reg}: {$dataHex}", KL_MESSAGE);
|
||||
|
||||
return $dataBytes;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user