Skip to content

Commit 5927a8f

Browse files
authored
add temp params, surface albedos, and timezones as json files (#122)
* add temp params, surface albedos, and timezones as json files and lookup the parameters to fill in appropriate fields on the dashboard including the temperature parameters, albedo from surface type, and make job timezone a selector of all allowed * update albedo text, tests * test changes
1 parent 71e5ea8 commit 5927a8f

File tree

13 files changed

+217
-44
lines changed

13 files changed

+217
-44
lines changed

api/solarperformanceinsight_api/models.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55

66
import pandas as pd
7+
import pvlib # type: ignore
78
from pydantic import BaseModel, Field, PrivateAttr, validator, root_validator
89
from pydantic.fields import Undefined
910
from pydantic.types import UUID
@@ -67,6 +68,14 @@
6768
)
6869
],
6970
)
71+
# all compatible with luxon 1.25.0, most commen + Etc/GMT+offset
72+
TIMEZONES = [
73+
tz
74+
for tz in pytz.common_timezones
75+
if not tz.startswith("US/") and tz not in ("America/Nuuk", "Antarctica/McMurdo")
76+
] + [tz for tz in pytz.all_timezones if tz.startswith("Etc/GMT") and tz != "Etc/GMT0"]
77+
SURFACE_ALBEDOS = pvlib.irradiance.SURFACE_ALBEDOS
78+
TEMPERATURE_PARAMETERS = pvlib.temperature.TEMPERATURE_MODEL_PARAMETERS
7079

7180

7281
# allows word chars, space, comma, apostrophe, hyphen, parentheses, underscore
@@ -650,10 +659,8 @@ def check_step(cls, v):
650659

651660
@validator("timezone")
652661
def check_tz(cls, v):
653-
if v is not None and v not in pytz.all_timezones:
654-
raise ValueError(
655-
"Unrecognized timezone, timezone must be one of pytz.all_timezones"
656-
)
662+
if v is not None and v not in TIMEZONES:
663+
raise ValueError("Unrecognized timezone")
657664
return v
658665

659666

api/solarperformanceinsight_api/routers/parameters.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
from fastapi import APIRouter, HTTPException, Path
77
from pvlib.pvsystem import retrieve_sam # type: ignore
8-
import pytz
98

109

