Files
SITER-Solar/images/image-1.svg
Charles N Wyble 400764a9ff feat: initial project setup with bash-based NREL analysis
- Add bash script (siter-solar-analysis.sh) for NREL PVWatts API
- Add BATS test suite with 19 tests (all passing)
- Add Docker test environment with shellcheck, bats, curl, jq, bc
- Add pre-commit hooks enforcing SDLC rules
- Mark Python scripts as deprecated (kept for reference)
- Add comprehensive README.md and AGENTS.md documentation
- Add .env.example for configuration template
- Add .gitignore excluding private data (base-bill/, .env)
- Add SVG diagrams for presentation
- Redact all private location data (use SITER placeholder)

All work done following SDLC: Docker-only development, TDD approach,
conventional commits, code/docs/tests synchronized.

Generated with Crush

Assisted-by: GLM-5 via Crush <crush@charm.land>
2026-02-27 16:45:41 -05:00

162 lines
8.8 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 500">
<defs>
<linearGradient id="solarGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#f59e0b;stop-opacity:1" />
<stop offset="100%" style="stop-color:#d97706;stop-opacity:1" />
</linearGradient>
<linearGradient id="gridGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#3b82f6;stop-opacity:1" />
<stop offset="100%" style="stop-color:#1d4ed8;stop-opacity:1" />
</linearGradient>
<linearGradient id="batteryGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#10b981;stop-opacity:1" />
<stop offset="100%" style="stop-color:#059669;stop-opacity:1" />
</linearGradient>
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
<feDropShadow dx="2" dy="2" stdDeviation="3" flood-opacity="0.2"/>
</filter>
</defs>
<!-- Background -->
<rect width="800" height="500" fill="#f8fafc"/>
<!-- Title -->
<text x="400" y="35" text-anchor="middle" font-family="Arial, sans-serif" font-size="20" font-weight="bold" fill="#1e293b">SITER Solar System Architecture</text>
<!-- Sun -->
<circle cx="100" cy="120" r="40" fill="#fbbf24"/>
<g stroke="#fbbf24" stroke-width="3">
<line x1="100" y1="60" x2="100" y2="45"/>
<line x1="100" y1="180" x2="100" y2="195"/>
<line x1="40" y1="120" x2="25" y2="120"/>
<line x1="160" y1="120" x2="175" y2="120"/>
<line x1="55" y1="75" x2="45" y2="65"/>
<line x1="145" y1="165" x2="155" y2="175"/>
<line x1="55" y1="165" x2="45" y2="175"/>
<line x1="145" y1="75" x2="155" y2="65"/>
</g>
<text x="100" y="215" text-anchor="middle" font-family="Arial, sans-serif" font-size="12" fill="#64748b">Solar Radiation</text>
<text x="100" y="230" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#94a3b8">5.52 kWh/m²/day</text>
<!-- Solar Panels -->
<g filter="url(#shadow)">
<rect x="180" y="80" width="140" height="100" rx="8" fill="url(#solarGrad)"/>
<g fill="#92400e" opacity="0.3">
<rect x="190" y="90" width="25" height="35" rx="2"/>
<rect x="220" y="90" width="25" height="35" rx="2"/>
<rect x="250" y="90" width="25" height="35" rx="2"/>
<rect x="280" y="90" width="25" height="35" rx="2"/>
<rect x="190" y="130" width="25" height="35" rx="2"/>
<rect x="220" y="130" width="25" height="35" rx="2"/>
<rect x="250" y="130" width="25" height="35" rx="2"/>
<rect x="280" y="130" width="25" height="35" rx="2"/>
</g>
</g>
<text x="250" y="200" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="#1e293b">Solar Array</text>
<text x="250" y="218" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" fill="#64748b">16 × 250W = 4.0 kW DC</text>
<text x="250" y="233" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#94a3b8">Ground Mount, 30° Tilt</text>
<!-- Arrow Sun to Panels -->
<path d="M145 120 L175 120" stroke="#f59e0b" stroke-width="3" marker-end="url(#arrowOrange)"/>
<defs>
<marker id="arrowOrange" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
<path d="M0,0 L0,6 L9,3 z" fill="#f59e0b"/>
</marker>
</defs>
<!-- Inverter -->
<g filter="url(#shadow)">
<rect x="370" y="100" width="100" height="60" rx="6" fill="#475569"/>
<rect x="380" y="110" width="30" height="40" rx="2" fill="#1e293b"/>
<rect x="415" y="110" width="45" height="15" rx="2" fill="#22c55e"/>
<rect x="415" y="130" width="45" height="8" rx="1" fill="#3b82f6"/>
<rect x="415" y="142" width="45" height="8" rx="1" fill="#eab308"/>
</g>
<text x="420" y="180" text-anchor="middle" font-family="Arial, sans-serif" font-size="12" font-weight="bold" fill="#1e293b">Sol-Ark 5K</text>
<text x="420" y="195" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#64748b">Hybrid Inverter</text>
<!-- Arrow Panels to Inverter -->
<path d="M320 130 L365 130" stroke="#f59e0b" stroke-width="2" marker-end="url(#arrowOrange)"/>
<text x="342" y="122" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#64748b">DC</text>
<!-- Home -->
<g filter="url(#shadow)">
<rect x="540" y="70" width="120" height="90" rx="8" fill="#e2e8f0"/>
<polygon points="540,70 600,30 660,70" fill="#64748b"/>
<rect x="580" y="110" width="40" height="50" fill="#3b82f6" opacity="0.3"/>
<rect x="555" y="100" width="25" height="20" fill="#1e293b" opacity="0.2"/>
<rect x="620" y="100" width="25" height="20" fill="#1e293b" opacity="0.2"/>
</g>
<text x="600" y="180" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="#1e293b">SITER</text>
<text x="600" y="198" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#64748b">~2,000 kWh/month</text>
<!-- Arrow Inverter to Home -->
<path d="M470 130 L535 115" stroke="#22c55e" stroke-width="2" marker-end="url(#arrowGreen)"/>
<defs>
<marker id="arrowGreen" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
<path d="M0,0 L0,6 L9,3 z" fill="#22c55e"/>
</marker>
</defs>
<text x="502" y="115" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#64748b">AC</text>
<!-- Base Power Battery -->
<g filter="url(#shadow)">
<rect x="540" y="260" width="120" height="80" rx="8" fill="url(#batteryGrad)"/>
<rect x="590" y="250" width="20" height="10" rx="2" fill="#059669"/>
<rect x="555" y="280" width="90" height="15" rx="2" fill="#064e3b"/>
<rect x="555" y="280" width="70" height="15" rx="2" fill="#34d399"/>
<text x="600" y="318" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" fill="white">78%</text>
</g>
<text x="600" y="360" text-anchor="middle" font-family="Arial, sans-serif" font-size="12" font-weight="bold" fill="#1e293b">Base Power Battery</text>
<text x="600" y="378" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#64748b">+ Automatic Transfer Switch</text>
<!-- Arrow Home to Battery -->
<path d="M600 165 L600 255" stroke="#10b981" stroke-width="2" stroke-dasharray="5,3" marker-end="url(#arrowGreen)"/>
<text x="615" y="210" font-family="Arial, sans-serif" font-size="9" fill="#64748b">charge</text>
<!-- Grid -->
<g filter="url(#shadow)">
<rect x="370" y="260" width="100" height="80" rx="6" fill="url(#gridGrad)"/>
<g stroke="white" stroke-width="2" opacity="0.5">
<line x1="380" y1="280" x2="460" y2="280"/>
<line x1="380" y1="300" x2="460" y2="300"/>
<line x1="380" y1="320" x2="460" y2="320"/>
<line x1="400" y1="270" x2="400" y2="330"/>
<line x1="420" y1="270" x2="420" y2="330"/>
<line x1="440" y1="270" x2="440" y2="330"/>
</g>
</g>
<text x="420" y="360" text-anchor="middle" font-family="Arial, sans-serif" font-size="12" font-weight="bold" fill="#1e293b">Oncor Grid</text>
<text x="420" y="378" text-anchor="middle" font-family="Arial, sans-serif" font-size="10" fill="#64748b">Utility Delivery</text>
<!-- Arrow Inverter to Grid -->
<path d="M420 160 L420 255" stroke="#3b82f6" stroke-width="2" marker-end="url(#arrowBlue)"/>
<defs>
<marker id="arrowBlue" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
<path d="M0,0 L0,6 L9,3 z" fill="#3b82f6"/>
</marker>
</defs>
<text x="435" y="210" font-family="Arial, sans-serif" font-size="9" fill="#64748b">export</text>
<text x="435" y="220" font-family="Arial, sans-serif" font-size="8" fill="#94a3b8">@ $0.04/kWh</text>
<!-- Grid to Battery -->
<path d="M470 300 L535 300" stroke="#3b82f6" stroke-width="2" stroke-dasharray="5,3" marker-end="url(#arrowBlue)"/>
<text x="502" y="292" text-anchor="middle" font-family="Arial, sans-serif" font-size="9" fill="#64748b">backup</text>
<!-- Legend -->
<rect x="50" y="420" width="700" height="60" rx="6" fill="#f1f5f9"/>
<text x="400" y="440" text-anchor="middle" font-family="Arial, sans-serif" font-size="11" font-weight="bold" fill="#475569">Energy Flow</text>
<line x1="100" y1="460" x2="140" y2="460" stroke="#f59e0b" stroke-width="3"/>
<text x="150" y="464" font-family="Arial, sans-serif" font-size="10" fill="#64748b">DC Power</text>
<line x1="250" y1="460" x2="290" y2="460" stroke="#22c55e" stroke-width="3"/>
<text x="300" y="464" font-family="Arial, sans-serif" font-size="10" fill="#64748b">AC to Home</text>
<line x1="400" y1="460" x2="440" y2="460" stroke="#3b82f6" stroke-width="3"/>
<text x="450" y="464" font-family="Arial, sans-serif" font-size="10" fill="#64748b">Grid Export</text>
<line x1="550" y1="460" x2="590" y2="460" stroke="#10b981" stroke-width="2" stroke-dasharray="5,3"/>
<text x="600" y="464" font-family="Arial, sans-serif" font-size="10" fill="#64748b">Battery Charge</text>
</svg>