mirror of
https://github.com/Crocmagnon/display-epaper.git
synced 2025-01-30 23:02:16 +01:00
display next rain
This commit is contained in:
parent
1668044183
commit
c216cfb46d
2 changed files with 63 additions and 12 deletions
50
img.go
50
img.go
|
@ -159,27 +159,57 @@ func drawWeather(ctx context.Context, gc *draw2dimg.GraphicContext, wthr *weathe
|
||||||
|
|
||||||
dailyLen := len(wthr.Daily)
|
dailyLen := len(wthr.Daily)
|
||||||
dailyWeatherLen := len(wthr.Daily[0].Weather)
|
dailyWeatherLen := len(wthr.Daily[0].Weather)
|
||||||
if dailyLen == 0 || dailyWeatherLen == 0 {
|
currentWeatherLen := len(wthr.Current.Weather)
|
||||||
slog.ErrorContext(ctx, "missing daily or daily weather", "daily_len", dailyLen, "daily_weather_len", dailyWeatherLen)
|
if dailyLen == 0 || dailyWeatherLen == 0 || currentWeatherLen == 0 {
|
||||||
|
slog.ErrorContext(ctx, "missing daily or daily weather or current weather", "daily_len", dailyLen, "daily_weather_len", dailyWeatherLen, "current_weather_len", currentWeatherLen)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
daily := wthr.Daily[0]
|
current := wthr.Current
|
||||||
dailyWeather := daily.Weather[0]
|
currentWeather := current.Weather[0]
|
||||||
err := drawWeatherIcon(gc, wthr.Current.Weather[0])
|
err := drawWeatherIcon(gc, currentWeather)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.ErrorContext(ctx, "Failed to draw weather icon", "err", err)
|
slog.ErrorContext(ctx, "Failed to draw weather icon", "err", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
text(gc, formatTemp(wthr.Current.Temp), 23, leftX, 125, fonts.Regular)
|
text(gc, formatTemp(current.Temp), 23, leftX, 125, fonts.Regular)
|
||||||
|
text(gc, fmt.Sprintf("(%v)", formatTemp(current.FeelsLike)), 15, leftX+5, 150, fonts.Regular)
|
||||||
|
|
||||||
const xAlign = 120
|
daily := wthr.Daily[0]
|
||||||
|
dailyWeather := daily.Weather[0]
|
||||||
|
|
||||||
|
const xAlign = 140
|
||||||
const fontSize = 18
|
const fontSize = 18
|
||||||
|
|
||||||
text(gc, "journée", fontSize, xAlign, 35, fonts.Bold)
|
text(gc, "journée", fontSize, xAlign, 35, fonts.Bold)
|
||||||
text(gc, "max "+formatTemp(daily.Temp.Max), fontSize, xAlign, 65, fonts.Regular)
|
text(gc, dailyWeather.Description, fontSize, xAlign, 65, fonts.Regular)
|
||||||
text(gc, fmt.Sprintf("pluie %v%%", int(math.Round(daily.Pop*100))), fontSize, xAlign, 95, fonts.Regular)
|
text(gc, "max "+formatTemp(daily.Temp.Max), fontSize, xAlign, 95, fonts.Regular)
|
||||||
text(gc, dailyWeather.Description, 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
|
||||||
|
if nextRainProba > 0 {
|
||||||
|
text(gc, "\uE06C", 14, xAlign, 155, fonts.Icons)
|
||||||
|
text(gc, fmt.Sprintf("%v (%v%%)", nextRainTime.Format("15h"), formatPct(nextRainProba)), 14, xAlign+fonts.IconXOffset, 155, fonts.Regular)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func formatPct(pct float64) int {
|
||||||
|
return int(math.Round(pct * 100))
|
||||||
|
}
|
||||||
|
|
||||||
|
// return next timestamp & pop where pop > 0
|
||||||
|
func findNextRain(hourly []weather.Hourly) (time.Time, float64) {
|
||||||
|
if len(hourly) > 12 {
|
||||||
|
hourly = hourly[:12]
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, h := range hourly {
|
||||||
|
if h.Pop > 0 {
|
||||||
|
return time.Unix(int64(h.Dt), 0), h.Pop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return time.Time{}, 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func drawWeatherIcon(gc *draw2dimg.GraphicContext, dailyWeather weather.Weather) error {
|
func drawWeatherIcon(gc *draw2dimg.GraphicContext, dailyWeather weather.Weather) error {
|
||||||
|
|
|
@ -55,8 +55,12 @@ type Prevision struct {
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
Icon string `json:"icon"`
|
Icon string `json:"icon"`
|
||||||
} `json:"weather"`
|
} `json:"weather"`
|
||||||
|
Rain struct {
|
||||||
|
OneHour float64 `json:"1h"`
|
||||||
|
} `json:"rain"`
|
||||||
} `json:"current"`
|
} `json:"current"`
|
||||||
Daily []Daily `json:"daily"`
|
Daily []Daily `json:"daily"`
|
||||||
|
Hourly []Hourly `json:"hourly"`
|
||||||
Alerts []struct {
|
Alerts []struct {
|
||||||
SenderName string `json:"sender_name"`
|
SenderName string `json:"sender_name"`
|
||||||
Event string `json:"event"`
|
Event string `json:"event"`
|
||||||
|
@ -150,6 +154,23 @@ type Weather struct {
|
||||||
Icon string `json:"icon"`
|
Icon string `json:"icon"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Hourly struct {
|
||||||
|
Dt int `json:"dt"`
|
||||||
|
Temp float64 `json:"temp"`
|
||||||
|
FeelsLike float64 `json:"feels_like"`
|
||||||
|
Pressure int `json:"pressure"`
|
||||||
|
Humidity int `json:"humidity"`
|
||||||
|
DewPoint float64 `json:"dew_point"`
|
||||||
|
Uvi float64 `json:"uvi"`
|
||||||
|
Clouds int `json:"clouds"`
|
||||||
|
Visibility int `json:"visibility"`
|
||||||
|
WindSpeed float64 `json:"wind_speed"`
|
||||||
|
WindDeg int `json:"wind_deg"`
|
||||||
|
WindGust float64 `json:"wind_gust"`
|
||||||
|
Weather []Weather `json:"weather"`
|
||||||
|
Pop float64 `json:"pop"`
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Client) GetWeather(ctx context.Context) (res *Prevision, err error) {
|
func (c *Client) GetWeather(ctx context.Context) (res *Prevision, err error) {
|
||||||
if val, err := loadFromDisk(c.config.CacheLocation); nil == err {
|
if val, err := loadFromDisk(c.config.CacheLocation); nil == err {
|
||||||
slog.InfoContext(ctx, "found weather in cache")
|
slog.InfoContext(ctx, "found weather in cache")
|
||||||
|
@ -165,7 +186,7 @@ func (c *Client) GetWeather(ctx context.Context) (res *Prevision, err error) {
|
||||||
Param("appid", c.config.APIKey).
|
Param("appid", c.config.APIKey).
|
||||||
Param("units", "metric").
|
Param("units", "metric").
|
||||||
Param("lang", "fr").
|
Param("lang", "fr").
|
||||||
Param("exclude", "minutely,hourly").
|
Param("exclude", "minutely").
|
||||||
ToJSON(&res).
|
ToJSON(&res).
|
||||||
Fetch(ctx)
|
Fetch(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Add table
Reference in a new issue