Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import HABApp
- from HABApp.core.events import ValueUpdateEvent, ValueChangeEvent, ItemNoChangeEvent
- from HABApp.mqtt.items import MqttItem
- from HABApp.openhab.items import SwitchItem, NumberItem, DimmerItem, ColorItem
- from HABApp.openhab.events import ItemStateEvent, ItemCommandEvent, ItemStateChangedEvent
- import logging
- import math
- log = logging.getLogger('HABApp.WorkshopLights')
- idnum = 0
- def get_id_number():
- global idnum
- idnum += 1
- return idnum
- class WsLight:
- def __init__(self, idx):
- self.idx=idx
- self.latest=0
- #log.info(f"tracker {idx}")
- class WsTransition():
- def __init__(self, dimmer, ct, order):
- super().__init__()
- self.dimmer=dimmer
- self.ct=ct
- self.order=order
- self.current=0
- self.idnum=get_id_number()
- self.rate=0.08
- #log.info(f"new transition {len(order)}")
- def iterate(self):
- if self.current < len(self.order):
- #log.info(f"iterate running: {self.order[self.current]}")
- self.current+=1
- return 1 if self.current < len(self.order) else 0
- class WorkshopLights(HABApp.Rule):
- def __init__(self):
- super().__init__()
- #self.topicDestRelay = "homie/bench-test-leds-relay/properties/light4/set"
- #self.topicCommand = "cmnd/garagedev/lvl"
- self.topicDestRelay = "homie/garage-workshop-lights-relay/properties/output/set"
- self.topicCommand = "cmnd/garage/lvl"
- #log.info(f'hello there {"ok"}')
- self.workshop_switch = SwitchItem.get_item('WorkshopLights')
- self.workshop_switch.listen_event(self.item_command, ItemCommandEvent)
- self.workshop_table = SwitchItem.get_item('WorkshopTable')
- self.workshop_table.listen_event(self.item_command, ItemCommandEvent)
- self.workshop_bench = SwitchItem.get_item('WorkshopBench')
- self.workshop_bench.listen_event(self.item_command, ItemCommandEvent)
- self.relay_timeout=20
- self.dimmer_reset_timeout=30
- watcher = self.workshop_switch.watch_change(self.relay_timeout)
- watcher2 = self.workshop_switch.watch_change(self.dimmer_reset_timeout)
- self.workshop_switch.listen_event(self.thing_no_change, watcher.EVENT)
- self.workshop_dimmer = DimmerItem.get_item('WorkshopLightsDimmer')
- self.workshop_dimmer.listen_event(self.item_command, ItemCommandEvent)
- self.overlay = list()
- self.tracker = list()
- for i in range(28):
- self.tracker.append(WsLight(i))
- self.overlay.append(-1)
- self.SetOverlayZone1(90 if self.workshop_bench.is_on() else -1)
- self.SetOverlayZone2(90 if self.workshop_table.is_on() else -1)
- def SetOverlayZone1(self, value):
- for i in range(0,7):
- self.overlay[i]=value
- def SetOverlayZone2(self, value):
- for i in range(16,20):
- self.overlay[i]=value
- for i in range(23,27):
- self.overlay[i]=value
- def reapply_cur_level(self):
- self.do_transition(int(self.workshop_dimmer.get_value()))
- def thing_no_change(self, event: ItemNoChangeEvent):
- if event.name == "WorkshopLights":
- if self.workshop_switch.get_value()=="OFF":
- if event.seconds == self.relay_timeout:
- self.mqtt.publish(self.topicDestRelay, "false", 1, False)
- log.info(f'turn off the relay' )
- if event.seconds == self.dimmer_reset_timeout:
- log.info(f'do reset of dimmer state.' )
- self.workshop_dimmer.oh_post_update(2)
- self.do_transition(2)
- self.workshop_bench.off()
- self.workshop_table.off()
- # log.info(f'no change of item {event} {self.workshop_switch.get_value()}' )
- def run_transition(self, tobj):
- idx=tobj.order[tobj.current]
- if self.tracker[idx].latest < tobj.idnum:
- self.tracker[idx].latest = tobj.idnum
- dimmer_value=tobj.dimmer
- if dimmer_value>0:
- if self.overlay[idx]>=0:
- if dimmer_value < self.overlay[idx]:
- dimmer_value=self.overlay[idx]
- self.mqtt.publish(f'{self.topicCommand}{idx}', f"dimmer={dimmer_value};ct={tobj.ct}", 1, True)
- if tobj.iterate():
- self.run.at(tobj.rate,self.run_transition,tobj)
- def do_transition(self, val):
- if val==0:
- order=list()
- for i in range(28):
- order.append(i)
- transition=WsTransition(0,100,order)
- self.run_transition(transition)
- elif val==1:
- 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]
- #for i in range(28):
- # self.order.append(i)
- transition=WsTransition(20,100,order)
- self.run_transition(transition)
- elif val==2:
- #order=list()
- #for i in range(28):
- # order.append(i)
- 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]
- transition=WsTransition(50,100,diagonal)
- self.run_transition(transition)
- elif val==3:
- order=list()
- for i in range(28):
- order.append( ((i % 4) * 7)+math.floor(i/4) )
- transition=WsTransition(75,100,order)
- self.run_transition(transition)
- elif val==4:
- order=list()
- for i in range(28):
- order.append( 27 - (((i % 4) * 7)+math.floor(i/4)) )
- transition=WsTransition(100,100,order)
- self.run_transition(transition)
- elif val==5:
- 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]
- transition=WsTransition(100,0,wipe)
- self.run_transition(transition)
- def item_command(self, event):
- assert isinstance(event, ItemCommandEvent)
- #log.info( f'command event {event}' )
- if event.name == "WorkshopLights":
- if event.value == "ON":
- self.mqtt.publish(self.topicDestRelay, "true", 1, False)
- self.reapply_cur_level()
- #log.info(f"current value:{curvalue}")
- elif event.value == "OFF":
- self.do_transition(0)
- if event.name == "WorkshopBench":
- self.SetOverlayZone1(90 if event.value == "ON" else -1)
- if self.workshop_switch.is_on():
- self.reapply_cur_level()
- if event.name == "WorkshopTable":
- self.SetOverlayZone2(90 if event.value == "ON" else -1)
- if self.workshop_switch.is_on():
- self.reapply_cur_level()
- if event.name == "WorkshopLightsDimmer":
- val=int(event.value)
- if self.workshop_switch.is_on():
- self.do_transition(val)
- #print( f'{event}')
- # interaction is available through self.openhab or self.oh
- #self.oh.post_update('ReceivedCommand', str(event))
- WorkshopLights()
Advertisement
Add Comment
Please, Sign In to add comment