예제 #1
0
파일: wemo_env.py 프로젝트: fjacob21/MAX
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)
예제 #2
0
파일: wemo.py 프로젝트: leac-mit/green_net
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
예제 #3
0
파일: wemo3.py 프로젝트: leac-mit/green_net
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
예제 #4
0
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'):
예제 #5
0
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))