class wemo_env(object): def __init__(self): self._watcheux = {} self._env = Environment() try: self._env.start() self._env.discover(3) except: print("WeMo environment cannot start ;( !!!!") def start_watching(self): statechange.connect(self.update_state, unique=False, dispatch_uid=id(self)) def get_device(self, name): return self._env.get(name) def register(self, name, fct): if name not in self._watcheux: self._watcheux[name] = [] self._watcheux[name].append(fct) if len(self._watcheux) > 0: self.start_watching() def update_state(self, sender, **kwargs): state = kwargs.get('state') if state != 0: state = 1 if sender.name in self._watcheux: for watcheu in self._watcheux[sender.name]: watcheu(state)
def get_device(name): env = Environment() # TODO: run from 10am to 10pm env.start() print "Discovering Device" env.discover(5) h = env.get(name) return h
def get_device(name): env = Environment() # TODO: run from 10am to 10pm env.start() print "Discovering Device %s" %name env.discover(8) this_switch = env.get(name) return this_switch
with open(sys.argv[1]) as conf: config = json.loads(conf.read()) env = Environment(with_subscribers=False, with_cache=False) env.start() env.discover() #env.wait(3) found_wemos = False for switch_name in env.list_switches(): for entry in config: if switch_name == entry.get('wemo switch'): # FIXME: log print("Found Wemo: {}".format(switch_name)) button_switches[entry['button mac']] = env.get(switch_name) found_wemos = True for bridge_name in env.list_bridges(): bridge = env.get_bridge(bridge_name) for light_name in bridge.bridge_get_lights(): for entry in config: if light_name == entry.get('wemo light'): light = Light('Garage North', bridge) # FIXME: log print("Found Wemo: {}".format(switch_name)) button_switches[entry['button mac']] = light found_wemos = True for entry in config: if entry.get('email to'):
class WemoLogger(): ASYNCH_RELOAD = 10 # test reload switches every ASYNCH_RELOAD seconds LOG_FREQ = 5 # # log new data every LOG_FREQ seconds def __init__(self, num_devices=1, debug=True): self.debug = debug print "initalizing the wemos for %s devices" % (num_devices) self.NUM_DEVICES = num_devices self.switches = {} self.devices = range(0, self.NUM_DEVICES) self.q = Queue() try: self.env = Environment() self.env.start() except: print """ Failed to access internet information. Are you connected to the router wifi?""" sys.exit(1) self.load_switches() if len(self.switches) == 0: print "could not connect any devices. are you on the router wifi?" sys.exit(1) print """ Done connecting devices. Starting asynchronous wemo reloader now!""" self.thread = Thread(target=self.reload_switch_spinner) self.thread.start() def reload_switch_spinner(self): while True: if len(self.switches) != self.NUM_DEVICES: self.load_switches() time.sleep(self.ASYNCH_RELOAD) def load_switches(self, timeout=30): print "Entering discovery mode for %s seconds" % timeout self.env.discover(timeout) print "Done with Discovery. Starting to sync switches" for i in self.devices: if i in self.switches: #print "#XXX run test to make sure switch is active" active = True #XXX fix me if active: #print "skipping switch %s - already active" % get_name(i) continue else: del self.switches[i] try: self.switches[i] = self.env.get(get_name(i)) print "\t\tsuccess! connected to switch %s " % get_name(i) except: print "\tfail! could not connect device %s " % get_name(i) if args.debug: for i in range(0, 15): if i in self.switches: print i, get_name(i), self.switches[i] #raw_input("press enter if naming is correct") def get_switch_power(self, i): try: power = self.switches[i].current_power if self.debug: print "got data for %s , %s" % (get_name(i), power) except: power = -1 self.q.put((i, power)) def get_data_old(self): data = [0.0] * self.NUM_DEVICES del_list = [] for i in self.devices: if i in self.switches: #TODO Paralleize this p = Process(target=self.get_switch_power, args=(i, )) p.start() p.join(3) # timeout 2 seconds if p.is_alive(): print "collecting data from %s took too long " % get_name( i) p.terminate() p.join() del_list.append(i) for t in range(self.q.qsize()): i, power = self.q.get() data[i] = power if (power == -1) and (i in self.switches) and (i not in del_list): if self.debug: print "removing %s from list because power was 0" % get_name( i) del_list.append(i) for i in del_list: del self.switches[i] return data def get_data(self): data = [0.0] * self.NUM_DEVICES del_list = [] p = [None] * self.NUM_DEVICES for i in self.devices: if i in self.switches: #TODO Paralleize this p[i] = Process(target=self.get_switch_power, args=(i, )) p[i].start() time.sleep(self.LOG_FREQ) for i in self.devices: if i in self.switches: if p[i] and p[i].is_alive(): print "collecting data from %s took too long " % get_name( i) p[i].terminate() #p[i].join() del_list.append(i) for t in range(self.q.qsize()): i, power = self.q.get() data[i] = power if (power == -1) and (i in self.switches) and (i not in del_list): if self.debug: print "removing %s from list because power was 0" % get_name( i) del_list.append(i) for i in del_list: del self.switches[i] return data def write_data(self, data): string = "" for date, dat in data: string += "%s%s\n" % (date, (",").join([str(d) for d in dat])) with open('data.csv', 'a') as f: f.write(string) def run(self): iters = 1 last_time = time.time() data = [] while True: # only write data every 5 data points if iters % 1 == 0: self.write_data(data) iters = 0 data = [] else: iters += 1 # pause before collecting more data #time.sleep(self.LOG_FREQ) # get data dat = self.get_data() # get date and delta time date = time.strftime("%Y%m%d-%H:%M:%S,") date += "%s," % (time.time() - last_time) last_time = time.time() # add date to list data.append((date, dat))