Release Notes: -------------------- 2.45 Release -------------------- UPGRADE CHECK FIX: - Fixed checkupgrades.sh corrupting hiveconfig.inc when GitHub rate-limits requests * When raw.githubusercontent.com returns a rate-limit/anti-scraping error page instead of file content, the HTML (including GitHub Terms of Service text with parentheses) was written into the database and then dumped into hiveconfig.inc * Bash syntax error on source: "unexpected token `('" from the TOS URL * Added is_valid_github_response() validation that rejects responses containing HTML tags, "terms of service", "scraping GitHub", or "rate limit" text * Added numeric format validation for VERSION content before writing to database * Script now exits cleanly with a log warning instead of corrupting the config * Reuses already-fetched upgrade.sh content instead of making a redundant curl call -------------------- 2.44 Release -------------------- CONFIG SYNC FIX (CRITICAL): - Fixed `let` arithmetic bug in hiveconfig.sh that corrupted string values (timezone, API keys) to 0 - Fixed same `let` bug in check.inc check_if_blank function — now uses printf -v for safe string assignment - Added missing jq extractions for KEY_TOMORROW and KEY_AMBEE from remote config JSON - Local-only fields (timezone, API keys, sensor GPIO/calibration, system paths, weather config) are now protected from remote overwrite — hivecontrol.org can only sync hive identity, bee management, and enable flags, not device-specific settings - Fixed VERSION drift: after remote-to-local sync, VERSION is set to MAX(local, remote)+1 to prevent re-import loops where remote falsely appears "newer" - Added config sync logging: local vs remote VERSION comparison logged for debugging - Fixed exit codes: config sync now exits 0 (success) instead of 1 (error) -------------------- 2.43 Release -------------------- API: - New unauthenticated JSON endpoint at /api/status.php for external reporting apps - Returns hive name, ID, location, and unit preference (metric/imperial) - Returns latest sensor readings (hive temp, humidity, weight, weather, air quality) - Returns 24-hour and 1-hour trends for weight and temperature (direction + delta) - Returns active alarms from the alert engine (high/low temp, robbing, swarm, honey flow, etc.) - CORS enabled for cross-origin access - Rate limited to 60 requests/min per IP to protect Pi resources - Respects metric/imperial display setting from hive configuration -------------------- 2.42 Release -------------------- TEMPERATURE CHART: - Added Brood Zone band (93-97°F / 34-36°C) to full temperature page charts - Added Danger band (100-120°F / 38-50°C) to full temperature page charts - Bands appear on both line and area chart views (matches dashboard climate chart) -------------------- 2.41 Release -------------------- RTSP FIX: - Fixed snapshot file owned by root — now chown to www-data after capture -------------------- 2.40 Release -------------------- UPGRADE CACHE FIX: - Added timestamp query-string cache buster to all GitHub raw URL fetches - Ensures checkupgrades.sh always gets the latest VERSION and upgrade.sh -------------------- 2.39 Release -------------------- RTSP FIX: - Removed -tls_verify flag (not supported on Raspbian ffmpeg) - rtsps:// should work without it — Pi ffmpeg skips TLS verification by default -------------------- 2.38 Release -------------------- RTSP CAMERA FIXES: - Fixed dashboard snapshot not generating for RTSP cameras * currconditions.sh now calls rtsp_snapshot.sh for RTSP camera type * Previously only handled USB/Pi cameras via mjpg_streamer - Added TLS support for rtsps:// URLs (self-signed certs on UniFi, etc.) * Both rtsp_snapshot.sh and rtsp_stream.sh now pass -tls_verify 0 - RTSP stream service auto-starts when camera is configured and saved - Service stops automatically when camera type is changed away from RTSP - Camera test button now shows ffmpeg errors instead of hiding them - Added /etc/init.d/rtsp_stream to sudoers for web UI service control -------------------- 2.37 Release -------------------- - Auto-start RTSP stream service on camera config save -------------------- 2.36 Release -------------------- DATABASE STABILITY: - Fixed "database is locked" (SQLITE_BUSY) errors during concurrent access - Enabled WAL (Write-Ahead Logging) journal mode for concurrent read/write support - Added 5-second busy_timeout to PHP database connections (retries instead of failing) - Added busy_timeout to shell scripts that write sensor data (currconditions, airnow) - Upgrade automatically enables WAL mode on existing databases -------------------- 2.35 Release -------------------- RTSP CAMERA STREAM: - New "RTSP Stream" camera type in instrument configuration * Enter an rtsp:// or rtsps:// URL from any IP camera * Stream is converted to HLS via ffmpeg for browser playback * Uses hls.js library — works in all modern browsers * ffmpeg uses codec copy (no transcoding) for minimal Pi CPU usage - Video page auto-detects camera type and shows HLS player or MJPEG - Dashboard snapshot captured from RTSP stream via ffmpeg - New init.d service (rtsp_stream) with watchdog auto-restart - VLC direct connect URL shown on video page for native RTSP playback DATABASE: - DB_PATCH_47: Added CAMERA_RTSP_URL column to hiveconfig table -------------------- 2.34 Release -------------------- SETUP WIZARD: - Added Zip Code field to Step 1 (Basic Info) for pollen and EPA AirNow - Zip code is used by pollen.com and AirNow APIs for location-based data INSTRUMENT CONFIG: - Added test buttons for weather, air quality, EPA AirNow, pollen, and camera * Each integration panel now has a Test button to verify it's working * Uses existing AJAX test infrastructure (livevalue.php) EPA AIRNOW FIX: - Fixed missing O3/ozone data from AirNow integration * Lat/lon API endpoint only returned nearest reporting area (e.g., Bridgeport PM2.5) and missed monitors in other areas (e.g., Westport ozone) * Now uses zip code API endpoint when ZIP is configured, which returns data from all reporting areas covering that zip code * Falls back to lat/lon endpoint when no zip code is set POLLEN: - Pollen test button now runs the full API pipeline with --test flag, bypassing the "already collected today" and "disabled" guards so new hives can verify pollen is working immediately - Added getpollen.sh to www-data sudoers whitelist - Version-gated sudoers update in upgrade.sh for existing hives UPGRADE SYSTEM: - Fixed checkupgrades.sh not picking up new upgrade.sh versions due to GitHub CDN caching — added Cache-Control: no-cache headers to all curl calls fetching from raw.githubusercontent.com DATABASE: - DB_PATCH_46: Added ZIP column to hiveconfig table -------------------- 2.32 Release -------------------- SETUP WIZARD: - Added "Exit to Dashboard" link in wizard header, visible on every step I2C SETUP FIX: - Fixed I2C not being enabled after fresh install on Pi 4 and Pi 5 * Old setup_i2c.sh appended dtparam lines to the end of config.txt, which could land inside conditional [pi4]/[cm4] sections and be ignored * Now uses raspi-config nonint do_i2c 0 which handles config.txt section placement correctly * Falls back to manual config.txt editing only when raspi-config is not present * Detects Pi 5 Bookworm config path (/boot/firmware/config.txt) * Removed i2c1_baudrate=10000 throttle that was unnecessary HIVE BODY CONFIGURATION FIX: - Fixed "Save Configuration" not working on newly installed hives * Weight input fields had step="0.1" which made browser HTML5 validation reject pre-populated values like 5.63 — changed to step="any" so any decimal is accepted * Added defensive auto-creation of hiveequipmentweight table and row * Added auto-creation of hive stack columns (HIVE_STACK_ORDER, SENSOR_TEMP_POSITION, SENSOR_TEMP_LABEL, FEEDER_HAS_SYRUP) * Changed INNER JOIN to LEFT JOIN for fresh install resilience * Added try/catch around save with user-visible error message -------------------- 2.31 Release -------------------- SETUP WIZARD: - Added AHT20 (I2C) and SHT41 Trinkey (USB) to temperature sensor selection - Added AHT20 and SHT41 Trinkey to local weather sensor type list BROODMINDER BLE DISCOVER: - New "Discover Devices" button in BroodMinder config panel * Runs 15-second BLE scan for nearby BroodMinder sensors * Displays found devices as clickable MAC address labels * Click a device to auto-fill the BLE address field * Available in both setup wizard and instrument config pages * New livevalue.php "blescan" endpoint for AJAX-driven scanning WEATHER FALLBACK API KEYS: - Fallback weather source dropdowns now show API key input when a key-required provider is selected (OpenWeatherMap, WeatherAPI, Visual Crossing, Pirate Weather) * Key input with signup link appears dynamically below dropdown * Pre-populates from existing key if previously entered * Values sync to primary-section form fields on save * Hidden when fallback matches primary (key field already visible) POLLEN CHART: - Pollen detail chart now shows blooming pollen types next to each dot * Data labels above markers display active pollen species * Tooltip enriched with "Blooming: ..." line SENSOR HEALTH DIAGNOSTICS: - Sensor health dashboard now shows a diagnostic reason when sensors report "No Data" or 0% uptime * Per-sensor hints (check wiring, API key, internet, etc.) * Weather/pollen/EPA sensors pull last error from weather_health table * Warning shown above "View Data" link in panel footer INSTALL FIX: - Fresh installs now apply DB patches 44-45 (ENABLE_POLLEN and FRAME_FEEDER columns) — fixes "no such column: ENABLE_POLLEN" error on newly installed hives - Updated DBVERSION from 35 to 45 -------------------- 2.30 Release -------------------- NEW SENSOR: ADAFRUIT AHT20 (I2C): - Custom zero-dependency Python driver using raw Linux I2C file descriptors - Auto-detects I2C bus by scanning /dev/i2c-* and probing for device at 0x38 - Works on Pi 4 and Pi 5 without pigpio, smbus2, or any pip packages - Bash wrapper with retry loop, validation, and dewpoint calculation - Wiring note on config page: "Ensure AHT20 is plugged into the TSL port (farthest port from the ethernet jack)" NEW SENSOR: ADAFRUIT SHT41 TRINKEY (USB): - Custom zero-dependency Python driver using stdlib termios for serial I/O - Trinkey connects via USB and presents as /dev/ttyACM0 (serial at 115200 baud) - Handles both factory firmware (4-field CSV) and simple firmware (2-field CSV) - No pyserial or other pip packages required - Bash wrapper with retry loop, validation, and dewpoint calculation - USB connection note on config page INSTRUMENT CONFIG: - Added AHT20 and SHT41 Trinkey to temperature sensor type selector - Conditional help blocks with wiring/connection guidance for each sensor -------------------- 2.29 Release -------------------- IN-HIVE FRAME FEEDER PLACEMENT: - New frame feeder placement indicator in hive body configuration * Select which hive body (deep, medium, or shallow) contains a frame feeder * Frame feeder renders as a black box inside the body in the SVG diagram * Feeder position and label saved to database alongside sensor placement * Dashboard diagram shows frame feeder in configured position SENSOR & FEEDER PLACEMENT UX REDESIGN: - Replaced confusing invisible click zones with explicit placement mode toolbar * "Place Sensor" and "Place Feeder" buttons in toolbar above the stack * Sensor mode: large dashed drop targets appear between components * Feeder mode: eligible body components highlight, non-eligible items dim * Yellow instruction banner explains what to click in each mode * Current placement shown with red highlight; click again to relocate * Escape key or re-clicking toolbar button cancels placement mode * Inline badges show current sensor/feeder positions in idle mode * Placement status indicators with one-click remove buttons in toolbar DATABASE RESILIENCE: - Dashboard diagram query uses SELECT * with try/catch to prevent crash when frame feeder columns are not yet in the database - Hive body config page auto-creates FRAME_FEEDER_POSITION and FRAME_FEEDER_LABEL columns on load if they don't exist - Frame feeder save wrapped in separate try/catch for old DB compatibility - DB patch 45 adds frame feeder columns via upgrade chain - schema_validate.sh ensures frame feeder columns exist -------------------- 2.28 Release -------------------- DASHBOARD CAMERA SNAPSHOT: - Dashboard sidebar shows a still image from the USB camera when enabled * Snapshot captured from mjpg_streamer (localhost:8080/?action=snapshot) each time currconditions.sh runs (every 15 minutes) * Saved to images/hive_snapshot.jpg with atomic write (tmp + mv) * "Hive Camera" panel appears below Hive Configuration in the sidebar * Shows capture timestamp and links to live stream (video.php) * Placeholder message shown before first snapshot is captured * Panel hidden entirely when ENABLE_HIVE_CAMERA is not 'yes' * Image cache-busted via filemtime query string to prevent stale display * Fails gracefully if mjpg_streamer is not running -------------------- 2.27 Release -------------------- VIDEO PAGE REDESIGN: - Replaced broken weather panel with live environmental data from database * Old panel referenced defunct Weather Underground API variables that were never defined — showed blank/empty values * New "Current Conditions" panel (green) queries allhivedata for latest: temperature, dew point, humidity, wind speed/direction/gusts, barometric pressure with trend, precipitation (hourly/daily), solar radiation and lux * New "Hive Conditions" panel (yellow) shows hive temp, humidity, weight * All values respect imperial/metric (SHOW_METRIC) toggle * Conditional rows — wind, pressure, precipitation, light sections only appear when data is available * Timestamp shows when data was last recorded - Removed inaccurate "This supports native MJPEG streaming" info banner * Stream is PHP-proxied, not direct MJPEG to browser - VLC direct connect URL moved to subtle note under the video frame - Uses Font Awesome 4.2-compatible icons throughout DB PATCH CHAIN ROBUSTNESS: - upgrade.sh and upgrade-dev.sh now suppress duplicate column errors * sqlite3 patch commands use 2>/dev/null || true so DBVERSION counter still advances when schema_validate.sh has already added columns -------------------- 2.25 Release -------------------- INSTRUMENT CONFIG REDESIGN: - Complete rewrite of instrumentconfig.php (1143 lines → 930 lines) * Replaced flat 6-column HTML table with 3-tab layout using Bootstrap 3 nav-tabs: Hive Sensors, Weather, Environment * Each sensor section is a collapsible panel with enable/disable toggle * Panels color-coded by sensor health status (green/yellow/red/gray) * Sensor health status badges at top of page from sensor_health_check.php * Removed auto-submit on every field change — explicit Save button instead * Unsaved changes warning with browser beforeunload prompt * Tab state persists across saves via hidden _active_tab field + URL hash * Success/error feedback alerts after save - Weather source configuration improvements * Client-side show/hide replaces server-side PHP conditional rendering * Provider-specific fields (API keys, station IDs) show only for selected source * Shared WXSTATION field rendered once with dynamic label text per provider (Station ID / Station MAC / Station Serial) * Fallback chain warnings for duplicate or same-as-primary selections * Free providers (Open-Meteo, NWS) show location from Hive Config with "no API key needed" messaging - Per-sensor AJAX test buttons via livevalue.php (no full page reload) - Auto-generated hidden field safety net replaces 48 hand-maintained hidden inputs - Added CSRF protection (require_csrf_token / csrf_field) - BroodMinder sensor type now shows correct help text: * Label: "BLE MAC Address" instead of "Device Path" * Placeholder: MAC format instead of /dev/hidraw path * Help: BM_Scan_bleak.py command instead of "tempered -e" - Helper functions h(), sel(), chk() for cleaner HTML output - Removed dead WX Underground modal and commented-out GPIO blocks POLLEN COLLECTION TOGGLE: - New ENABLE_POLLEN setting in Instrument Config → Environment tab * Enable/disable dropdown with collapsible panel body * When disabled: - Dashboard hides the pollen metric card - Sensor Health Dashboard hides the pollen sensor card - Instrument Config hides pollen status badge - getpollen.sh cron job exits early (no API calls) * Defaults to 'yes' — no behavior change for existing installs SCHEMA VALIDATION: - New scripts/data/schema_validate.sh ensures DB has all required columns * Reads PRAGMA table_info and adds any missing columns with defaults * Idempotent — safe to run multiple times * Runs automatically after the patch chain in upgrade.sh and upgrade-dev.sh * Fixes upgrades from older versions (e.g. 2.22) where the sequential patch chain starts too high and skips needed columns * Can be run standalone: sudo bash schema_validate.sh /path/to/hive-data.db * Covers all columns from DB_PATCH_35 through DB_PATCH_44 UPGRADE SYSTEM IMPROVEMENTS: - upgrade-dev.sh now self-updates from the cloned repo before finalizing * Previously the installed copy ran without updating itself, so new DB patches added in later pushes were never reached - upgrade.sh and upgrade-dev.sh both call schema_validate.sh after patches ICON FIXES (Font Awesome 4.2 compatibility): - Bundled Font Awesome is 4.2.0; replaced icons added in 4.4+/4.7+: * fa-thermometer-half → fa-fire (temperature/heat) * fa-balance-scale → fa-dashboard (weight gauge) * fa-industry → fa-flask (air quality) * fa-thermometer-full/empty → fa-fire (alerts) - Fixed across: sensor_health_check.php, instrumentconfig.php, setup-wizard.php, help pages, alert_engine.php, hive-diagram.js BUG FIXES: - Wrapped UPDATE query in try/catch to show error message instead of blank white screen on save failure - Guarded hiveconfig.ver read with file_exists() to prevent PHP warning on fresh deploys where the file hasn't been created yet - Guarded ENABLE_POLLEN query in currentconditions.php with try/catch so dashboard renders even before DB_PATCH_44 is applied DATABASE CHANGES: - DB_PATCH_44: Added ENABLE_POLLEN column to hiveconfig (default 'yes') (DB version 35 -> 36) -------------------- 2.24 Release -------------------- WX UNDERGROUND API MIGRATION: - Migrated from dead XML endpoint (api.wunderground.com) to new PWS API * Old endpoint killed by IBM — returns "Service Unavailable" * New endpoint: api.weather.com/v2/pws/observations/current (JSON) * Requires API key — free for PWS owners who upload data - Rewrote getwxxml.sh to use JSON API with jq parsing * Validates JSON response before extracting data * Uses shared wx_helpers.inc for unit conversions (f_to_c, in_to_mb, etc.) * Outputs standardized WunderGround-format JSON via output_wx_json() - Updated Instrument Config page for WX Underground selection * API KEY field now required when WX Underground is selected * Link to wunderground.com/member/api-keys for key retrieval * Station ID and API Key both shown with required indicators * API key stored securely in hiveconfig database DATABASE CHANGES: - DB_PATCH_43: Added WXAPIKEY column to hiveconfig (DB version 34 -> 35) -------------------- 2.23 Release -------------------- HIVE BODY CONFIGURATION REDESIGN: - Replaced spreadsheet-style table with visual hive builder * Two-panel layout: Component Palette (left) + Interactive Stack (right) * Click components to add them to the hive stack * jQuery UI Sortable drag-and-drop reordering * Click between components to place temperature sensor indicator * Real-time tare weight calculation updates as components change * Per-component weight inputs in the palette cards * Feeder syrup tracking toggle * Fixed weights section (Hive Top, Computer, Misc) separated from stack * Responsive layout for mobile/tablet - SVG hive diagram renders proportional stacked view * Components sized by type (deep=76px, medium=56px, shallow=42px, etc.) * Color-coded by category (covers=gray, bodies=wood tones, feeder=blue) * Frame lines and hand-hold details on body components * Screen mesh pattern on screened bottom board * Liquid level indicator on feeder when syrup present * Inner cover ventilation notch detail DASHBOARD HIVE VISUALIZATION: - New "Hive Configuration" panel in dashboard sidebar * Read-only SVG diagram of current hive stack * Temperature sensor shown at configured position with live reading * Feeder syrup level indicator * Click diagram to edit configuration * Falls back to "Configure Hive" link when no components configured - Reusable hive-diagram.js SVG rendering library shared by config page and dashboard widget DATABASE CHANGES: - DB_PATCH_42: Added hive body stack and sensor tracking * HIVE_STACK_ORDER (TEXT) — ordered component list, bottom-to-top * SENSOR_TEMP_POSITION (INTEGER) — stack position of temperature sensor * SENSOR_TEMP_LABEL (TEXT) — user-defined sensor label * FEEDER_HAS_SYRUP (INTEGER) — feeder syrup state tracking (DB version 33 -> 34) UPGRADE SCRIPT: - Added js/ and css/ directory copy to upgrade.sh for new web assets -------------------- 2.22 Release -------------------- BUG FIXES: - Fixed BroodMinder not collecting temperature data * Case-sensitive MAC address comparison in broodminder.sh failed because bleak BLE scan returns lowercase MACs but hiveconfig stores uppercase * Changed to case-insensitive comparison using ${var,,} lowercase conversion - Fixed non-numeric text being stored in database sensor fields * logger.inc loglocal() printed "No API Set, not sharing log data" to stderr * currconditions.sh captured stderr via 2>&1, contaminating sensor output * "No" stored as hivetempf, "API" stored as hiveHum * Removed the noisy stderr echo from loglocal (local DB logging still works) * Added sanitize_numeric() function in currconditions.sh that validates all sensor values before database INSERT — non-numeric values replaced with null -------------------- 2.21 Release -------------------- BUG FIXES: - Fixed GDD backfill producing seasongdd=0 when database is locked * backfill_from_openmeteo() running_total query used 2>/dev/null which silently swallowed DB lock errors from concurrent currconditions.sh * Empty result defaulted to 0 via ${running_total:-0}, causing inserted rows to have seasongdd=0 instead of the actual cumulative total * Replaced with 3-attempt retry loop (2s sleep between attempts) that aborts with a log message if all retries fail -------------------- 2.20 Release -------------------- DASHBOARD CHART OVERHAUL: - Replaced monolithic all-in-one chart with 5 focused dashboard charts * Hive Climate: temp + humidity with brood zone (93-97F) and danger zone plotBands, metric-aware thresholds * Weight & Stores: net/gross weight + rain area chart, alert-driven plotLines for swarm/robbing detection * Environment: Solar radiation + Lux on dual y-axes * Foraging Conditions (NEW): flight activity + wind with high-wind plotBand (>20mph/32kph warning zone) * Air Quality: PM2.5/PM10 concentrations + AQI with full EPA color-banded plotBands (Good/Moderate/USG/Unhealthy/Very Unhealthy) - Synchronized crosshairs across all 5 dashboard charts * Zoom on one chart zooms all charts to same time range * Shared tooltip format with color bullets and number formatting - Pre-built data arrays with automatic thinning * Data arrays built server-side via implode() instead of inline foreach * Automatic point thinning when dataset exceeds 800 points * Conditional markers: shown when <=200 points, hidden for larger datasets - Shared chart infrastructure (dashboard_chart_shared.php) * Common x-axis, tooltip, and exporting configuration * dashboardCharts array for cross-chart synchronization * include_once pattern prevents duplicate queries and JS declarations - Removed combined/split view toggle (combined view was redundant with focused charts providing better data density per chart) SIDEBAR IMPROVEMENTS: - Weight gauge: dynamic y-axis max (120% of actual weight, rounded to nearest 10) instead of hardcoded 200lb ceiling - System status: replaced bare buttons with Bootstrap label badges, added data freshness indicator (Live / Xm ago / Xh ago) with color coding GDD DETAIL PAGE: - Removed pollen series from GDD chart (pollen has its own dedicated page) HTML CLEANUP: - Removed 9 orphaned tags in index.php from previous layout refactor - Fixed misleading HTML comments (col-lg-6 → col-lg-8) -------------------- 2.19 Release -------------------- SECURITY FIXES: - Fixed CRITICAL SQL injection in all stats files (light_stats, gdd_stats, pollen_stats, air_stats, temp_stats, weight_stats, beecount_stats) * Switch statements with no default case allowed uninitialized $sqlperiod to be interpolated directly into SQL queries * Replaced with $period_map whitelist + PDO bound parameters (:p) - Fixed SQL injection in air_chart.php — converted to bound parameters - Added try/catch around EPA table queries in air_chart.php for pre-2.16 database compatibility BLUETOOTH / BROODMINDER FIXES: - Fixed bleak (BLE library) not installed on fresh installs * install.sh and install-raspberry-pi-5-64bit.sh still referenced legacy bluepy — replaced with bleak install chain - Fixed bleak not installed on upgrades from 2.17 to 2.18 * bleak install was in the < 2.17 upgrade block — moved to < 2.18 block - Added Bluetooth enable to install and upgrade scripts * systemctl enable --now bluetooth ensures service starts and persists * rfkill unblock bluetooth clears soft-block on Raspberry Pi - Added --break-system-packages flag for PEP 668 compatibility on newer Debian/Raspberry Pi OS versions UI/UX DETAIL PAGE REDESIGN: - Redesigned all detail pages with col-lg-8/col-lg-4 layout * Charts in main column (col-lg-8), stats/controls in sidebar (col-lg-4) * Applied to: air, temp, weight, beecount, light, gdd - Split air chart into two synchronized Highcharts * Top chart: PM2.5, PM10, PM1 concentrations (ug/m3) * Bottom chart: AQI index with EPA color-banded plotBands * Synchronized crosshairs and zoom between charts - Added contextual alert banners on detail pages * air.php: high PM2.5, smoke, high ozone alerts * temp.php: high/low temperature alerts * weight.php: swarm, robbing, honey flow alerts * beecount.php: swarm, robbing alerts - Added current reading cards on detail pages * Air: large AQI badge with EPA color coding and category label * Weight: net/gross weight with gain/loss trend indicator - Fixed fullscreen/air.php "Enlarge Chart" recursion — suppressed when already in fullscreen mode via $is_fullscreen flag BUG FIXES: - Fixed $current_pm25 uninitialized variable warning in air.php - Fixed get_page_alerts() returning sparse array — wrapped in array_values() - Fixed crosshair sync this binding in air_chart.php — replaced .bind(this) with local triggerChart variable - Fixed GDD page mislabeled as "Light Analysis" (copy-paste from template) - Fixed NULL comparison in temp_stats.php — changed hivetempf!='null' to hivetempf IS NOT NULL -------------------- 2.18 Release -------------------- BROODMINDER BLE INTEGRATION: - Migrated from bluepy (Python 2.7) to bleak (Python 3) async BLE library * New BM_Scan_bleak.py replaces legacy BM_Scan.py * Fixed byte offset bug: bleak strips 2-byte company ID, all indices shifted by -2 * Model-aware temperature decoding: model >= 47 (T2/TH2) uses (raw-5000)/100 formula instead of legacy SHT3x/HDC1080 formula * Supports all BroodMinder models: T, TH, W, T2/T2SM, W2/XLR, TH2/TH2SM * broodminder.sh updated to call BM_Scan_bleak.py via python3 - New BLE debugging tool (ble_debug.py) * Subcommands: scan, listen, info, read, bm * BroodMinder-specific scan with auto-decode of manufacturer data * Model name lookup, firmware version, realtime temperature for SwarmMinder devices CRON & LOGGING RELIABILITY: - Fixed silent cron failure when /home/HiveControl/logs/ directory missing * Bash aborts entire command when >> redirect target dir doesn't exist * Cron entries now include mkdir -p guard before script execution * install.sh creates logs directory during fresh install * upgrade.sh creates logs directory unconditionally (not version-gated) * currconditions.sh creates logs directory at startup as defense-in-depth DETAIL PAGE STATS FIX: - Fixed empty Stats panels on all detail pages (temp, weight, air, GDD, beecount, light) * Stats PHP files were in datawidgets/stats/ but includes pointed to datawidgets/ (missing stats/ subdirectory) * PHP include silently failed, leaving all stat variables empty * Corrected include paths in 6 detail pages; pollen.php was already correct DASHBOARD IMPROVEMENTS: - Pollen card now links to dedicated pollen analysis page (was linking to GDD) * New pollen.php with period buttons, area chart, and severity-banded plotBands * Stats sidebar with current level, severity, period avg/max/min * Fullscreen popup support - Pollen card color scheme differentiated from temperature card * None=hivebrown, Low=hiveyellow, Moderate=yellow, High=red - Added Pollen link to navigation menu (both dropdown and sidebar layouts) -------------------- 2.17 Release -------------------- SETUP WIZARD IMPROVEMENTS: - Geocoding & Interactive Map in Setup Wizard Step 1 * Type city/state and click "Look Up" to auto-fill latitude/longitude * Leaflet.js + OpenStreetMap interactive map shows pin at geocoded location * Drag pin to fine-tune coordinates — lat/lon fields update automatically * Server-side geocoding proxy (geocode.php) handles Nominatim API calls (avoids CORS issues and works without PHP curl module) * Custom yellow circle marker matching HiveControl theme - AirNow as Standalone Air Quality Source (Setup Wizard Step 7) * Users without PurpleAir can get PM2.5 and PM10 AQI from nearest EPA monitor * Configurable: enable/disable, API key, search distance (miles) * Test button validates API key and displays nearest monitor data DASHBOARD IMPROVEMENTS: - EPA PM2.5 AQI and PM10 AQI backup series on Air Quality chart * Falls back to EPA data when PurpleAir data is unavailable * EPA series shown alongside PurpleAir data for cross-validation - Alert Banner Alignment Fix * Alert banner now properly centered in wide layout mode using Bootstrap row/col wrapper BUG FIXES: - Fixed alert_engine.php crash on pre-2.16 databases * Changed specific column SELECT to SELECT * for backward compatibility * Added isset() guards for air quality threshold config fields * Wrapped EPA table query in try-catch for databases without airquality_epa * Prevents "no such column" PDOException on hives upgrading from pre-2.16 - Fixed sudoers installation to use /etc/sudoers.d/ drop-in approach * install.sh and upgrade.sh no longer modify /etc/sudoers directly * Eliminates "too many levels of includes" recursive inclusion error * Drop-in validated with visudo -c before activation - Fixed install.sh interactive prompt not pausing * dpkg-reconfigure tzdata was corrupting stdin for subsequent select/read * Bee counter prompt and reboot prompt now use < /dev/tty for clean input -------------------- 2.16 Release -------------------- NEW FEATURES: - Expanded Air Quality Data Pipeline * PurpleAir scripts now extract ATM-corrected mass concentrations (pm2_5_atm, pm10_0_atm, pm1_0_atm) and barometric pressure from BME280 * EPA AQI computation for PM2.5 and PM10 using standard breakpoint tables * 12-field CSV output from all air provider scripts (was 6 fields) * air_helpers.inc: shared AQI breakpoint functions (compute_aqi, pm25_to_aqi, pm10_to_aqi, o3_to_aqi, no2_to_aqi, aqi_to_category, aqi_to_color) - EPA AirNow Integration (O3 & NO2) * New getairnow.sh script fetches hourly O3, NO2, PM2.5, PM10 AQI from EPA AirNow API (free, 500 req/day) * Back-calculates approximate O3 ppm and NO2 ppb from AQI breakpoints * Stored in new airquality_epa table with automatic deduplication * Configurable via Instrument Config admin page (enable/disable, API key, search radius) * Runs hourly via cron at minute 30 - Air Quality Correlation Charts * New Bee Impact Correlations page (air_correlation.php) with period selection * Foraging Activity vs Air Quality chart: bee count (IN+OUT) overlaid with PM2.5 AQI and O3 AQI, EPA color-banded y-axis * Daily Weight Change vs Average AQI: column chart with configurable smoke threshold line * EPA Pollutant Detail chart: O3 ppm, NO2 ppb, and AQI series with reporting area label - Enhanced Air Quality Chart * Main air chart now shows PM2.5, PM10, PM1 concentrations on primary axis * AQI on secondary axis with EPA color-banded plotBands (Good/Moderate/USG/Unhealthy/Very Unhealthy/Hazardous) * O3 and NO2 AQI series from EPA data when available * Backward compatible with pre-upgrade data (falls back to legacy air_aqi) - Air Quality Stats Panel * Expanded stats sidebar: PM2.5 stats (avg, max/min, AQI), PM10 stats, EPA O3/NO2 AQI stats (shown conditionally when data available) - Air Quality Alerts * High PM2.5 alert when concentration exceeds threshold (default 35.5 ug/m3) * Wildfire smoke detection when PM2.5 AQI exceeds smoke threshold (default 150) * High ozone alert when O3 AQI exceeds threshold (default 100) * All thresholds configurable in hiveconfig - Cloud Sync for Air Quality * 7 new air data fields synced to hivecontrol.org (pm2_5_aqi, pm10_aqi, pm2_5_raw, pm10_raw, pm1_raw, pressure, source) * AirNow config (KEY_AIRNOW, ENABLE_AIRNOW, AIRNOW_DISTANCE) synced in all 3 cloud locations (POST vars, UPDATE SQL, SEND config) DATABASE CHANGES: - DB_PATCH_39: 7 new columns on allhivedata (air_pm2_5_aqi, air_pm10_aqi, air_pm2_5_raw, air_pm10_raw, air_pm1_raw, air_pressure, air_source) and 12 new columns on hiveconfig (KEY_AIRNOW, AIRNOW_DISTANCE, ENABLE_AIRNOW, alert thresholds, chart colors, trend toggles) (DB version 30 -> 31) - DB_PATCH_40: New airquality_epa table for EPA gaseous pollutant data with indexes on date and (date, source) (DB version 31 -> 32) -------------------- 2.15 Release -------------------- NEW FEATURES: - Modern Pollen Data Provider Chain * Complete rewrite of getpollen.sh (v2.0) replacing 2016-era web scraping * Primary provider: pollen.com API (US/ZIP-based, returns 0-12 index) * Fallback #1: Tomorrow.io (global, requires API key, 0-5 scale mapped to 0-12) * Fallback #2: Open-Meteo Air Quality (Europe only, species-based pollen counts) * Fallback #3: Ambee (global, requires API key) * Automatic backfill: fills gaps from pollen.com historical and Open-Meteo * Health logging to weather_health table for provider diagnostics * Old claritin-based scripts archived to deprecated/ directory - Pollen API Key Management * Added Tomorrow.io (KEY_TOMORROW) and Ambee (KEY_AMBEE) API key fields * Configurable via Instruments admin page under new "Pollen Data" section * Keys synced to hivecontrol.org via cloud sync (hiveconfig.sh) DASHBOARD IMPROVEMENTS: - Added Pollen Card to Dashboard * New 5th card in top row showing current pollen level (0-12 scale) * Dynamic color coding: green (low), gold (moderate), red (high) * Shows pollen severity label and predominant pollen types * Custom pollen.png icon * Custom col-lg-fifth CSS class for 5-column equal-width layout BUG FIXES: - Fixed pollen chart series in gdd_chart.php rendering GDD data instead of pollen data (was iterating $result instead of $result3) - Fixed pollen axis labels showing pressure units (mb/in) instead of plain values - Fixed XSS vulnerability in 9 chart popup calls across 7 chart widget files (beecount_chart, temp_chart, weight_chart, air_chart, light_chart, all_chart, gdd_chart) — all now use htmlspecialchars() DATABASE CHANGES: - DB_PATCH_38: Added KEY_TOMORROW and KEY_AMBEE columns to hiveconfig table (DB version 29 -> 30) -------------------- 2.14 Release -------------------- NEW FEATURES: - Weather Reliability System * Cascading fallback with per-provider health tracking * weather_health table logs success/failure per provider per day * Providers automatically deprioritized after repeated failures * Configurable per-provider API keys (KEY_OPENWEATHERMAP, KEY_WEATHERAPI, KEY_VISUALCROSSING, KEY_WEATHERFLOW) - GDD (Growing Degree Days) Refactoring * Improved calculation accuracy and data pipeline * Better seasonal accumulation tracking - Alert System * Hive alert engine detects high/low temperature, robbing, swarming, and honey flow conditions * Alert banner on dashboard shows active alerts with severity levels * Dashboard cards change color based on alert state (temp card turns red/yellow, weight card turns red for robbing, green for honey flow) * 1-hour trend deltas shown on temperature and humidity cards - Setup Wizard * New first-run setup wizard guides users through initial configuration * Dashboard auto-redirects to wizard if hive name/location not configured * Streamlined onboarding for new installations - Split/Combined Chart View * Dashboard charts can be viewed as 3 focused panels (Climate, Weight, Environment) or 1 combined all-in-one chart * View preference saved to localStorage * Toggle buttons in chart toolbar DASHBOARD IMPROVEMENTS: - Added trend indicators (arrows) on temperature and humidity cards showing 1-hour rate of change - Weight card shows trend text (Rapid loss, Possible swarm, Honey flow) - Alert-aware card coloring reflects current hive conditions DATABASE CHANGES: - DB_PATCH_35: Alert system tables - DB_PATCH_36: Weather health tracking (weather_health table, cascading fallback columns) - DB_PATCH_37: Per-provider API key columns (KEY_OPENWEATHERMAP, KEY_WEATHERAPI, KEY_VISUALCROSSING, KEY_WEATHERFLOW) (DB version 26 -> 29) -------------------- 2.13 Release -------------------- NEW FEATURES: - Weather API Fallback System * New WEATHER_FALLBACK config option enables automatic failover * If primary weather source fails, system tries fallback source automatically * Supports any cloud-based weather source as fallback (Open-Meteo, NWS, OpenWeatherMap, WeatherAPI, Visual Crossing) * Fallback attempts logged with WARNING/ERROR levels for troubleshooting * Configurable via Instruments page dropdown - Refactored Weather Dispatcher (getwx.sh) * Complete rewrite from 316 to 145 lines with modular functions * Extracted init_wx_vars(), call_wx_provider(), parse_wx_json() * Unified JSON parsing with legacy CSV fallback for older scripts * Cleaner provider dispatch via case statement - Modernized Legacy Weather Scripts * getAmbientAPI.sh: 185 to 135 lines, uses wx_helpers.inc shared library * getWeatherFlowLocal.sh: 219 to 176 lines, uses shared unit conversions * getwxxml.sh: 153 to 108 lines, uses shared direction/output functions * All three scripts now use degrees_to_cardinal(), output_wx_json(), and shared unit conversion functions instead of inline duplicated code - Increased Data Collection Frequency * Changed currconditions.sh interval from 60 minutes to 15 minutes * Weight monitor offset to 5,20,35,50 to prevent lock contention with currconditions at 0,15,30,45 * Captures more granular data for better trend analysis DASHBOARD IMPROVEMENTS: - Added data point markers to all Highcharts line charts * Small circle markers (radius 2) now visible along trend lines * Applied to: temperature, weight, air quality, bee count, GDD, light, all-sensors, and past-week charts * Makes individual readings visible when zoomed in HELP DOCUMENTATION: - Complete rewrite of weather help page (help/weather.php) * Documents all 10 weather sources with setup instructions * Recommends Open-Meteo as default (free, no API key required) * New Weather Fallback section explaining automatic failover * Updated decision tree and troubleshooting guide BUG FIXES: - Fixed uninitialized variables in purpleairlocal.sh * TRYCOUNTER and DATA_GOOD now initialized before while loop * Prevents undefined variable warnings and potential infinite loops DATABASE CHANGES: - DB_PATCH_34: Added WEATHER_FALLBACK column to hiveconfig table -------------------- 2.12 Release -------------------- NEW FEATURES: - Multi-Source Weather API Support * Added 5 new weather sources: Open-Meteo, OpenWeatherMap, NWS (weather.gov), WeatherAPI.com, and Visual Crossing * Shared helper library (wx_helpers.inc) for unit conversion and JSON output * All sources output standardized WunderGround-format JSON * NWS auto-discovers nearest station from lat/lon with 24-hour caching * Organized weather dropdown in instrumentconfig.php with optgroups - Automatic Weight Drift Compensation * Auto-calibration runs weekly at 5am using nighttime readings (midnight-5am) * Simple on/off toggle in both setup wizard and instrument config * No manual SSH calibration required — system self-calibrates from operational data * Requires 50+ nighttime samples with 5°F+ temperature variation * Displays calibration status, R² value, and coefficients in admin UI GPIO MIGRATION: - Migrated from pigpio to lgpio for all Raspberry Pi models * New DHTXXD_lgpio.py reads DHT22/DHT11 sensors using lgpio with busy-wait edge detection and perf_counter_ns() for microsecond-precision timing * Works on Pi 3, 4, 5, and all modern kernels (Bookworm/Trixie) * Fallback chain: kernel IIO driver > lgpio Python > DHTXXD pigpio binary * Updated dht22.sh, dht21.sh, wxdht22.sh, wxdht21.sh * Install scripts no longer compile pigpio or start pigpiod * Upgrade path removes pigpio and pigpiod cron entry * Removed pigpiod @reboot from hivetool.cron SETUP WIZARD: - Added environmental drift compensation toggle to Step 3 (Weight Scale) - Added drift compensation status to Step 8 review summary - Fixed setup wizard redirect loop (dashboard link now works) - Fixed fresh install defaults: Chart Round=on, Chart Smoothing=on, Site Layout=Wide, Site Type=Compact BUG FIXES: - Fixed instrumentconfig.php weather source links pointing to siteconfig.php instead of hiveconfig.php where lat/lon fields actually live DATABASE CHANGES: - Added WEIGHT_LAST_CALIBRATED and WEIGHT_CALIBRATION_R2 columns to hiveconfig -------------------- 2.11 Release -------------------- NEW FEATURES: - Weight Drift Compensation System * Environmental compensation reduces weight drift caused by temperature and humidity changes on the load cell and mechanical components * Multivariate linear regression model: compensated = net - (alpha * delta_temp) - (beta * delta_humidity) * Uses cached ambient weather station data (not hive-internal sensors) * Configurable via admin Instruments page (enable/disable, view coefficients) - High-Frequency Weight Monitor (weight_monitor.sh) * Lightweight 15-minute cron job dedicated to weight sampling * Runs independently of currconditions.sh (hourly full sensor sweep) * Stores readings in new weight_readings table with raw, net, and compensated values * flock-based mutual exclusion prevents concurrent HX711 GPIO access - Trimmed Mean Sampling for HX711 Weight Sensor * Collects 50 samples, discards top and bottom 10%, averages remaining 40 * Reduces noise from electrical spikes and ADC jitter * Implemented in both HX711.py (Pi 4 pigpio) and HX711_lgpio.py (Pi 5+ lgpio) - Calibration Workflow (calibrate_env_compensation.sh + compute_compensation.py) * Place a static test weight on the scale and run calibration for 24-48 hours * Automatically collects weight/temp/humidity samples via weight_monitor.sh * Computes least-squares regression coefficients when calibration is stopped * Requires R-squared >= 0.3 to enable compensation (rejects weak correlations) * Writes coefficients directly to hiveconfig database BUG FIXES: - Fixed infinite retry loop in getweight.sh (wrong variable name in counter increment) - Fixed time.sleep race condition in HX711_lgpio.py when valid_after is in the past - Added flock to currconditions.sh get_hive_weight() for safe concurrent access with weight_monitor.sh DATABASE CHANGES: - DB_PATCH_33: Added weight_readings table with indexes on date, date_utc, hiveid - DB_PATCH_33: Added calibration_data table for compensation calibration samples - DB_PATCH_33: Added 6 columns to hiveconfig: WEIGHT_TEMP_COEFF, WEIGHT_HUMIDITY_COEFF, WEIGHT_REF_TEMP, WEIGHT_REF_HUMIDITY, WEIGHT_COMPENSATION_ENABLED, WEIGHT_MONITOR_INTERVAL ADMIN UI: - Added Weight Drift Compensation section to Instruments configuration page - Shows current compensation status, coefficients, and reference values -------------------- 2.10 Release -------------------- NEW FEATURES: - Added Easy Installation System * Created easy-install.sh: One-command installer eliminating need for chmod * Installation reduced from 3 commands to 1 simple command: curl -sSL https://raw.githubusercontent.com/rcrum003/HiveControl/master/easy-install.sh | sudo bash * Added EASY_INSTALL_GUIDE.md: Complete beginner's guide from SD card imaging to running system - Step-by-step Raspberry Pi OS 5 installation instructions - How to use Raspberry Pi Imager with screenshots - WiFi and SSH configuration walkthrough - Sensor connection guide - Comprehensive troubleshooting section * Added DOWNLOAD_INSTRUCTIONS.md: All installation methods with comparisons - One-line installation (recommended for beginners) - Manual download and run (for code review) - Git clone method (for developers) - What happens during installation explained * Added QUICK_REFERENCE.md: Printable one-page reference card - Common commands and system control - Web interface quick links - Sensor testing commands - File locations and pin connections - Troubleshooting quick fixes * Created download.html: Beautiful web-based download page - Interactive installation method selector - Copy-to-clipboard buttons for commands - Visual step-by-step guides - Links to all documentation * Updated README.md with simplified installation instructions - Prominent easy installation section - Clear options for different features - Links to comprehensive guides * Added PACKAGING_IMPROVEMENTS.md: Complete documentation of all improvements * Addresses user feedback that "chmod u+x and multiple commands are too hard" * Makes HiveControl accessible to non-technical beekeepers - Added Backup & Restore System (backup.php) * Create full database backups (60MB+ databases supported) * Create configuration-only backups for quick settings preservation * Restore from any backup with automatic safety backup before restore * Download backups to local computer * Delete old backups to manage storage * All operations logged with user IP tracking * Protected backup directory with .htaccess deny rules * Optimized for large databases using file copy instead of SQL export * Updated navigation menus to include "Backup & Restore" option - Added Admin Password Management System (changepassword.php) * Change admin password through web interface * Current password verification required * Minimum 8 character password requirement * Password confirmation to prevent typos * Supports multiple Apache htpasswd hash formats (APR1, bcrypt, SHA1, crypt) * All password changes logged with IP tracking - Added Comprehensive Help Documentation System * Created central help.php with topic-based navigation * Added 13 comprehensive help topics covering all system features * Topics include: Overview, Initial Setup, Basic Settings, Instruments & Sensors, Calibration, Weather Sources, Dashboard Guide, Hive Components, Site Preferences, System Commands, Backup & Restore, Change Password, and Troubleshooting * Professional styling with Font Awesome icons and Bootstrap UI * Step-by-step guides with visual indicators * Code examples and configuration instructions * Best practices and recommendations for each feature area * Added Help link to navigation menu (both wide and normal orientations) WEB APPLICATION SECURITY FIXES: - Fixed CRITICAL SQL injection vulnerabilities in admin interface * loglocal() function now uses parameterized queries instead of string interpolation * removezero command uses strict column name whitelisting (hivetempf, hiveHum, hiveweight, IN_COUNT) * Message queue operations converted to parameterized queries * All database operations now use PDO prepared statements with ? placeholders * Prevents database manipulation, data theft, and privilege escalation - Fixed HIGH severity XSS (Cross-Site Scripting) vulnerabilities * All log output properly escaped with htmlspecialchars() in getlog() function * Error messages properly escaped in system.php command handling * Database content escaped before display to prevent script injection * Prevents session hijacking, credential theft, and malicious JavaScript execution - Implemented CSRF (Cross-Site Request Forgery) protection * All POST forms now include cryptographically secure CSRF tokens * Token validation required before processing sensitive operations * Implemented in backup.php, changepassword.php, and other admin forms * Session-based token storage with automatic regeneration * Prevents unauthorized actions from malicious websites - Improved session security configuration * HTTPOnly cookies prevent JavaScript access to session IDs * SameSite=Strict prevents cross-site request attacks * Strict session mode rejects uninitialized session IDs * Session ID regenerated every 5 minutes to prevent session fixation * 1-hour session timeout (configurable in security-init.php) * Note: session.cookie_secure disabled by default (enable if using HTTPS) - Fixed HIGH severity IP spoofing vulnerability * getUserIP() now only trusts REMOTE_ADDR for accurate logging * Removed trust of HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP headers * Prevents attackers from forging IP addresses in logs * Command injection via IP spoofing no longer possible - Removed plaintext password exposure in hiveconfig.php * Hivetool.org password field no longer pre-filled in forms * Password not visible in HTML source code or browser memory * Update logic preserves existing password if field left empty * Prevents password theft via shoulder surfing or page source inspection - Fixed information disclosure vulnerabilities * Database connection errors now logged instead of displayed to users * Error messages sanitized to prevent information leakage * Prevents attackers from learning database structure or credentials - Added comprehensive security headers * X-Frame-Options: DENY (prevents clickjacking attacks) * X-Content-Type-Options: nosniff (prevents MIME type sniffing) * Referrer-Policy: strict-origin-when-cross-origin (limits referrer information) * Content-Security-Policy with restrictions on script/style sources - Created centralized security initialization system * New /include/security-init.php file for all security configuration * Reusable CSRF protection functions: csrf_field(), verify_csrf_token(), require_csrf_token() * Automatic session management with secure defaults * Easy to maintain and extend security features Files Modified for Security: * /admin/system.php - SQL injection, XSS, IP spoofing, CSRF protection * /admin/changepassword.php - SQL injection, IP spoofing, CSRF protection * /admin/backup.php - SQL injection, IP spoofing, CSRF protection * /admin/hiveconfig.php - Plaintext password removal * /include/db-connect.php - Error disclosure prevention * /include/security-init.php - NEW FILE with session and CSRF configuration Security Documentation: * SECURITY_AUDIT_2026-01-17.md - Complete vulnerability assessment * SECURITY_FIXES_APPLIED_2026-01-17.md - Detailed fix documentation with testing procedures BUG FIXES: - Fixed temperature validation to allow valid 0-degree readings * Updated all_chart.php to remove != 0 check from temperature validation * Temperature values of exactly 0 degrees now display correctly on charts * Applies to both hive temperature and weather temperature readings - Fixed instrumentconfig.php blank screen issue on form submission * Added hidden input fields for all 39 required form validation fields * Ensures all fields are present in POST data even when conditionally hidden * Form now properly validates and reloads instead of showing blank screen - Fixed siteconfig.php blank screen issue with checkbox validation * Added PHP preprocessing to set unchecked checkboxes to empty string * Handles 18 checkbox fields: trend lines, chart options, and SHOW_METRIC * Unchecked checkboxes now properly pass validation - Fixed hiveconfig.inc generation failures on fresh installations * Removed stub file from git tracking and added to .gitignore * Added file size validation (<100 bytes triggers regeneration) * Changed INNER JOIN to LEFT JOIN for defensive database queries * Added source command to load config variables into shell environment * Fixes hive registration failures due to undefined variables (POWER, INTERNET, STATUS, COMPUTER) - Fixed footer display issues in web interface * Corrected malformed HTML structure in footer.php (changed from