@teslemetry/api 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -3115,8 +3115,8 @@ var TeslemetryStream = class extends events.EventEmitter {
3115
3115
  this.cloudCache = options.cache;
3116
3116
  this.localCache = options.cache;
3117
3117
  } else {
3118
- this.cloudCache = options?.cache?.cloud;
3119
- this.localCache = options?.cache?.local;
3118
+ this.cloudCache = options?.cache?.cloud ?? true;
3119
+ this.localCache = options?.cache?.local ?? true;
3120
3120
  }
3121
3121
  this.logger = root.logger;
3122
3122
  if (this.vin) this.getVehicle(this.vin);
@@ -3341,11 +3341,30 @@ var TeslemetryChargingApi = class {
3341
3341
  }
3342
3342
  };
3343
3343
 
3344
+ //#endregion
3345
+ //#region src/reuse.ts
3346
+ const reuse = (linger = 0) => {
3347
+ let promise = null;
3348
+ return async (func) => {
3349
+ if (promise) return promise;
3350
+ try {
3351
+ promise = func();
3352
+ return await promise;
3353
+ } finally {
3354
+ setTimeout(() => promise = null, linger);
3355
+ }
3356
+ };
3357
+ };
3358
+
3344
3359
  //#endregion
3345
3360
  //#region src/TeslemetryEnergyApi.ts
