2. Starte IP-Symcon neu bzw. klicke in der Konsole auf „Module aktualisieren“. Anschließend erscheint in der Instanzliste der neue Gerätetyp **Sofar Wechselrichter**. --- ## Konfiguration 1. **Instanz anlegen** - Gehe in der IPS-Konsole auf „Instanzen hinzufügen“ → Hersteller: (falls sichtbar) → Modul: **Sofar Wechselrichter**. - Vergib einen sinnvollen Namen und eine Beschreibung. 2. **Einstellungen in den Eigenschaften** - **Logger-Seriennummer**: Gib hier die „Logger-Nummer“ deines Sofar-Wechselrichters ein (Dezimal). - **Abfragezyklus (Sekunden)**: Intervall in Sekunden, in dem zyklisch alle eingetragenen Register abgefragt werden. Ein Wert von `0` deaktiviert den Timer (keine zyklischen Abfragen). - **Register-Tabelle**: Hier definierst du beliebig viele Zeilen, jeweils mit: 1. **Register-Nummer** (dezimal) 2. **Bezeichnung** (z. B. „Gesamtproduktion“ oder „Spannung Phase L1“) 3. **Skalierungs-faktor** (z. B. `0.1`, `1`, `10` usw.) Wird beispielsweise für Register `1476` als Bezeichnung „Gesamtproduktion“ mit Skalierungsfaktor `1` eingetragen, so liest das Modul alle 60 Sekunden (oder den von dir gewählten Zyklus) Register 1476, multipliziert das rohe UINT16-Ergebnis mit `1` und legt den Wert in einer IPS-Variable an. 3. **Speichern/Übernehmen** Klicke auf „Übernehmen“, um die Änderungen zu übernehmen. Das Modul legt automatisch untergeordnete IPS-Variablen an: - **Vorheriger Wert (Register 1160)** → INT16BE, unverändert (analog zur alten Node-RED-Logik). Diese Variable heißt intern `Vorheriger Wert` und wird automatisch gepflegt. - **Alle weiteren Einträge aus der Register-Tabelle** → Für jede Zeile wird eine Float-Variable mit der von dir angegebenen „Bezeichnung“ angelegt. Der Variablen-Identifier lautet automatisch `Reg` (z. B. `Reg1476`). --- ## Funktionsweise 1. **Initialisierung (ApplyChanges)** - Liest den Abfragezyklus aus den Moduleigenschaften und initialisiert den Timer. - Legt eine Integer-Variable `Vorheriger Wert` (Reg 1160) an. - Legt für jede Zeile in der Register-Tabelle eine Float-Variable an (Ident `Reg`). 2. **Zyklische Abfrage (Timer-Callback)** - **Register 1160 (INT16BE)** → Wird als „Vorheriger Wert“ in die Variable geschrieben (signed interpretiert). - **Alle weiteren Register aus der Tabelle** → Jedes Register wird per Modbus-ähnlichem TCP-Paketaustausch abgefragt, als UINT16 ausgelesen, mit dem angegebenen Skalierungsfaktor multipliziert und in der zugehörigen Float-Variable gespeichert. 3. **Kommunikation** - TCP-Verbindung zu `192.168.0.0:8899` (feste IP im Code). - Der Aufruf von `readRegister()` baut ein „Out_Frame“ wie in Node-RED, rechnet CRC16-Modbus über die letzten 6 Bytes, hängt eine Summen-Checksum + 0x15 an, sendet das Paket, liest die Antwort, schneidet exakt 2 Daten-Bytes heraus und liefert sie zurück. --- ## Beispiel: Register 1476 („Gesamtproduktion“) - **Register-Tabelle** | Register‐Nummer | Bezeichnung | Skalierungsfaktor | | --------------: | :------------------ | ----------------: | | 1476 | Gesamtproduktion | 1 | - **Ergebnis** - Eine Float-Variable mit der Bezeichnung „Gesamtproduktion“ wird angelegt. - Wenn der PollInterval auf `60` Sekunden steht, liest das Modul alle 60 Sekunden das Register 1476, skaliert mit 1 und schreibt den numerischen Wert in `Reg1476`. --- ## Fehlersuche - Falls die Variable „Vorheriger Wert“ immer denselben Wert liefert oder ein Lesefehler auftritt, prüfe bitte: 1. **Logger-Nummer**: Ist sie korrekt (Dezimal)? 2. **Netzwerk/Firewall**: Kann Symcon die Adresse `192.168.0.100:8899` erreichen? 3. **Debug-Ausgaben**: – Öffne in der Konsole „Kernel-Log“ → Filter „SofarWechselrichter“. – Dort werden WARNs und ERRs protokolliert, falls z. B. keine Antwort kommt oder das Datenpaket inkorrekt ist. - Falls du andere Datentypen brauchst (z. B. INT16 für Register außerhalb 1160), definiere sie analog als separate Zeile: – Trage die `Register‐Nummer` ein, gib als Skalierungsfaktor `1` (oder `0.1` etc.) an. – Der absolute Rohwert wird stets als UINT16 interpretiert (0–65535). – Solltest du negative INT16 benötigen, kannst du nachträglich einfach die Variable „Vorheriger Wert“ (Reg 1160) als Beispiel nehmen und in einem Script umrechnen (Werte über 32767 → –32768 + Rest). --- ## Versionshistorie - **1.0** - Erstveröffentlichung: • Zyklische Abfrage beliebiger Register in einer Matrix konfigurieren • Automatische Anlage von Variablen für jeden Eintrag • Spezieller „Vorheriger Wert“ (Register 1160 als INT16) --- *Ende der Dokumentation.*