# @name EcoTrackerMonitor # @desc Stromverbrauch+Zählerstände eines EcoTracker IR von Everhome # @author Töm (taschenserver im Discord) # @version 0.5 # @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 import json class EcoTrackerMon var disp, ticks, ticks1 var i0, t0, c0, t1, t2, pi, ph1, ph2, ph3 def _val2col(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) if value < 0 value = -value end 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.disp = 0 self.ticks = 0 self.ticks1 = 0 self.i0 = "40562" self.t0 = "" self.c0 = 0xFF0000 self.t1 = "" self.t2 = "" self.pi = 0x000000 self.ph1 = 0x000000 self.ph2 = 0x000000 self.ph3 = 0x000000 end def on_body(body, status) if body == nil return end var d = json.load(body) if !isinstance(d, map) return end var x x = d.find("power") if x == nil self.t0 = "OFF" self.i0 = "40562" self.c0 = 0xFF0000 else if x == 0 self.i0 = "55398" self.c0 = store.get("zero_power_consumption",0x666666) elif x < 0 self.i0 = "52648" self.c0 = store.get("power_feed_in",0x00FF00) else self.i0 = "52715" self.c0 = store.get("power_consumption",0xFF0000) end self.t0 = x > -10000 && x < 10000 ? str(x)+"W" : str(x) end self.t2=[["WIFI: ",0xAAAAAA]] x = d.find("rssi") pi = 0x000000 if x != nil self.t2.push([str(x)+ " dbm",0xFFFFFF]) if store.get("WiFi_signal_strength",true) == true if x < -79 # WLAN db pi = 0xFF0000 elif x < -69 pi = 0xFFFF00 end end else pi = 0xFF0000 end x = d.find("ssid") if x != nil self.t2.push([" SSID:",0xAAAAAA]) self.t2.push([x,0xFFFFFF]) end x = d.find("powerPhase1") self.ph1 = x!= nil ? self._val2col(x) : self._val2col(0) x = d.find("powerPhase2") self.ph2 = x!= nil ? self._val2col(x) : self._val2col(0) x = d.find("powerPhase3") self.ph3 = x!= nil ? self._val2col(x) : self._val2col(0) self.t1 = [] x = d.find("energyCounterIn") if x != nil self.t1.push([" 1.8.0:",0xAAAAAA]) self.t1.push([str(round(x/1000.0,1))+" kWh",0xFFFFFF]) end x = d.find("energyCounterIn1") if x != nil self.t1.push([" 1.8.1:",0xAAAAAA]) self.t1.push([str(round(x/1000.0,1))+" kWh",0xFFFFFF]) end x = d.find("energyCounterIn2") if x != nil self.t1.push([" 1.8.2:",0xAAAAAA]) self.t1.push([str(round(x/1000.0,1))+" kWh",0xFFFFFF]) end x = d.find("energyCounterOut") if x != nil self.t1.push([" 2.8.0:",0xAAAAAA]) self.t1.push([str(round(x/1000.0,1))+" kWh",0xFFFFFF]) end end def duration() return store.get("duration",5)*1000 end def loop() if self.ticks <= 0 self.ticks = store.get("refreshrate",5) http.get("http://"+store.get("ecotracker_ip", "192.168.178.99")+"/v1/json", / b, st -> self.on_body(b, st)) end self.ticks -= 1 if self.ticks1 <= 0 self.disp = 0 else self.ticks1 -= 1 end end def draw() clear() # Powercounter / WIFI if self.disp != 0 font("large") if self.disp == 1 scroll_text(self.t1,0xFFFFFF,{"mode":"loop","gap":8,"repeat":10}) else scroll_text(self.t2,0xFFFFFF,{"mode":"loop","gap":8,"repeat":10}) end return end # Power icon(self.i0, 0, 0) text(9+((width()-9 - text_ink_width(self.t0)) / 2), 6, self.t0, self.c0) # Phases line(11,7,15,7, self.ph1) line(18,7,22,7, self.ph2) line(25,7,29,7, self.ph3) # WIFI pixel(0, 0, self.pi) end def on_button(btn) if btn == "select" self.ticks = 0 self.disp += 1 if self.disp > 2 self.disp = 0 end self.ticks1 = store.get("hold_powercounter",10) end end end return EcoTrackerMon()