Seite 1 von 1

MODBUS PROFIL: Profil Wechselrichter Kostal Plenticore plus

Verfasst: Mo Feb 22, 2021 11:57 am
von chriss1980
Hallo zusammen,

ich habe testweise mal ein Profil für einen Kostal Plenticore plus Wechselrichter begonnen - kann die JSON-Datei aber leider nicht anhängen (Nicht unterstützter Dateityp), darum folgend der Code.

Zugriff per Modbus TCP von TW950.

Ich habe die ersten für mich interessanten Register aufgenommen, das ist aber noch nicht vollständig. Der WR soll auch Sunspec-Kompatibel sein, möglicherweise passt das Profil also auch auf weitere WR, ich habe mich mit dem Thema aber nicht weiter auseinandergesetzt

Cheers,
Christian

Code: Alles auswählen

{
  "author": "CS",
  "bool_editor_options": 0,
  "content_type": "Modbus Application",
  "copy_log": "exported 1613990997 308-1\n",
  "exported": 1613990997,
  "format_version": 0.1,
  "hash": "jA0ECQMCOdrVtzuH5vO00mwBdjXdfB6ZBNxgd8HjC3C34zhJEcwWbkv05Kj/Eme3HPeNjMpaArqV7u/FhDtrnAGFA9LB6FZqSaEPamtTJATuhP1l273q9YiB9+ReSpCdBs6h8uDfyCUdylqaPvVDQ/5T++jcMGHDw2/E7Yg=",
  "language": "DE",
  "last_modified": 1613734347,
  "manufacturer": "Kostal",
  "max_param_in_request": 20,
  "max_timeout": 5000,
  "min_polling_time": 5000,
  "modbus_type": "TCP",
  "product_description": "PV-Wechselrichter",
  "product_id": "308-1",
  "product_name": "Plenticore",
  "product_remark": null,
  "registers": [
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 2,
      "register_description": null,
      "register_flags": "----",
      "register_name": "ModbusTCP enable",
      "sub_tables": [
        {
          "bitmask": [
            0,
            1
          ],
          "coding": "UINT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "ModbusTCP enable",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 0,
          "unit": ""
        }
      ],
      "width": 16
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 32,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Number of AC phases",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "UINT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Number of AC phases",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 0,
          "unit": ""
        }
      ],
      "width": 16
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 34,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Number of PC Strings",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "UINT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Number of PC Strings",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 0,
          "unit": ""
        }
      ],
      "width": 16
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 56,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Inverter State",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "UINT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Inverter State",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 0,
          "unit": ""
        }
      ],
      "width": 16
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 100,
      "register_description": "",
      "register_flags": "----",
      "register_name": "Total DC Power",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Total DC Power",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "W"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 120,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Isolation Resistance (Ohm)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Isolation Resistance (Ohm)",
          "send_as": "float",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "\u2126"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 144,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Work time (s)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "x / 3600",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Work time (s)",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "h"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 150,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Actual cos phi",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Actual cos phi",
          "send_as": "float",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": ""
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 152,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Grid Frequency (Hz)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Grid Frequency (Hz)",
          "send_as": "float",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "Hz"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 258,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Current DC1 (A)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Current DC1 (A)",
          "send_as": "float",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "A"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 260,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Power DC1 (W)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Power DC1 (W)",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "W"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 266,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Voltage DC1 (V)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Voltage DC1 (V)",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "V"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 268,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Current DC2 (A)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Current DC2 (A)",
          "send_as": "float",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "A"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 270,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Power DC2 (W)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Power DC2 (W)",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "W"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 276,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Voltage DC2 (V)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Voltage DC2 (V)",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "V"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 278,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Current DC3 (A)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Current DC3 (A)",
          "send_as": "float",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "A"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 280,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Power DC3 (W)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Power DC3 (W)",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "W"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 286,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Voltage DC3 (V)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Voltage DC3 (V)",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "V"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 320,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Total Yield (Wh)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Total Yield (Wh)",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "Wh"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 322,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Daily Yield (Wh)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Daily Yield (Wh)",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "Wh"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 324,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Yearly Yield (Wh)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Yearly Yield (Wh)",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "Wh"
        }
      ],
      "width": 32
    },
    {
      "access": "R (03)",
      "block": "holding registers",
      "is_enum": 0,
      "register_address": 326,
      "register_description": null,
      "register_flags": "----",
      "register_name": "Monythly Yield (Wh)",
      "sub_tables": [
        {
          "bitmask": null,
          "coding": "FLOAT",
          "default_bitmask": null,
          "entries": [
            {
              "description": "",
              "flags": "----",
              "formula": "",
              "function": "none",
              "priority": 0,
              "range_from": 0.0,
              "range_to": 100.0,
              "send_value": ""
            }
          ],
          "group_description": null,
          "group_flags": null,
          "group_name": "Monythly Yield (Wh)",
          "send_as": "integer",
          "swap_byte": 0,
          "swap_double_word": 0,
          "swap_word": 1,
          "unit": "Wh"
        }
      ],
      "width": 32
    }
  ],
  "rs485_unit_load": "1",
  "version": "0.1"
}

