From 537c019f1866770963717ab9f82a798182a9522a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=A4fliger?= Date: Wed, 4 Jun 2025 14:24:49 +0200 Subject: [PATCH] no message --- SofarWechselrichter/module.php | 35 +++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/SofarWechselrichter/module.php b/SofarWechselrichter/module.php index 69339f2..e289af9 100644 --- a/SofarWechselrichter/module.php +++ b/SofarWechselrichter/module.php @@ -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; }