Tesla Powerwall 3 Integration using PyPowerwall Proxy & HTTP Binding

Update: This has now been edited to use the pypowerwall ‘convenience’ (/pw) endpoints

So after having a play with the OH Powerwall binding, it looks like at this stage it doesn’t support the Powerwall 3. I needed a fairly quick solution to integrate the PW3 into OpenHAB, so I could monitor status and persist key values.

My requirements don’t include controlling the PW3 - Happy to let it do its own thing there, but arguably you could use the same approach for the controllable values, only thing then, is that requires the cloud API connection from the PyPowerwall Proxy

For others who are looking to do the same, this is a rough how-to guide I have collated from various sources, to get PW3 values back into OpenHAB, with the following high-level steps:

  • Install/Configure WIFI connection on OH server, as client to PW3 WiFi AP
  • Install Docker & Run pypowerwallproxy container
  • Add HTTP Things & Items, to retrieve values from pypowerwall proxy

I have done this all on my local openHAB server, running Ubuntu, but arguably the first 3 steps could be done on a separate device such as a PI Zero 2W (with Ethernet HAT), giving you a dedicated proxying device. You may need to do this, if you are already using, or don’t have a WiFi adapter in your OpenHAB server, and don’t want to add another one in there.

Obviously you will need to interpret and apply your own site/device-specific commands/config.

First things first, you are going to need the WIFI SSID and Wifi Password for the TEDAPI access - There is no access via the local LAN ports to the PW3 API, which was taken away in a recent release (25.10). Take a picture of the WiFi sticker in the main PW3 unit (Not the Gateway Unit), while your installer is connecting things up…

1) Setup WiFi Network Adapter

#install network manager (if not already installed)
sudo apt install network-manager

#list wifi interfaces - In my example below, the wlan interface is wlp3s0
sudo nmcli d

#turn on WiFi
sudo nmcli r wifi on

#List Wifi Networks (Just to check its working, however noting the Powerwall 3 Wifi Network is hidden, so you will not see it in the list)
sudo nmcli d wifi list

#replace <ssid> below with SSID from Powerwall 3 - Will be something like TealsaPW_XXXX, and also replace the ifname with the actual wifi interface name on your system
sudo nmcli c add type wifi con-name powerwall ifname wlp3s0 ssid <ssid>

#replace <password> with password from Powerwall 3
sudo nmcli c modify powerwall wifi-sec.key-mgmt wpa-psk wifi-sec.psk <password>

# The following is optional, to set a fixed IP address, as the PW3 will provide a DCHP IP Address
sudo nmcli con mod "powerwall" \
  ipv4.addresses "192.168.91.50/24" \
  ipv4.gateway "" \
  ipv4.dns "" \
  ipv4.dns-search "" \
  ipv4.method "manual"

#bring up the network
sudo nmcli c up powerwall

#Ping the powerwall - If it responds, you are ready to move onto the next steps
ping 192.168.91.1

2) Install and run pypowerwall proxy in Docker

#If docker is not already installed, execute the following command:
sudo apt install docker.io docker-compose-v2 docker-doc

#'Install' & run the pypowerwall container. Replace the gateway_password, with the one from your PW3, and the timezone with that appropriate to your location

sudo docker run \
        -d \
        -p 8675:8675 \
        -e PW_PORT='8675' \
        -e PW_HOST='192.168.91.1' \
        -e PW_GW_PWD='Gateway_Password' \
        -e PW_TIMEZONE='Pacific/Auckland' \
        -e TZ='Pacific/Auckland' \
        -e PW_CACHE_EXPIRE='5' \
        -e PW_DEBUG='no' \
        -e PW_HTTPS='no' \
        -e PW_STYLE='clear' \
        --name pypowerwall \
        --restart unless-stopped \
        jasonacox/pypowerwall

The container will restart following reboots. Documentation for the proxy can be found at pypowerwall/proxy at main · jasonacox/pypowerwall · GitHub

