[HN Gopher] Show HN: Weather API for non-commercial use
       ___________________________________________________________________
        
       Show HN: Weather API for non-commercial use
        
       Author : meteo-jeff
       Score  : 132 points
       Date   : 2021-09-12 10:18 UTC (1 days ago)
        
 (HTM) web link (open-meteo.com)
 (TXT) w3m dump (open-meteo.com)
        
       | [deleted]
        
       | syedkarim wrote:
       | How do your models compare to those from NOAA?
       | 
       | https://nomads.ncep.noaa.gov/
        
       | ricksunny wrote:
       | Looks great! I really like the UI to make it clear what can be
       | had from the API - it really facilitates the on-boarding process.
       | Have got a couple of questions if you don't mind? :
       | 
       | * What is the source of the soil moisture data?
       | 
       | * Also can you describe which ET model is being applied and which
       | of its parameter values have to be assumed?
        
         | meteo-jeff wrote:
         | * Soil moisture data is based on DWD ICON models with up to 2
         | km resolution in central Europe.
         | 
         | * ET is based on latent heat flux. This is not the potential
         | evapotranspiration or ET0 reference evapotranspiration. I did
         | not dive deep into the actual radiative transfer model for
         | latent heat flux, but you can find it in the DWD ICON
         | description.
        
       | flippyhead wrote:
       | This is really great. I've been looking for exactly this kind of
       | tool as I look at possible projects related to aviation. Thank
       | you for this.
        
       | salamander014 wrote:
       | I've used the Open Weather Map API in the past
       | (https://openweathermap.org/api).
       | 
       | It's free for a reasonable number of requests and has a solid API
       | and a good variety of functionality.
       | 
       | Yours looks well designed! I will give it a shot if I ever need
       | to revisit my local weather script.
       | 
       | Did you chose swift for any reason besides existing knowledge?
       | Python can be compiled down to a binary pretty easily, along with
       | many other languages. Just curious. Cheers.
        
         | meteo-jeff wrote:
         | My personal preference for Swift was for sure a major aspect. I
         | also like to profile my code and see how much I can out of it.
         | It is more an academical challenge to compare performance mmap
         | vs file reads calls, but I enjoy it :)
         | 
         | With Python I always struggled to get performance to a very
         | high level. I am sure it is possible, but Swift with some C
         | code was more natural for me.
        
       | vorpalhex wrote:
       | Looks great. What is the funding model for the project? What are
       | the current costs?
        
         | meteo-jeff wrote:
         | There is no funding. Costs are negligible. Currently it is
         | running on a cheap rented VM. Per single VM, it should scale to
         | 3+ million API calls per days easily.
         | 
         | To keep it simple, I also do not want to have any income with
         | it. In case larger API consumers are on the horizon, I will
         | contact them and ask to sponsor a couple more VMs.
        
           | counters wrote:
           | Can you share who your vendor/host is? In another comment you
           | mentioned that you're mmap'ing files on SSDs... on vendors
           | like GCP that sort of hardware (especially the storage volume
           | you'd need to have access to a handful of the local/global
           | models, as you reference on your website) isn't particularly
           | cheap if you want to have 100% uptime.
           | 
           | A cheaper/scalable approach instead would be to re-process
           | your data into an appropriately chunked, cloud-optimized
           | storage format like Zarr and save it in object storage. Then
           | your scaling bottleneck would just be the VMs or compute you
           | use to query from object storage, as a function of
           | traffic/load.
        
             | meteo-jeff wrote:
             | The host is netcup in Germany. I use regular KVMs.
             | 
             | Yes, the amount of storage can be an issue, but I want to
             | stay below 500GB of hot-data. One bottleneck is network
             | traffic to copy updated files after each weather model
             | update.
             | 
             | My binary files are just plain Float16 files without an
             | meta data. Logically they similar to 3D Zarr files. I know
             | exactly which bytes I have to read and the kernel cache
             | helps a look to keep it fast.
             | 
             | In theory this data does not have to be a file on SSD. I
             | could also use a block storage directly or request data
             | from S3 via range requests.
             | 
             | One hopelessly over-engineered approach would be to use an
             | `AWS EBS io2 Block Express Volume` use `Multi-Attach` and
             | spawn up to 16 API instances to serve data from it.
        
           | 0des wrote:
           | What a lad, thanks!
        
       | dylan604 wrote:
       | I like the UI generating the URL to send to the API vs just a PDF
       | of all of the possible key/value pairs to generate manually. A
       | little above&beyond for most APIs I've used personally. Its
       | effort not lost on me.
        
       | fifthofhisname wrote:
       | > All data is offered for non-commercial use. With speedy APIs,
       | all data can be served by just a couple of virtual machines for
       | less than a coffee a day.
       | 
       | Very impressive! What does your backend stack look like? Are you
       | using any caching or does every API call hit the binary file?
       | 
       | > The project went live 2 weeks ago and is slowly being used.
       | 
       | What kind of traffic are you getting?
       | 
       | Looking forward to future updates!
        
         | meteo-jeff wrote:
         | The API backend is written in Swift with some code in C
         | (conversion Float16, interpolations, some solar radiation
         | libraries). Data are read directly via mmap from local NVMe SSD
         | disks. To scale, I can add new VMs and copy my binary files.
         | 
         | There is no frontend cache and I want to keep it this way. Next
         | steps include point-of-presence API virtual machines in
         | different counties. Via GeoDNS this is even faster than a CDN.
         | 
         | Peak API usage was around 50.000 API calls per hour, but on
         | average it is quite low.
        
           | ricksunny wrote:
           | What would it take for it to also be offered on a commercial-
           | use basis?
        
       | BHSPitMonkey wrote:
       | Looks nice! I love seeing more free options in this space. I'll
       | be keeping an eye out for support in Home Assistant[1] :)
       | 
       | [1] https://www.home-assistant.io/integrations/#weather
        
       | sails wrote:
       | Thats cool, I'll be having a closer look. I'm working on an xbar
       | plugin app [1][2] that alerts me when there is a warmer day in
       | the coming week.
       | 
       | I used VisualCrossing [3] which seems quite good, and crucially
       | allows 2 weeks historical data, which I think is quite rare. It
       | looks like you offer 2? Darksky did not offer this feature I
       | don't think.
       | 
       | For my use the accuracy is not critical.
       | 
       | [1] https://github.com/mattarderne/clearmycal
       | 
       | [2] xbarapp.com/
       | 
       | [3] https://www.visualcrossing.com/weather-api
        
         | meteo-jeff wrote:
         | For now I only offer 2 days of past weather data.
         | 
         | Most likely I can store some basic weather variables like
         | temperature, humidity, wind, precipitation and weather code for
         | a couple of weeks. I will keep you request in my backlog:
         | https://github.com/open-meteo/open-meteo/issues/27 Thanks!
        
           | sails wrote:
           | Great! I'll take a closer look at the API soon Thanks
        
       | cetra3 wrote:
       | This is great, I'd love to have dive visibility predictions for
       | my webapp based on location: https://divedb.net/
       | 
       | The challenge I've had is the same, the data format that a lot of
       | these sources provide is in "academic" formats like GRIB, NetCDF
       | etc.. and I've spent a not-insignificant amount of time trying to
       | work through all these formats and what they represent.
        
         | meteo-jeff wrote:
         | Do you know an open-data source for ocean visibility data?
         | 
         | I want to integrate regular wave forecasts in the next month,
         | but I am unaware of something that can improve dive visibility.
        
           | cetra3 wrote:
           | Dive visibility is actually quite hard to forecast (at least
           | in the areas I dive) and I don't know if there have been
           | empirical studies on it.
           | 
           | Anecdotally I find it's best when the wind is offshore and
           | there is low tidal movement. But there are other factors at
           | play, such as rainfall, etc..
           | 
           | This is one source I found (for wave height):
           | https://www.aviso.altimetry.fr/en/data/products.html, however
           | it was not clear on the website whether it was paid or not.
           | 
           | Another one I had a poke around with:
           | https://www.ecmwf.int/en/forecasts/datasets/wmo-essential
           | (trying to read Grib2)
        
       | meteo-jeff wrote:
       | Creator from Open-Meteo here, I build a small, but very fast and
       | precise weather forecast API for non-commercial use. I am a
       | private individual working on it in my spare time.
       | 
       | Open-Meteo started as an exercise to process weather model data
       | from the German weather service with up to 2 km resolution. Their
       | forecasts are great, but hard to use for non-data-scientists who
       | regularly work with NetCDF and GRIB-files. Using this data in
       | simple apps, websites, your home-automation software, or robot
       | lawn mower is complex.
       | 
       | The Open-Meteo API makes using this data easier. APIs accept
       | standard WGS84 coordinates and return a weather forecast for 7
       | days in hourly resolution.
       | 
       | The forecast quality is surprisingly good. Open-Meteo includes
       | global and regional weather models. Global models use 11 km
       | resolution with up to 180 hours of forecast. Local models vary
       | between 2 and 7 km resolution and 48 to 72 hours. Updates every 3
       | hours. The best model is automatically selected and combined to
       | produce a single 7-day hourly forecast. Currently the best
       | forecast model coverage is in Europe. Models for North America
       | will be integrated next.
       | 
       | Under the hood, all data is stored in binary files using Float16
       | and updated in-place after a new weather model arrives. The API
       | is very efficient. Returning weather forecasts takes usually less
       | than 5 milliseconds. Internet latency is usually much higher.
       | 
       | All data is offered for non-commercial use. With speedy APIs, all
       | data can be served by just a couple of virtual machines for less
       | than a coffee a day.
       | 
       | What's next? Some important features are still missing like daily
       | aggregations, additional weather models, ocean, and air quality
       | forecasts. Additionally, I would like to deploy some servers in
       | North America and Asia to improve latency.
       | 
       | The project went live 2 weeks ago and is slowly being used. I
       | would be grateful for feedback, suggestions, ideas, and
       | questions.
       | 
       | All documentation can be found at https://open-meteo.com/en/docs
        
       | filleokus wrote:
       | Looks really awesome! Very quick responses.
       | 
       | I would be interested in seeing the implementation of the
       | service, interesting choice going with Swift. I'm guessing your
       | using something like Vapor for hosting the API?
       | 
       | How are the files designed? I'm guessing you have some cheap way
       | of mapping (lat, long) into a file location? Maybe just by
       | truncating the coordinates to your precision and mapping them
       | onto the file? Using some fancy-pants Uber Hexagons[0]. How is
       | the forecast delivered?
       | 
       | Hmm! Many questions :-). I've been thinking lately of similar
       | (but not for weather) "geographical" API's, and how to
       | store/query data cheaply, so this interested me :-)
       | 
       | [0]: https://github.com/uber/h3
        
         | meteo-jeff wrote:
         | Yes, the API part is using Vapor. But there is not much code
         | that actually relies on Vapor. It is mostly doing request
         | parameter parsing and routing.
         | 
         | I use simple 2D lat lon grids for different regions and
         | resolutions. E.g. the global grid uses 2879x1441 pixel grid.
         | The third dimension is time. All data are stored directly as
         | floating points on disk. Because I know the dimensions of the
         | grid, I can read data exactly at the correct position on disk.
         | I use Float16 as well, which saves me 50% disk space compared
         | to Float32.
         | 
         | Fancy hexagons like H3 are not necessary. They could reduce
         | storage by ~30%, but require much more effort and I have to
         | "modify" the forecast. I keep forecast data from national
         | weather services as untouched as possible.
        
       | ubergesundheit wrote:
       | Very nice! Thank you for posting this.
       | 
       | I run a cronjob which sends me the forecast for the next day
       | based on german weather service MOSMIX forecasts. I am using
       | https://brightsky.dev for this, which makes the clunky xml files
       | of MOSMIX available as a http api.
       | 
       | I'll definitely check out open-meteo
        
         | meteo-jeff wrote:
         | I also tried brightsky.dev, but it is limited to weather
         | stations in the MOSMIX system. IRRC only Germany. In terms of
         | forecast quality, MOSMIX should be great!
         | 
         | One goal of mine, would be to provide historical data of the
         | past months to enable users to run their own statistical
         | forecasts combined with weather models. It is actually quite
         | easy to use measurement data and correct forecasts using simple
         | machine learning models like random forrest. If you compare
         | wind speed measures and forecasts, there usually is a simple
         | statistical error that can be reduced easily. Maybe in the next
         | month I will to some tests and example code
        
       | xcambar wrote:
       | how do you compare with Kachelmann and kachelmannwetter.com in
       | terms of data?
       | 
       | For visualization, the UI there is great for a trained eye only,
       | yours seems more accessible. Congrats on that point!
        
         | meteo-jeff wrote:
         | Kachelmann seems to be more media oriented. I am not aware that
         | there is a free API offer.
         | 
         | It looks like Kachelmann is also integrating weather forecasts
         | from different national weather services and the paid version
         | from ECMWF. I am sure the "HD" forecasts mainly use DWD ICON
         | models as well. In this case, data quality would be the same.
         | 
         | I also spend some time to carefully integrate local and global
         | weather models. For solar radiation forecasts, a clear sky
         | radiation model is used to correctly interpolate data to 1h
         | resolution. In the end it is a tradeoff between simple API with
         | low operation cost and data quality/amount.
        
       | Leftium wrote:
       | I've investigated and tried several (free) weather API's for my
       | web app: https://uw.leftium.com.
       | 
       | Open-Meteo looks pretty good! The only thing that seems to be
       | missing for me is precipitation probability. The weathercode is
       | sort of a proxy for this... I'm also interested in sunrise/sunset
       | times; direct_radiation is kind of a proxy for this.
       | 
       | Kudos for providing optional historical data with the same API
       | call for the forecast. Many weather API's don't provide
       | historical data, and even if they do, it requires extra calls. My
       | weather app charts the previous two days of weather with the
       | forecast for comparison. I feel this gives a more intuitive sense
       | of the weather vs. raw numbers because weather is very relative.
       | ("Warm" vs "cool" depends on your location and season.)
       | 
       | In addition, I am in the process of adding AQI forecasts, which
       | requires even more network calls. It seems like this is on the
       | roadmap for open-meteo. I was surprised to find there are so many
       | different standards for AQI. Curious to know which one you plan
       | to use.
       | 
       | One possible suggestion for optimizing the output format: sending
       | seconds since the Unix epoch would save a few bytes per
       | timestamp. I'm not sure if this would make any noticeable
       | difference with gzip compression. The current datetime format is
       | much more human-readable and may save a conversion before
       | displaying.
       | 
       | These were the best (free) weather API's I could find. It's
       | interesting how the three different weather forecasts can
       | disagree so much:
       | 
       | - https://openweathermap.org/api
       | 
       | - https://www.visualcrossing.com/weather-api
       | 
       | - https://darksky.net/dev (deprecated)
       | 
       | When I find the time, I will add open-meteo as to my app! I'll
       | probably have more feedback then.
        
         | meteo-jeff wrote:
         | Thanks for your suggestions!
         | 
         | I will add precipitation probability as soon as I include
         | 14-day ensemble weather models. Deterministic whether models
         | usually do not offer this directly.
         | 
         | I also really like the 2 days historical access :) At some
         | point I would like to add more, but the storage requirements
         | skyrocket quickly. Not only in space, but also disk IO to
         | perform in-place updates.
         | 
         | For air quality data I want to add first all variables
         | individually. AQI can be calculated afterwards on-the-fly. Some
         | AQI indices require data from the previous hours, but it should
         | work well with 2 days past data. For sure I will directly
         | integrate the European and US AQI.
         | 
         | I considered unix-timestamp instead of ISO9601 string
         | timestamps. Working with unix-timestamps is a bit trickier if
         | you also want to use timezones. For the start, i settled with
         | ISO8601 timestamps. I might consider adding unix timestamps as
         | an `&timeformat=unix` parameter to the API. Regarding saving
         | bytes in the output: I would like to implement protobuf as a
         | format and also use it to build some SDKs. Especially with
         | large floating point arrays, this saves a lot of parsing time
         | and preserves precision.
         | 
         | All your suggestions are now kept in the Open-Meteo backlog
         | https://github.com/open-meteo/open-meteo/issues
        
           | Leftium wrote:
           | Cool! I think unix timestamps should always be in UTC (no
           | timezone). But the timezone may affect the exact time range
           | of the results.
           | 
           | What does "starts at 0:00 today" mean? Ideally, it is 0:00 of
           | the local timezone. (Some other weather API's mess this up!)
        
             | meteo-jeff wrote:
             | At whatever time of day you call the API, data always
             | starts at 0:00. Either UTC or the time zone you selected.
             | 
             | Many weather APIs follow weather model runs. Therefore in
             | the evening, data suddenly starts at 12:00 UTC regardless
             | of the timezone. It is quite a pain, if you want to build
             | an app displaying todays data, but in the evening you do
             | not get data from the morning anymore.
             | 
             | With Open-Meteo multiple weather model runs are merged
             | together and partly overwritten. At around 4:00 UTC, the
             | first weather model with data starting at 0:00 UTC arrived
             | (usually called 0z run). 3 hours later, the 3z run arrives
             | with data starting at 3:00 UTC. After a couple or model
             | runs arrive, it is quite a mix out of different weather
             | model runs. If done right, you notice nothing of this
             | behaviour ;)                   < 0z run >           < 3z
             | run>             < 6z run>               < 9z run>
             | 
             | Data is constantly merged into a time-series. The API then
             | selects the appropriate start time, which is set to 0:00
             | UTC (or if a timezone is set, local-time at 0:00, which
             | could be 4:00 UTC depending on the utc offset).
             | 
             | Yes, unix-timestamps must be in UTC+0. If a timezone is
             | set, data still starts at "2021-09-13T00:00", but this is
             | now local-time. With a 4 hour UTC offset, I would have to
             | set the unix-timestamp to "2021-09-12T20:00" and the
             | developer has to correctly reapply the UTC offset again to
             | get local time. This can be done, but is prone to errors.
        
         | shoto_io wrote:
         | Nice app! Could you please include Celsius as option?
        
           | meteo-jeff wrote:
           | Celsius is already the default temperature unit. You can
           | optionally switch to Fahrenheit.
           | 
           | For wind speeds, all typical units are available as well. Let
           | me know if I missed one.
        
       ___________________________________________________________________
       (page generated 2021-09-13 23:00 UTC)