tesla_powerwall

Python API for Tesla Powerwall

https://github.com/jrester/tesla_powerwall

Science Score: 23.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
  • DOI references
  • Academic publication links
  • Committers with academic emails
    1 of 15 committers (6.7%) from academic institutions
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (15.0%) to scientific vocabulary

Keywords

api battery powerwall powerwall-api powerwall-status python tesla tesla-powerwall
Last synced: 6 months ago · JSON representation

Repository

Python API for Tesla Powerwall

Basic Info
  • Host: GitHub
  • Owner: jrester
  • License: mit
  • Language: Python
  • Default Branch: master
  • Homepage:
  • Size: 450 KB
Statistics
  • Stars: 79
  • Watchers: 15
  • Forks: 24
  • Open Issues: 4
  • Releases: 15
Topics
api battery powerwall powerwall-api powerwall-status python tesla tesla-powerwall
Created about 7 years ago · Last pushed about 1 year ago
Metadata Files
Readme Changelog License

README.md

Licence PyPI - Downloads PyPI

Python Tesla Powerwall API for consuming a local endpoint.

Note: This is not an official API provided by Tesla and this project is not affilated with Tesla in any way.

Powerwall Software versions from 1.47.0 to 1.50.1 as well as 20.40 to 22.9.2 are tested, but others will probably work too.

Table of Contents <!-- omit in TOC -->

Installation

Install the library via pip:

bash $ pip install tesla_powerwall

Limitations

Adjusting Backup Reserve Percentage

Currently it is not possible to control the Backup Percentage, because you need to be logged in as installer, which requires physical switch toggle. There is an ongoing discussion about a possible solution here. However, if you believe there exists a solution, feel free to open an issue detailing the solution.

Usage

For a basic Overview of the functionality of this library you can take a look at examples/example.py. You can run the example, by cloning the repo and executing in your shell:

bash $ export POWERWALL_IP=<ip of your Powerwall> $ export POWERWALL_PASSWORD=<your password> $ tox -e example

Setup

```python from tesla_powerwall import Powerwall

Create a simple powerwall object by providing the IP

powerwall = Powerwall("")

=>

Create a powerwall object with more options

powerwall = Powerwall( endpoint="", # Configure timeout; default is 10 timeout=10, # Provide a requests.Session or None. If None is provided, a Session will be created. httpsession=None, # Whether to verify the SSL certificate or not verifyssl=False )

=>

```

Note: By default the API client does not verify the SSL certificate of the Powerwall. If you want to verify the SSL certificate you can set verify_ssl to True.

Authentication

Since version 20.49.0 authentication is required for all methods. For that reason you must call login before making a request to the API. When you perform a request without being authenticated, an AccessDeniedError will be thrown.

To login you can either use login or login_as. login logs you in as User.CUSTOMER whereas with login_as you can choose a different user:

```python from tesla_powerwall import User

Login as customer without email

The default value for the email is ""

await powerwall.login("")

=>

Login as customer with email

await powerwall.login("", "")

=>

Login with different user

await powerwall.login_as(User.INSTALLER, "", "")

=>

Check if we are logged in

This method only checks wether a cookie with a Bearer token exists

It does not verify whether this token is valid

powerwall.is_authenticated()

=> True

Logout

await powerwall.logout() powerwall.is_authenticated()

=> False

```

General

The API object directly maps the REST endpoints with a python method in the form of <verb>_<path>. So if you need the raw json responses you can use the API object. It can be either created manually or retrived from an existing Powerwall:

```python from tesla_powerwall import API

Manually create API object

api = API('https:///')

Perform get on 'system_status/soe'

await api.getsystemstatus_soe()

=> {'percentage': 97.59281925744594}

From existing powerwall

api = powerwall.getapi() await api.getsystemstatussoe() ```

The Powerwall objet provides a wrapper around the API and exposes common methods.

Battery level

Get charge in percent:

```python await powerwall.get_charge()

=> 97.59281925744594 (%)

```

Get charge in watt:

```python await powerwall.get_energy()

=> 14807 (Wh)

```

Capacity

Get the capacity of your powerwall in watt:

```python await powerwall.get_capacity()

=> 28078 (Wh)

```

Battery Packs

Get information about the battery packs that are installed:

Assuming that the battery is operational, you can retrive a number of values about each battery: ```python batteries = await powerwall.get_batteries()

=> [, ]

batteries[0].part_number

=> "XXX-G"

batteries[0].serial_number

=> "TGXXX"

batteries[0].energy_remaining

=> 7378 (Wh)

batteries[0].capacity

=> 14031 (Wh)

batteries[0].energy_charged

=> 5525740 (Wh)

batteries[0].energy_discharged

=> 4659550 (Wh)

batteries[0].wobble_detected

=> False

batteries[0].p_out

=> 260

batteries[0].q_out

=> -1080

batteries[0].v_out

=> 245.70

batteries[0].f_out

=> 49.953

batteries[0].i_out

=> -7.4

batteries[0].grid_state

=> GridState.COMPLIANT

batteries[0].disabled_reasons

=> []

```

