Weather in Conky... the easy 2-line way

${execpi 1800 curl -o /home/$USER/.conky/weather.png}
${image /home/owner/.conky/weather.png -p 25,600 -n}

You'll note the caveat in the code above:
While execpi recognizes the $USER variable, image does not.

Even execpi is glitchy when using $USER with a complicated URL (like that below for GPS coordinates).

So while you can use /home/$USER/.conky/weather.png for the first line of code, you have to put your username for the second: /home/owner/.conky/weather.png

I've already put in a request with the Conky devs to get that fixed so image recognizes $USER.

Another caveat is that you cannot have transparency in Conky... it'll strip the color out of the PNG, for some reason. It shows up all white, but it should look like:

Another caveat is that you have to have Conky set up with 'minimum_height' with a large enough value so the image has somewhere to be put (otherwise it'll show up underneath the other stuff Conky is putting on the screen). I just made Conky the full screen height.

Here's my full /etc/conky/conky.conf, as a reference:

conky.config					=
	alignment					=	'top_right',
	background					=	true,
	border_inner_margin			=	3,
	border_outer_margin			=	0,
	border_width				=	0,
	cpu_avg_samples				=	10,
	default_color				=	'000000',
	default_outline_color		=	'000000',
	default_shade_color			=	'000000',
	double_buffer				=	true,
	draw_borders				=	true,
	draw_graph_borders			=	true,
	draw_outline				=	false,
	draw_shades					=	false,
	extra_newline				=	false,
	font						=	'JetBrains Mono Regular:size=7',
	gap_x						=	0,
	gap_y						=	0,
	maximum_width				=	255,
	minimum_height				=	900,
	minimum_width				=	255,
	net_avg_samples				=	10,
	no_buffers					=	yes,
	out_to_console				=	false,
	out_to_stderr				=	false,
	own_window					=	true,
	own_window_argb_value		=	0,
	own_window_argb_visual		=	false,
	own_window_class				=	'Conky',
	own_window_colour			=	'000000',
	own_window_hints				=	'below,skip_pager,skip_taskbar,sticky,undecorated',
	own_window_transparent		=	false,
	own_window_type				=	'panel',
	show_graph_range				=	false,
	show_graph_scale				=	false,
	stippled_borders				=	0,
	temperature_unit				=	'fahrenheit',
	text_buffer_size				=	1024,
	top_cpu_separate				=	true,
	update_interval				=	5.0,
	update_interval_on_battery	=	60,
	uppercase					=	false,
	use_spacer					=	'none',
	use_xft						=	true,
	xftalpha					=	1

conky.text						=
#${if_match "  Monitor is Off" == "${execi 5 xset -q | sed -n '$p'}"}
#	${eval ${lua -e 'conky_set_update_interval 300'}}
#	300 Seconds
#	${eval ${lua -e 'conky_set_update_interval 10'}}
#	10 Seconds
${color FFFFFF}${stippled_hr 1}
Uptime: ${uptime}${alignr}${time %a, %d %b %y, %T}
${stippled_hr 1}
AMD Ryzen 5 5625 U${alignr}CPU Temp: ${hwmon 4 temp 1} F
${color FFFFFF}Core 00: ${freq 1} MHz${goto 100}${cpu cpu1} %${goto 135}${color 3388FF}${cpubar cpu1 10,115}
${color FFFFFF}Core 01: ${freq 2} MHz${goto 100}${cpu cpu2} %${goto 135}${color 3388FF}${cpubar cpu2 10,115}
${color FFFFFF}Core 02: ${freq 3} MHz${goto 100}${cpu cpu3} %${goto 135}${color 3388FF}${cpubar cpu3 10,115}
${color FFFFFF}Core 03: ${freq 4} MHz${goto 100}${cpu cpu4} %${goto 135}${color 3388FF}${cpubar cpu4 10,115}
${color FFFFFF}Core 04: ${freq 5} MHz${goto 100}${cpu cpu5} %${goto 135}${color 3388FF}${cpubar cpu5 10,115}
${color FFFFFF}Core 05: ${freq 6} MHz${goto 100}${cpu cpu6} %${goto 135}${color 3388FF}${cpubar cpu6 10,115}
#${color FFFFFF}Core 06: ${freq 7} MHz${goto 100}${cpu cpu7} %${goto 135}${color 3388FF}${cpubar cpu7 10,115}
#${color FFFFFF}Core 07: ${freq 8} MHz${goto 100}${cpu cpu8} %${goto 135}${color 3388FF}${cpubar cpu8 10,115}
#${color FFFFFF}Core 08: ${freq 9} MHz${goto 100}${cpu cpu9} %${goto 135}${color 3388FF}${cpubar cpu9 10,115}
#${color FFFFFF}Core 09: ${freq 10} MHz${goto 100}${cpu cpu10} %${goto 135}${color 3388FF}${cpubar cpu10 10,115}
#${color FFFFFF}Core 10: ${freq 11} MHz${goto 100}${cpu cpu11} %${goto 135}${color 3388FF}${cpubar cpu11 10,115}
#${color FFFFFF}Core 11: ${freq 12} MHz${goto 100}${cpu cpu12} %${goto 135}${color 3388FF}${cpubar cpu12 10,115}
${color FFFFFF}${stippled_hr 1}
Drive Free Space:${goto 90}${color 3388FF}${fs_bar_free 10,115 /}${color FFFFFF}${alignr}${fs_free_perc} %
RAM Usage:${goto 90}${color 3388FF}${membar 10,115}${color FFFFFF}${alignr}${memperc} %
Swap Usage:${goto 90}${color 3388FF}${swapbar 10,115}${color FFFFFF}${alignr}${swapperc} %
${stippled_hr 1}
SSID: ${wireless_essid}${color 3388FF}${goto 80}${wireless_link_bar 10,115 wlo1}${color FFFFFF}${alignr}${wireless_bitrate wlo1}
LAN: ${addr wlo1}${alignr}WAN: ${texeci 1800 curl -s}
Up: ${upspeed wlo1}/s  ${alignr}Down: ${downspeed wlo1}/s
${color 3388FF}${upspeedgraph wlo1 25,124 FF0000 8B0000 -l -t}${alignr}${downspeedgraph wlo1 25,124 ABFF2C 12CD22 -l -t}
${color FFFFFF}Total: ${totalup wlo1}${alignr}Total: ${totaldown wlo1}
${stippled_hr 1}
Processes: ${processes}${alignr}Running: ${running_threads}
${stippled_hr 1}
Name${goto 105}MEM${goto 150}CPU%${alignr}PID
${top_mem name 1}${goto 105}${top_mem mem_res 1}${goto 150}${top_mem cpu 1}${alignr}${top_mem pid 1}
${top_mem name 2}${goto 105}${top_mem mem_res 2}${goto 150}${top_mem cpu 2}${alignr}${top_mem pid 2}
${top_mem name 3}${goto 105}${top_mem mem_res 3}${goto 150}${top_mem cpu 3}${alignr}${top_mem pid 3}
${top_mem name 4}${goto 105}${top_mem mem_res 4}${goto 150}${top_mem cpu 4}${alignr}${top_mem pid 4}
${top_mem name 5}${goto 105}${top_mem mem_res 5}${goto 150}${top_mem cpu 5}${alignr}${top_mem pid 5}
${top_mem name 6}${goto 105}${top_mem mem_res 6}${goto 150}${top_mem cpu 6}${alignr}${top_mem pid 6}
${top_mem name 7}${goto 105}${top_mem mem_res 7}${goto 150}${top_mem cpu 7}${alignr}${top_mem pid 7}
${top_mem name 8}${goto 105}${top_mem mem_res 8}${goto 150}${top_mem cpu 8}${alignr}${top_mem pid 8}
${top_mem name 9}${goto 105}${top_mem mem_res 9}${goto 150}${top_mem cpu 9}${alignr}${top_mem pid 9}
${top_mem name 10}${goto 105}${top_mem mem_res 10}${goto 150}${top_mem cpu 10}${alignr}${top_mem pid 10}
${stippled_hr 1}
Name${goto 105}CPU%${goto 150}MEM${alignr}PID
${top_time name 1}${goto 105}${top_time cpu 1}${goto 150}${top_time mem_res 1}${alignr}${top_time pid 1}
${top_time name 2}${goto 105}${top_time cpu 2}${goto 150}${top_time mem_res 2}${alignr}${top_time pid 2}
${top_time name 3}${goto 105}${top_time cpu 3}${goto 150}${top_time mem_res 3}${alignr}${top_time pid 3}
${top_time name 4}${goto 105}${top_time cpu 4}${goto 150}${top_time mem_res 4}${alignr}${top_time pid 4}
${top_time name 5}${goto 105}${top_time cpu 5}${goto 150}${top_time mem_res 5}${alignr}${top_time pid 5}
${top_time name 6}${goto 105}${top_time cpu 6}${goto 150}${top_time mem_res 6}${alignr}${top_time pid 6}
${top_time name 7}${goto 105}${top_time cpu 7}${goto 150}${top_time mem_res 7}${alignr}${top_time pid 7}
${top_time name 8}${goto 105}${top_time cpu 8}${goto 150}${top_time mem_res 8}${alignr}${top_time pid 8}
${top_time name 9}${goto 105}${top_time cpu 9}${goto 150}${top_time mem_res 9}${alignr}${top_time pid 9}
${top_time name 10}${goto 105}${top_time cpu 10}${goto 150}${top_time mem_res 10}${alignr}${top_time pid 10}
${color FFFFFF}${stippled_hr 1}
${execpi 1800 curl -o /home/$USER/.conky/weather.png}
${image /home/owner/.conky/weather.png -p 25,600 -n}

You'll note the commented-out code... I'm still tracking down how to increase the update interval when the screen is off so CPU usage goes to an absolute minimum.

You can get more precise than just the ZIP code... you can use your exact GPS coordinates: