@@ -33,6 +33,12 @@ WundergroundClient::WundergroundClient(boolean _isMetric) {
3333  isMetric = _isMetric;
3434}
3535
36+ //  Added by fowlerk, 12/22/16, as an option to change metric setting other than at instantiation
37+ void  WundergroundClient::initMetric (boolean _isMetric) {
38+ 	isMetric = _isMetric;
39+ }
40+ //  end add fowlerk, 12/22/16
41+ 
3642void  WundergroundClient::updateConditions (String apiKey, String language, String country, String city) {
3743  isForecast = false ;
3844  doUpdate (" /api/"   + apiKey + " /conditions/lang:"   + language + " /q/"   + country + " /"   + city + " .json"  );
@@ -59,7 +65,19 @@ void WundergroundClient::updateAstronomy(String apiKey, String language, String
5965
6066//  fowlerk added
6167void  WundergroundClient::updateAlerts (String apiKey, String language, String country, String city) {
62-   isForecast = true ;
68+   currentAlert = 0 ;
69+   activeAlertsCnt = 0 ;
70+   isForecast = false ;
71+   isSimpleForecast = false ;
72+   isCurrentObservation = false ;
73+   isAlerts = true ;
74+   if  (country == " US"  ) {
75+ 	isAlertUS = true ;
76+ 	isAlertEU = false ;
77+   } else  {
78+ 	isAlertUS = false ;
79+ 	isAlertEU = true ;
80+   }
6381  doUpdate (" /api/"   + apiKey + " /alerts/lang:"   + language + " /q/"   + country + " /"   + city + " .json"  );
6482}
6583//  end fowlerk add
@@ -182,14 +200,18 @@ void WundergroundClient::value(String value) {
182200			isPM = true ;
183201		}
184202		else  isPM = false ;
185- 		sunriseTime = String (tempHour);
203+ 		char  tempHourBuff[3 ] = " "  ;						//  fowlerk add for formatting, 12/22/16
204+ 		sprintf (tempHourBuff, " %2d"  , tempHour);			//  fowlerk add for formatting, 12/22/16
205+ 		sunriseTime = String (tempHourBuff);				//  fowlerk add for formatting, 12/22/16
186206        // sunriseTime = value;
187207      }
188208	if  (currentKey == " minute"  ) {
189-     sunriseTime += " :"   + value;
190- 	if  (isPM) sunriseTime += " pm"  ;
191- 	else  if  (usePM) sunriseTime += " am"  ;
192-    }
209+ 		char  tempMinBuff[3 ] = " "  ;						//  fowlerk add for formatting, 12/22/16
210+ 		sprintf (tempMinBuff, " %02d"  , value.toInt ());	//  fowlerk add for formatting, 12/22/16
211+ 		sunriseTime += " :"   + String (tempMinBuff);		//  fowlerk add for formatting, 12/22/16
212+ 		if  (isPM) sunriseTime += " pm"  ;
213+ 		else  if  (usePM) sunriseTime += " am"  ;
214+ 	}
193215  }
194216
195217
@@ -201,14 +223,18 @@ void WundergroundClient::value(String value) {
201223			isPM = true ;
202224		}
203225		else  isPM = false ;
204- 		sunsetTime = String (tempHour);
226+ 		char  tempHourBuff[3 ] = " "  ;						//  fowlerk add for formatting, 12/22/16
227+ 		sprintf (tempHourBuff, " %2d"  , tempHour);			//  fowlerk add for formatting, 12/22/16
228+ 		sunsetTime = String (tempHourBuff);				//  fowlerk add for formatting, 12/22/16
205229       //  sunsetTime = value;
206230      }
207231	if  (currentKey == " minute"  ) {
208-     sunsetTime += " :"   + value;
209- 	if  (isPM) sunsetTime += " pm"  ;
210- 	else  if (usePM) sunsetTime += " am"  ;
211-    }
232+ 		char  tempMinBuff[3 ] = " "  ;						//  fowlerk add for formatting, 12/22/16
233+ 		sprintf (tempMinBuff, " %02d"  , value.toInt ());	//  fowlerk add for formatting, 12/22/16
234+ 		sunsetTime += " :"   + String (tempMinBuff);		//  fowlerk add for formatting, 12/22/16
235+ 		if  (isPM) sunsetTime += " pm"  ;
236+ 		else  if (usePM) sunsetTime += " am"  ;
237+     }
212238  }
213239
214240  if  (currentParent == " moonrise"  ) {      //  Has a Parent key and 2 sub-keys
@@ -219,24 +245,31 @@ void WundergroundClient::value(String value) {
219245			isPM = true ;
220246		}
221247		else  isPM = false ;
222- 		moonriseTime = String (tempHour);
248+ 		char  tempHourBuff[3 ] = " "  ;						//  fowlerk add for formatting, 12/22/16
249+ 		sprintf (tempHourBuff, " %2d"  , tempHour);			//  fowlerk add for formatting, 12/22/16
250+ 		moonriseTime = String (tempHourBuff);			//  fowlerk add for formatting, 12/22/16	
223251       //  moonriseTime = value;
224252      }
225253	if  (currentKey == " minute"  ) {
226-     moonriseTime += " :"   + value;
227- 	if  (isPM) moonriseTime += " pm"  ;
228- 	else  if  (usePM) moonriseTime += " am"  ;
229- 
230-    }
254+ 		char  tempMinBuff[3 ] = " "  ;						//  fowlerk add for formatting, 12/22/16
255+ 		sprintf (tempMinBuff, " %02d"  , value.toInt ());	//  fowlerk add for formatting, 12/22/16
256+ 		moonriseTime += " :"   + String (tempMinBuff);		//  fowlerk add for formatting, 12/22/16
257+ 		if  (isPM) moonriseTime += " pm"  ;
258+ 		else  if  (usePM) moonriseTime += " am"  ;
259+     }
231260  }
232261
233262  if  (currentParent == " moonset"  ) {      //  Not used - has a Parent key and 2 sub-keys
234263	if  (currentKey == " hour"  ) {
235-         moonsetTime = value;
236-       }
264+ 		char  tempHourBuff[3 ] = " "  ;						//  fowlerk add for formatting, 12/22/16
265+ 		sprintf (tempHourBuff, " %2d"  , value.toInt ());	//  fowlerk add for formatting, 12/22/16
266+ 		moonsetTime = String (tempHourBuff);				//  fowlerk add for formatting, 12/22/16	
267+     }
237268	if  (currentKey == " minute"  ) {
238-     moonsetTime += " :"   + value;
239-    }
269+ 		char  tempMinBuff[3 ] = " "  ;						//  fowlerk add for formatting, 12/22/16
270+ 		sprintf (tempMinBuff, " %02d"  , value.toInt ());	//  fowlerk add for formatting, 12/22/16
271+ 		moonsetTime += " :"   + String (tempMinBuff);		//  fowlerk add for formatting, 12/22/16
272+     }
240273  }
241274
242275  if  (currentKey == " wind_mph"  ) {
@@ -299,6 +332,70 @@ void WundergroundClient::value(String value) {
299332    UV = value;
300333  }
301334
335+   //  Active alerts...added 18-Dec-2016
336+   if  (currentKey == " type"   && isAlerts) {
337+ 	activeAlertsCnt++;
338+ 	currentAlert++;
339+ 	activeAlerts[currentAlert-1 ] = value;
340+ 	Serial.print (" Alert type processed, value:  "  ); Serial.println (activeAlerts[currentAlert-1 ]);
341+   }
342+   if  (currentKey == " description"   && isAlerts && isAlertUS) {
343+     activeAlertsText[currentAlert-1 ] = value;
344+ 	Serial.print (" Alert description processed, value:  "  ); Serial.println (activeAlertsText[currentAlert-1 ]);
345+   }
346+   if  (currentKey == " wtype_meteoalarm_name"   && isAlerts && isAlertEU) {
347+     activeAlertsText[currentAlert-1 ] = value;
348+ 	Serial.print (" Alert description processed, value:  "  ); Serial.println (activeAlertsText[currentAlert-1 ]);
349+   }
350+   if  (currentKey == " message"   && isAlerts) {
351+     activeAlertsMessage[currentAlert-1 ] = value;
352+ 	Serial.print (" Alert msg length:  "  ); Serial.println (activeAlertsMessage[currentAlert-1 ].length ());
353+ 	if (activeAlertsMessage[currentAlert-1 ].length () >= 511 ) {
354+ 		activeAlertsMessageTrunc[currentAlert-1 ] = true ;
355+ 	} else  {
356+ 		activeAlertsMessageTrunc[currentAlert-1 ] = false ;
357+ 	}
358+ 	Serial.print (" Alert message processed, value:  "  ); Serial.println (activeAlertsMessage[currentAlert-1 ]);
359+   }
360+   if  (currentKey == " date"   && isAlerts) {
361+ 	activeAlertsStart[currentAlert-1 ] = value;
362+ 	//  Check last char for a "/"; the returned value sometimes includes this; if so, strip it (47 is a "/" char)
363+ 	if  (activeAlertsStart[currentAlert-1 ].charAt (activeAlertsStart[currentAlert-1 ].length ()-1 ) == 47 ) {
364+ 		Serial.println (" ...last char is a slash..."  );
365+ 		activeAlertsStart[currentAlert-1 ] = activeAlertsStart[currentAlert-1 ].substring (0 ,(activeAlertsStart[currentAlert-1 ].length ()-1 ));
366+ 	}
367+ 	//  For meteoalarms, the start field is returned with the UTC=0 by default (not used?)
368+ 	if  (isAlertEU && activeAlertsStart[currentAlert-1 ] == " 1970-01-01 00:00:00 GMT"  ) {
369+ 		activeAlertsStart[currentAlert-1 ] = " <Not specified>"  ;
370+ 	}
371+ 	Serial.print (" Alert start processed, value:  "  ); Serial.println (activeAlertsStart[currentAlert-1 ]);
372+   }
373+   if  (currentKey == " expires"   && isAlerts) {
374+     activeAlertsEnd[currentAlert-1 ] = value;
375+ 	Serial.print (" Alert expiration processed, value:  "  ); Serial.println (activeAlertsEnd[currentAlert-1 ]);
376+   }
377+   if  (currentKey == " phenomena"   && isAlerts) {
378+     activeAlertsPhenomena[currentAlert-1 ] = value;
379+ 	Serial.print (" Alert phenomena processed, value:  "  ); Serial.println (activeAlertsPhenomena[currentAlert-1 ]);
380+   }
381+   if  (currentKey == " significance"   && isAlerts && isAlertUS) {
382+     activeAlertsSignificance[currentAlert-1 ] = value;
383+ 	Serial.print (" Alert significance processed, value:  "  ); Serial.println (activeAlertsSignificance[currentAlert-1 ]);
384+   }
385+   //  Map meteoalarm level to the field for significance for consistency (used for European alerts)
386+   if  (currentKey == " level_meteoalarm"   && isAlerts && isAlertEU) {
387+     activeAlertsSignificance[currentAlert-1 ] = value;
388+ 	Serial.print (" Meteo alert significance processed, value:  "  ); Serial.println (activeAlertsSignificance[currentAlert-1 ]);
389+   }
390+   //  For meteoalarms only (European alerts); attribution must be displayed according to the T&C's of use
391+   if  (currentKey == " attribution"   && isAlerts) {
392+ 	activeAlertsAttribution[currentAlert-1 ] = value;
393+ 	//  Remove some of the markup in the attribution
394+ 	activeAlertsAttribution[currentAlert-1 ].replace ("  <a href='"  ,"  "  );
395+ 	activeAlertsAttribution[currentAlert-1 ].replace (" </a>"  ," "  );
396+ 	activeAlertsAttribution[currentAlert-1 ].replace (" /'>"  ,"  "  );
397+   }
398+   
302399  //  end fowlerk add
303400
304401  if  (currentKey == " dewpoint_f"   && !isMetric) {
@@ -327,11 +424,21 @@ void WundergroundClient::value(String value) {
327424  }
328425
329426  //  Added forecastText key following...fowlerk, 12/3/16
330-   if  (currentKey == " fcttext"   && isForecast && currentForecastPeriod < MAX_FORECAST_PERIODS) {
427+   if  (currentKey == " fcttext"   && isForecast && !isMetric && currentForecastPeriod < MAX_FORECAST_PERIODS) {
428+       forecastText[currentForecastPeriod] = value;
429+   }
430+   //  Added option for metric forecast following...fowlerk, 12/22/16
431+   if  (currentKey == " fcttext_metric"   && isForecast && isMetric && currentForecastPeriod < MAX_FORECAST_PERIODS) {
331432      forecastText[currentForecastPeriod] = value;
332433  }
333434  //  end fowlerk add, 12/3/16
334435
436+   //  Added PoP (probability of precipitation) key following...fowlerk, 12/22/16
437+   if  (currentKey == " pop"   && isForecast && currentForecastPeriod < MAX_FORECAST_PERIODS) {
438+       PoP[currentForecastPeriod] = value;
439+   }
440+   //  end fowlerk add, 12/22/16
441+   
335442  //  The detailed forecast period has only one forecast per day with low/high for both
336443  //  night and day, starting at index 1.
337444  int  dailyForecastPeriod = (currentForecastPeriod - 1 ) * 2 ;
@@ -513,6 +620,48 @@ String WundergroundClient::getUV() {
513620String WundergroundClient::getObservationTime () {
514621  return  observationTime;
515622}
623+ 
624+ //  Active alerts...added 18-Dec-2016
625+ String WundergroundClient::getActiveAlerts (int  alertIndex) {
626+   return  activeAlerts[alertIndex];
627+ }
628+ 
629+ String WundergroundClient::getActiveAlertsText (int  alertIndex) {
630+   return  activeAlertsText[alertIndex];
631+ }
632+ 
633+ String WundergroundClient::getActiveAlertsMessage (int  alertIndex) {
634+   return  activeAlertsMessage[alertIndex];
635+ }
636+ 
637+ bool  WundergroundClient::getActiveAlertsMessageTrunc (int  alertIndex) {
638+   return  activeAlertsMessageTrunc[alertIndex];
639+ }
640+ 
641+ String WundergroundClient::getActiveAlertsStart (int  alertIndex) {
642+   return  activeAlertsStart[alertIndex];
643+ }
644+ 
645+ String WundergroundClient::getActiveAlertsEnd (int  alertIndex) {
646+   return  activeAlertsEnd[alertIndex];
647+ }
648+ 
649+ String WundergroundClient::getActiveAlertsPhenomena (int  alertIndex) {
650+   return  activeAlertsPhenomena[alertIndex];
651+ }
652+ 
653+ String WundergroundClient::getActiveAlertsSignificance (int  alertIndex) {
654+   return  activeAlertsSignificance[alertIndex];
655+ }
656+ 
657+ String WundergroundClient::getActiveAlertsAttribution (int  alertIndex) {
658+   return  activeAlertsAttribution[alertIndex];
659+ }
660+ 
661+ int  WundergroundClient::getActiveAlertsCnt () {
662+   return  activeAlertsCnt;
663+ }
664+ 
516665//  end fowlerk add
517666
518667
@@ -555,9 +704,14 @@ String WundergroundClient::getForecastMonth(int period) {
555704}
556705
557706String WundergroundClient::getForecastText (int  period) {
558-   Serial.print (" Forecast period:  "  ); Serial.println (period);	
707+ //   Serial.print("Forecast period:  "); Serial.println(period);	
559708  return  forecastText[period];
560709}
710+ 
711+ //  Added PoP...12/22/16
712+ String WundergroundClient::getPoP (int  period) {
713+   return  PoP[period];
714+ }
561715//  end fowlerk add
562716
563717
@@ -603,4 +757,4 @@ String WundergroundClient::getMeteoconIcon(String iconText) {
603757  if  (iconText == " nt_tstorms"  ) return  " &"  ;
604758
605759  return  " )"  ;
606- }
760+ }
0 commit comments