All Projects → jrester → tesla_powerwall

jrester / tesla_powerwall

Licence: MIT license
Python API for Tesla Powerwall

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to tesla powerwall

TeslaPy
A Python module to use the Tesla Motors Owner API
Stars: ✭ 216 (+402.33%)
Mutual labels:  tesla, powerwall
docker-powerwall-dashboard
Grafana dashboard showing trend & historical data polled from Tesla Powerwall 2 API served up in an easy to use docker image
Stars: ✭ 30 (-30.23%)
Mutual labels:  powerwall, powerwall-api
tesla auth
Securely generate API tokens for third-party access to your Tesla.
Stars: ✭ 114 (+165.12%)
Mutual labels:  tesla
expfactory
software to generate a reproducible container with a battery of experiments
Stars: ✭ 29 (-32.56%)
Mutual labels:  battery
max1704x
Arduino library for the MAX17043 and MAX17044 LiPo Battery Fuel Gauge.
Stars: ✭ 16 (-62.79%)
Mutual labels:  battery
dna-monitor
A simple device monitoring tool for e-cigarettes with Evolv DNA chipset ☁️ 📈 Works with macOS and Linux
Stars: ✭ 25 (-41.86%)
Mutual labels:  battery
TeslaMateAgile
Integration to automatically fill in prices for charge data captured by TeslaMate for smart energy providers
Stars: ✭ 40 (-6.98%)
Mutual labels:  tesla
PSPi-1000-Version-4
https://othermod.com/pspi-1000-version-4/
Stars: ✭ 39 (-9.3%)
Mutual labels:  battery
esctoolbox-python
Python version of Gregory Plett's ESCtoolbox
Stars: ✭ 47 (+9.3%)
Mutual labels:  battery
tesla api
Lightweight Python API client for the Tesla API.
Stars: ✭ 73 (+69.77%)
Mutual labels:  tesla
battery
Draw battery unicode art written by Go
Stars: ✭ 66 (+53.49%)
Mutual labels:  battery
hashcat-benchmark-comparison
Hashcat Benchmark Comparison
Stars: ✭ 22 (-48.84%)
Mutual labels:  tesla
tesla-api
Unofficial API Wrapper for Tesla Model S and X. #follows-javascript-conventions #es6 #es7
Stars: ✭ 24 (-44.19%)
Mutual labels:  tesla
teslamateapi
TeslaMateApi is a RESTful API to get data collected by self-hosted data logger TeslaMate in JSON
Stars: ✭ 47 (+9.3%)
Mutual labels:  tesla
ATtiny13-TinyUPS
Uninterruptible Power Supply
Stars: ✭ 92 (+113.95%)
Mutual labels:  battery
ATtiny85-TinyCharger
Single-Cell Li-Ion Battery Charger with Monitoring
Stars: ✭ 20 (-53.49%)
Mutual labels:  battery
cellpy
extract and tweak data from electrochemical tests of cells
Stars: ✭ 46 (+6.98%)
Mutual labels:  battery
ioBroker.plenticore
ioBroker Adapter for the KOSTAL Plenticore
Stars: ✭ 15 (-65.12%)
Mutual labels:  battery
Low power TTGO T-beam
Low power consumption for TTGO t-beam
Stars: ✭ 45 (+4.65%)
Mutual labels:  battery
tesla
Tesla custom integration for Home Assistant. This requires a refresh token be generated by third-party apps to login.
Stars: ✭ 145 (+237.21%)
Mutual labels:  tesla

Licence PyPI - Downloads PyPI

Python Tesla Powerwall API for consuming a local endpoint. The API is by no means complete and mainly features methods which are considered to be of common use. If you feel like methods should be included you are welcome to open an Issue or create a Pull Request.

Note: This is not an official API provided by Tesla and not affilated in anyways with Tesla.

Powerwall Software versions from 1.47.0 to 1.50.1 as well as 20.40 to 21.39.1 are tested, but others will probably work too. If you encounter an error regarding a change in the API of the Powerwall because your Powerwall has a different version than listed here please open an Issue to report this change so it can be fixed.

Table of Contents

Installation

Install the library via pip:

$ pip install tesla_powerwall

Usage

Setup

from tesla_powerwall import Powerwall

# Create a simple powerwall object by providing the IP
powerwall = Powerwall("<ip of your Powerwall>")
#=> <Powerwall ...>

