google-apis-solar_v1 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,1104 @@
1
+ # Copyright 2020 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'date'
16
+ require 'google/apis/core/base_service'
17
+ require 'google/apis/core/json_representation'
18
+ require 'google/apis/core/hashable'
19
+ require 'google/apis/errors'
20
+
21
+ module Google
22
+ module Apis
23
+ module SolarV1
24
+
25
+ # Response message for `Solar.FindClosestBuildingInsights`. Information about
26
+ # the location, dimensions, and solar potential of a building.
27
+ class BuildingInsights
28
+ include Google::Apis::Core::Hashable
29
+
30
+ # Administrative area 1 (e.g., in the US, the state) that contains this building.
31
+ # For example, in the US, the abbreviation might be "MA" or "CA."
32
+ # Corresponds to the JSON property `administrativeArea`
33
+ # @return [String]
34
+ attr_accessor :administrative_area
35
+
36
+ # A bounding box in lat/lng coordinates.
37
+ # Corresponds to the JSON property `boundingBox`
38
+ # @return [Google::Apis::SolarV1::LatLngBox]
39
+ attr_accessor :bounding_box
40
+
41
+ # An object that represents a latitude/longitude pair. This is expressed as a
42
+ # pair of doubles to represent degrees latitude and degrees longitude. Unless
43
+ # specified otherwise, this object must conform to the WGS84 standard. Values
44
+ # must be within normalized ranges.
45
+ # Corresponds to the JSON property `center`
46
+ # @return [Google::Apis::SolarV1::LatLng]
47
+ attr_accessor :center
48
+
49
+ # Represents a whole or partial calendar date, such as a birthday. The time of
50
+ # day and time zone are either specified elsewhere or are insignificant. The
51
+ # date is relative to the Gregorian Calendar. This can represent one of the
52
+ # following: * A full date, with non-zero year, month, and day values. * A month
53
+ # and day, with a zero year (for example, an anniversary). * A year on its own,
54
+ # with a zero month and a zero day. * A year and month, with a zero day (for
55
+ # example, a credit card expiration date). Related types: * google.type.
56
+ # TimeOfDay * google.type.DateTime * google.protobuf.Timestamp
57
+ # Corresponds to the JSON property `imageryDate`
58
+ # @return [Google::Apis::SolarV1::Date]
59
+ attr_accessor :imagery_date
60
+
61
+ # Represents a whole or partial calendar date, such as a birthday. The time of
62
+ # day and time zone are either specified elsewhere or are insignificant. The
63
+ # date is relative to the Gregorian Calendar. This can represent one of the
64
+ # following: * A full date, with non-zero year, month, and day values. * A month
65
+ # and day, with a zero year (for example, an anniversary). * A year on its own,
66
+ # with a zero month and a zero day. * A year and month, with a zero day (for
67
+ # example, a credit card expiration date). Related types: * google.type.
68
+ # TimeOfDay * google.type.DateTime * google.protobuf.Timestamp
69
+ # Corresponds to the JSON property `imageryProcessedDate`
70
+ # @return [Google::Apis::SolarV1::Date]
71
+ attr_accessor :imagery_processed_date
72
+
73
+ # The quality of the imagery used to compute the data for this building.
74
+ # Corresponds to the JSON property `imageryQuality`
75
+ # @return [String]
76
+ attr_accessor :imagery_quality
77
+
78
+ # The resource name for the building, of the format `building/`.
79
+ # Corresponds to the JSON property `name`
80
+ # @return [String]
81
+ attr_accessor :name
82
+
83
+ # Postal code (e.g., US zip code) this building is contained by.
84
+ # Corresponds to the JSON property `postalCode`
85
+ # @return [String]
86
+ attr_accessor :postal_code
87
+
88
+ # Region code for the country (or region) this building is in.
89
+ # Corresponds to the JSON property `regionCode`
90
+ # @return [String]
91
+ attr_accessor :region_code
92
+
93
+ # Information about the solar potential of a building. A number of fields in
94
+ # this are defined in terms of "panels". The fields panel_capacity_watts,
95
+ # panel_height_meters, and panel_width_meters describe the parameters of the
96
+ # model of panel used in these calculations.
97
+ # Corresponds to the JSON property `solarPotential`
98
+ # @return [Google::Apis::SolarV1::SolarPotential]
99
+ attr_accessor :solar_potential
100
+
101
+ # Statistical area (e.g., US census tract) this building is in.
102
+ # Corresponds to the JSON property `statisticalArea`
103
+ # @return [String]
104
+ attr_accessor :statistical_area
105
+
106
+ def initialize(**args)
107
+ update!(**args)
108
+ end
109
+
110
+ # Update properties of this object
111
+ def update!(**args)
112
+ @administrative_area = args[:administrative_area] if args.key?(:administrative_area)
113
+ @bounding_box = args[:bounding_box] if args.key?(:bounding_box)
114
+ @center = args[:center] if args.key?(:center)
115
+ @imagery_date = args[:imagery_date] if args.key?(:imagery_date)
116
+ @imagery_processed_date = args[:imagery_processed_date] if args.key?(:imagery_processed_date)
117
+ @imagery_quality = args[:imagery_quality] if args.key?(:imagery_quality)
118
+ @name = args[:name] if args.key?(:name)
119
+ @postal_code = args[:postal_code] if args.key?(:postal_code)
120
+ @region_code = args[:region_code] if args.key?(:region_code)
121
+ @solar_potential = args[:solar_potential] if args.key?(:solar_potential)
122
+ @statistical_area = args[:statistical_area] if args.key?(:statistical_area)
123
+ end
124
+ end
125
+
126
+ # Cost and benefit of an outright purchase of a particular configuration of
127
+ # solar panels with a particular electricity usage.
128
+ class CashPurchaseSavings
129
+ include Google::Apis::Core::Hashable
130
+
131
+ # Represents an amount of money with its currency type.
132
+ # Corresponds to the JSON property `outOfPocketCost`
133
+ # @return [Google::Apis::SolarV1::Money]
134
+ attr_accessor :out_of_pocket_cost
135
+
136
+ # Number of years until payback occurs. A negative value means payback never
137
+ # occurs within the lifetime period.
138
+ # Corresponds to the JSON property `paybackYears`
139
+ # @return [Float]
140
+ attr_accessor :payback_years
141
+
142
+ # Represents an amount of money with its currency type.
143
+ # Corresponds to the JSON property `rebateValue`
144
+ # @return [Google::Apis::SolarV1::Money]
145
+ attr_accessor :rebate_value
146
+
147
+ # Financial information that's shared between different financing methods.
148
+ # Corresponds to the JSON property `savings`
149
+ # @return [Google::Apis::SolarV1::SavingsOverTime]
150
+ attr_accessor :savings
151
+
152
+ # Represents an amount of money with its currency type.
153
+ # Corresponds to the JSON property `upfrontCost`
154
+ # @return [Google::Apis::SolarV1::Money]
155
+ attr_accessor :upfront_cost
156
+
157
+ def initialize(**args)
158
+ update!(**args)
159
+ end
160
+
161
+ # Update properties of this object
162
+ def update!(**args)
163
+ @out_of_pocket_cost = args[:out_of_pocket_cost] if args.key?(:out_of_pocket_cost)
164
+ @payback_years = args[:payback_years] if args.key?(:payback_years)
165
+ @rebate_value = args[:rebate_value] if args.key?(:rebate_value)
166
+ @savings = args[:savings] if args.key?(:savings)
167
+ @upfront_cost = args[:upfront_cost] if args.key?(:upfront_cost)
168
+ end
169
+ end
170
+
171
+ # Information about the solar potential of a region. The actual data are
172
+ # contained in a number of GeoTIFF files covering the requested region, for
173
+ # which this message contains URLs: Each string in the `DataLayers` message
174
+ # contains a URL from which the corresponding GeoTIFF can be fetched. These URLs
175
+ # are valid for a few hours after they've been generated. Most of the GeoTIFF
176
+ # files are at a resolution of 0.1m/pixel, but the monthly flux file is at 0.5m/
177
+ # pixel, and the hourly shade files are at 1m/pixel. If a `pixel_size_meters`
178
+ # value was specified in the `GetDataLayersRequest`, then the minimum resolution
179
+ # in the GeoTIFF files will be that value.
180
+ class DataLayers
181
+ include Google::Apis::Core::Hashable
182
+
183
+ # The URL for the annual flux map (annual sunlight on roofs) of the region.
184
+ # Values are kWh/kW/year. This is *unmasked flux*: flux is computed for every
185
+ # location, not just building rooftops. Invalid locations are stored as -9999:
186
+ # locations outside our coverage area will be invalid, and a few locations
187
+ # inside the coverage area, where we were unable to calculate flux, will also be
188
+ # invalid.
189
+ # Corresponds to the JSON property `annualFluxUrl`
190
+ # @return [String]
191
+ attr_accessor :annual_flux_url
192
+
193
+ # The URL for an image of the DSM (Digital Surface Model) of the region. Values
194
+ # are in meters above EGM96 geoid (i.e., sea level). Invalid locations (where we
195
+ # don't have data) are stored as -9999.
196
+ # Corresponds to the JSON property `dsmUrl`
197
+ # @return [String]
198
+ attr_accessor :dsm_url
199
+
200
+ # Twelve URLs for hourly shade, corresponding to January...December, in order.
201
+ # Each GeoTIFF will contain 24 bands, corresponding to the 24 hours of the day.
202
+ # Each pixel is a 32 bit integer, corresponding to the (up to) 31 days of that
203
+ # month; a 1 bit means that the corresponding location is able to see the sun at
204
+ # that day, of that hour, of that month. Invalid locations are stored as -9999 (
205
+ # since this is negative, it has bit 31 set, and no valid value could have bit
206
+ # 31 set as that would correspond to the 32nd day of the month). An example may
207
+ # be useful. If you want to know whether a point (at pixel location (x, y)) saw
208
+ # sun at 4pm on the 22nd of June you would: 1. fetch the sixth URL in this list (
209
+ # corresponding to June). 1. look up the 17th channel (corresponding to 4pm). 1.
210
+ # read the 32-bit value at (x, y). 1. read bit 21 of the value (corresponding to
211
+ # the 22nd of the month). 1. if that bit is a 1, then that spot saw the sun at
212
+ # 4pm 22 June. More formally: Given `month` (1-12), `day` (1...month max;
213
+ # February has 28 days) and `hour` (0-23), the shade/sun for that month/day/hour
214
+ # at a position `(x, y)` is the bit ``` (hourly_shade[month - 1])(x, y)[hour] & (
215
+ # 1 << (day - 1)) ``` where `(x, y)` is spatial indexing, `[month - 1]` refers
216
+ # to fetching the `month - 1`st URL (indexing from zero), `[hour]` is indexing
217
+ # into the channels, and a final non-zero result means "sunny". There are no
218
+ # leap days, and DST doesn't exist (all days are 24 hours long; noon is always "
219
+ # standard time" noon).
220
+ # Corresponds to the JSON property `hourlyShadeUrls`
221
+ # @return [Array<String>]
222
+ attr_accessor :hourly_shade_urls
223
+
224
+ # Represents a whole or partial calendar date, such as a birthday. The time of
225
+ # day and time zone are either specified elsewhere or are insignificant. The
226
+ # date is relative to the Gregorian Calendar. This can represent one of the
227
+ # following: * A full date, with non-zero year, month, and day values. * A month
228
+ # and day, with a zero year (for example, an anniversary). * A year on its own,
229
+ # with a zero month and a zero day. * A year and month, with a zero day (for
230
+ # example, a credit card expiration date). Related types: * google.type.
231
+ # TimeOfDay * google.type.DateTime * google.protobuf.Timestamp
232
+ # Corresponds to the JSON property `imageryDate`
233
+ # @return [Google::Apis::SolarV1::Date]
234
+ attr_accessor :imagery_date
235
+
236
+ # Represents a whole or partial calendar date, such as a birthday. The time of
237
+ # day and time zone are either specified elsewhere or are insignificant. The
238
+ # date is relative to the Gregorian Calendar. This can represent one of the
239
+ # following: * A full date, with non-zero year, month, and day values. * A month
240
+ # and day, with a zero year (for example, an anniversary). * A year on its own,
241
+ # with a zero month and a zero day. * A year and month, with a zero day (for
242
+ # example, a credit card expiration date). Related types: * google.type.
243
+ # TimeOfDay * google.type.DateTime * google.protobuf.Timestamp
244
+ # Corresponds to the JSON property `imageryProcessedDate`
245
+ # @return [Google::Apis::SolarV1::Date]
246
+ attr_accessor :imagery_processed_date
247
+
248
+ # The quality of the result's imagery.
249
+ # Corresponds to the JSON property `imageryQuality`
250
+ # @return [String]
251
+ attr_accessor :imagery_quality
252
+
253
+ # The URL for the building mask image: one bit per pixel saying whether that
254
+ # pixel is considered to be part of a rooftop or not.
255
+ # Corresponds to the JSON property `maskUrl`
256
+ # @return [String]
257
+ attr_accessor :mask_url
258
+
259
+ # The URL for the monthly flux map (sunlight on roofs, broken down by month) of
260
+ # the region. Values are kWh/kW/year. The GeoTIFF pointed to by this URL will
261
+ # contain twelve bands, corresponding to January...December, in order.
262
+ # Corresponds to the JSON property `monthlyFluxUrl`
263
+ # @return [String]
264
+ attr_accessor :monthly_flux_url
265
+
266
+ # The URL for an image of RGB data (aerial photo) of the region.
267
+ # Corresponds to the JSON property `rgbUrl`
268
+ # @return [String]
269
+ attr_accessor :rgb_url
270
+
271
+ def initialize(**args)
272
+ update!(**args)
273
+ end
274
+
275
+ # Update properties of this object
276
+ def update!(**args)
277
+ @annual_flux_url = args[:annual_flux_url] if args.key?(:annual_flux_url)
278
+ @dsm_url = args[:dsm_url] if args.key?(:dsm_url)
279
+ @hourly_shade_urls = args[:hourly_shade_urls] if args.key?(:hourly_shade_urls)
280
+ @imagery_date = args[:imagery_date] if args.key?(:imagery_date)
281
+ @imagery_processed_date = args[:imagery_processed_date] if args.key?(:imagery_processed_date)
282
+ @imagery_quality = args[:imagery_quality] if args.key?(:imagery_quality)
283
+ @mask_url = args[:mask_url] if args.key?(:mask_url)
284
+ @monthly_flux_url = args[:monthly_flux_url] if args.key?(:monthly_flux_url)
285
+ @rgb_url = args[:rgb_url] if args.key?(:rgb_url)
286
+ end
287
+ end
288
+
289
+ # Represents a whole or partial calendar date, such as a birthday. The time of
290
+ # day and time zone are either specified elsewhere or are insignificant. The
291
+ # date is relative to the Gregorian Calendar. This can represent one of the
292
+ # following: * A full date, with non-zero year, month, and day values. * A month
293
+ # and day, with a zero year (for example, an anniversary). * A year on its own,
294
+ # with a zero month and a zero day. * A year and month, with a zero day (for
295
+ # example, a credit card expiration date). Related types: * google.type.
296
+ # TimeOfDay * google.type.DateTime * google.protobuf.Timestamp
297
+ class Date
298
+ include Google::Apis::Core::Hashable
299
+
300
+ # Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to
301
+ # specify a year by itself or a year and month where the day isn't significant.
302
+ # Corresponds to the JSON property `day`
303
+ # @return [Fixnum]
304
+ attr_accessor :day
305
+
306
+ # Month of a year. Must be from 1 to 12, or 0 to specify a year without a month
307
+ # and day.
308
+ # Corresponds to the JSON property `month`
309
+ # @return [Fixnum]
310
+ attr_accessor :month
311
+
312
+ # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a
313
+ # year.
314
+ # Corresponds to the JSON property `year`
315
+ # @return [Fixnum]
316
+ attr_accessor :year
317
+
318
+ def initialize(**args)
319
+ update!(**args)
320
+ end
321
+
322
+ # Update properties of this object
323
+ def update!(**args)
324
+ @day = args[:day] if args.key?(:day)
325
+ @month = args[:month] if args.key?(:month)
326
+ @year = args[:year] if args.key?(:year)
327
+ end
328
+ end
329
+
330
+ # Cost and benefit of using a loan to buy a particular configuration of solar
331
+ # panels with a particular electricity usage.
332
+ class FinancedPurchaseSavings
333
+ include Google::Apis::Core::Hashable
334
+
335
+ # Represents an amount of money with its currency type.
336
+ # Corresponds to the JSON property `annualLoanPayment`
337
+ # @return [Google::Apis::SolarV1::Money]
338
+ attr_accessor :annual_loan_payment
339
+
340
+ # The interest rate on loans assumed in this set of calculations.
341
+ # Corresponds to the JSON property `loanInterestRate`
342
+ # @return [Float]
343
+ attr_accessor :loan_interest_rate
344
+
345
+ # Represents an amount of money with its currency type.
346
+ # Corresponds to the JSON property `rebateValue`
347
+ # @return [Google::Apis::SolarV1::Money]
348
+ attr_accessor :rebate_value
349
+
350
+ # Financial information that's shared between different financing methods.
351
+ # Corresponds to the JSON property `savings`
352
+ # @return [Google::Apis::SolarV1::SavingsOverTime]
353
+ attr_accessor :savings
354
+
355
+ def initialize(**args)
356
+ update!(**args)
357
+ end
358
+
359
+ # Update properties of this object
360
+ def update!(**args)
361
+ @annual_loan_payment = args[:annual_loan_payment] if args.key?(:annual_loan_payment)
362
+ @loan_interest_rate = args[:loan_interest_rate] if args.key?(:loan_interest_rate)
363
+ @rebate_value = args[:rebate_value] if args.key?(:rebate_value)
364
+ @savings = args[:savings] if args.key?(:savings)
365
+ end
366
+ end
367
+
368
+ # Analysis of the cost and benefits of the optimum solar layout for a particular
369
+ # electric bill size.
370
+ class FinancialAnalysis
371
+ include Google::Apis::Core::Hashable
372
+
373
+ # How much electricity the house uses in an average month, based on the bill
374
+ # size and the local electricity rates.
375
+ # Corresponds to the JSON property `averageKwhPerMonth`
376
+ # @return [Float]
377
+ attr_accessor :average_kwh_per_month
378
+
379
+ # Cost and benefit of an outright purchase of a particular configuration of
380
+ # solar panels with a particular electricity usage.
381
+ # Corresponds to the JSON property `cashPurchaseSavings`
382
+ # @return [Google::Apis::SolarV1::CashPurchaseSavings]
383
+ attr_accessor :cash_purchase_savings
384
+
385
+ # Whether this is the bill size selected to be the default bill for the area
386
+ # this building is in. Exactly one `FinancialAnalysis` in `
387
+ # BuildingSolarPotential` should have `default_bill` set.
388
+ # Corresponds to the JSON property `defaultBill`
389
+ # @return [Boolean]
390
+ attr_accessor :default_bill
391
+ alias_method :default_bill?, :default_bill
392
+
393
+ # Cost and benefit of using a loan to buy a particular configuration of solar
394
+ # panels with a particular electricity usage.
395
+ # Corresponds to the JSON property `financedPurchaseSavings`
396
+ # @return [Google::Apis::SolarV1::FinancedPurchaseSavings]
397
+ attr_accessor :financed_purchase_savings
398
+
399
+ # Details of a financial analysis. Some of these details are already stored at
400
+ # higher levels (e.g., out of pocket cost). Total money amounts are over a
401
+ # lifetime period defined by the panel_lifetime_years field in SolarPotential.
402
+ # Note: The out of pocket cost of purchasing the panels is given in the
403
+ # out_of_pocket_cost field in CashPurchaseSavings.
404
+ # Corresponds to the JSON property `financialDetails`
405
+ # @return [Google::Apis::SolarV1::FinancialDetails]
406
+ attr_accessor :financial_details
407
+
408
+ # Cost and benefit of leasing a particular configuration of solar panels with a
409
+ # particular electricity usage.
410
+ # Corresponds to the JSON property `leasingSavings`
411
+ # @return [Google::Apis::SolarV1::LeasingSavings]
412
+ attr_accessor :leasing_savings
413
+
414
+ # Represents an amount of money with its currency type.
415
+ # Corresponds to the JSON property `monthlyBill`
416
+ # @return [Google::Apis::SolarV1::Money]
417
+ attr_accessor :monthly_bill
418
+
419
+ # Index in solar_panel_configs of the optimum solar layout for this bill size.
420
+ # This can be -1 indicating that there is no layout. In this case, the remaining
421
+ # submessages will be omitted.
422
+ # Corresponds to the JSON property `panelConfigIndex`
423
+ # @return [Fixnum]
424
+ attr_accessor :panel_config_index
425
+
426
+ def initialize(**args)
427
+ update!(**args)
428
+ end
429
+
430
+ # Update properties of this object
431
+ def update!(**args)
432
+ @average_kwh_per_month = args[:average_kwh_per_month] if args.key?(:average_kwh_per_month)
433
+ @cash_purchase_savings = args[:cash_purchase_savings] if args.key?(:cash_purchase_savings)
434
+ @default_bill = args[:default_bill] if args.key?(:default_bill)
435
+ @financed_purchase_savings = args[:financed_purchase_savings] if args.key?(:financed_purchase_savings)
436
+ @financial_details = args[:financial_details] if args.key?(:financial_details)
437
+ @leasing_savings = args[:leasing_savings] if args.key?(:leasing_savings)
438
+ @monthly_bill = args[:monthly_bill] if args.key?(:monthly_bill)
439
+ @panel_config_index = args[:panel_config_index] if args.key?(:panel_config_index)
440
+ end
441
+ end
442
+
443
+ # Details of a financial analysis. Some of these details are already stored at
444
+ # higher levels (e.g., out of pocket cost). Total money amounts are over a
445
+ # lifetime period defined by the panel_lifetime_years field in SolarPotential.
446
+ # Note: The out of pocket cost of purchasing the panels is given in the
447
+ # out_of_pocket_cost field in CashPurchaseSavings.
448
+ class FinancialDetails
449
+ include Google::Apis::Core::Hashable
450
+
451
+ # Represents an amount of money with its currency type.
452
+ # Corresponds to the JSON property `costOfElectricityWithoutSolar`
453
+ # @return [Google::Apis::SolarV1::Money]
454
+ attr_accessor :cost_of_electricity_without_solar
455
+
456
+ # Represents an amount of money with its currency type.
457
+ # Corresponds to the JSON property `federalIncentive`
458
+ # @return [Google::Apis::SolarV1::Money]
459
+ attr_accessor :federal_incentive
460
+
461
+ # How many AC kWh we think the solar panels will generate in their first year.
462
+ # Corresponds to the JSON property `initialAcKwhPerYear`
463
+ # @return [Float]
464
+ attr_accessor :initial_ac_kwh_per_year
465
+
466
+ # Represents an amount of money with its currency type.
467
+ # Corresponds to the JSON property `lifetimeSrecTotal`
468
+ # @return [Google::Apis::SolarV1::Money]
469
+ attr_accessor :lifetime_srec_total
470
+
471
+ # Whether net metering is allowed.
472
+ # Corresponds to the JSON property `netMeteringAllowed`
473
+ # @return [Boolean]
474
+ attr_accessor :net_metering_allowed
475
+ alias_method :net_metering_allowed?, :net_metering_allowed
476
+
477
+ # The percentage (0-100) of solar electricity production we assumed was exported
478
+ # to the grid, based on the first quarter of production. This affects the
479
+ # calculations if net metering is not allowed.
480
+ # Corresponds to the JSON property `percentageExportedToGrid`
481
+ # @return [Float]
482
+ attr_accessor :percentage_exported_to_grid
483
+
484
+ # Represents an amount of money with its currency type.
485
+ # Corresponds to the JSON property `remainingLifetimeUtilityBill`
486
+ # @return [Google::Apis::SolarV1::Money]
487
+ attr_accessor :remaining_lifetime_utility_bill
488
+
489
+ # Percentage (0-100) of the user's power supplied by solar. Valid for the first
490
+ # year but approximately correct for future years.
491
+ # Corresponds to the JSON property `solarPercentage`
492
+ # @return [Float]
493
+ attr_accessor :solar_percentage
494
+
495
+ # Represents an amount of money with its currency type.
496
+ # Corresponds to the JSON property `stateIncentive`
497
+ # @return [Google::Apis::SolarV1::Money]
498
+ attr_accessor :state_incentive
499
+
500
+ # Represents an amount of money with its currency type.
501
+ # Corresponds to the JSON property `utilityIncentive`
502
+ # @return [Google::Apis::SolarV1::Money]
503
+ attr_accessor :utility_incentive
504
+
505
+ def initialize(**args)
506
+ update!(**args)
507
+ end
508
+
509
+ # Update properties of this object
510
+ def update!(**args)
511
+ @cost_of_electricity_without_solar = args[:cost_of_electricity_without_solar] if args.key?(:cost_of_electricity_without_solar)
512
+ @federal_incentive = args[:federal_incentive] if args.key?(:federal_incentive)
513
+ @initial_ac_kwh_per_year = args[:initial_ac_kwh_per_year] if args.key?(:initial_ac_kwh_per_year)
514
+ @lifetime_srec_total = args[:lifetime_srec_total] if args.key?(:lifetime_srec_total)
515
+ @net_metering_allowed = args[:net_metering_allowed] if args.key?(:net_metering_allowed)
516
+ @percentage_exported_to_grid = args[:percentage_exported_to_grid] if args.key?(:percentage_exported_to_grid)
517
+ @remaining_lifetime_utility_bill = args[:remaining_lifetime_utility_bill] if args.key?(:remaining_lifetime_utility_bill)
518
+ @solar_percentage = args[:solar_percentage] if args.key?(:solar_percentage)
519
+ @state_incentive = args[:state_incentive] if args.key?(:state_incentive)
520
+ @utility_incentive = args[:utility_incentive] if args.key?(:utility_incentive)
521
+ end
522
+ end
523
+
524
+ # Message that represents an arbitrary HTTP body. It should only be used for
525
+ # payload formats that can't be represented as JSON, such as raw binary or an
526
+ # HTML page. This message can be used both in streaming and non-streaming API
527
+ # methods in the request as well as the response. It can be used as a top-level
528
+ # request field, which is convenient if one wants to extract parameters from
529
+ # either the URL or HTTP template into the request fields and also want access
530
+ # to the raw HTTP body. Example: message GetResourceRequest ` // A unique
531
+ # request id. string request_id = 1; // The raw HTTP body is bound to this field.
532
+ # google.api.HttpBody http_body = 2; ` service ResourceService ` rpc
533
+ # GetResource(GetResourceRequest) returns (google.api.HttpBody); rpc
534
+ # UpdateResource(google.api.HttpBody) returns (google.protobuf.Empty); ` Example
535
+ # with streaming methods: service CaldavService ` rpc GetCalendar(stream google.
536
+ # api.HttpBody) returns (stream google.api.HttpBody); rpc UpdateCalendar(stream
537
+ # google.api.HttpBody) returns (stream google.api.HttpBody); ` Use of this type
538
+ # only changes how the request and response bodies are handled, all other
539
+ # features will continue to work unchanged.
540
+ class HttpBody
541
+ include Google::Apis::Core::Hashable
542
+
543
+ # The HTTP Content-Type header value specifying the content type of the body.
544
+ # Corresponds to the JSON property `contentType`
545
+ # @return [String]
546
+ attr_accessor :content_type
547
+
548
+ # The HTTP request/response body as raw binary.
549
+ # Corresponds to the JSON property `data`
550
+ # NOTE: Values are automatically base64 encoded/decoded in the client library.
551
+ # @return [String]
552
+ attr_accessor :data
553
+
554
+ # Application specific response metadata. Must be set in the first response for
555
+ # streaming APIs.
556
+ # Corresponds to the JSON property `extensions`
557
+ # @return [Array<Hash<String,Object>>]
558
+ attr_accessor :extensions
559
+
560
+ def initialize(**args)
561
+ update!(**args)
562
+ end
563
+
564
+ # Update properties of this object
565
+ def update!(**args)
566
+ @content_type = args[:content_type] if args.key?(:content_type)
567
+ @data = args[:data] if args.key?(:data)
568
+ @extensions = args[:extensions] if args.key?(:extensions)
569
+ end
570
+ end
571
+
572
+ # An object that represents a latitude/longitude pair. This is expressed as a
573
+ # pair of doubles to represent degrees latitude and degrees longitude. Unless
574
+ # specified otherwise, this object must conform to the WGS84 standard. Values
575
+ # must be within normalized ranges.
576
+ class LatLng
577
+ include Google::Apis::Core::Hashable
578
+
579
+ # The latitude in degrees. It must be in the range [-90.0, +90.0].
580
+ # Corresponds to the JSON property `latitude`
581
+ # @return [Float]
582
+ attr_accessor :latitude
583
+
584
+ # The longitude in degrees. It must be in the range [-180.0, +180.0].
585
+ # Corresponds to the JSON property `longitude`
586
+ # @return [Float]
587
+ attr_accessor :longitude
588
+
589
+ def initialize(**args)
590
+ update!(**args)
591
+ end
592
+
593
+ # Update properties of this object
594
+ def update!(**args)
595
+ @latitude = args[:latitude] if args.key?(:latitude)
596
+ @longitude = args[:longitude] if args.key?(:longitude)
597
+ end
598
+ end
599
+
600
+ # A bounding box in lat/lng coordinates.
601
+ class LatLngBox
602
+ include Google::Apis::Core::Hashable
603
+
604
+ # An object that represents a latitude/longitude pair. This is expressed as a
605
+ # pair of doubles to represent degrees latitude and degrees longitude. Unless
606
+ # specified otherwise, this object must conform to the WGS84 standard. Values
607
+ # must be within normalized ranges.
608
+ # Corresponds to the JSON property `ne`
609
+ # @return [Google::Apis::SolarV1::LatLng]
610
+ attr_accessor :ne
611
+
612
+ # An object that represents a latitude/longitude pair. This is expressed as a
613
+ # pair of doubles to represent degrees latitude and degrees longitude. Unless
614
+ # specified otherwise, this object must conform to the WGS84 standard. Values
615
+ # must be within normalized ranges.
616
+ # Corresponds to the JSON property `sw`
617
+ # @return [Google::Apis::SolarV1::LatLng]
618
+ attr_accessor :sw
619
+
620
+ def initialize(**args)
621
+ update!(**args)
622
+ end
623
+
624
+ # Update properties of this object
625
+ def update!(**args)
626
+ @ne = args[:ne] if args.key?(:ne)
627
+ @sw = args[:sw] if args.key?(:sw)
628
+ end
629
+ end
630
+
631
+ # Cost and benefit of leasing a particular configuration of solar panels with a
632
+ # particular electricity usage.
633
+ class LeasingSavings
634
+ include Google::Apis::Core::Hashable
635
+
636
+ # Represents an amount of money with its currency type.
637
+ # Corresponds to the JSON property `annualLeasingCost`
638
+ # @return [Google::Apis::SolarV1::Money]
639
+ attr_accessor :annual_leasing_cost
640
+
641
+ # Whether leases are allowed in this juristiction (leases are not allowed in
642
+ # some states). If this field is false, then the values in this message should
643
+ # probably be ignored.
644
+ # Corresponds to the JSON property `leasesAllowed`
645
+ # @return [Boolean]
646
+ attr_accessor :leases_allowed
647
+ alias_method :leases_allowed?, :leases_allowed
648
+
649
+ # Whether leases are supported in this juristiction by the financial calculation
650
+ # engine. If this field is false, then the values in this message should
651
+ # probably be ignored. This is independent of `leases_allowed`: in some areas
652
+ # leases are allowed, but under conditions that aren't handled by the financial
653
+ # models.
654
+ # Corresponds to the JSON property `leasesSupported`
655
+ # @return [Boolean]
656
+ attr_accessor :leases_supported
657
+ alias_method :leases_supported?, :leases_supported
658
+
659
+ # Financial information that's shared between different financing methods.
660
+ # Corresponds to the JSON property `savings`
661
+ # @return [Google::Apis::SolarV1::SavingsOverTime]
662
+ attr_accessor :savings
663
+
664
+ def initialize(**args)
665
+ update!(**args)
666
+ end
667
+
668
+ # Update properties of this object
669
+ def update!(**args)
670
+ @annual_leasing_cost = args[:annual_leasing_cost] if args.key?(:annual_leasing_cost)
671
+ @leases_allowed = args[:leases_allowed] if args.key?(:leases_allowed)
672
+ @leases_supported = args[:leases_supported] if args.key?(:leases_supported)
673
+ @savings = args[:savings] if args.key?(:savings)
674
+ end
675
+ end
676
+
677
+ # Represents an amount of money with its currency type.
678
+ class Money
679
+ include Google::Apis::Core::Hashable
680
+
681
+ # The three-letter currency code defined in ISO 4217.
682
+ # Corresponds to the JSON property `currencyCode`
683
+ # @return [String]
684
+ attr_accessor :currency_code
685
+
686
+ # Number of nano (10^-9) units of the amount. The value must be between -999,999,
687
+ # 999 and +999,999,999 inclusive. If `units` is positive, `nanos` must be
688
+ # positive or zero. If `units` is zero, `nanos` can be positive, zero, or
689
+ # negative. If `units` is negative, `nanos` must be negative or zero. For
690
+ # example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
691
+ # Corresponds to the JSON property `nanos`
692
+ # @return [Fixnum]
693
+ attr_accessor :nanos
694
+
695
+ # The whole units of the amount. For example if `currencyCode` is `"USD"`, then
696
+ # 1 unit is one US dollar.
697
+ # Corresponds to the JSON property `units`
698
+ # @return [Fixnum]
699
+ attr_accessor :units
700
+
701
+ def initialize(**args)
702
+ update!(**args)
703
+ end
704
+
705
+ # Update properties of this object
706
+ def update!(**args)
707
+ @currency_code = args[:currency_code] if args.key?(:currency_code)
708
+ @nanos = args[:nanos] if args.key?(:nanos)
709
+ @units = args[:units] if args.key?(:units)
710
+ end
711
+ end
712
+
713
+ # Information about the size and sunniness quantiles of a roof segment.
714
+ class RoofSegmentSizeAndSunshineStats
715
+ include Google::Apis::Core::Hashable
716
+
717
+ # Compass direction the roof segment is pointing in. 0 = North, 90 = East, 180 =
718
+ # South. For a "flat" roof segment (`pitch_degrees` very near 0), azimuth is not
719
+ # well defined, so for consistency, we define it arbitrarily to be 0 (North).
720
+ # Corresponds to the JSON property `azimuthDegrees`
721
+ # @return [Float]
722
+ attr_accessor :azimuth_degrees
723
+
724
+ # A bounding box in lat/lng coordinates.
725
+ # Corresponds to the JSON property `boundingBox`
726
+ # @return [Google::Apis::SolarV1::LatLngBox]
727
+ attr_accessor :bounding_box
728
+
729
+ # An object that represents a latitude/longitude pair. This is expressed as a
730
+ # pair of doubles to represent degrees latitude and degrees longitude. Unless
731
+ # specified otherwise, this object must conform to the WGS84 standard. Values
732
+ # must be within normalized ranges.
733
+ # Corresponds to the JSON property `center`
734
+ # @return [Google::Apis::SolarV1::LatLng]
735
+ attr_accessor :center
736
+
737
+ # Angle of the roof segment relative to the theoretical ground plane. 0 =
738
+ # parallel to the ground, 90 = perpendicular to the ground.
739
+ # Corresponds to the JSON property `pitchDegrees`
740
+ # @return [Float]
741
+ attr_accessor :pitch_degrees
742
+
743
+ # The height of the roof segment plane, in meters above sea level, at the point
744
+ # designated by `center`. Together with the pitch, azimuth, and center location,
745
+ # this fully defines the roof segment plane.
746
+ # Corresponds to the JSON property `planeHeightAtCenterMeters`
747
+ # @return [Float]
748
+ attr_accessor :plane_height_at_center_meters
749
+
750
+ # Size and sunniness quantiles of a roof, or part of a roof.
751
+ # Corresponds to the JSON property `stats`
752
+ # @return [Google::Apis::SolarV1::SizeAndSunshineStats]
753
+ attr_accessor :stats
754
+
755
+ def initialize(**args)
756
+ update!(**args)
757
+ end
758
+
759
+ # Update properties of this object
760
+ def update!(**args)
761
+ @azimuth_degrees = args[:azimuth_degrees] if args.key?(:azimuth_degrees)
762
+ @bounding_box = args[:bounding_box] if args.key?(:bounding_box)
763
+ @center = args[:center] if args.key?(:center)
764
+ @pitch_degrees = args[:pitch_degrees] if args.key?(:pitch_degrees)
765
+ @plane_height_at_center_meters = args[:plane_height_at_center_meters] if args.key?(:plane_height_at_center_meters)
766
+ @stats = args[:stats] if args.key?(:stats)
767
+ end
768
+ end
769
+
770
+ # Information about a roof segment on the building, with some number of panels
771
+ # placed on it.
772
+ class RoofSegmentSummary
773
+ include Google::Apis::Core::Hashable
774
+
775
+ # Compass direction the roof segment is pointing in. 0 = North, 90 = East, 180 =
776
+ # South. For a "flat" roof segment (`pitch_degrees` very near 0), azimuth is not
777
+ # well defined, so for consistency, we define it arbitrarily to be 0 (North).
778
+ # Corresponds to the JSON property `azimuthDegrees`
779
+ # @return [Float]
780
+ attr_accessor :azimuth_degrees
781
+
782
+ # The total number of panels on this segment.
783
+ # Corresponds to the JSON property `panelsCount`
784
+ # @return [Fixnum]
785
+ attr_accessor :panels_count
786
+
787
+ # Angle of the roof segment relative to the theoretical ground plane. 0 =
788
+ # parallel to the ground, 90 = perpendicular to the ground.
789
+ # Corresponds to the JSON property `pitchDegrees`
790
+ # @return [Float]
791
+ attr_accessor :pitch_degrees
792
+
793
+ # Index in roof_segment_stats of the corresponding `
794
+ # RoofSegmentSizeAndSunshineStats`.
795
+ # Corresponds to the JSON property `segmentIndex`
796
+ # @return [Fixnum]
797
+ attr_accessor :segment_index
798
+
799
+ # How much sunlight energy this part of the layout captures over the course of a
800
+ # year, in DC kWh, assuming the panels described above.
801
+ # Corresponds to the JSON property `yearlyEnergyDcKwh`
802
+ # @return [Float]
803
+ attr_accessor :yearly_energy_dc_kwh
804
+
805
+ def initialize(**args)
806
+ update!(**args)
807
+ end
808
+
809
+ # Update properties of this object
810
+ def update!(**args)
811
+ @azimuth_degrees = args[:azimuth_degrees] if args.key?(:azimuth_degrees)
812
+ @panels_count = args[:panels_count] if args.key?(:panels_count)
813
+ @pitch_degrees = args[:pitch_degrees] if args.key?(:pitch_degrees)
814
+ @segment_index = args[:segment_index] if args.key?(:segment_index)
815
+ @yearly_energy_dc_kwh = args[:yearly_energy_dc_kwh] if args.key?(:yearly_energy_dc_kwh)
816
+ end
817
+ end
818
+
819
+ # Financial information that's shared between different financing methods.
820
+ class SavingsOverTime
821
+ include Google::Apis::Core::Hashable
822
+
823
+ # Indicates whether this scenario is financially viable. Will be false for
824
+ # scenarios with poor financial viability (e.g., money-losing).
825
+ # Corresponds to the JSON property `financiallyViable`
826
+ # @return [Boolean]
827
+ attr_accessor :financially_viable
828
+ alias_method :financially_viable?, :financially_viable
829
+
830
+ # Represents an amount of money with its currency type.
831
+ # Corresponds to the JSON property `presentValueOfSavingsLifetime`
832
+ # @return [Google::Apis::SolarV1::Money]
833
+ attr_accessor :present_value_of_savings_lifetime
834
+
835
+ # Represents an amount of money with its currency type.
836
+ # Corresponds to the JSON property `presentValueOfSavingsYear20`
837
+ # @return [Google::Apis::SolarV1::Money]
838
+ attr_accessor :present_value_of_savings_year20
839
+
840
+ # Represents an amount of money with its currency type.
841
+ # Corresponds to the JSON property `savingsLifetime`
842
+ # @return [Google::Apis::SolarV1::Money]
843
+ attr_accessor :savings_lifetime
844
+
845
+ # Represents an amount of money with its currency type.
846
+ # Corresponds to the JSON property `savingsYear1`
847
+ # @return [Google::Apis::SolarV1::Money]
848
+ attr_accessor :savings_year1
849
+
850
+ # Represents an amount of money with its currency type.
851
+ # Corresponds to the JSON property `savingsYear20`
852
+ # @return [Google::Apis::SolarV1::Money]
853
+ attr_accessor :savings_year20
854
+
855
+ def initialize(**args)
856
+ update!(**args)
857
+ end
858
+
859
+ # Update properties of this object
860
+ def update!(**args)
861
+ @financially_viable = args[:financially_viable] if args.key?(:financially_viable)
862
+ @present_value_of_savings_lifetime = args[:present_value_of_savings_lifetime] if args.key?(:present_value_of_savings_lifetime)
863
+ @present_value_of_savings_year20 = args[:present_value_of_savings_year20] if args.key?(:present_value_of_savings_year20)
864
+ @savings_lifetime = args[:savings_lifetime] if args.key?(:savings_lifetime)
865
+ @savings_year1 = args[:savings_year1] if args.key?(:savings_year1)
866
+ @savings_year20 = args[:savings_year20] if args.key?(:savings_year20)
867
+ end
868
+ end
869
+
870
+ # Size and sunniness quantiles of a roof, or part of a roof.
871
+ class SizeAndSunshineStats
872
+ include Google::Apis::Core::Hashable
873
+
874
+ # The area of the roof or roof segment, in m^2. This is the roof area (
875
+ # accounting for tilt), not the ground footprint area.
876
+ # Corresponds to the JSON property `areaMeters2`
877
+ # @return [Float]
878
+ attr_accessor :area_meters2
879
+
880
+ # The ground footprint area covered by the roof or roof segment, in m^2.
881
+ # Corresponds to the JSON property `groundAreaMeters2`
882
+ # @return [Float]
883
+ attr_accessor :ground_area_meters2
884
+
885
+ # Quantiles of the pointwise sunniness across the area. If there are N values
886
+ # here, this represents the (N-1)-iles. For example, if there are 5 values, then
887
+ # they would be the quartiles (min, 25%, 50%, 75%, max). Values are in annual
888
+ # kWh/kW like max_sunshine_hours_per_year.
889
+ # Corresponds to the JSON property `sunshineQuantiles`
890
+ # @return [Array<Float>]
891
+ attr_accessor :sunshine_quantiles
892
+
893
+ def initialize(**args)
894
+ update!(**args)
895
+ end
896
+
897
+ # Update properties of this object
898
+ def update!(**args)
899
+ @area_meters2 = args[:area_meters2] if args.key?(:area_meters2)
900
+ @ground_area_meters2 = args[:ground_area_meters2] if args.key?(:ground_area_meters2)
901
+ @sunshine_quantiles = args[:sunshine_quantiles] if args.key?(:sunshine_quantiles)
902
+ end
903
+ end
904
+
905
+ # SolarPanel describes the position, orientation, and production of a single
906
+ # solar panel. See the panel_height_meters, panel_width_meters, and
907
+ # panel_capacity_watts fields in SolarPotential for information on the
908
+ # parameters of the panel.
909
+ class SolarPanel
910
+ include Google::Apis::Core::Hashable
911
+
912
+ # An object that represents a latitude/longitude pair. This is expressed as a
913
+ # pair of doubles to represent degrees latitude and degrees longitude. Unless
914
+ # specified otherwise, this object must conform to the WGS84 standard. Values
915
+ # must be within normalized ranges.
916
+ # Corresponds to the JSON property `center`
917
+ # @return [Google::Apis::SolarV1::LatLng]
918
+ attr_accessor :center
919
+
920
+ # The orientation of the panel.
921
+ # Corresponds to the JSON property `orientation`
922
+ # @return [String]
923
+ attr_accessor :orientation
924
+
925
+ # Index in roof_segment_stats of the `RoofSegmentSizeAndSunshineStats` which
926
+ # corresponds to the roof segment that this panel is placed on.
927
+ # Corresponds to the JSON property `segmentIndex`
928
+ # @return [Fixnum]
929
+ attr_accessor :segment_index
930
+
931
+ # How much sunlight energy this layout captures over the course of a year, in DC
932
+ # kWh.
933
+ # Corresponds to the JSON property `yearlyEnergyDcKwh`
934
+ # @return [Float]
935
+ attr_accessor :yearly_energy_dc_kwh
936
+
937
+ def initialize(**args)
938
+ update!(**args)
939
+ end
940
+
941
+ # Update properties of this object
942
+ def update!(**args)
943
+ @center = args[:center] if args.key?(:center)
944
+ @orientation = args[:orientation] if args.key?(:orientation)
945
+ @segment_index = args[:segment_index] if args.key?(:segment_index)
946
+ @yearly_energy_dc_kwh = args[:yearly_energy_dc_kwh] if args.key?(:yearly_energy_dc_kwh)
947
+ end
948
+ end
949
+
950
+ # SolarPanelConfig describes a particular placement of solar panels on the roof.
951
+ class SolarPanelConfig
952
+ include Google::Apis::Core::Hashable
953
+
954
+ # Total number of panels. Note that this is redundant to (the sum of) the
955
+ # corresponding fields in roof_segment_summaries.
956
+ # Corresponds to the JSON property `panelsCount`
957
+ # @return [Fixnum]
958
+ attr_accessor :panels_count
959
+
960
+ # Information about the production of each roof segment that is carrying at
961
+ # least one panel in this layout. `roof_segment_summaries[i]` describes the i-th
962
+ # roof segment, including its size, expected production and orientation.
963
+ # Corresponds to the JSON property `roofSegmentSummaries`
964
+ # @return [Array<Google::Apis::SolarV1::RoofSegmentSummary>]
965
+ attr_accessor :roof_segment_summaries
966
+
967
+ # How much sunlight energy this layout captures over the course of a year, in DC
968
+ # kWh, assuming the panels described above.
969
+ # Corresponds to the JSON property `yearlyEnergyDcKwh`
970
+ # @return [Float]
971
+ attr_accessor :yearly_energy_dc_kwh
972
+
973
+ def initialize(**args)
974
+ update!(**args)
975
+ end
976
+
977
+ # Update properties of this object
978
+ def update!(**args)
979
+ @panels_count = args[:panels_count] if args.key?(:panels_count)
980
+ @roof_segment_summaries = args[:roof_segment_summaries] if args.key?(:roof_segment_summaries)
981
+ @yearly_energy_dc_kwh = args[:yearly_energy_dc_kwh] if args.key?(:yearly_energy_dc_kwh)
982
+ end
983
+ end
984
+
985
+ # Information about the solar potential of a building. A number of fields in
986
+ # this are defined in terms of "panels". The fields panel_capacity_watts,
987
+ # panel_height_meters, and panel_width_meters describe the parameters of the
988
+ # model of panel used in these calculations.
989
+ class SolarPotential
990
+ include Google::Apis::Core::Hashable
991
+
992
+ # Size and sunniness quantiles of a roof, or part of a roof.
993
+ # Corresponds to the JSON property `buildingStats`
994
+ # @return [Google::Apis::SolarV1::SizeAndSunshineStats]
995
+ attr_accessor :building_stats
996
+
997
+ # Equivalent amount of CO2 produced per MWh of grid electricity. This is a
998
+ # measure of the carbon intensity of grid electricity displaced by solar
999
+ # electricity.
1000
+ # Corresponds to the JSON property `carbonOffsetFactorKgPerMwh`
1001
+ # @return [Float]
1002
+ attr_accessor :carbon_offset_factor_kg_per_mwh
1003
+
1004
+ # A FinancialAnalysis gives the savings from going solar assuming a given
1005
+ # monthly bill and a given electricity provider. They are in order of increasing
1006
+ # order of monthly bill amount. This field will be empty for buildings in areas
1007
+ # for which the Solar API does not have enough information to perform financial
1008
+ # computations.
1009
+ # Corresponds to the JSON property `financialAnalyses`
1010
+ # @return [Array<Google::Apis::SolarV1::FinancialAnalysis>]
1011
+ attr_accessor :financial_analyses
1012
+
1013
+ # Size, in square meters, of the maximum array.
1014
+ # Corresponds to the JSON property `maxArrayAreaMeters2`
1015
+ # @return [Float]
1016
+ attr_accessor :max_array_area_meters2
1017
+
1018
+ # Size of the maximum array - that is, the maximum number of panels that can fit
1019
+ # on the roof.
1020
+ # Corresponds to the JSON property `maxArrayPanelsCount`
1021
+ # @return [Fixnum]
1022
+ attr_accessor :max_array_panels_count
1023
+
1024
+ # Maximum number of sunshine hours received per year, by any point on the roof.
1025
+ # Sunshine hours are a measure of the total amount of insolation (energy)
1026
+ # received per year. 1 sunshine hour = 1 kWh per kW (where kW refers to kW of
1027
+ # capacity under Standard Testing Conditions).
1028
+ # Corresponds to the JSON property `maxSunshineHoursPerYear`
1029
+ # @return [Float]
1030
+ attr_accessor :max_sunshine_hours_per_year
1031
+
1032
+ # Capacity, in watts, of the panel used in the calculations.
1033
+ # Corresponds to the JSON property `panelCapacityWatts`
1034
+ # @return [Float]
1035
+ attr_accessor :panel_capacity_watts
1036
+
1037
+ # Height, in meters in portrait orientation, of the panel used in the
1038
+ # calculations.
1039
+ # Corresponds to the JSON property `panelHeightMeters`
1040
+ # @return [Float]
1041
+ attr_accessor :panel_height_meters
1042
+
1043
+ # The expected lifetime, in years, of the solar panels. This is used in the
1044
+ # financial calculations.
1045
+ # Corresponds to the JSON property `panelLifetimeYears`
1046
+ # @return [Fixnum]
1047
+ attr_accessor :panel_lifetime_years
1048
+
1049
+ # Width, in meters in portrait orientation, of the panel used in the
1050
+ # calculations.
1051
+ # Corresponds to the JSON property `panelWidthMeters`
1052
+ # @return [Float]
1053
+ attr_accessor :panel_width_meters
1054
+
1055
+ # Size and sunlight quantiles for each roof segment.
1056
+ # Corresponds to the JSON property `roofSegmentStats`
1057
+ # @return [Array<Google::Apis::SolarV1::RoofSegmentSizeAndSunshineStats>]
1058
+ attr_accessor :roof_segment_stats
1059
+
1060
+ # Each SolarPanelConfig describes a different arrangement of solar panels on the
1061
+ # roof. They are in order of increasing number of panels. The `SolarPanelConfig`
1062
+ # with panels_count=N is based on the first N panels in the `solar_panels` list.
1063
+ # This field is only populated if at least 4 panels can fit on a roof.
1064
+ # Corresponds to the JSON property `solarPanelConfigs`
1065
+ # @return [Array<Google::Apis::SolarV1::SolarPanelConfig>]
1066
+ attr_accessor :solar_panel_configs
1067
+
1068
+ # Each SolarPanel describes a single solar panel. They are listed in the order
1069
+ # that the panel layout algorithm placed this. This is usually, though not
1070
+ # always, in decreasing order of annual energy production.
1071
+ # Corresponds to the JSON property `solarPanels`
1072
+ # @return [Array<Google::Apis::SolarV1::SolarPanel>]
1073
+ attr_accessor :solar_panels
1074
+
1075
+ # Size and sunniness quantiles of a roof, or part of a roof.
1076
+ # Corresponds to the JSON property `wholeRoofStats`
1077
+ # @return [Google::Apis::SolarV1::SizeAndSunshineStats]
1078
+ attr_accessor :whole_roof_stats
1079
+
1080
+ def initialize(**args)
1081
+ update!(**args)
1082
+ end
1083
+
1084
+ # Update properties of this object
1085
+ def update!(**args)
1086
+ @building_stats = args[:building_stats] if args.key?(:building_stats)
1087
+ @carbon_offset_factor_kg_per_mwh = args[:carbon_offset_factor_kg_per_mwh] if args.key?(:carbon_offset_factor_kg_per_mwh)
1088
+ @financial_analyses = args[:financial_analyses] if args.key?(:financial_analyses)
1089
+ @max_array_area_meters2 = args[:max_array_area_meters2] if args.key?(:max_array_area_meters2)
1090
+ @max_array_panels_count = args[:max_array_panels_count] if args.key?(:max_array_panels_count)
1091
+ @max_sunshine_hours_per_year = args[:max_sunshine_hours_per_year] if args.key?(:max_sunshine_hours_per_year)
1092
+ @panel_capacity_watts = args[:panel_capacity_watts] if args.key?(:panel_capacity_watts)
1093
+ @panel_height_meters = args[:panel_height_meters] if args.key?(:panel_height_meters)
1094
+ @panel_lifetime_years = args[:panel_lifetime_years] if args.key?(:panel_lifetime_years)
1095
+ @panel_width_meters = args[:panel_width_meters] if args.key?(:panel_width_meters)
1096
+ @roof_segment_stats = args[:roof_segment_stats] if args.key?(:roof_segment_stats)
1097
+ @solar_panel_configs = args[:solar_panel_configs] if args.key?(:solar_panel_configs)
1098
+ @solar_panels = args[:solar_panels] if args.key?(:solar_panels)
1099
+ @whole_roof_stats = args[:whole_roof_stats] if args.key?(:whole_roof_stats)
1100
+ end
1101
+ end
1102
+ end
1103
+ end
1104
+ end