{"id":736,"date":"2025-10-23T15:11:15","date_gmt":"2025-10-23T19:11:15","guid":{"rendered":"https:\/\/scootercam.net\/notes\/?p=736"},"modified":"2025-10-23T15:11:16","modified_gmt":"2025-10-23T19:11:16","slug":"how-scootercam-gets-its-data","status":"publish","type":"post","link":"https:\/\/scootercam.net\/blog\/how-scootercam-gets-its-data\/","title":{"rendered":"How Scootercam gets its data"},"content":{"rendered":"\n<p>Most of Scootercam&#8217;s data comes from data broker Visual Crossing. Visual Crossing collects its weather data from a blend of <strong>national meteorological services, global forecast models, radar and satellite sources<\/strong>, and a network of <strong>local weather stations<\/strong>. The platform then merges and normalizes these feeds to provide both <strong>historical and forecast data<\/strong> at fine spatial and temporal resolution. When Visual Crossing receives Scootercam&#8217;s query, it replies with a seemingly-endless JSON file. This is structured and contains thousands of little datapoints, like the expected high temp three days from now. Other scripts will find that number when they need it.<\/p>\n\n\n\n<p>The JSON output is typically structured with a <strong><code>locations<\/code><\/strong> object containing one or more <strong><code>values<\/code><\/strong> arrays\u2014each item representing an hourly or daily record with fields like <code>datetime<\/code>, <code>temp<\/code>, <code>humidity<\/code>, <code>windspeed<\/code>, <code>precip<\/code>, and weather condition codes or descriptions. A small portion is shown here. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"locations\": {\n    \"Fennville,MI,US\": {\n      \"stationContributions\": &#91;],\n      \"values\": &#91;\n        {\n          \"datetime\": \"2025-10-22\",\n          \"datetimeEpoch\": 1761110400,\n          \"tempmax\": 17.2,\n          \"tempmin\": 9.3,\n          \"temp\": 13.1,\n          \"feelslikemax\": 17.2,\n          \"feelslikemin\": 8.7,\n          \"humidity\": 72.1,\n          \"precip\": 1.2,\n          \"preciptype\": &#91;\"rain\"],\n          \"windspeed\": 14.4,\n          \"winddir\": 238,\n          \"cloudcover\": 68,\n          \"conditions\": \"Rain, Partially cloudy\",\n          \"description\": \"Partly cloudy throughout the day with periods of rain.\",\n          \"icon\": \"rain\",\n          \"sunrise\": \"07:59:00\",\n          \"sunset\": \"18:54:00\"\n        }\n      ],\n      \"id\": \"Fennville,MI,US\",\n      \"latitude\": 42.5931,\n      \"longitude\": -86.1048,\n      \"address\": \"Fennville, MI, United States\",\n      \"timezone\": \"America\/Detroit\",\n      \"tzoffset\": -4.0\n    }\n  }\n}\n<\/code><\/pre>\n\n\n\n<p>Other chunks of code can take care of sorting through this mess &#8211; we just have to make sure the file updates when it needs to.<\/p>\n\n\n\n<p>OK, Now what?<\/p>\n\n\n\n<p>In the old do-it-yourself system, CRON scripts ran every 2 minutes to do this. Not all web hosts allow you to run CRON jobs, especially every 2 minutes.  The solution is to have <em>another<\/em> service run a script every 2 minutes, and that script tells our scripts to run. <\/p>\n\n\n\n<p>Sound complicated?<\/p>\n\n\n\n<p>Maybe not! This should be a turnkey solution. As long as there&#8217;s a scootercam.net capable of receiving a little ping, this will work. Without delay, here&#8217;s <\/p>\n\n\n\n<h1 class=\"wp-block-heading\">ScooterCam Weather &amp; Moon Phase System<\/h1>\n\n\n\n<p><strong>A reliable, portable, easy-to-maintain data update system<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udce6 What&#8217;s in This Package<\/h2>\n\n\n\n<p>This is a complete <strong>cron-free update system<\/strong> for both weather and moon phase data, designed for low-traffic sites with maximum portability and ease-of-use.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Weather System Files (Updates every 5 minutes)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>wx-update.php<\/strong> &#8211; Secure webhook endpoint for weather updates<\/li>\n\n\n\n<li><strong>wx-status.php<\/strong> &#8211; Visual monitoring dashboard (weather only)<\/li>\n\n\n\n<li><strong>api-get-viscross.php<\/strong> &#8211; Your existing weather data fetcher (no changes needed)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Moon Phase System Files (Updates hourly)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>moon-update.php<\/strong> &#8211; Secure webhook endpoint for moon phase updates<\/li>\n\n\n\n<li><strong>api-get-moon.php<\/strong> &#8211; Moon phase data fetcher<\/li>\n\n\n\n<li><strong>wx-status-combined.php<\/strong> &#8211; Enhanced dashboard showing both weather AND moon data<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Diagnostic Tools<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>wx-install-check.php<\/strong> &#8211; One-time installation diagnostic (delete after setup)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Documentation<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>START-HERE.md<\/strong> &#8211; Overview and quick start guide<\/li>\n\n\n\n<li><strong>SETUP-CHECKLIST.md<\/strong> &#8211; Step-by-step setup checklist (weather)<\/li>\n\n\n\n<li><strong>MOON-SETUP.md<\/strong> &#8211; Step-by-step setup for moon phase system<\/li>\n\n\n\n<li><strong>ARCHITECTURE.md<\/strong> &#8211; Visual system diagrams and architecture<\/li>\n\n\n\n<li><strong>README.md<\/strong> &#8211; This file<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfaf What This Solves<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Your Old System (Cron-Based)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>Server Cron \u2192 Runs scripts every X minutes\n              \u2193\n         Problems:\n         \u274c Requires SSH\/terminal access\n         \u274c Doesn't work on low-traffic sites (WordPress cron)\n         \u274c Hard to move between hosting providers\n         \u274c Fails silently without notifications\n         \u274c Difficult for non-technical users to manage\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Your New System (Webhook-Based)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>Cron-Job.org (external) \u2192 Calls your webhook URLs\n                           \u2193\n                   wx-update.php or moon-update.php\n                           \u2193\n                   Runs your data fetchers\n                           \u2193\n                   Updates JSON files\n                           \u2193\n         Benefits:\n         \u2705 Works on ANY hosting provider\n         \u2705 Works on low-traffic sites\n         \u2705 Easy to move between hosts\n         \u2705 Email alerts when failures occur\n         \u2705 Visual monitoring dashboard\n         \u2705 Anyone can manage it\n         \u2705 Completely FREE!\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\ude80 Quick Start<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Which System Do You Want?<\/h3>\n\n\n\n<p><strong>Option 1: Weather Only<\/strong> (5 minutes) \u2192 Follow <strong>SETUP-CHECKLIST.md<\/strong><\/p>\n\n\n\n<p><strong>Option 2: Weather + Moon Phase<\/strong> (10 minutes) \u2192 Follow <strong>SETUP-CHECKLIST.md<\/strong> first, then <strong>MOON-SETUP.md<\/strong><\/p>\n\n\n\n<p><strong>Option 3: Just Want to Understand Everything<\/strong> \u2192 Read <strong>START-HERE.md<\/strong> for complete overview<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcca System Overview<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Weather System (Every 5 Minutes)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>Cron-Job.org\n    \u2193 (calls every 5 min)\nwx-update.php (verifies token)\n    \u2193\napi-get-viscross.php (fetches from Visual Crossing API)\n    \u2193\n\/wx\/*.json files updated\n    \u2193\nYour WordPress plugins display fresh data\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Moon Phase System (Every Hour)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>Cron-Job.org\n    \u2193 (calls every hour)\nmoon-update.php (verifies token)\n    \u2193\napi-get-moon.php (fetches from RapidAPI)\n    \u2193\n\/wx\/moon_api_data.json updated\n    \u2193\nYour site displays current moon phase\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Both Systems Are:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 Independent (separate tokens, separate schedules)<\/li>\n\n\n\n<li>\u2705 Monitored (email alerts for failures)<\/li>\n\n\n\n<li>\u2705 Logged (activity logs in \/wx\/ directory)<\/li>\n\n\n\n<li>\u2705 Portable (works on any hosting provider)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfa8 Key Features<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. External Monitoring (No Server Cron!)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uses <strong>Cron-Job.org<\/strong> (free service, no credit card)<\/li>\n\n\n\n<li>Calls your webhooks at scheduled intervals<\/li>\n\n\n\n<li>Sends email alerts if updates fail<\/li>\n\n\n\n<li>Works on ALL hosting providers (shared, VPS, cloud)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. Security<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Token-based authentication (separate tokens for each system)<\/li>\n\n\n\n<li>Protected endpoints (401\/403 errors for unauthorized access)<\/li>\n\n\n\n<li>Activity logging for audit trail<\/li>\n\n\n\n<li>Easy to rotate credentials<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3. Visual Monitoring<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>wx-status.php<\/strong> &#8211; Weather data dashboard<\/li>\n\n\n\n<li><strong>wx-status-combined.php<\/strong> &#8211; Combined weather + moon dashboard<\/li>\n\n\n\n<li>Color-coded health indicators (green\/yellow\/red)<\/li>\n\n\n\n<li>Shows last update times for all files<\/li>\n\n\n\n<li>Mobile-friendly responsive design<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4. Error Handling &amp; Logging<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Graceful failures (old data remains if API fails)<\/li>\n\n\n\n<li>Detailed error logging in \/wx\/ directory<\/li>\n\n\n\n<li>Clear error messages in responses<\/li>\n\n\n\n<li>Email notifications via Cron-Job.org<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5. Zero Maintenance<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Set it and forget it<\/li>\n\n\n\n<li>Automatic updates at scheduled intervals<\/li>\n\n\n\n<li>Email alerts only when issues occur<\/li>\n\n\n\n<li>No manual intervention needed<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udccb What You Get After Setup<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Weather System:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Weather data updates automatically every 5 minutes<\/li>\n\n\n\n<li>Files created\/updated in <code>\/wx\/<\/code> directory:\n<ul class=\"wp-block-list\">\n<li><code>current.json<\/code> &#8211; Current conditions<\/li>\n\n\n\n<li><code>hourly.json<\/code> &#8211; 48-hour forecast<\/li>\n\n\n\n<li><code>daily.json<\/code> &#8211; 7-day forecast<\/li>\n\n\n\n<li><code>alerts.json<\/code> &#8211; Weather alerts<\/li>\n\n\n\n<li><code>summary.json<\/code> &#8211; Compact summary<\/li>\n\n\n\n<li><code>weather.json<\/code> &#8211; Combined data<\/li>\n\n\n\n<li><code>weather_table.php<\/code> &#8211; HTML table<\/li>\n\n\n\n<li><code>raw_weather.json<\/code> &#8211; API backup<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Moon Phase System (Optional):<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Moon phase data updates automatically every hour<\/li>\n\n\n\n<li>File created\/updated: <code>\/wx\/moon_api_data.json<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Monitoring:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Status dashboard at: <code>scootercam.net\/wx-status.php<\/code> (or wx-status-combined.php)<\/li>\n\n\n\n<li>Activity logs: <code>\/wx\/webhook.log<\/code> and <code>\/wx\/moon-webhook.log<\/code><\/li>\n\n\n\n<li>Email alerts from Cron-Job.org if failures occur<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd27 Technical Details<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">System Requirements<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>PHP:<\/strong> 7.0 or higher (you already have this)<\/li>\n\n\n\n<li><strong>Web hosting:<\/strong> Any provider with file access (FTP\/cPanel)<\/li>\n\n\n\n<li><strong>Server access needed:<\/strong> None! (that&#8217;s the point!)<\/li>\n\n\n\n<li><strong>WordPress required:<\/strong> No (works with or without)<\/li>\n\n\n\n<li><strong>Database required:<\/strong> No<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">API Services Used<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Visual Crossing Weather API<\/strong> &#8211; Weather data (1000 free calls\/day)<\/li>\n\n\n\n<li><strong>RapidAPI Moon Phase<\/strong> &#8211; Moon phase data (your existing subscription)<\/li>\n\n\n\n<li><strong>Cron-Job.org<\/strong> &#8211; Scheduling service (free tier is sufficient)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">File Paths<\/h3>\n\n\n\n<p>All files should be in your website root (<code>public_html<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public_html\/\n\u251c\u2500\u2500 api-get-viscross.php    (your existing weather script)\n\u251c\u2500\u2500 api-get-moon.php        (your existing moon script)\n\u251c\u2500\u2500 wx-update.php           (NEW - weather webhook)\n\u251c\u2500\u2500 moon-update.php         (NEW - moon webhook)\n\u251c\u2500\u2500 wx-status.php           (NEW - status dashboard)\n\u251c\u2500\u2500 wx-status-combined.php  (NEW - combined dashboard)\n\u2514\u2500\u2500 wx\/                     (directory for data files)\n    \u251c\u2500\u2500 current.json\n    \u251c\u2500\u2500 hourly.json\n    \u251c\u2500\u2500 daily.json\n    \u251c\u2500\u2500 alerts.json\n    \u251c\u2500\u2500 summary.json\n    \u251c\u2500\u2500 weather.json\n    \u251c\u2500\u2500 weather_table.php\n    \u251c\u2500\u2500 raw_weather.json\n    \u251c\u2500\u2500 moon_api_data.json\n    \u251c\u2500\u2500 webhook.log\n    \u2514\u2500\u2500 moon-webhook.log\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd10 Security<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Two Independent Systems = Two Separate Tokens<\/h3>\n\n\n\n<p><strong>Weather Token<\/strong> (for wx-update.php):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Used to call weather webhook<\/li>\n\n\n\n<li>Should be different from moon token<\/li>\n\n\n\n<li>Change every 6 months<\/li>\n<\/ul>\n\n\n\n<p><strong>Moon Token<\/strong> (for moon-update.php):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Used to call moon phase webhook<\/li>\n\n\n\n<li>Should be different from weather token<\/li>\n\n\n\n<li>Change every 6 months<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Security Best Practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 Use strong random tokens (20+ characters)<\/li>\n\n\n\n<li>\u2705 Never commit tokens to version control<\/li>\n\n\n\n<li>\u2705 Store tokens in password manager<\/li>\n\n\n\n<li>\u2705 Don&#8217;t share tokens in support requests<\/li>\n\n\n\n<li>\u2705 Delete wx-install-check.php after setup<\/li>\n\n\n\n<li>\u2705 Monitor \/wx\/*.log files for suspicious activity<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcc8 Update Schedules<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Weather: Every 5 Minutes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Why?<\/strong> Weather changes frequently, especially during storms<\/li>\n\n\n\n<li><strong>API usage:<\/strong> ~8,640 calls\/month (well under 30,000\/month limit)<\/li>\n\n\n\n<li><strong>Data freshness:<\/strong> Always current<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Moon Phase: Every Hour<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Why?<\/strong> Moon phase changes very slowly<\/li>\n\n\n\n<li><strong>API usage:<\/strong> ~720 calls\/month<\/li>\n\n\n\n<li><strong>Data freshness:<\/strong> More than sufficient<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Can I Change These?<\/h3>\n\n\n\n<p><strong>Yes!<\/strong> Edit your Cron-Job.org schedules:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Weather: Can go up to every 1 minute (but wastes API calls)<\/li>\n\n\n\n<li>Moon: Could update every 6-12 hours (moon barely changes)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udd98 Troubleshooting Quick Reference<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Weather Not Updating?<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Check <code>scootercam.net\/wx-status.php<\/code> &#8211; Are files stale?<\/li>\n\n\n\n<li>Check Cron-Job.org dashboard &#8211; Is job enabled and running?<\/li>\n\n\n\n<li>Test manually: <code>scootercam.net\/wx-update.php?token=YOUR_TOKEN<\/code><\/li>\n\n\n\n<li>Check <code>\/wx\/webhook.log<\/code> for error messages<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Moon Phase Not Updating?<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Check <code>scootercam.net\/wx-status-combined.php<\/code> &#8211; Is moon data stale?<\/li>\n\n\n\n<li>Check Cron-Job.org dashboard &#8211; Is moon job enabled?<\/li>\n\n\n\n<li>Test manually: <code>scootercam.net\/moon-update.php?token=YOUR_MOON_TOKEN<\/code><\/li>\n\n\n\n<li>Check <code>\/wx\/moon-webhook.log<\/code> for error messages<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">&#8220;Unauthorized&#8221; or &#8220;Forbidden&#8221; Errors?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Token mismatch &#8211; verify token in PHP file matches token in URL<\/li>\n\n\n\n<li>Check for extra spaces or quotes in token<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Still Stuck?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Read <strong>ARCHITECTURE.md<\/strong> for system diagrams<\/li>\n\n\n\n<li>Check Cron-Job.org execution history<\/li>\n\n\n\n<li>Verify file permissions on <code>\/wx\/<\/code> directory (should be writable)<\/li>\n\n\n\n<li>Contact your hosting provider if file write issues persist<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\ude9a Migration to New Hosting<\/h2>\n\n\n\n<p>Moving to a new provider? <strong>Easy!<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What to Do:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Download<\/strong> all files from old host:\n<ul class=\"wp-block-list\">\n<li>All .php files<\/li>\n\n\n\n<li>Everything in \/wx\/ directory<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Upload<\/strong> to new host (same directory structure)<\/li>\n\n\n\n<li><strong>Update Cron-Job.org<\/strong> URLs:\n<ul class=\"wp-block-list\">\n<li>Change domain in both weather and moon job URLs<\/li>\n\n\n\n<li>Keep the same tokens<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Test<\/strong> both webhooks manually<\/li>\n\n\n\n<li><strong>Done!<\/strong> Everything continues working<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">No Configuration Changes Needed!<\/h3>\n\n\n\n<p>The system is <strong>completely portable<\/strong> &#8211; tokens stay the same, file paths are relative, everything just works.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcde Support &amp; Documentation<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">For Setup:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SETUP-CHECKLIST.md<\/strong> &#8211; Weather system setup (5 minutes)<\/li>\n\n\n\n<li><strong>MOON-SETUP.md<\/strong> &#8211; Moon phase system setup (5 minutes)<\/li>\n\n\n\n<li><strong>START-HERE.md<\/strong> &#8211; Complete overview<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">For Understanding:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ARCHITECTURE.md<\/strong> &#8211; Visual diagrams and flow charts<\/li>\n\n\n\n<li>This README &#8211; Technical details and reference<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">For Maintenance:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Monitor: <code>scootercam.net\/wx-status.php<\/code> or <code>wx-status-combined.php<\/code><\/li>\n\n\n\n<li>Logs: <code>\/wx\/webhook.log<\/code> and <code>\/wx\/moon-webhook.log<\/code><\/li>\n\n\n\n<li>Service: https:\/\/cron-job.org dashboard<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2728 What Makes This System Great<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">For You (Site Owner):<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 <strong>Set it and forget it<\/strong> &#8211; No manual updates needed<\/li>\n\n\n\n<li>\u2705 <strong>Email alerts<\/strong> &#8211; Know immediately if something breaks<\/li>\n\n\n\n<li>\u2705 <strong>Visual dashboard<\/strong> &#8211; See system health at a glance<\/li>\n\n\n\n<li>\u2705 <strong>Portable<\/strong> &#8211; Easy to move between hosting providers<\/li>\n\n\n\n<li>\u2705 <strong>Free<\/strong> &#8211; No additional costs beyond your existing APIs<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">For Future Maintainers:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 <strong>Comprehensive docs<\/strong> &#8211; Everything is explained clearly<\/li>\n\n\n\n<li>\u2705 <strong>Simple architecture<\/strong> &#8211; Easy to understand, few moving parts<\/li>\n\n\n\n<li>\u2705 <strong>No special skills needed<\/strong> &#8211; Anyone can monitor and maintain<\/li>\n\n\n\n<li>\u2705 <strong>Self-diagnosing<\/strong> &#8211; Status page shows what&#8217;s wrong<\/li>\n\n\n\n<li>\u2705 <strong>Quick recovery<\/strong> &#8211; Most issues fixed in under 5 minutes<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">For Reliability:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 <strong>External monitoring<\/strong> &#8211; Not dependent on your server<\/li>\n\n\n\n<li>\u2705 <strong>Multiple monitoring points<\/strong> &#8211; Dashboard, logs, emails<\/li>\n\n\n\n<li>\u2705 <strong>Graceful degradation<\/strong> &#8211; Old data remains if API fails<\/li>\n\n\n\n<li>\u2705 <strong>Automatic retry<\/strong> &#8211; Service retries if temporary failure<\/li>\n\n\n\n<li>\u2705 <strong>Independent systems<\/strong> &#8211; Weather and moon operate separately<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfaf Quick Reference Card<\/h2>\n\n\n\n<p><strong>Print this and keep it handy!<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502         SCOOTERCAM WEATHER &amp; MOON SYSTEM          \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Weather Status:  scootercam.net\/wx-status.php    \u2502\n\u2502 Combined Status: scootercam.net\/wx-status-       \u2502\n\u2502                  combined.php                     \u2502\n\u2502                                                   \u2502\n\u2502 Service:         https:\/\/cron-job.org             \u2502\n\u2502 Weather Updates: Every 5 minutes                  \u2502\n\u2502 Moon Updates:    Every hour                       \u2502\n\u2502                                                   \u2502\n\u2502 Weather Token:   &#91;write yours here]              \u2502\n\u2502 Moon Token:      &#91;write yours here]              \u2502\n\u2502                                                   \u2502\n\u2502 Weather Log:     \/wx\/webhook.log                  \u2502\n\u2502 Moon Log:        \/wx\/moon-webhook.log             \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 TROUBLESHOOTING:                                  \u2502\n\u2502 1. Check status page                             \u2502\n\u2502 2. Check Cron-Job.org dashboard                  \u2502\n\u2502 3. Test webhook manually (with token)            \u2502\n\u2502 4. Check log files                               \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcdd Version History<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Version 2.0 (October 2025) &#8211; Current<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2728 Complete webhook-based system (no cron needed)<\/li>\n\n\n\n<li>\u2728 Separate weather and moon phase systems<\/li>\n\n\n\n<li>\u2728 Visual monitoring dashboards<\/li>\n\n\n\n<li>\u2728 Comprehensive documentation<\/li>\n\n\n\n<li>\u2728 Installation diagnostic tool<\/li>\n\n\n\n<li>\u2728 Enhanced error handling and logging<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Version 1.0 (Previous)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Basic cron-based system<\/li>\n\n\n\n<li>Required server access<\/li>\n\n\n\n<li>Limited monitoring<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udf89 You&#8217;re All Set!<\/h2>\n\n\n\n<p>Once setup is complete, your system will:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 Update weather data automatically every 5 minutes<\/li>\n\n\n\n<li>\u2705 Update moon phase data automatically every hour (if installed)<\/li>\n\n\n\n<li>\u2705 Send email alerts if anything fails<\/li>\n\n\n\n<li>\u2705 Provide visual monitoring via status dashboards<\/li>\n\n\n\n<li>\u2705 Work reliably with zero maintenance<\/li>\n<\/ul>\n\n\n\n<p><strong>Start with SETUP-CHECKLIST.md to get going in 5 minutes! \ud83d\ude80<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Questions?<\/strong> Everything is documented &#8211; check the relevant .md file for detailed info!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Most of Scootercam&#8217;s data comes from data broker Visual Crossing. Visual Crossing collects its weather data from a blend of national meteorological services, global forecast models, radar and satellite sources, and a network of local weather stations. The platform then merges and normalizes these feeds to provide both historical and forecast data at fine spatial &#8230; <a title=\"How Scootercam gets its data\" class=\"read-more\" href=\"https:\/\/scootercam.net\/blog\/how-scootercam-gets-its-data\/\" aria-label=\"Read more about How Scootercam gets its data\">Read more<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[24],"tags":[],"class_list":["post-736","post","type-post","status-publish","format-standard","hentry","category-guides"],"_links":{"self":[{"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/posts\/736","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/comments?post=736"}],"version-history":[{"count":2,"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/posts\/736\/revisions"}],"predecessor-version":[{"id":738,"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/posts\/736\/revisions\/738"}],"wp:attachment":[{"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/media?parent=736"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/categories?post=736"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/tags?post=736"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}