mirror of
https://github.com/Crocmagnon/display-epaper.git
synced 2025-01-11 05:32:34 +01:00
show next rain time & proba
This commit is contained in:
parent
c216cfb46d
commit
4c23ecb1ff
1 changed files with 44 additions and 8 deletions
52
img.go
52
img.go
|
@ -186,10 +186,13 @@ func drawWeather(ctx context.Context, gc *draw2dimg.GraphicContext, wthr *weathe
|
||||||
text(gc, "max "+formatTemp(daily.Temp.Max), fontSize, xAlign, 95, fonts.Regular)
|
text(gc, "max "+formatTemp(daily.Temp.Max), fontSize, xAlign, 95, fonts.Regular)
|
||||||
text(gc, fmt.Sprintf("pluie %v%%", formatPct(daily.Pop)), fontSize, xAlign, 125, fonts.Regular)
|
text(gc, fmt.Sprintf("pluie %v%%", formatPct(daily.Pop)), fontSize, xAlign, 125, fonts.Regular)
|
||||||
|
|
||||||
nextRainTime, nextRainProba := findNextRain(wthr.Hourly) // limit search to next 12 hours
|
nextRainStart, nextRainEnd, probas := findNextRain(wthr.Hourly)
|
||||||
if nextRainProba > 0 {
|
avg, maxProba := averageAndMax(probas)
|
||||||
text(gc, "\uE06C", 14, xAlign, 155, fonts.Icons)
|
if len(probas) > 0 {
|
||||||
text(gc, fmt.Sprintf("%v (%v%%)", nextRainTime.Format("15h"), formatPct(nextRainProba)), 14, xAlign+fonts.IconXOffset, 155, fonts.Regular)
|
text(gc, "\uE1B4", 14, xAlign, 155+fonts.IconYOffset, fonts.Icons)
|
||||||
|
text(gc, fmt.Sprintf("%v-%v %v%% %v%%", nextRainStart.Format("15h"), nextRainEnd.Format("15h"), formatPct(avg), formatPct(maxProba)), 14, xAlign+20, 155, fonts.Regular)
|
||||||
|
text(gc, "\uEDAA", 14, xAlign+95, 155+fonts.IconYOffset, fonts.Icons)
|
||||||
|
text(gc, "\uE4AE", 14, xAlign+155, 155+fonts.IconYOffset, fonts.Icons)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,19 +200,52 @@ func formatPct(pct float64) int {
|
||||||
return int(math.Round(pct * 100))
|
return int(math.Round(pct * 100))
|
||||||
}
|
}
|
||||||
|
|
||||||
// return next timestamp & pop where pop > 0
|
func findNextRain(hourly []weather.Hourly) (time.Time, time.Time, []float64) {
|
||||||
func findNextRain(hourly []weather.Hourly) (time.Time, float64) {
|
|
||||||
if len(hourly) > 12 {
|
if len(hourly) > 12 {
|
||||||
hourly = hourly[:12]
|
hourly = hourly[:12]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
start, end time.Time
|
||||||
|
probas []float64
|
||||||
|
)
|
||||||
|
|
||||||
for _, h := range hourly {
|
for _, h := range hourly {
|
||||||
|
if h.Pop == 0 && start != (time.Time{}) {
|
||||||
|
end = hourlyToTime(h)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
if h.Pop > 0 {
|
if h.Pop > 0 {
|
||||||
return time.Unix(int64(h.Dt), 0), h.Pop
|
if start == (time.Time{}) {
|
||||||
|
start = hourlyToTime(h)
|
||||||
|
}
|
||||||
|
|
||||||
|
probas = append(probas, h.Pop)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return time.Time{}, 0
|
return start, end, probas
|
||||||
|
}
|
||||||
|
|
||||||
|
func averageAndMax(probas []float64) (avg float64, max float64) {
|
||||||
|
if len(probas) == 0 {
|
||||||
|
return 0, 0
|
||||||
|
}
|
||||||
|
|
||||||
|
var sum float64
|
||||||
|
for _, proba := range probas {
|
||||||
|
sum += proba
|
||||||
|
if proba > max {
|
||||||
|
max = proba
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sum / float64(len(probas)), max
|
||||||
|
}
|
||||||
|
|
||||||
|
func hourlyToTime(h weather.Hourly) time.Time {
|
||||||
|
return time.Unix(int64(h.Dt), 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func drawWeatherIcon(gc *draw2dimg.GraphicContext, dailyWeather weather.Weather) error {
|
func drawWeatherIcon(gc *draw2dimg.GraphicContext, dailyWeather weather.Weather) error {
|
||||||
|
|
Loading…
Reference in a new issue