From 841b405fba3553c4c8afb85ff8dac087d4f8eeb2 Mon Sep 17 00:00:00 2001 From: joBr99 <29555657+joBr99@users.noreply.github.com> Date: Sat, 12 Mar 2022 18:14:56 +0100 Subject: [PATCH] implemented color wheel and external detail update --- HMI/n2t-out/popupLight.txt | 6 +- HMI/nspanel.HMI | Bin 11134137 -> 11134137 bytes HMI/nspanel.tft | Bin 8122708 -> 8122708 bytes .../nspanel-lovelance-ui.py | 95 +++++++++++++----- 4 files changed, 72 insertions(+), 29 deletions(-) diff --git a/HMI/n2t-out/popupLight.txt b/HMI/n2t-out/popupLight.txt index d2b5ee2e..73bfa98b 100644 --- a/HMI/n2t-out/popupLight.txt +++ b/HMI/n2t-out/popupLight.txt @@ -533,8 +533,8 @@ Timer tmSerial spstr strCommand.txt,tTmp.txt,",",2 if(tTmp.txt=="disable") { - vis t4,0 - vis t3,0 + vis t1,0 + vis t2,0 vis hBrightness,0 mode_bright.val=0 }else @@ -565,7 +565,7 @@ Timer tmSerial } // get ColorWheel value spstr strCommand.txt,tTmp.txt,",",4 - if(tTmp.txt=="enable") + if(tTmp.txt!="disable") { vis bColor,1 } diff --git a/HMI/nspanel.HMI b/HMI/nspanel.HMI index 4d7e57fd2877d9a44e903df5f6ed835e3a5d88d5..280476fbe9ea3a25f0d890cbbddf3e024747cf1f 100644 GIT binary patch delta 1306 zcmd7PSxA&o6u|L2Gmgu&sQGD@x#eVwmP=`6mTi{pnvR-FmYJHlOqpfoR*qR_xusvb zZRXTN1sWgoASqN(1VK+d6gW>l6cI>9M9|;H@U7Rn@Pl*DIUFwcSYGyMEqH9U*N>J8 zp?Vsk68)j}pIVDGWB0L>V3EY5Y-$4`s@~W3IjVr)m1oUD^fzhWcfU~o>C~AGB0h%B z=gqx|j`eCguP4Kibyi)2Ri}a)8rVS#d&R1A@cr8UMW^j^{KpS4xtLr{(@buCQhKbm zWN;{GRE{!B-)ej%+b1L^3E`l!#hC^nS~a%#bE*)H<8gV05VDgk@0>f)?~y0O53Mcl zS~QXOEEZzw_{_i(AtsN<;YJ~vY%}E^qg#ah?n9-de7`TX#3=b?hKEz+!D@rI%D;0& z@{#?Fm6BYWU8z+H>I_|axi8)=sN;GC!Vr$dSb_*dVkwqkIij!v(O8L9h{0;C!CI`tdc_no{Vo5SpXbaVo-2dZMI;q0s0T&N1O?YsqY^^cq<%$vMtrApg z_^AHNmX%jS?hn**id|Kk66c&OMK`1k8<30?q+%D+kd6#wVmGp|2YZo?eaOLncRp^*D_NoWWT%;vAZA w9v9Gz7PO)b?YM{zbV9}@T*eh##Wh^V4RqlqZs9iW;4Zpx4?RlSusQ4JFU0Eqq5uE@ delta 1221 zcmc)HTS(Jk9LDi??w~F+Yg=~KQafmAT6Q$e$~4Q&!_;);S<5^uH7(1moUN%H)N-B6 zvK(|HC=D+pq#(jBg0AXLkVHZVO1xM>-w=lg>^*f>NDB#O)2kp`_C6Jcp2sz<{4D|>Z}-9^~8rn ztF%n>QEu)nQ3bxN(tOg%qhFKj7s6wDcGU~fYCqH5qgRDnXT_?!ql~6; zH8hwHZ!EwQ*no`)$0lsX z7Hq{fY)1rkAQFG>yA#pah27YL809YEEYuubPb%ZfSdhj@g?=)w~`MK_+|IeM&_W0ve+zX6!I;gJ9U diff --git a/HMI/nspanel.tft b/HMI/nspanel.tft index 4343a72873ad707fdf85c49efdaa1ae8ef98dc1a..a62c259d7ea026390c988ad0ed598b911a2790d5 100644 GIT binary patch delta 5198 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 self.api.get_now().time() and not found_current_dim_value: # first time after current time, set dim value self.current_screensaver_brightness = sorted_timesets[index-1]["value"] @@ -119,30 +122,7 @@ class NsPanelLovelanceUI: if msg[1] == "pageOpenDetail": self.api.log("Received pageOpenDetail command", level="DEBUG") - if(msg[2] == "popupLight"): - entity = self.api.get_entity(msg[3]) - switch_val = 1 if entity.state == "on" else 0 - # scale 0-255 brightness from ha to 0-100 - if entity.state == "on": - if entity.attributes.get("brightness"): - brightness = int(self.scale(entity.attributes.brightness,(0,255),(0,100))) - else: - brightness = "disable" - if "color_temp" in entity.attributes.supported_color_modes: - # scale ha color temp range to 0-100 - color_temp = self.scale(entity.attributes.color_temp,(entity.attributes.min_mireds, entity.attributes.max_mireds),(0,100)) - else: - color_temp = "disable" - else: - brightness = 0 - color_temp = "disable" - self.send_mqtt_msg("entityUpdateDetail,{0},{1},{2}".format(switch_val,brightness,color_temp)) - - if(msg[2] == "popupShutter"): - pos = self.api.get_entity(msg[3]).attributes.current_position - # reverse position for slider - pos = 100-pos - self.send_mqtt_msg("entityUpdateDetail,{0}".format(pos)) + self.generate_detail_page(msg[2], msg[3]) if msg[1] == "tempUpd": self.api.log("Received tempUpd command", level="DEBUG") @@ -153,6 +133,7 @@ class NsPanelLovelanceUI: self.update_screensaver_weather("") def send_mqtt_msg(self,msg): + self.api.log("Send Message from Tasmota: %s", msg, level="DEBUG") self.mqtt.mqtt_publish(self.config["panelSendTopic"], msg) def update_time(self, kwargs): @@ -247,6 +228,13 @@ class NsPanelLovelanceUI: #scale 0-100 from slider to color range of lamp color_val = self.scale(int(optVal), (0, 100), (entity.attributes.min_mireds, entity.attributes.max_mireds)) self.api.get_entity(entity_id).call_service("turn_on", color_temp=color_val) + + if(btype == "colorWheel"): + self.api.log(optVal) + optVal = optVal.split('|') + color = self.pos_to_color(int(optVal[0]), int(optVal[1])) + self.api.log(color) + self.api.get_entity(entity_id).call_service("turn_on", rgb_color=color) if(btype == "positionSlider"): pos = int(optVal) @@ -300,7 +288,11 @@ class NsPanelLovelanceUI: # send update of the item on page command = self.generate_entities_item(entity, items.index(entity)+1) self.send_mqtt_msg(command) - # TODO: Send data of detail page, just in case this page is currently open + if(entity.startswith("cover")): + self.generate_detail_page("popupShutter", entity) + if(entity.startswith("light")): + self.generate_detail_page("popupLight", entity) + return if page_type == "cardThermo" or page_type == "cardMedia": @@ -441,3 +433,54 @@ class NsPanelLovelanceUI: self.send_mqtt_msg("pageType,{0}".format(page_type)) command = self.generate_media_page(self.config["pages"][self.current_page_nr]["item"]) self.send_mqtt_msg(command) + + def generate_detail_page(self, page_type, entity): + if(page_type == "popupLight"): + entity = self.api.get_entity(entity) + switch_val = 1 if entity.state == "on" else 0 + brightness = "disable" + color_temp = "disable" + color = "disable" + # scale 0-255 brightness from ha to 0-100 + if entity.state == "on": + if "brightness" in entity.attributes: + brightness = int(self.scale(entity.attributes.brightness,(0,255),(0,100))) + else: + brightness = "disable" + if "color_temp" in entity.attributes.supported_color_modes: + if "color_temp" in entity.attributes: + # scale ha color temp range to 0-100 + color_temp = int(self.scale(entity.attributes.color_temp,(entity.attributes.min_mireds, entity.attributes.max_mireds),(0,100))) + else: + color_temp = 0 + else: + color_temp = "disable" + if "xy" in entity.attributes.supported_color_modes: + color = "enable" + else: + color = "disable" + self.send_mqtt_msg(f"entityUpdateDetail,{switch_val},{brightness},{color_temp},{color}") + + if(page_type == "popupShutter"): + pos = self.api.get_entity(msg[3]).attributes.current_position + # reverse position for slider + pos = 100-pos + self.send_mqtt_msg("entityUpdateDetail,{0}".format(pos)) + + def hsv2rgb(self, h, s, v): + hsv = colorsys.hsv_to_rgb(h,s,v) + return tuple(round(i * 255) for i in hsv) + def pos_to_color(self, x, y): + r = 213/2 + x = round((x - r) / r * 100) / 100 + y = round((r - y) / r * 100) / 100 + + r = math.sqrt(x*x + y*y) + sat = 0 + if (r > 1): + sat = 0 + else: + sat = r + hsv = (math.degrees(math.atan2(y, x))%360/360, sat, 1) + rgb = self.hsv2rgb(hsv[0],hsv[1],hsv[2]) + return rgb \ No newline at end of file