If a battery is disabled it's grid_state will be GridState.DISABLED and some values will be None. The variable disabled_reasons might contain more information why the battery is disabled: ```python ... batteries[1].grid_state

=> GridState.DISABLED

batteries[1].disabled_reasons

=> ["DisabledExcessiveVoltageDrop"]

batteries[1].p_out

=> None

batteries[1].energy_charged

=> None

```

Powerwall Status

```python status = await powerwall.get_status()

=>

status.version

=> '1.49.0'

status.uptimeseconds

=> datetime.timedelta(days=13, seconds=63287, microseconds=146455)

status.start_time

=> datetime.datetime(2020, 9, 23, 23, 31, 16, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))

status.device_type

=> DeviceType.GW2

```

Sitemaster

```python sm = await powerwall.get_sitemaster()

=>

sm.status

=> StatusUp

sm.running

=> true

sm.connectedtotesla

=> true

```

The sitemaster can be started and stopped using run() and stop()

Siteinfo

```python info = await powerwall.getsiteinfo()

=>

info.site_name

=> 'Tesla Home'

info.country

=> 'Germany'

info.nominalsystemenergy

=> 13.5 (kWh)

info.timezone

=> 'Europe/Berlin'

```

Meters

Aggregates

```python from tesla_powerwall import MeterType

meters = await powerwall.get_meters()

=>

access meter, but may return None when meter is not available

meters.get_meter(MeterType.SOLAR)

=>

access meter, but may raise MeterNotAvailableError when the meter is not available at your powerwall (e.g. no solar panels installed)

meters.solar

=>

get all available meters at the current powerwall

meters.meters.keys()

=> [, , , ]

```

Available meters are: solar, site, load, battery, generator, and busway. Some of those meters might not be available based on the installation and raise MeterNotAvailableError when accessed.

Current power supply/draw

Meter provides different methods for checking current power supply/draw:

```python meters = await powerwall.getmeters() meters.solar.getpower()

=> 0.4 (kW)

meters.solar.instant_power

=> 409.941801071167 (W)

meters.solar.isdrawingfrom()

=> True

meters.load.issendingto()

=> True

meters.battery.is_active()

=> False

Different precision settings might return different results

meters.battery.is_active(precision=5)

=> True

```

Note: For MeterType.LOAD is_drawing_from always returns False because it cannot be drawn from load.

Energy exported/imported

Get energy exported/imported in watt-hours (Wh) with energy_exported and energy_imported. For the values in kilowatt-hours (kWh) use get_energy_exported and get_energy_imported:

```python meters.battery.energy_exported

=> 6394100 (Wh)

meters.battery.getenergyexported()

=> 6394.1 (kWh)

meters.battery.energy_imported

=> 7576570 (Wh)

meters.battery.getenergyimported()

=> 7576.6 (kWh)

```

Details

You can receive more detailed information about the meters site and solar:

```python meterdetails = await powerwall.getmetersite() # or getmeter_solar() for the solar meter

=>

readings = meter_details.readings

=>

readings.realpowera # same for realpowerb and realpowerc

=> 619.13532458

readings.iacurrent # same for ibcurrent and iccurrent

=> 3.02

readings.vl1n # smae for vl2n and v_l3n

=> 235.82

readings.instant_power

=> -18.000023458

readings.is_sending() ```

As MeterDetailsReadings inherits from MeterResponse (which is used in MetersAggratesResponse) it exposes the same data and methods.

For the meters battery and grid no additional details are provided, therefore no methods exist for those meters

Device Type

```python await powerwall.getdevicetype()

=>

```

Grid Status

Get current grid status.

```python await powerwall.getgridstatus()

=>

await powerwall.isgridservices_active()

=> False

```

Operation mode

```python await powerwall.getoperationmode()

=>

await powerwall.getbackupreserve_percentage()

=> 5.000019999999999 (%)

```

Powerwalls Serial Numbers

```python await serials = powerwall.getserialnumbers()

=> ["...", "...", ...]

```

Gateway DIN

```python await din = powerwall.getgatewaydin()

=> 4159645-02-A--TGXXX

```

VIN

python await vin = powerwall.get_vin()

Off-grid status (Set Island mode)

Take your powerwall on- and off-grid similar to the "Take off-grid" button in the Tesla app.

Set powerwall to off-grid (Islanded)

python await powerwall.set_island_mode(IslandMode.OFFGRID)

Set powerwall to off-grid (Connected)

python await powerwall.set_island_mode(IslandMode.ONGRID)

Development

pre-commit

This project uses pre-commit to run linters, formatters and type checking. You can easily run those checks locally:

```sh

Install the pre-commit hooks

