{"id":1461,"date":"2025-07-24T21:37:05","date_gmt":"2025-07-25T02:37:05","guid":{"rendered":"https:\/\/www.nathanhunstad.com\/blog\/?p=1461"},"modified":"2025-07-24T21:37:05","modified_gmt":"2025-07-25T02:37:05","slug":"fun-with-weather-data-and-logs","status":"publish","type":"post","link":"https:\/\/www.nathanhunstad.com\/blog\/2025\/07\/fun-with-weather-data-and-logs\/","title":{"rendered":"Fun with weather data and logs!"},"content":{"rendered":"\n<p>A consistent theme of this blog is that I love collecting data. From setting up my own logging stack using Elastic at home to my almost 30-year-old Quicken guredle, I have always felt that if it isn&#8217;t logged and analyzed somewhere, it didn&#8217;t happen. I&#8217;m also a lover of weather and meteorology. Rain, temperature, humidity&#8230;these are just more data points to collect and analyze. I&#8217;ve been collecting environmental data inside my house <a href=\"https:\/\/www.nathanhunstad.com\/blog\/2024\/11\/simple-home-observability-with-the-esp32-platform\/\" target=\"_blank\" rel=\"noopener\" title=\"\">for a while now<\/a>, but the outside was as yet uncollected. The wild frontier. Until now.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>I&#8217;ve long desired a personal weather station, but there just wasn&#8217;t enough space at our old house to make it worthwhile: too many trees and obstructions would make for low accuracy. Our new house has more space for a station and fewer obstructions, and so recently I purchase a <a href=\"https:\/\/www.davisinstruments.com\/collections\/vantage-vue\/products\/vantage-vue-wireless-integrated-sensor-suite\" target=\"_blank\" rel=\"noopener\" title=\"\">Davis Vantage Vue<\/a> sensor and the <a href=\"https:\/\/www.davisinstruments.com\/pages\/weatherlink-live\" target=\"_blank\" rel=\"noopener\" title=\"\">WeatherLink Live<\/a> connector to collect the data. After a bit of work outside on the ladder and roof, the sensor was all ready to go:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/PXL_20250712_232914589-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"771\" height=\"1024\" src=\"https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/PXL_20250712_232914589-771x1024.jpg\" alt=\"\" class=\"wp-image-1462\" srcset=\"https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/PXL_20250712_232914589-771x1024.jpg 771w, https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/PXL_20250712_232914589-226x300.jpg 226w, https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/PXL_20250712_232914589-768x1020.jpg 768w, https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/PXL_20250712_232914589-scaled.jpg 1928w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/a><\/figure>\n\n\n\n<p>The WeatherLink Live device allowed me to send data to weatherlink.com, which was a pretty good start in terms of getting the data I wanted. However, as I&#8217;ve learned in the past, letting a website keep all my data is risky. I lost <a href=\"https:\/\/www.nathanhunstad.com\/blog\/2023\/09\/parsefit-my-simple-python-tool-to-parse-tcx-files-from-google-fit\/\" target=\"_blank\" rel=\"noopener\" title=\"\">all my workout history<\/a> when a site went under, and I don&#8217;t want to go through that again. Plus, I have Home Assistant and Elastic already up and running for data, so why not pull all that data into those tools so it can live beside the other data I was already getting? So my next step was to do just that.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Polling for data<\/h2>\n\n\n\n<p>Step one was figuring out where I could grab the data from, and fortunately that was very straightforward: the WLL device has a <a href=\"https:\/\/weatherlink.github.io\/weatherlink-live-local-api\/\" target=\"_blank\" rel=\"noopener\" title=\"\">simple API<\/a> that returns current weather conditions. Huzzah! That problem quickly solved, the next step was to get the data into HA and Elastic.<\/p>\n\n\n\n<p>I did some searching first to find an answer for Home Assistant, and very fortunately for me, this problem has already been solved by somebody. There is a <a href=\"https:\/\/github.com\/stevesinchak\/ha-weatherlink-live\" target=\"_blank\" rel=\"noopener\" title=\"\">custom integration<\/a> for Home Assistant that makes setup a snap. After a clone and copying the files to the right place, I had a custom device in Home Assistant:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"443\" src=\"https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-1024x443.png\" alt=\"\" class=\"wp-image-1464\" srcset=\"https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-1024x443.png 1024w, https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-300x130.png 300w, https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-768x332.png 768w, https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image.png 1051w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>A few more minutes fiddling with dashboards, and I had everything in one place in all its glory!<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"316\" src=\"https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-1-1024x316.png\" alt=\"\" class=\"wp-image-1465\" srcset=\"https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-1-1024x316.png 1024w, https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-1-300x92.png 300w, https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-1-768x237.png 768w, https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-1.png 1480w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>With Home Assistant quickly solved, it was time to move onto Elastic. Given the pattern that I <a href=\"https:\/\/www.nathanhunstad.com\/blog\/2024\/11\/how-i-used-home-assistant-and-python-to-ingest-esp32-sensor-data\/\" target=\"_blank\" rel=\"noopener\" title=\"\">used before<\/a> to get sensor data into Elastic, I figured I&#8217;d need to poll for data from somewhere and send to Logstash. Since WLL has the afore-mentioned API, I don&#8217;t need any intermediary, and so I wrote a short Python script to pull directly data from WLL and send to Logstash. Even better, to pay it forward I <a href=\"https:\/\/github.com\/huns0004\/homeassistanttools\/blob\/main\/getwlldata.py\" target=\"_blank\" rel=\"noopener\" title=\"\">put it online<\/a> in a <a href=\"https:\/\/github.com\/huns0004\/homeassistanttools\/tree\/main\" target=\"_blank\" rel=\"noopener\" title=\"\">repo<\/a> I created just for this purpose. As a bonus, I put the previous script for scraping data from Home Assistant I blogged about in there as well.<\/p>\n\n\n\n<p>A short bit of configuring Logstash later, and a longer bit of creating dashboards, and I have all the data I could ever want: <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"415\" src=\"https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-2-1024x415.png\" alt=\"\" class=\"wp-image-1466\" srcset=\"https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-2-1024x415.png 1024w, https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-2-300x122.png 300w, https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-2-768x311.png 768w, https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-2-1536x623.png 1536w, https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-2-2048x830.png 2048w, https:\/\/www.nathanhunstad.com\/blog\/wp-content\/uploads\/2025\/07\/image-2-1568x636.png 1568w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>The only thing that&#8217;s really missing here is that I am not yet automating anything with all this data. I&#8217;ll have to think of some way to do that for my next project. Until then, I&#8217;ll be enjoying the sight of even more data in my collection.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A consistent theme of this blog is that I love collecting data. From setting up my own logging stack using Elastic at home to my almost 30-year-old Quicken guredle, I have always felt that if it isn&#8217;t logged and analyzed somewhere, it didn&#8217;t happen. I&#8217;m also a lover of weather and meteorology. Rain, temperature, humidity&#8230;these&hellip; <a class=\"more-link\" href=\"https:\/\/www.nathanhunstad.com\/blog\/2025\/07\/fun-with-weather-data-and-logs\/\">Continue reading <span class=\"screen-reader-text\">Fun with weather data and logs!<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[19],"tags":[307,305,306,304],"class_list":["post-1461","post","type-post","status-publish","format-standard","hentry","category-tech-2","tag-automation","tag-elastic","tag-home-assistant","tag-weather","entry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.nathanhunstad.com\/blog\/wp-json\/wp\/v2\/posts\/1461","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nathanhunstad.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nathanhunstad.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nathanhunstad.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nathanhunstad.com\/blog\/wp-json\/wp\/v2\/comments?post=1461"}],"version-history":[{"count":2,"href":"https:\/\/www.nathanhunstad.com\/blog\/wp-json\/wp\/v2\/posts\/1461\/revisions"}],"predecessor-version":[{"id":1468,"href":"https:\/\/www.nathanhunstad.com\/blog\/wp-json\/wp\/v2\/posts\/1461\/revisions\/1468"}],"wp:attachment":[{"href":"https:\/\/www.nathanhunstad.com\/blog\/wp-json\/wp\/v2\/media?parent=1461"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nathanhunstad.com\/blog\/wp-json\/wp\/v2\/categories?post=1461"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nathanhunstad.com\/blog\/wp-json\/wp\/v2\/tags?post=1461"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}