Powerwall 3 Support

Problem
Powerwall 3 not compatible with Powerwall-Dashboard
Enhancement
I would like to help make it work if I can
Additional context
I have 3x Powerwall 3s just installed with a tesla backup switch and would like to be able to use this tool.

Hi @jesaf00 -  Congrats on getting the new Powerwall!
Do you know if it is on your local network? If so, can you log in to your Powerwall web portal?  Tesla has instructions (link) but I wonder if it works for your setup. The pypowerwall library uses the APIs on that web portal for Powerwall/2/+.
Can you also provide the model number / picture of the Powerwall?

I can send the specific model info from the side tomorrow. But here are some pics. Sent from my iPhoneOn Nov 18, 2023, at 7:57 PM, Jason Cox @.***> wrote:
Hi @jesaf00 -  Congrats on getting the new Powerwall!
Do you know if it is on your local network? If so, can you log in to your Powerwall web portal?  Tesla has instructions (link) but I wonder if it works for your setup. The pypowerwall library uses the APIs on that web portal for Powerwall/2/+.
Can you also provide the model number / picture of the Powerwall?
—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you were mentioned.Message ID: @.***>

Sorry, forgot to mention that yes it is on my local network. 2 of 3 are showing on my WiFi but only one switched to the correct network after I changed using the app. I am unable to log into the PW using the instructions for previous PWs. I get a 404 right away or after ignoring the self signed cert. Sent from my iPhoneOn Nov 18, 2023, at 8:59 PM, Jerry Schulze @.> wrote:I can send the specific model info from the side tomorrow. But here are some pics. <image0.jpeg><image1.jpeg><image2.jpeg>Sent from my iPhoneOn Nov 18, 2023, at 7:57 PM, Jason Cox @.> wrote:
Hi @jesaf00 -  Congrats on getting the new Powerwall!
Do you know if it is on your local network? If so, can you log in to your Powerwall web portal?  Tesla has instructions (link) but I wonder if it works for your setup. The pypowerwall library uses the APIs on that web portal for Powerwall/2/+.
Can you also provide the model number / picture of the Powerwall?
—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you were mentioned.Message ID: @.***>

The key will be figuring out how to log in to the web portal as that is essentially what pypowerwall is doing.
You can try some of the URLs (replace the IP with the address of your Powerwall):
https://<IP_ADDRESS>/summary?mode=kiosk
https://<IP_ADDRESS>/api/site_info

HI, those urls with my IP produce a 404 after bypassing the certificate. Attached are the photos and the part number is 1707000-25-G.

https://github.com/jasonacox/Powerwall-Dashboard/assets/136191207/918e5dea-0314-408d-9728-41b861c3b60e

Thanks @jesaf00 !  The new Powerwalls look nice.  Thanks for the video.  Just to confirm, you also tried the landing page https://<IP_ADDRESS>/ by itself?
I'm worried. If you are able to connect to their local WiFi but still unable to get to any web portal, that could indicate that Tesla is removing the local access (and APIs) and switching to Cloud only control and monitoring similar to the solar-only configurations. The good news is that @mcbirse 's tesla-history code will likely be able to get that data, but the bad news is that it won't be at the same fidelity as local API provides and will be limited (local API for PW/2/+ can provide string, voltage, frequency, temp data).
Since you are likely one of the first to get these, the local access may still be under development. Also, since you are getting a 404, we know it does still have a webserver running. They may not have a customer page, but there could still be APIs. You might try this:
https://<IP_ADDRESS>/api/login/Basic
There definitely isn't much on the internet about PW3 other than "they are coming in 2024."  I'll reach out to see if anyone else has discovered the APIs.
If you still have the contact with the installer, can you ask if there is a local web portal (or APIs) that customers can access/use?  Feel free to direct them to this dashboard project if they wonder why. :)

Hi Jason, yes I tried just the IP and https://<IP_ADDRESS>/api/login/Basic also gives 404, arg! I am having a couple of issues with these also so hopefully I can just get the working correctly. I am running a port scanner to see what other ports might be open besides 443 and will let you know.
https://teslamotorsclub.com/tmc/posts/7917791/

Thanks for that link!
Good idea on the port scanner. Again, the 404 does provide hope that there is an underlying API (a new one) that we just don't know yet. However, without a UI, it will be hard to determine what they are unless Tesla is willing to provide it to us. Perhaps the installer application makes calls to this and we could pick it up by traffic sniffing.

@jesaf00 - Great suggestion from @vls29 at https://github.com/vloschiavo/powerwall2/discussions/99#discussioncomment-7613279: If you can, try to run a verbose curl against the Powerwall 3. Even if it is a 404, there might be  payload or header data that could be helpful.
curl -v -k  https://<IP_ADDRESS>

Here is the output
`Last login: Sun Nov 19 10:28:14 on ttys001
jerry@MBP14M3aceblack ~ % curl -v -k  https://<IP_ADDRESS>

Trying <IP_ADDRESS>:443...
Connected to <IP_ADDRESS> (<IP_ADDRESS>) port 443 (#0)
ALPN: offers h2,http/1.1
(304) (OUT), TLS handshake, Client hello (1):
(304) (IN), TLS handshake, Server hello (2):
(304) (IN), TLS handshake, Unknown (8):
(304) (IN), TLS handshake, Certificate (11):
(304) (IN), TLS handshake, CERT verify (15):
(304) (IN), TLS handshake, Finished (20):
(304) (OUT), TLS handshake, Finished (20):
SSL connection using TLSv1.3 / AEAD-AES128-GCM-SHA256
ALPN: server accepted h2
Server certificate:
subject: C=US; ST=California; L=Palo Alto; O=Tesla; OU=Tesla Energy Products; CN=d9528c5155a2621cf41a465e671195cc
start date: Jul 14 12:33:48 2023 GMT
expire date: Jul  7 12:33:45 2048 GMT
issuer: C=US; ST=California; L=Palo Alto; O=Tesla; OU=Tesla Energy Products; CN=d9528c5155a2621cf41a465e671195cc CA
SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
using HTTP/2
h2 [:method: GET]
h2 [:scheme: https]
h2 [:authority: <IP_ADDRESS>]
h2 [:path: /]
h2 [user-agent: curl/8.1.2]
h2 [accept: /]
Using Stream ID: 1 (easy handle 0x12900e200)

GET / HTTP/2
Host: <IP_ADDRESS>
User-Agent: curl/8.1.2
Accept: /

< HTTP/2 404
< content-type: text/plain; charset=utf-8
< x-content-type-options: nosniff
< content-length: 19
< date: Sun, 19 Nov 2023 21:09:20 GMT
<
404 page not found

Connection #0 to host <IP_ADDRESS> left intact
jerry@MBP14M3aceblack ~ %
`

Thanks Jerry. Not much here, sadly.  For completeness, it would be good to try some POSTs as well:
# Powerwall 2 Login Endpoint
curl -v -k -s -i -X POST -H "Content-Type: application/json" -d '{"username":"example@example.com","password":"example","force_sm_off":false}' https://<IP_ADDRESS>/api/login/Basic

# Root Endpoint
curl -v -k -s -i -X POST -H "Content-Type: application/json" -d '{"username":"example@example.com","password":"example","force_sm_off":false}' https://<IP_ADDRESS>/

Not sure this gave anything different. Is the password my Tesla.com password?
` https://<IP_ADDRESS>/api/login/Basic

Trying <IP_ADDRESS>:443...
Connected to <IP_ADDRESS> (<IP_ADDRESS>) port 443 (#0)
ALPN: offers h2,http/1.1
(304) (OUT), TLS handshake, Client hello (1):
(304) (IN), TLS handshake, Server hello (2):
(304) (IN), TLS handshake, Unknown (8):
(304) (IN), TLS handshake, Certificate (11):
(304) (IN), TLS handshake, CERT verify (15):
(304) (IN), TLS handshake, Finished (20):
(304) (OUT), TLS handshake, Finished (20):
SSL connection using TLSv1.3 / AEAD-AES128-GCM-SHA256
ALPN: server accepted h2
Server certificate:
subject: C=US; ST=California; L=Palo Alto; O=Tesla; OU=Tesla Energy Products; CN=d9528c5155a2621cf41a465e671195cc
start date: Jul 14 12:33:48 2023 GMT
expire date: Jul  7 12:33:45 2048 GMT
issuer: C=US; ST=California; L=Palo Alto; O=Tesla; OU=Tesla Energy Products; CN=d9528c5155a2621cf41a465e671195cc CA
SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
using HTTP/2
h2 [:method: POST]
h2 [:scheme: https]
h2 [:authority: <IP_ADDRESS>]
h2 [:path: /api/login/Basic]
h2 [user-agent: curl/8.1.2]
h2 [accept: /]
h2 [content-type: application/json]
h2 [content-length: 101]
Using Stream ID: 1 (easy handle 0x13a00da00)

POST /api/login/Basic HTTP/2
Host: <IP_ADDRESS>
User-Agent: curl/8.1.2
Accept: /
Content-Type: application/json
Content-Length: 101

We are completely uploaded and fine
< HTTP/2 404
HTTP/2 404
< content-type: text/plain; charset=utf-8
content-type: text/plain; charset=utf-8
< x-content-type-options: nosniff
x-content-type-options: nosniff
< content-length: 19
content-length: 19
< date: Mon, 20 Nov 2023 01:58:28 GMT
date: Mon, 20 Nov 2023 01:58:28 GMT

<
404 page not found

Connection #0 to host <IP_ADDRESS> left intact
`

`https://<IP_ADDRESS>

Trying <IP_ADDRESS>:443...
Connected to <IP_ADDRESS> (<IP_ADDRESS>) port 443 (#0)
ALPN: offers h2,http/1.1
(304) (OUT), TLS handshake, Client hello (1):
(304) (IN), TLS handshake, Server hello (2):
(304) (IN), TLS handshake, Unknown (8):
(304) (IN), TLS handshake, Certificate (11):
(304) (IN), TLS handshake, CERT verify (15):
(304) (IN), TLS handshake, Finished (20):
(304) (OUT), TLS handshake, Finished (20):
SSL connection using TLSv1.3 / AEAD-AES128-GCM-SHA256
ALPN: server accepted h2
Server certificate:
subject: C=US; ST=California; L=Palo Alto; O=Tesla; OU=Tesla Energy Products; CN=d9528c5155a2621cf41a465e671195cc
start date: Jul 14 12:33:48 2023 GMT
expire date: Jul  7 12:33:45 2048 GMT
issuer: C=US; ST=California; L=Palo Alto; O=Tesla; OU=Tesla Energy Products; CN=d9528c5155a2621cf41a465e671195cc CA
SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
using HTTP/2
h2 [:method: POST]
h2 [:scheme: https]
h2 [:authority: <IP_ADDRESS>]
h2 [:path: /]
h2 [user-agent: curl/8.1.2]
h2 [accept: /]
h2 [content-type: application/json]
h2 [content-length: 101]
Using Stream ID: 1 (easy handle 0x15a80d000)

POST / HTTP/2
Host: <IP_ADDRESS>
User-Agent: curl/8.1.2
Accept: /
Content-Type: application/json
Content-Length: 101

We are completely uploaded and fine
< HTTP/2 404
HTTP/2 404
< content-type: text/plain; charset=utf-8
content-type: text/plain; charset=utf-8
< x-content-type-options: nosniff
x-content-type-options: nosniff
< content-length: 19
content-length: 19
< date: Mon, 20 Nov 2023 02:00:01 GMT
date: Mon, 20 Nov 2023 02:00:01 GMT

<
404 page not found

Connection #0 to host <IP_ADDRESS> left intact`

Thanks again! Unfortunately, it didn't give us much more.  Also, the user/password doesn't matter. If it was working it would have given us something like an access denied message instead of a 404.
How did the installer configure the Powerwalls?  Was it the Tesla Pro app?
Are you able to connect to each Powerwall separately? In my Powerwall+ setup, the backup gateway is a separate box and has its own WiFi access point which is where the web portal works. I wonder if there are other access points. If so, it would be good to run the curl commands against those.