Re: Profil Wechselrichter Kostal Plenticore plus

Verfasst: Mo Feb 22, 2021 12:04 pm
von StefanW
Super Christian,

danke sehr. Das wird sicherlich viele Nutzer freuen.

Wenn es die Sunspec sind, dann sollten die auch bei mehreren Wechselrichtern gehen. Manche kann man wohl umschalten.

Man kann die json erst zippen und dann anhängen. Aber so geht es auch

Ich sehe mir mal die erlaubten Datentypen im Forum an bei Gelegenheit

lg

Stefan

Re: Profil Wechselrichter Kostal Plenticore plus

Verfasst: Mo Feb 22, 2021 12:05 pm
von eib-eg
Hallo @chriss1980

Bitte deinen Footer wie im Link beschrieben ausfüllen Danke

viewtopic.php?f=8&t=331#p2896

Re: MODBUS PROFIL: Profil Wechselrichter Kostal Plenticore plus

Verfasst: So Feb 28, 2021 1:33 pm
von pbm
Hi @chriss1980,

hast du auch das "KOSTAL Smart Energy Meter"?

Ich habe die Hoffnung, dass ich mir das Gerät sparen kann, da ich bereits ein anderes Gerät habe, um die Leistung an meinem Hausanschluss zu erfassen.
viewtopic.php?f=80&t=2727

Da man laut Bedienungsanleitung die Kostal-Geräte über MODBUS-TCP kommunizieren lassen kann, dürfte das doch kein Problem sein,
den Wechselrichter mit den nötigen Informationen über die mit dem Timberwolf eingesammelten Daten zu versorgen.

Dann könnte ich mit entsprechende Logiken den Wechselrichter (und ggf. daran angeschlossene Batterie) aussteuern.
Später kommt dann noch die Wärmepumpe mit dazu, um bei ausreichend Energieüberschuss warmes Wasser zu erzeugen.

Re: MODBUS PROFIL: Profil Wechselrichter Kostal Plenticore plus

Verfasst: Mo Mär 01, 2021 8:51 am
von chriss1980
Hallo Peer,
nein, habe keine Messeinrichtung am Wechselrichter hängen, auch keine Batterie. Nutze eine Sonnenbatterie, die den WR per Binäreingang abregeln kann

Re: MODBUS PROFIL: Profil Wechselrichter Kostal Plenticore plus

Verfasst: Do Mär 25, 2021 10:59 am
von Hammer
Hallo,

ich möchte hier auch mein Profil für einen PLENTICORE teilen.

Es handelt sich um folgendes Gerät:
KOSTAL PLENTICORE plus 8.5
Firmware: MC: 01.46 / IOC: 01.45
Zugriff per Modbus TCP.

Ich habe die Adressen von Christian seinem PRofil mit eingefügt. Obwohl ich diese selber noch nicht verwende.

Grüße
Stefan

Re: MODBUS PROFIL: Profil Wechselrichter Kostal Plenticore plus

Verfasst: Do Mär 25, 2021 11:14 am
von StefanW
Super, danke schön,

(Hinweis: Habe am Wochenende das Forum auch für .json Dateien freigeschaltet aber noch nicht getestet, danke dass Du das für mich übernommen hast)

lg

Stefan

Re: MODBUS PROFIL: Profil Wechselrichter Kostal Plenticore plus

Verfasst: Mo Okt 30, 2023 12:15 pm
von ROI111
Hallo zusammen,

ich habe das Modul heute erfolgreich genutzt um meinen PLENTICORE plus 10 inkl. BYD 10.5 kWH Batterie an den TW anzuschließen.
Ich habe noch den aktuellen SOC sowie die Batterie Lade/Entladeleistung zum Profil hinzugefügt und getestet.

Hier das geupdatete File:
modbus-timberwolf-product-348-2.json
Schöne Grüße

Matthias

PS: Das ganze war mein erster Kontakt zu Modbus und hat mich in Summe 2h gekostet. Muss dazu sagen, dass ich das Wiki auf Grund von " von Informationen erschlagen" nur überfolgen habe und das ganze nach dem Motto "Ich probier mal aus wie es geht" gemacht habe und auch so zum Ziel gekommen bin. Nach dem ich die Live Check funktion entdeckt hatte ging das hinzufügen der 2 zusätzlichen Registern leicht von der Hand :D .