File: tlx_example.py

package info (click to toggle)
growattserver 1.7.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 288 kB
  • sloc: python: 1,294; makefile: 2
file content (110 lines) | stat: -rw-r--r-- 4,963 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import growattServer
import datetime
import getpass
import json

"""
# Example script controlling a Growatt MID-30KTL3-XH + APX battery hybrid system by emulating the ShinePhone iOS app. 
# The same API calls are used by the ShinePhone Android app as well. Traffic intercepted using HTTP Toolkit. 
# 
# The plant / energy / device APIs seem to be generic for all Growatt systems, while the inverter and battery APIs use the TLX APIs.
#
# The available settings under the 'Control' tab in ShinePhone are created by combining the results from two function calls:
# tlx_get_all_settings() seem to returns the sum of all settings for all systems while tlx_get_enabled_settings() tells 
# which of these settings are valid for the TLX system.
# 
# Settings that takes a single parameter can be set using update_tlx_inverter_setting(). A helper function, update_tlx_inverter_time_segment()
# is provided for updating time segments which take several parameters. The inverter is picky and time intervals can't be overlapping,
# even if they are disabled. 
# 
# The set functions are commented out in the example, uncomment to test, and use at your own risk. Most likely all settings returned in 
# tlx_get_enabled_settings() can be set using update_tlx_inverter_setting(), but has not been tested.
#  
"""

# Prompt user for username
username=input("Enter username:")

# Prompt user to input password
user_pass=getpass.getpass("Enter password:")

user_agent = 'ShinePhone/8.1.17 (iPhone; iOS 15.6.1; Scale/2.00)'
api = growattServer.GrowattApi(agent_identifier=user_agent)

login_response = api.login(username, user_pass)
user_id = login_response['user']['id']
print("Login successful, user_id:", user_id)

# Plant info
plant_list = api.plant_list_two()
plant_id = plant_list[0]['id']
plant_info = api.plant_info(plant_id)
print("Plant info:", json.dumps(plant_info, indent=4, sort_keys=True))

# Energy data (used in the 'Plant' Tab)
energy_data = api.plant_energy_data(plant_id)
print("Plant Energy data", json.dumps(energy_data, indent=4, sort_keys=True))

# Devices
devices = api.device_list(plant_id)
print("Devices:", json.dumps(devices, indent=4, sort_keys=True))

for device in devices:
    if device['deviceType'] == 'tlx':
        # Inverter info (used in inverter view)
        inverter_sn = device['deviceSn']
        inverter_info = api.tlx_params(inverter_sn)
        print("Inverter info:", json.dumps(inverter_info, indent=4, sort_keys=True))

        # PV production data
        data = api.tlx_data(inverter_sn, datetime.datetime.now())
        print("PV production data:", json.dumps(data, indent=4, sort_keys=True))

        # System settings
        all_settings = api.tlx_all_settings(inverter_sn)
        enabled_settings = api.tlx_enabled_settings(inverter_sn)
        # 'on_grid_discharge_stop_soc' is present in web UI, but for some reason not
        # returned in enabled settings so we enable it manually here instead
        enabled_settings['enable']['on_grid_discharge_stop_soc'] = '1' 
        enabled_keys = enabled_settings['enable'].keys()
        available_settings = {k: v for k, v in all_settings.items() if k in enabled_keys}
        print("System settings:", json.dumps(available_settings, indent=4, sort_keys=True))

        # System status
        data = api.tlx_system_status(plant_id, inverter_sn)
        print("System status:", json.dumps(data, indent=4, sort_keys=True))

        # Energy overview
        data = api.tlx_energy_overview(plant_id, inverter_sn)
        print("Energy overview:", json.dumps(data, indent=4, sort_keys=True))
       
        # Energy production & consumption
        data = api.tlx_energy_prod_cons(plant_id, inverter_sn)
        print("Energy production & consumption:", json.dumps(data, indent=4, sort_keys=True))

    elif device['deviceType'] == 'bat':
        # Battery info
        batt_info = api.tlx_battery_info(device['deviceSn'])
        print("Battery info:", json.dumps(batt_info, indent=4, sort_keys=True))
        batt_info_detailed = api.tlx_battery_info_detailed(plant_id, device['deviceSn'])
        print("Battery info: detailed", json.dumps(batt_info_detailed, indent=4, sort_keys=True))


# Examples of updating settings, uncomment to use

# Set charging power to 95%
#res = api.update_tlx_inverter_setting(inverter_sn, 'charge_power', 95)
#print(res)

# Turn on AC charging
#res = api.update_tlx_inverter_setting(inverter_sn, 'ac_charge', 1)
#print(res)

# Enable Load First between 00:01 and 11:59 using time segment 1
#res = api.update_tlx_inverter_time_segment(serial_number = inverter_sn,
#                                           segment_id = 1,
#                                           batt_mode = growattServer.BATT_MODE_LOAD_FIRST,
#                                           start_time = datetime.time(00, 1),
#                                           end_time = datetime.time(11, 59),
#                                           enabled=True)
#print(res)