1110
from .. import models
@@ -51,18 +50,3 @@ def get_sandia_inverter(
5150
return models.SandiaInverterParameters(
5251
**sandia_inverter_params[inverter_name].to_dict()
5352
)
54-
55-
56-
@router.get("/timezones", response_model=List[str])
57-
def get_timezones() -> List[str]:
58-
"""Get current and GMT timezones"""
59-
# returned zones all compatible with luxon 1.25.0
60-
tzs = [
61-
tz
62-
for tz in pytz.common_timezones
63-
if not tz.startswith("US/") and tz not in ("America/Nuuk", "Antarctica/McMurdo")
64-
]
65-
tzs += [
66-
tz for tz in pytz.all_timezones if tz.startswith("Etc/GMT") and tz != "Etc/GMT0"
67-
]
68-
return tzs

dashboard/src/components/jobs/parameters/TimeParameters.vue

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,36 @@
1717
/>
1818
minutes
1919
<br />
20-
<b>Timezone:</b>
21-
<input @change="emitParams" v-model="timezone" class="timezone" />
20+
<label for="timezoneSelect"><b>Timezone:</b></label>
21+
<select
22+
@change="emitParams"
23+
v-model="timezone"
24+
class="timezone"
25+
name="timezoneSelect"
26+
>
27+
<option v-for="tz in timezoneList" :key="tz">{{ tz }}</option>
28+
</select>
2229
</div>
2330
</template>
2431
<script lang="ts">
2532
import { Component, Vue } from "vue-property-decorator";
33+
import Timezones from "@/constants/timezones.json";
34+
import { LocalZone } from "luxon";
2635
2736
@Component
2837
export default class JobTimeParameters extends Vue {
2938
start!: string;
3039
end!: string;
3140
timezone!: string;
3241
step!: number;
42+
timezoneList: Array<string> = Timezones;
3343
3444
data() {
3545
return {
3646
start: "2020-01-01T00:00+00:00",
3747
end: "2020-02-01T00:00+00:00",
3848
step: 60,
39-
timezone: "UTC"
49+
timezone: new LocalZone().name
4050
};
4151
}
4252
mounted() {

dashboard/src/components/model/Array.vue

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,36 @@
1010
:parameters="parameters"
1111
:errors="errors"
1212
:definitions="definitions"
13-
field-name="albedo"
13+
field-name="modules_per_string"
1414
/>
1515
<model-field
1616
:parameters="parameters"
1717
:errors="errors"
1818
:definitions="definitions"
19-
field-name="modules_per_string"
19+
field-name="strings"
20+
/>
21+
<label for="albedoSelect">Surface Type:</label>
22+
<select id="albedoSelect" name="albedoSelect" @change="changeAlbedo">
23+
<option value="" disable selected>manually set albedo</option>
24+
<option
25+
v-for="k in Object.keys(surfaceTypes)"
26+
:key="k"
27+
:name="k"
28+
:value="k"
29+
>
30+
{{ k }}
31+
</option>
32+
</select>
33+
<slot></slot>
34+
<help
35+
:helpText="'Fill in albedo based on some common surface types.'"
36+
:tagId="'albedoSelect'"
2037
/>
2138
<model-field
2239
:parameters="parameters"
2340
:errors="errors"
2441
:definitions="definitions"
25-
field-name="strings"
42+
field-name="albedo"
2643
/>
2744
<b>Tracking:</b>
2845
<input
@@ -82,6 +99,7 @@
8299

83100
<script lang="ts">
84101
import { Component, Prop, Watch } from "vue-property-decorator";
102+
import SurfaceTypes from "@/constants/surface_albedo.json";
85103
import { PVArray } from "@/types/PVArray";
86104
import {
87105
PVSystModuleParameters,
@@ -113,6 +131,7 @@ export default class ArrayView extends ModelBase {
113131
@Prop() numArrays!: number;
114132
115133
tracking!: string;
134+
surfaceTypes: Record<string, number> = SurfaceTypes;
116135
117136
data() {
118137
return {
@@ -144,6 +163,10 @@ export default class ArrayView extends ModelBase {
144163
}
145164
}
146165
166+
changeAlbedo(e: HTMLInputEvent) {
167+
this.parameters.albedo = this.surfaceTypes[e.target.value];
168+
}
169+
147170
changeTracking(e: HTMLInputEvent) {
148171
const tracking = e.target.value;
149172
if (tracking == "fixed") {

dashboard/src/components/model/TemperatureParameters.vue

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
<template>
22
<div class="temperature-parameters">
3+
<label for="mountDefaults"><b>Defaults:</b></label>
4+
<select @change="mounting" name="mountDefaults">
5+
<option value="" disable selected></option>
6+
<option v-for="k in mountOptions" :key="k" :name="k" :value="k">
7+
{{ k }}
8+
</option>
9+
</select>
310
<div v-if="model == 'pvsyst'">
411
<model-field
512
:parameters="parameters"
@@ -51,7 +58,7 @@
5158

5259
<script lang="ts">
5360
import ModelBase from "@/components/ModelBase.vue";
54-
61+
import DefaultParams from "@/constants/temp_params.json";
5562
import { Component, Prop, Watch } from "vue-property-decorator";
5663
5764
// Update with many classes of inverter parameters to check for type before
@@ -67,6 +74,13 @@ export default class TemperatureParametersView extends ModelBase {
6774
6875
@Prop() model!: string;
6976
errors: Record<string, any> = {};
77+
defaultMap: Record<
78+
string,
79+
Record<
80+
string,
81+
Partial<PVSystTemperatureParameters> | SAPMTemperatureParameters
82+
>
83+
> = DefaultParams;
7084
7185
get apiComponentName() {
7286
let componentName: string;
@@ -84,6 +98,26 @@ export default class TemperatureParametersView extends ModelBase {
8498
.validate(this.apiComponentName, newParams)
8599
.then(this.setValidationResult);
86100
}
101+
102+
get mountOptions() {
103+
let params: Array<string>;
104+
if (this.model == "pvsyst") {
105+
params = Object.keys(this.defaultMap.pvsyst);
106+
} else {
107+
params = Object.keys(this.defaultMap.sapm);
108+
}
109+
return params;
110+
}
111+
mounting(event: any) {
112+
const mountOpt = event.target.value;
113+
let newvals;
114+
if (this.model == "pvsyst") {
115+
newvals = this.defaultMap.pvsyst[mountOpt];
116+
} else {
117+
newvals = this.defaultMap.sapm[mountOpt];
118+
}
119+
this.parameters = Object.assign(this.parameters, newvals);
120+
}
87121
}
88122
</script>
89123

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"urban":0.18,"grass":0.2,"fresh grass":0.26,"soil":0.17,"sand":0.4,"snow":0.65,"fresh snow":0.75,"asphalt":0.12,"concrete":0.3,"aluminum":0.85,"copper":0.74,"fresh steel":0.35,"dirty steel":0.08,"sea":0.06}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"sapm":{"open_rack_glass_glass":{"a":-3.47,"b":-0.0594,"deltaT":3},"close_mount_glass_glass":{"a":-2.98,"b":-0.0471,"deltaT":1},"open_rack_glass_polymer":{"a":-3.56,"b":-0.075,"deltaT":3},"insulated_back_glass_polymer":{"a":-2.81,"b":-0.0455,"deltaT":0}},"pvsyst":{"freestanding":{"u_c":29.0,"u_v":0},"insulated":{"u_c":15.0,"u_v":0}}}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
["Africa/Abidjan","Africa/Accra","Africa/Addis_Ababa","Africa/Algiers","Africa/Asmara","Africa/Bamako","Africa/Bangui","Africa/Banjul","Africa/Bissau","Africa/Blantyre","Africa/Brazzaville","Africa/Bujumbura","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/Conakry","Africa/Dakar","Africa/Dar_es_Salaam","Africa/Djibouti","Africa/Douala","Africa/El_Aaiun","Africa/Freetown","Africa/Gaborone","Africa/Harare","Africa/Johannesburg","Africa/Juba","Africa/Kampala","Africa/Khartoum","Africa/Kigali","Africa/Kinshasa","Africa/Lagos","Africa/Libreville","Africa/Lome","Africa/Luanda","Africa/Lubumbashi","Africa/Lusaka","Africa/Malabo","Africa/Maputo","Africa/Maseru","Africa/Mbabane","Africa/Mogadishu","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Niamey","Africa/Nouakchott","Africa/Ouagadougou","Africa/Porto-Novo","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Anguilla","America/Antigua","America/Araguaina","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Aruba","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Cayman","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/Kralendijk","America/La_Paz","America/Lima","America/Los_Angeles","America/Lower_Princes","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/St_Helena","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Canada/Atlantic","Canada/Central","Canada/Eastern","Canada/Mountain","Canada/Newfoundland","Canada/Pacific","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","GMT","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis","UTC","Etc/GMT","Etc/GMT+0","Etc/GMT+1","Etc/GMT+10","Etc/GMT+11","Etc/GMT+12","Etc/GMT+2","Etc/GMT+3","Etc/GMT+4","Etc/GMT+5","Etc/GMT+6","Etc/GMT+7","Etc/GMT+8","Etc/GMT+9","Etc/GMT-0","Etc/GMT-1","Etc/GMT-10","Etc/GMT-11","Etc/GMT-12","Etc/GMT-13","Etc/GMT-14","Etc/GMT-2","Etc/GMT-3","Etc/GMT-4","Etc/GMT-5","Etc/GMT-6","Etc/GMT-7","Etc/GMT-8","Etc/GMT-9"]

dashboard/tests/unit/jobs/test_jobparameters.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ const defaultTimeParams = {
3939
start: "2020-01-01T00:00+00:00",
4040
end: "2020-02-01T00:00+00:00",
4141
step: 3600,
42-
timezone: "UTC"
42+
timezone: "America/Denver"
4343
};
4444
// vue test setup
4545
const localVue = createLocalVue();

dashboard/tests/unit/jobs/test_timeparameters.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ describe("test timeparameters", () => {
1818
start: "2020-01-01T00:00+00:00",
1919
end: "2020-02-01T00:00+00:00",
2020
step: 3600,
21-
timezone: "UTC"
21+
timezone: "America/Denver"
2222
}
2323
]);
2424
wrapper.find(".end").setValue("2020-01-02T00:00+00:00");
@@ -33,7 +33,7 @@ describe("test timeparameters", () => {
3333
start: "2020-01-01T00:00+00:00",
3434
end: "2020-01-02T00:00+00:00",
3535
step: 3600,
36-
timezone: "UTC"
36+
timezone: "America/Denver"
3737
}
3838
]);
3939
});

0 commit comments

Comments
 (0)