$ pre-commit install pre-commit installed at .git/hooks/pre-commit ```

Now those checks will be execute on every git commit. You can also execute all checks manually with pre-commit run --all-files.

Building

sh $ python -m build

Testing

The tests are split in unit and integration tests. The unit tests are self-contained and can simply be run locally by executing tox -e unit, whereas the integration test, run against a real powerwall.

Unit-Tests

To run unit tests use tox:

sh $ tox -e unit

Integration-Tests

To execute the integration tests you need to first provide some information about your powerwall:

sh $ export POWERWALL_IP=<ip of your powerwall> $ export POWERWALL_PASSWORD=<password for your powerwall> $ tox -e integration

The integration tests might take your powerwall off grid and bring it back online. Before running the tests, make sure that you know what you are doing!

Owner

  • Login: jrester
  • Kind: user
  • Location: Munich, Germany

GitHub Events

Total
  • Issues event: 8
  • Watch event: 4
  • Issue comment event: 6
  • Push event: 2
  • Fork event: 1
Last Year
  • Issues event: 8
  • Watch event: 4
  • Issue comment event: 6
  • Push event: 2
  • Fork event: 1

Committers

Last synced: 6 months ago

All Time
  • Total Commits: 139
  • Total Committers: 15
  • Avg Commits per committer: 9.267
  • Development Distribution Score (DDS): 0.201
Past Year
  • Commits: 3
  • Committers: 1
  • Avg Commits per committer: 3.0
  • Development Distribution Score (DDS): 0.0
Top Committers
Name Email Commits
Jrester j****9@g****m 111
J. Nick Koston n****k@k****g 8
jrester 3****r@u****m 5
maikukun 1****n@u****m 3
Josh Pettersen 1****b@u****m 2
Andreas Billmeier b@e****t 1
Barry Quiel b****l@g****m 1
Dan Simpson d****n@u****m 1
Daniel O'Connor d****s@d****u 1
Jonathan Wood d****i@d****s 1
Paul Hofmann 6****n@u****m 1
Simon Moore s****e@c****k 1
purcell-lab 7****b@u****m 1
some-guy-in-oz 8****z@u****m 1
z00nx 0 z****0@g****m 1
Committer Domains (Top 20 + Academic)

Issues and Pull Requests

Last synced: 6 months ago

All Time
  • Total issues: 40
  • Total pull requests: 31
  • Average time to close issues: about 2 months
  • Average time to close pull requests: 4 days
  • Total issue authors: 35
  • Total pull request authors: 14
  • Average comments per issue: 5.0
  • Average comments per pull request: 3.03
  • Merged pull requests: 27
  • Bot issues: 0
  • Bot pull requests: 0
Past Year
  • Issues: 4
  • Pull requests: 0
  • Average time to close issues: 21 days
  • Average time to close pull requests: N/A
  • Issue authors: 3
  • Pull request authors: 0
  • Average comments per issue: 0.5
  • Average comments per pull request: 0
  • Merged pull requests: 0
  • Bot issues: 0
  • Bot pull requests: 0
Top Authors
Issue Authors
  • billmoseley (2)
  • greyghoster (2)
  • abuenano (2)
  • Panda88CO (2)
  • swm11 (2)
  • DanielBaulig (1)
  • quielb (1)
  • T3CHKOMMIE (1)
  • kl1947 (1)
  • mweinelt (1)
  • jackkorber (1)
  • Arsecroft (1)
  • nugget (1)
  • wcwong (1)
  • mihailvovk (1)
Pull Request Authors
  • bubonicbob (10)
  • jrester (9)
  • bdraco (8)
  • daniel-simpson (2)
  • z00nx (1)
  • triandaphilos (1)
  • dilecti (1)
  • some-guy-in-oz (1)
  • DanielO (1)
  • onkelbeh (1)
  • purcell-lab (1)
  • swm11 (1)
  • quielb (1)
  • maikukun (1)
Top Labels
Issue Labels
Pull Request Labels
hacktoberfest-accepted (2)

Packages

  • Total packages: 1
  • Total downloads:
    • pypi 25,998 last-month
  • Total docker downloads: 757,189,574
  • Total dependent packages: 0
  • Total dependent repositories: 596
  • Total versions: 41
  • Total maintainers: 1
pypi.org: tesla-powerwall

A simple API for accessing the Tesla Powerwall over your local network

  • Homepage: https://github.com/jrester/tesla_powerwall
  • Documentation: https://tesla-powerwall.readthedocs.io/
  • License: MIT License Copyright (c) 2024 Jrester Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  • Latest release: 0.5.2
    published almost 2 years ago
  • Versions: 41
  • Dependent Packages: 0
  • Dependent Repositories: 596
  • Downloads: 25,998 Last month
  • Docker Downloads: 757,189,574
Rankings
Docker downloads count: 0.2%
Dependent repos count: 0.6%
Average: 5.0%
Downloads: 5.5%
Dependent packages count: 7.3%
Forks count: 8.0%
Stargazers count: 8.3%
Maintainers (1)
Last synced: 6 months ago

Dependencies

.github/workflows/python-publish.yml actions
  • actions/checkout v2 composite
  • actions/setup-python v2 composite
.github/workflows/release.yml actions
  • actions/checkout v2 composite
  • actions/create-release v1 composite
pyproject.toml pypi
  • requests >=2.22.0