{"id":11103,"date":"2026-09-27T15:49:46","date_gmt":"2026-09-27T15:49:46","guid":{"rendered":"https:\/\/schindlerengineering.com\/public\/?p=11103"},"modified":"2026-09-27T15:49:46","modified_gmt":"2026-09-27T15:49:46","slug":"a-radio-up-the-hill-a-27-inch-kiosk-and-1000-amp-hours","status":"publish","type":"post","link":"https:\/\/schindlerengineering.com\/public\/2026\/09\/27\/a-radio-up-the-hill-a-27-inch-kiosk-and-1000-amp-hours\/","title":{"rendered":"A radio up the hill, a 27-inch kiosk, and 1,000 amp-hours"},"content":{"rendered":"<p>Three things are on the truck this week, and they are not related except that<br \/>\nthey are all the same project.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/schindlerengineering.com\/public\/wp-content\/uploads\/2026\/09\/three-builds.png\" alt=\"Three builds in flight\" style=\"max-width:100%;height:auto\" \/><\/p>\n<h2>1. Getting water-tank data down a wooded hill<\/h2>\n<p>The tanks sit a few hundred yards up a hill, in trees. At the bottom you can<br \/>\ncatch a wisp of Wi-Fi. At the top, nothing usable. No hard wire &mdash; it is over<br \/>\na hundred yards of ground I am not trenching.<\/p>\n<p>The instinct is to push <em>harder<\/em> at Wi-Fi. That is the wrong direction.<br \/>\nThe answer is to go <strong>lower in frequency<\/strong>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/schindlerengineering.com\/public\/wp-content\/uploads\/2026\/09\/hill-link-budget.png\" alt=\"LoRa versus Wi-Fi link budget through trees\" style=\"max-width:100%;height:auto\" \/><\/p>\n<p>Same distance, same trees, same antennas. The difference is physics: leaves are<br \/>\nfull of water, and water eats 2.4&nbsp;GHz. At 915&nbsp;MHz it walks through. And<br \/>\nLoRa&#8217;s receiver hears down to <strong>&minus;137&nbsp;dBm<\/strong>, roughly 5,000<br \/>\ntimes fainter than Wi-Fi can manage, because it trades bandwidth for sensitivity.<\/p>\n<p>That trade is free here. <strong>I need about ten bytes an hour.<\/strong> I could<br \/>\nalmost send it by banging on a pan.<\/p>\n<p>So: a pair of 915&nbsp;MHz LoRa nodes, an ultrasonic sensor looking down at the<br \/>\nwater, a small solar panel and a battery. No inverter &mdash; a typical inverter<br \/>\nidles at 5&ndash;20&nbsp;W, which is <em>a hundred times<\/em> what the radio draws.<br \/>\nIt would have been the largest load in the system by an order of magnitude, powering<br \/>\nnothing but itself.<\/p>\n<h2>2. A 27-inch touchscreen at the house<\/h2>\n<p>A kiosk. Home screen with everything worth seeing at a glance; tap anything and<br \/>\nit opens the deeper view. Inverters, battery, tank level, temperature and humidity,<br \/>\nheat and cooling control, settings.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/schindlerengineering.com\/public\/wp-content\/uploads\/2026\/09\/kiosk-architecture.png\" alt=\"One data pipe, many faces\" style=\"max-width:100%;height:auto\" \/><\/p>\n<p>The important part is the left side of that diagram, not the right. Every source<br \/>\nlands in <strong>one table<\/strong>, and the screens are just windows onto it. The<br \/>\ntouchscreen and the phone app read the same pipe, so they cannot disagree with each<br \/>\nother.<\/p>\n<p>And it is <strong>wired to the hardware<\/strong> &mdash; RS485 to the inverters,<br \/>\nEthernet to the Victron &mdash; not scraped out of a vendor cloud. That matters<br \/>\nbecause the clouds are slow and lossy: Victron&#8217;s HTTP endpoint hands you a reading<br \/>\nabout every 105 seconds no matter how nicely you ask, and the inverter portal answers<br \/>\na date query with today&#8217;s numbers regardless of the date. Both of those cost me a<br \/>\ncorrection on this blog already.<\/p>\n<h2>3. 1,000 amp-hours<\/h2>\n<p>The battery expansion hardware has landed: a 400&nbsp;A DC breaker, 2\/0 welding<br \/>\ncable, copper lugs. Ten 100&nbsp;Ah modules, 200&nbsp;A fusing each, a 900&nbsp;A<br \/>\nbusbar, four 2\/0 runs back to the inverters.<\/p>\n<h2>The unglamorous thing I found while writing this<\/h2>\n<p>I went to check what history the database had, so the kiosk would have months of<br \/>\ngraphs to draw. Here is the whole of it:<\/p>\n<pre>samples        1,456 rows   2026-09-10  ->  2026-09-12\nsamples_1min     110 rows   2026-09-12  ->  2026-09-12\nsamples_1hour     40 rows   2026-09-12  ->  2026-09-12<\/pre>\n<p><strong>The logger died on September 12 and nobody noticed for fifteen days.<\/strong><\/p>\n<p>The database is fine. The schema is genuinely good &mdash; a hypertable with<br \/>\nrollups at one minute and one hour, which is what makes a ninety-day query cheap.<br \/>\nPostgres and Grafana both run as proper Windows services and have been up the whole<br \/>\ntime.<\/p>\n<p>The thing that actually <em>writes the samples<\/em> was never installed as a<br \/>\nservice. It was run by hand once, and it died with the window it was running in.<\/p>\n<p>So I am about to build a beautiful dashboard for data I am not collecting. That<br \/>\nis the funny version. The real version is worse: <strong>history only accumulates<br \/>\nforward.<\/strong> Every day that collector stays down is a day of resolution that<br \/>\ncannot be recovered, at any price, ever. You cannot backfill a battery&#8217;s behaviour<br \/>\nat 3 a.m. on a night that has already happened.<\/p>\n<p>Which makes the priority order obvious, and it is not the touchscreen.<\/p>\n<p style=\"letter-spacing:0.4em\"><strong>O N W A R D<\/strong><\/p>\n<hr>\n<p><em>Link budget computed from free-space path loss at 400&nbsp;m plus published<br \/>\nfoliage attenuation figures, not measured &mdash; the real numbers get posted once<br \/>\nthe radios are on the hill. Everything else here is hardware that exists and is<br \/>\neither delivered or on a truck.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Three things are on the truck this week, and they are not related except that they are all the same project. 1. Getting water-tank data down a wooded hill The tanks sit a few hundred yards up a hill, in trees. At the bottom you can catch a wisp of Wi-Fi. At the top, nothing &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/schindlerengineering.com\/public\/2026\/09\/27\/a-radio-up-the-hill-a-27-inch-kiosk-and-1000-amp-hours\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;A radio up the hill, a 27-inch kiosk, and 1,000 amp-hours&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"nf_dc_page":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-11103","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/schindlerengineering.com\/public\/wp-json\/wp\/v2\/posts\/11103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/schindlerengineering.com\/public\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/schindlerengineering.com\/public\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/schindlerengineering.com\/public\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/schindlerengineering.com\/public\/wp-json\/wp\/v2\/comments?post=11103"}],"version-history":[{"count":1,"href":"https:\/\/schindlerengineering.com\/public\/wp-json\/wp\/v2\/posts\/11103\/revisions"}],"predecessor-version":[{"id":11104,"href":"https:\/\/schindlerengineering.com\/public\/wp-json\/wp\/v2\/posts\/11103\/revisions\/11104"}],"wp:attachment":[{"href":"https:\/\/schindlerengineering.com\/public\/wp-json\/wp\/v2\/media?parent=11103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/schindlerengineering.com\/public\/wp-json\/wp\/v2\/categories?post=11103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/schindlerengineering.com\/public\/wp-json\/wp\/v2\/tags?post=11103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}