Browse to your openhab server, on port 8675 (http://openhabserveraddress:8675/ ), and you should then see a animated graphic similar to the following:

This means you should be ready to move onto the next step, of setting up OpenHAB itself.

  1. Setup OpenHAB Things
    This assumes you have got the HTTP binding installed already, and the baseURL below assumes you are using your OpenHAB server to run the pypowerwall proxy container:

The below is a sample of a few channels

UID: http:url:powerwall3_http
label: Powerwall 3 via pypowerwall proxy
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://localhost:8675
  delay: 1000
  stateMethod: GET
  refresh: 10
  commandMethod: GET
  timeout: 10000
  bufferSize: 2048
channels:
  - id: last-failure
    channelTypeUID: http:request-date-time
    label: Last Failure
    configuration: {}
  - id: last-success
    channelTypeUID: http:request-date-time
    label: Last Success
    configuration: {}
  - id: pw3BatteryLevel
    channelTypeUID: http:string
    label: Powerwall 3 Battery Level
    description: Powerwall 3 Battery Level via HTTP pypowerwall proxy
    configuration:
      mode: READONLY
      stateExtension: /pw/level
  - id: pw3BatteryPower
    channelTypeUID: http:string
    label: Powerwall 3 Battery Power
    description: Powerwall 3 BatteryPower via HTTP pypowerwall proxy
    configuration:
      mode: READONLY
      stateExtension: /pw/power
  - id: pw3SitePower
    channelTypeUID: http:string
    label: Powerwall 3 Site Power
    description: Powerwall 3 Site Power via HTTP pypowerwall proxy
    configuration:
      mode: READONLY
      stateExtension: /pw/power
  - id: pw3LoadPower
    channelTypeUID: http:string
    label: Powerwall 3 Load Power
    description: Powerwall 3 Load Power via HTTP pypowerwall proxy
    configuration:
      mode: READONLY
      stateExtension: /pw/power
  - id: pw3SolarTotalPower
    channelTypeUID: http:string
    label: Powerwall 3 Total Solar Power
    description: Powerwall 3 Total Solar Power via HTTP pypowerwall proxy
    configuration:
      mode: READONLY
      stateExtension: /pw/power
  - id: pw3MPPTAPower
    channelTypeUID: http:string
    label: Powerwall 3 MPPT A Power
    description: Powerwall 3 MPPT A Power via HTTP pypowerwall proxy
    configuration:
      mode: READONLY
      stateExtension: /pw/strings
  - id: pw3MPPTBPower
    channelTypeUID: http:string
    label: Powerwall 3 MPPT B Power
    description: Powerwall 3 MPPT B Power via HTTP pypowerwall proxy
    configuration:
      mode: READONLY
      stateExtension: /pw/strings
  - id: pw3MPPTCPower
    channelTypeUID: http:string
    label: Powerwall 3 MPPT C Power
    description: Powerwall 3 MPPT C Power via HTTP pypowerwall proxy
    configuration:
      mode: READONLY
      stateExtension: /pw/strings
  - id: pw3MPPTDPower
    channelTypeUID: http:string
    label: Powerwall 3 MPPT D Power
    description: Powerwall 3 MPPT D Power via HTTP pypowerwall proxy
    configuration:
      mode: READONLY
      stateExtension: /pw/strings
  - id: pw3MPPTEPower
    channelTypeUID: http:string
    label: Powerwall 3 MPPT E Power
    description: Powerwall 3 MPPT E Power via HTTP pypowerwall proxy
    configuration:
      mode: READONLY
      stateExtension: /pw/strings
  - id: pw3MPPTFPower
    channelTypeUID: http:string
    label: Powerwall 3 MPPT F Power
    description: Powerwall 3 MPPT F Power via HTTP pypowerwall proxy
    configuration:
      mode: READONLY
      stateExtension: /pw/strings
  - id: pw3GridStatus
    channelTypeUID: http:string
    label: Powerwall 3 Grid Status
    description: Powerwall 3 Grid Status via HTTP pypowerwall proxy
    configuration:
      mode: READONLY
      stateExtension: /freq
  - id: pw3ProxyStatus
    channelTypeUID: http:string
    label: Powerwall 3 Proxy connection to PW3
    description: Powerwall 3 Proxy connection to PW3 status
    configuration:
      mode: READONLY
      stateExtension: /pw/is_connected

Then from there, you will need link the channels to items, and apply some JSONpath expressions to pull out the specific values related to the items, e.g. for the above channel examples, these would be (Pick whatever names UID’s you want - These are just as examples):

Description Channel ID Item UID JSONpath E Proxy Source
Powerwall 3 Battery Level pw3BatteryLevel PW3_Battery_Level $.level config:js:jsonpath_with_null?path=$.level /pw/level
Powerwall 3 Battery Power pw3BatteryPower PW3_Battery_Power $.battery config:js:jsonpath_with_null?path=$.battery /pw/power
Powerwall 3 Site Power pw3SitePower PW3_Site_Power $.site config:js:jsonpath_with_null?path=$.site /pw/power
Powerwall 3 Load Power pw3LoadPower PW3_Load_Power $.load config:js:jsonpath_with_null?path=$.load /pw/power
Powerwall 3 Total Solar Power pw3SolarTotalPower PW3_Total_Solar_Power $.solar config:js:jsonpath_with_null?path=$.solar /pw/power
Powerwall 3 MPPT A Power pw3MPPTAPower Powerwall_3_MPPT_A_Power $.*.PVAC_PVMeasuredPower_A config:js:jsonpath_with_null?path=$.*.PVAC_PVMeasuredPower_A /pw/strings
Powerwall 3 MPPT B Power pw3MPPTBPower Powerwall_3_MPPT_B_Power $.*.PVAC_PVMeasuredPower_B config:js:jsonpath_with_null?path=$.*.PVAC_PVMeasuredPower_B /pw/strings
Powerwall 3 MPPT C Power pw3MPPTCPower Powerwall_3_MPPT_C_Power $.*.PVAC_PVMeasuredPower_C config:js:jsonpath_with_null?path=$.*.PVAC_PVMeasuredPower_C /pw/strings
Powerwall 3 MPPT D Power pw3MPPTDPower Powerwall_3_MPPT_D_Power $.*.PVAC_PVMeasuredPower_D config:js:jsonpath_with_null?path=$.*.PVAC_PVMeasuredPower_D /pw/strings
Powerwall 3 MPPT E Power pw3MPPTEPower Powerwall_3_MPPT_E_Power $.*.PVAC_PVMeasuredPower_E config:js:jsonpath_with_null?path=$.*.PVAC_PVMeasuredPower_E /pw/strings
Powerwall 3 MPPT F Power pw3MPPTFPower Powerwall_3_MPPT_F_Power $.*.PVAC_PVMeasuredPower_F config:js:jsonpath_with_null?path=$.*.PVAC_PVMeasuredPower_F /pw/strings
Powerwall 3 Grid Status pw3GridStatus Powerwall_3_Grid_Status $.grid_status config:js:1on0offtransform /freq
Powerwall 3 Proxy Status pw3ProxyStatus Powerwall_3_Proxy_Status $.is_connected config:js:PW3_proxy_trueOnfalseOff /pw/is_connected

For the grid status the following is the config:js:1on0offtransform contents:

(function(data) {
  var returnValue = JSON.parse(input).grid_status
  if (returnValue == '0') {
        return 'OFF';
    } else 
      if (returnValue == "1") {
        return 'ON';
    } else
      return ""
})(input)

And for the proxy status, the following is the config:js:PW3_proxy_trueOnfalseOff contents:

(function(data) {
  var returnValue = JSON.parse(input).is_connected
  if (returnValue == false) {
        return 'OFF';
    } else 
      if (returnValue == true) {
        return 'ON';
    } else
      return "OFF"
})(input)

As an alternate to using JSONPATH channel transforms (which choke and raise an error in the OpenHAB log), you can push the transforms into the following script config:js:jsonpath_with_null and then parse in the JSONPATH using ‘?path=’ in the call. I have added a column to the above table to show the transforms required for each example item.

(function(data) {
    if (data === "null" || data === null || data === "") {
        return "UNDEF"; 
    }
    
    try {
        return actions.Transformation.transform("JSONPATH", path, data);
    } catch (e) {
        return "UNDEF";
    }
})(input)

Whilst the status of the ‘thing’ will change if the Proxy stops responding, the is_connected channel is useful to inform OpenHAB if the Proxy has lost connection to the Powerwall itself.

Note that the 10000ms timeout is required for the HTTP Thing for this to work however - Most requests complete in subsecond time, but if the Proxy loses connection to the Powerwall, all Proxy responses take longer, (most will return a null), however the is_connected will also take longer, and we want it to return a false, so we can tell OpenHab that the Powerwall network connection is offline, rather than it just timing out.

There are a ton of other stats available via the Proxy, but also refer to the proxy documentation for some cases where data is not available for the PW3 (The proxy also supports predecessor versions).

Note for the MPPT Power Readings, I use a wildcard in the JSONpath - The powerwall unit ID/serial number forms part of the path, and the wildcard works just fine… if you only have one Powerwall !! I assume this section may be repeated, if you have multiple units on your site, in which case you will just need to replace the wildcard with the specific ID’s for each unit.

A note for those in New Zealand & Australia:

  • There are 6 logical string values in the PW3 interface
  • For those in North America etc, they can use the 6 string values individually, as this matches the 6 physical MPPT inputs on the PW3
  • For those of us at the bottom of the world (NZ/Aus), the PW3 ships with only 3 physical MPPT inputs, but still displays 6 string values in the interface
  • In essence, it looks like the inputs are paired (physically jumpered together) to provide higher current capacity, so to get the readings for the 3 physical MPPT inputs, you will need to add A+B, C+D,E+F to get the correct total current and power for each string. Obviously you don’t need to do that for voltage, and can just take that value for A,C,E which will/should be identical to their paired inputs.
        "PVAC_PVCurrent_A": 0,
        "PVAC_PVCurrent_B": 0,
        "PVAC_PVCurrent_C": 0,
        "PVAC_PVCurrent_D": 0,
        "PVAC_PVCurrent_E": 0,
        "PVAC_PVCurrent_F": 0,
        "PVAC_PVMeasuredPower_A": 0,
        "PVAC_PVMeasuredPower_B": 0,
        "PVAC_PVMeasuredPower_C": 0,
        "PVAC_PVMeasuredPower_D": 0,
        "PVAC_PVMeasuredPower_E": 0,
        "PVAC_PVMeasuredPower_F": 0,
        "PVAC_PVMeasuredVoltage_A": 2,
        "PVAC_PVMeasuredVoltage_B": 2,
        "PVAC_PVMeasuredVoltage_C": 6,
        "PVAC_PVMeasuredVoltage_D": 6,
        "PVAC_PVMeasuredVoltage_E": 22,
        "PVAC_PVMeasuredVoltage_F": 22,

I will continue to add to this post (Including my final findings/setup on the string values), as I expand on my usage of the statistics, but really, once you have the above data coming into OpenHAB, you can apply your usual persistence, and presentation approaches, including use of some of the ‘Energy’ widgets others have so kindly created.

Hope this helps

I don’t have a PW3 here to test with - but if you can increase logging to Trace with the Powerwall binding and send me the logs, I can take a look.

Hi Paul,
Cheers for the response - I’m guessing it would be a reasonable change for the binding to support the PW3, given the research and analysis in the below thread (With the PW3 using tedapi)

I just put this workaround post using the powerwallproxy & http binding in the forum solutions category, in case anyone else needed a quick workaround.

I would be keen to assist as best I can, extension of the OH binding to include PW3 support, but for the moment I need to leave the workaround in place probably for a few months to monitor/capture performance, as our PW3 was doing some crazy-dumb things around the ‘OptiCast’ optimisation. I’m also keen to persist individual string performance in the near term, for analysis as well

This (‘crazy optimisation’) seems to have been fixed via the lastest firmware release, but want to monitor and see that it settles down. Unfortunately that was the same firmware release which took away access to TEDAPI via lan, so had to order/setup WiFi card for direct client connection to the PW3, so have a big gap in the stats.

Probably the best idea, is to pickup this discussion via GIT enhancement request to progress this in future, if you are still keen to have a look at PW3 support in future (as well as the extended metrics available for your PW2 etc). [teslapowerwall] Add support for Powerwall TEDAPI (Powerwall 3 support, and Powerwall 2/+ extended metrics) · Issue #18766 · openhab/openhab-addons · GitHub
In all honesty, its probably mainly related to the authentication/token etc, once that is in place, it’s mostly going to just be different end-points, and JSONpath to pull out the values.

But, for now, as requested, the TRACE log is below:

2025-06-07 10:41:30.031 [DEBUG] [ll.internal.TeslaPowerwallWebTargets] - logonjson = {"username":"customer","password":"XXXXXX","email":"xxxxx@yyyyy.com","force_sm_off":false}
2025-06-07 10:41:30.031 [DEBUG] [ll.internal.TeslaPowerwallWebTargets] - Calling url: https://192.168.91.1/api/login/Basic
2025-06-07 10:41:30.032 [TRACE] [ll.internal.TeslaPowerwallWebTargets] - POST request for https://192.168.91.1/api/login/Basic
2025-06-07 10:41:32.525 [DEBUG] [rwall.internal.TeslaPowerwallHandler] - Unexpected error connecting to Tesla Powerwall
org.openhab.binding.teslapowerwall.internal.TeslaPowerwallCommunicationException: {}
	at org.openhab.binding.teslapowerwall.internal.TeslaPowerwallWebTargets.invoke(TeslaPowerwallWebTargets.java:154) ~[?:?]
	at org.openhab.binding.teslapowerwall.internal.TeslaPowerwallWebTargets.getToken(TeslaPowerwallWebTargets.java:111) ~[?:?]
	at org.openhab.binding.teslapowerwall.internal.TeslaPowerwallWebTargets.invoke(TeslaPowerwallWebTargets.java:122) ~[?:?]
	at org.openhab.binding.teslapowerwall.internal.TeslaPowerwallWebTargets.getOperations(TeslaPowerwallWebTargets.java:98) ~[?:?]
	at org.openhab.binding.teslapowerwall.internal.TeslaPowerwallHandler.pollStatus(TeslaPowerwallHandler.java:111) ~[?:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[?:?]
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) ~[?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[?:?]
	at java.lang.Thread.run(Thread.java:1583) [?:?]

Cheers - Glen

Hey Glen, I’ll do some reading of those links.

This tutorial is perfect.

Works flawlessly!

Thank you!

I have added some info to the original post, including using a JS script which handles NULL’s where transient issues occur with the powerwall connection instead of using JSONPATH (Which will throw errors in your log).

You may also from time to time have the PW3 completely drop the TEDAPI connection. It can occur after a firmware update on the PW3, or other random times. This will require the connection to be restarted, which can be done automatically.

I just handle this by creating a rule which runs when Powerwall_3_Proxy_Status state changes from ON to OFF (The following is for Ubuntu based systems, using NMCLI):

actions.Exec.executeCommandLine('/usr/local/bin/reconnect-powerwall.sh');
//console.info("Restarting WLAN interface for Powerwall connection")

Create the script /usr/local/bin/reconnect-powerwall.sh as follows:

#!/bin/bash
# reconnect-powerwall.sh — safely reconnect 'powerwall' Wi-Fi if it's down
# Run as openhab (uses PolicyKit permissions for NetworkManager)
# Logs via the system journal (view with: journalctl -t openhab-powerwall)

TAG="openhab-powerwall"
CONN_NAME="powerwall"

timestamp() {
  date "+%Y-%m-%d %H:%M:%S"
}

log() {
  logger -t "$TAG" "$(timestamp): $1"
}

log "Checking connection status..."

# See if the connection is active
if ! nmcli -t -f NAME connection show --active | grep -qw "$CONN_NAME"; then
    log "Connection '$CONN_NAME' not active — attempting reconnect..."
    if nmcli connection up "$CONN_NAME" >/dev/null 2>&1; then
        log "Successfully reconnected '$CONN_NAME'."
    else
        log "ERROR — failed to reconnect '$CONN_NAME'."
    fi
else
    log "Connection '$CONN_NAME' already active — no action taken."
fi

You’ll also need to change its permissions as follows:

sudo chown root:root /usr/local/bin/reconnect-powerwall.sh
sudo chmod 755 /usr/local/bin/reconnect-powerwall.sh

The openhab user (or whatever user you are using) needs to be granted the privileges to run the nmcli command:

sudo nano /etc/polkit-1/rules.d/49-openhab-nm.rules

And add the following content:

polkit.addRule(function(action, subject) {
    if (subject.user === "openhab" &&
        action.id === "org.freedesktop.NetworkManager.network-control") {
        return polkit.Result.YES;
    }
});

Followed by a:

sudo systemctl restart polkit

Just remember to add the following line to /etc/openhab/misc/exec.whitelist

/usr/local/bin/reconnect-powerwall.sh

to allow OpenHAB to run the above utility.

guys,

any chance to see the Powerwall Binding supporting also Powerwall 3?

thanks

Andrea

I’m not the maintainer, but like my earlier post in this thread, the differences for PW3 seem non-trivial, so a reasonable amount of work for someone to add this support. Ongoing maintenance would also be a reasonable effort, based on my observation of the number of issues addressed over at Issues · jasonacox/pypowerwall · GitHub especially after firmware changes.

I’d be thrilled if there were a native OpenHAB binding supporting the PW3, but I am also happy using the pypowerwall-proxy running in a docker container to abstract that complexity as well.

Issues such as the WLAN disconnect from the TEDAPI would affect both the pypowerwall-proxy and a OpenHAB native binding approach, and probably still need a workaround (at the OS layer) like I describe above.

One change which which is coming, is that there is now a pypowerwall-server ( GitHub - jasonacox/pypowerwall-server: A pypowerwall based FastAPI server for monitoring and managing Tesla Solar and Powerwall systems with multi-gateway support, real-time data streaming, MQTT, and a web based console. · GitHub ) approach in development, which can also publish values via MQTT. This will make it far easier to integrate with OpenHAB, using the MQTT Integration, as opposed to the HTTP approach I describe above. This also mostly negates the need for parsing JSON, as many of the values are published as scalar values, allowing direct consumption in OpenHAB. I raised an issue, which already has a pull request from the Author, to add a bunch of additional values to this MQTT publish process. MQTT Integration - Additional Values · Issue #48 · jasonacox/pypowerwall-server · GitHub

Once this is merged, I will switch to using this approach, and will publish a new guide topic for integrating PW3 to OpenHAB via MQTT.

If the solution is going to include installing another container (in lieu of a working binding), installing home assistant in docker is a simple alternative. The community Tesla integration is working well, and actively maintained. Http binding to the HA API is an easy setup. Downside is it uses the cloud.

Not sure if I understand the logic behind using HA to integrate the Powerwall3 for OpenHAB, unless I am missing a key piece of info (i.e. an alternative to the options below):

  • HA Tesla Powerwall integration explicitly excludes support for the Powerwall 3:

  • HA Tesla Fleet Integration, as you mention, relies on Cloud integration for Powerwall3 read & write values, and whilst it covers the essentials, it also misses a lot of the information available locally for the Powerwall 3 (e.g. individual MPPT input stats)
  • HA powerwall3mqtt integration was abandoned in deference to using the cloud integration

Using pypowerwall-proxy or the upcoming pypowerwall-server allows local read of stats from the Powerwall3, including the extended data not available via the Fleet API. It also supports fleet API for control. It also looks like the author of this project intended it to be used for HA integration (via MQTT), but that still requires firing up a container with pypowerwall-server.

My use case may be different to some, in that I want local integration where possible, and also extended information about the individual MTTP inputs (among other things), but unless there is an option I have missed above, I am struggling to see a benefit to integrate PW3 via HA, vs leveraging the pypowerwall-proxy or server.

Cheers

It’s a solution that works, and community members should try to provide solutions when they can. As I was responding to ariela, that’s all I was doing.

Look for Tesla Custom Integration. Available in the Home Assistant Community Store (HACS).

Never claimed there is a benefit, it’s just an alternative.

All good - you don’t need to justify why you posted it, I was just curious to understand how this may be easier:

than a one-liner docker run. But I understand your intent now, that its just an alternative approach, rather than being easier or having benefits over the pypowerwall-proxy approach. It certainly would make sense for someone who already runs HA alongside OH, and doesn’t mind the cloud-based integration, and the values being limited to those in fleet-api.

As an aside, all the information in the above ‘how-to’ guide relating to the networking setup, and also the subsequent post I made about transient network handling, only relate to local integration. All of this is not necessary if you are using the fleet-api method which is also supported via the pypowerwall-proxy.

If you were interested in trying local integration with your above approach, pypowerwall-server already supports HA discovery, albeit with a limited set of values (but the project is relatively new) pypowerwall-server/mqtt-tools/README.md at main · jasonacox/pypowerwall-server · GitHub

I’m still running against pypowerwall-proxy, and will look to migrate to pypowerwall-server once a pending pull-request gets merged, so cannot vouch for it as yet, but pypowerwall-proxy by the same Author has been extremely robust, and well supported to date.

Now if only Tesla would put simple (and stable !!) API’s on the local network interfaces, that we can directly access, everyone’s life would easier - Cheers.

For those interested, I have now created a separate topic using pypowerwall-server and MQTT binding (as opposed to pypowerwall proxy and HTTP binding as used in this thread).

If you are thinking of moving to this method, but already setup the HTTP approach, its pretty easy:

  • Disable/Remove pypowerwall-proxy docker container
  • Skip the instructions for the network setup - It’s identical for both approaches, so you should have everything you need already.
  • Follow the instructions to setup the pypowerwall-server container, in the above thread
  • Your existing HTTP binding integrations will then continue to work, with the exception of:
    • ‘soe’ which needs to be replaced with /pw/level for the battery level to display correctly
    • There may be others, but this is the only one I spotted that stopped working
  • You can configure the MQTT channels at your leisure, and relink your existing items to these channels from the HTTP ones.
  • As most things are sent to MQTT as scalar values, you can ditch the transforms that were required for the HTTP integration approach

I am currently trying to decide between the Tesla Powerwall 3P and the SMA Sunny Tripower Smart Energy. As I understand it, integrating the SMA unit into a smart home system via the Modbus interface is significantly easier and more stable since Tesla doesn’t seem to offer a local API.

What has your experience with Tesla been like? Do you have to worry about losing access to data every time there was a firmware update?

Always go with local control if you have a choice. You never know when the cloud API will be closed, require subscription, or stop “supporting” your equipment.

When we purchased ours, we had a lot of other selection criteria on the list, of which Integration was only one. I would note that these were valid 1.5 years ago, when we bought the base unit (we added more battery 6 months ago), but our key criteria were:

  • Functionality
    • It was the system with the lowest ‘balance of system’ component count. PW3 & Backup Gateway 2. No external inverters etc. (We had come from a Selectronic inverter, which had separate battery and charge controller, and DC panel - I like the simple approach for the PW3)
    • The inverter capacity (11KW), with ability to connect up to 20KW of arrays
  • Value
    • At the time, it represented the best value on the market in NZ. I no longer think that is the case however, but SMA was pretty expensive over this side of the world back then
  • Warranty
    • The 10 year warranty was similar to most others, but unlimited battery KwH discharge (unless you export to Grid from Battery) was an outlier at that time
  • Support
    • I had limited information to go on when I purchased it, but I was pleasantly surprised when I had to make some support calls in the months after we originally purchased it. Very quickly got through to an actual human, who was knowledgeable and could help. Of course that could have changed in 18 months, since I last called
  • Brand
    • A lot of new inverters were coming onto the market, from (then) unheard of brands, at the time we purchased, and their likelihood to be around to honour their warranty. If SMA is your other option, then that’s a pretty solid choice on this front, too
    • The downside, was the behaviour of the company CEO in the months just after I signed up for the unit. That at least is moderated by the fact I dont need to drive around in public in it :slight_smile: , and also the company is so much more than just one person…
  • Expandability
    • Very easy, and we did that 6 months ago
  • Integration
    • The PW3 scored quite low on this front at the time of purchase
    • They did not make it easy to locally integrate, via ‘standard’ methods, be it API’s, Modbus whatever
    • However there were a few projects kicking around, which gave me hope that it could be done. I eventually settled on PyPowerwall Proxy, and in recent months, moved to its descendant, ‘PyPowerwall Server’ (See my other thread, listed in comments above for instructions on how to use this - much easier)
    • When used in conjunction with the Network ‘reset’ scripts I have published here, it provides a reasonably robust integration mechanism. I don’t really notice it as a user, as any dropout is addressed in seconds, but for a while, I logged when the reset rule was tripped, and it turned up in the OpenHAB logs more than I would like !!!
    • Note that I only use the integration for read-only statistics, which is all I require. This is also 100% local integration.
    • Whilst Pypowerwall proxy/server can provide control, that aspect is via the Telsla cloud service. I do not use any control mechanisms:
      • The Opticast optimisation seems reasonable, and somewhat predictable. I’m not sure if I could do much better, and really you only have a few mechanisms that you can manipulate - Reserve Level, Mode, and Stormwatch (I believe??)
      • BTW - It (Opticast) wasn’t always like that, but that’s what most of my support calls were about 18 months ago, and they now seem to have got it sorted
      • The only questionable thing is probably the forecast they use, which seems to have a few misses, however there is really no great forecast service for where I live - NZ is some oversized islands, which doesn’t have the weather pattern stability of a large continent

So 1.5 years into my PW3 journey, it still seems to tick most of the boxes, yes the integration still sucks, but that hurdle has been mostly overcome by the great work that people have done on the pypowerwall project.

Hope this helps.

Thanks a lot for this honest feedback!