GithubHelp home page GithubHelp logo

matthew1471 / enphase-api Goto Github PK

View Code? Open in Web Editor NEW
76.0 16.0 10.0 2.03 MB

Enphase-API is an unofficial project providing an API wrapper (including local/LAN Gateway API) and the documentation for Enphase®'s products and services.

License: GNU General Public License v3.0

Python 100.00%
enphase solar solar-system enphase-envoy enphase-api enphase-iq-envoy generation production sun microinverters

enphase-api's Introduction

Enphase-API

Introduction

Enphase-API is an unofficial project providing an API wrapper and the documentation for Enphase®'s products and services.

This project is focusing primarily on the Enphase® "IQ Gateway" (formerly "IQ Envoy") system, the gateway for Enphase®'s IQ6, IQ7 and IQ8 Microinverters used on solar panels to convert Direct Current (DC) to Alternating Current (AC) to be directly consumed by the home.

⚠️
This project currently predominantly consumes the same local API that the local Gateway web administration portal consumes and Enphase® may choose to change it in subsequent updates without warning.

The official route for production applications is to use the Enphase® developer cloud-based API. The Enphase® IQ Gateway, however, only reports to the Enphase® Cloud either every 15 minutes (when connected via WiFi or Ethernet) or every 6 hours (when connected via a cellular modem) and its consumption is currently very expensive for hobbyist consumption if data is required more than once an hour throughout the month or more detailed statistics or configuration is required.

Documentation

The documentation for the wrapper and the API itself is at Documentation/README.adoc

Code

Copyright © 2023 Matthew1471

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.

Documentation

Copyright © 2023 Matthew1471.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the file Documentation/LICENSE.md.

Authors

Enphase-API is led by Matthew1471 and may have received contributions from other individuals in GitHub’s awesome community. The project was initiated in 2022 by Matthew1471 after having his own solar installation and wanting to know when is the cheapest time to put on the dishwasher.

Trademarks

Enphase®, Envoy® are trademarks of Enphase Energy®.

All trademarks are the property of their respective owners.

Any trademarks used in this project are used in a purely descriptive manner and to state compatability.

enphase-api's People

Contributors

matthew1471 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

enphase-api's Issues

Response /ivp/ensemble/sleep

Response from /ivp/ensemble/sleep Envoy vD8.2.62
Four 5P batteries

{
    "encharge_sleep": [
        {
            "serial_num": "XXX",
            "sleep_req_type": 0,
            "sleep_min_soc": 0,
            "sleep_max_soc": 100
        },
        {
            "serial_num": "XXX",
            "sleep_req_type": 0,
            "sleep_min_soc": 0,
            "sleep_max_soc": 100
        },
        {
            "serial_num": "XXX",
            "sleep_req_type": 0,
            "sleep_min_soc": 0,
            "sleep_max_soc": 100
        },
        {
            "serial_num": "XXX",
            "sleep_req_type": 0,
            "sleep_min_soc": 0,
            "sleep_max_soc": 100
        }
    ]
}

