From 567f7517f92dae0bbcd60491b766cddd9a82dab6 Mon Sep 17 00:00:00 2001 From: Gabriel Augendre Date: Sun, 15 Sep 2024 23:25:17 +0200 Subject: [PATCH] display weather & resize --- epd/epd.go | 2 +- icons/01d.png | Bin 0 -> 945 bytes icons/02d.png | Bin 0 -> 1666 bytes icons/03d.png | Bin 0 -> 837 bytes icons/04d.png | Bin 0 -> 1869 bytes icons/09d.png | Bin 0 -> 2697 bytes icons/10d.png | Bin 0 -> 2584 bytes icons/11d.png | Bin 0 -> 2844 bytes icons/13d.png | Bin 0 -> 1703 bytes icons/50d.png | Bin 0 -> 650 bytes img.go | 152 ++++++++++++++++++++++++++++++++++---------- main.go | 7 +- run_darwin_arm64.go | 12 ++-- run_linux_arm64.go | 13 +++- weather/weather.go | 122 +++++++++++++++++++++++++++++++++++ 15 files changed, 266 insertions(+), 42 deletions(-) create mode 100644 icons/01d.png create mode 100644 icons/02d.png create mode 100644 icons/03d.png create mode 100644 icons/04d.png create mode 100644 icons/09d.png create mode 100644 icons/10d.png create mode 100644 icons/11d.png create mode 100644 icons/13d.png create mode 100644 icons/50d.png create mode 100644 weather/weather.go diff --git a/epd/epd.go b/epd/epd.go index 9472624..9d7670d 100644 --- a/epd/epd.go +++ b/epd/epd.go @@ -317,5 +317,5 @@ func (e *EPD) sendImg(img image.Image) { } func isdark(r, g, b, _ uint32) bool { - return r < 255 || g < 255 || b < 255 + return r < 65535 || g < 65535 || b < 65535 } diff --git a/icons/01d.png b/icons/01d.png new file mode 100644 index 0000000000000000000000000000000000000000..85efa16b13f4a9555e895d290ff14721a9ff1dff GIT binary patch literal 945 zcmeAS@N?(olHy`uVBq!ia0vp^DIm?ZnwBHJP2x_#6c?paQ-fS~2He>>nLAap@S&IIG)Jdzrq(+*Om~TNa=LhO zq2e*?d(Z#;e}3|PaQ zEk!Qb$YrQo_AmCo)4FroBxgnT*K-*wU-QiQdZ)Hhe3PYIOz|br9SmDONK8&wyxiE@ z_mfwWW6f8NZ(2)qH=Nbn9i(kjwluCar*r9(bAS4eEuO%4z^DCAz2LbW%c9t-L^fSi z+$0Jt@Vq}#odp0>m6`eZSdMjE&PM6rB;s7^ZYg3D^1U7pUPR??RwhjR)o9) zcZhKQZT0lX6ElR)2K?(gx%>8}2@l&MHF-91Y}8pYKQWAJu8xxq_shH)Q=L?~wO6G@ zdRQM`BN7$W5+U~KsKM$jI@~8qTfM_{>OJ3kefXVmBE4JSw9`DPw51=eDIM7~!5V1R z9*|j276HxL4l>I!X~xt;iC|?%uRc%xVyO4T``oXP5`Rzbo2+{_a%|E&@+5cu0lU=- zubtK%c{(fg6Q{@j7a>myzwS8z^x(t7*6Cr1a;HnRuAxQVgbT$a^#4IYZIRqr2t9m&TNx;=eA*tfSBHUuAjb z)q->OHg!eKOW%I%T$#Pk{-62Iv&HSVMOHu7I_TZGS?>7jp2`D@k3@=|E`8`&VN}jx zz`P^+!?we*w^JSR6Pyp;UKjN)JGcDkb(4geKerysZ~JT(_o9{gTjQB?uj+!P9X-GM zadzh3{!A&6>E&&qU)MhR-g@5cr$E2E{-Z6gKUzf3%;i+V1pnC|X!Dtsm}T9n6#`~O N22WQ%mvv4FO#qL;wORlG literal 0 HcmV?d00001 diff --git a/icons/02d.png b/icons/02d.png new file mode 100644 index 0000000000000000000000000000000000000000..288a40ea0fa34005bd83cce484c6639ac53f6baa GIT binary patch literal 1666 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 E0C6^bEC2ui literal 0 HcmV?d00001 diff --git a/icons/04d.png b/icons/04d.png new file mode 100644 index 0000000000000000000000000000000000000000..9c64ea86b6a93c7fd61543c696956b0657454fe9 GIT binary patch literal 1869 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 D(B1}6 literal 0 HcmV?d00001 diff --git a/icons/10d.png b/icons/10d.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e5d101266c3a54b4893e8e38e3c0014f3fdfa2 GIT binary patch literal 2584 zcmaKuc{me}AIGO5b8v_l*R z1Wy{2KE~S!f3P#jEW0VnBCCoQOUhum{DyLYVgS+S;FmX8<+HSmm%fk@7#|p+P8fF? zgsDf4$OPudM>833L-kZmQ|~d0VyCs3FJjl4mUKB-Puzz~@c(bD`xy=Yo}QSP2+Iz( z7xncI^O#E#z~f_PtCys;80P`10BvqpwM6~HX&t~H;H)Cx*NMF)#>C|DwC?RSsdNYX z<@|R-q+LMYs(#i5Kr0Em!=-K_o7kxOrm3(jHN2C3RsnF*T1ZM*mE|WZoGPJr=5c}u zk4iqF7n6cwb@4 z@`dK7W-!>J1xSi4ag}NGwGfTkyQD-G#rgT~l&Oh>8mhOA+SnWr5Dj|iE3Ym)zEZnJ z%N$&l#prXdaj+*8L&*0z>75M!jVKUuY#}FIWM|VGr>_f~l}{`q!W^DTKQJh!E#?0C zxti5E{p1`LtCVl*xTzyzvs>|pLM-=a*Pho@81hx^|^NqSe>1;=*a$FLWlxr{pcM%MO7l=NDx?YTP`#Y!X! z*Llx<;-t?8`3>0-%wLQld?m*{Gnl_na1D@qg3mxfk2@W1eDa#}$GHf4jE9t}z>yK1 zw?vC9f?a!`-YE6FeLDCTDzUE%n~7Vy7OTY3QS3VWy+%kkP9rp+zCQe8*aBB2fhwf! z%WqoCjY5t1Nmf;9PNxT|bQ2vptVV@erlBCSqQ_5t1l_*=c-{eps<|E&ghvrt3fTaH zbuclUuTED}N+9`{bvbRz5ih*P;YOJquzfbeG{*3)Kb8Mf7G_S%J&qA3&*&u{-uGh* zdvU~MoO_j$u9Ioz(JiC!fHE0WxAclg9du5;X@GyzX)B0LkviS7H>`qb3pQ;|PJo{h zv&lr}hU*QU!4~I=kbLU-O@I;hPp+$k)cN+!q_?!(0)fGE+r|kN#w{-YhB=cd69`U= za35BOoL2@N^CvG!B~aiG+TCs{#)^YsRuhq$9cmZ$@0 z2Ut20B}K69%w4xmydOl=@!>>)Lq0d`nR!Dh?43}nd(^Dox5Svnv}A&RHYMfxaa=Q?Tri0!O22Hh?V++ zZDF<@0ToQ|!fU0YrZ3)EX3+XC9La~d_LyxgX{7%%uQE&25I6`{MJ-Ba%z)E`Xm9p69?3q ziB999p9e_WFARBPgTZO*^CK2+^QD=8e}BbS+p%{ht%II;ZpaXk;!ZiJUk#c6VYN32 zG*z~%epTK_)rNX#Ub)?xWRsx9^Rlg|sY3KUk5nq(=QCT2wX~I;sylG%&Z-(awkNdd z&$T-b+UIgb3JP*yV!VC%I_JnhTS+aT!k@`~C6Ld|JHB%||W z8XtWsriSU548~$0^xoG(& zmh$Ed^+w~Ih4DMO;spiIYqrN_@_r{@n%&C$ZE_rcK-8BU8UU-SBq5>U#O!`EGst8u zm?>TXH@l~Uu3%rRG3np19A$3FjP%}xakeJtCaUibf-_2JzS8Y6-2J!rY~oo+T=Beb zjtA@TF|k^c2Mu#iR+ZvuQG0RA_B%iB@Kd`oQqS=e@#OcdM-x9r&7Bx1ge8}sxpcSb zZO(KQx19V>OrECrqBr0Si?(<|-bWbYsGfD>>~cXRkLJsk&9=GT&Tq7Db#i(`{uS2Z|LH;)F@};v$14EW@=?R|F#LfTG>y(Z~iiy4=3$ zejMM7Sn+5VbKNWtg-oCM6%PsdP6*a(xTBEF^@wL!1x?|$aK0!r$!#z+v>rsiE_&eF zHw7Zb2qnq^bj?uToX(Ef=WxdSo5m(}uvnP^kdu>UsUz(#YAE5Oih`0iu2WKzAbkhiGH1TJfD_G0N zn}v^o(C6UZoHopR`$|bgMMa#^vLbugoXdU_IzhKg>m5Lpwkj-Vjcyi>*~7EoKQTIK q9eQ4|{C?@u|3{hrt5X4hL-Ds+h8Bvjpyz*$4}iR8ZdhsHn)DxmH|971 literal 0 HcmV?d00001 diff --git a/icons/11d.png b/icons/11d.png new file mode 100644 index 0000000000000000000000000000000000000000..4a885cfa9e79bc113e3d2dc7c7ad7d425e97e1fc GIT binary patch literal 2844 zcmV+%3*+>OP)n5 z+o=j#Q99aKYSoGwt&TccS`-GY1qB64AS8i+B%6@u-rM=^o=sL*0-HU%n=t1$lS%gO z?%8wif6wfEU46dC>-FBz+}w=MmvCHilb)&TVJHc*K-u*bz)YYL7zGrm-<6hS z&Ft#xeDaJl&e(R>U3X6H?d_$pu`y9mz5`@NJuU`H5<`$sLqkJDBBF@k1;E+Bt7D^WZiB!+%Lh0d2KpXFC8^iCDUeNX2}4|sm5`kE_qlk7Q)cUENHq2jwThBXIt7^nR1fyea^Y>;c14*! zeL9O4Ep$y+68U2?2ak|0K?;H8i4GDGMY!UM%c-cSprs{gb+yZZlae)fgmejVi_{8r z3?!n+D#^{weYXB zSIL0`Uy+fKf#2`Pacos?@ljS*>PBRd_r%F|o%4=Gx&%2>=U@@jRarS6pD%+02ljLG z%{MWA{ApxmWx3C_wgy?ZZXIjZyh>(fCS_%1NFEahVhcyBDC|r1SUc(150Q$icJC`8 zuL!epfmOVmK(_Y4o9UG4*9Z@-n6w+Q-xzl_7V<)~Jk`6)6 z0zT34xzUJ^kd;taSmYiJ23y@@5q~1j1p)y#XK89`WX_yxX=yp=t`zYz2_SnbKSh%u z>2T^hfP}6$=lbJsKyX@V&SI0;HMy>pWNwy%;Q|E!R@FAd<Y&z)z-c?r~+9ux>m?F!%YlgG~ES*LHBV%K_N?) zJjlL%&1~4Pf%5Y5fwFn2y<9ED03CDEm52O5(>Q5GR*PixQc@8ffBaEOOH0|aXODY4 z2LA-Len_?#M+8=NJ&esTzsj|<>wbLZ{Cd?7A{=$QC3z~ps1+G6AFcT zRTIP}wHL1yU4rN_S5o$ns%`Gk_pY4wHjoN!>~E}A+S=N<^2#e4eZGvF7caiYjm%0) zO5!cs$AvDZ{&@l|o&9)y5Xi)S=SA$gFR^lzFfz;TE*v|A?~>~vzX-Y#E(#tK@h9Qr zF>}nPpMKgffBpj3;mcOBh;ukY>2`#z2@B%bSlQXw^*iZVem8V=LRL=rIgb~oejDBy zv$1k>b=97ZiTISRt}a;-Z0J0c_>7Me)pFD>KBcOviYK33L2+>r_4V~S z+E|Z3mmtzb-ZtoW%SKX84)&H$2)+3{)~J)*71Q_hS55e?_zBjiQk-BgCH^CdPRp`3 zi7>LyGHKEzYHFTyi;|l+f7X}F=t9?-^{P9Q28SoyaTt1k4IBzWK<$)@scP7XXUYtG zm(0PDvbm!r+>ZxY{aq-ZBBDqK{;E|^yP5vhtzS@Ax6AFE)Pc?|+<@Be7#Y`_#dqWv zVmH;(v-rC3i~`x=u(!Jtr@0aT-7E2&c{YyZ2dP~hs5aMEqYua?m?V!vP0jPX|NaMV zGsV)S4<-Czy7$z_s*R}QziM8e>&$x|T}s;)X12}C#cg0xZ)Ftd4Twhf@d~h@|P|2h0$6HqT_BvgWUotkR)~Z{Q zrB(F$0bi-Q)kE*T1Z^!)II7=Ah##>$^enprN1`g}KHR+x->nbetDcRc8X1y=^zqI; zo}onuorz+y+km9ba~^Q15-IFo{<#MC3ZP3#VK0ow!r*`ToB6V4o8x~q&NeV`M-Cy+c%flYu9%*K_{8_GJccUwR zW~}#~5Tr&BiK?>muyV2qZCa1L^<%93Bbpa)Q+LEhco_J7-=hpaPFssBN@{Y#^pM4~#!XLoO z44W2b*EV`qJ%qjfU98b3xvRwuW&4>D)$c2%my2VLEB>QtS5l@tRL~-bm6w0y!H`Yp z<9}j*_!gm$-gPr^tGqIt@Ez$tBEF+hwW7vGs=pm7T@bsK`pR$8(IQCi%TM<|kW#v1 zV}G_D`#=A3Gi__s7$`08D;gfgX~1Rb&}`M?6dN&BU21bGMZ1QnMvoxRKK%6qa8<`{eRXjvZAAzgE9RjDg!}{C;R|43|`-%6bBZzIsen*|?)WIj~uge=751;AvIr z9{6*za>npPUz6rU@#aA27|$1Fc=I5 ugTY`h7z_r3!C){L3wQiuOoSRvxy z3mevUck$V`cHQGwcf;eq$IqN7{WsON`qk-!UB1j3S#`mrjaN72t9a|V-Q8-G#gG7= z--l}IOi}=9s!{A#BW@vw@f%xMUFI3U--0$C<_O>$mYShdgcZ;Y=mv;oY%1bpIKe$Y zxZLyW-Z3BJMLcK$m@POgH+p)qO>%E=AtfR=ZZ*76W{jxPhU@CKEyILcA^aKTp`)J$qi419|C2ltig6tC=kAO_uY_aTJc6Nq-%T zF_}6Uy@X1bIX@na`b1bG^ciieZs4A4JdYzM{#m+a>Ck&^K+4x=sTeVk!$(H?{kW z(zv(D>0FeH`Z=YYI?p6W&ZBv`?4p?-52oFVZ+sV(A1C+i0Kru=bsk?^<;sd9MI1X% z3mR|Bvv9Ef?Su^~8c4K8LQ6$^tQ@tNet^V$Q@QV61`n2>xn9unhfL(#ADH9=bvd6Q z2U}ZT+ID$gUBQdSZ*T`RIVdo%;6HH(pi=kG=TjuHq<$?HVNy&?(zp>Z`UhxwGtK>+ zcE0-=+~SkTpSDHp+OeN1c-ohHe=p0e-EPW9yaa68mV)4{AW*-CV`KHfFulZ=plESB zX{t*daFkra>VI8^x8=qdelY9ssmuUaRT)Y_(p=Leq)O|VEI}RIPiLmb25W75aNavu zu*8iXcS1R&1adtSj$VWrO_XfSe_=N%$W|IqU_&*so;li0=df#?0w!B<#JV@{acHO& z2nYI1!&&QycA$i1BL{oy;qE6{>l`DAU$q(2eAvm@SS@>bBW}1i{!r=JrkbJS&2DEA zkYu2K#e{MtRErKk`;Z>tg!V8($ra1TpLisu!r^z%-)Mha(N7)31_?;Yg6yEtzG8gE zdn)OqRoooSs;IOLvxf$7I(#BFH(NZ=X4rrbO1xSoFR;UnBkKbC_e0F~*zRODlr5nX zh0~$F*Cez4{tv;L9YU)1C(>-*9h5}%>v`cjQd*RXhHa|MnLlQ`5aM&fnBE1yX&KsR zAWqB6$GX{HzW-!5#vrjk0k!~%u#`3v3WU|YfzGK8l;Q;JTT`29>hHCWH;;Vx8dAcr zLpndQ6($q^tO-TxFqvMIi}a<)<@Btjc*-#g++6HUx}@6I?pRiuM{=m2&3%4*`6%+f z8)Ju+DbZ{l)T$~QqAY+o{n+eUEdM0~aV=o3QUGCS-9lJTlsE};z6q~wKW98}_!MSx zGMLIruG(_>4O1FCm9M*&#$GAD1>3N(B<`c#CBzYEqx9Pw6s&EPI%U*^K+Sv=J*wvP z^j9H#2q_AdY)<3Op#59x#hAqyzoP9)Na%=~bJmS^TmZga)Kh=8a8NqJAg1YUS1aS| zxzoBP?R5Rw`f}xmje!PBw>992`&v`oy=~*P_qH=aIIip(!*W~&yWtv=j0b-CvwJbF rvX&B;oBPkRzMBmmxU?r41+b$gHHVs93caDScR&DduTw}iA|m%M@vA#( literal 0 HcmV?d00001 diff --git a/icons/50d.png b/icons/50d.png new file mode 100644 index 0000000000000000000000000000000000000000..f04122b30fdcde958c90ca339bb990fb5508ffef GIT binary patch literal 650 zcmeAS@N?(olHy`uVBq!ia0vp^DIm$QvA~j=q9oJvF*6E|;Ry zv)sPl+a>>e&hb0{*XNago%g)*eewC7=WU<6PEzqiM`CNk&PmUnVPSIOsdZy!0`G^d z{jbBB=Qr*>u-Q@Q=k+H~?k4hWKX55WnLn>yi|ys%x5q1_(pRva)GTsb$F#dK_rP?! zb@BXX7_J*XndbYXsfN9e^~B;8s>&tn|Fd!n`J7bE7BArZ!TU$&kKr0G+3T7QoFCq> z)r_2Ae4w%E7bk1nvVj87j9JbLX5gt+=B4I=4Z_s&abqhZV+8 zj0&u`u38%X#BbK(F2e_<=M*NIi^sE^SZJ|(O+wN632zS^+%ol_`iZsMFC7futYXJM z;XKn$?jr6Rvn<{A^DSRHC!k0_()eOt#k}c>Ml;pF^H_4d@t9p5xNGT7{fC!NRc@KO zTVa2L`^;n=t+L32SN_Rw60_jV@t7OIvi8f53%(EPUe;uZKjA7^RKzz|hJ72udvCV2 zdsFtVlG#7|*^ckQFBfc0KjHd-Z-eBIK+EZtYp;mft+^=acH?x_q&Q{%-D@fqz5ABO z;= 2 { // limit number of delays displayed break } @@ -89,8 +156,6 @@ func text(gc *draw2dimg.GraphicContext, s string, size, x, y float64) { gc.SetFontData(draw2d.FontData{Name: fontName}) gc.SetFontSize(size) gc.FillStringAt(s, x, y) - gc.SetLineWidth(2) - gc.StrokeStringAt(s, x, y) } func newWhite() *image.RGBA { @@ -114,7 +179,28 @@ func rect(gc *draw2dimg.GraphicContext, x1, y1, x2, y2 float64) { } func getDate(now time.Time) string { - return fmt.Sprintf("%v %v", getDay(now), getMonth(now)) + return fmt.Sprintf("%v %v %v", getDow(now), getDay(now), getMonth(now)) +} + +func getDow(now time.Time) string { + switch now.Weekday() { + case time.Monday: + return "lun" + case time.Tuesday: + return "mar" + case time.Wednesday: + return "mer" + case time.Thursday: + return "jeu" + case time.Friday: + return "ven" + case time.Saturday: + return "sam" + case time.Sunday: + return "dim" + } + + return "?" } func getDay(now time.Time) string { diff --git a/main.go b/main.go index 8b5a25b..0eada30 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "context" "github.com/Crocmagnon/display-epaper/fete" "github.com/Crocmagnon/display-epaper/transports" + "github.com/Crocmagnon/display-epaper/weather" "github.com/golang/freetype/truetype" "github.com/llgcode/draw2d" _ "golang.org/x/image/bmp" @@ -34,7 +35,11 @@ func main() { CacheLocation: os.Getenv("FETE_CACHE_LOCATION"), }) - if err := run(ctx, transportsClient, feteClient); err != nil { + weatherClient := weather.New(nil, weather.Config{ + APIKey: os.Getenv("WEATHER_API_KEY"), + }) + + if err := run(ctx, transportsClient, feteClient, weatherClient); err != nil { log.Fatal("error: ", err) } diff --git a/run_darwin_arm64.go b/run_darwin_arm64.go index ce0fb5a..249a9d0 100644 --- a/run_darwin_arm64.go +++ b/run_darwin_arm64.go @@ -4,19 +4,25 @@ import ( "context" "github.com/Crocmagnon/display-epaper/fete" "github.com/Crocmagnon/display-epaper/transports" + "github.com/Crocmagnon/display-epaper/weather" "github.com/llgcode/draw2d/draw2dimg" "log" "time" ) -func run(ctx context.Context, transportsClient *transports.Client, feteClient *fete.Client) error { +func run( + ctx context.Context, + transportsClient *transports.Client, + feteClient *fete.Client, + weatherClient *weather.Client, +) error { img, err := getBlack(ctx, func() time.Time { t, err := time.Parse(time.DateOnly, "2024-08-01zzz") if err != nil { return time.Now() } return t - }, transportsClient, feteClient) + }, transportsClient, feteClient, weatherClient) if err != nil { log.Fatal(err) } @@ -24,7 +30,5 @@ func run(ctx context.Context, transportsClient *transports.Client, feteClient *f log.Fatalf("error saving image: %v", err) } - log.Println("done") - return nil } diff --git a/run_linux_arm64.go b/run_linux_arm64.go index a0e7e9b..658aea5 100644 --- a/run_linux_arm64.go +++ b/run_linux_arm64.go @@ -6,12 +6,18 @@ import ( "github.com/Crocmagnon/display-epaper/epd" "github.com/Crocmagnon/display-epaper/fete" "github.com/Crocmagnon/display-epaper/transports" + "github.com/Crocmagnon/display-epaper/weather" "log" "periph.io/x/host/v3" "time" ) -func run(ctx context.Context, transportsClient *transports.Client, feteClient *fete.Client) error { +func run( + ctx context.Context, + transportsClient *transports.Client, + feteClient *fete.Client, + weatherClient *weather.Client, +) error { _, err := host.Init() if err != nil { return fmt.Errorf("initializing host: %w", err) @@ -30,7 +36,7 @@ func run(ctx context.Context, transportsClient *transports.Client, feteClient *f default: } - err = loop(ctx, display, transportsClient, feteClient) + err = loop(ctx, display, transportsClient, feteClient, weatherClient) if err != nil { log.Printf("error looping: %v\n", err) } @@ -45,6 +51,7 @@ func loop( display *epd.EPD, transportsClient *transports.Client, feteClient *fete.Client, + weatherClient *weather.Client, ) error { defer func() { if err := display.Sleep(); err != nil { @@ -59,7 +66,7 @@ func loop( display.Clear() - black, err := getBlack(ctx, time.Now, transportsClient, feteClient) + black, err := getBlack(ctx, time.Now, transportsClient, feteClient, weatherClient) if err != nil { return fmt.Errorf("getting black: %w", err) } diff --git a/weather/weather.go b/weather/weather.go new file mode 100644 index 0000000..ff36a96 --- /dev/null +++ b/weather/weather.go @@ -0,0 +1,122 @@ +package weather + +import ( + "context" + "fmt" + "github.com/carlmjohnson/requests" + "net/http" +) + +type Config struct { + APIKey string +} + +type Client struct { + config Config + client *http.Client +} + +func New(httpClient *http.Client, config Config) *Client { + return &Client{ + config: config, + client: httpClient, + } +} + +type Prevision struct { + Lat float64 `json:"lat"` + Lon float64 `json:"lon"` + Timezone string `json:"timezone"` + TimezoneOffset int `json:"timezone_offset"` + Current struct { + Dt int `json:"dt"` + Sunrise int `json:"sunrise"` + Sunset int `json:"sunset"` + 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 []struct { + Id int `json:"id"` + Main string `json:"main"` + Description string `json:"description"` + Icon string `json:"icon"` + } `json:"weather"` + } `json:"current"` + Daily []Daily `json:"daily"` + Alerts []struct { + SenderName string `json:"sender_name"` + Event string `json:"event"` + Start int `json:"start"` + End int `json:"end"` + Description string `json:"description"` + Tags []string `json:"tags"` + } `json:"alerts"` +} + +type Daily struct { + Dt int `json:"dt"` + Sunrise int `json:"sunrise"` + Sunset int `json:"sunset"` + Moonrise int `json:"moonrise"` + Moonset int `json:"moonset"` + MoonPhase float64 `json:"moon_phase"` + Summary string `json:"summary"` + Temp struct { + Day float64 `json:"day"` + Min float64 `json:"min"` + Max float64 `json:"max"` + Night float64 `json:"night"` + Eve float64 `json:"eve"` + Morn float64 `json:"morn"` + } `json:"temp"` + FeelsLike struct { + Day float64 `json:"day"` + Night float64 `json:"night"` + Eve float64 `json:"eve"` + Morn float64 `json:"morn"` + } `json:"feels_like"` + Pressure int `json:"pressure"` + Humidity int `json:"humidity"` + DewPoint float64 `json:"dew_point"` + WindSpeed float64 `json:"wind_speed"` + WindDeg int `json:"wind_deg"` + WindGust float64 `json:"wind_gust"` + Weather []Weather `json:"weather"` + Clouds int `json:"clouds"` + Pop float64 `json:"pop"` + Rain float64 `json:"rain"` + Uvi float64 `json:"uvi"` +} + +type Weather struct { + Id int `json:"id"` + Main string `json:"main"` + Description string `json:"description"` + Icon string `json:"icon"` +} + +func (c *Client) GetWeather(ctx context.Context) (res *Prevision, err error) { + err = requests.URL("https://api.openweathermap.org/data/3.0/onecall"). + Client(c.client). + Param("lat", "45.78"). + Param("lon", "4.89"). + Param("appid", c.config.APIKey). + Param("units", "metric"). + Param("lang", "fr"). + Param("exclude", "minutely,hourly"). + ToJSON(&res). + Fetch(ctx) + if err != nil { + return nil, fmt.Errorf("calling openweathermap: %w", err) + } + + return res, nil +}