It looks like Powerwall 3 can be designed without a Backup Gateway 2, I'm guessing that's what OP has.

Because the dashboard/portal exists on the gateway at the moment, I'm guessing there's no dashboard/portal when connecting directly to a Powerwall 3?

This was the case for PW2 as well, with a backup switch (i.e. no gateway) one of the Powerwalls is designated a "site controller" and acts as the gateway, with the same web and API interface.
However, the access seems to have changed with PW3.  Based on reports here and from TMC forums:

No access to web or /api using the local network.
No access to web using the internal wifi network (now named TeslaPW_xxx).
Access is possible using the Tesla Pros app, which uses the internal wifi network.  Tesla Pros seems to be using a new binary /tedapi endpoint which I posted about here.

This is great @zigam !  It is possible the Powerwall 3 has this same binary to be compatible with the Tesla Pros app.
@jesaf00 could you try these curl commands to see if you get anything on the PW3?
# Log in to the TeslaPW_xxx wifi

# First just check to see if the API is responsive
curl -v -k https://<IP_ADDRESS>/tedapi/din
curl -v -k https://<IP_ADDRESS>/tedapi/v1

# Store the gateway password
export GW_PWD="<FULL_GATEWAY_PWD>"

# Get the device din, e.g. 1232100-10-E--CN321329G1E123.
curl -k -u Tesla_Energy_Device:$GW_PWD https://<IP_ADDRESS>/tedapi/din

Next, if that works, download this and rename to request.bin - edit it to have your DIN.
request.bin.txt
# Request the configuration (binary file - protobuf payload?)
curl -k -H 'Content-type: application/octet-string' -u Tesla_Energy_Device:$GW_PWD --data-binary @request.bin https://<IP_ADDRESS>/tedapi/v1