Response /ivp/ensemble/gen_wiring_test` & /ivp/ensemble/generator

Response from /ivp/ensemble/gen_wiring_test Envoy vD8.2.62
System Controller 3G (Generator Support). Generator not connected at this time

{
    "gen_wiring_test_result": {
        "status": "GEN_CONN_NOT_VERIFIED",
        "code": -1,
        "timestamp": "Wed Dec 31 18:00:00 1969\n"
    }
}

Response from /ivp/ensemble/generator

{
    "admin_state": "unknown",
    "oper_state": "open",
    "admin_mode": 0,
    "schedule": 0,
    "start_soc": 100,
    "stop_soc": -1,
    "exc_on": 0,
    "present": 0,
    "type": 1
}

POST request to force discharge of battery

I'd like to force my Enphase batteries to export to the grid when the export rate is high.

I notice a GET request to /ivp/sc/sched produces the following output, which contains a field Force Discharge

{'ACB_agg_energy': 0,
 'ACB_agg_soc': 0,
 'Agg Backup Energy': 0,
 'Agg VLS Energy': 500,
 'Charge From Grid Allowed': True,
 'ENC_agg_energy': 10000,
 'ENC_agg_soc': 100,
 'Force Discharge': False,
 'Num_of_acb': 0,
 'Num_of_enc': 2,
 'acb_current_mode': 1,
 'acb_debug_mode': -1,
 'agg_soc': 100,
 'max_energy': 10000,
 'sched_mode_key': ['ID - Idle',
                    'ZN - Zero Net',
                    'CG - Charge From Grid',
                    'DG - Discharge to Grid',
                    'ND - No Discharge',
                    'DL - Discharge to Load',
                    'CP - Charge From PV',
                    'HEMS Discharge',
                    'HEMS Charge']}

I have tried various forms of JSON POST request to the /ivp/sc/sched endpoint to try to set Force Discharge to True but all the requests have been rejected so far with { "err": "400 - Bad Request", "msg": "Unable to parse JSON request." }'

I'd really appreciate if someone could point me in the right direction with this. I reckon I could shave years off the payback time of my system if I could export excess energy from my battery.

Just FYI - Forced Inverter Report using NEWSCAN

Hi, How are you ? Thank you for the great effort.
Just Let me share a small top to force to refresh report from Inverters for 1 minute interval.

In the old Local API, if call, COMCHECK. it can refresh report time to 1min.

BUT, in new API (v7) COMCHECK method is not working, have to use PUT NEWSCAN to force to refresh Inverter Data Report. and, can get 1 minute resolution.

if using Enphase's document to get a token with 'user[email]', only can get an owner token. I am trying to find a way to get a installer token to get installer access

Add Phasemode to ivp/meters

ivp/meters field phaseMode is currently described as 'The number of phases the meter can monitor' which is for phaseCount.

I know of at least:

  • three
  • split

values showing in phaseMode.

Response /ivp/ensemble/ec1_wiring_test

Response from /ivp/ensemble/ec1_wiring_test Envoy vD8.2.62

{
    "ec1_wiring_test_result": {
        "status": "ENC_CONN_NOT_VERIFIED",
        "code": -1,
        "timestamp": "Wed Dec 31 18:00:00 1969\n"
    }
}

API documentation source

Hi,

I've just got an Enphase IQ Gateway and have started playing around with the APIs and I was planning on creating something similar to this in C#.

I was wondering where you found the complete API documentation for the gateway as the online pdf only contains a brief summary of the available endpoints?

I can happily base use this library as a reference for the endpoints but figured it might be better to go straight to the source if possible :)

Thanks

Response /ivp/ensemble/profile_status

Response from /ivp/ensemble/profile_status Envoy vD8.2.62
Configured for Self Consumption mode

[
    {
        "serial_num": "XXX",
        "device_type": "ENPOWER",
        "admin_state": 2,
        "device_record_type": "AGF",
        "ph_ind": "ph-a",
        "gcpa_ph_ind": "ph-a",
        "man_ph_ind": "ph-unk",
        "status": 2,
        "message": ""
    },
    {
        "serial_num": "XXX",
        "device_type": "ENPOWER",
        "admin_state": 2,
        "device_record_type": "AGF",
        "ph_ind": "ph-a",
        "gcpa_ph_ind": "ph-a",
        "man_ph_ind": "ph-unk",
        "status": 2,
        "message": ""
    },
    {
        "serial_num": "XXX",
        "device_type": "ENCHARGE",
        "admin_state": 2,
        "device_record_type": "AGF",
        "ph_ind": "ph-a",
        "gcpa_ph_ind": "ph-a",
        "man_ph_ind": "ph-unk",
        "status": 2,
        "message": ""
    },
    {
        "serial_num": "XXX",
        "device_type": "ENCHARGE",
        "admin_state": 2,
        "device_record_type": "AGF",
        "ph_ind": "ph-a",
        "gcpa_ph_ind": "ph-a",
        "man_ph_ind": "ph-unk",
        "status": 2,
        "message": ""
    },
    {
        "serial_num": "XXX",
        "device_type": "ENCHARGE",
        "admin_state": 2,
        "device_record_type": "AGF",
        "ph_ind": "ph-a",
        "gcpa_ph_ind": "ph-a",
        "man_ph_ind": "ph-unk",
        "status": 2,
        "message": ""
    },
    {
        "serial_num": "XXX",
        "device_type": "ENCHARGE",
        "admin_state": 2,
        "device_record_type": "AGF",
        "ph_ind": "ph-a",
        "gcpa_ph_ind": "ph-a",
        "man_ph_ind": "ph-unk",
        "status": 2,
        "message": ""
    }
]

Handle updated self-signed cert

I have a script that runs regularly to collect data from my enphase system, and put it into a local DB for my own custom charts.

A couple days ago, this script started failing with errors like this:

 ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: authority and subject key identifier mismatch (_ssl.c:1007)

I eventually realized that this was happening because the self-signed cert that the Envoy gateway was using had been updated. Based on the advice in Documentation/Wrappers/Python/README.adoc and the examples in Python/examples, I called Gateway.trust_gateway() to store the cert for future validation. I moved that captured cert file aside, and the next time I ran my script it succeeded, and created a new configuration/gateway.cer file.

Old cert:

> openssl x509 -noout -text -in configuration/gateway.cer.bak
Certificate:
    Data:
...snip...
        Validity
            Not Before: Aug 28 15:18:27 2023 GMT
            Not After : Aug 27 15:18:27 2024 GMT

New cert:

> openssl x509 -noout -text -in configuration/gateway.cer
Certificate:
    Data:
...snip...
        Validity
            Not Before: Jun 21 11:41:01 2024 GMT
            Not After : Jun 21 11:41:01 2025 GMT

I realize that it is more secure to use this trusted cert, but I'm not sure what a secure way to handle this update would look like. Obviously, accepting any new cert upon validation failure would be no better than not saving the cert in the first place. I had thought that I could reduce the window by only accepting a new cert close to the "Not After" validity date, but in my case, the cert was changed on Aug 21 - over 2 months before it would have expired. I could accept any new cert with the same Issuer/Subject fields, since these seem to be specific to my Envoy gateway (it has my serial number in it). But an attacker could just as easily read the current cert, and spoof a cert with those field values, too.

Please update the documentation to mention this case, and update the examples to gracefully handle it.

Documentation for fresh solar install on how to begin leveraging this repo

I just got my solar activated yesterday, and am looking to start monitoring locally with my servers. I cannot seem to find a good howto for how exactly to get the auth credentials so I can talk to the system..

I am guessing this part from the quick start guide:

3. Auth URL
To start making API requests, the application must be authorized by the system owner. The Auth URL must be sent to the system owner via email or must be embedded in the HO App created by the developer. For the above app, Auth URL is https://api.enphaseenergy.com/oauth/authorize?response_type=code&client_id=f2a479f3c6067f0d9517cadae7f00b47

But who do I reach out to at Enphase for this? Do we have to imply we are creating an app for them to give us credentials?

I am trying to be honest with Enphase, and am really hoping that there is somewhere I can simply request auth keys so I can query my local install and drop data into Grafana and Graphite/InfluxDb on my own.

Accessing IQ Gateway's internal DB from the local API?

Hi there,

Congratulations and many thanks for the great job you're doing with this project!
I recently started playing with the IQ Gateway's local API, and I learned the device has an internal database where it stores at least production data that can be communicated to Enlighten. Sounds like there would be at least several days of data stored in there, which could be very handy if we could read, obvioulsy.
Would you know if there is any way to access and read the IQ Gateway's internal database from the API?

Best,
Fabien

Get Current Profile does not work with Bearer Auth

I got the entire Bearer auth running with my standalone C++ Mac application which I like to port down to an ESP32 later on for energy switching based on metered data. Thanks for this great documentation.

When requesting the Profile "installer/agf/details.json”, the Bearer token based auth gives error 401. Using an HTTP session cookie e.g.:
”envoy_122143077773=xxx; sessionId=3TUYsfNoGCYPQmCyDPuvoMRAWV6OiNaA"
it works with a different session ID compared to the Bearer login session ID.
It works only if I login via Firefox to envoy.local via login with Enphase, then copying this session ID from the browser into my app.

PS: Have you logged into the Envoy via a TTY serial adapter to see the running code and the JavaScript code (maybe Node.js), or any other trick.

Looking for an battery energy endpoint

Hey Matthew1471,
I really appreciate your effort maintaining a documentation for the API.

Are you by any chance aware of an endpoint that provides data for the total energy charged/discharged by Encharge batteries? I'm only aware of the endpoints providing the instantaneous power of the batteries.
Would be really nice to add that data to the home-assistant Enphase integrations.

Best regards

Endpoint for setting IQ Battery profile?

It looks like /admin/lib/tariff will tell you what the current battery profile is. Do you know if there is a POST endpoint that allows changing it and/or what the valid battery_mode types are that show up on /admin/lib/tariff?

Also curious if the Envoy has any concept of the Storm Guard feature, or if that's all cloud based and just changes the battery mode ot a normal full-backup profile.

Thanks!

storage ct can be reported in /ivp/meters measurementtype

Envoy can report a 3th CT for storage when used with a combiner box. Seen it with fw 8.2.127, but may exist before then one, not sure.

[
    {
        "eid": 704643328,
        "state": "enabled",
        "measurementType": "production",
        "phaseMode": "split",
        "phaseCount": 2,
        "meteringStatus": "normal",
        "statusFlags": []
    },
    {
        "eid": 704643584,
        "state": "enabled",
        "measurementType": "net-consumption",
        "phaseMode": "split",
        "phaseCount": 2,
        "meteringStatus": "normal",
        "statusFlags": []
    },
    {
        "eid": 704643840,
        "state": "enabled",
        "measurementType": "storage",
        "phaseMode": "split",
        "phaseCount": 2,
        "meteringStatus": "normal",
        "statusFlags": []
    }
]

And /ivp/meters/readings will have a 3th section for the storage CT

stream/meter sever

Hello,

I have been using my Enphase solar system for a few years without any major problems. To monitor the system, I am using Node Red. Since my Envoy is running version D7.6.175 (f79c8d), I have to go through the entire process of authentication and obtaining tokens, and every minute I am using the "/ivp" API /meters/readings" to get values.

I'm trying to use the events sent by the stream/meter server, but I always get a 401 unauthorized error message, even though I can see it perfectly in the browser.

For testing purposes I am using cURL.

Can someone help me please ?

Thanks
EG

Response - /ivp/ensemble/device_list

Here is a response from /ivp/ensemble/device_list Envoy vD8.2.62

{
  "usb": {
    "ck2_bridge": "connected",
    "auto_scan": false
  },
  "devices": [
    {
      "serial_number": "XXX",
      "device_type": 22,
      "com_interface": 1,
      "com_interface_str": "USB",
      "status": "Connected"
    },
    {
      "serial_number": "XXX",
      "device_type": 17,
      "com_interface": 2,
      "com_interface_str": "CAN",
      "status": "Connected"
    },
    {
      "serial_number": "XXX",
      "device_type": 13,
      "com_interface": 2,
      "com_interface_str": "CAN",
      "status": "Connected",
      "dev_info": {
        "capacity": 5000,
        "DER_Index": 2
      }
    },
    {
      "serial_number": "XXX",
      "device_type": 13,
      "com_interface": 2,
      "com_interface_str": "CAN",
      "status": "Connected",
      "dev_info": {
        "capacity": 5000,
        "DER_Index": 2
      }
    },
    {
      "serial_number": "XXX",
      "device_type": 13,
      "com_interface": 2,
      "com_interface_str": "CAN",
      "status": "Connected",
      "dev_info": {
        "capacity": 5000,
        "DER_Index": 2
      }
    },
    {
      "serial_number": "XXX",
      "device_type": 13,
      "com_interface": 2,
      "com_interface_str": "CAN",
      "status": "Connected",
      "dev_info": {
        "capacity": 5000,
        "DER_Index": 2
      }
    }
  ]
}

Document which software version the structures apply to

Good work documenting all the structures. It looks like you are working with V7

Just be aware that older versions do not have all the fields and/or API's. Might want to look at making that clear what versions they apply to.

Response /ivp/meters/storage_setting

Response from /ivp/meters/storage_setting Envoy vD8.2.62

{
    "isCalibrated": true,
    "storage_cfg": {
        "prod_ct_present": false,
        "cons_ct_present": true,
        "prod_ch_mask": 4,
        "cons_ch_mask": 4
    }
}

inv.adoc suggestion

It sppears ip is the current running firmware. Same as inventory.json img_pnum_running and matches what can be seen from Enlighten under menu>system>devices>microinverters. For what ir is worth, my Envoy is running FW D8.2.62

/inv

{
	"ce": "1627395857",
	"dtype": "1",
	"chtype": "1",
	"as": "2",
	"s": "XXX",
	"pn": "800-01384-r02",
	"ptpn": "549-00040-r01-v02.48.02",
	"edcon": "0",
	"devobs": "0",
	"ctcon": "0",
	"ctobs": "0",
	"ctctf": "0",
	"chcon": "0",
	"chobs": "0",
	"chctf": "0",
	"cd": "1699630380",
	"ld": "1703967194",
	"ip": "521-00005-r05-v02.48.01",
	"id": "0",
	"ap": "883-01384-r03",
	"fp": "000-00000-r00",
	"cap": "6308347"
}

inventory.json

{
"part_num": "800-01384-r02",
"installed": "1699630380",
"serial_num": "XXX",
"device_status": [
	"envoy.global.ok"
],
"last_rpt_date": "1703967519",
"admin_state": 2,
"dev_type": 1,
"created_date": "1699630380",
"img_load_date": "0",
"img_pnum_running": "521-00005-r05-v02.48.01
/",
"ptpn": "549-00040-r01-v02.48.02",
"chaneid": 1627395857,
"device_control": [
	{
		"gficlearset": false
	}
],
"producing": true,
"communicating": true,
"provisioned": true,
"operating": true,
"phase": "ph-a"
}

Response /ivp/ensemble/device_list

Below are a few responses from /ivp/ensemble/device_list Envoy vD8.2.62

device_type 22 is unknown.

{
    "XXX": {
        "device_type": 22
    }
}

device_type 17 is the IQ SystemController 3

{
    "XXX": {
        "device_type": 17,
        "admin_state": 24,
        "admin_state_str": "ENPWR_STATE_OPER_CLOSED",
        "grid_status": "Off-grid"
    }
}

device_type 13 are 5P batteries

{
    "492319003325": {
        "device_type": 13,
        "admin_state": 6,
        "admin_state_str": "ENCHG_STATE_READY",
        "soc": 62
    }
}

New CT Reversal endpoint?

I get a 404 - Not found when hitting the /ivp/meters/ctreversal/{EID} endpoint. Has this changed / is there an alternate?

Non-metered Envoys return empty responses from /ivp/meters

Hello,

this API seems to be just what I need for my local metering system. However, when setting this up, I did the configuration and was able to connect to the Enphase system. Trying out gateway_console.py I found out that gateway.api_call('/ivp/meters') returns an empy response. This is probably due to my gateway being a non-metered one.
The gateway_console.py script was easy to fix by adding next(..., {state: 'enabled'}) structure around the list comprehension on lines180 and 198 but I am wondering if the idea of the API would be return something where this non-meteredeness would be obvious?

Keep up the good work!
Best regards,
Marko

Response /ivp/ensemble/submod

Response from /ivp/ensemble/submod Envoy vD8.2.62

{
  "serial_nums": {
    "XXX": {
      "device_type": 22,
      "com_interface_str": "USB",
      "device_id": "XXX",
      "admin_state": 43,
      "admin_state_str": "ENS_DEVICE_STATE_READY",
      "msg_retry_count": 0,
      "part_number": "800-01821-r05",
      "assembly_number": "880-01821-r05",
      "app_fw_version": "3.0.239_rel/31.11",
      "ibl_fw_version": "1.3.413",
      "swift_asic_fw_version": "",
      "bmu_fw_version": "",
      "submodule_count": 1,
      "submodules": {
        "XXX": {
          "device_type": 24,
          "admin_state": 1,
          "part_number": "800-01821-r05",
          "assembly_number": "546-00003-01",
          "dmir": {
            "part_number": "546-00003-01",
            "assembly_number": "01"
          },
          "procload": {
            "part_number": "3.0.239_rel/31.11",
            "assembly_number": "3.0.239_rel/31.11"
          }
        }
      }
    },
    "XXX": {
      "device_type": 17,
      "com_interface_str": "CAN",
      "device_id": "XXX",
      "admin_state": 24,
      "admin_state_str": "ENPWR_STATE_OPER_CLOSED",
      "msg_retry_count": 10,
      "part_number": "865-00378-r24",
      "assembly_number": "885-00378-r27",
      "app_fw_version": "3.0.5509_rel/31.11",
      "ibl_fw_version": "1.3.413",
      "swift_asic_fw_version": "",
      "bmu_fw_version": "",
      "submodule_count": 2,
      "submodules": {
        "XXX": {
          "device_type": 18,
          "admin_state": 1,
          "part_number": "800-01820-r05",
          "assembly_number": "546-00003-01",
          "dmir": {
            "part_number": "546-00003-01",
            "assembly_number": "01"
          },
          "procload": {
            "part_number": "3.0.5509_rel/31.11",
            "assembly_number": "3.0.5509_rel/31.11"
          }
        },
        "XXX": {
          "device_type": 20,
          "admin_state": 1,
          "part_number": "800-01861-r01",
          "assembly_number": "546-00003-01",
          "dmir": {
            "part_number": "546-00003-01",
            "assembly_number": "01"
          },
          "procload": {
            "part_number": "",
            "assembly_number": ""
          }
        }
      }
    },
    "XXX": {
      "device_type": 13,
      "com_interface_str": "CAN",
      "device_id": "XXX",
      "admin_state": 6,
      "admin_state_str": "ENCHG_STATE_READY",
      "reported_grid_mode": "multimode-ongrid",
      "phase": "ph-a",
      "der_index": 2,
      "encharge_revision": 3,
      "encharge_capacity": 5000,
      "encharge_rated_power": 3840,
      "reported_enc_grid_state": "multimode-ongrid",
      "msg_retry_count": 5,
      "part_number": "836-01826-r76",
      "assembly_number": "892-00024-r78",
      "app_fw_version": "3.0.6306_rel/31.11",
      "ibl_fw_version": "3.1.813-8c003b",
      "swift_asic_fw_version": "001.002.1.7.2",
      "bmu_fw_version": "3.8.63",
      "submodule_count": 7,
      "submodules": {
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 15,
          "admin_state": 1,
          "part_number": "800-00329-r06",
          "assembly_number": "546-00002-01",
          "dmir": {
            "part_number": "546-00002-01",
            "assembly_number": "01"
          },
          "procload": {
            "part_number": "3.0.6306_rel/31.11",
            "assembly_number": "3.0.6306_rel/31.11"
          }
        }
      }
    },
    "XXX": {
      "device_type": 13,
      "com_interface_str": "CAN",
      "device_id": "XXX",
      "admin_state": 6,
      "admin_state_str": "ENCHG_STATE_READY",
      "reported_grid_mode": "multimode-ongrid",
      "phase": "ph-a",
      "der_index": 2,
      "encharge_revision": 3,
      "encharge_capacity": 5000,
      "encharge_rated_power": 3840,
      "reported_enc_grid_state": "multimode-ongrid",
      "msg_retry_count": 1,
      "part_number": "836-01826-r81",
      "assembly_number": "892-00024-r83",
      "app_fw_version": "3.0.6306_rel/31.11",
      "ibl_fw_version": "3.1.813-8c003b",
      "swift_asic_fw_version": "001.002.1.7.2",
      "bmu_fw_version": "3.8.63",
      "submodule_count": 7,
      "submodules": {
        "122331107536": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 15,
          "admin_state": 1,
          "part_number": "800-00329-r06",
          "assembly_number": "546-00002-01",
          "dmir": {
            "part_number": "546-00002-01",
            "assembly_number": "01"
          },
          "procload": {
            "part_number": "3.0.6306_rel/31.11",
            "assembly_number": "3.0.6306_rel/31.11"
          }
        }
      }
    },
    "XXX": {
      "device_type": 13,
      "com_interface_str": "CAN",
      "device_id": "XXX",
      "admin_state": 6,
      "admin_state_str": "ENCHG_STATE_READY",
      "reported_grid_mode": "multimode-ongrid",
      "phase": "ph-a",
      "der_index": 2,
      "encharge_revision": 3,
      "encharge_capacity": 5000,
      "encharge_rated_power": 3840,
      "reported_enc_grid_state": "multimode-ongrid",
      "msg_retry_count": 32,
      "part_number": "836-01826-r81",
      "assembly_number": "892-00024-r83",
      "app_fw_version": "3.0.6306_rel/31.11",
      "ibl_fw_version": "3.1.813-8c003b",
      "swift_asic_fw_version": "001.002.1.7.2",
      "bmu_fw_version": "3.8.63",
      "submodule_count": 7,
      "submodules": {
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 15,
          "admin_state": 1,
          "part_number": "800-00329-r06",
          "assembly_number": "546-00002-01",
          "dmir": {
            "part_number": "546-00002-01",
            "assembly_number": "01"
          },
          "procload": {
            "part_number": "3.0.6306_rel/31.11",
            "assembly_number": "3.0.6306_rel/31.11"
          }
        }
      }
    },
    "XXX": {
      "device_type": 13,
      "com_interface_str": "CAN",
      "device_id": "XXX",
      "admin_state": 6,
      "admin_state_str": "ENCHG_STATE_READY",
      "reported_grid_mode": "multimode-ongrid",
      "phase": "ph-a",
      "der_index": 2,
      "encharge_revision": 3,
      "encharge_capacity": 5000,
      "encharge_rated_power": 3840,
      "reported_enc_grid_state": "multimode-ongrid",
      "msg_retry_count": 6,
      "part_number": "836-01826-r81",
      "assembly_number": "892-00024-r83",
      "app_fw_version": "3.0.6306_rel/31.11",
      "ibl_fw_version": "3.1.813-8c003b",
      "swift_asic_fw_version": "001.002.1.7.2",
      "bmu_fw_version": "3.8.63",
      "submodule_count": 7,
      "submodules": {
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 14,
          "admin_state": 1,
          "part_number": "800-01729-r02",
          "assembly_number": "549-00056-r00",
          "dmir": {
            "part_number": "549-00056-r00",
            "assembly_number": "4.35.3-D35"
          },
          "procload": {
            "part_number": "4.35.1-D35",
            "assembly_number": "4.35.1-D35"
          }
        },
        "XXX": {
          "device_type": 15,
          "admin_state": 1,
          "part_number": "800-00329-r06",
          "assembly_number": "546-00002-01",
          "dmir": {
            "part_number": "546-00002-01",
            "assembly_number": "01"
          },
          "procload": {
            "part_number": "3.0.6306_rel/31.11",
            "assembly_number": "3.0.6306_rel/31.11"
          }
        }
      }
    }
  }
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.