konbaasiang

HABApp scene script

May 3rd, 2022
1,139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.56 KB | None | 0 0
  1. import HABApp
  2. import logging
  3. from HABApp.mqtt.items import MqttItem
  4. from HABApp.openhab.items import SwitchItem, NumberItem, DimmerItem, ColorItem
  5.  
  6.  
  7.  
  8. class Apply(object):
  9.     def __init__(self, rule, **params):
  10.  
  11.         self.delayTime = 0.5
  12.        
  13.         self.rule = rule
  14.        
  15.         if "delayTime" in params:
  16.             self.delayTime=params["delayTime"]
  17.  
  18.         if "actions" in params:
  19.             self.actions=params["actions"]
  20.            
  21.         if "log" in params:
  22.             self.log=params["log"]
  23.  
  24.         self.needs_delay=0
  25.        
  26.         if not hasattr(self, "actions"):
  27.             return
  28.        
  29.         self.action_idx=0
  30.         self.part_idx=0
  31.        
  32.         self.rule.run.soon(self.run)
  33.        
  34. #       self.string_to_dict("breadboard7leds_Led1_Switch=on")
  35.    
  36.         #self.string_to_dict("nodelay*dimmer*breadboard7leds_Led1_Switch=1.0")
  37.         #mydict=self.string_to_dict("retain*homie/breadboard-7leds/led1/switch=false")
  38.        
  39.         #self.log.info(mydict)
  40.        
  41.    
  42.        
  43.        
  44.     def isfloat(self,num):
  45.         try:
  46.             float(num)
  47.             return True
  48.         except ValueError:
  49.             return False
  50.        
  51.     def string_to_dict(self,str):
  52.         equ = str.rfind('=')
  53.        
  54.         assignment = str[equ+1:]
  55.        
  56.         item = str[:equ]
  57.        
  58.         commands = list()
  59.        
  60.         itemType = ""
  61.        
  62.         while item.find('*')>=0:
  63.             star=star = item.find('*')
  64.             cmd=item[:star]
  65.             commands.append(cmd)
  66.             item=item[star+1:]
  67.        
  68.            
  69.         for cmd in commands:
  70.             if cmd == "dimmer":
  71.                 itemType = "dimmer"
  72.             elif cmd== "number":
  73.                 itemType = "number"
  74.             elif cmd== "mqtt":
  75.                 itemType = "mqtt"
  76.  
  77.         if not itemType:
  78.             if item.find('/')>=0:
  79.                 itemType = "mqtt"
  80.            
  81.         if not itemType:
  82.             if self.isfloat(assignment):
  83.                 itemType = "number"
  84.  
  85.         if not itemType:
  86.             if assignment=="on" or assignment=="off":
  87.                 itemType = "switch"
  88.  
  89.         if itemType == "mqtt":
  90.             delay = "false" if "nodelay" in commands else "true"
  91.             retain = "true" if "retain" in commands else "false"
  92.             return { "item": item, "state": assignment, "type": itemType, "delay": delay, "retain": retain }
  93.  
  94.         #self.log.info(f"itemtype: '{itemtype}'   item: '{item}'     assignment: '{assignment}'")
  95.        
  96.         return { "item": item, "state": assignment, "type": itemType }
  97.  
  98.     def run(self):
  99.  
  100.         if hasattr(self, "log"):
  101.             self.log.info(f'---------- action {self.action_idx}    part {self.part_idx} ----------')
  102.        
  103.         cur = self.actions[self.action_idx][self.part_idx]
  104.        
  105.                
  106.         if str(type(cur)) == "<class 'str'>":
  107.             cur = self.string_to_dict(cur)
  108.  
  109.  
  110.         if hasattr(self, "log"):
  111.             self.log.info(f'  cur: {cur}')
  112.        
  113.         if cur["type"]=="switch":
  114.             item=SwitchItem.get_item(cur["item"])
  115.             desired = cur["state"]=="on"
  116.             if item.is_on() != desired:
  117.                 self.needs_delay = 1
  118.             self.rule.run.soon(item.oh_send_command,'ON' if desired else 'OFF')
  119.         elif cur["type"]=="dimmer":
  120.             item=DimmerItem.get_item(cur["item"])
  121.             item.oh_send_command(cur["state"])
  122.         elif cur["type"]=="number":
  123.             item=NumberItem.get_item(cur["item"])
  124.             item.oh_send_command(cur["state"])
  125.         elif cur["type"]=="mqtt":
  126.             if "delay" in cur:
  127.                 if cur["delay"]=="true":
  128.                     self.needs_delay = 1
  129.             retain = False
  130.             if "retain" in cur:
  131.                 if cur["retain"]=="true":
  132.                     retain = True
  133.             self.rule.mqtt.publish(cur["item"], cur["state"], 1, retain)
  134.            
  135.         #log.info(f'  cur: {cur}')
  136.         #log.info(f'  cur: {cur["item"]}')
  137.        
  138.         if self.part_idx < len(self.actions[self.action_idx])-1:
  139.             self.part_idx += 1
  140.             self.rule.run.soon(self.run)
  141.             return
  142.         else:
  143.             self.part_idx = 0
  144.             self.action_idx += 1
  145.             use_delay = self.delayTime if self.needs_delay else 0
  146.             self.needs_delay = 0
  147.             if self.action_idx < len(self.actions):
  148.                 self.rule.run.at(use_delay,self.run)
  149.             else:
  150.                 return
  151.        
  152.    
  153.  
Advertisement
Add Comment
Please, Sign In to add comment