mini_program_gizwits_sdk 3.4.3 → 3.4.5-FeiSiMan

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.
@@ -3,6 +3,7 @@ import sleep from "../sleep";
3
3
  import errorCode from "../errorCode";
4
4
  import { bindMac, checkDeviceRegister } from '../services/devices';
5
5
  import GizLog from "../GizLog";
6
+ import timeZoneDic from './timeZoneName.json'
6
7
 
7
8
  interface IRejectCallback {
8
9
  (result: IResult<unknown>): void;
@@ -42,6 +43,49 @@ class ConfigBase {
42
43
  this.cleanTimeout();
43
44
  };
44
45
 
46
+ // 插入配网扩展信息
47
+ appendExtendData = (key: string) => {
48
+ const cmd = 0 // 小程序默认国内
49
+ const zone: number = new Date().getTimezoneOffset() / 60; //手机时区
50
+ let hour: number = Math.floor(zone);
51
+ let m: number = 0; //最终下发的时区精度
52
+ let h: string = ""; //最终下发的时区
53
+ let zoneAccuracy: number = zone - hour;
54
+ let timeZoneCode =0
55
+ const timeZoneName = Intl.DateTimeFormat().resolvedOptions().timeZone;
56
+
57
+ if (hour >= 0 && hour <= 9) { //时区0~9
58
+ h = String.fromCharCode('0'.charCodeAt(0) + hour);
59
+ } else if (hour > 9) { //A~F
60
+ h = String.fromCharCode(hour - 10 + 'A'.charCodeAt(0));
61
+ } else { //a~o
62
+ h = String.fromCharCode(-hour - 1 + 'a'.charCodeAt(0));
63
+ }
64
+
65
+ if (zoneAccuracy < 0) { //转正数
66
+ zoneAccuracy = -zoneAccuracy;
67
+ }
68
+
69
+ if (zoneAccuracy >= 0 && zoneAccuracy < 0.25) { //精度
70
+ m = 0;
71
+ } else if (zoneAccuracy >= 0.25 && zoneAccuracy < 0.5) {
72
+ m = 1;
73
+ } else if (zoneAccuracy >= 0.5 && zoneAccuracy < 0.75) {
74
+ m = 2;
75
+ } else {
76
+ m = 3;
77
+ }
78
+
79
+ Object.entries(timeZoneDic).forEach(([key, value]) => {
80
+ if (value === timeZoneName) {
81
+ timeZoneCode = parseInt(key);
82
+ return;
83
+ }
84
+ });
85
+
86
+ return key + `\0\x1b` + cmd + "\x1b" + h + m + "\x1b" + timeZoneCode;
87
+ }
88
+
45
89
  hasTimeoutHandler = (cb?: IRejectCallback) => {
46
90
  if (this.timeoutHandler) {
47
91
  // 方法还在执行中
@@ -143,6 +143,8 @@ class ApConfig extends ConfigBase {
143
143
  }: ISetDeviceOnboardingDeployProps) => {
144
144
  const ssid = this.ssid;
145
145
  const password = this.password;
146
+ // 插入时区信息
147
+ const appendPassword = this.appendExtendData(password)
146
148
  return new Promise<IResult<IDevice[]>>(async (res, rej) => {
147
149
  this.destroy();
148
150
  this.initDeviceOnboardingDeploy(res, rej);
@@ -151,7 +153,7 @@ class ApConfig extends ConfigBase {
151
153
  try {
152
154
  const result = await this.configDevice({
153
155
  ssid,
154
- password,
156
+ password:appendPassword,
155
157
  softAPSSIDPrefix,
156
158
  });
157
159
  const newData: IDevice[] = (result.data || []).map(item => {
@@ -1,5 +1,5 @@
1
1
  import errorCode from "../errorCode";
2
- import { IRandomCodesResult, IResult } from "../sdk";
2
+ import { IConfigResult, IResult } from "../sdk";
3
3
  import { ab2hex, advertisData2PkAndMac, isWXDevicesResult } from '../utils';
4
4
 
5
5
  import GizLog from "../GizLog";
@@ -11,6 +11,14 @@ import {
11
11
  notifyBLECharacteristicValueChange, retryConnect, startBluetoothDevicesDiscovery, unpackWriteBLECharacteristicValue
12
12
  } from '../wechatApi';
13
13
  import ConfigBase from "./ConfigBase";
14
+ import aepApiRequest from "../aepApi/aepApiRequest";
15
+
16
+ interface IVerifyOnlineResult {
17
+ data: {
18
+ status: number; // 2表示离线 3表示在线
19
+ }
20
+ }
21
+
14
22
 
15
23
  interface IArgs {
16
24
  bleDeviceId: string;
@@ -260,6 +268,52 @@ class BLEConfig extends ConfigBase {
260
268
  return { success: true };
261
269
  };
262
270
 
271
+ getDeviceLastestOnlineTime = async ({ productKey, mac }:
272
+ { productKey: string, mac: string }) => {
273
+ GizLog.debug('GIZ_SDK: getDeviceLastestOnlineTime', mac);
274
+ const res = await aepApiRequest<IVerifyOnlineResult>(`applet/device/getDeviceInfo/${(mac ?? '')}`, { method: 'get' });
275
+ GizLog.debug('GIZ_SDK: 请求结果', res);
276
+ return res;
277
+ }
278
+
279
+ // 配网后确认设备是否上线
280
+ verifyDeviceOnline = ({ productKey, mac }: { productKey: string, mac: string }) => {
281
+ return new Promise<IResult<IVerifyOnlineResult>>((res, rej) => {
282
+ GizLog.debug('GIZ_SDK: 开始确认设备上线')
283
+ const query = async () => {
284
+
285
+ if (!this.hasTimeoutHandler()) {
286
+ return;
287
+ }
288
+
289
+ try {
290
+ await sleep(2000);
291
+ const data = await this.getDeviceLastestOnlineTime({ productKey, mac })
292
+ GizLog.debug('GIZ_SDK: 确认到设备是否在线', data.data.data.status);
293
+ if (data.success && data.data && data.data.data && data.data.data.status == 3) {
294
+ // 确认设备最后一次上线时间有更新
295
+ GizLog.debug('GIZ_SDK: 确认到设备是在线的', data);
296
+ res({
297
+ success: true,
298
+ data: data.data,
299
+ });
300
+ } else {
301
+ // 重新请求
302
+ GizLog.debug('GIZ_SDK: 未确认到设备是在线');
303
+ await sleep(1500);
304
+ !this.disableSearchDevice && query();
305
+ }
306
+ } catch (error) {
307
+ // 重新请求
308
+ await sleep(3000);
309
+ !this.disableSearchDevice && query();
310
+ // GizLog.debug('GIZ_SDK: random codes error', error);
311
+ }
312
+ };
313
+ query();
314
+ });
315
+ };
316
+
263
317
 
264
318
  enableAndGetBluetoothDevices = async (
265
319
  softAPSSIDPrefix?: string
@@ -290,30 +344,34 @@ class BLEConfig extends ConfigBase {
290
344
  return new Promise<IResult<IDevice[]>>(async (res, rej) => {
291
345
  const ssid = this.ssid;
292
346
  const password = this.password;
347
+
348
+ // 插入时区信息
349
+ const appendPassword = this.appendExtendData(password)
293
350
  this.destroy();
294
351
  this.initDeviceOnboardingDeploy(res, rej);
295
352
  this.startTimeoutTimer(timeout);
296
353
  try {
297
354
  const result = await this.configBLEDevice({
298
355
  ssid,
299
- password,
356
+ password: appendPassword,
300
357
  timeout: timeout * 1000,
301
358
  softAPSSIDPrefix,
302
359
  });
303
360
 
304
- const newData: IDevice[] = (result.data || []).map(item => {
305
- return {
306
- mac: item.mac,
307
- productKey: item.product_key,
308
- did: item.did,
309
- name: '',
310
- isBind: false,
311
- connectType: 'NONE',
312
- isBleOnline: false,
313
- isLanOnline: false,
314
- isOnline: false,
315
- }
316
- })
361
+ const newData: IDevice[] = [result.data as IDevice];
362
+ // const newData: IDevice[] = (result.data || []).map(item => {
363
+ // return {
364
+ // mac: item.mac,
365
+ // productKey: item.product_key,
366
+ // did: item.did,
367
+ // name: '',
368
+ // isBind: false,
369
+ // connectType: 'NONE',
370
+ // isBleOnline: false,
371
+ // isLanOnline: false,
372
+ // isOnline: false,
373
+ // }
374
+ // })
317
375
  if (isBind) {
318
376
  res(await this.bindDevices(newData));
319
377
  } else {
@@ -341,7 +399,7 @@ class BLEConfig extends ConfigBase {
341
399
  password,
342
400
  softAPSSIDPrefix,
343
401
  }: configBLEDeviceParams) => {
344
- return new Promise<IResult<IRandomCodesResult[]>>(async (res, rej) => {
402
+ return new Promise<IResult<IConfigResult>>(async (res, rej) => {
345
403
  GizLog.debug('GIZ_SDK: start config ble device');
346
404
  const enableAndGetRes = await this.enableAndGetBluetoothDevices(
347
405
  softAPSSIDPrefix
@@ -380,12 +438,13 @@ class BLEConfig extends ConfigBase {
380
438
  wx.onBluetoothDeviceFound(handleFoundDevices);
381
439
 
382
440
  const uint8Array = WifiConfig.pack(ssid,password);
441
+ const bleDevice = bleDevices.shift();
442
+ const { productKey, mac } = advertisData2PkAndMac(bleDevice.advertisData, this.specialProductKeys)
383
443
  const startConfigDevice = async () => {
384
444
  GizLog.debug('GIZ_SDK: startConfigDevice');
385
445
  if (!this.hasTimeoutHandler()) {
386
446
  return;
387
447
  }
388
- const bleDevice = bleDevices.shift();
389
448
  if (bleDevice) {
390
449
  GizLog.debug('GIZ_SDK: startConfigDevice, target device: ', bleDevice);
391
450
  }
@@ -410,19 +469,23 @@ class BLEConfig extends ConfigBase {
410
469
  GizLog.debug("GIZ_SDK: offBluetoothDeviceFound ready search device")
411
470
  wx.offBluetoothDeviceFound(() => {});
412
471
  };
472
+ await startConfigDevice();
413
473
 
414
- // 开始大循环搜索
474
+ // 开始确认设备是否上线
415
475
  try {
416
476
  // const devicesReturn = await this.searchDevice({ ssid, password });
417
- this.searchDevice({ ssid, password }).then(devicesReturn => {
418
- res(devicesReturn);
419
- })
477
+ // this.searchDevice({ ssid, password }).then(devicesReturn => {
478
+ // res(devicesReturn);
479
+ // })
480
+ await sleep(5000);
481
+ // const devicesReturn = await this.searchDevice({ ssid, password });
482
+ this.verifyDeviceOnline({ productKey, mac }).then(devicesReturn => {
483
+ res({ ...devicesReturn, data: { ...devicesReturn.data.data, mac, productKey } });
484
+ });
420
485
  } catch (error) {
421
486
  rej(error);
422
487
  GizLog.error("GIZ_SDK: searchDevice error", new Error(JSON.stringify(error)))
423
488
  }
424
-
425
- await startConfigDevice();
426
489
  });
427
490
  };
428
491
  }
@@ -0,0 +1 @@
1
+ {"0": "Africa/Abidjan", "1": "Africa/Accra", "2": "Africa/Addis_Ababa", "3": "Africa/Algiers", "4": "Africa/Asmara", "5": "Africa/Asmera", "6": "Africa/Bamako", "7": "Africa/Bangui", "8": "Africa/Banjul", "9": "Africa/Bissau", "10": "Africa/Blantyre", "11": "Africa/Brazzaville", "12": "Africa/Bujumbura", "13": "Africa/Cairo", "14": "Africa/Casablanca", "15": "Africa/Ceuta", "16": "Africa/Conakry", "17": "Africa/Dakar", "18": "Africa/Dar_es_Salaam", "19": "Africa/Djibouti", "20": "Africa/Douala", "21": "Africa/El_Aaiun", "22": "Africa/Freetown", "23": "Africa/Gaborone", "24": "Africa/Harare", "25": "Africa/Johannesburg", "26": "Africa/Juba", "27": "Africa/Kampala", "28": "Africa/Khartoum", "29": "Africa/Kigali", "30": "Africa/Kinshasa", "31": "Africa/Lagos", "32": "Africa/Libreville", "33": "Africa/Lome", "34": "Africa/Luanda", "35": "Africa/Lubumbashi", "36": "Africa/Lusaka", "37": "Africa/Malabo", "38": "Africa/Maputo", "39": "Africa/Maseru", "40": "Africa/Mbabane", "41": "Africa/Mogadishu", "42": "Africa/Monrovia", "43": "Africa/Nairobi", "44": "Africa/Ndjamena", "45": "Africa/Niamey", "46": "Africa/Nouakchott", "47": "Africa/Ouagadougou", "48": "Africa/Porto-Novo", "49": "Africa/Sao_Tome", "50": "Africa/Timbuktu", "51": "Africa/Tripoli", "52": "Africa/Tunis", "53": "Africa/Windhoek", "54": "America/Adak", "55": "America/Anchorage", "56": "America/Anguilla", "57": "America/Antigua", "58": "America/Araguaina", "59": "America/Argentina/Buenos_Aires", "60": "America/Argentina/Catamarca", "61": "America/Argentina/ComodRivadavia", "62": "America/Argentina/Cordoba", "63": "America/Argentina/Jujuy", "64": "America/Argentina/La_Rioja", "65": "America/Argentina/Mendoza", "66": "America/Argentina/Rio_Gallegos", "67": "America/Argentina/Salta", "68": "America/Argentina/San_Juan", "69": "America/Argentina/San_Luis", "70": "America/Argentina/Tucuman", "71": "America/Argentina/Ushuaia", "72": "America/Aruba", "73": "America/Asuncion", "74": "America/Atikokan", "75": "America/Atka", "76": "America/Bahia", "77": "America/Bahia_Banderas", "78": "America/Barbados", "79": "America/Belem", "80": "America/Belize", "81": "America/Blanc-Sablon", "82": "America/Boa_Vista", "83": "America/Bogota", "84": "America/Boise", "85": "America/Buenos_Aires", "86": "America/Cambridge_Bay", "87": "America/Campo_Grande", "88": "America/Cancun", "89": "America/Caracas", "90": "America/Catamarca", "91": "America/Cayenne", "92": "America/Cayman", "93": "America/Chicago", "94": "America/Chihuahua", "95": "America/Coral_Harbour", "96": "America/Cordoba", "97": "America/Costa_Rica", "98": "America/Creston", "99": "America/Cuiaba", "100": "America/Curacao", "101": "America/Danmarkshavn", "102": "America/Dawson", "103": "America/Dawson_Creek", "104": "America/Denver", "105": "America/Detroit", "106": "America/Dominica", "107": "America/Edmonton", "108": "America/Eirunepe", "109": "America/El_Salvador", "110": "America/Ensenada", "111": "America/Fort_Nelson", "112": "America/Fort_Wayne", "113": "America/Fortaleza", "114": "America/Glace_Bay", "115": "America/Godthab", "116": "America/Goose_Bay", "117": "America/Grand_Turk", "118": "America/Grenada", "119": "America/Guadeloupe", "120": "America/Guatemala", "121": "America/Guayaquil", "122": "America/Guyana", "123": "America/Halifax", "124": "America/Havana", "125": "America/Hermosillo", "126": "America/Indiana/Indianapolis", "127": "America/Indiana/Knox", "128": "America/Indiana/Marengo", "129": "America/Indiana/Petersburg", "130": "America/Indiana/Tell_City", "131": "America/Indiana/Vevay", "132": "America/Indiana/Vincennes", "133": "America/Indiana/Winamac", "134": "America/Indianapolis", "135": "America/Inuvik", "136": "America/Iqaluit", "137": "America/Jamaica", "138": "America/Jujuy", "139": "America/Juneau", "140": "America/Kentucky/Louisville", "141": "America/Kentucky/Monticello", "142": "America/Knox_IN", "143": "America/Kralendijk", "144": "America/La_Paz", "145": "America/Lima", "146": "America/Los_Angeles", "147": "America/Louisville", "148": "America/Lower_Princes", "149": "America/Maceio", "150": "America/Managua", "151": "America/Manaus", "152": "America/Marigot", "153": "America/Martinique", "154": "America/Matamoros", "155": "America/Mazatlan", "156": "America/Mendoza", "157": "America/Menominee", "158": "America/Merida", "159": "America/Metlakatla", "160": "America/Mexico_City", "161": "America/Miquelon", "162": "America/Moncton", "163": "America/Monterrey", "164": "America/Montevideo", "165": "America/Montreal", "166": "America/Montserrat", "167": "America/Nassau", "168": "America/New_York", "169": "America/Nipigon", "170": "America/Nome", "171": "America/Noronha", "172": "America/North_Dakota/Beulah", "173": "America/North_Dakota/Center", "174": "America/North_Dakota/New_Salem", "175": "America/Ojinaga", "176": "America/Panama", "177": "America/Pangnirtung", "178": "America/Paramaribo", "179": "America/Phoenix", "180": "America/Port-au-Prince", "181": "America/Port_of_Spain", "182": "America/Porto_Acre", "183": "America/Porto_Velho", "184": "America/Puerto_Rico", "185": "America/Punta_Arenas", "186": "America/Rainy_River", "187": "America/Rankin_Inlet", "188": "America/Recife", "189": "America/Regina", "190": "America/Resolute", "191": "America/Rio_Branco", "192": "America/Rosario", "193": "America/Santa_Isabel", "194": "America/Santarem", "195": "America/Santiago", "196": "America/Santo_Domingo", "197": "America/Sao_Paulo", "198": "America/Scoresbysund", "199": "America/Shiprock", "200": "America/Sitka", "201": "America/St_Barthelemy", "202": "America/St_Johns", "203": "America/St_Kitts", "204": "America/St_Lucia", "205": "America/St_Thomas", "206": "America/St_Vincent", "207": "America/Swift_Current", "208": "America/Tegucigalpa", "209": "America/Thule", "210": "America/Thunder_Bay", "211": "America/Tijuana", "212": "America/Toronto", "213": "America/Tortola", "214": "America/Vancouver", "215": "America/Virgin", "216": "America/Whitehorse", "217": "America/Winnipeg", "218": "America/Yakutat", "219": "America/Yellowknife", "220": "Antarctica/Casey", "221": "Antarctica/Davis", "222": "Antarctica/DumontDUrville", "223": "Antarctica/Macquarie", "224": "Antarctica/Mawson", "225": "Antarctica/McMurdo", "226": "Antarctica/Palmer", "227": "Antarctica/Rothera", "228": "Antarctica/South_Pole", "229": "Antarctica/Syowa", "230": "Antarctica/Troll", "231": "Antarctica/Vostok", "232": "Arctic/Longyearbyen", "233": "Asia/Aden", "234": "Asia/Almaty", "235": "Asia/Amman", "236": "Asia/Anadyr", "237": "Asia/Aqtau", "238": "Asia/Aqtobe", "239": "Asia/Ashgabat", "240": "Asia/Ashkhabad", "241": "Asia/Atyrau", "242": "Asia/Baghdad", "243": "Asia/Bahrain", "244": "Asia/Baku", "245": "Asia/Bangkok", "246": "Asia/Barnaul", "247": "Asia/Beirut", "248": "Asia/Bishkek", "249": "Asia/Brunei", "250": "Asia/Calcutta", "251": "Asia/Chita", "252": "Asia/Choibalsan", "253": "Asia/Chongqing", "254": "Asia/Chungking", "255": "Asia/Colombo", "256": "Asia/Dacca", "257": "Asia/Damascus", "258": "Asia/Dhaka", "259": "Asia/Dili", "260": "Asia/Dubai", "261": "Asia/Dushanbe", "262": "Asia/Famagusta", "263": "Asia/Gaza", "264": "Asia/Harbin", "265": "Asia/Hebron", "266": "Asia/Ho_Chi_Minh", "267": "Asia/Hong_Kong", "268": "Asia/Hovd", "269": "Asia/Irkutsk", "270": "Asia/Istanbul", "271": "Asia/Jakarta", "272": "Asia/Jayapura", "273": "Asia/Jerusalem", "274": "Asia/Kabul", "275": "Asia/Kamchatka", "276": "Asia/Karachi", "277": "Asia/Kashgar", "278": "Asia/Kathmandu", "279": "Asia/Katmandu", "280": "Asia/Khandyga", "281": "Asia/Kolkata", "282": "Asia/Krasnoyarsk", "283": "Asia/Kuala_Lumpur", "284": "Asia/Kuching", "285": "Asia/Kuwait", "286": "Asia/Macao", "287": "Asia/Macau", "288": "Asia/Magadan", "289": "Asia/Makassar", "290": "Asia/Manila", "291": "Asia/Muscat", "292": "Asia/Nicosia", "293": "Asia/Novokuznetsk", "294": "Asia/Novosibirsk", "295": "Asia/Omsk", "296": "Asia/Oral", "297": "Asia/Phnom_Penh", "298": "Asia/Pontianak", "299": "Asia/Pyongyang", "300": "Asia/Qatar", "301": "Asia/Qostanay", "302": "Asia/Qyzylorda", "303": "Asia/Rangoon", "304": "Asia/Riyadh", "305": "Asia/Saigon", "306": "Asia/Sakhalin", "307": "Asia/Samarkand", "308": "Asia/Seoul", "309": "Asia/Shanghai", "310": "Asia/Singapore", "311": "Asia/Srednekolymsk", "312": "Asia/Taipei", "313": "Asia/Tashkent", "314": "Asia/Tbilisi", "315": "Asia/Tehran", "316": "Asia/Tel_Aviv", "317": "Asia/Thimbu", "318": "Asia/Thimphu", "319": "Asia/Tokyo", "320": "Asia/Tomsk", "321": "Asia/Ujung_Pandang", "322": "Asia/Ulaanbaatar", "323": "Asia/Ulan_Bator", "324": "Asia/Urumqi", "325": "Asia/Ust-Nera", "326": "Asia/Vientiane", "327": "Asia/Vladivostok", "328": "Asia/Yakutsk", "329": "Asia/Yangon", "330": "Asia/Yekaterinburg", "331": "Asia/Yerevan", "332": "Atlantic/Azores", "333": "Atlantic/Bermuda", "334": "Atlantic/Canary", "335": "Atlantic/Cape_Verde", "336": "Atlantic/Faeroe", "337": "Atlantic/Faroe", "338": "Atlantic/Jan_Mayen", "339": "Atlantic/Madeira", "340": "Atlantic/Reykjavik", "341": "Atlantic/South_Georgia", "342": "Atlantic/St_Helena", "343": "Atlantic/Stanley", "344": "Australia/ACT", "345": "Australia/Adelaide", "346": "Australia/Brisbane", "347": "Australia/Broken_Hill", "348": "Australia/Canberra", "349": "Australia/Currie", "350": "Australia/Darwin", "351": "Australia/Eucla", "352": "Australia/Hobart", "353": "Australia/LHI", "354": "Australia/Lindeman", "355": "Australia/Lord_Howe", "356": "Australia/Melbourne", "357": "Australia/NSW", "358": "Australia/North", "359": "Australia/Perth", "360": "Australia/Queensland", "361": "Australia/South", "362": "Australia/Sydney", "363": "Australia/Tasmania", "364": "Australia/Victoria", "365": "Australia/West", "366": "Australia/Yancowinna", "367": "Brazil/Acre", "368": "Brazil/DeNoronha", "369": "Brazil/East", "370": "Brazil/West", "371": "CET", "372": "CST6CDT", "373": "Canada/Atlantic", "374": "Canada/Central", "375": "Canada/Eastern", "376": "Canada/Mountain", "377": "Canada/Newfoundland", "378": "Canada/Pacific", "379": "Canada/Saskatchewan", "380": "Canada/Yukon", "381": "Chile/Continental", "382": "Chile/EasterIsland", "383": "Cuba", "384": "EET", "385": "EST", "386": "EST5EDT", "387": "Egypt", "388": "Eire", "389": "Etc/GMT", "390": "Etc/GMT+0", "391": "Etc/GMT+1", "392": "Etc/GMT+10", "393": "Etc/GMT+11", "394": "Etc/GMT+12", "395": "Etc/GMT+2", "396": "Etc/GMT+3", "397": "Etc/GMT+4", "398": "Etc/GMT+5", "399": "Etc/GMT+6", "400": "Etc/GMT+7", "401": "Etc/GMT+8", "402": "Etc/GMT+9", "403": "Etc/GMT-0", "404": "Etc/GMT-1", "405": "Etc/GMT-10", "406": "Etc/GMT-11", "407": "Etc/GMT-12", "408": "Etc/GMT-13", "409": "Etc/GMT-14", "410": "Etc/GMT-2", "411": "Etc/GMT-3", "412": "Etc/GMT-4", "413": "Etc/GMT-5", "414": "Etc/GMT-6", "415": "Etc/GMT-7", "416": "Etc/GMT-8", "417": "Etc/GMT-9", "418": "Etc/GMT0", "419": "Etc/Greenwich", "420": "Etc/UCT", "421": "Etc/UTC", "422": "Etc/Universal", "423": "Etc/Zulu", "424": "Europe/Amsterdam", "425": "Europe/Andorra", "426": "Europe/Astrakhan", "427": "Europe/Athens", "428": "Europe/Belfast", "429": "Europe/Belgrade", "430": "Europe/Berlin", "431": "Europe/Bratislava", "432": "Europe/Brussels", "433": "Europe/Bucharest", "434": "Europe/Budapest", "435": "Europe/Busingen", "436": "Europe/Chisinau", "437": "Europe/Copenhagen", "438": "Europe/Dublin", "439": "Europe/Gibraltar", "440": "Europe/Guernsey", "441": "Europe/Helsinki", "442": "Europe/Isle_of_Man", "443": "Europe/Istanbul", "444": "Europe/Jersey", "445": "Europe/Kaliningrad", "446": "Europe/Kiev", "447": "Europe/Kirov", "448": "Europe/Lisbon", "449": "Europe/Ljubljana", "450": "Europe/London", "451": "Europe/Luxembourg", "452": "Europe/Madrid", "453": "Europe/Malta", "454": "Europe/Mariehamn", "455": "Europe/Minsk", "456": "Europe/Monaco", "457": "Europe/Moscow", "458": "Europe/Nicosia", "459": "Europe/Oslo", "460": "Europe/Paris", "461": "Europe/Podgorica", "462": "Europe/Prague", "463": "Europe/Riga", "464": "Europe/Rome", "465": "Europe/Samara", "466": "Europe/San_Marino", "467": "Europe/Sarajevo", "468": "Europe/Saratov", "469": "Europe/Simferopol", "470": "Europe/Skopje", "471": "Europe/Sofia", "472": "Europe/Stockholm", "473": "Europe/Tallinn", "474": "Europe/Tirane", "475": "Europe/Tiraspol", "476": "Europe/Ulyanovsk", "477": "Europe/Uzhgorod", "478": "Europe/Vaduz", "479": "Europe/Vatican", "480": "Europe/Vienna", "481": "Europe/Vilnius", "482": "Europe/Volgograd", "483": "Europe/Warsaw", "484": "Europe/Zagreb", "485": "Europe/Zaporozhye", "486": "Europe/Zurich", "487": "GB", "488": "GB-Eire", "489": "GMT", "490": "GMT+0", "491": "GMT-0", "492": "GMT0", "493": "Greenwich", "494": "HST", "495": "Hongkong", "496": "Iceland", "497": "Indian/Antananarivo", "498": "Indian/Chagos", "499": "Indian/Christmas", "500": "Indian/Cocos", "501": "Indian/Comoro", "502": "Indian/Kerguelen", "503": "Indian/Mahe", "504": "Indian/Maldives", "505": "Indian/Mauritius", "506": "Indian/Mayotte", "507": "Indian/Reunion", "508": "Iran", "509": "Israel", "510": "Jamaica", "511": "Japan", "512": "Kwajalein", "513": "Libya", "514": "MET", "515": "MST", "516": "MST7MDT", "517": "Mexico/BajaNorte", "518": "Mexico/BajaSur", "519": "Mexico/General", "520": "NZ", "521": "NZ-CHAT", "522": "Navajo", "523": "PRC", "524": "PST8PDT", "525": "Pacific/Apia", "526": "Pacific/Auckland", "527": "Pacific/Bougainville", "528": "Pacific/Chatham", "529": "Pacific/Chuuk", "530": "Pacific/Easter", "531": "Pacific/Efate", "532": "Pacific/Enderbury", "533": "Pacific/Fakaofo", "534": "Pacific/Fiji", "535": "Pacific/Funafuti", "536": "Pacific/Galapagos", "537": "Pacific/Gambier", "538": "Pacific/Guadalcanal", "539": "Pacific/Guam", "540": "Pacific/Honolulu", "541": "Pacific/Johnston", "542": "Pacific/Kiritimati", "543": "Pacific/Kosrae", "544": "Pacific/Kwajalein", "545": "Pacific/Majuro", "546": "Pacific/Marquesas", "547": "Pacific/Midway", "548": "Pacific/Nauru", "549": "Pacific/Niue", "550": "Pacific/Norfolk", "551": "Pacific/Noumea", "552": "Pacific/Pago_Pago", "553": "Pacific/Palau", "554": "Pacific/Pitcairn", "555": "Pacific/Pohnpei", "556": "Pacific/Ponape", "557": "Pacific/Port_Moresby", "558": "Pacific/Rarotonga", "559": "Pacific/Saipan", "560": "Pacific/Samoa", "561": "Pacific/Tahiti", "562": "Pacific/Tarawa", "563": "Pacific/Tongatapu", "564": "Pacific/Truk", "565": "Pacific/Wake", "566": "Pacific/Wallis", "567": "Pacific/Yap", "568": "Poland", "569": "Portugal", "570": "ROC", "571": "ROK", "572": "Singapore", "573": "Turkey", "574": "UCT", "575": "US/Alaska", "576": "US/Aleutian", "577": "US/Arizona", "578": "US/Central", "579": "US/East-Indiana", "580": "US/Eastern", "581": "US/Hawaii", "582": "US/Indiana-Starke", "583": "US/Michigan", "584": "US/Mountain", "585": "US/Pacific", "586": "US/Samoa", "587": "UTC", "588": "Universal", "589": "W-SU", "590": "WET", "591": "Zulu"}