# @name PV Power # @desc Current PV output, SolarEdge SE10K-RWB48 # @author simpi # @version 1.0 class PV # Enter Site ID and API key here (SolarEdge Monitoring Portal: # Admin -> Site Access -> Access Control -> API Access) var siteId, apiKey var power, ticks, age def init() self.siteId = "SITE_ID" self.apiKey = "SOLAREDGE API TOKEN" self.power = store.get("power") self.ticks = 0 self.age = 9999 end def on_body(w, status) if w == nil return end # Use the PV field, not the net value (site may have a battery) var m = re.search("\"PV\":[^}]*\"currentPower\":([-0-9.]+)", w) if m == nil return end var kw = num(m[1]) if kw == nil return end self.power = kw * 1000.0 self.age = 0 store.set("power", self.power) end def loop() self.age += 1 if self.ticks <= 0 self.ticks = 900 http.get("https://monitoringapi.solaredge.com/site/" + self.siteId + "/currentPowerFlow.json?api_key=" + self.apiKey, / b, st -> self.on_body(b, st), {'find': "\"PV\":", 'keep': 100}) end self.ticks -= 1 end def draw() clear() if self.power == nil text(6, 6, "...", 0x666666) return end var p = self.power var label, col if p < 1 label = "0W" col = 0x666666 elif p < 500 label = str(int(p)) + "W" col = 0xFF7A27 elif p < 3000 label = str(int(p)) + "W" col = 0xFFCC00 elif p < 5000 var kw = p / 1000.0 label = str(int(kw)) + "." + str(int((kw - int(kw)) * 10)) + "kW" col = 0xFFFF28 else var kw = p / 1000.0 label = str(int(kw)) + "." + str(int((kw - int(kw)) * 10)) + "kW" col = 0x6ED228 end # small sun on the left, same fallback style as the weather script's icon circle_fill(4, 4, 3, 0xFFCC00) text(9 + int((22 - text_ink_width(label)) / 2), 7, label, col) if self.age > 2400 pixel(width() - 1, height() - 1, 0xFF0000) end end def on_button(btn) if btn == "select" self.ticks = 0 end end end return PV()