forked from thomluther/anker-solix-api
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapitypes.py
More file actions
1772 lines (1569 loc) · 84.2 KB
/
apitypes.py
File metadata and controls
1772 lines (1569 loc) · 84.2 KB
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
"""Default definitions required for the Anker Power/Solix Cloud API."""
from dataclasses import InitVar, asdict, dataclass
from datetime import datetime
from enum import Enum, IntEnum, StrEnum
from typing import Any, ClassVar, Final
# API servers per region. Country assignment not clear, defaulting to EU server
API_SERVERS: Final[dict] = {
"eu": "https://ankerpower-api-eu.anker.com",
"com": "https://ankerpower-api.anker.com",
}
API_LOGIN: Final[str] = "passport/login"
API_KEY_EXCHANGE: Final[str] = "openapi/oauth/key/exchange"
API_HEADERS: Final[dict] = {
"content-type": "application/json",
"model-type": "DESKTOP",
# "model-type": "PHONE",
# "app-version": "3.6.0",
"app-name": "anker_power",
"os-type": "android",
}
API_COUNTRIES: Final[dict] = {
"com": [
"DZ",
"LB",
"SY",
"EG",
"LY",
"TN",
"MA",
"JO",
"PS",
"AR",
"AU",
"BR",
"HK",
"IN",
"JP",
"MX",
"NG",
"NZ",
"RU",
"SG",
"ZA",
"KR",
"TW",
"US",
"CA",
"RO",
],
"eu": [
"DE",
"BE",
"EL",
"LT",
"PT",
"BG",
"ES",
"LU",
"CZ",
"FR",
"HU",
"SI",
"DK",
"HR",
"MT",
"SK",
"IT",
"NL",
"FI",
"EE",
"CY",
"AT",
"SE",
"IE",
"LV",
"PL",
"UK",
"IS",
"NO",
"LI",
"CH",
"BA",
"ME",
"MD",
"MK",
"GE",
"AL",
"RS",
"TR",
"UA",
"XK",
"AM",
"BY",
"AZ",
"IL",
],
} # TODO(2): Expand or update list once ID assignments are wrong or missing
"""Following are the Anker Power/Solix Cloud API power_service endpoints known so far. Some are common, others are mainly for balcony power systems"""
API_ENDPOINTS: Final[dict] = {
# Power endpoints */v1/site/*
"homepage": "power_service/v1/site/get_site_homepage", # Scene info for configured site(s), content as presented on App Home Page (mostly empty for shared accounts)
"site_list": "power_service/v1/site/get_site_list", # List of available site ids for the user, will also show sites shared withe the account
"site_detail": "power_service/v1/site/get_site_detail", # Information for given site_id, can also be used by shared accounts
"site_rules": "power_service/v1/site/get_site_rules", # Information for supported power site types and their min and max qty per device model types
"scene_info": "power_service/v1/site/get_scen_info", # Scene info for provided site id (contains most information as the App home screen, with some but not all device details)
"user_devices": "power_service/v1/site/list_user_devices", # List Device details of owned devices, not all device details information included
"charging_devices": "power_service/v1/site/get_charging_device", # List of Portable Power Station devices?
"get_device_parm": "power_service/v1/site/get_site_device_param", # Get settings of a device for the provided site id and param type (e.g. Schedules), types [1 2 3 4 5 6 7 12 13 16 18 20 23 26]
"set_device_parm": "power_service/v1/site/set_site_device_param", # Apply provided settings to a device for the provided site id and param type (e.g. Schedules),
"energy_analysis": "power_service/v1/site/energy_analysis", # Fetch energy data for given time frames
"home_load_chart": "power_service/v1/site/get_home_load_chart", # Fetch data as displayed in home load chart for schedule adjustments for given site_id and optional device SN (empty if solarbank not connected)
"wifi_list": "power_service/v1/site/get_wifi_info_list", # List of available networks for provided site id
"get_site_price": "power_service/v1/site/get_site_price", # List defined power price and CO2 for given site, works only for site owner account
"update_site_price": "power_service/v1/site/update_site_price", # Update power price and CO2 for given site, works only for site owner account
"get_forecast_schedule": "power_service/v1/site/get_schedule", # get remaining energy and negative price slots, works as member, {"site_id": siteId}
"get_co2_ranking": "power_service/v1/site/co2_ranking", # get CO2 ranking for SB2/3 site_id, works as member, {"site_id": siteId}
"get_site_power_limit": "power_service/v1/site/get_power_limit", # needs owner, lists power limits for system
# Power endpoints */v1/app/*
"get_auto_upgrade": "power_service/v1/app/get_auto_upgrade", # List of Auto-Upgrade configuration and enabled devices, only works for site owner account
"set_auto_upgrade": "power_service/v1/app/set_auto_upgrade", # Set/Enable Auto-Upgrade configuration, works only for site owner account
"bind_devices": "power_service/v1/app/get_relate_and_bind_devices", # List with details of locally connected/bound devices, includes firmware version, works only for owner account
"get_device_load": "power_service/v1/app/device/get_device_home_load", # Get defined device schedule (same data as provided with device param query)
"set_device_load": "power_service/v1/app/device/set_device_home_load", # Set defined device schedule, Accepts the new schedule, but does NOT change it? Maybe future use for schedules per device
"get_ota_info": "power_service/v1/app/compatible/get_ota_info", # Get OTA status for solarbank and/or inverter serials
"get_ota_update": "power_service/v1/app/compatible/get_ota_update", # Get info of available OTA update
"solar_info": "power_service/v1/app/compatible/get_compatible_solar_info", # Solar inverter definition for solarbanks, works only with owner account
"get_cutoff": "power_service/v1/app/compatible/get_power_cutoff", # Get Power Cutoff settings (Min SOC) for provided site id and device sn, works only with owner account
"set_cutoff": "power_service/v1/app/compatible/set_power_cutoff", # Set Min SOC for device, only works for owner accounts
"compatible_process": "power_service/v1/app/compatible/get_compatible_process", # contains solar_info plus OTA processing codes, works only with owner account
"get_device_fittings": "power_service/v1/app/get_relate_device_fittings", # Device fittings for given site id and device sn. Shows Accessories like Solarbank 0W Switch info
"get_upgrade_record": "power_service/v1/app/get_upgrade_record", # get list of firmware update history
"check_upgrade_record": "power_service/v1/app/check_upgrade_record", # show an upgrade record for the device, types 1-3 show different info, only works for owner account
"get_device_attributes": "power_service/v1/app/device/get_device_attrs", # for solarbank and/or smart meter? {"device_sn":sn,"attributes":["rssi","pv_power_limit","legal_power_limit","power_limit_option","power_limit_option_real","switch_0w"]}
"set_device_attributes": "power_service/v1/app/device/set_device_attrs", # attr name may be different than for get, {"device_sn":sn,"attributes":{"pv_power_limit":800,"ac_power_limit":1200,"power_limit":800}}
"get_config": "power_service/v1/app/get_config", # shows empty config list, also for shared account
"get_installation": "power_service/v1/app/compatible/get_installation", # shows install_mode and solar_sn, also for shared account
"set_installation": "power_service/v1/app/compatible/set_installation", # not explored yet
"get_third_platforms": "power_service/v1/app/third/platform/list", # list supported third party device models
"get_token_by_userid": "power_service/v1/app/get_token_by_userid", # get token for authenticated user. Is that the token to be used to query shelly status?
"get_shelly_status": "power_service/v1/app/get_user_op_shelly_status", # get op_list with correct token
"get_device_income": "power_service/v1/app/device/get_device_income", # {"device_sn": deviceSn, "start_time": "00:00"})) # Get income data for device, works for member
"get_device_group": "power_service/v1/app/group/get_group_devices", # works as member, shows whether device is grouped with sub devices, {"device_sn": deviceSn}
"get_device_charge_order_stats": "power_service/v1/app/order/get_charge_order_stats", # works as member, date_type[week month year all], show EV_charger stats, {"device_sn":deviceSn,"date_type":"all","start_date":"","end_date":""}))
"get_device_charge_order_stats_list": "power_service/v1/app/order/get_charge_order_stats_list", # works as member, date_type[week month year all], order_Status unknown, {"device_sn":deviceSn,"order_status":1,"date_type":"all","start_date":"","end_date":"","page":0,"page_size":10}
"get_ocpp_endpoint_list": "power_service/v1/app/get_ocpp_endpoint_list", # lists ocpp endpoints used by Anker, including source number per endpoint
"get_device_ocpp_info": "power_service/v1/app/get_ocpp_info", # works as member also for empty device SN, {"device_sn": deviceSn}, list device endpoint source number, default 0 if nothing found explicetly? (Useful only for EV charger devices)
"get_vehicle_brands": "power_service/v1/app/get_brand_list", # get vehicle brand list
"get_vehicle_brand_models": "power_service/v1/app/get_models", # get model list for given brand, {"brand_name": "BMW"}
"get_vehicle_model_years": "power_service/v1/app/get_model_years", # get prodictive year list for given model, {"brand_name": "BMW", "model_name": "iX3"}
"get_vehicle_year_attributes": "power_service/v1/app/get_model_list", # get attributes for model and productive year, {"brand_name": "BMW", "model_name": "iX3", "productive_year": 2023}
"get_user_vehicles": "power_service/v1/app/vehicle/get_vehicle_list", # list of vehicles with details for account
"get_user_vehicle_details": "power_service/v1/app/vehicle/get_vehicle_detail", # deteils for given vehicle id, {"vehicle_id": vehicleId}
"vehicle_add": "power_service/v1/app/vehicle/add_vehicle", # add vehicles to account, {"user_vehicle_info": [{"vehicle_name": "MyCar","brand": "Audi","model": "eTron","productive_year": 2024}]}
"vehicle_update": "power_service/v1/app/vehicle/update_vehicle", # update any vehicle detail, {"vehicle_id": vehicleId, "vehicle_name": "MyCar","brand": "Audi","model": "eTron","productive_year": 2024, "battery_capacity": 80, "ac_max_charging_power": 11, "energy_consumption_per_100km": 18}
"vehicle_delete": "power_service/v1/app/vehicle/delete_vehicle",
"vehicle_set_charging": "power_service/v1/app/vehicle/set_charging_vehicle", # needs EV_Charger device, {"vehicle_id": vehicleId, "device_sn": deviceSn, "transaction_id": 1}
"vehicle_set_default": "power_service/v1/app/vehicle/set_default", # set vehicle id as default, {"vehicle_id": vehicleId}
# Power endpoints */v1/device/*
"get_tamper_records": "power_service/v1/device/get_tamper_records", # needs owner, not sure what it does, {"device_sn": deviceSn, "page_num": 1, "page_size": 10}
"get_currency_list": "power_service/v1/currency/get_list", # get list of supported currencies for power sites
# Power endpoints */v1/dynamic_price/*
"get_dynamic_price_sites": "power_service/v1/dynamic_price/check_available", # Get available site id_s for dynamic prices of account, works as member but list empty
"get_dynamic_price_providers": "power_service/v1/dynamic_price/support_option", # Get available provider list for device_pn and login country, works as member, {"device_pn": "A5102"}
"get_dynamic_price_details": "power_service/v1/dynamic_price/price_detail", # {"area": "GER", "company": "Nordpool", "date": "1748908800", "device_sn": ""})) # works for members, device_sn may be empty, date is int posix timestamp as string
# Power endpoints */v1/*
"get_message_unread": "power_service/v1/get_message_unread", # GET method to show if there are unread messages for account
"get_message": "power_service/v1/get_message", # GET method to list Messages from certain time, not explored or used (last_time format unknown)
"get_product_categories": "power_service/v1/product_categories", # GET method to list all supported products with details and web picture links
"get_product_accessories": "power_service/v1/product_accessories", # GET method to list all supported products accessories with details and web picture links
# Power endpoints */v1/ai_ems/*
"get_ai_ems_status": "power_service/v1/ai_ems/get_status", # Get status of AI learning mode and remaining seconds, works as member, {"site_id": siteId}))
"get_ai_ems_profit": "power_service/v1/ai_ems/profit", # Type is unclear, may work as member, {"site_id": siteId, "start_time": "00:00", "end_time": "24:00", "type": "grid"}))
# App endpoints
"get_ota_batch": "app/ota/batch/check_update", # get OTA information and latest version for device SN list, works also for shared accounts, but data only received for owner accounts
"get_mqtt_info": "app/devicemanage/get_user_mqtt_info", # post method to list mqtt server and certificates for a site, not explored or used
"get_shared_device": "app/devicerelation/get_shared_device", # works as member, list device sharing details, {"device_sn": deviceSn}, sharing works only for EV charger or any device?
# Endpoints for standalone Anker inverter devices
"get_device_pv_status": "charging_pv_svc/getPvStatus", # post method get the current activity status and power generation of one or multiple devices
"get_device_pv_total_statistics": "charging_pv_svc/getPvTotalStatistics", # post method the get total statistics (generated power, saved money, saved CO2) of a device
"get_device_pv_statistics": "charging_pv_svc/statisticsPv", # post method to get detailed statistics on a daily, weekly, monthly or yearly basis
"get_device_pv_price": "charging_pv_svc/selectUserTieredElecPrice", # post method to get defined price tiers for stand alone inverter (only first tier is applied for full day)
"set_device_pv_price": "charging_pv_svc/updateUserTieredElecPrice", # post method to set price tiers for stand alone inverter (only first tier is applied for full day)
"set_device_pv_power": "charging_pv_svc/set_aps_power", # post method to set stand alone inverter limit
"get_device_rfid_cards": "power_service/v1/rfid/get_device_cards", # needs owner. get rfid cards (for EV charger?), {"device_sn": deviceSn}
# Endpoints for standalone Anker power charger devices
"charger_get_charging_modes": "mini_power/v1/app/charging/get_charging_mode_list", # {"device_sn": deviceSn}
"charger_get_triggers": "mini_power/v1/app/egg/get_easter_egg_trigger_list", # {"device_sn": deviceSn}
"charger_get_statistics": "mini_power/v1/app/power/get_day_power_data", # {"device_sn": deviceSn, "device_model": "A2345", "date": "2025-02-27"}
"charger_get_device_setting": "mini_power/v1/app/setting/get_device_setting", # {"device_sn": deviceSn}
"charger_get_screensavers": "mini_power/v1/app/style/get_clock_screensavers", # works for {"device_sn": deviceSn, "product_code": "A2345"} => Prime charger
}
"""Following are the Anker Power/Solix Cloud API charging_energy_service endpoints known so far. They are used for Power Panels."""
API_CHARGING_ENDPOINTS: Final[dict] = {
"get_error_info": "charging_energy_service/get_error_infos", # No input param needed, show errors for account?
"get_system_running_info": "charging_energy_service/get_system_running_info", # Cumulative Home/System Energy Savings since Home creation date
"energy_statistics": "charging_energy_service/energy_statistics", # Energy stats for PPS and Home Panel, # source type [solar hes grid home pps diesel]
"get_rom_versions": "charging_energy_service/get_rom_versions", # Check for firmware update and download available packages, needs owner account
"get_device_info": "charging_energy_service/get_device_infos", # Wifi and MAC infos for provided devices, needs owner account
"get_wifi_info": "charging_energy_service/get_wifi_info", # Displays WiFi network connected to Home Power Panel, needs owner account
"get_installation_inspection": "charging_energy_service/get_installation_inspection", # appears to say which page last viewed on App, needs owner account
"get_utility_rate_plan": "charging_energy_service/get_utility_rate_plan", # needs owner account
"report_device_data": "charging_energy_service/report_device_data", # ctrol [0 1], works but data is null (may need owner account?)
"get_configs": "charging_energy_service/get_configs", # json={"siteId": "SITEID", "sn": "POWERPANELSN", "param_types": []})) # needs owner account, list of parm types not clear
"get_sns": "charging_energy_service/get_sns", # json={"main_sn": "POWERPANELSN","macs": ["F38001MAC001","F38002MAC002"]})) # needs owner account, Displays Serial Numbers of attached PPS in Home
"get_monetary_units": "charging_energy_service/get_world_monetary_unit", # monetary unit list for system, needs owner account
}
"""Following are the Anker Power/Solix Cloud API charging_hes_svc endpoints known so far. They are used for Home Energy Systems like X1."""
API_HES_SVC_ENDPOINTS: Final[dict] = {
"get_product_info": "charging_hes_svc/get_device_product_info", # List of Anker HES devices, works with shared account
"get_heat_pump_plan": "charging_hes_svc/get_heat_pump_plan_json", # heat pump plan, works with shared account
"get_electric_plan_list": "charging_hes_svc/get_electric_utility_and_electric_plan_list", # Energy plan if available for country & state combination, works with shared account
"get_system_running_info": "charging_hes_svc/get_system_running_info", # system runtime info, works with shared account
"get_system_profit": "charging_hes_svc/get_system_profit_detail", # works as member, {"siteId": siteId,"dateType": "year","start": "2025","end": ""} [day 2025-01-01, week, month 2025-01, year 2025], weekly syntax unklear
"energy_statistics": "charging_hes_svc/get_energy_statistics", # Energy stats for HES, # source type [solar hes grid home]
"get_monetary_units": "charging_hes_svc/get_world_monetary_unit", # monetary unit list for system, works with shared account
"get_install_info": "charging_hes_svc/get_install_info", # get system install info, works with shared account. Shows installation location
"get_wifi_info": "charging_hes_svc/get_wifi_info", # get device wifi info, works with shared account
"get_installer_info": "charging_hes_svc/get_installer_info", # no shared account access, Shows contact information of the installer
"get_system_running_time": "charging_hes_svc/get_system_running_time", # no shared account access, needs HES site?
"get_mi_layout": "charging_hes_svc/get_mi_layout", # no shared account access, needs HES site?
"get_conn_net_tips": "charging_hes_svc/get_conn_net_tips", # no shared account access, needs HES site?
"get_hes_dev_info": "charging_hes_svc/get_hes_dev_info", # works with shared account, lists hes device structure and SNs
"report_device_data": "charging_hes_svc/report_device_data", # no shared account access, needs HES site and installer system?
"get_evcharger_standalone": "charging_hes_svc/get_user_bind_and_not_in_station_evchargers", # works as member, but list may be empty
"get_evcharger_station_info": "charging_hes_svc/get_evcharger_station_info", # works as member, {"evChargerSn": deviceSn, "featuretype": 1}, featuretype [1,2]
}
""" Other endpoints neither implemented nor explored: 83 + 72 used => 155
'power_service/v1/get_message_not_disturb', # get do not disturb messages settings
'power_service/v1/message_not_disturb', # change do not disturb messages settings
'power_service/v1/read_message', # payload format unknown
'power_service/v1/add_message',
'power_service/v1/del_message',
'power_service/v1/dynamic_price/check_adjust', # works for members, but only applies on owned devices?, not sure what it does, {}, lists owned SB3 device with status code but also others
'power_service/v1/rfid/save_device_card',
'power_service/v1/rfid/delete_device_card',
'power_service/v1/site/can_create_site',
'power_service/v1/site/create_site',
'power_service/v1/site/update_site',
'power_service/v1/site/delete_site',
'power_service/v1/site/add_charging_device',
'power_service/v1/site/update_charging_device',
'power_service/v1/site/reset_charging_device',
'power_service/v1/site/delete_charging_device',
'power_service/v1/site/add_site_devices',
'power_service/v1/site/delete_site_devices',
'power_service/v1/site/update_site_devices',
'power_service/v1/site/get_addable_site_list', # show to which defined site a given model type can be added
'power_service/v1/site/get_comb_addable_sites',
'power_service/v1/site/shift_power_site_type', # maybe to convert to different system type, {"site_id": siteId, "power_site_type": 11}
'power_service/v1/site/local_net',
'power_service/v1/site/set_device_feature', # Set device feature for site_id and smart_plug list, may require owner, usage unknown, {"site_id": siteId, "smart_plug" : [value]}) May be used for automatic control of plugs in smart mode?
'power_service/v1/site/site_data_check' # works for member, {"site_id": siteId, "current_time": "2025-12-10"}, check if site has data
'power_service/v1/app/compatible/check_third_sn',
'power_service/v1/app/compatible/confirm_permissions_settings',
'power_service/v1/app/compatible/get_confirm_permissions', # works as member, {"device_model": "A17C0"} => "data": {"is_confirm": 1,"confirm_type": "APs"}
'power_service/v1/app/compatible/installation_popup',
'power_service/v1/app/compatible/save_compatible_solar',
'power_service/v1/app/compatible/set_ota_update',
'power_service/v1/app/compatible/save_ota_complete_status',
'power_service/v1/app/device/get_mes_device_info', # shows laser_sn field but no more info
'power_service/v1/app/device/get_relate_belong' # shows belonging of site type for given device
'power_service/v1/app/device/remove_param_config_key'
2*'power_service/v1/app/device/get_device_attrs'
2*'power_service/v1/app/device/set_device_attrs'
'power_service/v1/app/group/replace_group_devices',
2*'power_service/v1/app/group/get_group_devices'
'power_service/v1/app/group/save_group_devices',
'power_service/v1/app/group/force_save_group_devices',
'power_service/v1/app/group/delete_group_devices',
'power_service/v1/app/order/get_charging_order_list', # may need member EV_Charger, Get all orders in range, {"device_sn": deviceSn, "start_time": "2026-02-09"}
'power_service/v1/app/order/get_charging_order_detail', # # Data points for charts of order, also vehicle details {"device_sn": deviceSn, "order_id": orderId}
'power_service/v1/app/order/get_charging_order_sec_detail', # may need real EV_Charger? {"order_id": orderId,"start_time": <timestamp>}
'power_service/v1/app/order/get_charging_order_sec_preview', # may need real EV_Charger? {"order_id": orderId}
'power_service/v1/app/order/export_charge_order',
'power_service/v1/app/after_sale/get_popup', # works as site member, {"site_id": siteId}, get active pop ups with code
'power_service/v1/app/after_sale/check_popup',
'power_service/v1/app/after_sale/check_sn', # checks whether any account device SN is eligible for replacement of battery (recall programs?)
'power_service/v1/app/after_sale/mark_sn',
'power_service/v1/app/share_site/anonymous_join_site',
'power_service/v1/app/share_site/delete_site_member',
'power_service/v1/app/share_site/invite_member',
'power_service/v1/app/share_site/delete_inviting_member',
'power_service/v1/app/share_site/get_invited_list',
'power_service/v1/app/share_site/join_site',
2*'power_service/v1/app/user/get_user_param', # works as member, {"params": []} parameters are unknown
2*"power_service/v1/app/user/set_user_param",
'power_service/v1/app/whitelist/feature/check', # Unclear what this is used for, requires check_list with objects for unknown feature_code e.g. {"check_list": [{"feature_code": "smartmeter", "product_code": "A17C5"}]}
'power_service/v1/app/get_phonecode_list',
'power_service/v1/app/get_annual_report', # new report starting Jan 2025?
'power_service/v1/app/report_tlv_event', # tamper event? unknown what events to report, {"device_sn": deviceSn, "events": [{}]}
'power_service/v1/app/shelly_ctrl_device', # {"device_sn": deviceSn, "op_type": "parameter", "value": value})) # Control shelly device settings, may require owner, usage known
'power_service/v1/app/upgrade_event_report', # post an entry to upgrade event report
'power_service/v1/app/mothly_report_show', # This is no typo in the endpoint! Get link to actual html report, but App is required to view
'power_service/v1/app/mothly_report_list', # This is no typo in the endpoint! List existing monthly reports {"site_id": siteId}
'power_service/v1/app/get_monthly_report_configs', # get the monthly report messages {"site_id": siteId}
'power_service/v1/app/set_monthly_report_configs', # configure the monthly report messages
'power_service/v1/app/get_device_last_exercise_log' # {"device_sn": deviceSn, "exercise_type": 3}
'power_service/v1/app/get_device_exercise_log' # {"device_sn": deviceSn, "exercise_type": 3, "page": 3, "page_size": 80}
'power_service/v1/app/get_parts_maintenance_logs'
'power_service/v1/app/get_parts_maintenance_plan'
'power_service/v1/app/get_oil_consumption_reminder_plan_details' # {"device_sn": deviceSn}
'power_service/v1/app/get_device_exercise_details' # {"device_sn": deviceSn}
'power_service/v1/app/batch_maintain_oil_engine_parts'
'power_service/v1/app/set_maintain_parts_notice_switch'
'power_service/v1/app/set_parts_maintenance_plan'
'power_service/v1/app/set_oil_machine_exercise_plan'
'power_service/v1/app/start_oil_machine_exercise'
'power_service/v1/app/switch_exercise_mode'
'power_service/v1/app/set_oil_consumption_reminder_switch'
'power_service/v1/app/set_oil_consumption_reminder_plan'
'power_service/v1/app/set_maintain_parts_ignore_reminders'
related to micro inverter without system: 1 + 6 used => 7 total
'charging_pv_svc/getMiStatus',
App related: 18 + 3 used => 21 total
'app/devicemanage/update_relate_device_info',
'app/cloudstor/get_app_up_token_general',
'app/cloudstor/get_app_up_token_without_login',
'app/logging/get_device_logging',
'app/logging/upload',
'app/logging/upload_pb_events',
'app/devicerelation/up_alias_name', # Update Alias name of device? Fails with (10003) Failed to request
'app/devicerelation/un_relate_and_unbind_device',
'app/devicerelation/relate_device',
'app/devicerelation/device_invite', # Sharing of EV charger devices, {"nick_name": "lol***", "email": "<email>", "invites": [{"device_sn": deviceSn, "member_type": 1}]}
'app/devicerelation/confirm_invite', # accept invite
'app/devicerelation/ignore_invite',
'app/devicerelation/update_share',
'app/devicerelation/clear_share',
'app/news/get_popups',
'app/news/popup_record',
'app/push/clear_count',
'app/push/register_push_token',
Passport related: 30 + 0 used => 30 total
'passport/get_user_param', # specify param_type which must be parsable as list of int, but does not show anything in response
'passport/update_user_param',
'passport/get_subscriptions, # get user email, accept_survey, subscribe, phone_number, sms_subscribe
'passport/set_subscriptions',
'passport/get_profile', # get email, nickname, geokey, userid and some profile info
'passport/login',
'passport/logout',
'passport/update_profile',
'passport/change_password',
'passport/forget_password',
'passport/set_account_password',
'passport/validate_pass',
'passport/destroy_user',
'passport/phone_reset_password',
'passport/phone_verification_login',
'passport/phone_verification_regist',
'passport/phone_code_list',
'passport/external_login',
'passport/third_party_login',
'passport/freeze_account',
'passport/register',
'passport/resend_active_email',
'passport/validate_email', # verify if an email is already registered
'passport/terminal_id',
'passport/estimate_domain',
'passport/phone_bind_account',
'passport/phone_verification_code',
'passport/subscription_configs', # get show_sms
'passport/discount_desc', # get title, sub_title, button and sub_button
PPS and Power Panel related: 6 + 12 used => 18 total
"charging_energy_service/sync_installation_inspection", #Unknown at this time
"charging_energy_service/sync_config",
"charging_energy_service/restart_peak_session",
"charging_energy_service/preprocess_utility_rate_plan",
"charging_energy_service/ack_utility_rate_plan",
"charging_energy_service/adjust_station_price_unit",
"charging_common_svc/location/get", # Get default and identifier location for identifier_id, identifier_type, business_type with longitude, latitude, country_code, place_id, display_name, formatted_address
"charging_common_svc/location/set", # Set default and identifier location
"charging_common_svc/location/support",
Home Energy System related (X1): 44 + 20 used => 64 total
"charging_hes_svc/adjust_station_price_unit",
"charging_hes_svc/cancel_pop",
"charging_hes_svc/check_update",
"charging_hes_svc/check_device_bluetooth_password",
"charging_hes_svc/check_function",
"charging_hes_svc/device_command",
"charging_hes_svc/device_self_check",
"charging_hes_svc/deal_share_data",
"charging_hes_svc/download_energy_statistics",
"charging_hes_svc/get_auto_disaster_prepare_status",
"charging_hes_svc/get_auto_disaster_prepare_detail",
"charging_hes_svc/get_back_up_history",
"charging_hes_svc/get_current_disaster_prepare_detail",
"charging_hes_svc/get_device_command",
"charging_hes_svc/get_device_pn_info",
"charging_hes_svc/get_device_card_list",
"charging_hes_svc/get_device_card_details",
"charging_hes_svc/get_device_self_check",
"charging_hes_svc/get_external_device_config",
"charging_hes_svc/get_history_setting", # needs owner
"charging_hes_svc/get_site_mi_list",
"charging_hes_svc/get_station_config_and_status",
"charging_hes_svc/get_system_device_time",
"charging_hes_svc/get_tou_price_plan_detail",
"charging_hes_svc/get_user_fault_info",
"charging_hes_svc/get_station_evchargers", # needs owner
"charging_hes_svc/get_utility_rate_plan",
"charging_hes_svc/get_vpp_check_code",
"charging_hes_svc/get_vpp_service_policy_by_agg_user",
"charging_hes_svc/update_device_info_by_app",
"charging_hes_svc/update_hes_utility_rate_plan",
"charging_hes_svc/update_wifi_config",
"charging_hes_svc/upload_device_status",
"charging_hes_svc/user_event_alarm",
"charging_hes_svc/user_fault_alarm",
"charging_hes_svc/ota",
"charging_hes_svc/quit_auto_disaster_prepare",
"charging_hes_svc/remove_user_fault_info",
"charging_hes_svc/restart_peak_session",
"charging_hes_svc/start",
2*"charging_hes_svc/set_station_evchargers",
"charging_hes_svc/set_evcharger_station_feature",
"charging_hes_svc/sync_back_up_history",
"charging_hes_svc/share_device/delete_installer_inviting_member",
"charging_hes_svc/share_device/invite_installer_member",
"charging_hes_svc/share_device/get_installer_invited_list",
Home Energy System related (X1): 7 + 0 used => 7 total
"charging_hes_dynamic_price_svc/get_area_by_code", # needs owner
"charging_hes_dynamic_price_svc/get_price_company", # needs owner
"charging_hes_dynamic_price_svc/get_price", # needs owner
"charging_hes_dynamic_price_svc/save_time_of_use", # needs owner
"charging_hes_dynamic_price_svc/save_dynamic_price", # needs owner
"charging_hes_dynamic_price_svc/get_third_jump_url"
related to what, seem to work with Power Panel sites: 7 + 0 used => 7 total
'charging_disaster_prepared/get_site_device_disaster', # {"identifier_id": siteId, "type": 2})) # works with Power panel site and shared account
'charging_disaster_prepared/get_site_device_disaster_status', # {"identifier_id": siteId, "type": 2})) # works with Power panel site and shared account
'charging_disaster_prepared/set_site_device_disaster',
'charging_disaster_prepared/clear',
'charging_disaster_prepared/quit_disaster_prepare',
'charging_disaster_prepared/get_support_func', # {"identifier_id": siteId, "type": 2})) # works with Power panel site and shared account
'charging_disaster_prepared/disaster_detail',
related to Prime charger models: 8 + 9 used => 17 total
'mini_power/v1/app/charging/update_charging_mode',
'mini_power/v1/app/charging/add_charging_mode',
'mini_power/v1/app/charging/delete_charging_mode',
'mini_power/v1/app/setting/set_charging_mode_status',
'mini_power/v1/app/egg/add_easter_egg_trigger_record',
'mini_power/v1/app/egg/report_easter_egg_trigger_status', # {"device_sn": deviceSn, "report_time": 1734969388, "egg_type": 1}
'mini_power/v1/app/setting/set_compatibility_status',
'mini_power/v1/app/style/get_manual_clock_screensavers',
'mini_power/v1/app/style/add_manual_clock_screensavers',
'mini_power/v1/app/style/delete_manual_clock_screensavers',
'mini_power/v1/app/style/get_url',
'mini_power/v1/app/style/set_manual_clock_screensaver_name',
Structure of the JSON response for an API Login Request:
An unexpired token_id must be used for API request, along with the gtoken which is an MD5 hash of the returned(encrypted) user_id.
The combination of the provided token and MD5 hashed user_id authenticate the client to the server.
The Login Response is cached in a JSON file per email user account and can be reused by this API class without further login request.
ATTENTION: Anker allows only 1 active token on the server per user account. Any login for the same account (e.g. via Anker mobile App) will kickoff the token used in this Api instance and further requests are no longer authorized.
Currently, the Api will re-authenticate automatically and therefore may kick off the other user that obtained the actual access token (e.g. kick out the App user again when used for regular Api requests)
NOTES: Parallel Api instances should use different user accounts. They may work in parallel when all using the same cached authentication data. The first API instance with failed authorization will restart a new Login request and updates
the cached JSON file. Other instances should recognize an update of the cached JSON file and will refresh their login credentials in the instance for the actual token and gtoken without new login request.
"""
# Following are the JSON filename prefixes for exported endpoint names as defined previously
API_FILEPREFIXES: Final[dict] = {
# mqtt message prefixes
"mqtt_message": "mqtt_msg",
# power_service endpoint file prefixes
"homepage": "homepage",
"site_list": "site_list",
"bind_devices": "bind_devices",
"user_devices": "user_devices",
"charging_devices": "charging_devices",
"get_auto_upgrade": "auto_upgrade",
"get_config": "config",
"site_rules": "list_site_rules",
"get_installation": "installation",
"get_site_price": "price",
"get_site_power_limit": "power_limit",
"get_device_parm": "device_parm",
"get_product_categories": "list_products",
"get_product_accessories": "list_accessories",
"get_third_platforms": "list_third_platforms",
"get_token_by_userid": "get_token",
"get_shelly_status": "shelly_status",
"scene_info": "scene",
"site_detail": "site_detail",
"wifi_list": "wifi_list",
"energy_solarbank": "energy_solarbank",
"energy_solar_production": "energy_solar_production",
"energy_home_usage": "energy_home_usage",
"energy_grid": "energy_grid",
"solar_info": "solar_info",
"compatible_process": "compatible_process",
"get_cutoff": "power_cutoff",
"get_device_fittings": "device_fittings",
"get_device_load": "device_load",
"get_ota_batch": "ota_batch",
"get_ota_update": "ota_update",
"get_ota_info": "ota_info",
"get_upgrade_record": "upgrade_record",
"check_upgrade_record": "check_upgrade_record",
"get_shared_device": "shared_device",
"get_device_attributes": "device_attrs",
"get_message_unread": "message_unread",
"get_currency_list": "currency_list",
"get_co2_ranking": "co2_ranking",
"get_forecast_schedule": "forecast_schedule",
"get_dynamic_price_sites": "dynamic_price_sites",
"get_dynamic_price_providers": "dynamic_price_providers",
"get_dynamic_price_details": "dynamic_price_details",
"get_device_income": "device_income",
"get_ai_ems_status": "ai_ems_status",
"get_ai_ems_profit": "ai_ems_profit",
"get_tamper_records": "tamper_records",
"get_device_rfid_cards": "rfid_cards",
"get_device_group": "device_group",
"get_device_charge_order_stats": "charge_order_stats",
"get_device_charge_order_stats_list": "charge_order_stats_list",
"get_ocpp_endpoint_list": "ocpp_endpoint_list",
"get_device_ocpp_info": "ocpp_info",
"get_vehicle_brands": "vehicle_brands",
"get_vehicle_brand_models": "vehicle_brand_models",
"get_vehicle_model_years": "vehicle_model_years",
"get_vehicle_year_attributes": "vehicle_year_attributes",
"get_user_vehicles": "user_vehicles",
"get_user_vehicle_details": "user_vehicle_details",
"api_account": "api_account",
"api_sites": "api_sites",
"api_devices": "api_devices",
# charging_pv_svc endpoint file prefixes
"get_device_pv_status": "device_pv_status",
"get_device_pv_total_statistics": "device_pv_total_statistics",
"get_device_pv_statistics": "device_pv_statistics",
"get_device_pv_price": "device_pv_price",
# power charger endpoint file prefixes
"charger_get_charging_modes": "charger_charging_modes",
"charger_get_triggers": "charger_triggers",
"charger_get_statistics": "charger_statistics",
"charger_get_device_setting": "charger_device_setting",
"charger_get_screensavers": "charger_screensavers",
# charging_energy_service endpoint file prefixes
"charging_get_error_info": "charging_error_info",
"charging_get_system_running_info": "charging_system_running_info",
"charging_energy_solar": "charging_energy_solar",
"charging_energy_hes": "charging_energy_hes",
"charging_energy_pps": "charging_energy_pps",
"charging_energy_home": "charging_energy_home",
"charging_energy_grid": "charging_energy_grid",
"charging_energy_diesel": "charging_energy_diesel",
"charging_energy_solar_today": "charging_energy_solar_today",
"charging_energy_hes_today": "charging_energy_hes_today",
"charging_energy_pps_today": "charging_energy_pps_today",
"charging_energy_home_today": "charging_energy_home_today",
"charging_energy_grid_today": "charging_energy_grid_today",
"charging_energy_diesel_today": "charging_energy_diesel_today",
"charging_get_rom_versions": "charging_rom_versions",
"charging_get_device_info": "charging_device_info",
"charging_get_wifi_info": "charging_wifi_info",
"charging_get_installation_inspection": "charging_installation_inspection",
"charging_get_utility_rate_plan": "charging_utility_rate_plan",
"charging_report_device_data": "charging_report_device_data",
"charging_get_configs": "charging_configs",
"charging_get_sns": "charging_sns",
"charging_get_monetary_units": "charging_monetary_units",
# charging_energy_service endpoint file prefixes
"hes_get_product_info": "hes_product_info",
"hes_get_heat_pump_plan": "hes_heat_pump_plan",
"hes_get_electric_plan_list": "hes_electric_plan",
"hes_get_system_running_info": "hes_system_running_info",
"hes_energy_solar": "hes_energy_solar",
"hes_energy_hes": "hes_energy_hes",
"hes_energy_pps": "hes_energy_pps",
"hes_energy_home": "hes_energy_home",
"hes_energy_grid": "hes_energy_grid",
"hes_energy_solar_today": "hes_energy_solar_today",
"hes_energy_hes_today": "hes_energy_hes_today",
"hes_energy_pps_today": "hes_energy_pps_today",
"hes_energy_home_today": "hes_energy_home_today",
"hes_energy_grid_today": "hes_energy_grid_today",
"hes_get_monetary_units": "hes_monetary_units",
"hes_get_install_info": "hes_install_info",
"hes_get_wifi_info": "hes_wifi_info",
"hes_get_installer_info": "hes_installer_info",
"hes_get_system_profit": "hes_system_profit",
"hes_get_system_running_time": "hes_system_running_time",
"hes_get_mi_layout": "hes_mi_layout",
"hes_get_conn_net_tips": "hes_conn_net_tips",
"hes_get_hes_dev_info": "hes_dev_info",
"hes_report_device_data": "hes_report_device_data",
"hes_get_evcharger_standalone": "hes_evcharger_standalone",
"hes_get_evcharger_station_info": "hes_evcharger_station_info",
}
""" Anker Solix Device overview
Model Name Platform
----------------------------------------------------------------------------------------------------
A110A 26K Prime Power Bank Power Bank
A110B 20K Prime Power Bank Power Bank
A1722 SOLIX C300 Portable Power Station
A1723 SOLIX C300X Portable Power Station
A1725 SOLIX C200(X) Portable Power Station
A1726 SOLIX C300 DC Portable Power Station
A1727 SOLIX C200 DC Portable Power Station
A1728 SOLIX C300X DC Portable Power Station
A1729 SOLIX C200X DC Portable Power Station
A1753 SOLIX C800 Portable Power Station
A1754 SOLIX C800 Plus Portable Power Station
A1755 SOLIX C800X Portable Power Station
A1761 SOLIX C1000(X) Portable Power Station
A1762 Portable Power Station 1000 Portable Power Station
A1763 SOLIX C1000 Gen 2 Portable Power Station
A1765 SOLIX C1000X Gen 2 Portable Power Station
A1770 F1200 (Bluetooth) Portable Power Station
A1771 F1200 (Bluetooth and WLAN) Portable Power Station
A1772 SOLIX F1500 Portable Power Station
A1780 767 PowerHouse (SOLIX F2000) Portable Power Station
A1780P 767 Power House (SOLIX F2000) with WLAN Portable Power Station
A1781 SOLIX F2600 Portable Power Station
A1782 SOLIX F3000 Portable Power Station
A1783 SOLIX C2000 Gen 2 Portable Power Station
A1785 SOLIX C2000X Gen 2 Portable Power Station
A1790 SOLIX F3800 Portable Power Station
A1790P SOLIX F3800 Plus Portable Power Station
A17A0 Powered Cooler 30 Powered Cooler
A17A1 Powered Cooler 40 Powered Cooler
A17A2 Powered Cooler 50 Powered Cooler
A17A3 SOLIX Everfrost 2 23L Powered Cooler
A17A4 SOLIX Everfrost 2 40L Powered Cooler
A17A5 SOLIX Everfrost 2 58L Powered Cooler
A17B1 SOLIX Home Power Panel Power Solution
A17C0 Solarbank E1600 Balcony Solar Power System
A17C1 Solarbank 2 E1600 Pro Balcony Solar Power System
A17C2 Solarbank 2 E1600 AC Balcony Solar Power System
A17C3 Solarbank 2 E1600 Plus Balcony Solar Power System
A17C5 Solarbank 3 E2700 Pro Balcony Solar Power System
A17X7 Smart Meter Accessory
A17X8 Smart Plug Accessory
A1903 150W Charging Base Charger
A2345 250W Prime Charger Charger
A25X7 Prime Wireless Charger Charger
A2687 160W Prime Charger Charger
A5101 X1-P6K-US/S Residential Storage System
A5102 X1-H(3.68~6)K-S Residential Storage System
A5103 X1-H (5~12)K-T Residential Storage System
A5140 MI60 Microinverter Balcony Solar Power System
A5143 MI80 Microinverter(BLE) Balcony Solar Power System
A5150 Microinverter Residential Storage System
A5191 V1 Smart EV Charger Smart EV Charger
A5220 X1 Battery Module Residential Storage System
A5341 Backup Controller Residential Storage System
A5450 Zigbee Dongle Residential Storage System
A91B2 240W Charging Station Charger
AE100 SOLIX Power Dock Balcony Solar Power System
AE1R0 Anker SOLIX P1 Meter Accessory
AS100 C1000 Gen 2 LE Portable Power Station
AX1S0 Power Dock Pro Residential Storage System
----------------------------------------------------------------------------------------------------
"""
LOGIN_RESPONSE: dict = {
"user_id": str,
"email": str,
"nick_name": str,
"auth_token": str,
"token_expires_at": int,
"avatar": str,
"mac_addr": str,
"domain": str,
"ab_code": str,
"token_id": int,
"geo_key": str,
"privilege": int,
"phone_code": str,
"phone": str,
"phone_number": str,
"phone_code_2fa": str,
"phone_2fa": str,
"server_secret_info": {"public_key": str},
"params": list,
"trust_list": list,
"fa_info": {"step": int, "info": str},
"country_code": str,
"ap_cloud_user_id": str,
}
class SolixDeviceType(Enum):
"""Enumeration for Anker Solix device types."""
ACCOUNT = "account"
SYSTEM = "system"
VIRTUAL = "virtual"
SOLARBANK = "solarbank"
COMBINER_BOX = "combiner_box"
INVERTER = "inverter"
SMARTMETER = "smartmeter"
SMARTPLUG = "smartplug"
PPS = "pps"
POWERPANEL = "powerpanel"
POWERCOOLER = "powercooler"
HES = "hes"
SOLARBANK_PPS = "solarbank_pps"
CHARGER = "charger"
POWERBANK = "powerbank"
EV_CHARGER = "ev_charger"
VEHICLE = "vehicle"
class SolixParmType(Enum):
"""Enumeration for Anker Solix Parameter types."""
SOLARBANK_SCHEDULE = "4"
SOLARBANK_2_SCHEDULE = "6"
SOLARBANK_SCHEDULE_ENFORCED = "9" # No longer supported by cloud as of July 2025
SOLARBANK_TARIFF_SCHEDULE = "12"
SOLARBANK_AUTHORIZATIONS = "13"
SOLARBANK_POWERDOCK = "16" # get power dock SN
SOLARBANK_STATION = "18" # station settings for site, like SOC reserve and grid export switch, works for systems that support power dock
# SOLARBANK_EV_CHARGER = "23" # EV Charger switch?
SOLARBANK_3RD_PARTY_PV = "26" # third party PV settings for site
class SolarbankPowerMode(IntEnum):
"""Int Enumeration for Anker Solix Solarbank 1 Power setting modes."""
unknown = 0
normal = 1
advanced = 2
class SolarbankDischargePriorityMode(IntEnum):
"""Int Enumeration for Anker Solix Solarbank 1 Discharge priority setting modes."""
unknown = -1
off = 0
on = 1
class SolarbankAiemsStatus(IntEnum):
"""Int Enumeration for Anker Solix Solarbank Anker Intelligence status."""
unknown = 0
untrained = 3
learning = 4
trained = 5
class SolarbankAiemsRuntimeStatus(IntEnum):
"""Int Enumeration for Anker Solix Solarbank Anker Intelligence runtime status.
Following combinations of ai_ems status abd ai_ems runtime information were seen:
- left_time > 0 with runtime status 0 => learning phase status 4 without runtime failure
- left_time < 0 with runtime status 1 => trained and continues collecting data
- left_time < 0 with runtime status 2 => untrained, most likely failure during learning or learning stopped
"""
unknown = -1
inactive = 0
running = 1
failure = 2
class SolixTariffTypes(IntEnum):
"""Int Enumeration for Anker Solix Solarbank 2 AC / 3 Use Time Tariff Types."""
UNKNOWN = 0 # Pseudo type to reflect no known tariff defined
PEAK = 1 # maximize PV and Battery usage, no AC charge
MID_PEAK = 2 # maximize PV and Battery usage, no AC charge
OFF_PEAK = 3 # maximize PV and Battery usage, no AC charge, discharge only above 80% SOC, Reserve charge utilized only for PEAK & MID PEAK times
VALLEY = (
4 # AC charge allowed, charge power depends on SOC and available VALLEY time
)
class SolixPriceTypes(StrEnum):
"""Str Enumeration for Anker Solix Solarbank 2 AC / 3 Use Time Tariff Types."""
UNKNOWN = "unknown"
FIXED = "fixed"
USE_TIME = "use_time"
DYNAMIC = "dynamic"
class SolixDayTypes(StrEnum):
"""Str Enumeration for Anker Solix Solarbank 2 AC / 3 Use Time Day Types."""
WEEKDAY = "weekday"
WEEKEND = "weekend"
ALL = "all"
class SolarbankUsageMode(IntEnum):
"""Int Enumeration for Anker Solix Solarbank 2/3 Power Usage modes."""
unknown = 0 # AC output based on measured smart meter power
smartmeter = 1 # AC output based on measured smart meter power
smartplugs = 2 # AC output based on measured smart plug power
manual = 3 # manual time plan for home load output
backup = 4 # This is used to reflect active backup mode in scene_info, but this mode cannot be set directly in schedule and mode is just temporary
use_time = 5 # Use Time plan with AC types and smart meter
# smart_learning = 6 # TODO(SB3): To be confirmed
smart = 7 # Smart mode for AI based charging and discharging
time_slot = 8 # Time slot mode for dynamic tariffs
@dataclass(frozen=True)
class SolarbankRatePlan:
"""Dataclass for Anker Solix Solarbank 2/3 rate plan types per usage mode."""
# rate plan per usage mode
unknown: str = ""
smartmeter: str = "" # does not use a plan
smartplugs: str = "blend_plan"
manual: str = "custom_rate_plan"
backup: str = "manual_backup"
use_time: str = "use_time"
# smart_learning: str = "" # TODO(SB3): To be confirmed if this is a valid mode and plan
smart: str = "" # does not use a plan "ai_ems"
time_slot: str = "time_slot"
@dataclass(frozen=True)
class ApiEndpointServices:
"""Dataclass to specify supported Api endpoint services. Each service type should be implemented with dedicated Api class."""
# Note: The service endpoints may not be supported on every cloud server. It may depend on supported Anker products per geo
power: str = "power_service"
charging: str = "charging_energy_service"
hes_svc: str = "charging_hes_svc"
@dataclass(frozen=True)
class ApiCategories:
"""Dataclass to specify supported Api categories for regular Api cache refresh cycles."""
account_info: str = "account_info"
site_price: str = "site_price"
device_auto_upgrade: str = "device_auto_upgrade"
device_tag: str = "device_tag"
solar_energy: str = "solar_energy"
solarbank_energy: str = "solarbank_energy"
solarbank_fittings: str = "solarbank_fittings"
solarbank_cutoff: str = "solarbank_cutoff"
solarbank_solar_info: str = "solarbank_solar_info"
smartmeter_energy: str = "smartmeter_energy"
smartplug_energy: str = "smartplug_energy"
powerpanel_energy: str = "powerpanel_energy"
powerpanel_avg_power: str = "powerpanel_avg_power"
hes_energy: str = "hes_energy"
hes_avg_power: str = "hes_avg_power"
mqtt_devices: str = "mqtt_devices"
@dataclass(frozen=True)
class SolixDeviceNames:
"""Dataclass for Anker Solix device names that are now provided via the various product list queries."""
SHEM3: str = "Shelly 3EM"
SHEMP3: str = "Shelly Pro 3EM"
SHPPS: str = "Shelly Plus Plug S"
AE100: str = "Power Dock AE100"
@dataclass(frozen=True)
class SolixDeviceCapacity:
"""Dataclass for Anker Solix device battery capacities in Wh by Part Number."""
A110A: int = 100 # Anker Prime Power Bank 300 W, 25Ah, 99,75 Wh
A110B: int = 72 # Anker Prime Power Bank 220 W, 20Ah, 72,4 Wh
A17C0: int = 1600 # SOLIX Solarbank E1600
A17C1: int = 1600 # SOLIX Solarbank 2 E1600 Pro
A17C2: int = 1600 # SOLIX Solarbank 2 E1600 AC
A17C3: int = 1600 # SOLIX Solarbank 2 E1600 Plus
A17C5: int = 2688 # SOLIX Solarbank 3 E2700 Pro
A1720: int = 256 # Anker PowerHouse 521 Portable Power Station
A1722: int = 288 # SOLIX C300 Portable Power Station
A1723: int = 288 # SOLIX C300X Portable Power Station
A1725: int = 230 # SOLIX C200(X) Portable Power Station
A1726: int = 288 # SOLIX C300 DC Portable Power Station
A1727: int = 192 # SOLIX C200 DC Portable Power Station
A1728: int = 288 # SOLIX C300X DC Portable Power Station
A1729: int = 230 # SOLIX C200X DC Portable Power Station
A1751: int = 512 # Anker PowerHouse 535 Portable Power Station
A1753: int = 768 # SOLIX C800 Portable Power Station
A1754: int = 768 # SOLIX C800 Plus Portable Power Station
A1755: int = 768 # SOLIX C800X Portable Power Station
A1760: int = 1024 # Anker PowerHouse 555 Portable Power Station
A1761: int = 1056 # SOLIX C1000(X) Portable Power Station
A1762: int = 1056 # SOLIX Portable Power Station 1000
A1763: int = 1024 # SOLIX C1000 Gen 2 Portable Power Station
A1765: int = 1024 # SOLIX C1000X Gen 2 Portable Power Station
AS100: int = 1024 # SOLIX C1000 Gen 2 LE Portable Power Station
A1770: int = 1229 # Anker PowerHouse 757 Portable Power Station
A1771: int = 1229 # SOLIX F1200 Portable Power Station
A1772: int = 1536 # SOLIX F1500 Portable Power Station
A1780: int = 2048 # SOLIX F2000 Portable Power Station (PowerHouse 767)
A1780_1: int = 2048 # Expansion Battery for F2000
A1780P: int = (
2048 # SOLIX F2000 Plus Portable Power Station (PowerHouse 767) with WIFI
)
A1781: int = 2560 # SOLIX F2600 Portable Power Station
A1782: int = 3072 # SOLIX F3000 Portable Power Station with Smart Meter support
A1783: int = (
2048 # SOLIX C2000 Gen 2 Portable Power Station with Smart Meter support
)
A1785: int = (
2048 # SOLIX C2000X Gen 2 Portable Power Station with Smart Meter support
)
A1790: int = 3840 # SOLIX F3800 Portable Power Station
A1790_1: int = 3840 # SOLIX BP3800 Expansion Battery for F3800
A1790P: int = 3840 # SOLIX F3800 Plus Portable Power Station
A5220: int = 5000 # SOLIX X1 Battery module
@dataclass(frozen=True)
class SolixSiteType:
"""Dataclass for Anker Solix System/Site types according to the main device in site rules."""
t_0 = SolixDeviceType.VIRTUAL.value # Virtual site, only standalone inverter A5143
t_1 = SolixDeviceType.PPS.value # Main A5143 + FS1200
t_2 = SolixDeviceType.SOLARBANK.value # Main A17C0 SB1
t_3 = SolixDeviceType.HES.value # Main A5103, Note: This is not listed in actual site rules, but X1 export showing type 3 instead of 9 as site rules say
t_4 = SolixDeviceType.POWERPANEL.value # Main A17B1
t_5 = SolixDeviceType.SOLARBANK.value # Main A17C1 SB2 Pro, can also add SB1
t_6 = SolixDeviceType.HES.value # Main A5341 HES Backup Controller
t_7 = SolixDeviceType.HES.value # Main A5101 HES
t_8 = SolixDeviceType.HES.value # Main A5102 HES
t_9 = SolixDeviceType.HES.value # Main A5103 HES
t_10 = SolixDeviceType.SOLARBANK.value # Main A17C3 SB2 Plus, can also add SB1
t_11 = SolixDeviceType.SOLARBANK.value # Main A17C2 SB2 AC
t_12 = (
SolixDeviceType.SOLARBANK.value
) # Main A17C5 SB3 Pro, including power dock option for SB3 multisystems
t_13 = SolixDeviceType.SOLARBANK_PPS.value # Main A1782 SOLIX F3000 Portable Power Station (Solarbank PPS) with Smart Meter support for US market
t_14 = SolixDeviceType.EV_CHARGER.value # Main A5191 Smart EV Charger
# t_15 = ??? # Main A17E1 & A17X7US Smart Meter for US market
# t_16 = ??? # Main A1903 Charging base & 4 each A110A, A110B, A110G, A1341
# t_17 = ??? # Only AX170
t_18 = SolixDeviceType.SOLARBANK.value # Main AE100 Power Dock for SB2+, A17C1, A17C3, A17C5, A17X7, SHEM3, SHEMP3, A17X8, SHPPS, A5191
@dataclass(frozen=True)
class SolixDeviceCategory:
"""Dataclass for Anker Solix device types by Part Number to be used for standalone/unbound device categorization."""
# Solarbanks
A17C0: str = (
SolixDeviceType.SOLARBANK.value + "_1"
) # SOLIX Solarbank E1600, generation 1
A17C1: str = (
SolixDeviceType.SOLARBANK.value + "_2"
) # SOLIX Solarbank 2 E1600 Pro, generation 2
A17C2: str = (
SolixDeviceType.SOLARBANK.value + "_2"
) # SOLIX Solarbank 2 E1600 AC, generation 2
A17C3: str = (
SolixDeviceType.SOLARBANK.value + "_2"
) # SOLIX Solarbank 2 E1600 Plus, generation 2
A17C5: str = (
SolixDeviceType.SOLARBANK.value + "_3"
) # SOLIX Solarbank 3 E2700 Pro, generation 3
# Station
AE100: str = SolixDeviceType.COMBINER_BOX.value # SOLIX Power Dock
# Inverter
A5140: str = SolixDeviceType.INVERTER.value # MI60 Inverter
A5143: str = SolixDeviceType.INVERTER.value # MI80 Inverter
# Smart Meter
A17X7: str = SolixDeviceType.SMARTMETER.value # SOLIX Smart Meter
A17X7US: str = SolixDeviceType.SMARTMETER.value # SOLIX Smart Meter for US
AE1R0: str = SolixDeviceType.SMARTMETER.value # SOLIX P1 Meter
SHEM3: str = SolixDeviceType.SMARTMETER.value # Shelly 3EM Smart Meter
SHEMP3: str = SolixDeviceType.SMARTMETER.value # Shelly 3EM Pro Smart Meter
# Smart Plug
A17X8: str = SolixDeviceType.SMARTPLUG.value # SOLIX Smart Plug
SHPPS: str = SolixDeviceType.SMARTPLUG.value # Shelly Smart Plug
# Portable Power Stations (PPS)
A1720: str = (
SolixDeviceType.PPS.value
) # Anker PowerHouse 521 Portable Power Station
A1722: str = SolixDeviceType.PPS.value # SOLIX C300 Portable Power Station
A1723: str = SolixDeviceType.PPS.value # SOLIX C300X Portable Power Station
A1725: str = SolixDeviceType.PPS.value # SOLIX C200(X) Portable Power Station
A1726: str = SolixDeviceType.PPS.value # SOLIX C300 DC Portable Power Station
A1727: str = SolixDeviceType.PPS.value # SOLIX C200 DC Portable Power Station
A1728: str = SolixDeviceType.PPS.value # SOLIX C300X DC Portable Power Station
A1729: str = SolixDeviceType.PPS.value # SOLIX C200X DC Portable Power Station