@jasonacox  here's the output from my recently installed PW3's
curl -v -k https://<IP_ADDRESS>/tedapi/din
*   Trying <IP_ADDRESS>:443...
* Connected to <IP_ADDRESS> (<IP_ADDRESS>) port 443
* schannel: disabled automatic use of client certificate
* schannel: using IP address, SNI is not supported by OS.
* ALPN: curl offers http/1.1
* ALPN: server accepted http/1.1
* using HTTP/1.1
> GET /tedapi/din HTTP/1.1
> Host: <IP_ADDRESS>
> User-Agent: curl/8.4.0
> Accept: */*
>
* schannel: remote party requests renegotiation
* schannel: renegotiating SSL/TLS connection
* schannel: SSL/TLS connection renegotiated
< HTTP/1.1 403 Forbidden
< Content-Type: application/json
< X-Content-Type-Options: nosniff
< Date: Mon, 20 Nov 2023 18:27:08 GMT
< Content-Length: 102
<
{"code":403,"error":"Unable to GET to resource","message":"User does not have adequate access rights"}* Connection #0 to host <IP_ADDRESS> left intact

curl -v -k https://<IP_ADDRESS>/tedapi/v1

Trying <IP_ADDRESS>:443...
Connected to <IP_ADDRESS> (<IP_ADDRESS>) port 443
schannel: disabled automatic use of client certificate
schannel: using IP address, SNI is not supported by OS.
ALPN: curl offers http/1.1
ALPN: server accepted http/1.1
using HTTP/1.1

GET /tedapi/v1 HTTP/1.1
Host: <IP_ADDRESS>
User-Agent: curl/8.4.0
Accept: /

schannel: remote party requests renegotiation
schannel: renegotiating SSL/TLS connection
schannel: SSL/TLS connection renegotiated
< HTTP/1.1 405 Method Not Allowed
< Content-Type: text/plain; charset=utf-8
< X-Content-Type-Options: nosniff
< Date: Mon, 20 Nov 2023 18:29:00 GMT
< Content-Length: 19
<
Method Not Allowed
Connection #0 to host <IP_ADDRESS> left intact

@pbburkhalter you'll have to run these commands while on the TeslaPW_xxx wifi network.  The ip address on that network will likely be https://<IP_ADDRESS>

Oops. I did just connect to that and got the same results.

Those responses are actually expected because auth was not provided.  This is the one that will hopefully work:
# Full gateway password should be on the sticker inside the PW3.
export GW_PWD="<FULL_GATEWAY_PWD>"

# Get the device din, e.g. 1232100-10-E--CN321329G1E123.
curl -k -u Tesla_Energy_Device:$GW_PWD https://<IP_ADDRESS>/tedapi/din

Yes, that does work.

Great!  The next step would be an actual RPC call.  Goes without saying that this is uncharted territory, so proceed at your own risk :)
Download request.bin.txt, rename it to request.bin, and edit the file by replacing the din with your own din from the command above.  You have to do this carefully, the din in the file ends with 123 so the z character remains in the file.  Assuming your din is the same length as the one currently in the file (1232100-10-E--CN321329G1E123), the file should remain at 63 bytes.  Then:
# Request the configuration.
curl -k -H 'Content-type: application/octet-string' -u Tesla_Energy_Device:$GW_PWD --data-binary @request.bin https://<IP_ADDRESS>/tedapi/v1

If this works, you should get a response with the entire configuration of your system. 🤞

Doesn't work from a command line or PowerShell but I'm open to ideas.

@pbburkhalter what's the error?  I think the other way to investigate the protocol would be to install a debugging proxy on the phone and capture Tesla Pros traffic.  This is a bit more involved, but if you want to spend the time (and a bit of money, the proxy app costs $9) I'd be happy to help.  ziga.mahkovec AT gmail.com.

Sorry I should have clarified I'm not using the Tesla pros app... I am just running it on my computer connected to the PowerWall wi-fi network

@pbburkhalter right but these curl requests are replaying what the Tesla Pros app does.  So if they don't work for you, you'd have to inspect the requests that the app generates so we can learn how to reproduce them.
The error you got from curl would also be helpful.

curl: (6) Could not resolve host: application

curl: (6) Could not resolve host: application

Ah, that looks like a shell issue with the single quotes.  Try this:
curl -k -H "Content-Type: application/octet-string" -u Tesla_Energy_Device:$GW_PWD --data-binary @request.bin https://<IP_ADDRESS>/tedapi/v1

I updated pypowerwall (v0.6.3) to detect Powerwall 3 devices on your local network. I haven't added any additional support for the /tedapi  APIs but this may help if you are looking for Powerwall 3 gateways on your local network.
# Install python package - or upgrade
pip3 install --upgrade pypowerwall

# Scan
python3 -m pypowerwall scan

curl: (28) Failed to connect to <IP_ADDRESS> port 443 after 21035 ms: Couldn't connect to server

curl: (28) Failed to connect to <IP_ADDRESS> port 443 after 21035 ms: Couldn't connect to server

Just to confirm, this was on the PW3 wifi and the previous /din command still works?
curl -k -u Tesla_Energy_Device:$GW_PWD https://<IP_ADDRESS>/tedapi/din

That is correct

Thanks for testing it!  I'm curious if this works for others, regardless of whether they're running PW3 or PW2+.

I updated pypowerwall (v0.6.3) to detect Powerwall 3 devices on your local network

With my 4x PW3 install, I notice the scan will find the child powerwalls, but not the one designated by the installers as the "main".

Sorry for the delay. The updated pypowerwall found 2 of the 3 PW3s but did not locate the second one at .204. I am having issues with connectivity so that may be related.
`pyPowerwall Network Scanner [0.6.3]
Scan local network for Tesla Powerwall Gateways
Your network appears to be: <IP_ADDRESS>/24

Enter Network or press enter to use <IP_ADDRESS>/24:

Running Scan...
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Found Powerwall 3 [Currently Unsupported]
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Found Powerwall 3 [Currently Unsupported]
  Done

Discovered 2 Powerwall Gateway
<IP_ADDRESS> [Powerwall-3] Firmware Currently Unsupported - See https://tinyurl.com/pw3support
<IP_ADDRESS> [Powerwall-3] Firmware Currently Unsupported - See https://tinyurl.com/pw3support`

Thanks @jesaf00 and @stevecastaneda !

With my 4x PW3 install, I notice the scan will find the 3 x child powerwalls, but not the last one designated by the installers as the main.

@stevecastaneda on the main PW3 that it didn't find, what data do you get back when you run this against its endpoint?  If you can, use it's local IP address (if you can figure it out) as well as connecting to its WiFI.
curl -v -k -u Tesla_Energy_Device:GW_PWD https://<IP_ADDRESS>/tedapi/din

@zigam Testing this on my PW+ system using the script and modifying the request.bin with my DIN.
export GW_USER="Tesla_Energy_Device"
export GW_PWD="XXXXXXXXXX"
export GW_IP="<IP_ADDRESS>"

echo "-- DIN Payload --"
curl -v -k -u "$GW_USER:$GW_PWD" https://$GW_IP/tedapi/din

echo "-- Config Payload --"
curl -v -k -H 'Content-type: application/octet-string' -u "$GW_USER:$GW_PWD" --data-binary @request.bin https://$GW_IP/tedapi/v1

Connecting to TEG-xxx wifi:

✅  GET /tedapi/din - Works and returns HTTP/2 200 and the DIN
❌  POST /tedapi/v1 - Responds with HTTP/2 400 - I wonder if the request.bin file has other elements that need to be changed.

Connected to Local Network:

❌  GET /tedapi/din - Responds with HTTP/2 403 and {"code":403,"error":"Unable to GET to resource","message":"User does not have adequate access rights"}
❌  POST /tedapi/v1 - Responds with HTTP/2 403 and {"code":403,"error":"Unable to GET to resource","message":"User does not have adequate access rights"}

According to Rockyproc at https://teslamotorsclub.com/tmc/posts/7919661/ , he was able to get more info from Home Assistant + HACS.

@stevecastaneda on the main PW3 that it didn't find, what data do you get back when you run this against its endpoint? If you can, use it's local IP address (if you can figure it out) as well as connecting to its WiFI.
curl -v -k -u Tesla_Energy_Device:GW_PWD https://<IP_ADDRESS>/tedapi/din

Connected to Local Network: {"code":403,"error":"Unable to GET to resource","message":"User does not have adequate access rights"}
Connected to PW Network: {"code":403,"error":"Unable to GET to resource","message":"User does not have adequate access rights"}

According to Rockyproc at https://teslamotorsclub.com/tmc/posts/7919661/ , he was able to get more info from Home Assistant + HACS.

Thanks @jesaf00 !  However, unless I'm reading it wrong, The Home Assistant "Tesla Custom Integration" that the post mentions, uses the Tesla Cloud. There is another one for powerwalls that uses https://github.com/jrester/tesla_powerwall. That library uses a similar approach to pypowerwall but would be interesting to verify.
The Tesla Custom Integration is similar to what the tesla-history and solar-only tools do. You can get some of the main data that way but it is delayed and doesn't include some things like voltage, frequencies, temperatures, alerts, capacity-degredation, string data, etc.

Connected to Local Network: {"code":403,"error":"Unable to GET to resource","message":"User does not have adequate access rights"}

Thanks @stevecastaneda ! The pypowerwall scan is looking for this exact string to find Powerwall 3 instances on your local network.  Can you run it again to see if it just happened to miss it the first time? I may need to expand the timeout.

Thanks @stevecastaneda ! The pypowerwall scan is looking for this exact string to find Powerwall 3 instances on your local network. Can you run it again to see if it just happened to miss it the first time? I may need to expand the timeout.

You're right - a second scan found the one missing in the first, but then didn't find a different one in the 2nd scan.  +1 to adding time to the timeout.

@stevecastaneda  - The default is 400ms (0.4s) and you can adjust it via command line. I can change the default if you can help me find the sweet spot. Of course, the issue is that the higher we go, the longer the scan takes. Try a few of these:
# timeout set to 500ms = 0.5s
python3 -m pypowerwall scan 0.5

# timeout set to 1s
python3 -m pypowerwall scan 1

.5 didn't get all three and neither did .1, however when I query that one specifically it worked.
`pyPowerwall Network Scanner [0.6.3]
Scan local network for Tesla Powerwall Gateways
Your network appears to be: <IP_ADDRESS>/24

Enter Network or press enter to use <IP_ADDRESS>/24:

Running Scan...
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Found Powerwall 3 [Currently Unsupported]
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Done

Discovered 1 Powerwall Gateway
<IP_ADDRESS> [Powerwall-3] Firmware Currently Unsupported - See https://tinyurl.com/pw3support
jerry@AOBM Powerwall-Dashboard % python3 -m pypowerwall scan 1
/Users/jerry/Library/Python/3.9/lib/python/site-packages/urllib3/init.py:34: NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020
warnings.warn(
pyPowerwall Network Scanner [0.6.3]
Scan local network for Tesla Powerwall Gateways
Your network appears to be: <IP_ADDRESS>/24

Enter Network or press enter to use <IP_ADDRESS>/24:

Running Scan...
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Found Powerwall 3 [Currently Unsupported]
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Found Powerwall 3 [Currently Unsupported]
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Host: <IP_ADDRESS> ... OPEN - Not a Powerwall
  Done

Discovered 2 Powerwall Gateway
<IP_ADDRESS> [Powerwall-3] Firmware Currently Unsupported - See https://tinyurl.com/pw3support
<IP_ADDRESS> [Powerwall-3] Firmware Currently Unsupported - See https://tinyurl.com/pw3support
jerry@AOBM Powerwall-Dashboard % python3 -m pypowerwall scan 1
/Users/jerry/Library/Python/3.9/lib/python/site-packages/urllib3/init.py:34: NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020
warnings.warn(
pyPowerwall Network Scanner [0.6.3]
Scan local network for Tesla Powerwall Gateways
Your network appears to be: <IP_ADDRESS>/24

Enter Network or press enter to use <IP_ADDRESS>/24: <IP_ADDRESS>/32

Running Scan...
  Host: <IP_ADDRESS> ... OPEN - Found Powerwall 3 [Currently Unsupported]
  Done

Discovered 1 Powerwall Gateway
<IP_ADDRESS> [Powerwall-3] Firmware Currently Unsupported - See https://tinyurl.com/pw3support
`

python3 -m pypowerwall scan 0.5

400ms: 4 found successfully (4 successful out of 4 attempts)
500ms: 4 found successfully (3 successful out of 3 attempts)

Odd, this time it worked fine.  I would say that 500ms felt quick so it may not be a bad idea just to buffer by another 100ms.

Thanks @jesaf00 ! Feel free to try something even higher... like 2, 5 or even 10. That would likely mean your connection (WiFi) isn't very strong or is dropping packets, but may be worth trying.

@mcbirse - I wonder if the solar-only daemon updates for tesla-history would automatically support PW3? They would use the tesla-solar option but use the standard dashboard.json (but remove the animation and other panels that won't populate). I believe al the Powerwall data is also pulled in via tesla-history (unless I'm reading it wrong) so PW3 users could at least start getting dashboard data.

I added a research discussion thread for /tedapi support (for PW2/+ and PW3): https://github.com/jasonacox/Powerwall-Dashboard/discussions/392

@mcbirse - I wonder if the solar-only daemon updates for tesla-history would automatically support PW3? They would use the tesla-solar option but use the standard dashboard.json (but remove the animation and other panels that won't populate). I believe al the Powerwall data is also pulled in via tesla-history (unless I'm reading it wrong) so PW3 users could at least start getting dashboard data.

Correct @jasonacox - anyone with a Powerwall system could install the dashboard using the "solar-only" option, and then use the standard dashboard.json - pretty much how I've been testing the whole solar-only offshoot.
All of the Powerwall power metrics should be pulled from the cloud, including backup events so grid status data is populated, and of course the analysis data will populate too (power flow animation and extended data, e.g. voltages, alerts, etc. will not however).

NOTE: run tesla-history using a --start and --end period manually to get the historical data to build analysis data history.
NOTE2: a "solar-only" install has the advantage this could be easily run via docker, e.g. docker exec -it tesla-history python3 tesla-history.py --start "start-date-and-time" --end "end-date-and-time" without even needing to install required python modules).

Can a PW3 user test installing the Powerwall Dashboard in solar-mode mode and see if it works?
Seems timely the solar-only offshoot has now been merged as a setup option just this week! 🚀

Thanks @mcbirse !  I was thinking the same thing (timely release of the solar-only setup that can work for Powerwall 3 owners)! If this works, we should update the script and README to include language that this supports Powerwall 3 (Tesla Cloud version).
@jesaf00 - I know you already installed the Powerwall-Dashboard. Would you be willing to test this?
Powerwall 3 Dashboard Setup
# Install Powerwall-Dashboard (if not already installed)
git clone https://github.com/jasonacox/Powerwall-Dashboard.git
cd Powerwall-Dashboard

# If already installed, remove old configuration
rm compose.env

# Run Setup
./setup.sh

You will see this:
  Powerwall Dashboard (v3.0.0) - SETUP
  -----------------------------------------
  Select configuration profile:

  1 - default     (Powerwall w/ Gateway on LAN)
  2 - solar-only  (No Gateway - data retrieved from Tesla Cloud)

For Powerwall 3 owners, select profile "2 - solar-only  (No Gateway - data retrieved from Tesla Cloud)"
When you install the dashboard configuration file, you can use the default (dashboard.json). It will have some panels that don't work but after a while you should start seeing data populate.
Powerwall 3 - Load History
You an load the historic data from the Tesla Cloud into your dashboard as @mcbirse mentions, with something like this:
docker exec -it tesla-history python3 tesla-history.py --start "2023-01-01 00:00:00" --end "2024-01-01 00:00:00"

Here are my results...
`Tesla Account Setup
Email address<EMAIL_ADDRESS>Config saved to '/var/lib/tesla-history/tesla-history.conf'

Tesla account<EMAIL_ADDRESS>Open the below address in your browser to login.
https://auth.tesla.com/oauth2/v3/authorize?response_type=code&client_id=ownerapi&redirect_uri=https%3A%2F%2Fauth.tesla.com%2Fvoid%2Fcallback&scope=openid+email+offline_access&state=d2mvl2SQYIBBdKerwpkUfdfnAzwGqT&code_challenge=lpsbKVScxeDMCMi3d4DKMQXQgoJUGiFuBH1ISmFU7gw&code_challenge_method=S256&login_hint=myemail%40gmail.com
After login, paste the URL of the 'Page Not Found' webpage below.
Enter URL after login: https://auth.tesla.com/void/callback?code=NA_8091ab256d05f3d2f96b8e970f3ee04be42b6dbc32b5038955172702ab91&state=d2mvl2SQYIBBdKerwpkUfdfnAzwGqT&issuer=https%3A%2F%2Fauth.tesla.com%2Foauth2%2Fv3
ERROR: Failed to retrieve PRODUCT_LIST - RetryError(MaxRetryError("HTTPSConnectionPool(host='owner-api.teslamotors.com', port=443): Max retries exceeded with url: /api/1/products (Caused by ResponseError('too many 500 error responses'))"))
Restarting tesla-history...
tesla-history
------------------[ Final Setup Instructions ]-----------------
`

Thanks @jesaf00 !  Are you using the same credentials you use for the Tesla App?
@mcbirse Have you seen this before?

Well, IDK what happened. I deleted the container, reran the setup and it succeeded without asking for my PW. and here we are....

Wow! 🚀  Nice job @jesaf00 - First to have a Powerwall 3 Dashboard up and running. ❤
Did you also run the "Load History" steps? I assume that's how you have 24hr of data.
You can delete the "Power Flow" panel. I is based on pypowerwall proxying the Powerwall2/+ portal UI.  The powerwall-no-animation.json file replaces that spot with a Powerwall charge graph and piechart.

Yes sir, I did! Thanks for the suggestion about the no animation dashboard. With this working what's next? Need to wait for some API info?

Thanks @jesaf00 ! - Can you share another screenshot of your dashboard with the no-animation version?
As to "what's next", I'm researching the Tesla Pros API. I have a first pass at the protobuf schema and if you are interested in testing, I have uploaded them here: https://github.com/jasonacox/pypowerwall/tree/main/tools/tedapi#tools
The test.py script will prompt you for your Powerwall Gateway password (the one on the QR sticker) and will attempt to fetch the DIN (device ID number), current Configuration (warning: contains confidential user and password data), and the current status (not yet working 100%).  It will be interesting to see if the Powerwall 3 responds to any of these.

@jesaf00 - this is brilliant, thanks for trying it! Glad to see PW3 owners at least have this option for now.

ERROR: Failed to retrieve PRODUCT_LIST - RetryError(MaxRetryError("HTTPSConnectionPool(host='owner-api.teslamotors.com', port=443): Max retries exceeded with url: /api/1/products (Caused by ResponseError('too many 500 error responses'))"))

I suspect this was just a transient connection error to the Tesla host 'owner-api.teslamotors.com' for some reason... maybe the site went down or Internet dropped out briefly, and it happened to occur just after (successful) login when the script attempts to get the site details.

Well, IDK what happened. I deleted the container, reran the setup and it succeeded without asking for my PW.

Yep, login was actually successful and the .conf and .auth files were saved. You would have just been able to re-run setup without removing the container and it would be okay... or even just run docker restart tesla-history. You can always run docker logs tesla-history to confirm the service is operating correctly as well. If it cannot login or get site details, there will be an error and the script will halt, and will require resolving by a restart or re-authenticating.

If this works, we should update the script and README to include language that this supports Powerwall 3 (Tesla Cloud version).

@jasonacox - I agree, it makes sense that we now update the setup script and README to advise PW3 owners to use the "solar-only" option. We could even add a 3rd config profile option depending on what is clearer?

@mcbirse - Good idea. But I'm also wondering if we just keep it limited to the two profiles for now while we figure out the final outcome. I'm getting some indication that Tesla won't be interested in providing local API access and pushing for everyone to move the Tesla App as the only location for this data. That could even impact us, as existing PW 2/+ owners (e.g. a firmware that removes the local portal and APIs).  I hope that doesn't happen, but it is worth exploring how we would support that transition and make it easy to switch.  At a minimum, the profile would allow everyone to continue to get basic information into the Dashboard.
Perhaps we just reword the setup.py profile selection a bit? We may also want to have the script look for compose.env, and if found, prompt the user if they want to change the configuration profile.
Select configuration profile:

  1 - Local Access (Powerwall 1, 2, or + using extended data from Tesla Gateway on LAN) - Default
  2 - Tesla Cloud  (Solar-only, Powerwall 1, 2, +, or 3 using data from Tesla Cloud)

If the 2nd option is selected (solar-only), the setup instructions will point users to use the solar-only or no-animation dashboards.

@jasonacox - Sounds good and makes sense to me. I have started a new branch v3.0.3 and committed some changes which include update to the profile selection descriptions, and allows changing the profile selection when already configured.
I have only done very minimal testing at this point, so if you see any issues feel free to update.
I also had some updates to the pwstatus and weather-history tools to make them a bit more resilient when errors occur, and have included these changes.

Here is the screenshot you asked for.

Thank's Jerry! 🙏  Does the "Current State" panel not show anything? We should look into that if so.  If you don't mind, I would love to use this as a PW3 example on our homepage (README.md). Could you zoom out (Cmd/Ctrl and – (minus) on Chrome) to screen capture down to the "Monthly Analysis" section?  Here is what it looks like on my system:

We can also update the no-animation dashboard to include the weather and outage data in the main "Energy Usage" graph. I'll work on that...

I have started a new branch v3.0.3

Thanks @mcbirse ! I'll check it out...

Thank's Jerry! 🙏 Does the "Current State" panel not show anything? We should look into that if so. If you don't mind, I would love to use this as a PW3 example on our homepage (README.md). Could you zoom out (Cmd/Ctrl and – (minus) on Chrome) to screen capture down to the "Monthly Analysis" section? Here is what it looks like on my system:

We can also update the no-animation dashboard to include the weather and outage data in the main "Energy Usage" graph. I just added that and made a few more edits. Can you try this one?
dashboard-no-animation.json (Updated)

Here is with and without animation dashboards.

Interestingly enough I was able to get Tesla private dashboard to work with PW3. I installed Tesla One app and logged in as Tesla partner with my normal Tesla account. Then I could enter WiFi details and connect to the local device. From there the app showed similar to what Tesla app would show with Solar generated, energy from grid, and PW3 discharge. This is nice since my official Tesla app is STILL not working.
Lmk if I can reverse any API info with this? It might be a bit tough since this app is on iOS and packet sniffing might not be so trivial.

Hi @ivberg !  We do have an investigation into the tedapi API (Tesla Pros/One) here:

I was able to get Tesla private dashboard to work with PW3

What is that dashboard?  Do you mean the Powerwall-Dashboard? I would be interested to see what the scan show. I'm somewhat hopeful that Tesla will bring the basic TEG portal to the PW3 as we have with the PW2/+:
pip install pypowerwall
python3 -m pypowerwall scan

Also @jesaf00 - I can't remember if I followed up with you. The latest release (v4.0.1) should provide you with a working animation dashboard if you upgrade. It would be good to see if it works for you.

Fantastic @jwmoss !!!   Are you able to use the Tesla One (Tesla Pros) app to access your PW3?  If so, we just made a discovery that could make it possible to unlock even more data from your PW3.

Hi @jwmoss - For the PW3, since it doesn't connect to your LAN, you would need to figure out a way to bridge your networks (or at least the host that runs the Dashboard).  Here is one potential path: https://gist.github.com/jasonacox/91479957d0605248d7eadb919585616c

Just installed (2) pw3s  and getting same 404 as jesaf00 originally reported.    I can successfully log into one of my pw3s via wifi using password under the  glass cover .    Tried all the various urls  but all return 404 not found.
The cloud only solution above really  is of no use if/when internet goes down.     Just like how the telsa app home site page doesn't work in airplane mode.

HI @dvwalker - The only URI that the Powerwall 3 will respond to will be the /tedapi API. The rest will give you an error.
In https://github.com/jasonacox/pypowerwall/issues/97 we have the latest Powerwall-Dashboard (upgrade to version 4.4.2) working with Powerwall 3. It requires that the computer that runs the dashboard has access to the Powerwall 3 gateway (<IP_ADDRESS>) via WiFi or a network route. To convert your existing installation, edit the pypowerwall.env file:
#PW_EMAIL=
#PW_PASSWORD=
PW_HOST=<IP_ADDRESS>
PW_GW_PWD=GWPASSWD

Where GWPASSWD is the gateway password usually found on the WiFi / QR code you mention. Restart with ./compose-dash.sh up -d

This is great stuff you're doing here @jasonacox! I have a PW3 and it is trowing Arc faults. The Tesla One app currently shows an Arc Lockout fault that doesn't show up in the Grafana dashboard, I'm assuming your plan is to have those in the Alerts session. The string data also shows "no data" although that could be because the inverter is down due to the Arc Lockout. How can I help with adding the fault from the PW3 to the dashboard?
I'm doing my own research and will share what I find, adding this comment in case you already have something that could save me time.

Hi @geptto - Thanks for the screenshots!  I would love to see what your system is showing using these URLs - if you can find the alerts for the Arc Fault, etc:

http://localhost:8675/tedapi/status - this is the raw API that the Tesla One app uses for live data
http://localhost:8675/tedapi/config - this is the API that shows the config data
http://localhost:8675/alerts
Also check http://localhost:8675/vitals if you see the alert above - curious to see if it is in vitals (should show up in the dashboard)

I think the missing bits:

Strings - This may only be available on the Powerwall+ despite thinking the PW3 may have these.
PW Capacity - I'm surprised that the capacity data is not showing up, it would be interesting to see if the /tedapi/status URL above shows somthing like this in the JSON:

"systemStatus": {
"nominalEnergyRemainingWh": 12526,
"nominalFullPackEnergyWh": 25793

"POD": [
{
"POD_EnergyStatus": {
"POD_nom_energy_remaining": 6404,
"POD_nom_full_pack_energy": 13188,
"isMIA": false
},

, it would be interesting to see if the /tedapi/status URL above shows somthing like this in the JSON:

Hi @jasonacox !
I can't find the fault in any of those URLs. Payloads are attached, please notice I masked any serial numbers or identifiable data.
About the strings, the data must be there somewhere since it is available in the Tesla One app. I'm working on grabbing the network packets between the app and the PW. Will share if I find something useful.
On PW capacity, systemStatus data is available however all objects within the POD array are representing zeroes.
###/tedapi/status
{     "control": {         "alerts": {             "active": [                 "SelfConsumptionReservedLimit",                 "SystemConnectedToGrid",                 "FWUpdateSucceeded"             ]         },         "batteryBlocks": [             {                 "din": "1707000-00-J--TG9999999999XP",                 "disableReasons": null             }         ],         "islanding": {             "contactorClosed": true,             "customerIslandMode": "BACKUP",             "gridOK": true,             "microGridOK": true         },         "meterAggregates": [             {                 "location": "BATTERY",                 "realPowerW": 1             },             {                 "location": "SITE",                 "realPowerW": 5113             },             {                 "location": "LOAD",                 "realPowerW": 5134.25             },             {                 "location": "SOLAR",                 "realPowerW": 0             },             {                 "location": "SOLAR_RGM",                 "realPowerW": 0             },             {                 "location": "GENERATOR",                 "realPowerW": 0             },             {                 "location": "CONDUCTOR",                 "realPowerW": 0             }         ],         "pvInverters": [],         "siteShutdown": {             "isShutDown": false,             "reasons": []         },         "systemStatus": {             "nominalEnergyRemainingWh": 7380,             "nominalFullPackEnergyWh": 14120.000000000002         }     },     "esCan": {         "bus": {             "ISLANDER": {                 "ISLAND_AcMeasurements": {                     "ISLAND_FreqL1_Load": 60.02,                     "ISLAND_FreqL1_Main": 60.02,                     "ISLAND_FreqL2_Load": 60.01,                     "ISLAND_FreqL2_Main": 60.01,                     "ISLAND_FreqL3_Load": 0,                     "ISLAND_FreqL3_Main": 0,                     "ISLAND_GridState": "ISLAND_GridState_Grid_Compliant",                     "ISLAND_VL1N_Load": 119,                     "ISLAND_VL1N_Main": 119,                     "ISLAND_VL2N_Load": 119,                     "ISLAND_VL2N_Main": 119,                     "ISLAND_VL3N_Load": 0,                     "ISLAND_VL3N_Main": 0,                     "isComplete": true,                     "isMIA": false,                     "lastRxTime": "2024-06-22T15:18:31-06:00"                 },                 "ISLAND_GridConnection": {                     "ISLAND_GridConnected": "ISLAND_GridConnected_Connected",                     "isComplete": true                 }             },             "MSA": {                 "METER_Z_AcMeasurements": {                     "METER_Z_CTA_I": 23.38,                     "METER_Z_CTA_InstReactivePower": 893,                     "METER_Z_CTA_InstRealPower": 2616,                     "METER_Z_CTB_I": 22.03,                     "METER_Z_CTB_InstReactivePower": 561,                     "METER_Z_CTB_InstRealPower": 2531,                     "METER_Z_VL1G": 119.18,                     "METER_Z_VL2G": 119.41,                     "isMIA": false,                     "lastRxTime": "2024-06-22T15:18:31-06:00"                 },                 "MSA_InfoMsg": {                     "MSA_appGitHash": [                         60,                         196,                         111,                         185,                         50,                         202,                         162                     ],                     "MSA_assemblyId": 0,                     "isMIA": false                 },                 "MSA_Status": {                     "lastRxTime": "2024-06-22T15:18:31-06:00"                 },                 "packagePartNumber": "1624171-00-E",                 "packageSerialNumber": "TG999999999DEG"             },             "PINV": [                 {                     "PINV_AcMeasurements": {                         "PINV_VSplit1": 0,                         "PINV_VSplit2": 0,                         "isMIA": true                     },                     "PINV_PowerCapability": {                         "PINV_Pnom": 0,                         "isComplete": false,                         "isMIA": true                     },                     "PINV_Status": {                         "PINV_Fout": 0,                         "PINV_GridState": "Grid_Uncompliant",                         "PINV_Pout": 0,                         "PINV_State": "PINV_Off",                         "PINV_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PINV_AcMeasurements": {                         "PINV_VSplit1": 0,                         "PINV_VSplit2": 0,                         "isMIA": true                     },                     "PINV_PowerCapability": {                         "PINV_Pnom": 0,                         "isComplete": false,                         "isMIA": true                     },                     "PINV_Status": {                         "PINV_Fout": 0,                         "PINV_GridState": "Grid_Uncompliant",                         "PINV_Pout": 0,                         "PINV_State": "PINV_Off",                         "PINV_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PINV_AcMeasurements": {                         "PINV_VSplit1": 0,                         "PINV_VSplit2": 0,                         "isMIA": true                     },                     "PINV_PowerCapability": {                         "PINV_Pnom": 0,                         "isComplete": false,                         "isMIA": true                     },                     "PINV_Status": {                         "PINV_Fout": 0,                         "PINV_GridState": "Grid_Uncompliant",                         "PINV_Pout": 0,                         "PINV_State": "PINV_Off",                         "PINV_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PINV_AcMeasurements": {                         "PINV_VSplit1": 0,                         "PINV_VSplit2": 0,                         "isMIA": true                     },                     "PINV_PowerCapability": {                         "PINV_Pnom": 0,                         "isComplete": false,                         "isMIA": true                     },                     "PINV_Status": {                         "PINV_Fout": 0,                         "PINV_GridState": "Grid_Uncompliant",                         "PINV_Pout": 0,                         "PINV_State": "PINV_Off",                         "PINV_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PINV_AcMeasurements": {                         "PINV_VSplit1": 0,                         "PINV_VSplit2": 0,                         "isMIA": true                     },                     "PINV_PowerCapability": {                         "PINV_Pnom": 0,                         "isComplete": false,                         "isMIA": true                     },                     "PINV_Status": {                         "PINV_Fout": 0,                         "PINV_GridState": "Grid_Uncompliant",                         "PINV_Pout": 0,                         "PINV_State": "PINV_Off",                         "PINV_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PINV_AcMeasurements": {                         "PINV_VSplit1": 0,                         "PINV_VSplit2": 0,                         "isMIA": true                     },                     "PINV_PowerCapability": {                         "PINV_Pnom": 0,                         "isComplete": false,                         "isMIA": true                     },                     "PINV_Status": {                         "PINV_Fout": 0,                         "PINV_GridState": "Grid_Uncompliant",                         "PINV_Pout": 0,                         "PINV_State": "PINV_Off",                         "PINV_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PINV_AcMeasurements": {                         "PINV_VSplit1": 0,                         "PINV_VSplit2": 0,                         "isMIA": true                     },                     "PINV_PowerCapability": {                         "PINV_Pnom": 0,                         "isComplete": false,                         "isMIA": true                     },                     "PINV_Status": {                         "PINV_Fout": 0,                         "PINV_GridState": "Grid_Uncompliant",                         "PINV_Pout": 0,                         "PINV_State": "PINV_Off",                         "PINV_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PINV_AcMeasurements": {                         "PINV_VSplit1": 0,                         "PINV_VSplit2": 0,                         "isMIA": true                     },                     "PINV_PowerCapability": {                         "PINV_Pnom": 0,                         "isComplete": false,                         "isMIA": true                     },                     "PINV_Status": {                         "PINV_Fout": 0,                         "PINV_GridState": "Grid_Uncompliant",                         "PINV_Pout": 0,                         "PINV_State": "PINV_Off",                         "PINV_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PINV_AcMeasurements": {                         "PINV_VSplit1": 0,                         "PINV_VSplit2": 0,                         "isMIA": true                     },                     "PINV_PowerCapability": {                         "PINV_Pnom": 0,                         "isComplete": false,                         "isMIA": true                     },                     "PINV_Status": {                         "PINV_Fout": 0,                         "PINV_GridState": "Grid_Uncompliant",                         "PINV_Pout": 0,                         "PINV_State": "PINV_Off",                         "PINV_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PINV_AcMeasurements": {                         "PINV_VSplit1": 0,                         "PINV_VSplit2": 0,                         "isMIA": true                     },                     "PINV_PowerCapability": {                         "PINV_Pnom": 0,                         "isComplete": false,                         "isMIA": true                     },                     "PINV_Status": {                         "PINV_Fout": 0,                         "PINV_GridState": "Grid_Uncompliant",                         "PINV_Pout": 0,                         "PINV_State": "PINV_Off",                         "PINV_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 }             ],             "POD": [                 {                     "POD_EnergyStatus": {                         "POD_nom_energy_remaining": 0,                         "POD_nom_full_pack_energy": 0,                         "isMIA": true                     },                     "POD_InfoMsg": {                         "POD_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     }                 },                 {                     "POD_EnergyStatus": {                         "POD_nom_energy_remaining": 0,                         "POD_nom_full_pack_energy": 0,                         "isMIA": true                     },                     "POD_InfoMsg": {                         "POD_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     }                 },                 {                     "POD_EnergyStatus": {                         "POD_nom_energy_remaining": 0,                         "POD_nom_full_pack_energy": 0,                         "isMIA": true                     },                     "POD_InfoMsg": {                         "POD_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     }                 },                 {                     "POD_EnergyStatus": {                         "POD_nom_energy_remaining": 0,                         "POD_nom_full_pack_energy": 0,                         "isMIA": true                     },                     "POD_InfoMsg": {                         "POD_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     }                 },                 {                     "POD_EnergyStatus": {                         "POD_nom_energy_remaining": 0,                         "POD_nom_full_pack_energy": 0,                         "isMIA": true                     },                     "POD_InfoMsg": {                         "POD_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     }                 },                 {                     "POD_EnergyStatus": {                         "POD_nom_energy_remaining": 0,                         "POD_nom_full_pack_energy": 0,                         "isMIA": true                     },                     "POD_InfoMsg": {                         "POD_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     }                 },                 {                     "POD_EnergyStatus": {                         "POD_nom_energy_remaining": 0,                         "POD_nom_full_pack_energy": 0,                         "isMIA": true                     },                     "POD_InfoMsg": {                         "POD_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     }                 },                 {                     "POD_EnergyStatus": {                         "POD_nom_energy_remaining": 0,                         "POD_nom_full_pack_energy": 0,                         "isMIA": true                     },                     "POD_InfoMsg": {                         "POD_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     }                 },                 {                     "POD_EnergyStatus": {                         "POD_nom_energy_remaining": 0,                         "POD_nom_full_pack_energy": 0,                         "isMIA": true                     },                     "POD_InfoMsg": {                         "POD_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     }                 },                 {                     "POD_EnergyStatus": {                         "POD_nom_energy_remaining": 0,                         "POD_nom_full_pack_energy": 0,                         "isMIA": true                     },                     "POD_InfoMsg": {                         "POD_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     }                 }             ],             "PVAC": [                 {                     "PVAC_InfoMsg": {                         "PVAC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     },                     "PVAC_Logging": {                         "PVAC_PVCurrent_A": 0,                         "PVAC_PVCurrent_B": 0,                         "PVAC_PVCurrent_C": 0,                         "PVAC_PVCurrent_D": 0,                         "PVAC_PVMeasuredVoltage_A": 0,                         "PVAC_PVMeasuredVoltage_B": 0,                         "PVAC_PVMeasuredVoltage_C": 0,                         "PVAC_PVMeasuredVoltage_D": 0,                         "PVAC_VL1Ground": 0,                         "PVAC_VL2Ground": 0,                         "isMIA": true                     },                     "PVAC_Status": {                         "PVAC_Fout": 0,                         "PVAC_Pout": 0,                         "PVAC_State": "PVAC_Init",                         "PVAC_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     },                     "packagePartNumber": "",                     "packageSerialNumber": "",                     "subPackagePartNumber": "",                     "subPackageSerialNumber": ""                 },                 {                     "PVAC_InfoMsg": {                         "PVAC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     },                     "PVAC_Logging": {                         "PVAC_PVCurrent_A": 0,                         "PVAC_PVCurrent_B": 0,                         "PVAC_PVCurrent_C": 0,                         "PVAC_PVCurrent_D": 0,                         "PVAC_PVMeasuredVoltage_A": 0,                         "PVAC_PVMeasuredVoltage_B": 0,                         "PVAC_PVMeasuredVoltage_C": 0,                         "PVAC_PVMeasuredVoltage_D": 0,                         "PVAC_VL1Ground": 0,                         "PVAC_VL2Ground": 0,                         "isMIA": true                     },                     "PVAC_Status": {                         "PVAC_Fout": 0,                         "PVAC_Pout": 0,                         "PVAC_State": "PVAC_Init",                         "PVAC_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     },                     "packagePartNumber": "",                     "packageSerialNumber": "",                     "subPackagePartNumber": "",                     "subPackageSerialNumber": ""                 },                 {                     "PVAC_InfoMsg": {                         "PVAC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     },                     "PVAC_Logging": {                         "PVAC_PVCurrent_A": 0,                         "PVAC_PVCurrent_B": 0,                         "PVAC_PVCurrent_C": 0,                         "PVAC_PVCurrent_D": 0,                         "PVAC_PVMeasuredVoltage_A": 0,                         "PVAC_PVMeasuredVoltage_B": 0,                         "PVAC_PVMeasuredVoltage_C": 0,                         "PVAC_PVMeasuredVoltage_D": 0,                         "PVAC_VL1Ground": 0,                         "PVAC_VL2Ground": 0,                         "isMIA": true                     },                     "PVAC_Status": {                         "PVAC_Fout": 0,                         "PVAC_Pout": 0,                         "PVAC_State": "PVAC_Init",                         "PVAC_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     },                     "packagePartNumber": "",                     "packageSerialNumber": "",                     "subPackagePartNumber": "",                     "subPackageSerialNumber": ""                 },                 {                     "PVAC_InfoMsg": {                         "PVAC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     },                     "PVAC_Logging": {                         "PVAC_PVCurrent_A": 0,                         "PVAC_PVCurrent_B": 0,                         "PVAC_PVCurrent_C": 0,                         "PVAC_PVCurrent_D": 0,                         "PVAC_PVMeasuredVoltage_A": 0,                         "PVAC_PVMeasuredVoltage_B": 0,                         "PVAC_PVMeasuredVoltage_C": 0,                         "PVAC_PVMeasuredVoltage_D": 0,                         "PVAC_VL1Ground": 0,                         "PVAC_VL2Ground": 0,                         "isMIA": true                     },                     "PVAC_Status": {                         "PVAC_Fout": 0,                         "PVAC_Pout": 0,                         "PVAC_State": "PVAC_Init",                         "PVAC_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     },                     "packagePartNumber": "",                     "packageSerialNumber": "",                     "subPackagePartNumber": "",                     "subPackageSerialNumber": ""                 },                 {                     "PVAC_InfoMsg": {                         "PVAC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     },                     "PVAC_Logging": {                         "PVAC_PVCurrent_A": 0,                         "PVAC_PVCurrent_B": 0,                         "PVAC_PVCurrent_C": 0,                         "PVAC_PVCurrent_D": 0,                         "PVAC_PVMeasuredVoltage_A": 0,                         "PVAC_PVMeasuredVoltage_B": 0,                         "PVAC_PVMeasuredVoltage_C": 0,                         "PVAC_PVMeasuredVoltage_D": 0,                         "PVAC_VL1Ground": 0,                         "PVAC_VL2Ground": 0,                         "isMIA": true                     },                     "PVAC_Status": {                         "PVAC_Fout": 0,                         "PVAC_Pout": 0,                         "PVAC_State": "PVAC_Init",                         "PVAC_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     },                     "packagePartNumber": "",                     "packageSerialNumber": "",                     "subPackagePartNumber": "",                     "subPackageSerialNumber": ""                 },                 {                     "PVAC_InfoMsg": {                         "PVAC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     },                     "PVAC_Logging": {                         "PVAC_PVCurrent_A": 0,                         "PVAC_PVCurrent_B": 0,                         "PVAC_PVCurrent_C": 0,                         "PVAC_PVCurrent_D": 0,                         "PVAC_PVMeasuredVoltage_A": 0,                         "PVAC_PVMeasuredVoltage_B": 0,                         "PVAC_PVMeasuredVoltage_C": 0,                         "PVAC_PVMeasuredVoltage_D": 0,                         "PVAC_VL1Ground": 0,                         "PVAC_VL2Ground": 0,                         "isMIA": true                     },                     "PVAC_Status": {                         "PVAC_Fout": 0,                         "PVAC_Pout": 0,                         "PVAC_State": "PVAC_Init",                         "PVAC_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     },                     "packagePartNumber": "",                     "packageSerialNumber": "",                     "subPackagePartNumber": "",                     "subPackageSerialNumber": ""                 },                 {                     "PVAC_InfoMsg": {                         "PVAC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     },                     "PVAC_Logging": {                         "PVAC_PVCurrent_A": 0,                         "PVAC_PVCurrent_B": 0,                         "PVAC_PVCurrent_C": 0,                         "PVAC_PVCurrent_D": 0,                         "PVAC_PVMeasuredVoltage_A": 0,                         "PVAC_PVMeasuredVoltage_B": 0,                         "PVAC_PVMeasuredVoltage_C": 0,                         "PVAC_PVMeasuredVoltage_D": 0,                         "PVAC_VL1Ground": 0,                         "PVAC_VL2Ground": 0,                         "isMIA": true                     },                     "PVAC_Status": {                         "PVAC_Fout": 0,                         "PVAC_Pout": 0,                         "PVAC_State": "PVAC_Init",                         "PVAC_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     },                     "packagePartNumber": "",                     "packageSerialNumber": "",                     "subPackagePartNumber": "",                     "subPackageSerialNumber": ""                 },                 {                     "PVAC_InfoMsg": {                         "PVAC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ]                     },                     "PVAC_Logging": {                         "PVAC_PVCurrent_A": 0,                         "PVAC_PVCurrent_B": 0,                         "PVAC_PVCurrent_C": 0,                         "PVAC_PVCurrent_D": 0,                         "PVAC_PVMeasuredVoltage_A": 0,                         "PVAC_PVMeasuredVoltage_B": 0,                         "PVAC_PVMeasuredVoltage_C": 0,                         "PVAC_PVMeasuredVoltage_D": 0,                         "PVAC_VL1Ground": 0,                         "PVAC_VL2Ground": 0,                         "isMIA": true                     },                     "PVAC_Status": {                         "PVAC_Fout": 0,                         "PVAC_Pout": 0,                         "PVAC_State": "PVAC_Init",                         "PVAC_Vout": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     },                     "packagePartNumber": "",                     "packageSerialNumber": "",                     "subPackagePartNumber": "",                     "subPackageSerialNumber": ""                 }             ],             "PVS": [                 {                     "PVS_Status": {                         "PVS_SelfTestState": "PVS_SelfTestOff",                         "PVS_State": "PVS_Off",                         "PVS_StringA_Connected": false,                         "PVS_StringB_Connected": false,                         "PVS_StringC_Connected": false,                         "PVS_StringD_Connected": false,                         "PVS_vLL": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PVS_Status": {                         "PVS_SelfTestState": "PVS_SelfTestOff",                         "PVS_State": "PVS_Off",                         "PVS_StringA_Connected": false,                         "PVS_StringB_Connected": false,                         "PVS_StringC_Connected": false,                         "PVS_StringD_Connected": false,                         "PVS_vLL": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PVS_Status": {                         "PVS_SelfTestState": "PVS_SelfTestOff",                         "PVS_State": "PVS_Off",                         "PVS_StringA_Connected": false,                         "PVS_StringB_Connected": false,                         "PVS_StringC_Connected": false,                         "PVS_StringD_Connected": false,                         "PVS_vLL": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PVS_Status": {                         "PVS_SelfTestState": "PVS_SelfTestOff",                         "PVS_State": "PVS_Off",                         "PVS_StringA_Connected": false,                         "PVS_StringB_Connected": false,                         "PVS_StringC_Connected": false,                         "PVS_StringD_Connected": false,                         "PVS_vLL": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PVS_Status": {                         "PVS_SelfTestState": "PVS_SelfTestOff",                         "PVS_State": "PVS_Off",                         "PVS_StringA_Connected": false,                         "PVS_StringB_Connected": false,                         "PVS_StringC_Connected": false,                         "PVS_StringD_Connected": false,                         "PVS_vLL": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PVS_Status": {                         "PVS_SelfTestState": "PVS_SelfTestOff",                         "PVS_State": "PVS_Off",                         "PVS_StringA_Connected": false,                         "PVS_StringB_Connected": false,                         "PVS_StringC_Connected": false,                         "PVS_StringD_Connected": false,                         "PVS_vLL": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PVS_Status": {                         "PVS_SelfTestState": "PVS_SelfTestOff",                         "PVS_State": "PVS_Off",                         "PVS_StringA_Connected": false,                         "PVS_StringB_Connected": false,                         "PVS_StringC_Connected": false,                         "PVS_StringD_Connected": false,                         "PVS_vLL": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 },                 {                     "PVS_Status": {                         "PVS_SelfTestState": "PVS_SelfTestOff",                         "PVS_State": "PVS_Off",                         "PVS_StringA_Connected": false,                         "PVS_StringB_Connected": false,                         "PVS_StringC_Connected": false,                         "PVS_StringD_Connected": false,                         "PVS_vLL": 0,                         "isMIA": true                     },                     "alerts": {                         "active": [],                         "isComplete": false,                         "isMIA": true                     }                 }             ],             "SYNC": {                 "METER_X_AcMeasurements": {                     "METER_X_CTA_I": 0,                     "METER_X_CTA_InstReactivePower": 0,                     "METER_X_CTA_InstRealPower": 0,                     "METER_X_CTB_I": 0,                     "METER_X_CTB_InstReactivePower": 0,                     "METER_X_CTB_InstRealPower": 0,                     "METER_X_CTC_I": 0,                     "METER_X_CTC_InstReactivePower": 0,                     "METER_X_CTC_InstRealPower": 0,                     "METER_X_VL1N": 0,                     "METER_X_VL2N": 0,                     "METER_X_VL3N": 0,                     "isComplete": false,                     "isMIA": true,                     "lastRxTime": "0001-01-01T00:00:00Z"                 },                 "METER_Y_AcMeasurements": {                     "METER_Y_CTA_I": 0,                     "METER_Y_CTA_InstReactivePower": 0,                     "METER_Y_CTA_InstRealPower": 0,                     "METER_Y_CTB_I": 0,                     "METER_Y_CTB_InstReactivePower": 0,                     "METER_Y_CTB_InstRealPower": 0,                     "METER_Y_CTC_I": 0,                     "METER_Y_CTC_InstReactivePower": 0,                     "METER_Y_CTC_InstRealPower": 0,                     "METER_Y_VL1N": 0,                     "METER_Y_VL2N": 0,                     "METER_Y_VL3N": 0,                     "isComplete": false,                     "isMIA": true,                     "lastRxTime": "0001-01-01T00:00:00Z"                 },                 "SYNC_InfoMsg": {                     "SYNC_appGitHash": [                         0,                         0,                         0,                         0,                         0,                         0,                         0                     ],                     "isMIA": true                 },                 "SYNC_Status": {                     "lastRxTime": "0001-01-01T00:00:00Z"                 },                 "packagePartNumber": "",                 "packageSerialNumber": ""             },             "THC": [                 {                     "THC_InfoMsg": {                         "THC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ],                         "isComplete": false,                         "isMIA": true                     },                     "THC_Logging": {                         "THC_LOG_PW_2_0_EnableLineState": "ENABLE_LINE_LOW"                     },                     "packagePartNumber": "",                     "packageSerialNumber": ""                 },                 {                     "THC_InfoMsg": {                         "THC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ],                         "isComplete": false,                         "isMIA": true                     },                     "THC_Logging": {                         "THC_LOG_PW_2_0_EnableLineState": "ENABLE_LINE_LOW"                     },                     "packagePartNumber": "",                     "packageSerialNumber": ""                 },                 {                     "THC_InfoMsg": {                         "THC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ],                         "isComplete": false,                         "isMIA": true                     },                     "THC_Logging": {                         "THC_LOG_PW_2_0_EnableLineState": "ENABLE_LINE_LOW"                     },                     "packagePartNumber": "",                     "packageSerialNumber": ""                 },                 {                     "THC_InfoMsg": {                         "THC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ],                         "isComplete": false,                         "isMIA": true                     },                     "THC_Logging": {                         "THC_LOG_PW_2_0_EnableLineState": "ENABLE_LINE_LOW"                     },                     "packagePartNumber": "",                     "packageSerialNumber": ""                 },                 {                     "THC_InfoMsg": {                         "THC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ],                         "isComplete": false,                         "isMIA": true                     },                     "THC_Logging": {                         "THC_LOG_PW_2_0_EnableLineState": "ENABLE_LINE_LOW"                     },                     "packagePartNumber": "",                     "packageSerialNumber": ""                 },                 {                     "THC_InfoMsg": {                         "THC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ],                         "isComplete": false,                         "isMIA": true                     },                     "THC_Logging": {                         "THC_LOG_PW_2_0_EnableLineState": "ENABLE_LINE_LOW"                     },                     "packagePartNumber": "",                     "packageSerialNumber": ""                 },                 {                     "THC_InfoMsg": {                         "THC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ],                         "isComplete": false,                         "isMIA": true                     },                     "THC_Logging": {                         "THC_LOG_PW_2_0_EnableLineState": "ENABLE_LINE_LOW"                     },                     "packagePartNumber": "",                     "packageSerialNumber": ""                 },                 {                     "THC_InfoMsg": {                         "THC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ],                         "isComplete": false,                         "isMIA": true                     },                     "THC_Logging": {                         "THC_LOG_PW_2_0_EnableLineState": "ENABLE_LINE_LOW"                     },                     "packagePartNumber": "",                     "packageSerialNumber": ""                 },                 {                     "THC_InfoMsg": {                         "THC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ],                         "isComplete": false,                         "isMIA": true                     },                     "THC_Logging": {                         "THC_LOG_PW_2_0_EnableLineState": "ENABLE_LINE_LOW"                     },                     "packagePartNumber": "",                     "packageSerialNumber": ""                 },                 {                     "THC_InfoMsg": {                         "THC_appGitHash": [                             0,                             0,                             0,                             0,                             0,                             0,                             0                         ],                         "isComplete": false,                         "isMIA": true                     },                     "THC_Logging": {                         "THC_LOG_PW_2_0_EnableLineState": "ENABLE_LINE_LOW"                     },                     "packagePartNumber": "",                     "packageSerialNumber": ""                 }             ]         },         "enumeration": null,         "firmwareUpdate": {             "isUpdating": false,             "msa": null,             "powerwalls": null,             "pvInverters": null,             "sync": null         },         "inverterSelfTests": null,         "phaseDetection": null     },     "neurio": {         "isDetectingWiredMeters": false,         "pairings": [],         "readings": []     },     "pw3Can": {         "firmwareUpdate": {             "isUpdating": false,             "progress": null         }     },     "system": {         "sitemanagerStatus": {             "isRunning": true         },         "time": "2024-06-22T15:18:31-06:00",         "updateUrgencyCheck": null     } }
###/tedapi/config
{     "vin": "1707000-00-J--TG9999999999XP",     "meters": [         {             "location": "site",             "type": "msa",             "cts": [                 true,                 true,                 false,                 false             ],             "inverted": [                 false,                 false,                 false,                 false             ],             "connection": {                 "short_id": "1707000-00-J--TG9999999999XP",                 "device_serial": "TG999999999DEG",                 "https_conf": {}             }         }     ],     "battery_blocks": [         {             "vin": "1707000-00-J--TG9999999999XP",             "min_soe": 0,             "max_soe": 100,             "type": "Powerwall3",             "can_connection": "can1",             "pvi_power_status": "on",             "battery_power_status": "on",             "enable_inverter_battery_meter": true,             "enable_inverter_solar_meter": true         }     ],     "island_contactor_controller": {         "type": "msa",         "connection": {             "can_connection": "can0"         },         "background_fw_update": true     },     "island_config": {         "low_soe_limit": 0,         "jump_start_soe_threshold": 0,         "wait_for_solar_soe_threshold": 10,         "wait_for_solar_retry_soe": 0,         "max_frequency_shift_hz": 0.2     },     "dio": {},     "site_info": {         "customer_preferred_export_rule": "pv_only",         "battery_commission_date": "2024-03-07T10:27:32-07:00",         "backup_reserve_percent": 52.5,         "max_site_meter_power_ac":<PHONE_NUMBER>,         "min_site_meter_power_ac": -1000000000,         "nominal_system_energy_ac": 13.5,         "nominal_system_power_ac": 11.5,         "grid_code": "60Hz_240V_s_SMC_IEEE1547-2018_Category-III_PW3",         "country": "United States",         "state": "***",         "distributor": "*",         "utility": "***",         "retailer": "*",         "region": "IEEE1547-2018_Category-III",         "site_name": "My Home",         "timezone": "***",         "ITC_cliff": 0,         "disallow_charge_from_grid_with_solar_installed": true,         "panel_max_current": 200     },     "strategy": {         "control": "lps",         "forecast_method": "exm1dmc",         "pv_forecast_method": "exmMaax",         "TOU_mode": "economic"     },     "default_real_mode": "self_consumption",     "enable_inverter_meter_readings": true,     "freq_support_parameters": {         "target_soe": 0,         "low_soe_limit": 0,         "high_soe_limit": 0,         "offset_gain": 0,         "max_charge_power_offset": 0,         "max_discharge_power_offset": 0     },     "solar": {         "brand": "",         "model": "",         "power_rating_watts": 0     },     "logging": {         "datapump_log_rate_ms": 2000     },     "installer": {         "email": "***",         "customer_id": "***",         "company": "***",         "solar_installation_type": "PV Panel",         "run_sitemaster": true,         "verified_config": true     },     "customer": {         "registered": true     },     "industrial_networks": {},     "auto_meter_update": true,     "bridge_inverter": {         "enabled": false,         "end_time": "0001-01-01T00:00:00Z"     },     "test_timers": {} }
###/alerts
[     "SelfConsumptionReservedLimit",     "SystemConnectedToGrid",     "FWUpdateSucceeded",     "SystemGridConnected" ]
###/vitals
{     "STSTSM--1707000-00-J--TG9999999999XP": {         "STSTSM-Location": "Gateway",         "alerts": [             "SelfConsumptionReservedLimit",             "SystemConnectedToGrid",             "FWUpdateSucceeded"         ],         "firmwareVersion": null,         "lastCommunicationTime": null,         "manufacturer": "TESLA",         "partNumber": "1707000-00-J",         "serialNumber": "TG9999999999XP",         "teslaEnergyEcuAttributes": {             "ecuType": 207         }     },     "TESLA--": {         "componentParentDin": "STSTSM--1707000-00-J--TG9999999999XP",         "lastCommunicationTime": null,         "manufacturer": "TESLA",         "meterAttributes": {             "meterLocation": [                 1             ]         },         "serialNumber": ""     },     "TESYNC----": {         "ISLAND_FreqL1_Load": 60,         "ISLAND_FreqL1_Main": 60,         "ISLAND_FreqL2_Load": 60,         "ISLAND_FreqL2_Main": 60,         "ISLAND_FreqL3_Load": 0,         "ISLAND_FreqL3_Main": 0,         "ISLAND_GridConnected": "ISLAND_GridConnected_Connected",         "ISLAND_GridState": "ISLAND_GridState_Grid_Compliant",         "ISLAND_L1L2PhaseDelta": null,         "ISLAND_L1L3PhaseDelta": null,         "ISLAND_L1MicrogridOk": null,         "ISLAND_L2L3PhaseDelta": null,         "ISLAND_L2MicrogridOk": null,         "ISLAND_L3MicrogridOk": null,         "ISLAND_PhaseL1_Main_Load": null,         "ISLAND_PhaseL2_Main_Load": null,         "ISLAND_PhaseL3_Main_Load": null,         "ISLAND_ReadyForSynchronization": null,         "ISLAND_VL1N_Load": 118,         "ISLAND_VL1N_Main": 118.5,         "ISLAND_VL2N_Load": 118.5,         "ISLAND_VL2N_Main": 118.5,         "ISLAND_VL3N_Load": 0,         "ISLAND_VL3N_Main": 0,         "METER_X_CTA_I": 0,         "METER_X_CTA_InstReactivePower": 0,         "METER_X_CTA_InstRealPower": 0,         "METER_X_CTB_I": 0,         "METER_X_CTB_InstReactivePower": 0,         "METER_X_CTB_InstRealPower": 0,         "METER_X_CTC_I": 0,         "METER_X_CTC_InstReactivePower": 0,         "METER_X_CTC_InstRealPower": 0,         "METER_X_LifetimeEnergyExport": null,         "METER_X_LifetimeEnergyImport": null,         "METER_X_VL1N": 0,         "METER_X_VL2N": 0,         "METER_X_VL3N": 0,         "METER_Y_CTA_I": 0,         "METER_Y_CTA_InstReactivePower": 0,         "METER_Y_CTA_InstRealPower": 0,         "METER_Y_CTB_I": 0,         "METER_Y_CTB_InstReactivePower": 0,         "METER_Y_CTB_InstRealPower": 0,         "METER_Y_CTC_I": 0,         "METER_Y_CTC_InstReactivePower": 0,         "METER_Y_CTC_InstRealPower": 0,         "METER_Y_LifetimeEnergyExport": null,         "METER_Y_LifetimeEnergyImport": null,         "METER_Y_VL1N": 0,         "METER_Y_VL2N": 0,         "METER_Y_VL3N": 0,         "SYNC_ExternallyPowered": null,         "SYNC_SiteSwitchEnabled": null,         "alerts": [],         "componentParentDin": "STSTSM--1707000-00-J--TG9999999999XP",         "firmwareVersion": null,         "manufacturer": "TESLA",         "partNumber": "",         "serialNumber": "",         "teslaEnergyEcuAttributes": {             "ecuType": 259         }     },     "VITALS": {         "gateway": "<IP_ADDRESS>",         "pyPowerwall": "0.10.6",         "text": "Device vitals generated from Tesla Powerwall Gateway TEDAPI",         "timestamp":<PHONE_NUMBER>.434108     } }
A few screenshots from the app.

I can't find the fault in any of those URLs. Payloads are attached, please notice I masked any serial numbers or identifiable data.

Thank you!  I'm going to look through this to see if there is anything I'm missing that may be PW3 only related.

About the strings, the data must be there somewhere since it is available in the Tesla One app. I'm working on grabbing the network packets between the app and the PW. Will share if I find something useful.

That would be fantastic! All my work so far is baed on having a PW2 and PW+. I don't have a PW3 to test. I suspect there could be other API endpoints or payloads that get the additional data. Let us know if you find anytthing!

@jasonacox Thanks for all your work on this! I have two Powerwall 3s installed very recently and I am able to see the dashboard successfully. But, I was not seeing any string related data yet. I noticed that your latest release  has support for retrieving string data. I just upgraded to the latest and I still don't see the string data on my dashboard. To upgrade, I ran the upgrade.sh script. Any thoughts on what I might be missing?

I also have a couple of recently installed Powerwall 3s and I am seeing the string data in the dashboard.  I did do a fresh install via setup.sh (not an upgrade), so I don't know if that had an impact.  @jasonacoxhttps://github.com/jasonacox  - I also want to thank you for all the work you have done on this.

From: RMotapar @.>
Sent: Saturday, September 7, 2024 5:57 AM
To: jasonacox/Powerwall-Dashboard @.>
Cc: Subscribed @.***>
Subject: Re: [jasonacox/Powerwall-Dashboard] Powerwall 3 Support (Issue #387)
@jasonacoxhttps://github.com/jasonacox  Thanks for all your work on this! I have two Powerwall 3s installed very recently and I am able to see the dashboard successfully. But, I was not seeing any string related data yet. I noticed that your latest release https://github.com/jasonacox/pypowerwall/releases/tag/v0.11 has support for retrieving string data. I just upgraded to the latest and I still don't see the string data on my dashboard. To upgrade, I ran the upgrade.sh script. Any thoughts on what I might be missing?
—
Reply to this email directly, view it on GitHubhttps://github.com/jasonacox/Powerwall-Dashboard/issues/387#issuecomment-2335179037, or unsubscribehttps://github.com/notifications/unsubscribe-auth/APUXY3DYMOHZVQPWTXOXSETZVLZ3BAVCNFSM6AAAAAA7RJOQ36VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDGMZVGE3TSMBTG4.
You are receiving this because you are subscribed to this thread.

@heynorm - That's great news! ❤ Thanks for the encouragement! Would you be willing to share a screenshot of your dashboard that shows the strings? I took some guesses building the CQs and queries and would love to see how it is working.
@rmotapar - To get the string data, you will need to use the local (and routed) <IP_ADDRESS> extended device metrics endpoint which is where the tedapi API lives.
Can you share what you get by running the verify.sh script or http://localhost:8675/help?  If you see that you are running cloud mode, you will need to make some changes.  Make sure you have the network routing set up (see here) so that you can ping <IP_ADDRESS> from the host that runs the Dashboard, and then rerun setup.sh as @heynorm mentions but select option 4 (Powerwall 3 using the local Tesla Gateway).

@rmotapar - To get the string data, you will need to use the local (and routed) <IP_ADDRESS> extended device metrics endpoint which is where the tedapi API lives.

Yes, I am using the tedapi and I added a static route in my Unifi router so all devices in my network can access/ping <IP_ADDRESS>. Tested via curl and I am able to invoke the tedapi endpoints successfully.
I did customize my dashboard a bit to make it work through reverse proxy so I may have messed up something.  @heynorm thanks for reporting that string data is working for you. I will do a fresh install and will report back the results.
P.S We might want to add instructions on how to add static routes at the router level so one doesn't have to run the ip route commands on each node that needs access to <IP_ADDRESS>.

@jasonacox  Here are the results of the verify.sh script. It does say Not Connected under TEDAPI Vitals.
`Verify Powerwall-Dashboard 4.5.1 on Linux - Timezone: America/Chicago
This script will attempt to verify all the services needed to run
Powerwall-Dashboard. Use this output when you open an issue for help:
https://github.com/jasonacox/Powerwall-Dashboard/issues/new
Checking pypowerwall

Config File pypowerwall.env: GOOD
Container (pypowerwall): GOOD
Service (port 8675): GOOD
Version: 0.11.0 Proxy t64
Powerwall State: CONNECTED - Firmware: 24.28.1
Site Name: My Home
Gateway TEDAPI: Available (<IP_ADDRESS>)
TEDAPI Vitals: Not Connected
Cloud Mode: NO
`

P.S We might want to add instructions on how to add static routes at the router level so one doesn't have to run the ip route commands on each node that needs access to <IP_ADDRESS>.

That is one option, but I have been hesitant to do that because it opens up this protected installer API of your Powerwall to your entire LAN traffic. Technically it shouldn't matter if everything on your network behaves well. But more important, my router won't allow static routes so I focused on host level routes. 😉 If someone who has a Unifi wants to write up the details in a Discussion thread or PR, I would gladly add that link to the setup instructions. 🙏

P.S We might want to add instructions on how to add static routes at the router level so one doesn't have to run the ip route commands on each node that needs access to <IP_ADDRESS>.

That is one option, but I have been hesitant to do that because it opens up this protected installer API of your Powerwall to your entire LAN traffic. Technically it shouldn't matter if everything on your network behaves well. But more important, my router won't allow static routes so I focused on host level routes. 😉 If someone who has a Unifi wants to write up the details in a Discussion thread or PR, I would gladly add that link to the setup instructions. 🙏

Yeah, totally makes sense to be cautious about opening up the protected installer API to entire LAN. I will see if I can create a PR.

Here are the results of the verify.sh script. It does say Not Connected under TEDAPI Vitals.

Yes, that is a bug - thanks to @SCHibbard who reported it here:  https://github.com/jasonacox/Powerwall-Dashboard/issues/515
I did change the dashboard.json to add the additional PW3 strings (E & F) and to account for multiple PW3's.  Are you still not getting string data? Can you check a few of these (you probably don't want to post them, just check to see if they contain the string data payloads):
http://localhost:8675/tedapi/status - this is the raw API that the Tesla One app uses for live data
http://localhost:8675/tedapi/config - this is the API that shows the system config data
http://localhost:8675/strings

Just updated from 4.3.2 to 4.5.1 yesterday, and tackled the network mods (running on Ubuntu). Like @jasonacox, a little hesitant to place the static route in my router, but don't like that lack of persistence of the setting over reboots. Putting the command in a cron task causes it to fire before the network is ready, so did & Q&D script to run in cron:
#!/bin/bash
declare -i i=0
while (( i < 15 )); do
RETURN="$(ip route add <IP_ADDRESS>/24 via <IP_ADDRESS> 2>&1)"
if [ "$RETURN" != "RTNETLINK answers: File exists" ]; then
declare -i i=i+1
sleep 1
else
RETURN="Success"
break
fi
done
NOW="$(date)"
echo "${NOW}: result=${RETURN}, delay=${i}" >> /home/scott/bin/PW_routing.log

Jason,
Here is a snapshot of the string stuff in the dashboard for yesterday along with the output from http://localhost:8675/strings run just now:
[cid:10bb71ff-7d61-4d0a-8f8f-5a0d892599d9]
{
"A": {
"Connected": true,
"Current": 0.6999999999999997,
"Power":<PHONE_NUMBER>9999992,
"State": "Pv_Active",
"Voltage": 322
},
"A1": {
"Connected": true,
"Current": 3.6999999999999997,
"Power": 1132.1999999999998,
"State": "Pv_Active",
"Voltage": 306
},
"B": {
"Connected": true,
"Current": 0.6999999999999997,
"Power":<PHONE_NUMBER>999999,
"State": "Pv_Active",
"Voltage": 376
},
"B1": {
"Connected": true,
"Current": 3.15,
"Power": 856.8,
"State": "Pv_Active",
"Voltage": 272
},
"C": {
"Connected": true,
"Current": 0.7499999999999997,
"Power":<PHONE_NUMBER>999999,
"State": "Pv_Active",
"Voltage": 300
},
"C1": {
"Connected": true,
"Current": 3.3,
"Power": 1069.2,
"State": "Pv_Active",
"Voltage": 324
},
"D": {
"Connected": true,
"Current": 0.04999999999999964,
"Power": 0.0,
"State": "Pv_Active",
"Voltage": 0
},
"D1": {
"Connected": true,
"Current": 0,
"Power": 0,
"State": "Pv_Active",
"Voltage": 0
},
"E": {
"Connected": true,
"Current": 0,
"Power": 0,
"State": "Pv_Active",
"Voltage": 0
},
"E1": {
"Connected": true,
"Current": 0,
"Power": 0,
"State": "Pv_Active",
"Voltage": 0
},
"F": {
"Connected": true,
"Current": 0,
"Power": 0,
"State": "Pv_Active_Parallel",
"Voltage": 0
},
"F1": {
"Connected": true,
"Current": 0,
"Power": 0,
"State": "Pv_Active_Parallel",
"Voltage": 0
}
}
Let me know if you need more details about my config.

From: Jason Cox @.>
Sent: Saturday, September 7, 2024 7:25 AM
To: jasonacox/Powerwall-Dashboard @.>
Cc: heynorm @.>; Mention @.>
Subject: Re: [jasonacox/Powerwall-Dashboard] Powerwall 3 Support (Issue #387)
@heynormhttps://github.com/heynorm - That's great news! ❤ Thanks for the encouragement! Would you be willing to share a screenshot of your dashboard that shows the strings? I took some guesses building the CQs and queries and would love to see how it is working.
@rmotaparhttps://github.com/rmotapar - To get the string data, you will need to use the local (and routed) <IP_ADDRESS> extended device metrics endpoint which is where the tedapi API lives.
Can you share what you get by running the verify.sh script or http://localhost:8675/help? If you see that you are running cloud mode, you will need to make some changes. Make sure you have the network routing set up (see herehttps://github.com/jasonacox/Powerwall-Dashboard?tab=readme-ov-file#extended-device-vitals-metrics-beta) so that you can ping <IP_ADDRESS> from the host that runs the Dashboard, and then rerun setup.sh as @heynormhttps://github.com/heynorm mentions but select option 4 (Powerwall 3 using the local Tesla Gateway).
—
Reply to this email directly, view it on GitHubhttps://github.com/jasonacox/Powerwall-Dashboard/issues/387#issuecomment-2335235418, or unsubscribehttps://github.com/notifications/unsubscribe-auth/APUXY3FHXVG7II6G6MCXJ73ZVMEFLAVCNFSM6AAAAAA7RJOQ36VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDGMZVGIZTKNBRHA.
You are receiving this because you were mentioned.

Jason - resposting with the screenshot for the above comment:

Thanks @heynorm ! That looks great! It may be nice to disable the ghost strings automatically but from what you show in the graph, it seems they do get some phantom power occasionally.

Thanks @SCHibbard  - nice script! Thanks for sharing. MacOS and Windows have an easy way to set persistent routes, but Linux seems to have dozens of ways and they are all "non-trivial".  I wonder if it would be helpful to have a setup-route.sh script (or part of setup.sh) that will detect OS and do the needful for you? Of course, it would be optional and those who want to set it up via their router could still do so.

Yeah - I see that phantom power on the ghost strings in the Tesla One app as well.  I wonder what that is all about.

From: Jason Cox @.>
Sent: Saturday, September 7, 2024 11:35 AM
To: jasonacox/Powerwall-Dashboard @.>
Cc: heynorm @.>; Mention @.>
Subject: Re: [jasonacox/Powerwall-Dashboard] Powerwall 3 Support (Issue #387)
Thanks @heynormhttps://github.com/heynorm ! That looks great! It may be nice to disable the ghost strings automatically but from what you show in the graph, it seems they do get some phantom power occasionally.
—
Reply to this email directly, view it on GitHubhttps://github.com/jasonacox/Powerwall-Dashboard/issues/387#issuecomment-2336401101, or unsubscribehttps://github.com/notifications/unsubscribe-auth/APUXY3CUOEP7ZG77UJRQJPDZVNBQHAVCNFSM6AAAAAA7RJOQ36VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDGMZWGQYDCMJQGE.
You are receiving this because you were mentioned.Message ID: @.***>

http://localhost:8675/strings

@jasonacox /status and /config seem to be working but /strings returns an empty response. I reinstalled the entire thing from scratch. Not sure what I am missing.

New PW3 strings support, additional Alerts & PW capacity data is amazing, thank you!

@jasonacox Here's the error I am seeing in pypowerwall when /strings endpoint is being called:
----------------------------------------
Exception occurred during processing of request from ('<IP_ADDRESS>', 54858)
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/socketserver.py", line 683, in process_request_thread
    self.finish_request(request, client_address)
  File "/usr/local/lib/python3.10/socketserver.py", line 360, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/local/lib/python3.10/socketserver.py", line 747, in __init__
    self.handle()
  File "/usr/local/lib/python3.10/http/server.py", line 433, in handle
    self.handle_one_request()
  File "/usr/local/lib/python3.10/http/server.py", line 421, in handle_one_request
    method()
  File "/app/server.py", line 348, in do_GET
    message: str = pw.strings(jsonformat=True) or json.dumps({})
  File "/usr/local/lib/python3.10/site-packages/pypowerwall/__init__.py", line 398, in strings
    v: dict = self.vitals() or {}
  File "/usr/local/lib/python3.10/site-packages/pypowerwall/__init__.py", line 378, in vitals
    output = self.client.vitals()
  File "/usr/local/lib/python3.10/site-packages/pypowerwall/tedapi/pypowerwall_tedapi.py", line 552, in vitals
    return self.tedapi.vitals()
  File "/usr/local/lib/python3.10/site-packages/pypowerwall/tedapi/__init__.py", line 1291, in vitals
    pw3_data = self.get_pw3_vitals(force) or {}
  File "/usr/local/lib/python3.10/site-packages/pypowerwall/tedapi/__init__.py", line 633, in get_pw3_vitals
    for alert in components[component][0]['activeAlerts']:
IndexError: list index out of range
----------------------------------------

@jasonacox It seems related to the second powerwall I have (the follower). I ran the PW3_String.py script and it gave me the same error. I do see the string data for the main powerwall but it errored out when fetching the string data for the follower
 + Fetching ComponentsQuery from Powerwall (XXXXXXXXMAIN  Powerwall3)...
    - Alerts:
       - Alert: BAGGR_a003_BAGGR_Controller_Mia
       - Alert: BMS_a014_SW_End_Of_Charge
       - Alert: HVP_a046_SW_BRICK_DVDT_PYRO_WARNING
       - Alert: PWS_a004_MciSelfTestEF
    - PW1 Nominal Energy Remaining: 14.47 Nominal Full Pack Energy: 14.47 Energy to be Charged: 0.0
    - String A = State: Pv_Active Voltage: 118 Current: 0.7999999999999997 Power: 94.39999999999996
    - String B = State: Pv_Active Voltage: 234 Current: 0.9499999999999997 Power:<PHONE_NUMBER>9999993
    - String C = State: Pv_Active Voltage: 392 Current: 4.35 Power: 1705.1999999999998
    - String D = State: Pv_Active Voltage: 342 Current: 8.85 Power: 3026.7
    - String E = State: Pv_Active Voltage: 0 Current: 0.04999999999999964 Power: 0.0
    - String F = State: Pv_Active_Parallel Voltage: 0 Current: -3.608224830031759e-16 Power: -0.0
 + Fetching ComponentsQuery from Powerwall (XXXXXXXXFOLLOWER Powerwall3Follower)...
    - Alerts:
Traceback (most recent call last):
  File "/home/rammy/dev/docker/solar/pypowerwall/tools/tedapi/PW3_Strings.py", line 182, in <module>
    for alert in components[component][0]['activeAlerts']:
IndexError: list index out of range

Created a PR  on pypowerwall. Please take a look. With the change, I am seeing the right output.

I am seeing the same error for pw.temps() as well.

Can you share what you see with that? Sadly, we lost access to temps in the new Firmware vitals payload, but want to make sure it isn't some other logic bug.

@rmotapar I hope that the new update fixes the string issue you identified: v4.5.2
./update.sh

@rmotapar I hope that the new update fixes the string issue you identified: v4.5.2
./update.sh

Thank you @jasonacox  It's working beautifully! Thank you so much for the quick turn around. Data just started showing up on the dashboard. Here's how it looks:

Fantastic!! Thanks @rmotapar!

I am seeing the same error for pw.temps() as well.

Can you share what you see with that? Sadly, we lost access to temps in the new Firmware vitals payload, but want to make sure it isn't some other logic bug.

Here's what I saw in the logs with pypowerwall:0.11.0
Exception occurred during processing of request from ('<IP_ADDRESS>', 59472)
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/socketserver.py", line 683, in process_request_thread
    self.finish_request(request, client_address)
  File "/usr/local/lib/python3.10/socketserver.py", line 360, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/local/lib/python3.10/socketserver.py", line 747, in __init__
    self.handle()
  File "/usr/local/lib/python3.10/http/server.py", line 433, in handle
    self.handle_one_request()
  File "/usr/local/lib/python3.10/http/server.py", line 421, in handle_one_request
    method()
  File "/app/server.py", line 378, in do_GET
    temps = pw.temps()
  File "/usr/local/lib/python3.10/site-packages/pypowerwall/__init__.py", line 566, in temps
    devices: dict = self.vitals() or {}
  File "/usr/local/lib/python3.10/site-packages/pypowerwall/__init__.py", line 378, in vitals
    output = self.client.vitals()
  File "/usr/local/lib/python3.10/site-packages/pypowerwall/tedapi/pypowerwall_tedapi.py", line 552, in vitals
    return self.tedapi.vitals()
  File "/usr/local/lib/python3.10/site-packages/pypowerwall/tedapi/__init__.py", line 1291, in vitals
    pw3_data = self.get_pw3_vitals(force) or {}
  File "/usr/local/lib/python3.10/site-packages/pypowerwall/tedapi/__init__.py", line 633, in get_pw3_vitals
    for alert in components[component][0]['activeAlerts']:
IndexError: list index out of range

With the latest pypowerwall:0.11.1, I am not seeing any of these but /temps is returning an empty response.

With the latest pypowerwall:0.11.1, I am not seeing any of these but /temps is returning an empty response.

Yes, the temps are likely gone forever. 😞 If anyone manages to spot temps on any of the API or the app, please let me know. 😉 The error you were seeing before was essentially the same one that impacted /strings (part of get_pw3_vitals()).

Thanks @SCHibbard  - nice script! Thanks for sharing. MacOS and Windows have an easy way to set persistent routes, but Linux seems to have dozens of ways and they are all "non-trivial".  I wonder if it would be helpful to have a setup-route.sh script (or part of setup.sh) that will detect OS and do the needful for you? Of course, it would be optional and those who want to set it up via their router could still do so.

@jasonacox: thought about it being in setup.sh, but need sudo to add the task to cron - so yes, not so simple. You'd think an OS used on so many servers would have set this up as optionally persistent by now!

Thought about the cron / sudo issue, and figure it's not a big deal if a script asks for su credentials during install.  Created a script to build the crontask script and edit crontab.  Will test it on my production system probably next weekend.  @jasoncox: Would you like that as a separate script, should I try to build it into your setup.sh, or do you want to merge it into setup.sh?

Awesome! And good question. I'm tending to favor keeping it as a separate script, similar to tz.sh and weather.sh. That would make it easier for users wanting to do a manual install, or for existing installs that are using temp routes to activate a persistent route. We could still have setup.sh call it if the user wishes.

@jasonacox :  attached the script I used to create the TDAPI network routing script and add its cron task. Played with it on my sandbox, and today got a chance to upgrade Powerwall Dashboard on my production system, so tried it there.  Worked fine! Note changed extension from .sh to .txt so GitHub issues would accept it.
TDAPI_network.txt

Thank you all for running with this. I just finished my install of PW3 & solar; joining one of the Tesla Electric VPP here in Texas. I got the netzero hosted app to work fine, running it locally has been a pile though. Your efforts are awesome and I appreciate all your work.

Thanks for the kind feedback @jukasdrj !