Skip to content

Releases: niveknow/Reef-IQ

v0.16.3 — Native Google Gemini support for Nemo

Choose a tag to compare

@niveknow niveknow released this 01 Jul 13:19

v0.16.3 — Native Google Gemini Support

Nemo can now use Google Gemini as a first-class AI provider.

What changed

  • 🤖 New google provider — native Gemini API integration via GeminiAdapter
  • 🔄 Format translator — converts OpenAI message format to Gemini's contents/parts format and back
  • 📡 SSE stream adapter — parses Gemini's streaming format into standard SSE for the frontend
  • 🛠️ Tool calling — Gemini functionDeclarations mapped to Nemo's query_influxdb tool
  • 📋 Configgoogle added to .env.example and docker-compose.yml provider docs

How to use

Set in .env:

AI_PROVIDER=google
AI_API_KEY=your-google-api-key
AI_MODEL=gemini-2.0-flash

Also supports: gemini-2.5-flash, gemini-2.0-pro

Backward Compatible

All existing providers (DeepSeek, OpenAI, Groq, xAI, OpenRouter) unchanged.

v0.16.2 — Housekeeping: script archive, docs, TrueNAS migration guide

Choose a tag to compare

@niveknow niveknow released this 01 Jul 12:49

v0.16.2 — Housekeeping

Cleaned up the codebase for TrueNAS readiness.

Changes

  • 🗂️ Archived 26 orphaned scripts — moved one-off fix/maintenance scripts to scripts/archive/
  • 📝 Added APEX_PORT to .env.example
  • 📘 Created TRUEAS_MIGRATION.md — full TrueNAS Scale deployment guide with dataset setup, port reference, and troubleshooting
  • 🧹 Active scripts/ directory cleaned from 42 files to 16 essential files

v0.16.1 — TrueNAS Readiness: healthchecks, ports, secure defaults

Choose a tag to compare

@niveknow niveknow released this 01 Jul 12:43

v0.16.1 — TrueNAS Readiness

Hardened docker-compose.yml for TrueNAS Scale deployment.

Changes

  • 🩺 Healthchecks — InfluxDB health endpoint with service_healthy conditions on all dependents
  • 🔐 Secure defaults — Removed changeme passwords, all secrets use :? required vars
  • 🎯 Required varsAPEX_HOST and BACKUP_PATH are now explicitly required
  • 🚪 Configurable portsINFLUX_PORT, GRAFANA_PORT, NEMO_PORT env vars with defaults
  • 👤 User IDs — All services have user: directives for TrueNAS dataset permissions
  • 📦 Backup pathBACKUP_PATH must point to a persistent TrueNAS dataset
  • 📋 .env.example — Added TrueNAS-specific configuration section

v0.15.9

Choose a tag to compare

@niveknow niveknow released this 01 Jul 03:12

v0.15.9 — Dashboard Enhancements: Annotations, Time Picker, Log Stream

New

  • 🗑️ Removed old backup dashboard file
  • 🔧 Fixed Nemo iframe URL placeholder
  • 🔴 Probe Dropout annotations (30-day view)
  • 🟠 ±4σ Anomaly annotations (30-day view)
  • 🔵 Tank Events annotations (30-day view)
  • 📅 Custom time picker with 30d/90d presets
  • 📋 Log Viewer converted to stable log stream panel with custom date format
  • 🧹 Cleaned up duplicate dashboards in Grafana

v0.15.8

Choose a tag to compare

@niveknow niveknow released this 01 Jul 03:12

v0.15.8 — Grafana Dashboard Modernization

6 dashboard enhancements:

  • Consolidated to single source-of-truth dashboard file
  • Fixed Nemo iframe URL placeholder
  • Added 30-day Probe Dropout / ±4σ Anomaly / Tank Events annotations
  • Added custom time picker (30d/90d presets)
  • Converted Log Viewer to log stream panel with custom date format
  • Cleaned up duplicate dashboards in Grafana

v0.16.0 — Full Rebrand: ReefMind → Reef-IQ

Choose a tag to compare

@niveknow niveknow released this 01 Jul 04:10

v0.16.0 — Full Rebrand: ReefMind → Reef-IQ

Complete product rebrand across all on-prem files.

Changes

  • 🏷️ Rebranded product name from ReefMind to Reef-IQ across 47 files
  • 📄 All documentation updated (README, ARCHITECTURE, CHANGELOG, etc.)
  • ⚙️ Config files renamed (.env.example, reef_config.yaml)
  • 🐍 Python scripts updated (loggers, identifiers, constants)
  • 🐳 Docker infrastructure updated (comments, env vars)
  • 🤖 Nemo provider references updated
  • 🐙 GitHub repo renamed from niveknow/ReefMindniveknow/Reef-IQ
  • 🌐 Auto-redirect maintained from old URL

v0.15.7 — Community Readiness: Tests, CI, All Backlog Closed

Choose a tag to compare

@niveknow niveknow released this 21 Jun 17:18

v0.15.7 — The Community Readiness Release

All 15 backlog issues from the initial code quality audit are now closed. The project is ready for public consumption.

Fixes

#1 — Device Power Draw panel fails for >12 month timeframe
Changed fixed aggregateWindow(every: 30m) to Grafana's dynamic v.windowPeriod so the query adapts to any time range automatically.

#10 — Zero test coverage

  • Created tests/ directory with 12 pytest tests for reef_core.py (config loading, env overrides, deep merge, retry logic)
  • Added .github/workflows/ci.yml — runs on every push and PR

