// ============================================================ // SIGEN CLOUD MONITOR -- Shelly Pro 2 // Polls Cloudflare Worker every 5 min for latest solar data. // Worker URL set in WORKER_URL below after deployment. // ============================================================ let WORKER_URL = "https://sigen-shelly-bridge.YOURNAME.workers.dev/data"; let VC = { pvPower: 200, batterySoc: 201, batteryPower: 202, gridPower: 203, loadPower: 204 }; function fetchAndUpdate() { Shelly.call("HTTP.GET", { url: WORKER_URL, timeout: 15 }, function(res, err) { if (err || !res || res.code !== 200) { print("[poll] error:", err, res && res.code); return; } let v; try { v = JSON.parse(res.body); } catch(e) { print("[poll] JSON err"); return; } if (!v || v.error) { print("[poll] no data:", v && v.error); return; } print("[poll] PV=" + v.pvW + "W SOC=" + v.socPc + "% Bat=" + v.batW + "W Grid=" + v.griW + "W Load=" + v.loadW + "W"); Virtual.getHandle("number:" + VC.pvPower ).setValue(v.pvW); Virtual.getHandle("number:" + VC.batterySoc ).setValue(v.socPc); Virtual.getHandle("number:" + VC.batteryPower).setValue(v.batW); Virtual.getHandle("number:" + VC.gridPower ).setValue(v.griW); Virtual.getHandle("number:" + VC.loadPower ).setValue(v.loadW); }); } // Poll every 5 minutes Timer.set(5 * 60 * 1000, true, fetchAndUpdate, null); // Also fetch immediately on start fetchAndUpdate(); print("Sigen monitor started, polling:", WORKER_URL);