# @name EcoTrackerMonitor # @desc Stromverbrauch+Zählerstände eines EcoTracker IR von Everhome # @author Töm (taschenserver im Discord) # @version 0.4 # @config ecotracker_ip text "EcoTracker Netzwerkadresse/IP-Adresse" default=ecotracker.local maxlen=253 # @config refreshrate number "Datenaktualisierungrate" default=5 min=2 max=600 unit=Sek. # @config duration number "Anzeigedauer" default=5 min=1 max=600 unit=Sek. # @config hold_powercounter number "Zählerstand-/WLAN-Infos Dauer (mittlere Taste)" default=10 min=2 max=600 unit=Sek. # @config max_cons number "Max. Stromverbrauch pro Phase" default=3600 min=0 max=3600 unit=Watt # @config max_feed_in number "Max. Einspeisung pro Phase" default=3600 min=0 max=3600 unit=Watt # @config WiFi_signal_strength bool "Indikator WLAN-Signalstärke anzeigen" default=true # @config power_consumption color "Stromverbrauch" default=0xFF0000 # @config power_feed_in color "Einspeisung" default=0x00FF00 # @config zero_power_consumption color "0-Verbrauch" default=0x666666 class EcoTrackerMon var url, ssid, phases, eCO, eCI, eCI1, eCI2 var power, rssi, ticks, eStatticks, max_cons, max_feed_in, busel def _color_from_value(value) var m = value < 0 ? store.get("max_feed_in",3600) : store.get("max_cons",3600) var c = value < 0 ? store.get("power_feed_in",0x00FF00) : store.get("power_consumption",0xFF0000) value = value < 0 ? -value : value if value > m value = m end if value == 0 value = int(store.get("zero_power_consumption",0x666666)) else var f = 0.30 + 0.70 * (real(value) / m) var r = int(((c >> 16) & 0xFF) * f) var g = int(((c >> 8) & 0xFF) * f) var b = int(( c & 0xFF) * f) value = (r << 16) | (g << 8) | b end return value end def init() self.power = nil self.rssi = nil self.ssid = nil self.phases = [0,0,0] self.ticks = 0 self.busel = 0 self.eStatticks = 0 end def on_body(body, status) if body == nil return end var d = json.load(body) if !isinstance(d, map) return end self.power = d.find("power") self.rssi = d.find("rssi") self.ssid = d.find("ssid") self.phases[0] = d.find("powerPhase1") self.phases[1] = d.find("powerPhase2") self.phases[2] = d.find("powerPhase3") self.eCO = d.find("energyCounterOut") self.eCO = self.eCO == nil ? nil : round(real(self.eCO)/1000,1) self.eCI = d.find("energyCounterIn") self.eCI = self.eCI == nil ? nil : round(real(self.eCI)/1000,1) self.eCI1 = d.find("energyCounterIn1") self.eCI1 = self.eCI1 == nil ? nil : round(real(self.eCI1)/1000,1) self.eCI2 = d.find("energyCounterIn2") self.eCI2 = self.eCI2 == nil ? nil : round(real(self.eCI2)/1000,1) end def duration() return store.get("duration",5)*1000 end def loop() var url = "http://"+store.get("ecotracker_ip", "192.168.178.99")+"/v1/json" if self.ticks <= 0 self.ticks = store.get("refreshrate",5) http.get(url, / b, st -> self.on_body(b, st)) end self.ticks -= 1 if self.eStatticks <= 0 self.busel = 0 else self.eStatticks -= 1 end end def draw() var t, tcol clear() # Powercounter if self.busel != 0 t = [] if self.busel == 1 t.push(["1.8.0: ",0xAAAAAA]) t.push([str(self.eCI)+" kWh",0xFFFFFF]) if self.eCI1 != nil t.push([" 1.8.1: ",0xAAAAAA]) t.push([str(self.eCI1)+" kWh",0xFFFFFF]) end if self.eCI2 != nil t.push([" 1.8.2: ",0xAAAAAA]) t.push([str(self.eCI2)+" kWh",0xFFFFFF]) end if self.eCO != nil t.push([" 2.8.0: ",0xAAAAAA]) t.push([str(self.eCO)+" kWh",0xFFFFFF]) end # WIFI-Info elif self.busel == 2 t.push(["WIFI: ",0xAAAAAA]) if self.rssi != nil t.push([str(self.rssi)+ " dbm",0xFFFFFF]) end if self.ssid != nil t.push([" SSID: ",0xAAAAAA]) t.push([self.ssid,0xFFFFFF]) end end font("large") scroll_text(t,0xFFFFFF,{"mode":"loop","gap":8,"repeat":10}) return end # Power if self.power == nil t = "OFF" icon("40562", 0, 0) tcol = 0xFF0000 else t = str(self.power) if self.power > -10000 && self.power < 10000 t = t+"W" end if self.power == 0 icon("55398", 0, 0) tcol = store.get("zero_power_consumption",0x666666) elif self.power < 0 icon("52648", 0, 0) tcol = store.get("power_feed_in",0x00FF00) else icon("52715", 0, 0) tcol = store.get("power_consumption",0xFF0000) end end var w = text_ink_width(t) text(9+((width()-9 - w) / 2), 6, t, tcol) # Phases for x : 0 .. 2 if self.phases[x] != nil tcol = self._color_from_value(self.phases[x]) line((11+(x*7)),7,(15+(x*7)),7, tcol) end end # WIFI if store.get("WiFi_signal_strength",true) == true if self.rssi == nil || self.rssi < -79 # WLAN db pixel(0, 0, 0xFF0000) elif self.rssi < -69 pixel(0, 0, 0xFFFF00) end end end def on_button(btn) if btn == "select" self.ticks = 0 self.busel += 1 if self.busel > 2 self.busel = 0 end self.eStatticks = store.get("hold_powercounter",10) end end end return EcoTrackerMon()