// HOME — D4 Control (ported from WattIQ Home D4 Control.html)
window.SiteHome = function SiteHome() {
const sparkLine = React.useRef(null);
const sparkFill = React.useRef(null);
const kwRef = React.useRef(null);
const socRef = React.useRef(null);
const stageRef = React.useRef(null);
const svgRef = React.useRef(null);
const bubbleRef = React.useRef(null);
const legendRef = React.useRef(null);
const ticksRef = React.useRef(null);
React.useEffect(() => {
// Sparkline + tickers
let raf,t = 0;
const tick = () => {
t += 1;
if (!sparkLine.current) return;
const pts = [];
for (let i = 0; i < 40; i++) {
const x = i * 8;
const phase = t * 0.02 + i * 0.4;
const y = 40 + Math.sin(phase) * 14 + Math.sin(phase * 1.7) * 6;
pts.push(x.toFixed(1) + ',' + y.toFixed(1));
}
const ptsStr = pts.join(' ');
sparkLine.current.setAttribute('points', ptsStr);
sparkFill.current.setAttribute('points', '0,80 ' + ptsStr + ' 320,80');
const kw = (124 + Math.sin(t * 0.04) * 18).toFixed(1);
const soc = 78 + Math.round(Math.sin(t * 0.01) * 4);
if (kwRef.current) kwRef.current.firstChild.nodeValue = kw;
if (socRef.current) socRef.current.firstChild.nodeValue = soc;
raf = requestAnimationFrame(tick);
};
tick();
// Reveal observer
const io = new IntersectionObserver((entries) => {
entries.forEach((e) => {
if (e.isIntersecting) {e.target.classList.add('in');io.unobserve(e.target);}
});
}, { threshold: .12, rootMargin: "0px 0px -40px 0px" });
document.querySelectorAll('.d4home .reveal').forEach((el) => io.observe(el));
// Stopwatch ticks
if (ticksRef.current) {
let s = "";
for (let a = 0; a < 360; a += 6) {
if (a % 90 === 0) continue;
s += ` `;
}
ticksRef.current.innerHTML = s;
}
// Iso bubble logic
const MODULES = {
control: { num: "00", name: "Control", role: "EMS · brain", short: "Edge AI",
desc: "Edge-AI controller die alle modules op locatie aanstuurt. Voorspelt belasting, schakelt bronnen en logt elke kWh.",
specs: [["Hardware", "Edge-AI"], ["Connect", "4G/5G/LAN"], ["Update", "OTA"], ["Logging", "24/7"]],
anchor: { x: 320, y: 54, side: "below" } },
core: { num: "01", name: "Core", role: "Storage", short: "40–2.000 kWh",
desc: "Het batterijhart van de stack. Buffert pieken, levert basislast en reduceert generator-uren met tot 70%.",
specs: [["Capaciteit", "40–2.000 kWh"], ["Vermogen", "tot 500 kVA"], ["Behuizing", "IP54"], ["Cycli", "6.000+"]],
anchor: { x: 320, y: 290, side: "above" } },
ray: { num: "02", name: "Ray", role: "Solar", short: "Tot 30 kWp",
desc: "Vouwbare zonnepanelen die in minuten uitvouwen. Volledig draagbaar — geen vaste installatie nodig.",
specs: [["Vermogen", "tot 30 kWp"], ["Vorm", "Foldable"], ["Opzet", "< 10 min"], ["Connector", "MC4"]],
anchor: { x: 320, y: 180, side: "above" } },
fusion: { num: "03", name: "Fusion", role: "Hybrid backup", short: "60–200 kVA",
desc: "Hybride generator die alleen bijspringt als Core en Ray het niet redden. HVO-ready, tot 92% minder CO₂.",
specs: [["Vermogen", "60–200 kVA"], ["Brandstof", "HVO/diesel"], ["Emissie", "Stage V"], ["Modus", "Smart standby"]],
anchor: { x: 175, y: 425, side: "above" } },
grid: { num: "04", name: "Grid", role: "EV charging", short: "Tot 360 kW",
desc: "DC-snelladers gevoed vanuit Core. Laadt voertuigen op locaties zonder netaansluiting.",
specs: [["Vermogen", "tot 360 kW"], ["Connectoren", "CCS/CHAdeMO"], ["Voeding", "via Core"], ["Net", "niet vereist"]],
anchor: { x: 445, y: 425, side: "above" } }
};
const order = ["control", "core", "ray", "fusion", "grid"];
let activeKey = null;
const $legend = legendRef.current;
const $svg = svgRef.current;
const $stage = stageRef.current;
const $bubble = bubbleRef.current;
if (!$legend || !$svg || !$stage || !$bubble) return;
$legend.innerHTML = order.map((k) => {
const m = MODULES[k];
return `${m.num}
${m.short}
`;
}).join("");
const placeBubble = (key) => {
const m = MODULES[key];
const stageRect = $stage.getBoundingClientRect();
const svgRect = $svg.getBoundingClientRect();
const scale = svgRect.width / 600;
const ax = svgRect.left - stageRect.left + m.anchor.x * scale;
const ay = svgRect.top - stageRect.top + m.anchor.y * scale;
const bw = $bubble.offsetWidth || 280;
const bh = $bubble.offsetHeight || 160;
const tail = 14;
let left = ax;
const half = bw / 2;
left = Math.max(half + 8, Math.min(stageRect.width - half - 8, left));
if (m.anchor.side === "below") {
$bubble.classList.add("below");
$bubble.style.left = left + "px";
$bubble.style.top = ay + tail + "px";
} else {
$bubble.classList.remove("below");
$bubble.style.left = left + "px";
$bubble.style.top = ay - bh - tail + "px";
}
};
const setActive = (key) => {
if (key === activeKey) key = null;
activeKey = key;
$stage.querySelectorAll(".iso-group").forEach((g) => {
const k = g.getAttribute("data-mod");
g.classList.toggle("dim", activeKey && k !== activeKey);
g.classList.toggle("active", k === activeKey);
});
$legend.querySelectorAll(".li").forEach((b) => {
b.classList.toggle("active", b.getAttribute("data-mod") === activeKey);
});
if (!activeKey) {$bubble.classList.remove("show");return;}
const m = MODULES[activeKey];
$bubble.querySelector('.bb-num').textContent = m.num;
$bubble.querySelector('.bb-name').textContent = m.name;
$bubble.querySelector('.bb-role').textContent = m.role;
$bubble.querySelector('.bb-desc').textContent = m.desc;
$bubble.querySelector('.bb-specs').innerHTML =
m.specs.map(([k, v]) => `
${k} ${v}
`).join("");
$bubble.style.visibility = "hidden";
$bubble.classList.add("show");
requestAnimationFrame(() => {placeBubble(activeKey);$bubble.style.visibility = "visible";});
};
const handlers = [];
$stage.querySelectorAll("[data-mod]").forEach((el) => {
const h = (e) => {e.stopPropagation();setActive(el.getAttribute("data-mod"));};
el.addEventListener("click", h);
handlers.push([el, h]);
});
$legend.querySelectorAll("[data-mod]").forEach((el) => {
const h = (e) => {e.stopPropagation();setActive(el.getAttribute("data-mod"));};
el.addEventListener("click", h);
handlers.push([el, h]);
});
const closeBtn = $bubble.querySelector('.bb-close');
const closeH = () => setActive(activeKey);
closeBtn.addEventListener("click", closeH);
const resizeH = () => {if (activeKey) placeBubble(activeKey);};
window.addEventListener("resize", resizeH);
return () => {
cancelAnimationFrame(raf);
io.disconnect();
handlers.forEach(([el, h]) => el.removeEventListener("click", h));
closeBtn.removeEventListener("click", closeH);
window.removeEventListener("resize", resizeH);
};
}, []);
return (
{/* HERO */}
01 — Modulaire Energie · Bouw & Industrie
Energy, wherever you need it.
Modulaire energiesystemen die diesel vervangen en je volledige controle geven over stroom op locatie. Direct inzetbaar. EMS-aangestuurd. CO2-rapportage standaard.
50–500 kWh
Schaalbaar per locatie
20 min
Plug & play, geen installateur
−72%
CO2 t.o.v. diesel-baseline
CSRD
Aanbestedings-klaar uit de doos
SITE_07 · Rotterdam Centrum
● LIVE
Diesel uit · 14:22
−214 kg CO2 vandaag
Volgende cyclus
Solar peak 11:40 — 14:10
{/* PROBLEM */}
02 Probleem
Wat WattIQ vervangt, en waarom dat tijd werd.
Diesel is luid, vervuilend en duur. Vaste netaansluitingen zijn traag en inflexibel. De praktijk vraagt om iets daartussen.
Diesel — WattIQ Forge D60 (referentie)
{[
["01", "Kostprijs", "€0,80 / kWh inclusief logistiek", "Brandstof, transport, service en stilstand bij elkaar — diesel kost meer dan op de factuur staat."],
["02", "Geluid", "95 dB op 7 meter — 's nachts dicht", "Vergunning verloopt na zonsondergang. Klachten van omwonenden zijn de norm, niet de uitzondering."],
["03", "CO₂", "2,7 kg per liter, ongerapporteerd", "CSRD vraagt om cijfers die diesel niet kan leveren. Handmatig bijhouden is een nachtmerrie."],
["04", "Alternatief?", "Vaste infra: 12+ weken wachten", "Netcongestie + vergunning + graafwerk. Tegen die tijd is je bouwfase al door."]].
map((c) =>
)}
{/* REFRAME */}
03 Reframe
Een derde categorie, tussen diesel en vaste infra.
WattIQ is niet de goedkoopste batterij. Het is het meest controleerbare systeem.
Categorie A
Diesel
Direct beschikbaar Meeneembaar — Luid · vervuilend
Categorie B
Vaste infra
Stil · schoon Goedkope kWh — Traag · niet flexibel
De overlap
WattIQ
Direct & stil Schoon & meeneembaar EMS-aangestuurd CSRD-ready
Wat we behouden van diesel
Snelheid en mobiliteit
20 minuten op locatie, mee naar de volgende.
Wat we overnemen van vaste infra
Stil, schoon, slim
<55 dB, nul lokale emissies, real-time data.
Wat alleen WattIQ heeft
Eén integraal systeem
Core + Grid + Ray + Control — uit één hand, één dashboard.
{/* SYSTEM */}
04 Eén systeem
Niet een batterij. Een systeem.
Hoe de modules op locatie samenwerken — Core onderaan, Ray bovenop, Grid voor laden, Control overal doorheen.
DOC.04 / SHEET 01 — VERT. EXPL.
EXPLODED ASSEMBLY · INTERACTIVE
REV 02 · 2026
04 · GRID
03 · FUSION
CORE
01 · STORAGE
02 · RAY
CONTROL
EMS · L02
[02] [01]
[03] [04]
[00]
SCALE 1:NTS
VERTICAL EXPLODED · 5 MODULES
DRWN. WATTIQ ENG.
{/* STEPS */}
05 Hoe het werkt
Vier stappen. Geen installateur.
Maandag bellen. Dinsdag operationeel. EMS draait vanaf minuut één.
01
02
03
04
00H
+6H
+12H
+18H
01
T+0h
Locatie-analyseVermogen, kWh-profiel, piekbelasting
3 min
02
T+5h
Systeem op maatCore + Control + opties
~1 dag
03
T+22h
Plug & playLevering & aansluiting · geen vergunning
20 min
04
T+24h
Control in chargeMonitoring · optimalisatie · CO₂-rapport
vanaf min 1
{/* RESULT */}
Concrete cijfers, geen claims.
Eén nummer dat ertoe doet — en vier die het ondersteunen. Gemiddelde van 12 actieve WattIQ-deployments — bouw & verhuur, NL/BE, 2024–2025.
Hoofdmetriek · gem. n=12
−72%
Minder CO₂ per draaiuur dan een vergelijkbare diesel-set. Gemeten over 12 actieve deployments, 2024–2025.
Verified · CSRD scope 1 · WattIQ FY24–25
Brandstof
−62%
Liter diesel-equivalent per draaiuur, t.o.v. baseline.
Kostprijs / kWh
€0,28
All-in: brandstof, logistiek, service. Was €0,80.
ROI break-even
11mnd
Op een 18-maands bouwproject. 7 maanden netto.
Geluid (dB op 7m)
<55
Diesel ≈ 95 dB. Verschil > 40 dB = 16× zachter waargenomen.
Vandaag · diesel
Vandaag
Diesel · 95 dB · €0,80/kWh
Brandstoftruck om de 4 dagen. 's Nachts uit. Klachten van omwonenden.
Met WattIQ
Met WattIQ
200 kWh · < 55 dB · €0,28/kWh
Stil. 24/7 inzetbaar. CO2-rapport automatisch elke maandag.
{/* CTA — Two-Path (geport vanuit Situaties) */}
09 · TWEE PADEN
Wat past bij nu ?
Twee manieren om verder te gaan. Eén voor mensen die concreet zoeken; één voor mensen die eerst willen begrijpen.
{typeof Footer !== "undefined" ?
: null}
);
};