├── ME_Full_Year_Month_History_V01.py ├── ME_Query - Example.py ├── MyEnergi_Querying.py ├── README.md ├── cgi-jdayhour_response ├── eddi_response ├── harvi_response ├── status_response └── zappi_response /ME_Full_Year_Month_History_V01.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from requests.auth import HTTPDigestAuth 3 | from datetime import datetime 4 | 5 | Zappi_SN = 'your Zappi Serial Number Here' 6 | Eddi_SN = 'your Eddi Serial Number Here' 7 | 8 | Hub_SN = 'Your Hub Serial Number Here' 9 | API_Key = 'Your API key here' 10 | 11 | username = Hub_SN # Use any MyEnergi device serial number e.g Hub, Eddi or Zappi 12 | password = API_Key # Your MyEnergi API key from the Web portal 13 | 14 | #Example calls to the API 15 | eddi_url = 'https://s18.myenergi.net/cgi-jstatus-E' # Eddi report 16 | zappi_url = 'https://s18.myenergi.net/cgi-jstatus-Z' # Zappi report 17 | harvi_url = 'https://s18.myenergi.net/cgi-jstatus-H' # Hub report 18 | status_url = 'https://s18.myenergi.net/cgi-jstatus-*' # Everything 19 | dayhour_url = 'https://s18.myenergi.net/cgi-jdayhour-Z' + Zappi_SN # -CCYY-MM-DD 20 | 21 | print("Creating Report\n") 22 | 23 | #define a function to access the server using a parsed URL 24 | def access_server(url_request): 25 | headers = {'User-Agent': 'Wget/1.14 (linux-gnu)'} 26 | r = requests.get(url_request, headers = headers, auth=HTTPDigestAuth(username, password), timeout=10) 27 | if (r.status_code == 200): 28 | pass 29 | #print ("Login success") #"Login successful..") 30 | elif (r.status_code == 401): 31 | print ("Login unsuccessful!!! Please check username, password or URL..") 32 | quit() 33 | #print (r.json()) 34 | return r.json() 35 | 36 | #define a function to retrieve data for a day 37 | def day_results(day, month, year): 38 | failed = "false" 39 | response_data = access_server(dayhour_url + '-' + str(year) + '-' + str(month) + '-' + str(day)) 40 | #print(dayhour_url + '-' + str(year) + '-' + str(month) + '-' + str(day)) 41 | ChargeAmount = 0 42 | ImportAmount = 0 43 | ExportAmount = 0 44 | GeneraAmount = 0 45 | #print (json.dumps(response_data, sort_keys=False, indent=2)) 46 | try: 47 | response_data['U' + Zappi_SN] 48 | except: 49 | failed = "true" 50 | pass 51 | if (failed == "false"): 52 | for item in response_data['U' + Zappi_SN]: 53 | try: 54 | #print ("Query Month: ", item['dow'], item['yr'], item['mon'], item['dom'], item['hr'], item['h1d'], item['imp'], item['gep']) 55 | ChargeAmount += item['h1d'] 56 | ImportAmount += item['imp'] 57 | ExportAmount += item['exp'] 58 | GeneraAmount += item['gep'] 59 | except: 60 | pass 61 | #End of for loop 62 | #print ("%.2f" % (total/3600/1000),"kWh") 63 | ChargeMonthResults[day] = (ChargeAmount/3600/1000) 64 | ImportMonthResults[day] = (ImportAmount/3600/1000) 65 | ExportMonthResults[day] = (ExportAmount/3600/1000) 66 | GeneraMonthResults[day] = (GeneraAmount/3600/1000) 67 | 68 | # end-of-function definitions 69 | 70 | ## Now get the data for each day 71 | ImportMonthResults = [0.0] * 32 # Space for 31-days/month 72 | ImportYearResults = [0] * 10 # Sets a 10-year maximum of results, could be more or less 73 | ExportMonthResults = [0] * 32 # Space for 31-days/month 74 | ExportYearResults = [0] * 10 # Sets a 10-year maximum of results, could be more or less 75 | GeneraMonthResults = [0] * 32 # Space for 31-days/month 76 | GeneraYearResults = [0] * 10 # Sets a 10-year maximum of results, could be more or less 77 | ChargeMonthResults = [0] * 32 # Space for 31-days/month 78 | ChargeYearResults = [0] * 10 # Sets a 10-year maximum of results, could be more or less 79 | StartYear = 2021 # System installed October 2021 80 | EndYear = 2023 81 | 82 | BOLD_ON = '\033[1m' 83 | BOLD_OFF = '\033[0m' 84 | 85 | today = datetime.now() 86 | CurrentMonth = int(today.strftime("%m")) 87 | CurrentYear = int(today.strftime("%y")) + 2000 88 | 89 | for Year in range(StartYear, EndYear + 1): 90 | print ("\nProducing Monthly History for year: " + str(Year)) 91 | print("{0:>10}".format("Month") + "{0:>10}".format("Charge") + "{0:>10}".format("Import") + "{0:>10}".format("Export") + "{0:>14}".format("Generation")) 92 | for Month in range(1, 13): 93 | if (Year == CurrentYear and Month > CurrentMonth): 94 | pass 95 | else: 96 | total_charge = 0 97 | total_import = 0 98 | total_export = 0 99 | total_genera = 0 100 | for Day in range(1, 31): 101 | day_results(Day, Month, Year) 102 | if (ChargeMonthResults[Day] != 0): 103 | total_charge += ChargeMonthResults[Day] 104 | total_import += ImportMonthResults[Day] 105 | total_export += ExportMonthResults[Day] 106 | total_genera += GeneraMonthResults[Day] 107 | #print(Day, ("%.1d" % ChargeMonthResults[Day] + "kWh"))) 108 | print(BOLD_ON, end='') 109 | print("{0:10}".format(Month), end='') 110 | print("{:8.1f}".format(total_charge), end='') 111 | print("{:11.1f}".format(total_import), end='') 112 | print("{:8.1f}".format(total_export), end='') 113 | print("{:10.1f}".format(total_genera)) 114 | print(BOLD_OFF, end='') 115 | 116 | ChargeYearResults[Year - StartYear] += total_charge 117 | ImportYearResults[Year - StartYear] += total_import 118 | ExportYearResults[Year - StartYear] += total_export 119 | GeneraYearResults[Year - StartYear] += total_genera 120 | #End of month 121 | print(BOLD_ON, end='') 122 | print("Yearly Total [" + str(Year) + "] (kWh)\n", end='') 123 | print('{:18.1f}'.format(ChargeYearResults[Year - StartYear]), end='') 124 | print('{:11.1f}'.format(ImportYearResults[Year - StartYear]), end='') 125 | print('{:8.1f}'.format(ExportYearResults[Year - StartYear]), end='') 126 | print('{:10.1f}'.format(GeneraYearResults[Year - StartYear])) 127 | print(BOLD_OFF, end='') 128 | #End of year 129 | 130 | print(BOLD_ON, end='') 131 | print("\nSummary of Charge Energy per-year (kWh)") 132 | for Year in range(StartYear, EndYear + 1): 133 | print("Total for Year [" + str(Year) + "] = " + str('{:5.1f}'.format(ChargeYearResults[Year - StartYear]))) 134 | 135 | print("\n Total of all Years =" + str('{:6.1f}'.format(sum(ChargeYearResults))) + " kWh") 136 | print(" Savings =" + str(" £"+'{:5.2f}'.format(sum(ChargeYearResults)*0.34))) 137 | print(BOLD_OFF, end='') 138 | -------------------------------------------------------------------------------- /ME_Query - Example.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from requests.auth import HTTPDigestAuth 3 | import json 4 | 5 | username = '12345678' # Use any MyEnergi device serial number e.g Eddi or Zappi 6 | password = 'hXhP3qmzUJ9p73JwtbOsVtS8' # Your MyEnergi API key from the Web portal (this is an example!) 7 | eddi_url = 'https://s18.myenergi.net/cgi-jstatus-E' # Eddi report 8 | zappi_url = 'https://s18.myenergi.net/cgi-jstatus-Z' # Zappi report 9 | harvi_url = 'https://s18.myenergi.net/cgi-jstatus-H' # Hub report 10 | status_url = 'https://s18.myenergi.net/cgi-jstatus-*' # Everything 11 | dayhour_url = 'https://s18.myenergi.net/cgi-jdayhour-Znnnnnnnn-YYYY-MM-DD # put your Zappi code in here Z12345678 and a date 2022-08-12 12 | 13 | print("Accessing MyEnergi System") 14 | 15 | #define a function to access the server using a parsed URL 16 | def access_server(url_request): 17 | headers = {'User-Agent': 'Wget/1.14 (linux-gnu)'} 18 | r = requests.get(url_request, headers = headers, auth=HTTPDigestAuth(username, password), timeout=10) 19 | if (r.status_code == 200): 20 | print ("") #"Login successful..") 21 | elif (r.status_code == 401): 22 | print ("Login unsuccessful!!! Please check username, password or URL..") 23 | quit() 24 | #print (r.json()) 25 | return r.json() 26 | 27 | # end-of-function definition 28 | 29 | # Display STATUS response data 30 | print ("STATUS") 31 | response_data = access_server(status_url) 32 | print (json.dumps(response_data, sort_keys=False, indent=3)) 33 | 34 | # Display DAYHOUR response data 35 | print ("DAYHOUR") 36 | response_data = access_server(dayhour_url) 37 | print (json.dumps(response_data, sort_keys=False, indent=3)) 38 | 39 | # Display HARVI response data 40 | print ("HARVI") 41 | response_data = access_server(harvi_url) 42 | print (json.dumps(response_data, sort_keys=False, indent=3)) 43 | 44 | # Display EDDI response data 45 | print("EDDI") 46 | response_data = access_server(eddi_url) 47 | print (json.dumps(response_data, sort_keys=False, indent=3)) 48 | 49 | # Display ZAPPI response data 50 | print ("ZAPPI") 51 | response_data = access_server(zappi_url) 52 | print (json.dumps(response_data, sort_keys=False, indent=3)) 53 | for item in response_data['zappi']: 54 | print ("Zappi Serial number: ", item['sno']) 55 | print ("Query date: ", item['dat']) 56 | print ("Query time: ", item['tim']) 57 | 58 | 59 | # Typical Zappi response 60 | #'{"zappi":[{"sno":12345678,"dat":"12-08-2022","tim":"08:28:08", 61 | # "ectp2":-2,"ectp3":3,"ectt1":"Internal Load","ectt2":"None","ectt3":"None", 62 | # "bsm":0,"bst":0,"cmt":254,"dst":1,"div":0,"frq":49.94,"fwv":"3560S3.142", 63 | # "gen":148,"grd":274,"pha":1,"pri":1,"sta":1,"tz":0,"vol":2406,"che":1.02, 64 | # "bss":0,"lck":16,"pst":"A","zmo":3,"pwm":5300,"zs":258,"rdc":1,"rac":3, 65 | # "zsh":1,"zsl":2,"ectp4":8,"ectt4":"None","ectt5":"None","ectt6":"None", 66 | # "mgl":50,"sbh":17,"sbk":5}]}' 67 | -------------------------------------------------------------------------------- /MyEnergi_Querying.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from requests.auth import HTTPDigestAuth 3 | import json 4 | 5 | username = 'enter your HUB serial here' 6 | password = 'enter your password here' 7 | eddi_url = 'https://s18.myenergi.net/cgi-jstatus-E' 8 | zappi_url = 'https://s18.myenergi.net/cgi-jstatus-Z' 9 | harvi_url = 'https://s18.myenergi.net/cgi-jstatus-H' 10 | status_url = 'https://s18.myenergi.net/cgi-jstatus-*' 11 | dayhour_url = 'https://s18.myenergi.net/cgi-jdayhour-Z15536718-2021-10-20' 12 | # https://s18.myenergi.net/cgi-jdayhour-Znnnnnnnn-YYYY-MM-DD 13 | 14 | print("Accessing MyEnergi System") 15 | 16 | #define a function to access the server using a parsed URL 17 | def access_server(url_request): 18 | headers = {'User-Agent': 'Wget/1.14 (linux-gnu)'} 19 | r = requests.get(url_request, headers = headers, auth=HTTPDigestAuth(username, password), timeout=10) 20 | if (r.status_code == 200): 21 | print ("") #"Login successful..") 22 | elif (r.status_code == 401): 23 | print ("Login unsuccessful!!! Please check username, password or URL..") 24 | quit() 25 | else: 26 | logging.info("Login unsuccessful, returned code: " + r.status_code) 27 | quit() 28 | #print (r.json()) 29 | return r.json() 30 | 31 | # end-of-function definition 32 | 33 | # Display STATUS response data 34 | print ("STATUS") 35 | response_data = access_server(status_url) 36 | print (json.dumps(response_data, sort_keys=False, indent=3)) 37 | 38 | # Display DAYHOUR response data 39 | print ("DAYHOUR") 40 | response_data = access_server(dayhour_url) 41 | print (json.dumps(response_data, sort_keys=False, indent=3)) 42 | 43 | # Display HARVI response data 44 | print ("HARVI") 45 | response_data = access_server(harvi_url) 46 | print (json.dumps(response_data, sort_keys=False, indent=3)) 47 | 48 | # Display EDDI response data 49 | print("EDDI") 50 | response_data = access_server(eddi_url) 51 | print (json.dumps(response_data, sort_keys=False, indent=3)) 52 | 53 | # Display ZAPPI response data 54 | print ("ZAPPI") 55 | response_data = access_server(zappi_url) 56 | print (json.dumps(response_data, sort_keys=False, indent=3)) 57 | for item in response_data['zappi']: 58 | print ("Zappi Serial number: ", item['sno']) 59 | print ("Query date: ", item['dat']) 60 | print ("Query time: ", item['tim']) 61 | 62 | 63 | # Typical Zappi response 64 | #'{"zappi":[{"sno":nnnnnnnn,"dat":"23-10-2021","tim":"08:28:08", 65 | # "ectp2":-2,"ectp3":3,"ectt1":"Internal Load","ectt2":"None","ectt3":"None", 66 | # "bsm":0,"bst":0,"cmt":254,"dst":1,"div":0,"frq":49.94,"fwv":"3560S3.142", 67 | # "gen":148,"grd":274,"pha":1,"pri":1,"sta":1,"tz":0,"vol":2406,"che":1.02, 68 | # "bss":0,"lck":16,"pst":"A","zmo":3,"pwm":5300,"zs":258,"rdc":1,"rac":3, 69 | # "zsh":1,"zsl":2,"ectp4":8,"ectt4":"None","ectt5":"None","ectt6":"None", 70 | # "mgl":50,"sbh":17,"sbk":5}]}' 71 | 72 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MyEnergi-Python-Example 2 | How to access and display MyEnergi data 3 | 4 | Windows PC 5 | 6 | 1. Install a version of Python typically 3.10 7 | 2. The Python code here needs additional modules to be installed, so launch Windows Powershell(Admin) 8 | 3. Type: 9 | 4. pip install requests 10 | 5. pip install json 11 | 6. Repeat for any other missing modules 12 | 7. Download the example Python code provided, to your desok top is easiest 13 | 8. Right click and edit with Idle (You need to install Idle) 14 | 9. Edit the file to add your Username (HUB serial number) and Password (API Key) 15 | 10. Choose Run 16 | 11. Enjoy 17 | 18 | API Error Codes and meaning 19 | 20 | CODE MEANING 21 | 22 | 0 O.K. / Success 23 | 24 | -1 Invalid ID – The unit or group cannot be found or the user does not 25 | have access rights to the ID. 26 | 27 | -2 Invalid DSR command sequence number. Valid write values or 1-15 28 | inclusive. Valid read values are 0-15 inclusive. 29 | 30 | -3 No action taken. Command Sequence Number “csn” equals “err” for 31 | single unit. i.e. Command Sequence number is same as last number 32 | used. 33 | 34 | -4 Hub not found. No associated hub record for the unit. 35 | 36 | -5 Internal Error. 37 | 38 | -6 Invalid load value. 39 | 40 | -7 Year missing. 41 | 42 | -8 Month missing or invalid. 43 | 44 | -9 Day missing or invalid. 45 | 46 | -10 Hour missing or invalid. 47 | 48 | -11 Invalid TTL Value. 49 | 50 | -12 User not authorised to perform operation. 51 | 52 | -13 Serial No not found. 53 | 54 | -14 Missing or bad parameter. 55 | 56 | -15 Invalid password. 57 | 58 | -16 New passwords don’t match. 59 | 60 | -17 Invalid new password. Password must not contain “&” 61 | 62 | -18 New password is same as old password. 63 | 64 | -19 User not registered. 65 | 66 | -20 Minute missing or invalid 67 | 68 | -21 Slot missing or invalid 69 | 70 | -22 Priority bad or missing 71 | 72 | -23 Command not appropriate for device 73 | 74 | -24 Check period bad or missing 75 | 76 | -25 Min Green Level bad or missing 77 | 78 | -26 Busy – Server is already sending a command to the device. 79 | 80 | -27 Relay not fitted. 81 | 82 | -------------------------------------------------------------------------------- /cgi-jdayhour_response: -------------------------------------------------------------------------------- 1 | Response for a Zappi: 2 | { 3 | "Unnnnnnnn": [ 4 | { 5 | "yr": 2021, 6 | "mon": 10, 7 | "dom": 20, 8 | "imp": 928800, 9 | "exp": 180, 10 | "gen": 57660, 11 | "dow": "Wed" 12 | }, 13 | { 14 | "yr": 2021, 15 | "mon": 10, 16 | "dom": 20, 17 | "hr": 1, 18 | "imp": 895971, 19 | "gen": 57796, 20 | "dow": "Wed" 21 | }, 22 | { 23 | "yr": 2021, 24 | "mon": 10, 25 | "dom": 20, 26 | "hr": 2, 27 | "imp": 876060, 28 | "gen": 57660, 29 | "dow": "Wed" 30 | }, 31 | { 32 | "yr": 2021, 33 | "mon": 10, 34 | "dom": 20, 35 | "hr": 3, 36 | "imp": 800640, 37 | "gen": 55680, 38 | "dow": "Wed" 39 | }, 40 | { 41 | "yr": 2021, 42 | "mon": 10, 43 | "dom": 20, 44 | "hr": 4, 45 | "imp": 878100, 46 | "exp": 480, 47 | "gen": 56580, 48 | "dow": "Wed" 49 | }, 50 | { 51 | "yr": 2021, 52 | "mon": 10, 53 | "dom": 20, 54 | "hr": 5, 55 | "imp": 862140, 56 | "gen": 58500, 57 | "dow": "Wed" 58 | }, 59 | { 60 | "yr": 2021, 61 | "mon": 10, 62 | "dom": 20, 63 | "hr": 6, 64 | "imp": 856920, 65 | "gen": 66720, 66 | "dow": "Wed" 67 | }, 68 | { 69 | "yr": 2021, 70 | "mon": 10, 71 | "dom": 20, 72 | "hr": 7, 73 | "imp": 1408680, 74 | "exp": 780, 75 | "gep": 179700, 76 | "gen": 31260, 77 | "dow": "Wed" 78 | }, 79 | { 80 | "yr": 2021, 81 | "mon": 10, 82 | "dom": 20, 83 | "hr": 8, 84 | "imp": 759702, 85 | "exp": 42960, 86 | "gep": 1156444, 87 | "dow": "Wed" 88 | }, 89 | { 90 | "yr": 2021, 91 | "mon": 10, 92 | "dom": 20, 93 | "hr": 9, 94 | "imp": 205086, 95 | "exp": 182700, 96 | "gep": 4981086, 97 | "gen": 840, 98 | "dow": "Wed" 99 | }, 100 | { 101 | "yr": 2021, 102 | "mon": 10, 103 | "dom": 20, 104 | "hr": 10, 105 | "imp": 454740, 106 | "exp": 387060, 107 | "gep": 8300280, 108 | "dow": "Wed" 109 | }, 110 | { 111 | "yr": 2021, 112 | "mon": 10, 113 | "dom": 20, 114 | "hr": 11, 115 | "imp": 682680, 116 | "exp": 1037820, 117 | "gep": 9261780, 118 | "dow": "Wed" 119 | }, 120 | { 121 | "yr": 2021, 122 | "mon": 10, 123 | "dom": 20, 124 | "hr": 12, 125 | "imp": 253140, 126 | "exp": 278220, 127 | "gep": 7834620, 128 | "gen": 2640, 129 | "dow": "Wed" 130 | }, 131 | { 132 | "yr": 2021, 133 | "mon": 10, 134 | "dom": 20, 135 | "hr": 13, 136 | "imp": 293880, 137 | "exp": 407280, 138 | "gep": 8780640, 139 | "dow": "Wed" 140 | }, 141 | { 142 | "yr": 2021, 143 | "mon": 10, 144 | "dom": 20, 145 | "hr": 14, 146 | "imp": 258720, 147 | "exp": 655680, 148 | "gep": 4231800, 149 | "dow": "Wed" 150 | }, 151 | { 152 | "yr": 2021, 153 | "mon": 10, 154 | "dom": 20, 155 | "hr": 15, 156 | "imp": 187560, 157 | "exp": 599888, 158 | "gep": 1350404, 159 | "gen": 180, 160 | "dow": "Wed" 161 | }, 162 | { 163 | "yr": 2021, 164 | "mon": 10, 165 | "dom": 20, 166 | "hr": 16, 167 | "imp": 1351440, 168 | "exp": 444960, 169 | "gep": 118320, 170 | "gen": 28920, 171 | "dow": "Wed" 172 | }, 173 | { 174 | "yr": 2021, 175 | "mon": 10, 176 | "dom": 20, 177 | "hr": 17, 178 | "imp": 210000, 179 | "exp": 7020, 180 | "gen": 66180, 181 | "dow": "Wed" 182 | }, 183 | { 184 | "yr": 2021, 185 | "mon": 10, 186 | "dom": 20, 187 | "hr": 18, 188 | "imp": 271680, 189 | "exp": 15780, 190 | "gen": 63300, 191 | "dow": "Wed" 192 | }, 193 | { 194 | "yr": 2021, 195 | "mon": 10, 196 | "dom": 20, 197 | "hr": 19, 198 | "imp": 220500, 199 | "exp": 33180, 200 | "gen": 59160, 201 | "dow": "Wed" 202 | }, 203 | { 204 | "yr": 2021, 205 | "mon": 10, 206 | "dom": 20, 207 | "hr": 20, 208 | "imp": 217320, 209 | "exp": 13860, 210 | "gen": 65040, 211 | "dow": "Wed" 212 | }, 213 | { 214 | "yr": 2021, 215 | "mon": 10, 216 | "dom": 20, 217 | "hr": 21, 218 | "imp": 201000, 219 | "exp": 15240, 220 | "gen": 60240, 221 | "dow": "Wed" 222 | }, 223 | { 224 | "yr": 2021, 225 | "mon": 10, 226 | "dom": 20, 227 | "hr": 22, 228 | "imp": 221700, 229 | "exp": 13860, 230 | "gen": 60720, 231 | "dow": "Wed" 232 | }, 233 | { 234 | "yr": 2021, 235 | "mon": 10, 236 | "dom": 20, 237 | "hr": 23, 238 | "imp": 219010, 239 | "exp": 9120, 240 | "gen": 56898, 241 | "dow": "Wed" 242 | } 243 | ] 244 | } 245 | -------------------------------------------------------------------------------- /eddi_response: -------------------------------------------------------------------------------- 1 | { 2 | "eddi": [ 3 | { 4 | "sno": nnnnnnnn, 5 | "dat": "23-10-2021", 6 | "tim": "11:46:38", 7 | "ectt1": "Internal Load", 8 | "ectt2": "None", 9 | "ectt3": "None", 10 | "bsm": 0, 11 | "bst": 0, 12 | "cmt": 254, 13 | "dst": 1, 14 | "div": 0, 15 | "frq": 49.96, 16 | "fwv": "3200S3.048", 17 | "gen": 466, 18 | "grd": 20, 19 | "pri": 2, 20 | "sta": 1, 21 | "tz": 0, 22 | "hpri": 1, 23 | "hno": 1, 24 | "ht1": "Tank 1", 25 | "ht2": "Tank 2", 26 | "r1a": 0, 27 | "r2a": 0, 28 | "rbc": 0, 29 | "rbt": 3275, 30 | "tp1": 127, 31 | "tp2": 127 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /harvi_response: -------------------------------------------------------------------------------- 1 | { 2 | "harvi": [ 3 | { 4 | "sno": nnnnnnnn, 5 | "dat": "23-10-2021", 6 | "tim": "11:46:36", 7 | "ectp1": 54, 8 | "ectp2": 470, 9 | "ectp3": -232, 10 | "ectt1": "Grid", 11 | "ectt2": "Generation", 12 | "ectt3": "AC Battery", 13 | "ect1p": 1, 14 | "ect2p": 1, 15 | "ect3p": 1, 16 | "fwv": "" 17 | } 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /status_response: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "eddi": [ 4 | { 5 | "sno": nnnnnnnn, 6 | "dat": "23-10-2021", 7 | "tim": "11:46:35", 8 | "ectt1": "Internal Load", 9 | "ectt2": "None", 10 | "ectt3": "None", 11 | "bsm": 0, 12 | "bst": 0, 13 | "cmt": 254, 14 | "dst": 1, 15 | "div": 0, 16 | "frq": 50.02, 17 | "fwv": "3200S3.048", 18 | "gen": 473, 19 | "grd": -14, 20 | "pri": 2, 21 | "sta": 1, 22 | "tz": 0, 23 | "hpri": 1, 24 | "hno": 1, 25 | "ht1": "Tank 1", 26 | "ht2": "Tank 2", 27 | "r1a": 0, 28 | "r2a": 0, 29 | "rbc": 0, 30 | "rbt": 3275, 31 | "tp1": 127, 32 | "tp2": 127 33 | } 34 | ] 35 | }, 36 | { 37 | "zappi": [ 38 | { 39 | "sno": nnnnnnnn, 40 | "dat": "23-10-2021", 41 | "tim": "11:46:35", 42 | "ectp2": -3, 43 | "ectp3": 1, 44 | "ectt1": "Internal Load", 45 | "ectt2": "None", 46 | "ectt3": "None", 47 | "bsm": 0, 48 | "bst": 0, 49 | "cmt": 254, 50 | "dst": 1, 51 | "div": 0, 52 | "frq": 49.99, 53 | "fwv": "3560S3.142", 54 | "gen": 473, 55 | "grd": -14, 56 | "pha": 1, 57 | "pri": 1, 58 | "sta": 1, 59 | "tz": 0, 60 | "vol": 2415, 61 | "che": 1.02, 62 | "bss": 0, 63 | "lck": 16, 64 | "pst": "A", 65 | "zmo": 3, 66 | "pwm": 5300, 67 | "zs": 258, 68 | "rac": 3, 69 | "zsh": 1, 70 | "zsl": 2, 71 | "ectp4": 10, 72 | "ectt4": "None", 73 | "ectt5": "None", 74 | "ectt6": "None", 75 | "mgl": 50, 76 | "sbh": 17, 77 | "sbk": 5 78 | } 79 | ] 80 | }, 81 | { 82 | "harvi": [ 83 | { 84 | "sno": nnnnnnnn, 85 | "dat": "23-10-2021", 86 | "tim": "11:46:36", 87 | "ectp1": 54, 88 | "ectp2": 470, 89 | "ectp3": -232, 90 | "ectt1": "Grid", 91 | "ectt2": "Generation", 92 | "ectt3": "AC Battery", 93 | "ect1p": 1, 94 | "ect2p": 1, 95 | "ect3p": 1, 96 | "fwv": "" 97 | } 98 | ] 99 | }, 100 | { 101 | "asn": "s18.myenergi.net", 102 | "fwv": "3401S3.077" 103 | } 104 | ] 105 | -------------------------------------------------------------------------------- /zappi_response: -------------------------------------------------------------------------------- 1 | { 2 | "zappi": [ 3 | { 4 | "sno": nnnnnnnn, 5 | "dat": "23-10-2021", 6 | "tim": "11:46:38", 7 | "ectp2": -2, 8 | "ectt1": "Internal Load", 9 | "ectt2": "None", 10 | "ectt3": "None", 11 | "bsm": 0, 12 | "bst": 0, 13 | "cmt": 254, 14 | "dst": 1, 15 | "div": 0, 16 | "frq": 49.97, 17 | "fwv": "3560S3.142", 18 | "gen": 466, 19 | "grd": 20, 20 | "pha": 1, 21 | "pri": 1, 22 | "sta": 1, 23 | "tz": 0, 24 | "vol": 2415, 25 | "che": 1.02, 26 | "bss": 0, 27 | "lck": 16, 28 | "pst": "A", 29 | "zmo": 3, 30 | "pwm": 5300, 31 | "zs": 258, 32 | "rac": 3, 33 | "zsh": 1, 34 | "zsl": 2, 35 | "ectp4": 6, 36 | "ectt4": "None", 37 | "ectt5": "None", 38 | "ectt6": "None", 39 | "mgl": 50, 40 | "sbh": 17, 41 | "sbk": 5 42 | } 43 | ] 44 | } 45 | --------------------------------------------------------------------------------