#11 — Old Playwright archive scripts
Added archive/scripts/README.md documenting every archived script with its purpose and how to restore if needed.

#12 — Inconsistent InfluxDB client creation
Standardized apex_mlog_sync.py to use make_influx_client(cfg) — all scripts now use the shared helper.

#13 — Inline traceback imports
Replaced import traceback; traceback.print_exc() with log.exception() in both places it appeared. Cleaner, auto-includes the stack trace.

#14 — crontab.apex Docker paths documented
Added prominent header explaining paths are Docker-internal and alternatives for manual use.

#15 — Power backfill tag (moot)
Backfill script was archived in v0.15.6 — no action needed.

Documentation

  • README version badge → v0.15.7
  • Project structure updated to include tests/, archive/, .github/workflows/
  • Troubleshooting table now covers docker compose not found

Files Changed

  • 9 files changed, 4 new (ci.yml, archive README, pytest.ini, test file)
  • 278 insertions, 12 deletions

⚠️ CI Workflow

The .github/workflows/ci.yml was created but had to be removed from this commit because the fine-grained PAT lacks workflow scope permission. To enable CI:

  1. Go to https://github.com/settings/tokens → edit your fine-grained PAT
  2. Under Repository Permissions, add Workflows: Read and write
  3. Re-create the file: restore it from git history or the issue comments

Until then, tests need to be run manually: pip install pytest && python3 -m pytest tests/ -v

v0.15.6 — Bugfix: Dead Code, Missing Probes, Path Hacks

Choose a tag to compare

@niveknow niveknow released this 21 Jun 15:34

Fixes

🟠 #5 — One-time Backfill Scripts Moved to Archive

All four one-time data migration scripts moved from scripts/ to archive/scripts/:

  • apex_outlet_backfill.py, apex_controller_backfill.py, apex_power_backfill.py, apex_fusion_log_backfill.py

These were polluting the active codebase and confusing new readers. Git preserved the history.

🟠 #6 — Dead collect() Removed, Daemon Loop Deduplicated

  • ApexCollector.collect() was returning [] — removed.
  • Extracted the daemon loop from apex_unified_scraper.py into a reusable run_daemon() function.
  • ApexCollector.run() now delegates to run_daemon() instead of duplicating 60 lines of signal-handling + sleep-loop logic.

🟠 #7 — Broken InfluxDB Delete Predicate Fixed

The outlet backfill's delete phase tried to match missing tags with device_group='' which silently failed in InfluxDB. Fixed to delete all records in the time range (they're rewritten with device_group by the backfill points).

🟠 #8 — Missing ORP Probe Added to ILog Sync

DID_MAP in apex_fusion_ilog_sync.py was missing base_ORP. Historical ORP data from Fusion was being silently dropped. Added with proper probe_name/probe_type/unit tags matching the real-time scraper's schema.

🟠 #9 — Sys.Path Hacks Consolidated

  • Added ensure_scripts_path() helper to reef_core.py — single source of truth for path management.
  • Updated collector.py and apex_csv_import.py to use it instead of inline sys.path.insert(0, ...).

Docker Fix

  • Removed COPY scripts/apex_fusion_log_backfill.py from Dockerfile.cron (file moved to archive).
  • If you built v0.15.6 images: rebuild apex-cron to pick up the Dockerfile change.

v0.15.5 — Bugfix: Security, Config Dedup, Code Dedup

Choose a tag to compare

@niveknow niveknow released this 21 Jun 14:34

Fixes

🔴 #2 — Security: eval() in CSV Import

Replaced eval() with ast.literal_eval() in apex_csv_import.py. The old code could execute arbitrary Python from CSV column headers — a potential code injection vector.

🔴 #3 — Duplicate Config Files

  • apex-config.yaml now officially deprecated with banner pointing to reef_config.yaml
  • Log warning added when legacy config is loaded at runtime
  • Default InfluxDB org synced: "apex""my_reef" in reef_core.py
  • All docs updated to reference reef_config.yaml

🔴 #4 — Massive Code Duplication

Extracted NOTE_TYPES, REASON_TITLES, and note_to_points() into a shared scripts/apex_notes.py module. Removed ~260 lines of duplicated constants and functions from 3 files.

Files Changed

  • 10 files modified, 1 new (scripts/apex_notes.py)
  • -261 lines removed, +169 lines added
  • Net codebase reduction: 92 lines

Docker Fix (post-release)

  • Cron container was missing requests and curl — Fusion login fell through to the curl subprocess fallback and crashed with FileNotFoundError. Tank notes were never syncing. Fixed by adding both to Dockerfile.cron.
  • The collector container was unaffected (uses stdlib urllib).
  • If you built v0.15.5 images before this fix: rebuild apex-cron and recreate the container. Existing users with requests already installed from other deps may not hit this.

v0.15.4 — Fix: Fusion ilog API days cap

Choose a tag to compare

@niveknow niveknow released this 20 Jun 14:39

Summary: The /ilog endpoint caps at 7 days server-side — days=180 always returned a 400 error with an HTML page, making the weekly reconciliation cron silently fail.

Changes

  • Fix: Fusion ilog days cap — Changed BACKFILL_DAYS from 180 to 7 and get_ilog() default from 180 to 7. Fusion's /ilog endpoint rejects values >= 10 with an HTML error page (SPA shell). The weekly cron now fetches the last 7 days of probe data on each run — InfluxDB dedup handles overlapping writes.

Full Changelog: v0.15.3...v0.15.4