# Create a powerwall object with more options
powerwall = Powerwall(
    endpoint="<ip of your powerwall>",
    # Configure timeout; default is 10
    timeout=10,
    # Provide a requests.Session or None to have one created
    http_session=None,
    # Whether to verify the SSL certificate or not
    verify_ssl=False,
    disable_insecure_warning=True
)
#=> <Powerwall ...>

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. The API client suppresses warnings about an inseucre request (because we aren't verifing the certificate). If you want to enable those warnings you can set disable_insecure_warning to False.

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 loggedin a 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:

from tesla_powerwall import User

# Login as customer without email
# The default value for the email is ""
powerwall.login("<password>")
#=> <LoginResponse ...>

# Login as customer with email
powerwall.login("<password>", "<email>")
#=> <LoginResponse ...>

# Login with different user
powerwall.login_as(User.INSTALLER, "<password>", "<email>")
#=> <LoginResponse ...>

# 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
powerwall.logout()

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:

from tesla_powerwall import API

# Manually create API object
api = API('https://<ip>/')
# Perform get on 'system_status/soe'
api.get_system_status_soe()
#=> {'percentage': 97.59281925744594}

# From existing powerwall
api = powerwall.get_api()
api.get_system_status_soe()

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

Errors

As the powerwall REST API varies widley between version and country it may happen that an attribute may not be included in your response. If that is the case a MissingAttributeError will be thrown indicating what attribute wasn't available.

Response

Responses are usally wrapped inside a Response object to provide convenience methods. An Example is the Meter class which is a sublass of Response. Each Response object includes the response member which consists of the plain json response.

from helpers import assert_attribute

status = powerwall.get_status()
#=> <PowerwallStatus ...>

status.version
# is the same as
assert_attribute(status.response, "version")
# or
status.assert_attribute("version)

For retriving the version you could also alternativly use powerwall.get_version.

Battery level

Get charge in percent:

powerwall.get_charge()
#=> 97.59281925744594 (%)

Get charge in watt:

powerwall.get_energy()
#=> 14807 (W)

Capacity

Get the capacity of your powerwall in watt:

powerwall.get_capacity()
#=> 28078 (W)

Battery Packs

Get information about the battery packs that are installed:

batteries = powerwall.get_batteries()
#=> [<Battery ...>, <Battery ...>]
batteries[0].part_number
#=> "XXX-G"
batteries[0].serial_number
#=> "TGXXX"
batteries[0].energy_remaining
#=> 7378 (W)
batteries[0].capacity
#=> 14031 (W)
batteries[0].energy_charged
#=> 5525740 (W)
batteries[0].energy_discharged
#=> 4659550 (W)
batteries[0].wobble_detected
#=> False

Powerwall Status

status = powerwall.get_status()
#=> <PowerwallStatus ...>
status.version
#=> '1.49.0'
status.up_time_seconds
#=> 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

sm = powerwall.sitemaster 
#=> <SiteMaster ...>
sm.status 
#=> StatusUp
sm.running
#=> true
sm.connected_to_tesla
#=> true

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

Siteinfo

info = powerwall.get_site_info()
#=> <SiteInfo ...>
info.site_name
#=> 'Tesla Home'
info.country
#=> 'Germany'
info.nominal_system_energy
#=> 13.5
info.timezone
#=> 'Europe/Berlin'

Meters

Aggregates

from tesla_powerwall import MeterType

meters = powerwall.get_meters()
#=> <MetersAggregates ...>

# access meter, but may return None when meter is not available
meters.get_meter(MeterType.SOLAR)
#=> <Meter ...>

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

# get all available meters at the current powerwall
meters.meters
#=> [<MeterType.SITE: 'site'>, <MeterType.BATTERY: 'battery'>, <MeterType.LOAD: 'load'>, <MeterType.SOLAR: 'solar'>]

Available meters are: solar, site, load, battery and generator. 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:

meters = powerwall.get_meters()
meters.solar.get_power()
#=> 0.4 (in kWh)
meters.solar.instant_power
#=> 409.941801071167 (in watts)
meters.solar.is_drawing_from()
#=> True
meters.load.is_sending_to()
#=> 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 watts with energy_exported and energy_imported. For the values in kWh use get_energy_exported and get_energy_imported:

meters.battery.energy_exported
#=> 6394100
meters.battery.get_energy_exported()
#=> 6394.1
meters.battery.energy_imported
#=> 7576570
meters.battery.get_energy_imported()
#=> 7576.6

Device Type

powerwall.get_device_type()
#=> <DeviceType.GW1: 'hec'>

Grid Status

Get current grid status.

powerwall.get_grid_status()
#=> <GridStatus.Connected: 'SystemGridConnected'>
powerwall.is_grid_services_active()
#=> False

Operation mode

powerwall.get_operation_mode()
#=> <OperationMode.SELF_CONSUMPTION: ...>
powerwall.get_backup_reserve_percentage()
#=> 5.000019999999999

Powerwalls Serial Numbers

serials = powerwall.get_serial_numbers()
#=> ["...", "...", ...]

Gateway DIN

din = powerwall.get_gateway_din()
#=> 4159645-02-A--TGXXX

VIN

vin = powerwall.get_vin()
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].