SHOW:
|
|
- or go back to the newest paste.
| 1 | <html> | |
| 2 | <header> | |
| 3 | </header> | |
| 4 | <body> | |
| 5 | <?php | |
| 6 | ||
| 7 | // Code written in a night by Roeland Kindt for SEMS portal retrieval | |
| 8 | // PVoutput portion copied from older Goodwe2PVoutput script, thanks Antonboonstra! | |
| 9 | ||
| 10 | // Below portion is for PVOUTput site | |
| 11 | // Retrieve API key from PVOutput, you can create it on http://pvoutput.org/account.jsp under API settings | |
| 12 | $keyPVO = ""; | |
| 13 | // Fill in your System ID, you can retrieve it from http://pvoutput.org/account.jsp (at the bottom) | |
| 14 | $sidPVO = ""; | |
| 15 | ||
| 16 | // // SEMS portal portion | |
| 17 | // You can retriev powerstation id from URL if you visit website, or run the script once, it will provide the ID to you. | |
| 18 | $powerstation_id="3eac9f1a-bf1b-45ab-9e07-404c0cf8c083"; // not mandatory first run | |
| 19 | ||
| 20 | // Login SEMS portal website | |
| 21 | $email=""; | |
| 22 | // Password SEMS portal website. | |
| 23 | $password=""; | |
| 24 | ||
| 25 | //enable+/disable debug/test mode | |
| 26 | $test=true; // if true shows pvoutput url but does not submit it, set to false if working. | |
| 27 | $debug=false; // prints var_dump of vars, set to true to var_dump | |
| 28 | ||
| 29 | ||
| 30 | // below code does not need modifications. | |
| 31 | ||
| 32 | $vars = "{\"account\":\"$email\",\"pwd\":\"$password\"}";
| |
| 33 | ||
| 34 | //logic retrieved from original script by antonboostra | |
| 35 | echo "<pre>\n"; | |
| 36 | // determine if it is night or day, to prevent retrieval of data (reduce API calls) | |
| 37 | $day = date_sunrise(time(), SUNFUNCS_RET_TIMESTAMP, 52, 5.5); | |
| 38 | $night = date_sunset(time(), SUNFUNCS_RET_TIMESTAMP, 52, 5.5); | |
| 39 | $now = time(); | |
| 40 | if($now < ($day-600) || $now > ($night+600)) // 600 seconds (=10 minutes) margin | |
| 41 | {
| |
| 42 | echo "It is before dusk (".date("H:i",$day)." hour) or after sunset (".date("H:i",$night)." hour) \n";
| |
| 43 | if(!$test) exit(); // exit so we don't run the rest of the code | |
| 44 | } | |
| 45 | ||
| 46 | //basic setup for logging into SEMS portal | |
| 47 | $ch = curl_init(); | |
| 48 | curl_setopt($ch, CURLOPT_URL,"https://globalapi.sems.com.cn/api/v1/Common/CrossLogin"); | |
| 49 | curl_setopt($ch, CURLOPT_POST, 1); | |
| 50 | curl_setopt($ch, CURLOPT_POSTFIELDS,$vars); //Post Fields | |
| 51 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |
| 52 | ||
| 53 | $headers = [ | |
| 54 | 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', | |
| 55 | 'Accept-Encoding: gzip, deflate', | |
| 56 | 'Accept: */*', | |
| 57 | 'Connect: Keep-alive', | |
| 58 | 'Content-Type: application/json', | |
| 59 | 'Host: globalapi.sems.com.cn', | |
| 60 | 'Token: {"version":"v2.1.0","client":"ios","language":"en"}',
| |
| 61 | 'User-Agent: PVMaster/2.1.0 (iPhone; iOS 12.0; Scale/2.00)', | |
| 62 | ]; | |
| 63 | ||
| 64 | curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); | |
| 65 | ||
| 66 | $server_output = curl_exec ($ch); | |
| 67 | if($server_output==false){
| |
| 68 | echo curl_error($ch); | |
| 69 | exit(); | |
| 70 | } | |
| 71 | ||
| 72 | //retrieved basic login details | |
| 73 | $server_output = json_decode($server_output, true); | |
| 74 | if($debug) echo var_dump($server_output); | |
| 75 | ||
| 76 | $uid=""; | |
| 77 | $timestamp=""; | |
| 78 | $token=""; | |
| 79 | $retrieval=false; | |
| 80 | ||
| 81 | if($server_output["msg"]=="success"){
| |
| 82 | echo "<br/>retrieval ok <br/>"; | |
| 83 | $uid=$server_output["data"]["uid"]; | |
| 84 | $timestamp=$server_output["data"]["timestamp"]; | |
| 85 | $token=$server_output["data"]["token"]; | |
| 86 | $retrieval=true; | |
| 87 | }else{
| |
| 88 | echo "<br/>Basic SEMS portal login failed. Enable debug mode <br/>"; | |
| 89 | curl_close ($ch); | |
| 90 | exit(); | |
| 91 | } | |
| 92 | ||
| 93 | ||
| 94 | if($retrieval && trim($powerstation_id)==""){
| |
| 95 | $vars="{\"page_size\":\"5\",\"orderby\":\"\",\"powerstation_status\":\"\",\"key\":\"\",\"page_index\":\"1\",\"powerstation_id\":\"\",\"powerstation_type\":\"\"}";
| |
| 96 | $headers = [ | |
| 97 | 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', | |
| 98 | 'Accept-Encoding: gzip, deflate', | |
| 99 | 'Accept: */*', | |
| 100 | 'Connect: Keep-alive', | |
| 101 | 'Content-Type: application/json', | |
| 102 | 'Host: globalapi.sems.com.cn', | |
| 103 | 'Token: {"version":"v2.1.0","client":"ios","language":"en","timestamp":'.$timestamp.',"uid":"'.$uid.'","token":"'.$token.'"}',
| |
| 104 | 'User-Agent: PVMaster/2.1.0 (iPhone; iOS 12.0; Scale/2.00)', | |
| 105 | ]; | |
| 106 | curl_setopt($ch, CURLOPT_URL,"https://euapi.sems.com.cn/api/PowerStationMonitor/QueryPowerStationMonitorForApp"); | |
| 107 | curl_setopt($ch, CURLOPT_POST, 1); | |
| 108 | curl_setopt($ch, CURLOPT_POSTFIELDS,$vars); //Post Fields | |
| 109 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |
| 110 | curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); | |
| 111 | ||
| 112 | $server_output2 = curl_exec ($ch); | |
| 113 | $server_output2 = json_decode($server_output2, true); | |
| 114 | if($server_output2["msg"]=="success"){
| |
| 115 | if($debug) var_dump($server_output2); | |
| 116 | echo "<br/>retrieval powerstation ok <br/>"; | |
| 117 | $powerstation_id=$server_output2["data"][0]["powerstation_id"]; | |
| 118 | echo "retrieved ".$powerstation_id."<br/>"; | |
| 119 | } | |
| 120 | }else{
| |
| 121 | echo "Powerstation id is provided: ".$powerstation_id."<br/>"; | |
| 122 | } | |
| 123 | ||
| 124 | $retrieval3=false; | |
| 125 | if($retrieval&& !trim($powerstation_id)==""){
| |
| 126 | echo "retrieval 3 ok <br/>"; | |
| 127 | ||
| 128 | $vars="{\"powerStationId\":\"$powerstation_id\"}";
| |
| 129 | $headers = [ | |
| 130 | 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', | |
| 131 | 'Accept-Encoding: gzip, deflate', | |
| 132 | 'Accept: */*', | |
| 133 | 'Connect: Keep-alive', | |
| 134 | 'Content-Type: application/json', | |
| 135 | 'Host: globalapi.sems.com.cn', | |
| 136 | 'Token: {"version":"v2.1.0","client":"ios","language":"en","timestamp":'.$timestamp.',"uid":"'.$uid.'","token":"'.$token.'"}',
| |
| 137 | 'User-Agent: PVMaster/2.1.0 (iPhone; iOS 12.0; Scale/2.00)', | |
| 138 | ]; | |
| 139 | curl_setopt($ch, CURLOPT_URL,"https://euapi.sems.com.cn/api/v1/PowerStation/GetMonitorDetailByPowerstationId"); | |
| 140 | curl_setopt($ch, CURLOPT_POST, 1); | |
| 141 | curl_setopt($ch, CURLOPT_POSTFIELDS,$vars); //Post Fields | |
| 142 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |
| 143 | curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); | |
| 144 | ||
| 145 | $server_output3 = curl_exec ($ch); | |
| 146 | $server_output3 = json_decode($server_output3, true); | |
| 147 | ||
| 148 | if($debug) var_dump($server_output3); | |
| 149 | ||
| 150 | $retrieval3=true; | |
| 151 | $pac=$server_output3["data"]["kpi"]["pac"]; | |
| 152 | $powerpki=$server_output3["data"]["kpi"]["power"]; | |
| 153 | $temp=$server_output3["data"]["inverter"][0]["tempperature"]; | |
| 154 | $vpv1=$server_output3["data"]["inverter"][0]["d"]["vpv1"]; | |
| 155 | $vpv2=$server_output3["data"]["inverter"][0]["d"]["vpv2"]; | |
| 156 | ||
| 157 | $power = intval($pac); | |
| 158 | $energy_cum = round(floatval($powerpki)*1000); | |
| 159 | $vdc = round(floatval($vpv1),1); // v6 = Voltage DC van MPP1 | |
| 160 | $temperature = round(floatval($temp),1); | |
| 161 | echo "<h1>Energy = $energy_cum Wh - Power = $power W - DC voltage 1 = $vdc, DC voltage 2 = $vpv2 - Temperature = $temperature degr.C\n </h1>"; | |
| 162 | ||
| 163 | }else{
| |
| 164 | echo "<br/>Advanced SEMS portal data retrieval failed. Enable debug mode <br/>"; | |
| 165 | curl_close ($ch); | |
| 166 | exit(); | |
| 167 | } | |
| 168 | ||
| 169 | curl_close ($ch); | |
| 170 | ||
| 171 | ||
| 172 | if($retrieval && $retrieval3){
| |
| 173 | ||
| 174 | // Combine the RUL to call PVoutpout and submit data Stel | |
| 175 | $url = 'http://pvoutput.org/service/r2/addstatus.jsp?key='.$keyPVO.'&sid='.$sidPVO.'&d='.date("Ymd").'&t='.date("H:i").'&v1='.$energy_cum.'&v2='.$power.'&v5='.$temperature.'&v6='.$vdc.'&c1=0';
| |
| 176 | // if $test is true, only show url otherwise submit | |
| 177 | if($test){
| |
| 178 | echo "URL = $url \n"; | |
| 179 | }else{
| |
| 180 | $responds = file_get_contents($url); | |
| 181 | echo "Responds PVOutput was: $responds \n"; | |
| 182 | if($responds == "OK 200: Added Status") | |
| 183 | {
| |
| 184 | echo "The values were succesfully retrieved and submitted to PVOutput \n"; | |
| 185 | } | |
| 186 | else | |
| 187 | {
| |
| 188 | echo "Issue submitting to PVOutput, let's try again...<br>\n"; | |
| 189 | sleep(4); // wacht 4 seconden | |
| 190 | $responds = file_get_contents($url); | |
| 191 | if($responds == "OK 200: Added Status") | |
| 192 | {
| |
| 193 | echo "The values were succesfully retrieved and submitted to PVOutput \n"; | |
| 194 | } | |
| 195 | else | |
| 196 | {
| |
| 197 | echo "PVOutput submit failed for a second time, please verify if settings are correct.\n"; | |
| 198 | echo "Responds PVOutput was: $responds \n"; | |
| 199 | } | |
| 200 | } | |
| 201 | } | |
| 202 | } | |
| 203 | ||
| 204 | ||
| 205 | ||
| 206 | ||
| 207 | echo '</pre>'; | |
| 208 | ?> | |
| 209 | ||
| 210 | </body> | |
| 211 | </html> |