{"id":590,"date":"2015-11-22T20:33:42","date_gmt":"2015-11-22T19:33:42","guid":{"rendered":"http:\/\/www.mb200d.nl\/wordpress\/?p=590"},"modified":"2015-11-22T20:33:42","modified_gmt":"2015-11-22T19:33:42","slug":"omniksol-4k-tl-wifi-kit","status":"publish","type":"post","link":"http:\/\/www.mb200d.nl\/wordpress\/2015\/11\/omniksol-4k-tl-wifi-kit\/","title":{"rendered":"Omniksol-4k-TL wifi kit"},"content":{"rendered":"<p>Capture inverter data yourself? Or want to process generated data? Instead of using the Omnik Portal App?<\/p>\n<p>I found out that it is possible to configure the wifi kit to send TCP\/UDP packets to an remote server. After that i started googling around. With some minimal data i started write a small C program.<\/p>\n<p>Some other related project on the internet:<\/p>\n<ol>\n<li><a href=\"https:\/\/github.com\/Woutrrr\/Omnik-Data-Logger\">GitHub &#8211; Woutrrr \/ Omnik-Data-Logger<\/a> | Language: Python | Found first<\/li>\n<li><a href=\"https:\/\/github.com\/micromys\/Omnik\">GitHub &#8211; micromys \/ Omnik<\/a> | Language: PHP<\/li>\n<li><a href=\"https:\/\/github.com\/arjenv\/omnikstats\">GitHub &#8211; arjenv \/ omnikstatus<\/a> | Language: C | Found after completing my own script \ud83d\ude41<\/li>\n<\/ol>\n<p>Those scripts are polling the inverter each few minutes. When my research started, i found out, by configuring the web interface, that Omnik also offers the possibility to push TCP or UDP packets to an specified server. With this enabled i started testing en developing.<\/p>\n<p>Reading the message (which byte means what?) was based on the GitHub projects. So someone else did the hard work \ud83d\ude09<\/p>\n<p>Getting started&#8230; (read on)<br \/>\n<!--more--><\/p>\n<p>Use a webbrowser to login on the inverter management interface, the navigate to &#8216;Advanced \/ Remote server&#8217;<\/p>\n<p><a href=\"http:\/\/www.mb200d.nl\/wordpress\/wp-content\/uploads\/2015\/04\/omnik_interface_advanced.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-605\" src=\"http:\/\/www.mb200d.nl\/wordpress\/wp-content\/uploads\/2015\/04\/omnik_interface_status.png\" alt=\"omnik_interface_status\" width=\"1002\" height=\"599\" srcset=\"http:\/\/www.mb200d.nl\/wordpress\/wp-content\/uploads\/2015\/04\/omnik_interface_status.png 1002w, http:\/\/www.mb200d.nl\/wordpress\/wp-content\/uploads\/2015\/04\/omnik_interface_status-300x179.png 300w, http:\/\/www.mb200d.nl\/wordpress\/wp-content\/uploads\/2015\/04\/omnik_interface_status-624x373.png 624w\" sizes=\"auto, (max-width: 1002px) 100vw, 1002px\" \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-604\" src=\"http:\/\/www.mb200d.nl\/wordpress\/wp-content\/uploads\/2015\/04\/omnik_interface_advanced.png\" alt=\"omnik_interface_advanced\" width=\"994\" height=\"580\" srcset=\"http:\/\/www.mb200d.nl\/wordpress\/wp-content\/uploads\/2015\/04\/omnik_interface_advanced.png 994w, http:\/\/www.mb200d.nl\/wordpress\/wp-content\/uploads\/2015\/04\/omnik_interface_advanced-300x175.png 300w, http:\/\/www.mb200d.nl\/wordpress\/wp-content\/uploads\/2015\/04\/omnik_interface_advanced-624x364.png 624w\" sizes=\"auto, (max-width: 994px) 100vw, 994px\" \/><\/a>You are free to fill in servers B and C. Server A seems to point to the Omnik Portal and cannot be disabled. Some more advanced users can make some firewall tricks to block this behavior. (if wished).<\/p>\n<h4>Setting up&#8230;<\/h4>\n<ol>\n<li>Have a debian 8 machine<\/li>\n<li>Download and unzip [wpfilebase tag=fileurl id=5 linktext=OmnikListenerTCP \/] to your machine (or compile your own)<\/li>\n<li>Make it executeable\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\"># chmod +x OmnikListenerTCP <\/pre>\n<\/li>\n<li>Execute\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\"># .\/OmnikListenerTCP --csv-file=.\/output.csv <\/pre>\n<\/li>\n<li>Ensure your port 8989 is opened, on this port OmnikListerenTCP is listening. (change in source code and recompile)<\/li>\n<li>Fill in your machine IP\/hostname into the Omnik Inverter Management interface (see above) and choose port TCP 8989<\/li>\n<li>Wait for the sun \ud83d\ude42<\/li>\n<\/ol>\n<h4>\u00a0Usage (csv output)<\/h4>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nto enable csv output and write to &quot;output.csv&quot; start with\r\n\r\n# .\/OmnikListenerTCP --csv-file=output.csv\r\n\r\nto enable mysql output\r\n<\/pre>\n<h4>Usage (mysql output)<\/h4>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\n# .\/OmnikListenerTCP \\ \r\n  --mysql-host=127.0.0.1 \\\r\n  --mysql-user=omnikdata \\\r\n  --mysql-pass=mysqlpassword \\\r\n  --mysql-db=omnikdata\r\n\r\n<\/pre>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\n-- Required table\r\n\r\nCREATE TABLE `omnikdata` (\r\n`inverterid` VARCHAR(16) NOT NULL,\r\n`moment` DATETIME NOT NULL,\r\n`temperature` DECIMAL(5,2) NOT NULL,\r\n`p_today` DECIMAL(5,2) UNSIGNED NOT NULL,\r\n`p_total` DECIMAL(10,2) UNSIGNED NOT NULL,\r\n`h_total` SMALLINT(5) UNSIGNED NOT NULL,\r\n`pv1_u` DECIMAL(5,2) NOT NULL,\r\n`pv1_i` DECIMAL(5,2) NOT NULL,\r\n`pv2_u` DECIMAL(5,2) NOT NULL,\r\n`pv2_i` DECIMAL(5,2) NOT NULL,\r\n`pv3_u` DECIMAL(5,2) NOT NULL,\r\n`pv3_i` DECIMAL(5,2) NOT NULL,\r\n`ac1_u` DECIMAL(5,2) NOT NULL,\r\n`ac1_i` DECIMAL(5,2) NOT NULL,\r\n`ac1_f` DECIMAL(5,2) NOT NULL,\r\n`ac1_p` SMALLINT(6) NOT NULL,\r\n`ac2_u` DECIMAL(5,2) NOT NULL,\r\n`ac2_i` DECIMAL(5,2) NOT NULL,\r\n`ac2_f` DECIMAL(5,2) NOT NULL,\r\n`ac2_p` SMALLINT(6) NOT NULL,\r\n`ac3_u` DECIMAL(5,2) NOT NULL,\r\n`ac3_i` DECIMAL(5,2) NOT NULL,\r\n`ac3_f` DECIMAL(5,2) NOT NULL,\r\n`ac3_p` SMALLINT(6) NOT NULL,\r\nINDEX `inverterid` (`inverterid`),\r\nINDEX `inverterid_moment` (`inverterid`, `moment`)\r\n);\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>[wpfilebase tag=fileurl id=6 linktext=&#8217;OmnikListenerTCP_c_source&#8217; \/]<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n\/*\r\n * I used Eclipse IDE to help me compile and debug. Eclipse compiles with:\r\n * gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF&quot;main.d&quot; -MT&quot;main.d&quot; -o &quot;main.o&quot; &quot;..\/main.c&quot;\r\n * gcc -L\/usr\/lib -L\/usr\/lib\/mysql -o &quot;OmnikListenerTCP&quot;\u00a0 .\/main.o .\/readconfig.o\u00a0\u00a0 -lmysqlclient\r\n *\/\r\n\r\n\/*\r\n\u00a0* main.c\r\n\u00a0*\r\n\u00a0*\u00a0 Beej's Guide to Network Programming\r\n\u00a0*\u00a0 http:\/\/beej.us\/guide\/bgnet\/output\/html\/multipage\/index.html\r\n\u00a0*\u00a0 http:\/\/beej.us\/guide\/bgnet\/output\/html\/multipage\/clientserver.html\r\n\u00a0*\r\n\u00a0*\u00a0 MySQL and C\r\n\u00a0*\u00a0 http:\/\/zetcode.com\/db\/mysqlc\/\r\n\u00a0*\u00a0 http:\/\/www.kitebird.com\/mysql-book\/ch06-3ed.pdf\r\n\u00a0*\r\n\u00a0*\u00a0 Omnik message info found here:\r\n\u00a0*\u00a0 Written in PHP\r\n\u00a0*\u00a0 https:\/\/github.com\/micromys\/Omnik\r\n\u00a0*\u00a0 Written in Python\r\n\u00a0*\u00a0 https:\/\/github.com\/Woutrrr\/Omnik-Data-Logger\/blob\/master\/InverterMsg.py\r\n\u00a0*\u00a0 Written in C\r\n\u00a0*\u00a0 https:\/\/github.com\/arjenv\/omnikstats\r\n\u00a0*\r\n\u00a0*\/\r\n\r\n#include &lt;stdio.h&gt;\r\n#include &lt;stdlib.h&gt;\r\n#include &lt;string.h&gt;\r\n#include &lt;sys\/types.h&gt;\r\n#include &lt;sys\/stat.h&gt;\r\n#include &lt;fcntl.h&gt;\r\n#include &lt;sys\/socket.h&gt;\r\n#include &lt;netdb.h&gt;\r\n#include &lt;arpa\/inet.h&gt;\r\n#include &lt;netinet\/in.h&gt;\r\n#include &lt;errno.h&gt;\r\n#include &lt;unistd.h&gt;\r\n#include &lt;sys\/wait.h&gt;\r\n#include &lt;signal.h&gt;\r\n#include &lt;time.h&gt;\r\n#include &lt;mysql\/mysql.h&gt;\r\n\r\n#define OMNIKPORTAL_PULL &quot;8899&quot;\r\n#define PORT_LISTEN &quot;8989&quot;\r\n#define BACKLOG 10\r\n\r\nFILE * fp;\r\n\r\nMYSQL *conn;\r\nMYSQL_RES *res;\r\nMYSQL_ROW row;\r\n\r\nunsigned char mysql_enabled = 0;\r\nchar mysql_host&#x5B;100] = &quot;&quot;;\r\nchar mysql_user&#x5B;32] = &quot;omniklistener&quot;;\r\nchar mysql_pass&#x5B;32] = &quot;&quot;;\r\nchar mysql_db&#x5B;100] = &quot;energyportal&quot;;\r\nunsigned int mysql_port = 3306;\r\nunsigned char csv_enabled = 0;\r\nchar csvfile&#x5B;250] = &quot;&quot;;\r\nunsigned char silent = 0;\r\n\r\nvoid doChildProcess(int fd_client);\r\nvoid printMessage(unsigned char *message, int length);\r\n\r\nvoid sigchld_handler(int s){\r\n\u00a0\u00a0 \u00a0while(waitpid(-1, NULL,WNOHANG) &gt; 0);\r\n}\r\n\r\n\/\/ get sockaddr, IPv4 or IPv6:\r\nvoid *get_in_addr(struct sockaddr *sa)\r\n{\r\n\u00a0\u00a0\u00a0 if (sa-&gt;sa_family == AF_INET) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return &amp;(((struct sockaddr_in*)sa)-&gt;sin_addr);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 return &amp;(((struct sockaddr_in6*)sa)-&gt;sin6_addr);\r\n}\r\nint startswith(const char *prefix, const char *string){\r\n\u00a0\u00a0 \u00a0size_t lenstring = strlen(string);\r\n\u00a0\u00a0 \u00a0size_t lenprefix = strlen(prefix);\r\n\u00a0\u00a0 \u00a0if(lenstring &lt; lenprefix){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return 0;\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return (strncmp(string,prefix,lenprefix) == 0);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nint main(int argc, char *argv&#x5B;]){\r\n\u00a0\u00a0 \u00a0int fd_server;\u00a0\u00a0 \u00a0\/\/Listening socket\r\n\u00a0\u00a0 \u00a0int fd_client;\u00a0 \/\/Client connected socket\r\n\u00a0\u00a0 \u00a0struct addrinfo hints, *res, *p;\r\n\u00a0\u00a0 \u00a0struct sockaddr_storage their_addr;\r\n\u00a0\u00a0 \u00a0struct sigaction sa;\r\n\u00a0\u00a0 \u00a0int status;\r\n\u00a0\u00a0 \u00a0char ipstr&#x5B;INET6_ADDRSTRLEN];\r\n\u00a0\u00a0 \u00a0socklen_t addr_size;\r\n\u00a0\u00a0 \u00a0char s&#x5B;INET6_ADDRSTRLEN];\r\n\u00a0\u00a0 \u00a0pid_t pid;\r\n\r\n\u00a0\u00a0 \u00a0\/\/Loop through command line arguments\r\n\u00a0\u00a0 \u00a0int i = 0;\r\n\u00a0\u00a0 \u00a0for(i = 0; i &lt; argc; i++){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(startswith(&quot;--mysql-host=&quot;,argv&#x5B;i])){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0strcpy(mysql_host,argv&#x5B;i]+strlen(&quot;--mysql-host=&quot;));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(startswith(&quot;--mysql-user=&quot;,argv&#x5B;i])){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0strcpy(mysql_user,argv&#x5B;i]+strlen(&quot;--mysql-user=&quot;));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(startswith(&quot;--mysql-pass=&quot;,argv&#x5B;i])){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0strcpy(mysql_pass,argv&#x5B;i]+strlen(&quot;--mysql-pass=&quot;));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(startswith(&quot;--mysql-db=&quot;,argv&#x5B;i])){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0strcpy(mysql_db,argv&#x5B;i]+strlen(&quot;--mysql-db=&quot;));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(startswith(&quot;--mysql-port=&quot;,argv&#x5B;i])){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sscanf(argv&#x5B;i]+strlen(&quot;--mysql-port=&quot;),&quot;%d&quot;,&amp;mysql_port);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(startswith(&quot;--csv-file=&quot;,argv&#x5B;i])){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0strcpy(csvfile,argv&#x5B;i]+strlen(&quot;--csv-file=&quot;));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(startswith(&quot;--silent&quot;,argv&#x5B;i])){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0silent = 1;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/\/When --mysql-host is filled, then enable mysql export\r\n\u00a0\u00a0 \u00a0if(strlen(mysql_host) &gt; 0){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0mysql_enabled = 1;\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\/\/When --csv-file is filled, then enable csv export\r\n\u00a0\u00a0 \u00a0if(strlen(csvfile) &gt; 0){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0csv_enabled = 1;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/\/Print out active configuration\r\n\u00a0\u00a0 \u00a0printf(&quot;OmnikListenerTCP\\n&quot;);\r\n\u00a0\u00a0 \u00a0printf(&quot; MySQL enabled : %d\\n&quot;,mysql_enabled);\r\n\u00a0\u00a0 \u00a0if(mysql_enabled){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot; MySQL host\u00a0\u00a0\u00a0 : %s\\n&quot;,mysql_host);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot; MySQL port\u00a0\u00a0\u00a0 : %d\\n&quot;,mysql_port);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot; MySQL user\u00a0\u00a0\u00a0 : %s\\n&quot;,mysql_user);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Maybe hide password? ;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/printf(&quot; MySQL pass\u00a0\u00a0\u00a0 : %s\\n&quot;,mysql_pass);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot; MySQL db\u00a0\u00a0\u00a0\u00a0\u00a0 : %s\\n&quot;,mysql_db);\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0printf(&quot; CSV enabled\u00a0\u00a0 : %d\\n&quot;,csv_enabled);\r\n\u00a0\u00a0 \u00a0if(csv_enabled){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot; CSV file\u00a0\u00a0\u00a0\u00a0\u00a0 : %s\\n&quot;,csvfile);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0memset(&amp;hints, 0, sizeof hints);\r\n\u00a0\u00a0 \u00a0hints.ai_family = AF_UNSPEC;\r\n\u00a0\u00a0 \u00a0hints.ai_socktype = SOCK_STREAM;\r\n\u00a0\u00a0 \u00a0hints.ai_flags = AI_PASSIVE;\r\n\r\n\u00a0\u00a0 \u00a0if((status = getaddrinfo(NULL, PORT_LISTEN, &amp;hints, &amp;res))!=0){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fprintf(stderr, &quot;getaddrinfo: %s\\n&quot;, gai_strerror(status));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return 2;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0for(p = res; p != NULL; p=p-&gt;ai_next){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0void *addr;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0char *ipver;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(p-&gt;ai_family == AF_INET){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0struct sockaddr_in *ipv4 = (struct sockaddr_in *)p-&gt;ai_addr;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0addr = &amp;(ipv4-&gt;sin_addr);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ipver = &quot;IPv4&quot;;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p-&gt;ai_addr;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0addr = &amp;(ipv6-&gt;sin6_addr);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ipver = &quot;IPv6&quot;;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0inet_ntop(p-&gt;ai_family, addr, ipstr, sizeof ipstr);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/printf(&quot; %s: %s\\n&quot;,ipver,ipstr);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0fd_server = socket(res-&gt;ai_family, res-&gt;ai_socktype, res-&gt;ai_protocol);\r\n\r\n\u00a0\u00a0 \u00a0if(fd_server == -1){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0perror(&quot;socket&quot;);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return 3;\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;Socket opened %d\\n&quot;,fd_server);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0if(bind(fd_server, res-&gt;ai_addr, res-&gt;ai_addrlen) == -1){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0perror(&quot;bind&quot;);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return 4;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0if(listen(fd_server,BACKLOG) == -1){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0perror(&quot;listen&quot;);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return 5;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0sa.sa_handler = sigchld_handler;\r\n\u00a0\u00a0 \u00a0sigemptyset(&amp;sa.sa_mask);\r\n\u00a0\u00a0 \u00a0sa.sa_flags = SA_RESTART;\r\n\u00a0\u00a0 \u00a0if(sigaction(SIGCHLD, &amp;sa, NULL) == -1){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0perror(&quot;sigaction&quot;);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0exit(1);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0printf(&quot;server: waiting for connections...\\n&quot;);\r\n\r\n\u00a0\u00a0 \u00a0while(1){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0addr_size = sizeof their_addr;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fd_client = accept(fd_server, (struct sockaddr *)&amp;their_addr, &amp;addr_size);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(fd_client == -1){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0perror(&quot;accept&quot;);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0continue;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;Socket accepted %d\\n&quot;,fd_client);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0inet_ntop(their_addr.ss_family,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0get_in_addr((struct sockaddr *)&amp;their_addr),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0s, sizeof s);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;server: get connection from %s\\n&quot;,s);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pid = fork();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(pid == 0){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0close(fd_server); \/\/child doesn't need the listener\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0doChildProcess(fd_client);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0close(fd_client);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0return 0;\r\n}\r\n\r\nvoid doChildProcess(int fd_client)\r\n{\r\n\u00a0\u00a0 \u00a0int numbytes;\r\n\u00a0\u00a0 \u00a0unsigned char recvbuf&#x5B;512];\r\n\r\n\u00a0\u00a0 \u00a0if((numbytes = recv(fd_client, recvbuf, 511, 0)) == -1){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0perror(&quot;recv&quot;);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0exit(1);\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0printf(&quot;client: received bytes %d \\n&quot;,numbytes);\r\n\r\n\u00a0\u00a0 \u00a0printMessage(recvbuf,numbytes);\r\n\r\n\u00a0\u00a0 \u00a0close(fd_client);\r\n\u00a0\u00a0 \u00a0exit(0);\r\n}\r\n\r\nvoid printMessage(unsigned char *message, int length){\r\n\u00a0\u00a0 \u00a0time_t timer;\r\n\u00a0\u00a0 \u00a0char timebuffer&#x5B;26];\r\n\u00a0\u00a0 \u00a0struct tm* tm_info;\r\n\u00a0\u00a0 \u00a0int i = 0;\r\n\u00a0\u00a0 \u00a0unsigned char byte;\r\n\r\n\u00a0\u00a0 \u00a0char p_id&#x5B;17];\r\n\u00a0\u00a0 \u00a0short p_temp;\r\n\u00a0\u00a0 \u00a0long p_etoday;\r\n\u00a0\u00a0 \u00a0long p_etotal;\r\n\u00a0\u00a0 \u00a0long p_htotal;\r\n\u00a0\u00a0 \u00a0short p_vpv1;\r\n\u00a0\u00a0 \u00a0short p_vpv2;\r\n\u00a0\u00a0 \u00a0short p_vpv3;\r\n\u00a0\u00a0 \u00a0short p_ipv1;\r\n\u00a0\u00a0 \u00a0short p_ipv2;\r\n\u00a0\u00a0 \u00a0short p_ipv3;\r\n\u00a0\u00a0 \u00a0short p_vac1;\r\n\u00a0\u00a0 \u00a0short p_vac2;\r\n\u00a0\u00a0 \u00a0short p_vac3;\r\n\u00a0\u00a0 \u00a0short p_iac1;\r\n\u00a0\u00a0 \u00a0short p_iac2;\r\n\u00a0\u00a0 \u00a0short p_iac3;\r\n\u00a0\u00a0 \u00a0short p_fac1;\r\n\u00a0\u00a0 \u00a0short p_fac2;\r\n\u00a0\u00a0 \u00a0short p_fac3;\r\n\u00a0\u00a0 \u00a0short p_pac1;\r\n\u00a0\u00a0 \u00a0short p_pac2;\r\n\u00a0\u00a0 \u00a0short p_pac3;\r\n\r\n\u00a0\u00a0 \u00a0time(&amp;timer);\r\n\u00a0\u00a0 \u00a0tm_info = localtime(&amp;timer);\r\n\r\n\u00a0\u00a0 \u00a0if(length &lt; 143)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;Message to short? Do not process.\\n&quot;);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0for(i = 0; i &lt; length; i++){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0byte = message&#x5B;i];\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;%02X &quot;,byte);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if((i + 1) % 8 == 0){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;\\n&quot;);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0printf(&quot;\\n&quot;);\r\n\r\n\u00a0\u00a0 \u00a0if(message&#x5B;0] == 0x68 &amp;&amp; message&#x5B;1] == 0x81 &amp;&amp; message&#x5B;2] == 0x41 &amp;&amp; message&#x5B;3] == 0xB0){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/OK\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;Header does not match hex: 68 81 41 B0\\n&quot;);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;Skip message&quot;);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0for(i = 0; i &lt; length; i++){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0byte = message&#x5B;i];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 15, start of SerialNumber\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i &gt;= 15 &amp;&amp; i &lt;= 30){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_id&#x5B;i-15]=byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 31-32 contain temperature\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 31){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_temp = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_temp = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 32){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_temp = p_temp | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 33-34 PV 1 input voltage\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 33){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vpv1 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vpv1 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 34){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vpv1 = p_vpv1 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 35-36 PV 2 input voltage\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 35){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vpv2 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vpv2 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 36){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vpv2 = p_vpv2 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 37-38 PV 3 input voltage\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 37){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vpv3 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vpv3 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 38){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vpv3 = p_vpv3 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 39-40 PV 1 input current\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 39){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_ipv1 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_ipv1 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 40){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_ipv1 = p_ipv1 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 41-42 PV 2 input current\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 41){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_ipv2 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_ipv2 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 42){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_ipv2 = p_ipv2 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 43-44 PV 3 input current\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 43){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_ipv3 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_ipv3 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 44){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_ipv3 = p_ipv3 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 45-46 AC output current phase 1\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 45){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_iac1 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_iac1 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 46){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_iac1 = p_iac1 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 47-48 AC output current phase 2\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 47){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_iac2 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_iac2 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 48){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_iac2 = p_iac2 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 49-50 AC output current phase 3\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i ==49){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_iac3 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_iac3 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 50){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_iac3 = p_iac3 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 51-52 AC output voltage phase 1\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 51){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vac1 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vac1 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 52){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vac1 = p_vac1 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 53-54 AC output voltage phase 2\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 53){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vac2 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vac2 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 54){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vac2 = p_vac2 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 55-56 AC output voltage phase 3\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 55){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vac3 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vac3 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 56){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_vac3 = p_vac3 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 57-58 AC output ??what?? phase 1\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 57){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_fac1 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_fac1 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 58){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_fac1 = p_fac1 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 59-60 AC output power phase 1\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 59){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac1 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac1 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 60){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac1 = p_pac1 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 61-62 AC output ??what?? phase 2\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 61){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_fac2 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_fac2 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 62){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_fac2 = p_fac2 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 63-64 AC output power phase 2\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 63){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac2 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac2 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 64){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac2 = p_pac2 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 63-64 AC output ??what?? phase 3\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 65){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_fac3 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_fac3 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 66){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_fac3 = p_fac3 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 67-68 AC output power phase 3\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 67){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac3 = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac3 = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 68){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac3 = p_pac3 | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 69-70 contain total kwh of today\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 69){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_etoday = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_etoday = byte &lt;&lt; 8;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 70){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_etoday = p_etoday | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 71-74 contain total kwh\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 71){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_etotal = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_etotal = p_etotal | (byte &lt;&lt; 24);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 72){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_etotal = p_etotal | (byte &lt;&lt; 16);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 73){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_etotal = p_etotal | (byte &lt;&lt; 8);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 74){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_etotal = p_etotal | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Byte 75-78 contain hours online\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 75){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_htotal = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_htotal = p_htotal | (byte &lt;&lt; 24);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 76){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_htotal = p_htotal | (byte &lt;&lt; 16);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 77){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_htotal = p_htotal | (byte &lt;&lt; 8);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(i == 78){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_htotal = p_htotal | byte;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0p_id&#x5B;16] = 0;\r\n\r\n\u00a0\u00a0 \u00a0if(!silent){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0strftime(timebuffer, sizeof(timebuffer), &quot;%Y-%m-%d %H:%M:%S&quot;, tm_info);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;Time\u00a0\u00a0\u00a0 : %s \\n&quot;, timebuffer);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;Serial\u00a0 : %s\u00a0\u00a0\u00a0\u00a0 \\n&quot;, p_id);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;Temp\u00a0\u00a0\u00a0 : %f\u00a0\u00a0\u00a0\u00a0 \\n&quot;, ((double) p_temp \/ 10));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;E-Today : %f kWh \\n&quot;, ((double) p_etoday \/ 100));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;E-Total : %f kWh \\n&quot;, ((double) p_etotal \/ 10));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;H-Total : %ld H\u00a0\u00a0 \\n&quot;, p_htotal);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;PV 1 U\u00a0 : %f V \\n&quot;, ((double) p_vpv1 \/ 10));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;PV 1 I\u00a0 : %f A \\n&quot;, ((double) p_ipv1 \/ 10));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;PV 2 U\u00a0 : %f V \\n&quot;, ((double) p_vpv2 \/ 10));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;PV 2 I\u00a0 : %f A \\n&quot;, ((double) p_ipv2 \/ 10));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;PV 3 U\u00a0 : %f V \\n&quot;, ((double) p_vpv3 \/ 10));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;PV 3 I\u00a0 : %f A \\n&quot;, ((double) p_ipv3 \/ 10));\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;AC1 U\u00a0\u00a0 : %f V \\n&quot;, ((double) p_vac1 \/ 10));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;AC1 I\u00a0\u00a0 : %f A \\n&quot;, ((double) p_iac1 \/ 10));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;AC1 ?\u00a0\u00a0 : %f ? \\n&quot;, ((double) p_fac1 \/ 100));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;AC1 P\u00a0\u00a0 : %d W \\n&quot;, p_pac1);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;AC2 U\u00a0\u00a0 : %f V \\n&quot;, ((double) p_vac2 \/ 10));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;AC2 I\u00a0\u00a0 : %f A \\n&quot;, ((double) p_iac2 \/ 10));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;AC2 ?\u00a0\u00a0 : %f ? \\n&quot;, ((double) p_fac2 \/ 100));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;AC2 P\u00a0\u00a0 : %d W \\n&quot;, p_pac2);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;AC3 V\u00a0\u00a0 : %f V \\n&quot;, ((double) p_vac3 \/ 10));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;AC3 I\u00a0\u00a0 : %f A \\n&quot;, ((double) p_iac3 \/ 10));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;AC3 ?\u00a0\u00a0 : %f ? \\n&quot;, ((double) p_fac3 \/ 100));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;AC3 P\u00a0\u00a0 : %d W \\n&quot;, p_pac3);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0strftime(timebuffer, sizeof(timebuffer), &quot;%Y-%m-%d %H:%M:%S&quot;, tm_info);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;%s,%s,%f,%f,%f,%ld,%f,%f,%f,%f,%f,%f,%f,%f,%f,%d,%f,%f,%f,%d,%f,%f,%f,%d\\n&quot;,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0timebuffer,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_id,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_temp \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_etoday \/ 100),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_etotal \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_htotal,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vpv1 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_ipv1 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vpv2 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_ipv2 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vpv3 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_ipv3 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vac1 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_iac1 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_fac1 \/ 100),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac1,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vac2 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_iac2 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_fac2 \/ 100),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac2,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vac3 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_iac3 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_fac3 \/ 100),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac3);\r\n\u00a0\u00a0 \u00a0} \/\/END !silent\r\n\r\n\u00a0\u00a0 \u00a0if(csv_enabled){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fp = fopen(csvfile,&quot;a&quot;);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(fp == NULL){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0perror(&quot;fopen&quot;);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(&quot;Opened file for appending\\n&quot;);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0strftime(timebuffer, sizeof(timebuffer), &quot;%Y-%m-%d %H:%M:%S&quot;, tm_info);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fprintf(fp, &quot;%s,%s,%f,%f,%f,%ld,%f,%f,%f,%f,%f,%f,%f,%f,%f,%d,%f,%f,%f,%d,%f,%f,%f,%d\\n&quot;,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0timebuffer,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_id,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_temp \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_etoday \/ 100),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_etotal \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_htotal,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vpv1 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_ipv1 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vpv2 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_ipv2 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vpv3 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_ipv3 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vac1 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_iac1 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_fac1 \/ 100),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac1,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vac2 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_iac2 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_fac2 \/ 100),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac2,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vac3 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_iac3 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_fac3 \/ 100),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac3);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fflush(fp);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fclose(fp);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0if(mysql_enabled){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Try to write to mysql\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0conn = mysql_init(NULL);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(conn == NULL){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0perror(&quot;mysql_init&quot;);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else{\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(!mysql_real_connect(conn,mysql_host,mysql_user,mysql_pass,mysql_db,mysql_port,NULL,0)){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fprintf(stderr, &quot;%s\\n&quot;,mysql_error(conn));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0char stmt_buf&#x5B;1024];\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sprintf(stmt_buf,&quot;&quot;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&quot;INSERT INTO `omnikdata` (&quot;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&quot;`inverterid`,`moment`,`temperature`,`p_today`,`p_total`,`h_total`,&quot;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&quot;`pv1_u`,`pv1_i`,`pv2_u`,`pv2_i`,`pv3_u`,`pv3_i`,&quot;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&quot;`ac1_u`,`ac1_i`,`ac1_f`,`ac1_p`,&quot;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&quot;`ac2_u`,`ac2_i`,`ac2_f`,`ac2_p`,&quot;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&quot;`ac3_u`,`ac3_i`,`ac3_f`,`ac3_p`) &quot;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&quot; VALUES (&quot;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&quot;'%s',NOW(),%f,%f,%f,%ld,%f,%f,%f,%f,%f,%f,%f,%f,%f,%d,%f,%f,%f,%d,%f,%f,%f,%d);&quot;,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_id,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_temp \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_etoday \/ 100),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_etotal \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_htotal,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vpv1 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_ipv1 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vpv2 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_ipv2 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vpv3 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_ipv3 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vac1 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_iac1 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_fac1 \/ 100),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac1,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vac2 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_iac2 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_fac2 \/ 100),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac2,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_vac3 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_iac3 \/ 10),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0((double) p_fac3 \/ 100),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0p_pac3);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0int nQueryResult = mysql_query(conn,stmt_buf);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (nQueryResult &gt; 0){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fprintf(stdout,&quot;%s\\n&quot;,mysql_error(conn));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else{\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/res = mysql_use_result(conn);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/while((row = mysql_fetch_row(res)) != NULL){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/\u00a0\u00a0 \u00a0printf(&quot;Database: %s\\n&quot;,row&#x5B;0]);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/\u00a0\u00a0 \u00a0\/\/int dumpresult = system(&quot;&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/mysql_free_result(res);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0mysql_close(conn);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0} \/\/END mysql_real_connect\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0} \/\/END mysql_init\r\n\u00a0\u00a0 \u00a0} \/\/END mysql_enabled\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Capture inverter data yourself? Or want to process generated data? Instead of using the Omnik Portal App? I found out that it is possible to configure the wifi kit to send TCP\/UDP packets to an remote server. After that i started googling around. With some minimal data i started write a small C program. Some [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13,5,1,146],"tags":[150,147,151,152,149,154,148,153],"class_list":["post-590","post","type-post","status-publish","format-standard","hentry","category-english","category-it-related","category-robin","category-solar-energy","tag-inverter","tag-omnik","tag-omnik-inverter","tag-omnik-portal","tag-omnik4000tl","tag-omniklistenertcp","tag-omniksol","tag-solar-energy-2"],"_links":{"self":[{"href":"http:\/\/www.mb200d.nl\/wordpress\/wp-json\/wp\/v2\/posts\/590","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.mb200d.nl\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.mb200d.nl\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.mb200d.nl\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.mb200d.nl\/wordpress\/wp-json\/wp\/v2\/comments?post=590"}],"version-history":[{"count":23,"href":"http:\/\/www.mb200d.nl\/wordpress\/wp-json\/wp\/v2\/posts\/590\/revisions"}],"predecessor-version":[{"id":620,"href":"http:\/\/www.mb200d.nl\/wordpress\/wp-json\/wp\/v2\/posts\/590\/revisions\/620"}],"wp:attachment":[{"href":"http:\/\/www.mb200d.nl\/wordpress\/wp-json\/wp\/v2\/media?parent=590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.mb200d.nl\/wordpress\/wp-json\/wp\/v2\/categories?post=590"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.mb200d.nl\/wordpress\/wp-json\/wp\/v2\/tags?post=590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}