3346
3361
  var TeslemetryEnergyApi = class extends events.EventEmitter {
3347
3362
  root;
3348
3363
  siteId;
3364
+ cache = {
3365
+ siteInfo: null,
3366
+ liveStatus: null
3367
+ };
3349
3368
  refreshDelay = 3e4;
3350
3369
  refreshInterval = {
3351
3370
  siteInfo: null,
@@ -3362,6 +3381,11 @@ var TeslemetryEnergyApi = class extends events.EventEmitter {
3362
3381
  this.siteId = siteId;
3363
3382
  root.api.energySites.set(siteId, this);
3364
3383
  }
3384
+ on(event, listener) {
3385
+ const cached = this.cache[event];
3386
+ if (cached) listener(cached);
3387
+ return super.on(event, listener);
3388
+ }
3365
3389
  /**
3366
3390
  * Adjust the site's backup reserve.
3367
3391
  * @param backup_reserve_percent The backup reserve percentage
@@ -3413,29 +3437,37 @@ var TeslemetryEnergyApi = class extends events.EventEmitter {
3413
3437
  });
3414
3438
  return data;
3415
3439
  }
3440
+ getLiveStatusReuse = reuse(1e3);
3416
3441
  /**
3417
3442
  * Returns the live status of the site (power, state of energy, grid status, storm mode).
3418
3443
  * @return Promise to an object with response containing current live status of the energy site
3419
3444
  */
3420
3445
  async getLiveStatus() {
3421
- const { data } = await getApi1EnergySitesByIdLiveStatus({
3422
- path: { id: this.siteId },
3423
- client: this.root.client
3446
+ return this.getLiveStatusReuse(async () => {
3447
+ const { data } = await getApi1EnergySitesByIdLiveStatus({
3448
+ path: { id: this.siteId },
3449
+ client: this.root.client
3450
+ });
3451
+ this.cache.liveStatus = data;
3452
+ this.emit("liveStatus", data);
3453
+ return data;
3424
3454
  });
3425
- this.emit("liveStatus", data);
3426
- return data;
3427
3455
  }
3456
+ getSiteInfoReuse = reuse(1e3);
3428
3457
  /**
3429
3458
  * Returns information about the site. Things like assets (has solar, etc), settings (backup reserve, etc), and features (storm_mode_capable, etc).
3430
3459
  * @return Promise to an object with response containing detailed information about the energy site
3431
3460
  */
3432
3461
  async getSiteInfo() {
3433
- const { data } = await getApi1EnergySitesByIdSiteInfo({
3434
- path: { id: this.siteId },
3435
- client: this.root.client
3462
+ return this.getSiteInfoReuse(async () => {
3463
+ const { data } = await getApi1EnergySitesByIdSiteInfo({
3464
+ path: { id: this.siteId },
3465
+ client: this.root.client
3466
+ });
3467
+ this.cache.siteInfo = data;
3468
+ this.emit("siteInfo", data);
3469
+ return data;
3436
3470
  });
3437
- this.emit("siteInfo", data);
3438
- return data;
3439
3471
  }
3440
3472
  /**
3441
3473
  * Adjust the site's off-grid vehicle charging backup reserve.
@@ -5045,7 +5077,7 @@ const consoleLogger = {
5045
5077
 
5046
5078
  //#endregion
5047
5079
  //#region package.json
5048
- var version = "0.5.1";
5080
+ var version = "0.5.3";
5049
5081
 
5050
5082
  //#endregion
5051
5083
  //#region src/Teslemetry.ts
package/dist/index.d.cts CHANGED
@@ -7988,86 +7988,192 @@ type GetApi1EnergySitesByIdSiteInfoResponses = {
7988
7988
  * Default Response
7989
7989
  */
7990
7990
  200: {
7991
- response?: {
7992
- id?: string;
7991
+ response: {
7992
+ id: string;
7993
7993
  site_name?: string;
7994
- site_number?: string;
7995
7994
  backup_reserve_percent?: number;
7996
7995
  default_real_mode?: string;
7997
- installation_date?: string;
7998
- user_settings?: {
7999
- go_off_grid_test_banner_enabled?: null | boolean;
8000
- storm_mode_enabled?: null | boolean;
8001
- powerwall_onboarding_settings_set?: null | boolean;
8002
- powerwall_tesla_electric_interested_in?: null | boolean;
8003
- vpp_tour_enabled?: null | boolean;
8004
- off_grid_vehicle_charging_enabled?: null | boolean;
8005
- };
8006
- components?: {
8007
- solar?: boolean;
7996
+ installation_date: string;
7997
+ user_settings: {
7998
+ go_off_grid_test_banner_enabled: null | boolean;
7999
+ storm_mode_enabled: null | boolean;
8000
+ powerwall_onboarding_settings_set: null | boolean;
8001
+ powerwall_tesla_electric_interested_in: null | boolean;
8002
+ vpp_tour_enabled: null | boolean;
8003
+ off_grid_vehicle_charging_enabled: null | boolean;
8004
+ };
8005
+ components: {
8006
+ solar: boolean;
8008
8007
  solar_type?: string;
8009
- battery?: boolean;
8010
- grid?: boolean;
8011
- backup?: boolean;
8012
- gateway?: string;
8013
- load_meter?: boolean;
8014
- tou_capable?: boolean;
8015
- storm_mode_capable?: boolean;
8016
- off_grid_vehicle_charging_reserve_supported?: boolean;
8017
- vehicle_charging_performance_view_enabled?: boolean;
8018
- vehicle_charging_solar_offset_view_enabled?: boolean;
8019
- battery_solar_offset_view_enabled?: boolean;
8020
- energy_service_self_scheduling_enabled?: boolean;
8008
+ battery: boolean;
8009
+ grid: boolean;
8010
+ backup: boolean;
8011
+ gateway: string;
8012
+ load_meter: boolean;
8013
+ tou_capable: boolean;
8014
+ storm_mode_capable: boolean;
8015
+ off_grid_vehicle_charging_reserve_supported: boolean;
8016
+ vehicle_charging_performance_view_enabled: boolean;
8017
+ vehicle_charging_solar_offset_view_enabled: boolean;
8018
+ battery_solar_offset_view_enabled: boolean;
8019
+ solar_value_enabled?: boolean;
8020
+ energy_value_header?: string;
8021
+ energy_value_subheader?: string;
8022
+ energy_service_self_scheduling_enabled: boolean;
8023
+ show_battery_soe_graph?: boolean;
8024
+ show_grid_import_battery_source_cards?: boolean;
8025
+ set_islanding_mode_enabled?: boolean;
8026
+ wifi_commissioning_enabled?: boolean;
8027
+ backup_time_remaining_enabled?: boolean;
8028
+ battery_type?: string;
8029
+ configurable?: boolean;
8030
+ grid_services_enabled?: boolean;
8031
+ gateways?: Array<{
8032
+ device_id: string;
8033
+ din: string;
8034
+ serial_number: string;
8035
+ part_number: string;
8036
+ part_type: number;
8037
+ part_name: string;
8038
+ is_active: boolean;
8039
+ site_id: string;
8040
+ firmware_version: string;
8041
+ updated_datetime: string;
8042
+ leader_device_id?: string;
8043
+ }>;
8044
+ customer_preferred_export_rule?: string;
8045
+ edit_setting_permission_to_export?: boolean;
8046
+ edit_setting_grid_charging?: boolean;
8047
+ edit_setting_energy_exports?: boolean;
8048
+ system_alerts_enabled?: boolean;
8049
+ service_mode_enabled?: boolean;
8050
+ support_manual_backup?: boolean;
8051
+ rate_tariff_service_options: {
8052
+ rate_plan_configured_by_rts: boolean;
8053
+ rate_tariff_service_enabled: boolean;
8054
+ request_export_tariff: boolean;
8055
+ request_network_fees: boolean;
8056
+ };
8021
8057
  wall_connectors?: Array<{
8022
- device_id?: string;
8023
- din?: string;
8024
- serial_number?: string;
8025
- part_number?: string;
8058
+ device_id: string;
8059
+ din: string;
8060
+ serial_number: string;
8061
+ part_number: string;
8062
+ part_type: number;
8063
+ part_name: string;
8064
+ is_active: boolean;
8065
+ }>;
8066
+ net_meter_mode?: string;
8067
+ batteries?: Array<{
8068
+ device_id: string;
8069
+ din: string;
8070
+ serial_number: string;
8071
+ part_number: string;
8026
8072
  part_type?: number;
8027
8073
  part_name?: string;
8028
- is_active?: boolean;
8074
+ nameplate_max_charge_power: number;
8075
+ nameplate_max_discharge_power: number;
8076
+ nameplate_energy: number;
8077
+ is_active: boolean;
8029
8078
  }>;
8030
- nbt_supported?: boolean;
8031
- system_alerts_enabled?: boolean;
8032
- rate_tariff_service_options?: {
8033
- rate_plan_configured_by_rts?: boolean;
8034
- rate_tariff_service_enabled?: boolean;
8035
- request_export_tariff?: boolean;
8036
- request_network_fees?: boolean;
8079
+ non_export_configured?: boolean;
8080
+ disallow_charge_from_grid_with_solar_installed?: boolean;
8081
+ ITC_cliff?: number;
8082
+ sunrun_options?: {
8083
+ my_home_info_deeplink_enabled: boolean;
8084
+ support_screen_deeplink_enabled: boolean;
8037
8085
  };
8038
- solar_value_enabled?: boolean;
8039
- set_islanding_mode_enabled?: boolean;
8040
- battery_type?: string;
8041
- configurable?: boolean;
8086
+ inverters?: Array<{
8087
+ device_id: string;
8088
+ din: string;
8089
+ serial_number: string;
8090
+ part_number: string;
8091
+ part_type: number;
8092
+ part_name: string;
8093
+ is_active: boolean;
8094
+ site_id: string;
8095
+ firmware_version?: string;
8096
+ }>;
8097
+ nbt_supported?: boolean;
8098
+ local_offline_monitoring_enabled?: boolean;
8099
+ hide_time_of_use_card?: boolean;
8042
8100
  };
8043
8101
  version?: string;
8044
8102
  battery_count?: number;
8103
+ /**
8104
+ * See https://digitalassets-energy.tesla.com/raw/upload/app/fleet-api/example-tariff/PGE-EV2-A.json for example
8105
+ */
8106
+ tariff_content?: {
8107
+ [key: string]: unknown;
8108
+ };
8045
8109
  nameplate_power?: number;
8046
- nameplate_energy?: number;
8047
8110
  installation_time_zone?: string;
8048
8111
  max_site_meter_power_ac?: number;
8049
8112
  min_site_meter_power_ac?: number;
8113
+ /**
8114
+ * See https://digitalassets-energy.tesla.com/raw/upload/app/fleet-api/example-tariff/PGE-EV2-A.json for example
8115
+ */
8050
8116
  tariff_content_v2?: {
8051
- name?: string;
8052
- utility?: string;
8053
- version?: number;
8054
- daily_charges?: Array<{
8055
- name?: string;
8117
+ [key: string]: unknown;
8118
+ };
8119
+ vpp_backup_reserve_percent?: number;
8120
+ utility?: string;
8121
+ island_config?: {
8122
+ low_soe_limit?: number;
8123
+ jump_start_soe_threshold?: number;
8124
+ wait_for_solar_retry_soe?: number;
8125
+ max_frequency_shift_hz?: number;
8126
+ wait_for_solar_soe_threshold?: number;
8127
+ microgrid_not_ok_timeout?: number;
8128
+ manual_backup?: boolean;
8129
+ neutral_balancer_type?: string;
8130
+ };
8131
+ vehicle_charging_settings?: {
8132
+ evses: Array<{
8133
+ din: string;
8134
+ smart_charging?: {
8135
+ enable?: boolean;
8136
+ schedules?: Array<{
8137
+ time: string;
8138
+ }>;
8139
+ min_hours_charging?: number;
8140
+ };
8141
+ modbus_id?: number;
8056
8142
  }>;
8057
- demand_charges?: {
8058
- [key: string]: unknown;
8059
- };
8060
- energy_charges?: {
8061
- [key: string]: unknown;
8062
- };
8063
- seasons?: {
8064
- [key: string]: unknown;
8065
- };
8066
- sell_tariff?: {
8067
- [key: string]: unknown;
8143
+ };
8144
+ nameplate_energy?: number;
8145
+ off_grid_vehicle_charging_reserve_percent?: number;
8146
+ tariff_id?: string;
8147
+ site_number?: string;
8148
+ time_zone_offset?: number;
8149
+ app_settings?: {
8150
+ live_status_local_refresh_s: number;
8151
+ };
8152
+ csip?: {
8153
+ dcap_url: string;
8154
+ device_certificate: string;
8155
+ csip_australia: {
8156
+ national_meter_identifier: string;
8068
8157
  };
8069
8158
  };
8159
+ external_switch?: {
8160
+ input_type: string;
8161
+ control_behavior: string;
8162
+ };
8163
+ aggregation_program?: {
8164
+ name: string;
8165
+ description: string;
8166
+ link_name: string;
8167
+ link_url: string;
8168
+ };
8169
+ tesla_electric_billing_periods?: Array<{
8170
+ start_time: string;
8171
+ end_time: string;
8172
+ }>;
8070
8173
  };
8174
+ error?: string;
8175
+ error_description?: string;
8176
+ txid?: string;
8071
8177
  };
8072
8178
  };
8073
8179
  type GetApi1EnergySitesByIdSiteInfoResponse = GetApi1EnergySitesByIdSiteInfoResponses[keyof GetApi1EnergySitesByIdSiteInfoResponses];
@@ -10007,20 +10113,24 @@ type OmitKeys<T, K$1> = Pick<T, Exclude<keyof T, K$1>>;
10007
10113
  type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean, TResponse = unknown, TResponseStyle extends ResponseStyle = 'fields'> = OmitKeys<RequestOptions<TResponse, TResponseStyle, ThrowOnError>, 'body' | 'path' | 'query' | 'url'> & ([TData] extends [never] ? unknown : Omit<TData, 'url'>);
10008
10114
  //#endregion
10009
10115
  //#region src/TeslemetryEnergyApi.d.ts
10116
+ type TeslemetryEnergyEventMap = {
10117
+ siteInfo: GetApi1EnergySitesByIdSiteInfoResponse;
10118
+ liveStatus: GetApi1EnergySitesByIdLiveStatusResponse;
10119
+ };
10010
10120
  declare interface TeslemetryEnergyApi {
10011
- on(event: "siteInfo", listener: (data: GetApi1EnergySitesByIdSiteInfoResponse) => void): this;
10012
- on(event: "liveStatus", listener: (data: GetApi1EnergySitesByIdLiveStatusResponse) => void): this;
10013
- off(event: "siteInfo", listener: (data: GetApi1EnergySitesByIdSiteInfoResponse) => void): this;
10014
- off(event: "liveStatus", listener: (data: GetApi1EnergySitesByIdLiveStatusResponse) => void): this;
10015
- once(event: "siteInfo", listener: (data: GetApi1EnergySitesByIdSiteInfoResponse) => void): this;
10016
- once(event: "liveStatus", listener: (data: GetApi1EnergySitesByIdLiveStatusResponse) => void): this;
10017
- emit(event: "siteInfo", data: GetApi1EnergySitesByIdSiteInfoResponse): boolean;
10018
- emit(event: "liveStatus", data: GetApi1EnergySitesByIdLiveStatusResponse): boolean;
10121
+ on<K$1 extends keyof TeslemetryEnergyEventMap>(event: K$1, listener: (data: TeslemetryEnergyEventMap[K$1]) => void): this;
10122
+ off<K$1 extends keyof TeslemetryEnergyEventMap>(event: K$1, listener: (data: TeslemetryEnergyEventMap[K$1]) => void): this;
10123
+ once<K$1 extends keyof TeslemetryEnergyEventMap>(event: K$1, listener: (data: TeslemetryEnergyEventMap[K$1]) => void): this;
10124
+ emit<K$1 extends keyof TeslemetryEnergyEventMap>(event: K$1, data: TeslemetryEnergyEventMap[K$1]): boolean;
10019
10125
  }
10020
10126
  type PollingEndpoints = "siteInfo" | "liveStatus";
10021
10127
  declare class TeslemetryEnergyApi extends EventEmitter {
10022
10128
  private root;
10023
10129
  siteId: number;
10130
+ cache: {
10131
+ siteInfo: GetApi1EnergySitesByIdSiteInfoResponse | null;
10132
+ liveStatus: GetApi1EnergySitesByIdLiveStatusResponse | null;
10133
+ };
10024
10134
  refreshDelay: number;
10025
10135
  private refreshInterval;
10026
10136
  private refreshClients;
@@ -10080,122 +10190,18 @@ declare class TeslemetryEnergyApi extends EventEmitter {
10080
10190
  gridImportExport(customer_preferred_export_rule: "battery_ok" | "pv_only" | "never", disallow_charge_from_grid_with_solar_installed?: boolean): Promise<{
10081
10191
  response?: string;
10082
10192
  }>;
10193
+ private getLiveStatusReuse;
10083
10194
  /**
10084
10195
  * Returns the live status of the site (power, state of energy, grid status, storm mode).
10085
10196
  * @return Promise to an object with response containing current live status of the energy site
10086
10197
  */
10087
- getLiveStatus(): Promise<{
10088
- response?: {
10089
- solar_power?: number;
10090
- energy_left?: number;
10091
- total_pack_energy?: number;
10092
- percentage_charged?: number;
10093
- backup_capable?: boolean;
10094
- battery_power?: number;
10095
- load_power?: number;
10096
- grid_status?: string;
10097
- grid_power?: number;
10098
- generator_power?: number;
10099
- island_status?: string;
10100
- storm_mode_active?: boolean;
10101
- wall_connectors?: Array<{
10102
- din: string;
10103
- vin?: string;
10104
- wall_connector_state: number;
10105
- wall_connector_fault_state?: number;
10106
- wall_connector_power: number;
10107
- ocpp_status?: number;
10108
- powershare_session_state?: number;
10109
- }>;
10110
- timestamp: string;
10111
- };
10112
- }>;
10198
+ getLiveStatus(): Promise<any>;
10199
+ private getSiteInfoReuse;
10113
10200
  /**
10114
10201
  * Returns information about the site. Things like assets (has solar, etc), settings (backup reserve, etc), and features (storm_mode_capable, etc).
10115
10202
  * @return Promise to an object with response containing detailed information about the energy site
10116
10203
  */
10117
- getSiteInfo(): Promise<{
10118
- response?: {
10119
- id?: string;
10120
- site_name?: string;
10121
- site_number?: string;
10122
- backup_reserve_percent?: number;
10123
- default_real_mode?: string;
10124
- installation_date?: string;
10125
- user_settings?: {
10126
- go_off_grid_test_banner_enabled?: null | boolean;
10127
- storm_mode_enabled?: null | boolean;
10128
- powerwall_onboarding_settings_set?: null | boolean;
10129
- powerwall_tesla_electric_interested_in?: null | boolean;
10130
- vpp_tour_enabled?: null | boolean;
10131
- off_grid_vehicle_charging_enabled?: null | boolean;
10132
- };
10133
- components?: {
10134
- solar?: boolean;
10135
- solar_type?: string;
10136
- battery?: boolean;
10137
- grid?: boolean;
10138
- backup?: boolean;
10139
- gateway?: string;
10140
- load_meter?: boolean;
10141
- tou_capable?: boolean;
10142
- storm_mode_capable?: boolean;
10143
- off_grid_vehicle_charging_reserve_supported?: boolean;
10144
- vehicle_charging_performance_view_enabled?: boolean;
10145
- vehicle_charging_solar_offset_view_enabled?: boolean;
10146
- battery_solar_offset_view_enabled?: boolean;
10147
- energy_service_self_scheduling_enabled?: boolean;
10148
- wall_connectors?: Array<{
10149
- device_id?: string;
10150
- din?: string;
10151
- serial_number?: string;
10152
- part_number?: string;
10153
- part_type?: number;
10154
- part_name?: string;
10155
- is_active?: boolean;
10156
- }>;
10157
- nbt_supported?: boolean;
10158
- system_alerts_enabled?: boolean;
10159
- rate_tariff_service_options?: {
10160
- rate_plan_configured_by_rts?: boolean;
10161
- rate_tariff_service_enabled?: boolean;
10162
- request_export_tariff?: boolean;
10163
- request_network_fees?: boolean;
10164
- };
10165
- solar_value_enabled?: boolean;
10166
- set_islanding_mode_enabled?: boolean;
10167
- battery_type?: string;
10168
- configurable?: boolean;
10169
- };
10170
- version?: string;
10171
- battery_count?: number;
10172
- nameplate_power?: number;
10173
- nameplate_energy?: number;
10174
- installation_time_zone?: string;
10175
- max_site_meter_power_ac?: number;
10176
- min_site_meter_power_ac?: number;
10177
- tariff_content_v2?: {
10178
- name?: string;
10179
- utility?: string;
10180
- version?: number;
10181
- daily_charges?: Array<{
10182
- name?: string;
10183
- }>;
10184
- demand_charges?: {
10185
- [key: string]: unknown;
10186
- };
10187
- energy_charges?: {
10188
- [key: string]: unknown;
10189
- };
10190
- seasons?: {
10191
- [key: string]: unknown;
10192
- };
10193
- sell_tariff?: {
10194
- [key: string]: unknown;
10195
- };
10196
- };
10197
- };
10198
- }>;
10204
+ getSiteInfo(): Promise<any>;
10199
10205
  /**
10200
10206
  * Adjust the site's off-grid vehicle charging backup reserve.
10201
10207
  * @param off_grid_vehicle_charging_reserve_percent The off-grid vehicle charging backup reserve percentage
package/dist/index.d.mts CHANGED
@@ -7988,86 +7988,192 @@ type GetApi1EnergySitesByIdSiteInfoResponses = {
7988
7988
  * Default Response
7989
7989
  */
7990
7990
  200: {
7991
- response?: {
7992
- id?: string;
7991
+ response: {
7992
+ id: string;
7993
7993
  site_name?: string;
7994
- site_number?: string;
7995
7994
  backup_reserve_percent?: number;
7996
7995
  default_real_mode?: string;
7997
- installation_date?: string;
7998
- user_settings?: {
7999
- go_off_grid_test_banner_enabled?: null | boolean;
8000
- storm_mode_enabled?: null | boolean;
8001
- powerwall_onboarding_settings_set?: null | boolean;
8002
- powerwall_tesla_electric_interested_in?: null | boolean;
8003
- vpp_tour_enabled?: null | boolean;
8004
- off_grid_vehicle_charging_enabled?: null | boolean;
8005
- };
8006
- components?: {
8007
- solar?: boolean;
7996
+ installation_date: string;
7997
+ user_settings: {
7998
+ go_off_grid_test_banner_enabled: null | boolean;
7999
+ storm_mode_enabled: null | boolean;
8000
+ powerwall_onboarding_settings_set: null | boolean;
8001
+ powerwall_tesla_electric_interested_in: null | boolean;
8002
+ vpp_tour_enabled: null | boolean;
8003
+ off_grid_vehicle_charging_enabled: null | boolean;
8004
+ };
8005
+ components: {
8006
+ solar: boolean;
8008
8007
  solar_type?: string;
8009
- battery?: boolean;
8010
- grid?: boolean;
8011
- backup?: boolean;
8012
- gateway?: string;
8013
- load_meter?: boolean;
8014
- tou_capable?: boolean;
8015
- storm_mode_capable?: boolean;
8016
- off_grid_vehicle_charging_reserve_supported?: boolean;
8017
- vehicle_charging_performance_view_enabled?: boolean;
8018
- vehicle_charging_solar_offset_view_enabled?: boolean;
8019
- battery_solar_offset_view_enabled?: boolean;
8020
- energy_service_self_scheduling_enabled?: boolean;
8008
+ battery: boolean;
8009
+ grid: boolean;
8010
+ backup: boolean;
8011
+ gateway: string;
8012
+ load_meter: boolean;
8013
+ tou_capable: boolean;
8014
+ storm_mode_capable: boolean;
8015
+ off_grid_vehicle_charging_reserve_supported: boolean;
8016
+ vehicle_charging_performance_view_enabled: boolean;
8017
+ vehicle_charging_solar_offset_view_enabled: boolean;
8018
+ battery_solar_offset_view_enabled: boolean;
8019
+ solar_value_enabled?: boolean;
8020
+ energy_value_header?: string;
8021
+ energy_value_subheader?: string;
8022
+ energy_service_self_scheduling_enabled: boolean;
8023
+ show_battery_soe_graph?: boolean;
8024
+ show_grid_import_battery_source_cards?: boolean;
8025
+ set_islanding_mode_enabled?: boolean;
8026
+ wifi_commissioning_enabled?: boolean;
8027
+ backup_time_remaining_enabled?: boolean;
8028
+ battery_type?: string;
8029
+ configurable?: boolean;
8030
+ grid_services_enabled?: boolean;
8031
+ gateways?: Array<{
8032
+ device_id: string;
8033
+ din: string;
8034
+ serial_number: string;
8035
+ part_number: string;
8036
+ part_type: number;
8037
+ part_name: string;
8038
+ is_active: boolean;
8039
+ site_id: string;
8040
+ firmware_version: string;
8041
+ updated_datetime: string;
8042
+ leader_device_id?: string;
8043
+ }>;
8044
+ customer_preferred_export_rule?: string;
8045
+ edit_setting_permission_to_export?: boolean;
8046
+ edit_setting_grid_charging?: boolean;
8047
+ edit_setting_energy_exports?: boolean;
8048
+ system_alerts_enabled?: boolean;
8049
+ service_mode_enabled?: boolean;
8050
+ support_manual_backup?: boolean;
8051
+ rate_tariff_service_options: {
8052
+ rate_plan_configured_by_rts: boolean;
8053
+ rate_tariff_service_enabled: boolean;
8054
+ request_export_tariff: boolean;
8055
+ request_network_fees: boolean;
8056
+ };
8021
8057
  wall_connectors?: Array<{
8022
- device_id?: string;
8023
- din?: string;
8024
- serial_number?: string;
8025
- part_number?: string;
8058
+ device_id: string;
8059
+ din: string;
8060
+ serial_number: string;
8061
+ part_number: string;
8062
+ part_type: number;
8063
+ part_name: string;
8064
+ is_active: boolean;
8065
+ }>;
8066
+ net_meter_mode?: string;
8067
+ batteries?: Array<{
8068
+ device_id: string;
8069
+ din: string;
8070
+ serial_number: string;
8071
+ part_number: string;
8026
8072
  part_type?: number;
8027
8073
  part_name?: string;
8028
- is_active?: boolean;
8074
+ nameplate_max_charge_power: number;
8075
+ nameplate_max_discharge_power: number;
8076
+ nameplate_energy: number;
8077
+ is_active: boolean;
8029
8078
  }>;
8030
- nbt_supported?: boolean;
8031
- system_alerts_enabled?: boolean;
8032
- rate_tariff_service_options?: {
8033
- rate_plan_configured_by_rts?: boolean;
8034
- rate_tariff_service_enabled?: boolean;
8035
- request_export_tariff?: boolean;
8036
- request_network_fees?: boolean;
8079
+ non_export_configured?: boolean;
8080
+ disallow_charge_from_grid_with_solar_installed?: boolean;
8081
+ ITC_cliff?: number;
8082
+ sunrun_options?: {
8083
+ my_home_info_deeplink_enabled: boolean;
8084
+ support_screen_deeplink_enabled: boolean;
8037
8085
  };
8038
- solar_value_enabled?: boolean;
8039
- set_islanding_mode_enabled?: boolean;
8040
- battery_type?: string;
8041
- configurable?: boolean;
8086
+ inverters?: Array<{
8087
+ device_id: string;
8088
+ din: string;
8089
+ serial_number: string;
8090
+ part_number: string;
8091
+ part_type: number;
8092
+ part_name: string;
8093
+ is_active: boolean;
8094
+ site_id: string;
8095
+ firmware_version?: string;
8096
+ }>;
8097
+ nbt_supported?: boolean;
8098
+ local_offline_monitoring_enabled?: boolean;
8099
+ hide_time_of_use_card?: boolean;
8042
8100
  };
8043
8101
  version?: string;
8044
8102
  battery_count?: number;
8103
+ /**
8104
+ * See https://digitalassets-energy.tesla.com/raw/upload/app/fleet-api/example-tariff/PGE-EV2-A.json for example
8105
+ */
8106
+ tariff_content?: {
8107
+ [key: string]: unknown;
8108
+ };
8045
8109
  nameplate_power?: number;
8046
- nameplate_energy?: number;
8047
8110
  installation_time_zone?: string;
8048
8111
  max_site_meter_power_ac?: number;
8049
8112
  min_site_meter_power_ac?: number;
8113
+ /**
8114
+ * See https://digitalassets-energy.tesla.com/raw/upload/app/fleet-api/example-tariff/PGE-EV2-A.json for example
8115
+ */
8050
8116
  tariff_content_v2?: {
8051
- name?: string;
8052
- utility?: string;
8053
- version?: number;
8054
- daily_charges?: Array<{
8055
- name?: string;
8117
+ [key: string]: unknown;
8118
+ };
8119
+ vpp_backup_reserve_percent?: number;
8120
+ utility?: string;
8121
+ island_config?: {
8122
+ low_soe_limit?: number;
8123
+ jump_start_soe_threshold?: number;
8124
+ wait_for_solar_retry_soe?: number;
8125
+ max_frequency_shift_hz?: number;
8126
+ wait_for_solar_soe_threshold?: number;
8127
+ microgrid_not_ok_timeout?: number;
8128
+ manual_backup?: boolean;
8129
+ neutral_balancer_type?: string;
8130
+ };
8131
+ vehicle_charging_settings?: {
8132
+ evses: Array<{
8133
+ din: string;
8134
+ smart_charging?: {
8135
+ enable?: boolean;
8136
+ schedules?: Array<{
8137
+ time: string;
8138
+ }>;
8139
+ min_hours_charging?: number;
8140
+ };
8141
+ modbus_id?: number;
8056
8142
  }>;
8057
- demand_charges?: {
8058
- [key: string]: unknown;
8059
- };
8060
- energy_charges?: {
8061
- [key: string]: unknown;
8062
- };
8063
- seasons?: {
8064
- [key: string]: unknown;
8065
- };
8066
- sell_tariff?: {
8067
- [key: string]: unknown;
8143
+ };
8144
+ nameplate_energy?: number;
8145
+ off_grid_vehicle_charging_reserve_percent?: number;
8146
+ tariff_id?: string;
8147
+ site_number?: string;
8148
+ time_zone_offset?: number;
8149
+ app_settings?: {
8150
+ live_status_local_refresh_s: number;
8151
+ };
8152
+ csip?: {
8153
+ dcap_url: string;
8154
+ device_certificate: string;
8155
+ csip_australia: {
8156
+ national_meter_identifier: string;
8068
8157
  };
8069
8158
  };
8159
+ external_switch?: {
8160
+ input_type: string;
8161
+ control_behavior: string;
8162
+ };
8163
+ aggregation_program?: {
8164
+ name: string;
8165
+ description: string;
8166
+ link_name: string;
8167
+ link_url: string;
8168
+ };
8169
+ tesla_electric_billing_periods?: Array<{
8170
+ start_time: string;
8171
+ end_time: string;
8172
+ }>;
8070
8173
  };
8174
+ error?: string;
8175
+ error_description?: string;
8176
+ txid?: string;
8071
8177
  };
8072
8178
  };
8073
8179
  type GetApi1EnergySitesByIdSiteInfoResponse = GetApi1EnergySitesByIdSiteInfoResponses[keyof GetApi1EnergySitesByIdSiteInfoResponses];
@@ -10007,20 +10113,24 @@ type OmitKeys<T, K$1> = Pick<T, Exclude<keyof T, K$1>>;
10007
10113
  type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean, TResponse = unknown, TResponseStyle extends ResponseStyle = 'fields'> = OmitKeys<RequestOptions<TResponse, TResponseStyle, ThrowOnError>, 'body' | 'path' | 'query' | 'url'> & ([TData] extends [never] ? unknown : Omit<TData, 'url'>);
10008
10114
  //#endregion
10009
10115
  //#region src/TeslemetryEnergyApi.d.ts
10116
+ type TeslemetryEnergyEventMap = {
10117
+ siteInfo: GetApi1EnergySitesByIdSiteInfoResponse;
10118
+ liveStatus: GetApi1EnergySitesByIdLiveStatusResponse;
10119
+ };
10010
10120
  declare interface TeslemetryEnergyApi {
10011
- on(event: "siteInfo", listener: (data: GetApi1EnergySitesByIdSiteInfoResponse) => void): this;
10012
- on(event: "liveStatus", listener: (data: GetApi1EnergySitesByIdLiveStatusResponse) => void): this;
10013
- off(event: "siteInfo", listener: (data: GetApi1EnergySitesByIdSiteInfoResponse) => void): this;
10014
- off(event: "liveStatus", listener: (data: GetApi1EnergySitesByIdLiveStatusResponse) => void): this;
10015
- once(event: "siteInfo", listener: (data: GetApi1EnergySitesByIdSiteInfoResponse) => void): this;
10016
- once(event: "liveStatus", listener: (data: GetApi1EnergySitesByIdLiveStatusResponse) => void): this;
10017
- emit(event: "siteInfo", data: GetApi1EnergySitesByIdSiteInfoResponse): boolean;
10018
- emit(event: "liveStatus", data: GetApi1EnergySitesByIdLiveStatusResponse): boolean;
10121
+ on<K$1 extends keyof TeslemetryEnergyEventMap>(event: K$1, listener: (data: TeslemetryEnergyEventMap[K$1]) => void): this;
10122
+ off<K$1 extends keyof TeslemetryEnergyEventMap>(event: K$1, listener: (data: TeslemetryEnergyEventMap[K$1]) => void): this;
10123
+ once<K$1 extends keyof TeslemetryEnergyEventMap>(event: K$1, listener: (data: TeslemetryEnergyEventMap[K$1]) => void): this;
10124
+ emit<K$1 extends keyof TeslemetryEnergyEventMap>(event: K$1, data: TeslemetryEnergyEventMap[K$1]): boolean;
10019
10125
  }
10020
10126
  type PollingEndpoints = "siteInfo" | "liveStatus";
10021
10127
  declare class TeslemetryEnergyApi extends EventEmitter {
10022
10128
  private root;
10023
10129
  siteId: number;
10130
+ cache: {
10131
+ siteInfo: GetApi1EnergySitesByIdSiteInfoResponse | null;
10132
+ liveStatus: GetApi1EnergySitesByIdLiveStatusResponse | null;
10133
+ };
10024
10134
  refreshDelay: number;
10025
10135
  private refreshInterval;
10026
10136
  private refreshClients;
@@ -10080,122 +10190,18 @@ declare class TeslemetryEnergyApi extends EventEmitter {
10080
10190
  gridImportExport(customer_preferred_export_rule: "battery_ok" | "pv_only" | "never", disallow_charge_from_grid_with_solar_installed?: boolean): Promise<{
10081
10191
  response?: string;
10082
10192
  }>;
10193
+ private getLiveStatusReuse;
10083
10194
  /**
10084
10195
  * Returns the live status of the site (power, state of energy, grid status, storm mode).
10085
10196
  * @return Promise to an object with response containing current live status of the energy site
10086
10197
  */
10087
- getLiveStatus(): Promise<{
10088
- response?: {
10089
- solar_power?: number;
10090
- energy_left?: number;
10091
- total_pack_energy?: number;
10092
- percentage_charged?: number;
10093
- backup_capable?: boolean;
10094
- battery_power?: number;
10095
- load_power?: number;
10096
- grid_status?: string;
10097
- grid_power?: number;
10098
- generator_power?: number;
10099
- island_status?: string;
10100
- storm_mode_active?: boolean;
10101
- wall_connectors?: Array<{
10102
- din: string;
10103
- vin?: string;
10104
- wall_connector_state: number;
10105
- wall_connector_fault_state?: number;
10106
- wall_connector_power: number;
10107
- ocpp_status?: number;
10108
- powershare_session_state?: number;
10109
- }>;
10110
- timestamp: string;
10111
- };
10112
- }>;
10198
+ getLiveStatus(): Promise<any>;
10199
+ private getSiteInfoReuse;
10113
10200
  /**
10114
10201
  * Returns information about the site. Things like assets (has solar, etc), settings (backup reserve, etc), and features (storm_mode_capable, etc).
10115
10202
  * @return Promise to an object with response containing detailed information about the energy site
10116
10203
  */
10117
- getSiteInfo(): Promise<{
10118
- response?: {
10119
- id?: string;
10120
- site_name?: string;
10121
- site_number?: string;
10122
- backup_reserve_percent?: number;
10123
- default_real_mode?: string;
10124
- installation_date?: string;
10125
- user_settings?: {
10126
- go_off_grid_test_banner_enabled?: null | boolean;
10127
- storm_mode_enabled?: null | boolean;
10128
- powerwall_onboarding_settings_set?: null | boolean;
10129
- powerwall_tesla_electric_interested_in?: null | boolean;
10130
- vpp_tour_enabled?: null | boolean;
10131
- off_grid_vehicle_charging_enabled?: null | boolean;
10132
- };
10133
- components?: {
10134
- solar?: boolean;
10135
- solar_type?: string;
10136
- battery?: boolean;
10137
- grid?: boolean;
10138
- backup?: boolean;
10139
- gateway?: string;
10140
- load_meter?: boolean;
10141
- tou_capable?: boolean;
10142
- storm_mode_capable?: boolean;
10143
- off_grid_vehicle_charging_reserve_supported?: boolean;
10144
- vehicle_charging_performance_view_enabled?: boolean;
10145
- vehicle_charging_solar_offset_view_enabled?: boolean;
10146
- battery_solar_offset_view_enabled?: boolean;
10147
- energy_service_self_scheduling_enabled?: boolean;
10148
- wall_connectors?: Array<{
10149
- device_id?: string;
10150
- din?: string;
10151
- serial_number?: string;
10152
- part_number?: string;
10153
- part_type?: number;
10154
- part_name?: string;
10155
- is_active?: boolean;
10156
- }>;
10157
- nbt_supported?: boolean;
10158
- system_alerts_enabled?: boolean;
10159
- rate_tariff_service_options?: {
10160
- rate_plan_configured_by_rts?: boolean;
10161
- rate_tariff_service_enabled?: boolean;
10162
- request_export_tariff?: boolean;
10163
- request_network_fees?: boolean;
10164
- };
10165
- solar_value_enabled?: boolean;
10166
- set_islanding_mode_enabled?: boolean;
10167
- battery_type?: string;
10168
- configurable?: boolean;
10169
- };
10170
- version?: string;
10171
- battery_count?: number;
10172
- nameplate_power?: number;
10173
- nameplate_energy?: number;
10174
- installation_time_zone?: string;
10175
- max_site_meter_power_ac?: number;
10176
- min_site_meter_power_ac?: number;
10177
- tariff_content_v2?: {
10178
- name?: string;
10179
- utility?: string;
10180
- version?: number;
10181
- daily_charges?: Array<{
10182
- name?: string;
10183
- }>;
10184
- demand_charges?: {
10185
- [key: string]: unknown;
10186
- };
10187
- energy_charges?: {
10188
- [key: string]: unknown;
10189
- };
10190
- seasons?: {
10191
- [key: string]: unknown;
10192
- };
10193
- sell_tariff?: {
10194
- [key: string]: unknown;
10195
- };
10196
- };
10197
- };
10198
- }>;
10204
+ getSiteInfo(): Promise<any>;
10199
10205
  /**
10200
10206
  * Adjust the site's off-grid vehicle charging backup reserve.
10201
10207
  * @param off_grid_vehicle_charging_reserve_percent The off-grid vehicle charging backup reserve percentage
package/dist/index.mjs CHANGED
@@ -3115,8 +3115,8 @@ var TeslemetryStream = class extends EventEmitter {
3115
3115
  this.cloudCache = options.cache;
3116
3116
  this.localCache = options.cache;
3117
3117
  } else {
3118
- this.cloudCache = options?.cache?.cloud;
3119
- this.localCache = options?.cache?.local;
3118
+ this.cloudCache = options?.cache?.cloud ?? true;
3119
+ this.localCache = options?.cache?.local ?? true;
3120
3120
  }
3121
3121
  this.logger = root.logger;
3122
3122
  if (this.vin) this.getVehicle(this.vin);
@@ -3341,11 +3341,30 @@ var TeslemetryChargingApi = class {
3341
3341
  }
3342
3342
  };
3343
3343
 
3344
+ //#endregion
3345
+ //#region src/reuse.ts
3346
+ const reuse = (linger = 0) => {
3347
+ let promise = null;
3348
+ return async (func) => {
3349
+ if (promise) return promise;
3350
+ try {
3351
+ promise = func();
3352
+ return await promise;
3353
+ } finally {
3354
+ setTimeout(() => promise = null, linger);
3355
+ }
3356
+ };
3357
+ };
3358
+
3344
3359
  //#endregion
3345
3360
  //#region src/TeslemetryEnergyApi.ts
3346
3361
  var TeslemetryEnergyApi = class extends EventEmitter {
3347
3362
  root;
3348
3363
  siteId;
3364
+ cache = {
3365
+ siteInfo: null,
3366
+ liveStatus: null
3367
+ };
3349
3368
  refreshDelay = 3e4;
3350
3369
  refreshInterval = {
3351
3370
  siteInfo: null,
@@ -3362,6 +3381,11 @@ var TeslemetryEnergyApi = class extends EventEmitter {
3362
3381
  this.siteId = siteId;
3363
3382
  root.api.energySites.set(siteId, this);
3364
3383
  }
3384
+ on(event, listener) {
3385
+ const cached = this.cache[event];
3386
+ if (cached) listener(cached);
3387
+ return super.on(event, listener);
3388
+ }
3365
3389
  /**
3366
3390
  * Adjust the site's backup reserve.
3367
3391
  * @param backup_reserve_percent The backup reserve percentage
@@ -3413,29 +3437,37 @@ var TeslemetryEnergyApi = class extends EventEmitter {
3413
3437
  });
3414
3438
  return data;
3415
3439
  }
3440
+ getLiveStatusReuse = reuse(1e3);
3416
3441
  /**
3417
3442
  * Returns the live status of the site (power, state of energy, grid status, storm mode).
3418
3443
  * @return Promise to an object with response containing current live status of the energy site
3419
3444
  */
3420
3445
  async getLiveStatus() {
3421
- const { data } = await getApi1EnergySitesByIdLiveStatus({
3422
- path: { id: this.siteId },
3423
- client: this.root.client
3446
+ return this.getLiveStatusReuse(async () => {
3447
+ const { data } = await getApi1EnergySitesByIdLiveStatus({
3448
+ path: { id: this.siteId },
3449
+ client: this.root.client
3450
+ });
3451
+ this.cache.liveStatus = data;
3452
+ this.emit("liveStatus", data);
3453
+ return data;
3424
3454
  });
3425
- this.emit("liveStatus", data);
3426
- return data;
3427
3455
  }
3456
+ getSiteInfoReuse = reuse(1e3);
3428
3457
  /**
3429
3458
  * Returns information about the site. Things like assets (has solar, etc), settings (backup reserve, etc), and features (storm_mode_capable, etc).
3430
3459
  * @return Promise to an object with response containing detailed information about the energy site
3431
3460
  */
3432
3461
  async getSiteInfo() {
3433
- const { data } = await getApi1EnergySitesByIdSiteInfo({
3434
- path: { id: this.siteId },
3435
- client: this.root.client
3462
+ return this.getSiteInfoReuse(async () => {
3463
+ const { data } = await getApi1EnergySitesByIdSiteInfo({
3464
+ path: { id: this.siteId },
3465
+ client: this.root.client
3466
+ });
3467
+ this.cache.siteInfo = data;
3468
+ this.emit("siteInfo", data);
3469
+ return data;
3436
3470
  });
3437
- this.emit("siteInfo", data);
3438
- return data;
3439
3471
  }
3440
3472
  /**
3441
3473
  * Adjust the site's off-grid vehicle charging backup reserve.
@@ -5045,7 +5077,7 @@ const consoleLogger = {
5045
5077
 
5046
5078
  //#endregion
5047
5079
  //#region package.json
5048
- var version = "0.5.1";
5080
+ var version = "0.5.3";
5049
5081
 
5050
5082
  //#endregion
5051
5083
  //#region src/Teslemetry.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teslemetry/api",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "description": "API client for Teslemetry",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",