- 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>
162 lines
8.8 KiB
XML
162 lines
8.8 KiB
XML
<?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> |