All checks were successful
		
		
	
	Build and Publish / release (push) Successful in 3m7s
				
			
		
			
				
	
	
		
			52 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package weather
 | |
| 
 | |
| import "math"
 | |
| 
 | |
| // Attempts to complete missing fields that may not
 | |
| // be set by a specific provider, such as DewPoint and WindChill
 | |
| func (u *WeatherUpdate) Enrich() {
 | |
| 	if u == nil {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	if u.WindChillF == 0 {
 | |
| 		u.WindChillF = CalculateWindChill(u.TempOutdoorF, u.WindSpeedMPH)
 | |
| 	}
 | |
| 
 | |
| 	if u.DewPointF == 0 && (u.TempOutdoorF != 0 && u.HumidityOudoor != 0) {
 | |
| 		u.DewPointF = CalculateDewPoint(u.TempOutdoorF, float64(u.HumidityOudoor))
 | |
| 	}
 | |
| 
 | |
| 	if u.BaromAbsoluteIn == 0 {
 | |
| 		u.BaromAbsoluteIn = u.BaromRelativeIn
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func CalculateDewPoint(tempF, humidity float64) float64 {
 | |
| 	// Convert temperature from Fahrenheit to Celsius
 | |
| 	tempC := (tempF - 32) * 5 / 9
 | |
| 
 | |
| 	// Calculate the dew point using the Magnus-Tetens approximation
 | |
| 	a := float64(17.27)
 | |
| 	b := float64(237.7)
 | |
| 
 | |
| 	alpha := (a*tempC)/(b+tempC) + math.Log(humidity/100)
 | |
| 	dewPointC := (b * alpha) / (a - alpha)
 | |
| 
 | |
| 	// Convert dew point back to Fahrenheit
 | |
| 	dewPointF := (dewPointC * 9 / 5) + 32
 | |
| 	return dewPointF
 | |
| }
 | |
| 
 | |
| func CalculateWindChill(tempF float64, windSpeedMPH float64) float64 {
 | |
| 	if windSpeedMPH <= 3 {
 | |
| 		// Wind chill calculation doesn't apply for very low wind speeds
 | |
| 		return tempF
 | |
| 	}
 | |
| 
 | |
| 	// Formula for calculating wind chill
 | |
| 	return 35.74 + 0.6215*tempF -
 | |
| 		35.75*math.Pow(windSpeedMPH, 0.16) +
 | |
| 		0.4275*tempF*math.Pow(windSpeedMPH, 0.16)
 | |
| }
 |