{"id":409,"date":"2021-03-23T19:59:38","date_gmt":"2021-03-23T19:59:38","guid":{"rendered":"https:\/\/www.sydspost.nl\/?p=409"},"modified":"2022-02-13T14:34:11","modified_gmt":"2022-02-13T14:34:11","slug":"opbrengst-zonnepanelen-uitlezen-2","status":"publish","type":"post","link":"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/","title":{"rendered":"Opbrengst zonnepanelen uitlezen"},"content":{"rendered":"Dit project heeft tot doel om de opbrengst, en nog wat aanvullende gegevens, van mijn zonnepanelen uit te lezen en te presenteren in een mooi dashboard. Ik heb 20 zonnepanelen op mijn dak welke per 10 aangesloten zijn op 2 Delta Solivia Omvormers (Inverters).\n\n<!-- \/wp:post-content -->\n\n<!-- wp:paragraph -->\n\nDeze 2 omvormers hangen in de berging van mijn woning. Ik heb deze omvormers middels een standaard RJ-45 kabel op elkaar aangesloten, en vervolgens middels een standaard RJ-45 kabel waar ik \u00e9\u00e9n zijde van afgeknipt heb een middels een <span style=\"font-weight: 400;\">FT232RL + 75176 FTDI USB naar RS485 seri\u00eble adapter aangesloten op de USB-aansluiting van een Linksys NSLU2 (De NSLU2 is een netwerkapparaat dat wordt gemaakt door Linksys. <img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-415 alignright\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/31c6abj6wxL._AC_-192x300.jpg\" alt=\"\" width=\"192\" height=\"300\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/31c6abj6wxL._AC_-192x300.jpg 192w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/31c6abj6wxL._AC_.jpg 202w\" sizes=\"auto, (max-width: 192px) 100vw, 192px\" \/>Het wordt gebruikt om USB-opslagapparaten zoals USB-sticks en harde schijven met USB-interface toegankelijk te maken over een netwerk.). Deze NSLU2 had ik al jaren werkeloos is de doos liggen, maar is een ideaal apparaat om deze toepassing mee te realiseren. Natuurlijk kun je ook prima een Raspberry PI of ander linux doosje gebruiken. Dus deze afgestoft en van een vers Debian 7 linux operating voorzien en Python opgezet. Vervolgens twee python scripts en een shell-script gemaakt die de twee omvormers uitlezen en de output van de omvormers in JSON-formaat naar de MQTT-broker doorzet. Node-red pakt vervolgens deze output op en zet deze in een MariaDB-tabel. Tot slot met Google Data studio een flashy Dashboard gemaakt.<\/span> Hieronder een overzicht van mijn twee Delta Solivia omvormers:\n\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<table>\n<tbody>\n<tr>\n<td><span style=\"font-weight: 400;\">Solivia 2.5 EU G3<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Solivia 3.0 TR EU G4<\/span><\/td>\n<\/tr>\n<tr>\n<td><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-411\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/AF1QipOjEHlj3a68dBUjloXP0sZndY_s-cbW3UrG96HKw1024-h2048-150x300.jpg\" alt=\"\" width=\"150\" height=\"300\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/AF1QipOjEHlj3a68dBUjloXP0sZndY_s-cbW3UrG96HKw1024-h2048-150x300.jpg 150w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/AF1QipOjEHlj3a68dBUjloXP0sZndY_s-cbW3UrG96HKw1024-h2048-512x1024.jpg 512w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/AF1QipOjEHlj3a68dBUjloXP0sZndY_s-cbW3UrG96HKw1024-h2048-768x1536.jpg 768w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/AF1QipOjEHlj3a68dBUjloXP0sZndY_s-cbW3UrG96HKw1024-h2048.jpg 800w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/td>\n<td><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-412\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/AF1QipNGsp_T8TOLe4K2q1rFEhZ7UZIRD-GOTrabLmnVw1024-h2048-150x300.jpg\" alt=\"\" width=\"150\" height=\"300\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/AF1QipNGsp_T8TOLe4K2q1rFEhZ7UZIRD-GOTrabLmnVw1024-h2048-150x300.jpg 150w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/AF1QipNGsp_T8TOLe4K2q1rFEhZ7UZIRD-GOTrabLmnVw1024-h2048-512x1024.jpg 512w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/AF1QipNGsp_T8TOLe4K2q1rFEhZ7UZIRD-GOTrabLmnVw1024-h2048-768x1536.jpg 768w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/AF1QipNGsp_T8TOLe4K2q1rFEhZ7UZIRD-GOTrabLmnVw1024-h2048.jpg 800w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/td>\n<\/tr>\n<tr>\n<td><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-414\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/unnamed-1-300x153.png\" alt=\"\" width=\"300\" height=\"153\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/unnamed-1-300x153.png 300w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/unnamed-1.png 512w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/td>\n<td><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-413\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/unnamed-300x131.png\" alt=\"\" width=\"300\" height=\"131\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/unnamed-300x131.png 300w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/unnamed.png 512w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Variant 15 (paragraaf 8.6)<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Variant 105 (paragraaf 8.7)<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Serienr. 220268151317000697<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Serienr. 220287161303000538<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n\nBenodigdheden:\n\n<!-- \/wp:paragraph -->\n\n<!-- wp:group -->\n<div class=\"wp-block-group\">\n<div class=\"wp-block-group__inner-container\"><!-- wp:list -->\n<ul id=\"block-08879a84-aad4-4749-93b1-292a41b31ba6\">\n \t<li>3 RJ-45 kabels<\/li>\n \t<li><span style=\"font-weight: 400;\">FT232RL + 75176 FTDI USB naar RS485 seri\u00eble adapter<\/span><\/li>\n \t<li>USB 2.0 kabel A mannelijk &#8211; B mannelijk<\/li>\n \t<li>NSLU2 (of andere linux doos)<\/li>\n \t<li>Minimaal 4Gb USB-stick<\/li>\n \t<li>Vrije poort op je switch of router<\/li>\n \t<li>Optioneel: 3D printer + Filament, 2x female-female spacers 10mmx5mm, 2 schroefjes<\/li>\n<\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph --><span style=\"font-size: 14pt;\">Reeds ge\u00efnstalleerd en up-and-running:<\/span>\n\n<\/div>\n<\/div>\n<!-- \/wp:paragraph -->\n\n<!-- wp:group -->\n<div class=\"wp-block-group\">\n<div class=\"wp-block-group__inner-container\"><!-- wp:list -->\n<ul id=\"block-218b2791-add9-4135-9521-a707e28dee2b\">\n \t<li>Node-red<\/li>\n \t<li>MQTT<\/li>\n \t<li>MariaDB (MySQL)<\/li>\n \t<li>Google account<\/li>\n<\/ul>\n<!-- \/wp:list -->\n\n<\/div>\n<\/div>\n<!-- \/wp:group -->\n\n<!-- wp:paragraph -->\n\nPinout:\n<table>\n<tbody>\n<tr>\n<td colspan=\"2\" width=\"302\">\n<p style=\"text-align: center;\"><strong>Solivia 3.0<\/strong><\/p>\n<\/td>\n<td colspan=\"2\" width=\"302\">\n<p style=\"text-align: center;\"><strong>Solivia 2.5<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"151\"><strong>RJ-45 pin &#8211; draad<\/strong><\/td>\n<td width=\"151\"><strong>FT232RL<\/strong><\/td>\n<td width=\"151\"><strong>RJ-45 pin &#8211; draad<\/strong><\/td>\n<td width=\"151\"><strong>FT232RL<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"151\">8 &#8211; Bruin<\/td>\n<td width=\"151\">RX_B<\/td>\n<td width=\"151\">7 &#8211; Bruin\/wit<\/td>\n<td width=\"151\">TX_A<\/td>\n<\/tr>\n<tr>\n<td width=\"151\">7 &#8211; Bruin\/wit<\/td>\n<td width=\"151\">TX_A<\/td>\n<td width=\"151\">6 &#8211; Groen<\/td>\n<td width=\"151\">RX_B<\/td>\n<\/tr>\n<tr>\n<td width=\"151\">4 &#8211; Blauw<\/td>\n<td width=\"151\">Gnd<\/td>\n<td width=\"151\">4 &#8211; Blauw<\/td>\n<td width=\"151\">Gnd<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<span style=\"font-weight: 400;\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-416 aligncenter\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/pasted-image-0-1-1-300x225.png\" alt=\"\" width=\"451\" height=\"338\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/pasted-image-0-1-1-300x225.png 300w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/pasted-image-0-1-1.png 400w\" sizes=\"auto, (max-width: 451px) 100vw, 451px\" \/>Verbindingskabel tussen de twee omvormers is een\u00a0<\/span><span style=\"font-weight: 400;\">gewone standaard recht-toe-recht-aan RJ45 kabel, blijkbaar wordt intern in de omvormers de juiste verbinding gemaakt. Volgens onderstaand plaatje zou bij meer dan \u00e9\u00e9n inverter een 120R terminator geplaatst moeten worden. Echter toen ik deze terminator plaatste kreeg ik geen data binnen, en zonder doet hij het ook prima, dus geen terminator toegepast.<\/span> <img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-417 aligncenter\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/unnamed-300x282.jpg\" alt=\"\" width=\"300\" height=\"282\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/unnamed-300x282.jpg 300w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/unnamed.jpg 512w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/> Connectietest: Voor een eerste test of er een connectie te maken valt met de omvormers heb ik de tool DeltaSolviaProtocolTest ge\u00efnstalleerd op mijn Windows laptop. Je kunt gewoon de zip uitpakken in een map en de executable opstarten. De tool detecteert zelf automatisch de COM-poort waarop de <span style=\"font-weight: 400;\">FT232RL adapter aangesloten zit, je moet hem alleen nog even selecteren. Baudrate, Parity en stopbits instellen op 19200,n,8,1, Timeout kun je standaard houden. Het is handig om eerst \u00e9\u00e9n omvormer te testen, dus haal de verbindingskabel nog even los. Standaard staat namelijk het RS485 adres van de omvormer op de waarde 1 ingesteld, met de verbindingskabel aangesloten weet het tool niet welke omvormer reageert. Later stellen we de juiste RS485 adressen op de omvormers in.<\/span> <img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-419 aligncenter\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/pasted-image-0-2-262x300.png\" alt=\"\" width=\"262\" height=\"300\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/pasted-image-0-2-262x300.png 262w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/pasted-image-0-2.png 484w\" sizes=\"auto, (max-width: 262px) 100vw, 262px\" \/> Klik vervolgens willekeurig \u00e9\u00e9n van de blauwe linkjes aan, bijv. DC Cur 1, en klik op Send. Als het goed is zie je een Send: bericht, en darna een Port event received: bericht. Het werkt ! Probeer dit uit op beide omvormers, eerst zonder verbindingskabel. Krijg je een timeout, check dan nog even goed je kabel en pinout ! Mijn timeouts werden veroorzaakt doordat het klipje van de RJ45 connector niet goed in de RJ45-aansluiting van de Delta Solivia 3.0 klikte en los zat.\n\n<span style=\"font-weight: 400;\">Tools:<\/span>\n\nWindows:\u00a0<a href=\"https:\/\/forums.whirlpool.net.au\/go?http%3A%2F%2Fwww.bettersoftware.com.au%2FDeltaSoliviaProtocolTest.zip\"><span style=\"font-weight: 400;\">http:\/\/www.bettersoftware.com.au\/DeltaSoliviaProtocolTest.zip<\/span><\/a>\n\nLinux:\n<ul>\n \t<li><span style=\"font-weight: 400;\">unset_serial_ctrlchars.sh \/dev\/ttyUSB1<\/span><\/li>\n \t<li><span style=\"font-weight: 400;\">sudo apt-get install jpnevulator<\/span><\/li>\n \t<li><span style=\"font-weight: 400;\">jpnevulator &#8211;ascii &#8211;timing-print &#8211;tty \/dev\/ttyUSB1 &#8211;read<\/span><\/li>\n<\/ul>\nStel vervolgens een ander RS485 adres in op \u00e9\u00e9n van de omvormers, dit adres kan een waarde hebben tussen de 1 en 254. Volg de instructies in de gebruikershandleiding van je omvormer om het adres aan te passen. Ik heb mijn Solivia 3.0 op de default waarde 1 laten staan, en de Solivia 2.5 op de waarde 2. Zet de baudrate op 19200: <img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-420 aligncenter\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-12-300x235.jpg\" alt=\"\" width=\"300\" height=\"235\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-12-300x235.jpg 300w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-12.jpg 704w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>\n\nCasing voor de FT232RL:\n\nDe FT232RL wordt zonder casing geleverd.\n\n<img decoding=\"async\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1203\/6274\/products\/SKU172610b_06a08786-a368-44f3-83e7-70ff2e216610@2x.jpg?v=1618546733\" \/>\n\nOp Thingsverse vond ik een casing voor de adapter. Deze geprint op m&#8217;n 3D printer. De bestanden vindt je hier:\n<ul>\n \t<li>Cover:\u00a0<a href=\"https:\/\/drive.google.com\/file\/d\/1F2BgeZa6pmXcSo61dwrS96P0A5ET6YgE\/view?usp=sharing\">https:\/\/drive.google.com\/file\/d\/1F2BgeZa6pmXcSo61dwrS96P0A5ET6YgE\/view?usp=sharing<\/a><\/li>\n \t<li>Case:\u00a0<a href=\"https:\/\/drive.google.com\/file\/d\/174UoRRUeoo3FSdPu-MEKfaheaOAnN4kE\/view?usp=sharing\">https:\/\/drive.google.com\/file\/d\/174UoRRUeoo3FSdPu-MEKfaheaOAnN4kE\/view?usp=sharing<\/a><\/li>\n<\/ul>\nBovenstaande onderdelen geprint op m\u2019n Creality Ender 5 Pro 3D printer, met de volgende settings:\n<figure class=\"wp-block-table\">\n<table>\n<tbody>\n<tr>\n<td>Setting<\/td>\n<td>Waarde<\/td>\n<\/tr>\n<tr>\n<td>Extruder temperature<\/td>\n<td>200<sup>o<\/sup><\/td>\n<\/tr>\n<tr>\n<td>Hotbed temperature<\/td>\n<td>50<sup>o<\/sup><\/td>\n<\/tr>\n<tr>\n<td>Layer height<\/td>\n<td>0,12 mm<\/td>\n<\/tr>\n<tr>\n<td>Infill density<\/td>\n<td>20% cubic<\/td>\n<\/tr>\n<tr>\n<td>Wall\/Top thickness<\/td>\n<td>0,8 mm<\/td>\n<\/tr>\n<tr>\n<td>Generate support<\/td>\n<td>Uitgevinkt<\/td>\n<\/tr>\n<tr>\n<td>Retraction<\/td>\n<td>Aangevinkt<\/td>\n<\/tr>\n<tr>\n<td>Printing Speed<\/td>\n<td>80mm\/s<\/td>\n<\/tr>\n<tr>\n<td>Cooling<\/td>\n<td>100%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\nHieronder de onderdelen, printtijd, kleur en verbruik van PLA\n<figure class=\"wp-block-table\">\n<table>\n<tbody>\n<tr>\n<td>Onderdeel<\/td>\n<td>Kleur<\/td>\n<td>Doorlooptijd in minuten<\/td>\n<td>Gram<\/td>\n<td>File<\/td>\n<\/tr>\n<tr>\n<td>Cover<\/td>\n<td>Grijs<\/td>\n<td>18<\/td>\n<td>1<\/td>\n<td>Cover.stl<\/td>\n<\/tr>\n<tr>\n<td>Case<\/td>\n<td>Grijs<\/td>\n<td>163<\/td>\n<td>14<\/td>\n<td>Case.stl<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\nDe gaatjes in de casing heb ik iets groter gemaakt met een 5mm boortje en er twee nylon female-female spacers van 10mm bij 5mm in geperst. De FT232RL adapter vervolgens in de geleiders geplaatst en het dekseltje met 2 nylon schroefjes vastgezet.\n\nEn het resultaat:\n\n<div id='gallery-1' class='gallery galleryid-409 gallery-columns-2 gallery-size-large'><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/img_20220213_151647\/'><img loading=\"lazy\" decoding=\"async\" width=\"880\" height=\"440\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/IMG_20220213_151647-1024x512.jpg\" class=\"attachment-large size-large\" alt=\"\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/IMG_20220213_151647-1024x512.jpg 1024w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/IMG_20220213_151647-300x150.jpg 300w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/IMG_20220213_151647-768x384.jpg 768w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/IMG_20220213_151647-1536x768.jpg 1536w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/IMG_20220213_151647-2048x1024.jpg 2048w\" sizes=\"auto, (max-width: 880px) 100vw, 880px\" \/><\/a>\n\t\t\t<\/div><\/figure><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/img_20220213_151854\/'><img loading=\"lazy\" decoding=\"async\" width=\"880\" height=\"440\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/IMG_20220213_151854-1024x512.jpg\" class=\"attachment-large size-large\" alt=\"\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/IMG_20220213_151854-1024x512.jpg 1024w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/IMG_20220213_151854-300x150.jpg 300w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/IMG_20220213_151854-768x384.jpg 768w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/IMG_20220213_151854-1536x768.jpg 1536w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/IMG_20220213_151854-2048x1024.jpg 2048w\" sizes=\"auto, (max-width: 880px) 100vw, 880px\" \/><\/a>\n\t\t\t<\/div><\/figure>\n\t\t<\/div>\n\n\nNSLU2:\n\nNSLU2 van &#8220;vers&#8221; operating systeem voorzien, nou ja vers, Debian 7 is de laatste versie waarin de NSLU2 ondersteund wordt. Aangezien dit systeem uitsluitend intern wordt gebruikt, en geen connecties van buitenaf nodig heeft, voor mij niet een ramp.\n<ul>\n \t<li><span style=\"font-weight: 400;\">NSLU2 Debian 7 firmware + OS ge\u00efnstalleerd conform beschrijving op <\/span><a href=\"https:\/\/www.cyrius.com\/debian\/nslu2\/unpack\/\"><span style=\"font-weight: 400;\">https:\/\/www.cyrius.com\/debian\/nslu2\/unpack\/<\/span><\/a><\/li>\n \t<li>Verder qua inrichting het minimale gedaan, alleen de hostname gezet, het root wachtwoord aangepast en de NTP client ge\u00efnstalleerd en geconfigureerd naar de time servers van google<\/li>\n \t<li>De APT bibliotheek nog gerefreshed met: <code>sudo apt-get update<\/code><\/li>\n \t<li>NLSU2 met ethernet kabel aangesloten op een switch, en de USB kabel van de <span style=\"font-weight: 400;\">FT232RL adapter op de nog vrije USB poort van de NLSU2 aangesloten.<\/span><\/li>\n<\/ul>\nPython:\n\n<span style=\"font-weight: 400;\">Python3 ge\u00efnstalleerd:<\/span>\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">PIP ge\u00efnstalleerd met<\/span><\/span>\n<pre class=\"code-pre \"><code>sudo apt-get install python3-pip<\/code><\/pre>\nNote: Bij een herinstallatie werkten pip en pip3 niet, dit opgelost door:\n<pre class=\"code-pre \"><code>cd \/tmp\ncurl https:\/\/bootstrap.pypa.io\/get-pip.py -o get-pip.py\nsudo python3 get-pip.py<\/code><\/pre>\n<\/li>\n \t<li><span style=\"font-weight: 400;\">pyserial met PIP ge\u00efnstalleerd met\u00a0<\/span>\n<pre class=\"code-pre \"><code>sudo pip3 install pyserial<\/code><\/pre>\n<\/li>\n \t<li><span style=\"font-weight: 400;\">Git ge\u00efnstalleerd <\/span><span style=\"font-weight: 400;\">met\u00a0<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"code-pre \"><code>sudo apt-get install git<\/code><\/pre>\n<ul>\n \t<li><span style=\"font-weight: 400;\">map \/root\/python aangemaakt<\/span> <span style=\"font-weight: 400;\">mkdir \/root\/python<\/span><\/li>\n \t<li><span style=\"font-weight: 400;\">cd \/root\/python<\/span><\/li>\n<\/ul>\nVoorbeeld python scripts aangepast naar Solivia 3.0 en 2.5:\n<ul>\n \t<li><span style=\"font-weight: 400;\">Met Git Python scripts van <\/span><a href=\"https:\/\/github.com\/bbinet\/delta-rpi\"><span style=\"font-weight: 400;\">https:\/\/github.com\/bbinet\/delta-rpi<\/span><\/a><span style=\"font-weight: 400;\"> gehaald<\/span> met<\/li>\n<\/ul>\n<pre class=\"code-pre \"><code>git clone https:\/\/github.com\/bbinet\/delta-rpi<\/code><\/pre>\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li>cd delta-rpi<\/li>\n \t<li><span style=\"font-weight: 400;\">python script delta-rpi.py gekopieerd naar delta-solivia3.0.py respectievelijk delta-solivia2.5.py met<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"code-pre \"><code>cp delta-rpi.py delta-solivia3.0.py\n\ncp delta-rpi.py delta-solivia2.5.py<\/code><\/pre>\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li><span style=\"font-weight: 400;\">Conform <a href=\"https:\/\/forums.ni.com\/ni\/attachments\/ni\/170\/1007166\/1\/Public%20RS485%20Protocol%201V2.pdf\">Public RS485 Protocol 1V2.pdf<\/a> \u201cPublic Solar Inverter\u00a0 Communication<\/span> <span style=\"font-weight: 400;\">Protocol (Version 1.2)\u201d van Delta Energy Systems, paragraaf 8.7 (Solivia 3.0 EU G4 TR = Variant 105 ) de DELTA_RPI_STRUCT in python script delta-solivia3.0.py aangepast, er voor gezorgd dat er JSON uit komt samen met wat andere noodzakelijke aanpassingen (geel gekleurd)<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"code-pre \"><code>#!\/usr\/bin\/python3\n# -*- coding: utf-8 -*-\n\nimport time\nimport binascii\nimport struct\nimport serial\nimport sys\nimport os\nimport signal\n<span style=\"color: #ffff00;\">from datetime import datetime<\/span>\nfrom argparse import ArgumentParser\nfrom pprint import pprint\n\nimport crc16\n\n\n<span style=\"color: #ffff00;\">def ma_mi_bf(data):\n    ma, mi, bf = struct.unpack('&gt;BBB', data)\n    return '{:02d}.{:02d}.{:02d}'.format(ma, mi, bf)<\/span>\n\n\nDEBUG=False\nREAD_BYTES = 1024\nSTX=0x02\nETX=0x03\nENQ=0x05\nACK=0x06\nNAK=0x15\n# Variables in the data-block of a Delta RPI M-series inverter,\n# as far as I've been able to establish their meaning.\n# The fields for each variable are as follows:\n# name, struct, size in bytes, decoder, multiplier-exponent (10^x), unit, SunSpec equivalent\n<span style=\"color: #ffff00;\">DELTA_RPI = (\n    (\"SAP part number\", \"11s\", str),\n    (\"SAP serial number\", \"18s\", str),\n    (\"SAP date code\", \"4s\", binascii.hexlify),\n    (\"SAP revision\", \"2s\", binascii.hexlify),\n    (\"Software Revision System controller\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision Power controller\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision ENS controller\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision Watch dog controller\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision DC controller\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision DC 1\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision DC 2\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision DC 3\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision AC\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision AC 1\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision AC 2\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision AC 3\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision reserved\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Solar Power at Input 1\", \"H\", int, 0, \"W\"),\n    (\"Solar Voltage at Input 1\", \"H\", int, 0, \"V\"),\n    (\"Solar Current at Input 1\", \"H\", int, 0, \"A\"),\n    (\"Solar Power at Input 2\", \"H\", int, 0, \"W\"),\n    (\"Solar Voltage at Input 2\", \"H\", int, 0, \"V\"),\n    (\"Solar Current at Input 2\", \"H\", int, 0, \"A\"),\n    (\"Solar Power at Input 3\", \"H\", int, 0, \"W\"),\n    (\"Solar Voltage at Input 3\", \"H\", int, 0, \"V\"),\n    (\"Solar Current at Input 3\", \"H\", int, 0, \"A\"),\n    (\"AC Current(Phase1)\", \"H\", int, 0, \"A\", \"AphA\"),\n    (\"AC Voltage(Phase1)\", \"H\", int, 0, \"V\"),\n    (\"AC Frequency(Phase1)\", \"H\", int, 0, \"Hz\"),\n    (\"AC Active Power(Phase1)\", \"H\", int, 0, \"W\"),\n    (\"AC Reactive Power(Phase1)\", \"h\", int, 0, \"VAR\"),\n    (\"AC Current(Phase2)\", \"H\", int, 0, \"A\", \"AphA\"),\n    (\"AC Voltage(Phase2)\", \"H\", int, 0, \"V\"),\n    (\"AC Frequency(Phase2)\", \"H\", int, 0, \"Hz\"),\n    (\"AC Active Power(Phase2)\", \"H\", int, 0, \"W\"),\n    (\"AC Reactive Power(Phase2)\", \"h\", int, 0, \"VAR\"),\n    (\"AC Current(Phase3)\", \"H\", int, 0, \"A\", \"AphA\"),\n    (\"AC Voltage(Phase3)\", \"H\", int, 0, \"V\"),\n    (\"AC Frequency(Phase3)\", \"H\", int, 0, \"Hz\"),\n    (\"AC Active Power(Phase3)\", \"H\", int, 0, \"W\"),\n    (\"AC Reactive Power(Phase3)\", \"h\", int, 0, \"VAR\"),\n    (\"Solar Isolation plus\", \"H\", int, 0, \"kOhm\"),\n    (\"Solar Isolation minus\", \"H\", int, 0, \"kOhm\"),\n    (\"Temperature amb\", \"h\", int, 0, \"Celsius\"),\n    (\"Temperature heatsink\", \"h\", int, 0, \"Celsius\"),\n    (\"Supplied ac energy (total)\", \"Q\", int, 0, \"Wh\"),\n    (\"Inverter runtime (total)\", \"L\", int, 0, \"Minutes\"),\n    (\"Status AC Output 1\", \"L\", int),\n    (\"Status AC Output 2\", \"L\", int),\n    (\"Status AC Output 3\", \"L\", int),\n    (\"Status AC Output 4\", \"L\", int),\n    (\"Internal Status 1\", \"L\", int),\n    (\"Internal Status 2\", \"L\", int),\n    (\"Internal Status 3\", \"L\", int),\n    (\"Internal Status 4\", \"L\", int),\n    (\"Supplied ac energy (day)\", \"Q\", int, 0, \"Wh\"),\n    (\"Inverter runtime (day)\", \"I\", int, 0, \"Minute\"),\n    (\"reserved\", \"67s\", binascii.hexlify),\n)<\/span>\nDELTA_RPI_STRUCT = '&gt;' + ''.join([item[1] for item in DELTA_RPI])\nDUMMY_DATA = (\n    b'802FA0E1000',  # SAP part number\n    b'O1S16300040WH',  # SAP serial number\n    b'0901',  # SAP date code\n    b'0\\x00',  # SAP revision\n    b'\\x01#',  # DSP FW Rev\n    b'\\x0f0',  # DSP FW Date\n    b'\\x01\\r',  # Redundant MCU FW Rev\n    b'\\x0f\\x0e',  # Redundant MCU FW Date\n    b'\\x01\\x10',  # Display MCU FW Rev\n    b'\\x0f0',  # Display MCU FW Date\n    b'\\x00\\x00',  # Display WebPage Ctrl FW Rev\n    b'\\x00\\x00',  # Display WebPage Ctrl FW Date\n    b'\\x00\\x00',  # Display WiFi Ctrl FW Rev\n    b'\\x00\\x00',  # Display WiFi Ctrl FW Date\n    0,  # AC Voltage(Phase1)\n    0,  # AC Current(Phase1)\n    0,  # AC Power(Phase1)\n    0,  # AC Frequency(Phase1)\n    0,  # AC Voltage(Phase1) [Redundant]\n    0,  # AC Frequency(Phase1) [Redundant]\n    0,  # AC Voltage(Phase2)\n    0,  # AC Current(Phase2)\n    0,  # AC Power(Phase2)\n    0,  # AC Frequency(Phase2)\n    0,  # AC Voltage(Phase2) [Redundant]\n    0,  # AC Frequency(Phase2) [Redundant]\n    0,  # AC Voltage(Phase3)\n    0,  # AC Current(Phase3)\n    0,  # AC Power(Phase3)\n    0,  # AC Frequency(Phase3)\n    0,  # AC Voltage(Phase3) [Redundant]\n    0,  # AC Frequency(Phase3) [Redundant]\n    0,  # Solar Voltage at Input 1\n    0,  # Solar Current at Input 1\n    0,  # Solar Power at Input 1\n    0,  # Solar Voltage at Input 2\n    0,  # Solar Current at Input 2\n    0,  # Solar Power at Input 2\n    0,  # ACPower\n    0,  # (+) Bus Voltage\n    0,  # (-) Bus Voltage\n    0,  # Supplied ac energy today\n    0,  # Inverter runtime today\n    0,  # Supplied ac energy (total)\n    0,  # Inverter runtime (total)\n    0,  # Calculated temperature inside rack\n    0,  # Status AC Output 1\n    0,  # Status AC Output 2\n    0,  # Status AC Output 3\n    0,  # Status AC Output 4\n    0,  # Status DC Input 1\n    0,  # Status DC Input 2\n    0,  # Error Status\n    0,  # Error Status AC 1\n    0,  # Global Error 1\n    0,  # CPU Error\n    0,  # Global Error 2\n    0,  # Limits AC output 1\n    0,  # Limits AC output 2\n    0,  # Global Error 3\n    0,  # Limits DC 1\n    0,  # Limits DC 2\n    b'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00',  # History status messages\n)\n\n\ndef signal_handler(signal, frame):\n    ''' Catch SIGINT\/SIGTERM\/SIGKILL and exit gracefully '''\n    print(\"Stop requested...\")\n    sys.exit(0)\nsignal.signal(signal.SIGINT, signal_handler)\nsignal.signal(signal.SIGTERM, signal_handler)\n\n\ndef send(conn, req, cmd, subcmd, data=b'', addr=1):\n    \"\"\"\n    Send cmd\/subcmd (e.g. 0x60\/0x01) and optional data to the RS485 bus\n    \"\"\"\n    assert req in (ENQ, ACK, NAK)  # req should be one of ENQ, ACK, NAK\n    msg = struct.pack('BBBBB', req, addr, 2 + len(data), cmd, subcmd)\n    if len(data) &gt; 0:\n        msg = struct.pack('5s%ds' % len(data), msg, data)\n    crcval = crc16.calcData(msg)\n    lsb = crcval &amp; (0xff)\n    msb = (crcval &gt;&gt; 8) &amp; 0xff\n    data = struct.pack('B%dsBBB' % len(msg), STX, msg, lsb, msb, ETX)\n    if DEBUG: print(\"&gt;&gt;&gt; SEND:\", binascii.hexlify(msg), \"=&gt;\", binascii.hexlify(data))\n    conn.write(data)\n    conn.flush()\n\n\ndef receive(conn):\n    \"\"\"\n    Attempt to read messages from a serial connection\n    \"\"\"\n    data = bytearray()\n    while True:\n        buf = conn.read(READ_BYTES)\n        if buf:\n            if DEBUG: print(\"&gt;&gt;&gt; RAW RECEIVE:\", buf)\n            data.extend(buf)\n        if (not buf) or len(buf) &lt; READ_BYTES:\n            break\n\n    idx = 0\n    while idx + 9 &lt;= len(data):\n        if data[idx] != STX:\n            idx += 1\n            continue\n        stx, req, addr, size = struct.unpack('&gt;BBBB', data[idx:idx+4])\n        if req not in (ENQ, ACK, NAK):\n            print(\"Bad req value: {:02x} (should be one of ENQ\/ACK\/NAK)\".format(req))\n            idx += 1\n            continue\n        if idx + 4 + size &gt;= len(data):\n            print(\"Can't read %d bytes from buffer\" % size)\n            idx += 1\n            continue\n        msg, lsb, msb, etx = struct.unpack('&gt;%dsBBB' % size, data[idx+4:idx+7+size])\n        if etx != ETX:\n            print(\"Bad ETX value: {:02x}\".format(etx))\n            idx += 1\n            continue\n        crc_calc = crc16.calcData(data[idx+1:idx+4+size])\n        crc_msg = msb &lt;&lt; 8 | lsb\n        if crc_calc != crc_msg:\n            print(\"Bad CRC check: %s &lt;&gt; %s\" % (binascii.hexlify(crc_calc), binascii.hexlify(crc_msg)))\n            idx += 1\n            continue\n\n        if DEBUG: print(\"&gt;&gt;&gt; RECV:\", binascii.hexlify(data), \"=&gt;\", binascii.hexlify(msg))\n        yield {\n            \"stx\": stx,\n            \"req\": req,\n            \"addr\": addr,\n            \"size\": size,\n            \"msg\": msg,\n            \"lsb\": lsb,\n            \"msb\": msb,\n            \"etx\": etx,\n        }\n        idx += 4 + size\n\n\ndef decode_msg(data):\n    req = data['req']\n    cmd, cmdsub = struct.unpack('&gt;BB', data['msg'][0:2])\n    data['cmd'] = cmd\n    data['cmdsub'] = cmdsub\n    data['raw'] = data['msg'][2:]\n    if req == NAK:\n        print(\"NAK value received: cmd\/subcmd request was invalid\".format(req))\n    elif req == ENQ:\n        if DEBUG: print(\"ENQ value received: request from master (datalogger)\")\n    elif req == ACK:\n        if DEBUG: print(\"ACK value received: response from slave (inverter)\")\n        data['values'] = struct.unpack(DELTA_RPI_STRUCT, data['raw'])\n    if DEBUG: pprint(data)\n    return data\n\n\ndef main():\n    global DEBUG, MODE\n    parser = ArgumentParser(description='Delta inverter simulator (slave mode) or datalogger (master mode) for RPI M8A')\n    parser.add_argument('-a', metavar='ADDRESS', type=int,\n                      default=1,\n                      help='slave address [default: 1]')\n    parser.add_argument('-d', metavar='DEVICE',\n                      default='\/dev\/ttyUSB0',\n                      help='serial device port [default: \/dev\/ttyUSB0]')\n    parser.add_argument('-b', metavar='BAUDRATE',\n                      default=9600,\n                      help='baud rate [default: 9600]')\n    parser.add_argument('-t', metavar='TIMEOUT', type=float,\n                      default=2.0,\n                      help='timeout, in seconds (can be fractional, such as 1.5) [default: 2.0]')\n    parser.add_argument('--debug', action=\"store_true\",\n                      help='show debug information')\n    parser.add_argument('mode', metavar='MODE', choices=['master', 'slave'],\n                      help='mode can either be \"master\" or \"slave\"')\n\n    args = parser.parse_args()\n    DEBUG = args.debug\n    MODE = args.mode\n\n    conn = serial.Serial(args.d, args.b, timeout=args.t);\n    conn.flushOutput()\n    conn.flushInput()\n    if MODE == 'master':\n        send(conn, ENQ, 0x60, 0x01, addr=args.a)\n        time.sleep(0.1)\n    for data in receive(conn):\n        if MODE == 'master' and data['addr'] == args.a and data['req'] in (ACK, NAK,):\n            d = decode_msg(data)\n            if d['req'] == ACK:\n                if not (d['cmd'] == 0x60 and d['cmdsub'] == 0x01):\n                    print(\"Can't decode request cmd=0x%02X, cmdsub=0x%02X\" % (d['cmd'], d['cmdsub']))\n                    print(\"The only supported request is cmd=0x60, cmdsub=0x01\")\n                    continue\n<span style=\"color: #ffff00;\">            #    print(61 * '=')\n            print('{')\n            print('\"inverter\": 1,')\n            print('\"Datetime\": \"', datetime.now(), '\",')\n            for i, item in enumerate(DELTA_RPI):\n                label = item[0]\n                decoder = item[2]\n                scale = item[3] if len(item) &gt; 3 else 0\n                units = item[4] if len(item) &gt; 4 else ''\n                value = decoder(data['values'][i])\n                if decoder == float:\n                    value = value * pow(10, scale)\n                # print('%-40s %20s %-10s' % (label, value, units))\n                print(' \"' + label + '\": [')\n                print(' {')\n                print(' \"Value\": ', end='')\n                if isinstance(value, str) :\n                    print('\"', end='')\n                    print(value, end='')\n                    print('\",')\n                elif isinstance(value, int) :\n                    print(value, end='')\n                    print(',')\n                else:\n                    print('\"', end='')\n                    print(value.decode('ascii'), end='')\n                    print('\",')\n                print('\"Units\": \"' + units + '\"')\n                print('}')\n                print('],')\n            print(' \"end\": \"TRUE\"')\n            print('}')<\/span>\n        if MODE == 'slave' and data['addr'] == args.a and data['req'] in (ENQ,):\n            d = decode_msg(data)\n            if d['cmd'] == 0x60 and d['cmdsub'] == 0x01:\n                raw = struct.pack(DELTA_RPI_STRUCT, *DUMMY_DATA)\n                send(conn, ACK, 0x60, 0x01, data=raw, addr=args.a)\n            else:\n                print(\"This simulator only replies to cmd=0x60 cmdsub=0x01 requests...\")\n\n\nif __name__ == \"__main__\":\n    main()\n<\/code><\/pre>\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li><span style=\"font-weight: 400;\">Conform <a href=\"https:\/\/forums.ni.com\/ni\/attachments\/ni\/170\/1007166\/1\/Public%20RS485%20Protocol%201V2.pdf\">Public RS485 Protocol 1V2.pdf<\/a> \u201cPublic Solar Inverter\u00a0 Communication<\/span> <span style=\"font-weight: 400;\">Protocol (Version 1.2)\u201d van Delta Energy Systems, paragraaf 8.6 (Solivia 2.5 EU G3 = Variant 15\u00a0 de DELTA_RPI_STRUCT in python script delta-solivia2.5.py aangepast<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"code-pre \"><code>#!\/usr\/bin\/python3\n# -*- coding: utf-8 -*-\n\nimport time\nimport binascii\nimport struct\nimport serial\nimport sys\nimport os\nimport signal\n<span style=\"color: #ffff00;\">from datetime import datetime<\/span>\nfrom argparse import ArgumentParser\nfrom pprint import pprint\n\nimport crc16\n\n\n<span style=\"color: #ffff00;\">def ma_mi_bf(data):\n    ma, mi, bf = struct.unpack('&gt;BBB', data)\n    return '{:02d}.{:02d}.{:02d}'.format(ma, mi, bf)<\/span>\n\n\nDEBUG=False\nREAD_BYTES = 1024\nSTX=0x02\nETX=0x03\nENQ=0x05\nACK=0x06\nNAK=0x15\n# Variables in the data-block of a Delta RPI M-series inverter,\n# as far as I've been able to establish their meaning.\n# The fields for each variable are as follows:\n# name, struct, size in bytes, decoder, multiplier-exponent (10^x), unit, SunSpec equivalent\n<span style=\"color: #ffff00;\">DELTA_RPI = (\n    (\"SAP part number\", \"11s\", str),\n    (\"SAP serial number\", \"18s\", str),\n    (\"SAP date code\", \"4s\", binascii.hexlify),\n    (\"SAP revision\", \"2s\", binascii.hexlify),\n    (\"Software Revision AC control\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision DC control\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision display\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Software Revision SC control\", \"3s\", ma_mi_bf, 0, \"Major,Minor,Bug fixing\"),\n    (\"Solar Voltage at Input 1\", \"H\", int, 0, \"V\"),\n    (\"Solar Current at Input 1\", \"H\", int, 0, \"A\"),\n    (\"Solar Isolation resistance at Input 1\", \"H\", int, 0, \"kOhm\"),\n    (\"Calculated temperature at ntc (DC side)\", \"h\", int, 0, \"C\"),\n    (\"Solar Input MOV resistance\", \"H\", int, 0, \"kOhm\"),\n    (\"AC Current\", \"H\", int, 0, \"A\"),\n    (\"AC Voltage\", \"H\", int, 0, \"V\"),\n    (\"AC Power\", \"H\", int, 0, \"W\"),\n    (\"AC Frequency\", \"H\", int, 0, \"Hz\"),\n    (\"Calculated temperature at ntc (AC side)\", \"h\", int, 0, \"C\"),\n    (\"SC Grid Voltage\", \"H\", int, 0, \"V\"),\n    (\"SC Grid ens Frequency\", \"H\", int, 0, \"Hz\"),\n    (\"SC Grid DC injection current\", \"H\", int, 0, \"A\"),\n    (\"AC Grid Voltage\", \"H\", int, 0, \"V\"),\n    (\"AC Grid Frequency\", \"H\", int, 0, \"Hz\"),\n    (\"AC Grid DC injection current\", \"H\", int, 0, \"A\"),\n    (\"Day Supplied ac energy\", \"H\", int, 0, \"Wh\"),\n    (\"Inverter runtime\", \"H\", int, 0, \"Minutes\"),\n    (\"Maximum ac current of today\", \"H\", int, 0, \"A\"),\n    (\"Minimum ac voltage of today\", \"H\", int, 0, \"V\"),\n    (\"Maximum ac voltage of today\", \"H\", int, 0, \"V\"),\n    (\"Maximum ac power of today\", \"H\", int, 0, \"W\"),\n    (\"Minimum ac frequency of today\", \"H\", int, 0, \"Hz\"),\n    (\"Maximum ac frequency of today\", \"H\", int, 0, \"Hz\"),\n    (\"Supplied ac energy\", \"L\", int, 0, \"kWh\"),\n    (\"Inverter runtime\", \"L\", int, 0, \"Hours\"),\n    (\"Maximum solar 1 input current\", \"H\", int, 0, \"A\"),\n    (\"Maximum solar 1 input voltage\", \"H\", int, 0, \"V\"),\n    (\"Maximum solar 1 input power\", \"H\", int, 0, \"W\"),\n    (\"Minimum Isolation resistance solar 1\", \"H\", int, 0, \"kOhm\"),\n    (\"Maximum Isolation resistance solar 1\", \"H\", int, 0, \"kOhm\"),\n    (\"Alarm status\", \"1s\", binascii.hexlify),\n    (\"Status DC input\", \"1s\", binascii.hexlify),\n    (\"Limits DC input\", \"1s\", binascii.hexlify),\n    (\"Status AC output\", \"1s\", binascii.hexlify),\n    (\"Limits AC output\", \"1s\", binascii.hexlify),\n    (\"Warning status\", \"1s\", binascii.hexlify),\n    (\"DC hardware failure\", \"1s\", binascii.hexlify),\n    (\"AC hardware failure\", \"1s\", binascii.hexlify),\n    (\"SC hardware failure\", \"1s\", binascii.hexlify),\n    (\"Internal Bulk failure\", \"1s\", binascii.hexlify),\n    (\"Internal communications failure\", \"1s\", binascii.hexlify),\n    (\"AC hardware disturbance\", \"1s\", binascii.hexlify),\n    (\"DC HW stage error\", \"1s\", binascii.hexlify),\n    (\"Calibration Status\", \"1s\", binascii.hexlify),\n    (\"Neutral error\", \"1s\", binascii.hexlify),\n    (\"History status messages\", \"20s\", binascii.hexlify),\n)<\/span>\nDELTA_RPI_STRUCT = '&gt;' + ''.join([item[1] for item in DELTA_RPI])\nDUMMY_DATA = (\n    b'802FA0E1000',  # SAP part number\n    b'O1S16300040WH',  # SAP serial number\n    b'0901',  # SAP date code\n    b'0\\x00',  # SAP revision\n    b'\\x01#',  # DSP FW Rev\n    b'\\x0f0',  # DSP FW Date\n    b'\\x01\\r',  # Redundant MCU FW Rev\n    b'\\x0f\\x0e',  # Redundant MCU FW Date\n    b'\\x01\\x10',  # Display MCU FW Rev\n    b'\\x0f0',  # Display MCU FW Date\n    b'\\x00\\x00',  # Display WebPage Ctrl FW Rev\n    b'\\x00\\x00',  # Display WebPage Ctrl FW Date\n    b'\\x00\\x00',  # Display WiFi Ctrl FW Rev\n    b'\\x00\\x00',  # Display WiFi Ctrl FW Date\n    0,  # AC Voltage(Phase1)\n    0,  # AC Current(Phase1)\n    0,  # AC Power(Phase1)\n    0,  # AC Frequency(Phase1)\n    0,  # AC Voltage(Phase1) [Redundant]\n    0,  # AC Frequency(Phase1) [Redundant]\n    0,  # AC Voltage(Phase2)\n    0,  # AC Current(Phase2)\n    0,  # AC Power(Phase2)\n    0,  # AC Frequency(Phase2)\n    0,  # AC Voltage(Phase2) [Redundant]\n    0,  # AC Frequency(Phase2) [Redundant]\n    0,  # AC Voltage(Phase3)\n    0,  # AC Current(Phase3)\n    0,  # AC Power(Phase3)\n    0,  # AC Frequency(Phase3)\n    0,  # AC Voltage(Phase3) [Redundant]\n    0,  # AC Frequency(Phase3) [Redundant]\n    0,  # Solar Voltage at Input 1\n    0,  # Solar Current at Input 1\n    0,  # Solar Power at Input 1\n    0,  # Solar Voltage at Input 2\n    0,  # Solar Current at Input 2\n    0,  # Solar Power at Input 2\n    0,  # ACPower\n    0,  # (+) Bus Voltage\n    0,  # (-) Bus Voltage\n    0,  # Supplied ac energy today\n    0,  # Inverter runtime today\n    0,  # Supplied ac energy (total)\n    0,  # Inverter runtime (total)\n    0,  # Calculated temperature inside rack\n    0,  # Status AC Output 1\n    0,  # Status AC Output 2\n    0,  # Status AC Output 3\n    0,  # Status AC Output 4\n    0,  # Status DC Input 1\n    0,  # Status DC Input 2\n    0,  # Error Status\n    0,  # Error Status AC 1\n    0,  # Global Error 1\n    0,  # CPU Error\n    0,  # Global Error 2\n    0,  # Limits AC output 1\n    0,  # Limits AC output 2\n    0,  # Global Error 3\n    0,  # Limits DC 1\n    0,  # Limits DC 2\n    b'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00',  # History status messages\n)\n\n\ndef signal_handler(signal, frame):\n    ''' Catch SIGINT\/SIGTERM\/SIGKILL and exit gracefully '''\n    print(\"Stop requested...\")\n    sys.exit(0)\nsignal.signal(signal.SIGINT, signal_handler)\nsignal.signal(signal.SIGTERM, signal_handler)\n\n\ndef send(conn, req, cmd, subcmd, data=b'', addr=1):\n    \"\"\"\n    Send cmd\/subcmd (e.g. 0x60\/0x01) and optional data to the RS485 bus\n    \"\"\"\n    assert req in (ENQ, ACK, NAK)  # req should be one of ENQ, ACK, NAK\n    msg = struct.pack('BBBBB', req, addr, 2 + len(data), cmd, subcmd)\n    if len(data) &gt; 0:\n        msg = struct.pack('5s%ds' % len(data), msg, data)\n    crcval = crc16.calcData(msg)\n    lsb = crcval &amp; (0xff)\n    msb = (crcval &gt;&gt; 8) &amp; 0xff\n    data = struct.pack('B%dsBBB' % len(msg), STX, msg, lsb, msb, ETX)\n    if DEBUG: print(\"&gt;&gt;&gt; SEND:\", binascii.hexlify(msg), \"=&gt;\", binascii.hexlify(data))\n    conn.write(data)\n    conn.flush()\n\n\ndef receive(conn):\n    \"\"\"\n    Attempt to read messages from a serial connection\n    \"\"\"\n    data = bytearray()\n    while True:\n        buf = conn.read(READ_BYTES)\n        if buf:\n            if DEBUG: print(\"&gt;&gt;&gt; RAW RECEIVE:\", buf)\n            data.extend(buf)\n        if (not buf) or len(buf) &lt; READ_BYTES:\n            break\n\n    idx = 0\n    while idx + 9 &lt;= len(data):\n        if data[idx] != STX:\n            idx += 1\n            continue\n        stx, req, addr, size = struct.unpack('&gt;BBBB', data[idx:idx+4])\n        if req not in (ENQ, ACK, NAK):\n            print(\"Bad req value: {:02x} (should be one of ENQ\/ACK\/NAK)\".format(req))\n            idx += 1\n            continue\n        if idx + 4 + size &gt;= len(data):\n            print(\"Can't read %d bytes from buffer\" % size)\n            idx += 1\n            continue\n        msg, lsb, msb, etx = struct.unpack('&gt;%dsBBB' % size, data[idx+4:idx+7+size])\n        if etx != ETX:\n            print(\"Bad ETX value: {:02x}\".format(etx))\n            idx += 1\n            continue\n        crc_calc = crc16.calcData(data[idx+1:idx+4+size])\n        crc_msg = msb &lt;&lt; 8 | lsb\n        if crc_calc != crc_msg:\n            print(\"Bad CRC check: %s &lt;&gt; %s\" % (binascii.hexlify(crc_calc), binascii.hexlify(crc_msg)))\n            idx += 1\n            continue\n\n        if DEBUG: print(\"&gt;&gt;&gt; RECV:\", binascii.hexlify(data), \"=&gt;\", binascii.hexlify(msg))\n        yield {\n            \"stx\": stx,\n            \"req\": req,\n            \"addr\": addr,\n            \"size\": size,\n            \"msg\": msg,\n            \"lsb\": lsb,\n            \"msb\": msb,\n            \"etx\": etx,\n        }\n        idx += 4 + size\n\n\ndef decode_msg(data):\n    req = data['req']\n    cmd, cmdsub = struct.unpack('&gt;BB', data['msg'][0:2])\n    data['cmd'] = cmd\n    data['cmdsub'] = cmdsub\n    data['raw'] = data['msg'][2:]\n    if req == NAK:\n        print(\"NAK value received: cmd\/subcmd request was invalid\".format(req))\n    elif req == ENQ:\n        if DEBUG: print(\"ENQ value received: request from master (datalogger)\")\n    elif req == ACK:\n        if DEBUG: print(\"ACK value received: response from slave (inverter)\")\n        data['values'] = struct.unpack(DELTA_RPI_STRUCT, data['raw'])\n    if DEBUG: pprint(data)\n    return data\n\n\ndef main():\n    global DEBUG, MODE\n    parser = ArgumentParser(description='Delta inverter simulator (slave mode) or datalogger (master mode) for RPI M8A')\n    parser.add_argument('-a', metavar='ADDRESS', type=int,\n                      default=1,\n                      help='slave address [default: 1]')\n    parser.add_argument('-d', metavar='DEVICE',\n                      default='\/dev\/ttyUSB0',\n                      help='serial device port [default: \/dev\/ttyUSB0]')\n    parser.add_argument('-b', metavar='BAUDRATE',\n                      default=9600,\n                      help='baud rate [default: 9600]')\n    parser.add_argument('-t', metavar='TIMEOUT', type=float,\n                      default=2.0,\n                      help='timeout, in seconds (can be fractional, such as 1.5) [default: 2.0]')\n    parser.add_argument('--debug', action=\"store_true\",\n                      help='show debug information')\n    parser.add_argument('mode', metavar='MODE', choices=['master', 'slave'],\n                      help='mode can either be \"master\" or \"slave\"')\n\n    args = parser.parse_args()\n    DEBUG = args.debug\n    MODE = args.mode\n\n    conn = serial.Serial(args.d, args.b, timeout=args.t);\n    conn.flushOutput()\n    conn.flushInput()\n    if MODE == 'master':\n        send(conn, ENQ, 0x60, 0x01, addr=args.a)\n        time.sleep(0.1)\n    for data in receive(conn):\n        if MODE == 'master' and data['addr'] == args.a and data['req'] in (ACK, NAK,):\n            d = decode_msg(data)\n            if d['req'] == ACK:\n                if not (d['cmd'] == 0x60 and d['cmdsub'] == 0x01):\n                    print(\"Can't decode request cmd=0x%02X, cmdsub=0x%02X\" % (d['cmd'], d['cmdsub']))\n                    print(\"The only supported request is cmd=0x60, cmdsub=0x01\")\n                    continue\n<span style=\"color: #ffff00;\">            #    print(61 * '=')\n            print('{')\n            print('\"inverter\": 2,')\n            print('\"Datetime\": \"', datetime.now(), '\",')\n            for i, item in enumerate(DELTA_RPI):\n                label = item[0]\n                decoder = item[2]\n                scale = item[3] if len(item) &gt; 3 else 0\n                units = item[4] if len(item) &gt; 4 else ''\n                value = decoder(data['values'][i])\n                if decoder == float:\n                    value = value * pow(10, scale)\n                # print('%-40s %20s %-10s' % (label, value, units))\n                print(' \"' + label + '\": [')\n                print(' {')\n                print(' \"Value\": ', end='')\n                if isinstance(value, str) :\n                    print('\"', end='')\n                    print(value, end='')\n                    print('\",')\n                elif isinstance(value, int) :\n                    print(value, end='')\n                    print(',')\n                else:\n                    print('\"', end='')\n                    print(value.decode('ascii'), end='')\n                    print('\",')\n                print('\"Units\": \"' + units + '\"')\n                print('}')\n                print('],')\n            print(' \"end\": \"TRUE\"')\n            print('}')<\/span>\n        if MODE == 'slave' and data['addr'] == args.a and data['req'] in (ENQ,):\n            d = decode_msg(data)\n            if d['cmd'] == 0x60 and d['cmdsub'] == 0x01:\n                raw = struct.pack(DELTA_RPI_STRUCT, *DUMMY_DATA)\n                send(conn, ACK, 0x60, 0x01, data=raw, addr=args.a)\n            else:\n                print(\"This simulator only replies to cmd=0x60 cmdsub=0x01 requests...\")\n\n\nif __name__ == \"__main__\":\n    main()\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<ul>\n \t<li style=\"list-style-type: none;\"><\/li>\n<\/ul>\nJSON output gegenereerd en gevalideerd:\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li>met dmesg gechecked op welke USB poort de FT232RL aangesloten zit<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"code-pre \"><code>dmesg\n\n[155013.243404] usb 3-1: new full-speed USB device number 5 using ohci_hcd\n[155013.485049] usb 3-1: New USB device found, idVendor=0403, idProduct=6001\n[155013.491972] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3\n[155013.499369] usb 3-1: Product: FT232R USB UART\n[155013.503916] usb 3-1: Manufacturer: FTDI\n[155013.507892] usb 3-1: SerialNumber: A50285BI\n[155013.527773] ftdi_sio 3-1:1.0: FTDI USB Serial Device converter detected\n[155013.549271] usb 3-1: Detected FT232RL\n[155013.553223] usb 3-1: Number of endpoints 2\n[155013.557467] usb 3-1: Endpoint 1 MaxPacketSize 64\n[155013.562236] usb 3-1: Endpoint 2 MaxPacketSize 64\n[155013.567029] usb 3-1: Setting MaxPacketSize 64\n[155013.585881] usb 3-1: <span style=\"color: #ff0000;\">FTDI USB Serial Device converter now attached to ttyUSB0<\/span><\/code><\/pre>\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li>M.b.v. het in de zip-file bijgesloten script <code>unset_serial_ctrlchars.sh<\/code> de USB poort vrijgemaakt van ctrl karakters<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"code-pre \"><code>foobar:~\/python\/delta-rpi# ls -lia\ntotal 112\n57353 drwxr-xr-x 4 root root 4096 Mar 23 10:05 .\n57352 drwxr-xr-x 4 root root 4096 Mar 23 09:59 ..\n57354 drwxr-xr-x 8 root root 4096 Mar 17 15:12 .git\n57428 -rw-r--r-- 1 root root 1067 Mar 17 15:12 LICENSE\n57429 -rw-r--r-- 1 root root 2721 Mar 17 15:12 README.md\n57434 drwxr-xr-x 2 root root 4096 Mar 17 15:32 __pycache__\n57430 -rw-r--r-- 1 root root 3816 Mar 17 15:12 crc16.py\n57431 -rw-r--r-- 1 root root 11970 Mar 17 15:12 delta-rpi.py\n57620 -rwxrwxrwx 1 root root 411 Mar 19 12:48 delta-solivia.sh\n57621 -rw-r--r-- 1 root root 12662 Mar 19 10:57 delta-solivia2.5.py\n57619 -rw-r--r-- 1 root root 12041 Mar 18 10:20 delta-solivia3.0.backup\n57618 -rw-r--r-- 1 root root 12913 Mar 18 16:09 delta-solivia3.0.py\n57622 -rw-r--r-- 1 root root 12385 Mar 18 11:52 hhh\n57432 -rw-r--r-- 1 root root 74 Mar 17 15:12 tty.settings\n57433 -rwxr-xr-x 1 root root 649 Mar 17 15:12 unset_serial_ctrlchars.sh\n\nfoobar:~\/python\/delta-rpi# .\/unset_serial_ctrlchars.sh \/dev\/ttyUSB0<\/code><\/pre>\n<ul>\n \t<li>JSON output gegenereerd met:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"code-pre \">python3 \/root\/python\/delta-rpi\/delta-solivia3.0.py -d \/dev\/ttyUSB0 -b 19200 -a 1 master<\/pre>\n<p style=\"padding-left: 40px;\">-d \/dev\/ttyUSB0, de USB poort waarop de FT232RL adapter op aangesloten zit (uit vorige stap)<\/p>\n<p style=\"padding-left: 40px;\">-b 19200, baudrate conform instellingen Omvormer<\/p>\n<p style=\"padding-left: 40px;\">-a 1, RS485 adres van Omvormer<\/p>\n<p style=\"padding-left: 40px;\">master, python script gedraagt zich als master (Let op! Slave mode niet ge\u00efmplementeerd in script voor Delta Solivia 3.0 of 2.5)<\/p>\n\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li>JSON output geknipt in Terminal venster<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"code-pre \"><code>{\n\"inverter\": 1,\n\"Datetime\": \"2021-03-23 19:41:10.373687\",\n\"SAP part number\": [\n{\n\"Value\": \"b'EOE46010287'\",\n\"Units\": \"\"\n}\n],\n\"SAP serial number\": [\n{\n\"Value\": \"b'220287161303000538'\",\n\"Units\": \"\"\n}\n],\n\"SAP date code\": [\n{\n\"Value\": \"31333033\",\n\"Units\": \"\"\n}\n],\n\"SAP revision\": [\n{\n\"Value\": \"3136\",\n\"Units\": \"\"\n}\n],\n\"Software Revision System controller\": [\n{\n\"Value\": \"01.02.37\",\n\"Units\": \"Major,Minor,Bug fixing\"\n}\n],\n\"Software Revision Power controller\": [\n{\n\"Value\": \"00.00.00\",\n\"Units\": \"Major,Minor,Bug fixing\"\n}\n],\n\"Software Revision ENS controller\": [\n{\n\"Value\": \"00.00.00\",\n\"Units\": \"Major,Minor,Bug fixing\"\n}\n],\n\"Software Revision Watch dog controller\": [\n{\n\"Value\": \"00.00.00\",\n\"Units\": \"Major,Minor,Bug fixing\"\n}\n],\n\"Software Revision DC controller\": [\n{\n\"Value\": \"00.00.00\",\n\"Units\": \"Major,Minor,Bug fixing\"\n}\n],\n\"Software Revision DC 1\": [\n{\n\"Value\": \"00.00.00\",\n\"Units\": \"Major,Minor,Bug fixing\"\n}\n],\n\"Software Revision DC 2\": [\n{\n\"Value\": \"00.00.00\",\n\"Units\": \"Major,Minor,Bug fixing\"\n}\n],\n\"Software Revision DC 3\": [\n{\n\"Value\": \"00.00.00\",\n\"Units\": \"Major,Minor,Bug fixing\"\n}\n],\n\"Software Revision AC\": [\n{\n\"Value\": \"00.00.00\",\n\"Units\": \"Major,Minor,Bug fixing\"\n}\n],\n\"Software Revision AC 1\": [\n{\n\"Value\": \"00.00.00\",\n\"Units\": \"Major,Minor,Bug fixing\"\n}\n],\n\"Software Revision AC 2\": [\n{\n\"Value\": \"00.00.00\",\n\"Units\": \"Major,Minor,Bug fixing\"\n}\n],\n\"Software Revision AC 3\": [\n{\n\"Value\": \"00.00.00\",\n\"Units\": \"Major,Minor,Bug fixing\"\n}\n],\n\"Software Revision reserved\": [\n{\n\"Value\": \"00.01.00\",\n\"Units\": \"Major,Minor,Bug fixing\"\n}\n],\n\"Solar Power at Input 1\": [\n{\n\"Value\": 0,\n\"Units\": \"W\"\n}\n],\n\"Solar Voltage at Input 1\": [\n{\n\"Value\": 0,\n\"Units\": \"V\"\n}\n],\n\"Solar Current at Input 1\": [\n{\n\"Value\": 0,\n\"Units\": \"A\"\n}\n],\n\"Solar Power at Input 2\": [\n{\n\"Value\": 0,\n\"Units\": \"W\"\n}\n],\n\"Solar Voltage at Input 2\": [\n{\n\"Value\": 0,\n\"Units\": \"V\"\n}\n],\n\"Solar Current at Input 2\": [\n{\n\"Value\": 0,\n\"Units\": \"A\"\n}\n],\n\"Solar Power at Input 3\": [\n{\n\"Value\": 0,\n\"Units\": \"W\"\n}\n],\n\"Solar Voltage at Input 3\": [\n{\n\"Value\": 0,\n\"Units\": \"V\"\n}\n],\n\"Solar Current at Input 3\": [\n{\n\"Value\": 0,\n\"Units\": \"A\"\n}\n],\n\"AC Current(Phase1)\": [\n{\n\"Value\": 0,\n\"Units\": \"A\"\n}\n],\n\"AC Voltage(Phase1)\": [\n{\n\"Value\": 0,\n\"Units\": \"V\"\n}\n],\n\"AC Frequency(Phase1)\": [\n{\n\"Value\": 0,\n\"Units\": \"Hz\"\n}\n],\n\"AC Active Power(Phase1)\": [\n{\n\"Value\": 0,\n\"Units\": \"W\"\n}\n],\n\"AC Reactive Power(Phase1)\": [\n{\n\"Value\": 0,\n\"Units\": \"VAR\"\n}\n],\n\"AC Current(Phase2)\": [\n{\n\"Value\": 0,\n\"Units\": \"A\"\n}\n],\n\"AC Voltage(Phase2)\": [\n{\n\"Value\": 0,\n\"Units\": \"V\"\n}\n],\n\"AC Frequency(Phase2)\": [\n{\n\"Value\": 0,\n\"Units\": \"Hz\"\n}\n],\n\"AC Active Power(Phase2)\": [\n{\n\"Value\": 0,\n\"Units\": \"W\"\n}\n],\n\"AC Reactive Power(Phase2)\": [\n{\n\"Value\": 0,\n\"Units\": \"VAR\"\n}\n],\n\"AC Current(Phase3)\": [\n{\n\"Value\": 0,\n\"Units\": \"A\"\n}\n],\n\"AC Voltage(Phase3)\": [\n{\n\"Value\": 0,\n\"Units\": \"V\"\n}\n],\n\"AC Frequency(Phase3)\": [\n{\n\"Value\": 0,\n\"Units\": \"Hz\"\n}\n],\n\"AC Active Power(Phase3)\": [\n{\n\"Value\": 0,\n\"Units\": \"W\"\n}\n],\n\"AC Reactive Power(Phase3)\": [\n{\n\"Value\": 0,\n\"Units\": \"VAR\"\n}\n],\n\"Solar Isolation plus\": [\n{\n\"Value\": 0,\n\"Units\": \"kOhm\"\n}\n],\n\"Solar Isolation minus\": [\n{\n\"Value\": 0,\n\"Units\": \"kOhm\"\n}\n],\n\"Temperature amb\": [\n{\n\"Value\": 0,\n\"Units\": \"Celsius\"\n}\n],\n\"Temperature heatsink\": [\n{\n\"Value\": 0,\n\"Units\": \"Celsius\"\n}\n],\n\"Supplied ac energy (total)\": [\n{\n\"Value\": 5835591,\n\"Units\": \"Wh\"\n}\n],\n\"Inverter runtime (total)\": [\n{\n\"Value\": 655794,\n\"Units\": \"Minutes\"\n}\n],\n\"Status AC Output 1\": [\n{\n\"Value\": 4,\n\"Units\": \"\"\n}\n],\n\"Status AC Output 2\": [\n{\n\"Value\": 0,\n\"Units\": \"\"\n}\n],\n\"Status AC Output 3\": [\n{\n\"Value\": 0,\n\"Units\": \"\"\n}\n],\n\"Status AC Output 4\": [\n{\n\"Value\": 0,\n\"Units\": \"\"\n}\n],\n\"Internal Status 1\": [\n{\n\"Value\": 0,\n\"Units\": \"\"\n}\n],\n\"Internal Status 2\": [\n{\n\"Value\": 0,\n\"Units\": \"\"\n}\n],\n\"Internal Status 3\": [\n{\n\"Value\": 0,\n\"Units\": \"\"\n}\n],\n\"Internal Status 4\": [\n{\n\"Value\": 0,\n\"Units\": \"\"\n}\n],\n\"Supplied ac energy (day)\": [\n{\n\"Value\": 9233,\n\"Units\": \"Wh\"\n}\n],\n\"Inverter runtime (day)\": [\n{\n\"Value\": 745,\n\"Units\": \"Minute\"\n}\n],\n\"reserved\": [\n{\n\"Value\": \"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n\"Units\": \"\"\n}\n],\n\"end\": \"TRUE\"\n}<\/code><\/pre>\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li>en gevalideerd met https:\/\/jsonlint.com\/<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-422\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-13-300x188.jpg\" alt=\"\" width=\"673\" height=\"422\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-13-300x188.jpg 300w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-13-1024x642.jpg 1024w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-13-768x481.jpg 768w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-13.jpg 1080w\" sizes=\"auto, (max-width: 673px) 100vw, 673px\" \/>\n\nMosquitto MQTT cli\u00ebnt ge\u00efnstalleerd\n<ul>\n \t<li>Mosquitto MQTT cli\u00ebnt ge\u00efnstalleerd met:<\/li>\n<\/ul>\n<pre class=\"code-pre \"><code><span class=\"token function\">wget<\/span> http:\/\/repo.mosquitto.org\/debian\/mosquitto-repo.gpg.key\napt-key <span class=\"token function\">add<\/span> mosquitto-repo.gpg.key\napt-get update\napt-get install mosquitto-clients<\/code><\/pre>\nShell script gemaakt en crontab job aangemaakt\n<pre class=\"code-pre \"><code>foobar:~\/python\/delta-rpi# cat delta-solivia.sh\n#!\/bin\/bash\nexport PYTHONIOENCODING=utf8\n# Solivia 3.0\nmessage=`python3 \/root\/python\/delta-rpi\/delta-solivia3.0.py -d \/dev\/ttyUSB0 -b 19200 -a 1 master`\nmosquitto_pub -h 192.168.2.29 -p 1883 -m \"$message\" -t delta\/inverter\/1\n# Solivia 2.5\nmessage=`python3 \/root\/python\/delta-rpi\/delta-solivia2.5.py -d \/dev\/ttyUSB0 -b 19200 -a 2 master`\nmosquitto_pub -h 192.168.2.29 -p 1883 -m \"$message\" -t delta\/inverter\/2<\/code><\/pre>\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li>Zet execute rechten op het script met: <code>chmod 744 delta-solivia.sh<\/code><\/li>\n<\/ul>\n<ul>\n \t<li>crontab van root aangepast met<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"code-pre \">crontab -e\n\n# Edit this file to introduce tasks to be run by cron.\n#\n# Each task to run has to be defined through a single line\n# indicating with different fields when the task will be run\n# and what command to run for the task\n#\n# To define the time you can provide concrete values for\n# minute (m), hour (h), day of month (dom), month (mon),\n# and day of week (dow) or use '*' in these fields (for 'any').#\n# Notice that tasks will be started based on the cron's system\n# daemon's notion of time and timezones.\n#\n# Output of the crontab jobs (including errors) is sent through\n# email to the user the crontab file belongs to (unless redirected).\n#\n# For example, you can run a backup of all your user accounts\n# at 5 a.m every week with:\n# 0 5 * * 1 tar -zcf \/var\/backups\/home.tgz \/home\/\n#\n# For more information see the manual pages of crontab(5) and cron(8)\n#\n# m h dom mon dow command\n<span style=\"color: #ff0000;\">*\/5 * * * * \/root\/python\/delta-rpi\/delta-solivia.sh<\/span><\/pre>\n<p style=\"padding-left: 40px;\">en de regel *\/5 * * * * \/root\/python\/delta-rpi\/delta-solivia.sh toegevoegd zodat iedere 5 minuten de omvormers uitgelezen worden en de JSON output middels MQTT op de topic delta\/inverter\/* wordt geplaatst<\/p>\nNode-red flow aangemaakt:\n<ul>\n \t<li>Deze flow zorg ervoor dat de JSON berichten van de omvormers resulteren in een record in een tabel in de MariaDb database<\/li>\n<\/ul>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-423\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-14-300x28.jpg\" alt=\"\" width=\"675\" height=\"63\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-14-300x28.jpg 300w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-14-1024x96.jpg 1024w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-14-768x72.jpg 768w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-14.jpg 1164w\" sizes=\"auto, (max-width: 675px) 100vw, 675px\" \/>\n<table width=\"604\">\n<tbody>\n<tr>\n<td width=\"201\">Node<\/td>\n<td width=\"403\">Doel<\/td>\n<\/tr>\n<tr>\n<td width=\"201\">MQTT in<\/td>\n<td width=\"403\">Leest topic delta\/inverter\/* uit<\/td>\n<\/tr>\n<tr>\n<td width=\"201\">Inverter<\/td>\n<td width=\"403\">Op basis van inverternummer (delta\/inverter\/1 of \/delta\/inverter\/2) wordt de juiste functie aangeroepen om de JSON payload om te zetten in een SQL-statement<\/td>\n<\/tr>\n<tr>\n<td width=\"201\">Inverter 1<\/td>\n<td width=\"403\">Zet JSON payload om naar een SQL-statement<\/td>\n<\/tr>\n<tr>\n<td width=\"201\">Inverter 2<\/td>\n<td width=\"403\">Zet JSON payload om naar een SQL-statement<\/td>\n<\/tr>\n<tr>\n<td width=\"201\">Database<\/td>\n<td width=\"403\">Database connectie naar MariaDB<\/td>\n<\/tr>\n<tr>\n<td width=\"201\">Msg.payload<\/td>\n<td width=\"403\">Voor debugging doeleinden<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li>Export van flow<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"code-pre \"><span style=\"color: #ffffff;\">[{\"id\":\"de7bf9f6.4c6c48\",\"type\":\"tab\",\"label\":\"PVOutput\",\"disabled\":false,\"info\":\"\"},{\"id\":\"649056ba.f481e8\",\"type\":\"mqtt in\",\"z\":\"de7bf9f6.4c6c48\",\"name\":\"MQTT in\",\"topic\":\"delta\/inverter\/#\",\"qos\":\"2\",\"datatype\":\"json\",\"broker\":\"2483a28c.e1053e\",\"x\":100,\"y\":240,\"wires\":[[\"7c9c8973.c0afe8\"]]},{\"id\":\"d14b2151.f70ab\",\"type\":\"function\",\"z\":\"de7bf9f6.4c6c48\",\"name\":\"Inverter 1\",\"func\":\"\/\/ https:\/\/pvoutput.org\/service\/r2\/addoutput.jsp?key=Your-API-Key&amp;sid=Your-System-Id&amp;d=20100830&amp;g=12000\\n\/\/var apiKey=\\\"753e8f6c6b5c5be53ea92a1c3d1e48f46d302ae7\\\";\\n\/\/var systemId=\\\"82717\\\";\\n\/\/var url = \\\"https:\/\/pvoutput.org\/service\/r2\/addoutput.jsp?key=\\\" + apiKey + \\\"&amp;sid=\\\" + systemId;\\nvar sql = \\\"insert into pv (`inverter`, `sample datetime`, `Solar Power`, `Solar Voltage`, `Solar Current`, `AC Power`, `AC Voltage`, `AC Current`, `AC Frequency`, `Temperature`, `Status AC Output`, `Supplied AC Energy`, `Inverter runtime`,`delta Supplied AC Energy`)\\\"\\nsql = sql + \\\"values (:inverter, :sample_datetime, :Solar_Power, :Solar_Voltage, :Solar_Current, :AC_Power, :AC_Voltage, :AC_Current, :AC_Frequency, :Temperature, :Status_AC_Output, :Supplied_AC_Energy, :Inverter_runtime, :delta_Supplied_AC_Energy);\\\";\\n\\n\/\/var datetime=msg.payload.Datetime.substr(0,4) + msg.payload.Datetime.substr(5,2) + msg.payload.Datetime.substr(8,2);\\n\/\/var generated=msg.payload[\\\"Supplied ac energy (day)\\\"][0].Value;\\n\\n\/\/ url=url + \\\"&amp;d=\\\" + datetime + \\\"&amp;g=\\\" + generated + \\\"&amp;tm=\\\" + flow.get(\\\"minTemp\\\") + \\\"&amp;tx=\\\" + flow.get(\\\"maxTemp\\\") + \\\"&amp;cd=\\\" + flow.get(\\\"situatie\\\");\\n\\nmsg.payload.inverter=1;\\nmsg.payload.sample_datetime=msg.payload.Datetime;\\nmsg.payload.Solar_Power=msg.payload[\\\"Solar Power at Input 1\\\"][0].Value;\\nmsg.payload.Solar_Voltage=msg.payload[\\\"Solar Voltage at Input 1\\\"][0].Value;\\nmsg.payload.Solar_Current=msg.payload[\\\"Solar Current at Input 1\\\"][0].Value;\\nmsg.payload.AC_Power=msg.payload[\\\"AC Active Power(Phase1)\\\"][0].Value;\\nmsg.payload.AC_Voltage=msg.payload[\\\"AC Voltage(Phase1)\\\"][0].Value;\\nmsg.payload.AC_Current=msg.payload[\\\"AC Current(Phase1)\\\"][0].Value;\\nmsg.payload.AC_Frequency=msg.payload[\\\"AC Frequency(Phase1)\\\"][0].Value;\\nmsg.payload.Temperature=msg.payload[\\\"Temperature amb\\\"][0].Value;\\nmsg.payload.Status_AC_Output=msg.payload[\\\"Status AC Output 1\\\"][0].Value;\\nmsg.payload.Supplied_AC_Energy=msg.payload[\\\"Supplied ac energy (day)\\\"][0].Value;\\nmsg.payload.Inverter_runtime=msg.payload[\\\"Inverter runtime (day)\\\"][0].Value;\\nmsg.payload.delta_Supplied_AC_Energy=(msg.payload[\\\"Supplied ac energy (day)\\\"][0].Value - flow.get(\\\"Inverter1\\\")\/1000);\\n\\nmsg.topic=sql;\\nflow.set(\\\"Inverter1\\\",msg.payload[\\\"Supplied ac energy (day)\\\"][0].Value);\\n\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"x\":540,\"y\":200,\"wires\":[[\"bf2791ef.c0254\"]]},{\"id\":\"10851652.ea8c9a\",\"type\":\"debug\",\"z\":\"de7bf9f6.4c6c48\",\"name\":\"\",\"active\":true,\"tosidebar\":true,\"console\":false,\"tostatus\":false,\"complete\":\"false\",\"statusVal\":\"\",\"statusType\":\"auto\",\"x\":930,\"y\":240,\"wires\":[]},{\"id\":\"7c9c8973.c0afe8\",\"type\":\"switch\",\"z\":\"de7bf9f6.4c6c48\",\"name\":\"Inverter\",\"property\":\"payload.inverter\",\"propertyType\":\"msg\",\"rules\":[{\"t\":\"eq\",\"v\":\"1\",\"vt\":\"str\"},{\"t\":\"eq\",\"v\":\"2\",\"vt\":\"str\"}],\"checkall\":\"true\",\"repair\":false,\"outputs\":2,\"x\":300,\"y\":240,\"wires\":[[\"d14b2151.f70ab\"],[\"34049ab1.066266\"]]},{\"id\":\"34049ab1.066266\",\"type\":\"function\",\"z\":\"de7bf9f6.4c6c48\",\"name\":\"Inverter 2\",\"func\":\"var sql = \\\"insert into pv (`inverter`, `sample datetime`, `Solar Voltage`, `Solar Current`, `AC Power`, `AC Voltage`, `AC Current`, `AC Frequency`, `Temperature`, `Status AC Output`, `Supplied AC Energy`, `Inverter runtime`, `delta Supplied AC Energy`)\\\"\\nsql = sql + \\\"values (:inverter, :sample_datetime, :Solar_Voltage, :Solar_Current, :AC_Power, :AC_Voltage, :AC_Current, :AC_Frequency, :Temperature, :Status_AC_Output, :Supplied_AC_Energy, :Inverter_runtime, :delta_Supplied_AC_Energy);\\\";\\n\\nmsg.payload.inverter=2;\\nmsg.payload.sample_datetime=msg.payload.Datetime;\\nmsg.payload.Solar_Voltage=msg.payload[\\\"Solar Voltage at Input 1\\\"][0].Value;\\nmsg.payload.Solar_Current=msg.payload[\\\"Solar Current at Input 1\\\"][0].Value;\\nmsg.payload.AC_Power=msg.payload[\\\"AC Power\\\"][0].Value;\\nmsg.payload.AC_Voltage=msg.payload[\\\"AC Voltage\\\"][0].Value;\\nmsg.payload.AC_Current=msg.payload[\\\"AC Current\\\"][0].Value;\\nmsg.payload.AC_Frequency=msg.payload[\\\"AC Frequency\\\"][0].Value;\\nmsg.payload.Temperature=msg.payload[\\\"Calculated temperature at ntc (AC side)\\\"][0].Value;\\nmsg.payload.Status_AC_Output=msg.payload[\\\"Status AC output\\\"][0].Value;\\nmsg.payload.Supplied_AC_Energy=msg.payload[\\\"Supplied ac energy\\\"][0].Value;\\nmsg.payload.Inverter_runtime=msg.payload[\\\"Inverter runtime\\\"][0].Value * 60;\\nmsg.payload.delta_Supplied_AC_Energy=(msg.payload[\\\"Supplied ac Energy\\\"][0].Value - flow.get(\\\"Inverter2\\\")\/1000);\\n\\nmsg.topic=sql;\\nflow.set(\\\"Inverter2\\\",msg.payload[\\\"Supplied ac Energy\\\"][0].Value);\\n\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"x\":540,\"y\":280,\"wires\":[[\"bf2791ef.c0254\"]]},{\"id\":\"bf2791ef.c0254\",\"type\":\"mysql\",\"z\":\"de7bf9f6.4c6c48\",\"mydb\":\"1d3f61d0.71501e\",\"name\":\"Database\",\"x\":760,\"y\":240,\"wires\":[[\"10851652.ea8c9a\"]]},{\"id\":\"594706f6.cf8248\",\"type\":\"inject\",\"z\":\"de7bf9f6.4c6c48\",\"name\":\"Run once\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":true,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"date\",\"x\":100,\"y\":100,\"wires\":[[\"cc4ae98d.1d2e68\",\"20a1c55d.cfa38a\"]]},{\"id\":\"cc4ae98d.1d2e68\",\"type\":\"function\",\"z\":\"de7bf9f6.4c6c48\",\"name\":\"Get last added values inverter 1\",\"func\":\"var sql = \\\"select * from pv where `sample datetime` = (select max(`sample datetime`) from pv where inverter = 1) and inverter = 1;\\\"\\n\\nmsg.topic=sql;\\n\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"x\":370,\"y\":60,\"wires\":[[\"a49133f.7f24cd\"]]},{\"id\":\"a49133f.7f24cd\",\"type\":\"mysql\",\"z\":\"de7bf9f6.4c6c48\",\"mydb\":\"4167a952.5f75b8\",\"name\":\"Database\",\"x\":620,\"y\":60,\"wires\":[[\"27db1dc4.892dc2\"]]},{\"id\":\"27db1dc4.892dc2\",\"type\":\"function\",\"z\":\"de7bf9f6.4c6c48\",\"name\":\"Set previous meter readings\",\"func\":\"flow.set(\\\"Inverter1\\\",msg.payload[0][\\\"Supplied AC Energy\\\"]);\\n\\n\/\/ node.warn(flow.get(\\\"Inverter1\\\"));\\n\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"x\":880,\"y\":60,\"wires\":[[]]},{\"id\":\"20a1c55d.cfa38a\",\"type\":\"function\",\"z\":\"de7bf9f6.4c6c48\",\"name\":\"Get last added values inverter 2\",\"func\":\"var sql = \\\"select * from pv where `sample datetime` = (select max(`sample datetime`) from pv where inverter = 2) and inverter = 2;\\\"\\n\\nmsg.topic=sql;\\n\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"x\":370,\"y\":140,\"wires\":[[\"7408d3d0.0cf0ec\"]]},{\"id\":\"7408d3d0.0cf0ec\",\"type\":\"mysql\",\"z\":\"de7bf9f6.4c6c48\",\"mydb\":\"4167a952.5f75b8\",\"name\":\"Database\",\"x\":620,\"y\":140,\"wires\":[[\"7ebd4e54.aa27c\"]]},{\"id\":\"7ebd4e54.aa27c\",\"type\":\"function\",\"z\":\"de7bf9f6.4c6c48\",\"name\":\"Set previous meter readings\",\"func\":\"flow.set(\\\"Inverter2\\\",msg.payload[0][\\\"Supplied AC Energy\\\"]);\\n\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"x\":880,\"y\":140,\"wires\":[[]]},{\"id\":\"2483a28c.e1053e\",\"type\":\"mqtt-broker\",\"z\":\"\",\"name\":\"pi\",\"broker\":\"192.168.2.29\",\"port\":\"1883\",\"clientid\":\"\",\"usetls\":false,\"compatmode\":false,\"keepalive\":\"60\",\"cleansession\":true,\"birthTopic\":\"\",\"birthQos\":\"0\",\"birthPayload\":\"\",\"closeTopic\":\"\",\"closeQos\":\"0\",\"closePayload\":\"\",\"willTopic\":\"\",\"willQos\":\"0\",\"willPayload\":\"\"},{\"id\":\"1d3f61d0.71501e\",\"type\":\"MySQLdatabase\",\"z\":\"\",\"name\":\"mysql\",\"host\":\"localhost\",\"port\":\"3306\",\"db\":\"energy\",\"tz\":\"\",\"charset\":\"UTF8\"},{\"id\":\"4167a952.5f75b8\",\"type\":\"MySQLdatabase\",\"z\":\"\",\"name\":\"mysql\",\"host\":\"localhost\",\"port\":\"3306\",\"db\":\"energy\",\"tz\":\"\",\"charset\":\"UTF8\"}]<\/span><\/pre>\nMariaDB geconfigureerd\n<ul>\n \t<li>Mysql tool gestart met <code>mysql -u root -p<\/code><\/li>\n \t<li>Database &#8220;<code>energy<\/code>&#8221; aangemaakt met<\/li>\n<\/ul>\n<pre class=\"code-pre \"><code>create database energy;<\/code><\/pre>\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li>Tabel &#8220;<code>pv<\/code>&#8221; aangemaakt met<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"code-pre \"><code>use energy;\n\nCREATE TABLE `pv` (\n  `inverter` int(1) NOT NULL,\n  `sample datetime` datetime NOT NULL,\n  `Solar Power` int(32) DEFAULT NULL,\n  `Solar Power unit` char(6) DEFAULT 'W',\n  `Solar Voltage` int(32) DEFAULT NULL,\n  `Solar Voltage unit` char(6) DEFAULT 'V',\n  `Solar Current` int(32) DEFAULT NULL,\n  `Solar Current unit` char(6) DEFAULT 'A',\n  `AC Power` int(32) DEFAULT NULL,\n  `AC Power unit` char(6) DEFAULT 'W',\n  `AC Voltage` int(32) DEFAULT NULL,\n  `AC Voltage unit` char(6) DEFAULT 'V',\n  `AC Current` int(32) DEFAULT NULL,\n  `AC Current unit` char(6) DEFAULT 'A',\n  `AC Frequency` int(32) DEFAULT NULL,\n  `AC Frequency unit` char(6) DEFAULT 'Hz',\n  `Temperature` int(32) DEFAULT NULL,\n  `Temperature unit` char(6) DEFAULT 'C',\n  `Status AC Output` int(32) DEFAULT NULL,\n  `Supplied AC Energy` int(32) DEFAULT NULL,\n  `Supplied AC Energy unit` char(6) DEFAULT 'Wh',\n  `Inverter runtime` int(32) DEFAULT NULL,\n  `Inverter runtime unit` char(6) DEFAULT 'Minute',\n  PRIMARY KEY (`inverter`,`sample datetime`)\n);\n<\/code><\/pre>\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li>gebruiker &#8220;googledata&#8221; aangemaakt met select rechten op tabel pv<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre>create user googledata@% identified by 'password';\ngrant select on energy.* to googledata@%;<\/pre>\nFirewall aangepast en poort naar MariaDB database opengezet:\n\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-424\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-15-257x300.jpg\" alt=\"\" width=\"675\" height=\"788\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-15-257x300.jpg 257w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-15.jpg 754w\" sizes=\"auto, (max-width: 675px) 100vw, 675px\" \/>\n\nDashboard aangemaakt met Google Data Studio:\n<ul>\n \t<li style=\"list-style-type: none;\">\n<ul>\n \t<li>Login in met je Google account op <a href=\"https:\/\/datastudio.google.com\/\">https:\/\/datastudio.google.com\/<\/a><\/li>\n \t<li><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-425 alignleft\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-16.jpg\" alt=\"\" width=\"152\" height=\"292\" \/><\/li>\n \t<li>Voor de 3 scoreboards heb ik de volgende MySQL verbinding gedefinieerd <img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-426\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel1-300x81.jpg\" alt=\"\" width=\"681\" height=\"184\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel1-300x81.jpg 300w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel1-1024x276.jpg 1024w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel1-768x207.jpg 768w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel1-1536x415.jpg 1536w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel1.jpg 1915w\" sizes=\"auto, (max-width: 681px) 100vw, 681px\" \/><\/li>\n \t<li>Op dezelfde wijze heb ik de volgende MySQL verbindingen gemaakt voor elementen op het dashboard<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<table>\n<tbody>\n<tr>\n<td width=\"151\">Dashboard element<\/td>\n<td width=\"453\">SQL-query<\/td>\n<\/tr>\n<tr>\n<td width=\"151\">Inverter: 1,2\n\nVandaag,\n\nDeze maand,\n\nTotaal<\/td>\n<td width=\"453\">select inverter,\n\ndate(`sample datetime`) as datum,\n\nmax(time(`sample datetime`)) as tijd,\n\nround((max(`Supplied AC Energy`)-min(`Supplied AC Energy`))\/10) as energy,\n\n`Supplied AC Energy unit` as unit\n\nfrom pv where inverter = 2\n\ngroup by date(`sample datetime`)\n\nunion\n\nselect inverter,\n\ndate(`sample datetime`) as datum,\n\nmax(time(`sample datetime`)) as tijd,\n\nround(max(`Supplied AC Energy`)\/1000) as energy,\n\n`Supplied AC Energy unit` as unit\n\nfrom pv where inverter = 1\n\ngroup by date(`sample datetime`);<\/td>\n<\/tr>\n<tr>\n<td width=\"151\">Laatste update<\/td>\n<td width=\"453\">select max(time(`sample datetime`)) as tijd\n\nfrom pv\n\nwhere date(`sample datetime`) = curdate()<\/td>\n<\/tr>\n<tr>\n<td width=\"151\">Inverter temperature, Inverter voltage,\n\nInverter solarpower<\/td>\n<td width=\"453\">select inverter,\n\ntemperature,\n\n`AC Voltage` as voltage,\n\n`Solar Power` as solarpower\n\nfrom pv\n\nwhere `sample datetime` =\n\n(select max(`sample datetime`)\n\nfrom pv\n\nwhere inverter = 1)\n\nunion\n\nselect inverter,\n\ntemperature,\n\n`AC Voltage` as voltage,\n\n`Solar Power` as solarpower\n\nfrom pv\n\nwhere `sample datetime` =\n\n(select max(`sample datetime`)\n\nfrom pv\n\nwhere inverter = 2)<\/td>\n<\/tr>\n<tr>\n<td width=\"151\">Opgewekte energie Inverter 1,\n\nOpgewekte energie Inverter 2<\/td>\n<td width=\"453\">select inverter,\n\n`sample datetime` as T,\n\n`Supplied AC Energy`\/1000 as A,\n\n(select min(`Supplied AC Energy`\/1000)\n\nfrom pv\n\nwhere inverter = 1\n\nand date(`sample datetime`) = curdate()) as B,\n\n(`Supplied AC Energy` &#8211; (select min(`Supplied AC Energy`)\n\nfrom pv\n\nwhere inverter = 1\n\nand date(`sample datetime`) = curdate()))\/1000 as C\n\nfrom pv\n\nwhere inverter = 1\n\nand date(`sample datetime`) = curdate();<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul>\n \t<li>Hieronder screenshots van de configuratie van de verschillende dashboard onderdelen:<\/li>\n<\/ul>\n<div id='gallery-2' class='gallery galleryid-409 gallery-columns-3 gallery-size-medium'><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon portrait'>\n\t\t\t\t<a href='https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/knipsel-19\/'><img loading=\"lazy\" decoding=\"async\" width=\"172\" height=\"300\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-17-172x300.jpg\" class=\"attachment-medium size-medium\" alt=\"\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-17-172x300.jpg 172w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel-17.jpg 397w\" sizes=\"auto, (max-width: 172px) 100vw, 172px\" \/><\/a>\n\t\t\t<\/div><\/figure><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon portrait'>\n\t\t\t\t<a href='https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/knipsel1-2\/'><img loading=\"lazy\" decoding=\"async\" width=\"174\" height=\"300\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel1-1-174x300.jpg\" class=\"attachment-medium size-medium\" alt=\"\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel1-1-174x300.jpg 174w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel1-1.jpg 404w\" sizes=\"auto, (max-width: 174px) 100vw, 174px\" \/><\/a>\n\t\t\t<\/div><\/figure><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon portrait'>\n\t\t\t\t<a href='https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/knipsel2\/'><img loading=\"lazy\" decoding=\"async\" width=\"172\" height=\"300\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel2-172x300.jpg\" class=\"attachment-medium size-medium\" alt=\"\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel2-172x300.jpg 172w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel2.jpg 402w\" sizes=\"auto, (max-width: 172px) 100vw, 172px\" \/><\/a>\n\t\t\t<\/div><\/figure><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon portrait'>\n\t\t\t\t<a href='https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/knipsel3\/'><img loading=\"lazy\" decoding=\"async\" width=\"173\" height=\"300\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel3-173x300.jpg\" class=\"attachment-medium size-medium\" alt=\"\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel3-173x300.jpg 173w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel3.jpg 403w\" sizes=\"auto, (max-width: 173px) 100vw, 173px\" \/><\/a>\n\t\t\t<\/div><\/figure><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon portrait'>\n\t\t\t\t<a href='https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/knipsel4\/'><img loading=\"lazy\" decoding=\"async\" width=\"173\" height=\"300\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel4-173x300.jpg\" class=\"attachment-medium size-medium\" alt=\"\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel4-173x300.jpg 173w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel4.jpg 402w\" sizes=\"auto, (max-width: 173px) 100vw, 173px\" \/><\/a>\n\t\t\t<\/div><\/figure><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon portrait'>\n\t\t\t\t<a href='https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/knipsel5\/'><img loading=\"lazy\" decoding=\"async\" width=\"173\" height=\"300\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel5-173x300.jpg\" class=\"attachment-medium size-medium\" alt=\"\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel5-173x300.jpg 173w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel5.jpg 403w\" sizes=\"auto, (max-width: 173px) 100vw, 173px\" \/><\/a>\n\t\t\t<\/div><\/figure><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon portrait'>\n\t\t\t\t<a href='https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/knipsel6\/'><img loading=\"lazy\" decoding=\"async\" width=\"172\" height=\"300\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel6-172x300.jpg\" class=\"attachment-medium size-medium\" alt=\"\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel6-172x300.jpg 172w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel6.jpg 401w\" sizes=\"auto, (max-width: 172px) 100vw, 172px\" \/><\/a>\n\t\t\t<\/div><\/figure><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon portrait'>\n\t\t\t\t<a href='https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/knipsel7\/'><img loading=\"lazy\" decoding=\"async\" width=\"173\" height=\"300\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel7-173x300.jpg\" class=\"attachment-medium size-medium\" alt=\"\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel7-173x300.jpg 173w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel7.jpg 402w\" sizes=\"auto, (max-width: 173px) 100vw, 173px\" \/><\/a>\n\t\t\t<\/div><\/figure><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon portrait'>\n\t\t\t\t<a href='https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/knipsel8\/'><img loading=\"lazy\" decoding=\"async\" width=\"172\" height=\"300\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel8-172x300.jpg\" class=\"attachment-medium size-medium\" alt=\"\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel8-172x300.jpg 172w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel8.jpg 399w\" sizes=\"auto, (max-width: 172px) 100vw, 172px\" \/><\/a>\n\t\t\t<\/div><\/figure><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon portrait'>\n\t\t\t\t<a href='https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/knipsel10\/'><img loading=\"lazy\" decoding=\"async\" width=\"173\" height=\"300\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel10-173x300.jpg\" class=\"attachment-medium size-medium\" alt=\"\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel10-173x300.jpg 173w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel10.jpg 400w\" sizes=\"auto, (max-width: 173px) 100vw, 173px\" \/><\/a>\n\t\t\t<\/div><\/figure><figure class='gallery-item'>\n\t\t\t<div class='gallery-icon portrait'>\n\t\t\t\t<a href='https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/knipsel9\/'><img loading=\"lazy\" decoding=\"async\" width=\"174\" height=\"300\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel9-174x300.jpg\" class=\"attachment-medium size-medium\" alt=\"\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel9-174x300.jpg 174w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel9.jpg 402w\" sizes=\"auto, (max-width: 174px) 100vw, 174px\" \/><\/a>\n\t\t\t<\/div><\/figure>\n\t\t<\/div>\n\n\nEn dit is het resultaat van al die noeste arbeid\n\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-439\" src=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel11-300x165.jpg\" alt=\"\" width=\"715\" height=\"393\" srcset=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel11-300x165.jpg 300w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel11-1024x562.jpg 1024w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel11-768x422.jpg 768w, https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/Knipsel11.jpg 1504w\" sizes=\"auto, (max-width: 715px) 100vw, 715px\" \/><\/li>\n<\/ul>\n<\/li>\n<\/ul><!-- \/wp:paragraph -->","protected":false},"excerpt":{"rendered":"<p>Dit project heeft tot doel om de opbrengst, en nog wat aanvullende gegevens, van mijn zonnepanelen uit te lezen en<\/p>\n<p><a href=\"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/\" class=\"more-link\">Verder lezen<span class=\"screen-reader-text\">Opbrengst zonnepanelen uitlezen<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":394,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_lmt_disableupdate":"","_lmt_disable":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[9],"tags":[69,61,62,64,67,66,20,65,68,63],"class_list":["post-409","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-diy-projecten","tag-dashboard","tag-delta-solivia-2-5","tag-delta-solivia-3-0","tag-ft232rl","tag-google-data-studio","tag-mariadb","tag-node-red","tag-nslu2","tag-pv","tag-rs485"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Opbrengst zonnepanelen uitlezen - Mijn domotica projecten<\/title>\n<meta name=\"description\" content=\"Tutorial hoe je de opgewekte energie uit je zonnepanelen kunt tonen in een fraai vormgegeven Dashboard. Dit met behulp van Python, MQTT, Node-RED, MariaDB en Google Data studio\" \/>\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.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Opbrengst zonnepanelen uitlezen - Mijn domotica projecten\" \/>\n<meta property=\"og:description\" content=\"Tutorial hoe je de opgewekte energie uit je zonnepanelen kunt tonen in een fraai vormgegeven Dashboard. Dit met behulp van Python, MQTT, Node-RED, MariaDB en Google Data studio\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Mijn domotica projecten\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/syds.post\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-23T19:59:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-02-13T14:34:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/delta-zonne-energie-omvormers-delta-solivia-25-tr.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"300\" \/>\n\t<meta property=\"og:image:height\" content=\"352\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Syds\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Syds\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"30 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/index.php\\\/2021\\\/03\\\/23\\\/opbrengst-zonnepanelen-uitlezen-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/index.php\\\/2021\\\/03\\\/23\\\/opbrengst-zonnepanelen-uitlezen-2\\\/\"},\"author\":{\"name\":\"Syds\",\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/#\\\/schema\\\/person\\\/429f92898f98d9c4e01b8fad60975b21\"},\"headline\":\"Opbrengst zonnepanelen uitlezen\",\"datePublished\":\"2021-03-23T19:59:38+00:00\",\"dateModified\":\"2022-02-13T14:34:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/index.php\\\/2021\\\/03\\\/23\\\/opbrengst-zonnepanelen-uitlezen-2\\\/\"},\"wordCount\":1690,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/index.php\\\/2021\\\/03\\\/23\\\/opbrengst-zonnepanelen-uitlezen-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.sydspost.nl\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/delta-zonne-energie-omvormers-delta-solivia-25-tr.jpg\",\"keywords\":[\"Dashboard\",\"Delta Solivia 2.5\",\"Delta Solivia 3.0\",\"FT232RL\",\"Google Data studio\",\"MariaDB\",\"Node Red\",\"NSLU2\",\"PV\",\"RS485\"],\"articleSection\":[\"DIY projecten\"],\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.sydspost.nl\\\/index.php\\\/2021\\\/03\\\/23\\\/opbrengst-zonnepanelen-uitlezen-2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/index.php\\\/2021\\\/03\\\/23\\\/opbrengst-zonnepanelen-uitlezen-2\\\/\",\"url\":\"https:\\\/\\\/www.sydspost.nl\\\/index.php\\\/2021\\\/03\\\/23\\\/opbrengst-zonnepanelen-uitlezen-2\\\/\",\"name\":\"Opbrengst zonnepanelen uitlezen - Mijn domotica projecten\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/index.php\\\/2021\\\/03\\\/23\\\/opbrengst-zonnepanelen-uitlezen-2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/index.php\\\/2021\\\/03\\\/23\\\/opbrengst-zonnepanelen-uitlezen-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.sydspost.nl\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/delta-zonne-energie-omvormers-delta-solivia-25-tr.jpg\",\"datePublished\":\"2021-03-23T19:59:38+00:00\",\"dateModified\":\"2022-02-13T14:34:11+00:00\",\"description\":\"Tutorial hoe je de opgewekte energie uit je zonnepanelen kunt tonen in een fraai vormgegeven Dashboard. Dit met behulp van Python, MQTT, Node-RED, MariaDB en Google Data studio\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/index.php\\\/2021\\\/03\\\/23\\\/opbrengst-zonnepanelen-uitlezen-2\\\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.sydspost.nl\\\/index.php\\\/2021\\\/03\\\/23\\\/opbrengst-zonnepanelen-uitlezen-2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/index.php\\\/2021\\\/03\\\/23\\\/opbrengst-zonnepanelen-uitlezen-2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.sydspost.nl\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/delta-zonne-energie-omvormers-delta-solivia-25-tr.jpg\",\"contentUrl\":\"https:\\\/\\\/www.sydspost.nl\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/delta-zonne-energie-omvormers-delta-solivia-25-tr.jpg\",\"width\":300,\"height\":352},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/index.php\\\/2021\\\/03\\\/23\\\/opbrengst-zonnepanelen-uitlezen-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.sydspost.nl\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Opbrengst zonnepanelen uitlezen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/#website\",\"url\":\"https:\\\/\\\/www.sydspost.nl\\\/\",\"name\":\"Mijn domotica projecten\",\"description\":\"met Domoticz\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.sydspost.nl\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/#organization\",\"name\":\"Mijn domotica projecten\",\"url\":\"https:\\\/\\\/www.sydspost.nl\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.sydspost.nl\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/Domoticz-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.sydspost.nl\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/Domoticz-logo.png\",\"width\":256,\"height\":256,\"caption\":\"Mijn domotica projecten\"},\"image\":{\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.sydspost.nl\\\/#\\\/schema\\\/person\\\/429f92898f98d9c4e01b8fad60975b21\",\"name\":\"Syds\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe78554f84c2c27fe1c643dcb3f2d0231d9a2dcdb96cc25f3538e38d9465e24d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe78554f84c2c27fe1c643dcb3f2d0231d9a2dcdb96cc25f3538e38d9465e24d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe78554f84c2c27fe1c643dcb3f2d0231d9a2dcdb96cc25f3538e38d9465e24d?s=96&d=mm&r=g\",\"caption\":\"Syds\"},\"sameAs\":[\"https:\\\/\\\/www.sydspost.nl\",\"https:\\\/\\\/www.facebook.com\\\/syds.post\\\/\"],\"url\":\"https:\\\/\\\/www.sydspost.nl\\\/index.php\\\/author\\\/wp_admin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Opbrengst zonnepanelen uitlezen - Mijn domotica projecten","description":"Tutorial hoe je de opgewekte energie uit je zonnepanelen kunt tonen in een fraai vormgegeven Dashboard. Dit met behulp van Python, MQTT, Node-RED, MariaDB en Google Data studio","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.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/","og_locale":"nl_NL","og_type":"article","og_title":"Opbrengst zonnepanelen uitlezen - Mijn domotica projecten","og_description":"Tutorial hoe je de opgewekte energie uit je zonnepanelen kunt tonen in een fraai vormgegeven Dashboard. Dit met behulp van Python, MQTT, Node-RED, MariaDB en Google Data studio","og_url":"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/","og_site_name":"Mijn domotica projecten","article_author":"https:\/\/www.facebook.com\/syds.post\/","article_published_time":"2021-03-23T19:59:38+00:00","article_modified_time":"2022-02-13T14:34:11+00:00","og_image":[{"width":300,"height":352,"url":"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/delta-zonne-energie-omvormers-delta-solivia-25-tr.jpg","type":"image\/jpeg"}],"author":"Syds","twitter_card":"summary_large_image","twitter_misc":{"Geschreven door":"Syds","Geschatte leestijd":"30 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/#article","isPartOf":{"@id":"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/"},"author":{"name":"Syds","@id":"https:\/\/www.sydspost.nl\/#\/schema\/person\/429f92898f98d9c4e01b8fad60975b21"},"headline":"Opbrengst zonnepanelen uitlezen","datePublished":"2021-03-23T19:59:38+00:00","dateModified":"2022-02-13T14:34:11+00:00","mainEntityOfPage":{"@id":"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/"},"wordCount":1690,"commentCount":3,"publisher":{"@id":"https:\/\/www.sydspost.nl\/#organization"},"image":{"@id":"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/delta-zonne-energie-omvormers-delta-solivia-25-tr.jpg","keywords":["Dashboard","Delta Solivia 2.5","Delta Solivia 3.0","FT232RL","Google Data studio","MariaDB","Node Red","NSLU2","PV","RS485"],"articleSection":["DIY projecten"],"inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/","url":"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/","name":"Opbrengst zonnepanelen uitlezen - Mijn domotica projecten","isPartOf":{"@id":"https:\/\/www.sydspost.nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/#primaryimage"},"image":{"@id":"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/delta-zonne-energie-omvormers-delta-solivia-25-tr.jpg","datePublished":"2021-03-23T19:59:38+00:00","dateModified":"2022-02-13T14:34:11+00:00","description":"Tutorial hoe je de opgewekte energie uit je zonnepanelen kunt tonen in een fraai vormgegeven Dashboard. Dit met behulp van Python, MQTT, Node-RED, MariaDB en Google Data studio","breadcrumb":{"@id":"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/#primaryimage","url":"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/delta-zonne-energie-omvormers-delta-solivia-25-tr.jpg","contentUrl":"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/delta-zonne-energie-omvormers-delta-solivia-25-tr.jpg","width":300,"height":352},{"@type":"BreadcrumbList","@id":"https:\/\/www.sydspost.nl\/index.php\/2021\/03\/23\/opbrengst-zonnepanelen-uitlezen-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sydspost.nl\/"},{"@type":"ListItem","position":2,"name":"Opbrengst zonnepanelen uitlezen"}]},{"@type":"WebSite","@id":"https:\/\/www.sydspost.nl\/#website","url":"https:\/\/www.sydspost.nl\/","name":"Mijn domotica projecten","description":"met Domoticz","publisher":{"@id":"https:\/\/www.sydspost.nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sydspost.nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/www.sydspost.nl\/#organization","name":"Mijn domotica projecten","url":"https:\/\/www.sydspost.nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/www.sydspost.nl\/#\/schema\/logo\/image\/","url":"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2020\/12\/Domoticz-logo.png","contentUrl":"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2020\/12\/Domoticz-logo.png","width":256,"height":256,"caption":"Mijn domotica projecten"},"image":{"@id":"https:\/\/www.sydspost.nl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.sydspost.nl\/#\/schema\/person\/429f92898f98d9c4e01b8fad60975b21","name":"Syds","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/secure.gravatar.com\/avatar\/fe78554f84c2c27fe1c643dcb3f2d0231d9a2dcdb96cc25f3538e38d9465e24d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/fe78554f84c2c27fe1c643dcb3f2d0231d9a2dcdb96cc25f3538e38d9465e24d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fe78554f84c2c27fe1c643dcb3f2d0231d9a2dcdb96cc25f3538e38d9465e24d?s=96&d=mm&r=g","caption":"Syds"},"sameAs":["https:\/\/www.sydspost.nl","https:\/\/www.facebook.com\/syds.post\/"],"url":"https:\/\/www.sydspost.nl\/index.php\/author\/wp_admin\/"}]}},"modified_by":"Syds","jetpack_featured_media_url":"https:\/\/www.sydspost.nl\/wp-content\/uploads\/2021\/03\/delta-zonne-energie-omvormers-delta-solivia-25-tr.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.sydspost.nl\/index.php\/wp-json\/wp\/v2\/posts\/409","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sydspost.nl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sydspost.nl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sydspost.nl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sydspost.nl\/index.php\/wp-json\/wp\/v2\/comments?post=409"}],"version-history":[{"count":18,"href":"https:\/\/www.sydspost.nl\/index.php\/wp-json\/wp\/v2\/posts\/409\/revisions"}],"predecessor-version":[{"id":3479,"href":"https:\/\/www.sydspost.nl\/index.php\/wp-json\/wp\/v2\/posts\/409\/revisions\/3479"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sydspost.nl\/index.php\/wp-json\/wp\/v2\/media\/394"}],"wp:attachment":[{"href":"https:\/\/www.sydspost.nl\/index.php\/wp-json\/wp\/v2\/media?parent=409"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sydspost.nl\/index.php\/wp-json\/wp\/v2\/categories?post=409"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sydspost.nl\/index.php\/wp-json\/wp\/v2\/tags?post=409"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}