{"id":13064,"date":"2026-09-18T18:25:00","date_gmt":"2026-09-18T16:25:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=13064"},"modified":"2026-10-26T13:25:45","modified_gmt":"2026-10-26T12:25:45","slug":"tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/","title":{"rendered":"Tutorial: Odczyt rejestr\u00f3w SunSpec z falownika PV przez Modbus TCP"},"content":{"rendered":"<p>Rejestr Modbus to ponumerowane miejsce przechowuj\u0105ce 16 bit\u00f3w. SunSpec okre\u015bla, jak grupy takich rejestr\u00f3w opisuj\u0105 pomiary i informacje o urz\u0105dzeniu. \u0141a\u0144cuch modeli pozwala odnale\u017a\u0107 obs\u0142ugiwane bloki zamiast kopiowa\u0107 adres z innego falownika. <strong>Nadal potrzebne s\u0105 w\u0142a\u015bciwa konfiguracja urz\u0105dzenia i definicje modeli. Nie ka\u017cdy pomiar jest dost\u0119pny w ka\u017cdym falowniku.<\/strong><\/p>\n<p>Poradnik odczytuje pr\u0105d fazy A z ca\u0142kowitoliczbowego modelu falownika 103. Przyk\u0142ad Python korzysta z interfejsu PyModbus 3.16.1 sprawdzonego 24 pa\u017adziernika 2026 i wykonuje wy\u0142\u0105cznie odczyty rejestr\u00f3w holding. Host, port i identyfikator jednostki zale\u017c\u0105 od urz\u0105dzenia. W\u0142\u0105czenie dost\u0119pu i wyb\u00f3r mapy rejestr\u00f3w wymagaj\u0105 dokumentacji producenta.<\/p>\n<h2>1. Odszukanie mapy bez pomylenia numeracji<\/h2><p>Standardowe adresy protoko\u0142u SunSpec to 0, 40000 i 50000, liczone od zera. Pierwsze dwa rejestry zawieraj\u0105 <code>0x5375<\/code> i <code>0x6E53<\/code>, czyli razem znaki <code>SunS<\/code>. Te liczby s\u0105 ju\u017c adresami protoko\u0142u.<\/p><p>Instrukcja mo\u017ce u\u017cywa\u0107 przesuni\u0119\u0107 od zera, numer\u00f3w rejestr\u00f3w od jedynki lub tradycyjnych oznacze\u0144 4xxxx dla rejestr\u00f3w holding. Zapis \u201e40001\u201d nie zawsze oznacza wi\u0119c adres 40000. W tradycyjnej notacji mo\u017ce oznacza\u0107 pierwszy rejestr holding, czyli adres protoko\u0142u 0. Udokumentowana konwencja i znaleziony znacznik musz\u0105 by\u0107 zgodne.<\/p><p>Licznik i falownik mog\u0105 korzysta\u0107 z osobnych identyfikator\u00f3w jednostki, odr\u0119bnych po\u0142\u0105cze\u0144 lub r\u00f3\u017cnych modeli we wsp\u00f3lnej mapie. Ani drugi identyfikator, ani konkretne ustawienie fabryczne nie s\u0105 uniwersalne. Poprawna odpowied\u017a Modbus sama nie dowodzi, \u017ce odpowiedzia\u0142o w\u0142a\u015bciwe urz\u0105dzenie.<\/p>\n<figure class=\"lw-diagram\"><img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/quality-13064-20261024.png\" width=\"1120\" height=\"580\" loading=\"lazy\" decoding=\"async\" alt=\"Przyk\u0142adowa mapa SunSpec z adresami od zera, dwurejestrowymi nag\u0142\u00f3wkami i modelem ko\u0144cowym; pr\u0105d fazy A i sprawdzony wsp\u00f3\u0142czynnik skali\"><figcaption>Przyk\u0142adowe adresy dotycz\u0105 tylko tego \u0142a\u0144cucha. Nazwy i przesuni\u0119cia wymagaj\u0105 odpowiedniej definicji modelu.<\/figcaption><\/figure>\n<h2>2. Przej\u015bcie nag\u0142\u00f3wk\u00f3w modeli<\/h2><p>Po dw\u00f3ch rejestrach znacznika ka\u017cdy nag\u0142\u00f3wek zawiera identyfikator modelu i d\u0142ugo\u015b\u0107. D\u0142ugo\u015b\u0107 obejmuje rejestry danych po dwurejestrowym nag\u0142\u00f3wku. Nast\u0119pny nag\u0142\u00f3wek znajduje si\u0119 zatem pod adresem <code>bie\u017c\u0105cy_nag\u0142\u00f3wek + 2 + d\u0142ugo\u015b\u0107<\/code>. Model ko\u0144cowy <code>0xFFFF<\/code> ma d\u0142ugo\u015b\u0107 0.<\/p><p>Identyfikatory modeli wskazuj\u0105 uk\u0142ady danych. Nazwy, jednostki i pozycje punkt\u00f3w pochodz\u0105 jednak z opublikowanych definicji, a nie z pe\u0142nego s\u0142ownika wysy\u0142anego przez ka\u017cde urz\u0105dzenie. Nieznane modele mo\u017cna pomin\u0105\u0107 wed\u0142ug d\u0142ugo\u015bci; znane nadal wymagaj\u0105 odpowiedniego dekodera.<\/p><ul><li><strong>1:<\/strong> wsp\u00f3lna identyfikacja urz\u0105dzenia.<\/li><li><strong>101\/102\/103:<\/strong> ca\u0142kowitoliczbowe modele falownika: jednofazowy, split phase i tr\u00f3jfazowy.<\/li><li><strong>111\/112\/113:<\/strong> odpowiednia rodzina zmiennoprzecinkowa, z innym uk\u0142adem danych.<\/li><li><strong>160:<\/strong> rozszerzenie dla wielu tracker\u00f3w MPP; grupy wej\u015b\u0107 nie oznaczaj\u0105 zawsze pojedynczych fizycznych \u0142a\u0144cuch\u00f3w.<\/li><li><strong>201\u2013204:<\/strong> ca\u0142kowitoliczbowe modele licznik\u00f3w dla r\u00f3\u017cnych uk\u0142ad\u00f3w przy\u0142\u0105czenia.<\/li><\/ul><p>Obs\u0142ugiwane modele i ewentualny wyb\u00f3r formatu zale\u017c\u0105 od produktu. Model 102 oznacza split phase, a nie dowoln\u0105 instalacj\u0119 dwufazow\u0105. Przyk\u0142ad celowo zg\u0142asza b\u0142\u0105d, je\u015bli nie wyst\u0119puje dok\u0142adnie jedna instancja modelu 103.<\/p>\n<h2>3. Sp\u00f3jne dekodowanie pr\u0105du fazy A<\/h2><p>Wszystkie poni\u017csze przesuni\u0119cia liczone s\u0105 od zera wzgl\u0119dem pierwszego rejestru danych, bez ID i d\u0142ugo\u015bci: <code>A<\/code> jest pod 0, <code>AphA<\/code> pod 1, <code>AphB<\/code> pod 2, <code>AphC<\/code> pod 3, a <code>A_SF<\/code> pod 4. Gdy dane zaczynaj\u0105 si\u0119 pod 40071, faza A jest pod 40072, a wsp\u00f3\u0142czynnik skali pod 40075. Odleg\u0142o\u015b\u0107 adres\u00f3w wynosi trzy rejestry.<\/p><p>Pr\u0105d jest bez znaku, a wsp\u00f3\u0142czynnik skali jest dziesi\u0119tnym wyk\u0142adnikiem ze znakiem. Surowe 1234 i wyk\u0142adnik \u22122 daj\u0105 <code>1234 \u00d7 10^-2 = 12,34 A<\/code>. Inny wyk\u0142adnik oznacza inny mno\u017cnik. Brak pr\u0105du <code>0xFFFF<\/code> lub brak skali <code>0x8000<\/code> nie mo\u017ce zosta\u0107 przeliczony na pomiar.<\/p>\n<h2>4. Odczyt z ograniczeniami i kontrol\u0105 b\u0142\u0119d\u00f3w<\/h2><p>Przyk\u0142ad sprawdza po\u0142\u0105czenie, d\u0142ugo\u015b\u0107 odpowiedzi, granice modeli, znacznik ko\u0144ca i obie warto\u015bci nieprawid\u0142owe. U\u017cywa <code>device_id<\/code> zgodnie z dokumentacj\u0105 PyModbus. Starsze przyk\u0142ady z <code>slave<\/code> wymagaj\u0105 dostosowania do u\u017cywanej wersji.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"python\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Python<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-python\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">from<\/span> pymodbus.client <span class=\"cbb-keyword\">import<\/span> ModbusTcpClient\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">from<\/span> pymodbus.exceptions <span class=\"cbb-keyword\">import<\/span> ModbusException\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">read_words<\/span>(client, address, count, unit):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-number\">1<\/span> &lt;= count &lt;= <span class=\"cbb-number\">125<\/span> <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-number\">0<\/span> &lt;= address &lt;= <span class=\"cbb-number\">65536<\/span> - count:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"Invalid register range\"<\/span>)\n<\/span><span class=\"cbb-line\">    response = client.<span class=\"cbb-function\">read_holding_registers<\/span>(\n<\/span><span class=\"cbb-line\">        address, count=count, device_id=unit\n<\/span><span class=\"cbb-line\">    )\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> response.<span class=\"cbb-function\">isError<\/span>():\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">RuntimeError<\/span>(<span class=\"cbb-string\">f\"Modbus error at {address}: {response}\"<\/span>)\n<\/span><span class=\"cbb-line\">    words = response.registers\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-function\">len<\/span>(words) != count <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-function\">any<\/span>(<span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-number\">0<\/span> &lt;= x &lt;= <span class=\"cbb-number\">65535<\/span> <span class=\"cbb-keyword\">for<\/span> x <span class=\"cbb-keyword\">in<\/span> words):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">RuntimeError<\/span>(<span class=\"cbb-string\">\"Incomplete or invalid response\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span> words\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">find_base<\/span>(client, unit):\n<\/span><span class=\"cbb-line\">    failures = &#91;&#93;\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">for<\/span> base <span class=\"cbb-keyword\">in<\/span> (<span class=\"cbb-number\">40000<\/span>, <span class=\"cbb-number\">0<\/span>, <span class=\"cbb-number\">50000<\/span>):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">try<\/span>:\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-function\">read_words<\/span>(client, base, <span class=\"cbb-number\">2<\/span>, unit) == &#91;<span class=\"cbb-number\">0x5375<\/span>, <span class=\"cbb-number\">0x6E53<\/span>&#93;:\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">return<\/span> base\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">except<\/span> (ModbusException, OSError, RuntimeError) <span class=\"cbb-keyword\">as<\/span> exc:\n<\/span><span class=\"cbb-line\">            failures.<span class=\"cbb-function\">append<\/span>(<span class=\"cbb-string\">f\"{base}: {exc}\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">RuntimeError<\/span>(<span class=\"cbb-string\">\"No SunS marker found; \"<\/span> + <span class=\"cbb-string\">\"; \"<\/span>.<span class=\"cbb-function\">join<\/span>(failures))\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">discover<\/span>(client, base, unit):\n<\/span><span class=\"cbb-line\">    position = base + <span class=\"cbb-number\">2<\/span>\n<\/span><span class=\"cbb-line\">    models = &#91;&#93;\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">for<\/span> _ <span class=\"cbb-keyword\">in<\/span> <span class=\"cbb-function\">range<\/span>(<span class=\"cbb-number\">256<\/span>):\n<\/span><span class=\"cbb-line\">        model, length = <span class=\"cbb-function\">read_words<\/span>(client, position, <span class=\"cbb-number\">2<\/span>, unit)\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> model == <span class=\"cbb-number\">0xFFFF<\/span>:\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">if<\/span> length != <span class=\"cbb-number\">0<\/span>:\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">RuntimeError<\/span>(<span class=\"cbb-string\">\"Invalid end model length\"<\/span>)\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">return<\/span> models\n<\/span><span class=\"cbb-line\">        next_position = position + <span class=\"cbb-number\">2<\/span> + length\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> model == <span class=\"cbb-number\">0<\/span> <span class=\"cbb-keyword\">or<\/span> length == <span class=\"cbb-number\">0<\/span> <span class=\"cbb-keyword\">or<\/span> next_position &gt; <span class=\"cbb-number\">65534<\/span>:\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">RuntimeError<\/span>(<span class=\"cbb-string\">\"Invalid model header or address range\"<\/span>)\n<\/span><span class=\"cbb-line\">        models.<span class=\"cbb-function\">append<\/span>((model, position + <span class=\"cbb-number\">2<\/span>, length))\n<\/span><span class=\"cbb-line\">        position = next_position\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">RuntimeError<\/span>(<span class=\"cbb-string\">\"Model scan limit reached\"<\/span>)\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">phase_a_current<\/span>(client, models, unit):\n<\/span><span class=\"cbb-line\">    matches = &#91;m <span class=\"cbb-keyword\">for<\/span> m <span class=\"cbb-keyword\">in<\/span> models <span class=\"cbb-keyword\">if<\/span> m&#91;<span class=\"cbb-number\">0<\/span>&#93; == <span class=\"cbb-number\">103<\/span>&#93;\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-function\">len<\/span>(matches) != <span class=\"cbb-number\">1<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">RuntimeError<\/span>(<span class=\"cbb-string\">\"Exactly one model 103 required\"<\/span>)\n<\/span><span class=\"cbb-line\">    _, start, length = matches&#91;<span class=\"cbb-number\">0<\/span>&#93;\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> length &lt; <span class=\"cbb-number\">5<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">RuntimeError<\/span>(<span class=\"cbb-string\">\"Model 103 is too short\"<\/span>)\n<\/span><span class=\"cbb-line\">    block = <span class=\"cbb-function\">read_words<\/span>(client, start, <span class=\"cbb-number\">5<\/span>, unit)\n<\/span><span class=\"cbb-line\">    raw, sf_raw = block&#91;<span class=\"cbb-number\">1<\/span>&#93;, block&#91;<span class=\"cbb-number\">4<\/span>&#93;\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> raw == <span class=\"cbb-number\">0xFFFF<\/span> <span class=\"cbb-keyword\">or<\/span> sf_raw == <span class=\"cbb-number\">0x8000<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">None<\/span>\n<\/span><span class=\"cbb-line\">    exponent = sf_raw - <span class=\"cbb-number\">65536<\/span> <span class=\"cbb-keyword\">if<\/span> sf_raw &gt;= <span class=\"cbb-number\">32768<\/span> <span class=\"cbb-keyword\">else<\/span> sf_raw\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-number\">-10<\/span> &lt;= exponent &lt;= <span class=\"cbb-number\">10<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">RuntimeError<\/span>(<span class=\"cbb-string\">\"Invalid SunSpec scale factor\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span> raw * (<span class=\"cbb-number\">10.0<\/span> ** exponent)\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">main<\/span>():\n<\/span><span class=\"cbb-line\">    unit = <span class=\"cbb-number\">1<\/span>  <span class=\"cbb-comment\"># Device-specific configuration<\/span>\n<\/span><span class=\"cbb-line\">    client = <span class=\"cbb-function\">ModbusTcpClient<\/span>(<span class=\"cbb-string\">\"192.168.1.50\"<\/span>, port=<span class=\"cbb-number\">502<\/span>, timeout=<span class=\"cbb-number\">3<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">try<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> client.<span class=\"cbb-function\">connect<\/span>():\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">RuntimeError<\/span>(<span class=\"cbb-string\">\"Connection failed\"<\/span>)\n<\/span><span class=\"cbb-line\">        base = <span class=\"cbb-function\">find_base<\/span>(client, unit)\n<\/span><span class=\"cbb-line\">        models = <span class=\"cbb-function\">discover<\/span>(client, base, unit)\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-function\">print<\/span>(<span class=\"cbb-string\">\"Base:\"<\/span>, base, <span class=\"cbb-string\">\"Models:\"<\/span>, models)\n<\/span><span class=\"cbb-line\">        current = <span class=\"cbb-function\">phase_a_current<\/span>(client, models, unit)\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-function\">print<\/span>(<span class=\"cbb-string\">\"No valid phase A current\"<\/span> <span class=\"cbb-keyword\">if<\/span> current <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-constant\">None<\/span>\n<\/span><span class=\"cbb-line\">              <span class=\"cbb-keyword\">else<\/span> <span class=\"cbb-string\">f\"{current:.2f} A\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">finally<\/span>:\n<\/span><span class=\"cbb-line\">        client.<span class=\"cbb-function\">close<\/span>()\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">if<\/span> __name__ == <span class=\"cbb-string\">\"__main__\"<\/span>:\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-function\">main<\/span>()<\/span><\/code><\/pre><\/figure>\n<p>Limit 256 nag\u0142\u00f3wk\u00f3w zabezpiecza ten przyk\u0142ad; nie jest limitem liczby modeli SunSpec. Brak znacznika, modelu lub poprawnej odpowiedzi przerywa obliczenie zamiast wypisywa\u0107 pozornie wiarygodn\u0105 liczb\u0119. Kod obs\u0142uguje jedn\u0105 instancj\u0119 modelu 103; kilka instancji wymaga jawnego wyboru. Testy korzysta\u0142y z symulowanego klienta, alternatywnych adres\u00f3w bazowych, brakuj\u0105cych warto\u015bci i uszkodzonych nag\u0142\u00f3wk\u00f3w. Nie nawi\u0105zano po\u0142\u0105czenia z falownikiem.<\/p>\n<h2>Inne typy i cz\u0119stotliwo\u015b\u0107 odpytywania<\/h2><p>SunSpec okre\u015bla starsze s\u0142owo jako pierwsze dla warto\u015bci wielorejestrowych. Sam Modbus definiuje przesy\u0142anie rejestr\u00f3w, a nie wszystkie uk\u0142ady wielos\u0142owowe producent\u00f3w. Warto\u015bci ze znakiem wymagaj\u0105 dekodowania uzupe\u0142nienia do dw\u00f3ch; zmiennoprzecinkowe odpowiedniego formatu IEEE i kontroli warto\u015bci nieprawid\u0142owych. Tekst zajmuje sta\u0142y obszar rejestr\u00f3w i mo\u017ce by\u0107 zako\u0144czony lub dope\u0142niony bajtami zerowymi.<\/p><p>Nieprawid\u0142owe wzorce bit\u00f3w zale\u017c\u0105 od typu SunSpec: przyk\u0142adowo <code>0x8000<\/code> dla <code>int16<\/code>, <code>0xFFFF<\/code> dla <code>uint16<\/code> i zero jako \u201eniezakumulowane\u201d dla <code>acc32<\/code>. Typy <code>acc32<\/code> i <code>uint32<\/code> nie s\u0105 wymienne tylko dlatego, \u017ce zajmuj\u0105 po dwa rejestry.<\/p><p>Odczyt bloku zmniejsza liczb\u0119 transmisji, lecz nie gwarantuje jednoczesnego fizycznego pr\u00f3bkowania. Funkcja 03 dopuszcza maksymalnie 125 rejestr\u00f3w w \u017c\u0105daniu; urz\u0105dzenie mo\u017ce narzuca\u0107 ni\u017cszy limit. Cz\u0119stotliwo\u015b\u0107 odpytywania, liczba po\u0142\u0105cze\u0144 i tempo aktualizacji wynikaj\u0105 z dokumentacji urz\u0105dzenia. Interwa\u0142 pi\u0119ciu sekund nie jest uniwersalnie bezproblemowy dla ka\u017cdego produktu lub wsp\u00f3\u0142dzielonej bramy.<\/p>\n<h2>Home Assistant: przyk\u0142ad o okre\u015blonym zakresie<\/h2><p>Ta konfiguracja dotyczy wy\u0142\u0105cznie pokazanej mapy: dane modelu 103 zaczynaj\u0105 si\u0119 pod 40071, a <code>A_SF = -2<\/code>. Sta\u0142e <code>scale: 0.01<\/code> jest mno\u017cnikiem, nie wyk\u0142adnikiem. Home Assistant nie wykrywa z tego YAML automatycznie modelu SunSpec ani wsp\u00f3\u0142czynnika skali.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"yaml\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">YAML<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-yaml\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-attr\">modbus<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: inverter\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">type<\/span>: tcp\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">host<\/span>: 192.168.1.50\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">port<\/span>: <span class=\"cbb-number\">502<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">sensors<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: <span class=\"cbb-string\">\"Pr\u0105d fazy A\"<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">slave<\/span>: <span class=\"cbb-number\">1<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">address<\/span>: <span class=\"cbb-number\">40072<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">input_type<\/span>: holding\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">data_type<\/span>: uint16\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">nan_value<\/span>: <span class=\"cbb-number\">65535<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">scale<\/span>: <span class=\"cbb-number\">0.01<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">precision<\/span>: <span class=\"cbb-number\">2<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">unit_of_measurement<\/span>: <span class=\"cbb-string\">\"A\"<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">device_class<\/span>: current\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">state_class<\/span>: measurement\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">scan_interval<\/span>: <span class=\"cbb-number\">10<\/span><\/span><\/code><\/pre><\/figure>\n<p><code>nan_value<\/code> wyklucza nieprawid\u0142owy surowy pr\u0105d i wed\u0142ug obecnej dokumentacji daje stan <code>unknown<\/code>. Nie sprawdza osobnego rejestru skali. Sta\u0142a konfiguracja pasuje tylko przy nadal poprawnej mapie i skali; po zmianie firmware&#8217;u lub konfiguracji modeli potrzebne jest ponowne rozpoznanie i por\u00f3wnanie.<\/p><p>Moc w watach u\u017cywa <code>device_class: power<\/code> i <code>state_class: measurement<\/code>. Energia wymaga <code>device_class: energy<\/code>, obs\u0142ugiwanej jednostki energii oraz <code>total<\/code> lub <code>total_increasing<\/code> zale\u017cnie od resetowania. Obecne widoki energii Home Assistant mog\u0105 r\u00f3wnie\u017c korzysta\u0107 z pomiar\u00f3w mocy. Energi\u0119 mo\u017cna te\u017c obliczy\u0107 z mocy i czasu: sta\u0142e 1 kW przez dwie godziny daje 2 kWh. Przy zmiennej mocy dok\u0142adno\u015b\u0107 zale\u017cy od cz\u0119stotliwo\u015bci pomiar\u00f3w i metody oblicze\u0144.<\/p>\n<div class=\"lw-faq\"><h2>Pytania i odpowiedzi<\/h2><h3>Dlaczego skala nale\u017cy do modelu?<\/h3><p>Wyk\u0142adnik ze znakiem \u0142\u0105czy zakres liczbowy z rozdzielczo\u015bci\u0105. Dla poprawnej mocy int16 wyk\u0142adnik 0 pozwala na maksymalnie 32767 W; dodatnie wyk\u0142adniki zwi\u0119kszaj\u0105 zakres kosztem wi\u0119kszych krok\u00f3w. Przywo\u0142ana specyfikacja SunSpec okre\u015bla punkty skali jako statyczne. Zmiany konfiguracji urz\u0105dzenia lub firmware&#8217;u nadal uzasadniaj\u0105 kontrol\u0119 wynikowej mapy.<\/p><h3>Co mo\u017ce uszkodzi\u0107 statystyki energii?<\/h3><p>Nieprawid\u0142owe zero, po kt\u00f3rym wraca rzeczywisty licznik ca\u0142kowity, mo\u017ce zosta\u0107 odczytane przy <code>total_increasing<\/code> jako reset i ogromny nowy przyrost. Znaczenie maj\u0105 wi\u0119c typ punktu i zachowanie przy resetach. Dla akumulatora zdefiniowanego w modelu nieprawid\u0142owe surowe zero wymaga wykluczenia. Tej regu\u0142y nie mo\u017cna bez sprawdzenia przenosi\u0107 do innych czujnik\u00f3w, dla kt\u00f3rych zero jest poprawne. Nieznane dane powinny pozosta\u0107 nieznane zamiast przyjmowa\u0107 sztuczne zero.<\/p><h3>Jak ograniczy\u0107 dost\u0119p?<\/h3><p>Klasyczny Modbus TCP na porcie 502 nie ma wbudowanego uwierzytelniania ani szyfrowania. Modbus Security jest oddzielnym protoko\u0142em opartym na TLS i wymaga obs\u0142ugi urz\u0105dzenia. W tym poradniku wystarcza odczyt. Ograniczona \u015bcie\u017cka sieciowa i brak publicznego przekierowania portu zmniejszaj\u0105 ekspozycj\u0119. Zapora routuj\u0105ca zwykle nie kontroluje bezpo\u015bredniego ruchu w tej samej podsieci; zapory host\u00f3w, listy ACL prze\u0142\u0105cznik\u00f3w i izolacja klient\u00f3w mog\u0105 jednak taki ruch ogranicza\u0107.<\/p><\/div>\n<div class=\"lw-quellen\"><h2>\u0179r\u00f3d\u0142a<\/h2><ul><li><a href=\"https:\/\/sunspec.org\/wp-content\/uploads\/2021\/02\/SunSpec-Device-Information-Model-Specificiation-V1-0-02-01-2021.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">SunSpec: modele informacji o urz\u0105dzeniu, projekt 2021<\/a><\/li><li><a href=\"https:\/\/sunspec.org\/wp-content\/uploads\/2019\/08\/SunSpec-Information-Models-12041.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">SunSpec: modele informacji 1.9<\/a><\/li><li><a href=\"https:\/\/raw.githubusercontent.com\/sunspec\/models\/master\/json\/model_103.json\" target=\"_blank\" rel=\"noopener noreferrer\">SunSpec: definicja modelu 103<\/a><\/li><li><a href=\"https:\/\/raw.githubusercontent.com\/sunspec\/models\/master\/json\/model_160.json\" target=\"_blank\" rel=\"noopener noreferrer\">SunSpec: definicja modelu 160<\/a><\/li><li><a href=\"https:\/\/pymodbus.readthedocs.io\/en\/stable\/source\/client.html\" target=\"_blank\" rel=\"noopener noreferrer\">PyModbus 3.16.1: interfejs klienta<\/a><\/li><li><a href=\"https:\/\/www.home-assistant.io\/integrations\/modbus\/\" target=\"_blank\" rel=\"noopener noreferrer\">Home Assistant: integracja Modbus<\/a><\/li><li><a href=\"https:\/\/www.home-assistant.io\/docs\/energy\/faq\/\" target=\"_blank\" rel=\"noopener noreferrer\">Home Assistant: pytania o energi\u0119<\/a><\/li><li><a href=\"https:\/\/contributors.home-assistant.io\/core\/entities\/sensor\/\" target=\"_blank\" rel=\"noopener noreferrer\">Home Assistant: klasy stanu czujnik\u00f3w<\/a><\/li><li><a href=\"https:\/\/www.home-assistant.io\/integrations\/integration\/\" target=\"_blank\" rel=\"noopener noreferrer\">Home Assistant: Integral<\/a><\/li><li><a href=\"https:\/\/www.modbus.org\/file\/secure\/modbusprotocolspecification.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">Protok\u00f3\u0142 aplikacyjny Modbus V1.1b3<\/a><\/li><li><a href=\"https:\/\/www.modbus.org\/modbus-specifications\" target=\"_blank\" rel=\"noopener noreferrer\">Specyfikacje Modbus i Modbus Security<\/a><\/li><li><a href=\"https:\/\/icdocs.ismacontrolli.com\/aac20-modbus\/V1.10\/list-of-modbus-registers\" target=\"_blank\" rel=\"noopener noreferrer\">iSMA CONTROLLI: przyk\u0142ad zapisu adres\u00f3w Modbus<\/a><\/li><\/ul><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0141a\u0144cuch modeli SunSpec pozwala odnale\u017a\u0107 obs\u0142ugiwane bloki rejestr\u00f3w. Poradnik odczytuje pr\u0105d fazy A z modelu 103, rozr\u00f3\u017cnia konwencje adres\u00f3w, sprawdza brakuj\u0105ce warto\u015bci i skal\u0119 oraz przedstawia konfiguracj\u0119 Home Assistant o okre\u015blonym zakresie.<\/p>\n","protected":false},"author":1,"featured_media":23776,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92628],"tags":[92190,92193,92196,92199,92238],"class_list":["post-13064","post","type-post","status-publish","format-standard","hentry","category-tutorials-pl-smart-home-pl","tag-energy-management-pl","tag-home-assistant-pl","tag-modbus-pl","tag-photovoltaics-pl","tag-tutorial-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Odczyt rejestr\u00f3w SunSpec z falownika PV przez Modbus TCP | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Znalezienie znacznika SunS, przej\u015bcie \u0142a\u0144cucha modeli, odczyt wsp\u00f3\u0142czynnik\u00f3w skali i typ\u00f3w danych oraz zamiana wyniku w czujnik Home Assistant.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Odczyt rejestr\u00f3w SunSpec z falownika PV przez Modbus TCP | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Znalezienie znacznika SunS, przej\u015bcie \u0142a\u0144cucha modeli, odczyt wsp\u00f3\u0142czynnik\u00f3w skali i typ\u00f3w danych oraz zamiana wyniku w czujnik Home Assistant.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-18T16:25:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T12:25:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/quality-hero-13064-20261024.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/smart-home-pl\\\/tutorials-pl-smart-home-pl\\\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/smart-home-pl\\\/tutorials-pl-smart-home-pl\\\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Odczyt rejestr\u00f3w SunSpec z falownika PV przez Modbus TCP\",\"datePublished\":\"2026-09-18T16:25:00+00:00\",\"dateModified\":\"2026-10-26T12:25:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/smart-home-pl\\\/tutorials-pl-smart-home-pl\\\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\\\/\"},\"wordCount\":1231,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/smart-home-pl\\\/tutorials-pl-smart-home-pl\\\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/quality-hero-13064-20261024.png\",\"keywords\":[\"Energy Management\",\"Home Assistant\",\"Modbus\",\"Photovoltaics\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/smart-home-pl\\\/tutorials-pl-smart-home-pl\\\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/smart-home-pl\\\/tutorials-pl-smart-home-pl\\\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/smart-home-pl\\\/tutorials-pl-smart-home-pl\\\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\\\/\",\"name\":\"Tutorial: Odczyt rejestr\u00f3w SunSpec z falownika PV przez Modbus TCP | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/smart-home-pl\\\/tutorials-pl-smart-home-pl\\\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/smart-home-pl\\\/tutorials-pl-smart-home-pl\\\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/quality-hero-13064-20261024.png\",\"datePublished\":\"2026-09-18T16:25:00+00:00\",\"dateModified\":\"2026-10-26T12:25:45+00:00\",\"description\":\"Znalezienie znacznika SunS, przej\u015bcie \u0142a\u0144cucha modeli, odczyt wsp\u00f3\u0142czynnik\u00f3w skali i typ\u00f3w danych oraz zamiana wyniku w czujnik Home Assistant.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/smart-home-pl\\\/tutorials-pl-smart-home-pl\\\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/smart-home-pl\\\/tutorials-pl-smart-home-pl\\\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/smart-home-pl\\\/tutorials-pl-smart-home-pl\\\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/quality-hero-13064-20261024.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/quality-hero-13064-20261024.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Odczyt rejestr\u00f3w SunSpec z falownika PV przez Modbus TCP\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/smart-home-pl\\\/tutorials-pl-smart-home-pl\\\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Odczyt rejestr\u00f3w SunSpec z falownika PV przez Modbus TCP\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Odczyt rejestr\u00f3w SunSpec z falownika PV przez Modbus TCP | Lukas Wojcik","description":"Znalezienie znacznika SunS, przej\u015bcie \u0142a\u0144cucha modeli, odczyt wsp\u00f3\u0142czynnik\u00f3w skali i typ\u00f3w danych oraz zamiana wyniku w czujnik Home Assistant.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Odczyt rejestr\u00f3w SunSpec z falownika PV przez Modbus TCP | Lukas Wojcik","og_description":"Znalezienie znacznika SunS, przej\u015bcie \u0142a\u0144cucha modeli, odczyt wsp\u00f3\u0142czynnik\u00f3w skali i typ\u00f3w danych oraz zamiana wyniku w czujnik Home Assistant.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-18T16:25:00+00:00","article_modified_time":"2026-10-26T12:25:45+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/quality-hero-13064-20261024.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Odczyt rejestr\u00f3w SunSpec z falownika PV przez Modbus TCP","datePublished":"2026-09-18T16:25:00+00:00","dateModified":"2026-10-26T12:25:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/"},"wordCount":1231,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/quality-hero-13064-20261024.png","keywords":["Energy Management","Home Assistant","Modbus","Photovoltaics","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/","name":"Tutorial: Odczyt rejestr\u00f3w SunSpec z falownika PV przez Modbus TCP | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/quality-hero-13064-20261024.png","datePublished":"2026-09-18T16:25:00+00:00","dateModified":"2026-10-26T12:25:45+00:00","description":"Znalezienie znacznika SunS, przej\u015bcie \u0142a\u0144cucha modeli, odczyt wsp\u00f3\u0142czynnik\u00f3w skali i typ\u00f3w danych oraz zamiana wyniku w czujnik Home Assistant.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/quality-hero-13064-20261024.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/quality-hero-13064-20261024.png","width":1200,"height":630,"caption":"Tutorial: Odczyt rejestr\u00f3w SunSpec z falownika PV przez Modbus TCP"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/smart-home-pl\/tutorials-pl-smart-home-pl\/tutorial-odczyt-rejestrow-sunspec-z-falownika-pv-przez-modbus-tcp\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Odczyt rejestr\u00f3w SunSpec z falownika PV przez Modbus TCP"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13064","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=13064"}],"version-history":[{"count":5,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13064\/revisions"}],"predecessor-version":[{"id":27374,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13064\/revisions\/27374"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/23776"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13064"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=13064"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}