konbaasiang

Untitled

Apr 11th, 2022
890
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.27 KB | None | 0 0
  1. import HABApp
  2. from HABApp.core.events import ValueUpdateEvent, ValueChangeEvent, ItemNoChangeEvent
  3. from HABApp.mqtt.items import MqttItem
  4. from HABApp.openhab.items import SwitchItem, NumberItem, DimmerItem, ColorItem
  5. from HABApp.openhab.events import ItemStateEvent, ItemCommandEvent, ItemStateChangedEvent
  6. import logging
  7. import math
  8.  
  9. log = logging.getLogger('HABApp.WorkshopLights')
  10.  
  11. idnum = 0
  12.  
  13. def get_id_number():
  14.     global idnum
  15.     idnum += 1
  16.     return idnum
  17.  
  18. class WsLight:
  19.     def __init__(self, idx):
  20.         self.idx=idx
  21.         self.latest=0
  22.         #log.info(f"tracker {idx}")
  23.  
  24. class WsTransition():
  25.     def __init__(self, dimmer, ct, order):
  26.         super().__init__()
  27.         self.dimmer=dimmer
  28.         self.ct=ct
  29.         self.order=order
  30.         self.current=0
  31.         self.idnum=get_id_number()
  32.         self.rate=0.08
  33.         #log.info(f"new transition {len(order)}")
  34.  
  35.     def iterate(self):
  36.         if self.current < len(self.order):
  37.             #log.info(f"iterate running: {self.order[self.current]}")
  38.             self.current+=1
  39.         return 1 if self.current < len(self.order) else 0
  40.  
  41. class WorkshopLights(HABApp.Rule):
  42.     def __init__(self):
  43.         super().__init__()
  44.        
  45.         #self.topicDestRelay = "homie/bench-test-leds-relay/properties/light4/set"
  46.         #self.topicCommand = "cmnd/garagedev/lvl"
  47.        
  48.         self.topicDestRelay = "homie/garage-workshop-lights-relay/properties/output/set"
  49.         self.topicCommand = "cmnd/garage/lvl"
  50.  
  51.         #log.info(f'hello there {"ok"}')
  52.        
  53.         self.workshop_switch = SwitchItem.get_item('WorkshopLights')
  54.         self.workshop_switch.listen_event(self.item_command, ItemCommandEvent)
  55.  
  56.         self.workshop_table = SwitchItem.get_item('WorkshopTable')
  57.         self.workshop_table.listen_event(self.item_command, ItemCommandEvent)
  58.        
  59.         self.workshop_bench = SwitchItem.get_item('WorkshopBench')
  60.         self.workshop_bench.listen_event(self.item_command, ItemCommandEvent)
  61.  
  62.        
  63.         self.relay_timeout=20
  64.         self.dimmer_reset_timeout=30
  65.        
  66.         watcher = self.workshop_switch.watch_change(self.relay_timeout)
  67.         watcher2 = self.workshop_switch.watch_change(self.dimmer_reset_timeout)
  68.         self.workshop_switch.listen_event(self.thing_no_change, watcher.EVENT)
  69.  
  70.         self.workshop_dimmer = DimmerItem.get_item('WorkshopLightsDimmer')
  71.         self.workshop_dimmer.listen_event(self.item_command, ItemCommandEvent)
  72.        
  73.        
  74.         self.overlay = list()
  75.  
  76.         self.tracker = list()
  77.        
  78.         for i in range(28):
  79.             self.tracker.append(WsLight(i))
  80.             self.overlay.append(-1)
  81.  
  82.         self.SetOverlayZone1(90 if self.workshop_bench.is_on() else -1)
  83.         self.SetOverlayZone2(90 if self.workshop_table.is_on() else -1)
  84.  
  85.  
  86.        
  87.     def SetOverlayZone1(self, value):
  88.         for i in range(0,7):
  89.             self.overlay[i]=value
  90.  
  91.     def SetOverlayZone2(self, value):
  92.         for i in range(16,20):
  93.             self.overlay[i]=value
  94.         for i in range(23,27):
  95.             self.overlay[i]=value
  96.  
  97.  
  98.     def reapply_cur_level(self):
  99.         self.do_transition(int(self.workshop_dimmer.get_value()))
  100.  
  101.     def thing_no_change(self, event: ItemNoChangeEvent):
  102.         if event.name == "WorkshopLights":
  103.             if self.workshop_switch.get_value()=="OFF":
  104.                 if event.seconds == self.relay_timeout:
  105.                     self.mqtt.publish(self.topicDestRelay, "false", 1, False)
  106.                     log.info(f'turn off the relay' )
  107.                    
  108.                 if event.seconds == self.dimmer_reset_timeout:
  109.                     log.info(f'do reset of dimmer state.' )
  110.                     self.workshop_dimmer.oh_post_update(2)
  111.                     self.do_transition(2)
  112.                     self.workshop_bench.off()
  113.                     self.workshop_table.off()
  114.                    
  115.                
  116. #               log.info(f'no change of item {event} {self.workshop_switch.get_value()}' )
  117.  
  118.     def run_transition(self, tobj):
  119.  
  120.         idx=tobj.order[tobj.current]
  121.        
  122.         if self.tracker[idx].latest < tobj.idnum:
  123.             self.tracker[idx].latest = tobj.idnum
  124.             dimmer_value=tobj.dimmer
  125.             if dimmer_value>0:
  126.                 if self.overlay[idx]>=0:
  127.                     if dimmer_value < self.overlay[idx]:
  128.                         dimmer_value=self.overlay[idx]
  129.            
  130.             self.mqtt.publish(f'{self.topicCommand}{idx}', f"dimmer={dimmer_value};ct={tobj.ct}", 1, True) 
  131.            
  132.         if tobj.iterate():
  133.             self.run.at(tobj.rate,self.run_transition,tobj)
  134.        
  135.  
  136.     def do_transition(self, val):
  137.         if val==0:
  138.  
  139.             order=list()
  140.        
  141.             for i in range(28):
  142.                 order.append(i)
  143.        
  144.             transition=WsTransition(0,100,order)
  145.             self.run_transition(transition)
  146.            
  147.         elif val==1:
  148.             order=[0,1,2,3,4,5,6,13,20,27,26,25,24,23,22,21,14,7,8,9,10,11,12,19,18,17,16,15]
  149.        
  150.             #for i in range(28):
  151.             #   self.order.append(i)
  152.        
  153.             transition=WsTransition(20,100,order)
  154.             self.run_transition(transition)
  155.            
  156.         elif val==2:
  157.  
  158.             #order=list()
  159.            
  160.             #for i in range(28):
  161.             #   order.append(i)
  162.            
  163.             diagonal=[6, 5, 13, 4, 12, 20, 3, 11, 19, 27, 2, 10, 18, 26, 1, 9, 17, 25, 0, 8, 16, 24, 7, 15, 23, 14, 22, 21]
  164.            
  165.             transition=WsTransition(50,100,diagonal)
  166.             self.run_transition(transition)
  167.  
  168.         elif val==3:
  169.  
  170.             order=list()
  171.            
  172.             for i in range(28):
  173.                 order.append( ((i % 4) * 7)+math.floor(i/4) )
  174.                
  175.        
  176.             transition=WsTransition(75,100,order)
  177.             self.run_transition(transition)
  178.  
  179.         elif val==4:
  180.  
  181.             order=list()
  182.            
  183.             for i in range(28):
  184.                 order.append( 27 - (((i % 4) * 7)+math.floor(i/4)) )
  185.        
  186.             transition=WsTransition(100,100,order)
  187.             self.run_transition(transition)
  188.  
  189.         elif val==5:
  190.  
  191.             wipe = [0,14,13,27,1,15,12,26,2,16,11,25,3,17,10,24,4,18,9,23,5,19,8,22,6,20,7,21]
  192.    
  193.             transition=WsTransition(100,0,wipe)
  194.             self.run_transition(transition)
  195.  
  196.     def item_command(self, event):
  197.         assert isinstance(event, ItemCommandEvent)
  198.         #log.info( f'command event {event}' )
  199.        
  200.         if event.name == "WorkshopLights":
  201.  
  202.             if event.value == "ON":
  203.                 self.mqtt.publish(self.topicDestRelay, "true", 1, False)
  204.                
  205.                 self.reapply_cur_level()
  206.                 #log.info(f"current value:{curvalue}")
  207.                
  208.             elif event.value == "OFF":
  209.                 self.do_transition(0)
  210.            
  211.         if event.name == "WorkshopBench":
  212.             self.SetOverlayZone1(90 if event.value == "ON" else -1)
  213.            
  214.             if self.workshop_switch.is_on():
  215.                 self.reapply_cur_level()
  216.  
  217.         if event.name == "WorkshopTable":
  218.             self.SetOverlayZone2(90 if event.value == "ON" else -1)
  219.             if self.workshop_switch.is_on():
  220.                 self.reapply_cur_level()
  221.  
  222.         if event.name == "WorkshopLightsDimmer":
  223.  
  224.             val=int(event.value)
  225.            
  226.             if self.workshop_switch.is_on():
  227.                 self.do_transition(val)
  228.            
  229.    
  230.        
  231.         #print( f'{event}')
  232.  
  233.         # interaction is available through self.openhab or self.oh
  234.         #self.oh.post_update('ReceivedCommand', str(event))
  235.  
  236.        
  237. WorkshopLights()
  238.  
Advertisement
Add Comment
Please, Sign In to add comment