예제 #1
0
    def inside_temperature(self, cfg):

        if cfg['Server']:
            c = get_client(agent='172.17.0.1:28589', entity="thanos.ent")
        else:
            c = get_client()
        archiver = DataClient(c)

        uuids = [cfg['UUIDS']['thermostat_temperature']]

        temp_now = self.current_time

        start = '"' + temp_now.strftime('%Y-%m-%d %H:%M:%S') + ' PST"'
        end = '"' + (temp_now - datetime.timedelta(minutes=10)
                     ).strftime('%Y-%m-%d %H:%M:%S') + ' PST"'

        dfs = make_dataframe(
            archiver.window_uuids(uuids, end, start, '1min', timeout=120))

        for uid, df in dfs.items():

            if uid == uuids[0]:
                if 'mean' in df.columns:
                    df = df[['mean']]
                df.columns = ['tin']

            dfs[uid] = df.resample('1min').mean()

        uid, df = dfs.items()[0]
        df['tin'] = df['tin'].replace(to_replace=0, method='pad')
        return df['tin']
예제 #2
0
def _fetch_dataframe():
    """
    Returns a `pandas.DataFrame` with columns
        tin: the current temperature
        a: 0=noop, 1=cooling, 2=heating
        a1: is cooling?
        a2: is heating?
        next_temp: the temperature at the next time step
    """
    with _silence():
        # set $BW2_AGENT and $BW2_DEFAULT_ENTITY
        archiver = DataClient(get_client())

    now = datetime.now(pytz.timezone('America/Los_Angeles'))

    start = (now + timedelta(minutes=15)).strftime(DATE_FMT)
    end = (now - timedelta(days=7)).strftime(DATE_FMT)

    dfs = make_dataframe(archiver.window_uuids(UUIDS, end, start, INTERVAL))

    for uid, df in dfs.items():
        if uid == SE_TEMP:
            if 'mean' in df.columns:
                df = df[['mean']]
            df.columns = ['tin']
        elif uid == SE_STATE:
            if 'max' in df.columns:
                df = df[['max']]
            df.columns = ['a']
        dfs[uid] = df.resample(INTERVAL).mean()

    df = pd.concat([dframe for uid, dframe in dfs.items()], axis=1)
    df['a1'] = df.apply(lambda row: int(row['a'] > 0 and row['a'] <= 1),
                        axis=1)
    df['a2'] = df.apply(lambda row: int(row['a'] > 1), axis=1)
    # the following are the features used by the baseline model
    df['tin'] = df['tin'].replace(to_replace=0, method='pad')
    df['tin_a1'] = df.tin * df.a1
    df['tin_a2'] = df.tin * df.a2
    df['next_temp'] = df['tin'].shift(-1)
    # the following are necessary because rulinalg complains about ill-conditioning
    # note that numpy does not have this problem
    df.tin_a1 += np.random.randn(len(df.tin)) * 1e-8
    df.tin_a2 += np.random.randn(len(df.tin)) * 1e-8
    df = df.dropna()

    return df
예제 #3
0
    def __init__(self,
                 cfg,
                 now=datetime.datetime.utcnow().replace(
                     tzinfo=pytz.timezone("UTC")).astimezone(
                         tz=pytz.timezone("America/Los_Angeles")),
                 heat=4000,
                 cool=4000,
                 vent=500):
        # query the server to learn the energy rates of the next 8 hours

        self.heat = heat
        self.cool = cool
        self.vent = vent

        self.mode = cfg['energy_rates']
        self.now = now

        if cfg['Server']:
            c = get_client(agent='172.17.0.1:28589', entity="thanos.ent")
        else:
            c = get_client()
        archiver = DataClient(c)

        uuids = [cfg['UUIDS']['energy_cost']]

        start = '"' + (now).strftime('%Y-%m-%d %H:%M:%S') + ' PST"'
        end = '"' + (
            now - timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') + ' PST"'

        dfs = make_dataframe(
            archiver.window_uuids(uuids, end, start, '15min', timeout=120))

        for uid, df in dfs.items():

            if uid == uuids[0]:
                if 'mean' in df.columns:
                    df = df[['mean']]
                df.columns = ['cost']

            dfs[uid] = df.resample('15min').mean()

        uid, self.df = dfs.items()[0]
예제 #4
0
def hvac_control():
    try:

        # query the server to lean the current setpoints and the state of the thermostat
        if cfg['Server']:
            c = get_client(agent='172.17.0.1:28589', entity="thanos.ent")
        else:
            c = get_client()
        archiver = DataClient(c)

        uuids = [
            cfg['UUIDS']['thermostat_high'], cfg['UUIDS']['thermostat_low'],
            cfg['UUIDS']['thermostat_mode']
        ]

        temp_now = datetime.datetime.utcnow().replace(
            tzinfo=pytz.timezone("UTC")).astimezone(
                tz=pytz.timezone("America/Los_Angeles"))

        start = '"' + temp_now.strftime('%Y-%m-%d %H:%M:%S') + ' PST"'
        end = '"' + (temp_now - datetime.timedelta(minutes=10)
                     ).strftime('%Y-%m-%d %H:%M:%S') + ' PST"'

        dfs = make_dataframe(
            archiver.window_uuids(uuids, end, start, '1min', timeout=120))

        for uid, df in dfs.items():

            if uid == uuids[0]:
                if 'mean' in df.columns:
                    df = df[['mean']]
                df.columns = ['t_high']
            elif uid == uuids[1]:
                if 'mean' in df.columns:
                    df = df[['mean']]
                df.columns = ['t_low']
            elif uid == uuids[2]:
                if 'mean' in df.columns:
                    df = df[['mean']]
                df.columns = ['mode']
            dfs[uid] = df.resample('1min').mean()

        df = pd.concat([dframe for uid, dframe in dfs.items()], axis=1)
    except:
        e = sys.exc_info()[0]
        print e
        return False

    # document the "before" state
    try:
        f = open(filename, 'a')
        f.write("Did read: " + str(df['t_low'][-1]) + ", " +
                str(df['t_high'][-1]) + ", " + str(df['mode'][-1]) + "\n")
        f.close()
    except:
        print "Could not document changes."

    # choose the apropriate setpoints according to weekday and time
    weekno = temp_now.weekday()

    if weekno < 5:
        now = datetime.datetime.utcnow().replace(
            tzinfo=pytz.timezone("UTC")).astimezone(
                tz=pytz.timezone("America/Los_Angeles"))
        now_time = now.time()

        if now_time >= datetime.time(18, 0) or now_time < datetime.time(7, 0):
            heating_setpoint = 62.
            cooling_setpoint = 85.
        else:
            heating_setpoint = 70.
            cooling_setpoint = 76.
    else:
        heating_setpoint = 62.
        cooling_setpoint = 85.

    try:
        adv = Advise(cfg)
        action, temp = adv.advise()
        temp = float(temp)
    except:
        e = sys.exc_info()[0]
        print e
        return False

    # action "0" is Do Nothing, action "1" is Cooling, action "2" is Heating
    if action == "0":
        p = {
            "override": True,
            "heating_setpoint": math.floor(temp - 0.1) - 1,
            "cooling_setpoint": math.ceil(temp + 0.1) + 1,
            "mode": 3
        }
        print "Doing nothing"
        print p

        # document changes
        try:
            f = open(filename, 'a')
            f.write("Did write: " + str(math.floor(temp - 0.1) - 1) + ", " +
                    str(math.ceil(temp + 0.1) + 1) + ", " + str(3) + "\n")
            f.close()
        except:
            print "Could not document changes."

    elif action == "1":
        p = {
            "override": True,
            "heating_setpoint": heating_setpoint,
            "cooling_setpoint": math.floor(temp - 0.1),
            "mode": 3
        }
        print "Heating"
        print p

        # document changes
        try:
            f = open(filename, 'a')
            f.write("Did write: " + str(heating_setpoint) + ", " +
                    str(math.floor(temp - 0.1)) + ", " + str(3) + "\n")
            f.close()
        except:
            print "Could not document changes."

    elif action == "2":
        p = {
            "override": True,
            "heating_setpoint": math.ceil(temp + 0.1),
            "cooling_setpoint": cooling_setpoint,
            "mode": 3
        }
        print "Cooling"
        print p

        # document changes
        try:
            f = open(filename, 'a')
            f.write("Did write: " + str(math.ceil(temp + 0.1)) + ", " +
                    str(cooling_setpoint) + ", " + str(3) + "\n")
            f.close()
        except:
            print "Could not document changes."
    else:
        print "Problem with action."
        return False

    # try to commit the changes to the thermostat, if it doesnt work 10 times in a row ignore and try again later
    for z in normal_zones:
        for i in range(10):
            try:
                zones[z].write(p)
                break
            except:
                if i == 9:
                    e = sys.exc_info()[0]
                    print e
                    return False
                continue
    return True
예제 #5
0
c = get_client()
archiver = DataClient(c)

demand = "4d6e251a-48e1-3bc0-907d-7d5440c34bb9"

uuids = [demand]
now = datetime.datetime.utcnow().replace(
    tzinfo=pytz.timezone("UTC")).astimezone(
        tz=pytz.timezone("America/Los_Angeles"))

start = '"' + now.strftime('%Y-%m-%d %H:%M:%S') + ' PST"'
end = '"2017-9-21 00:00:00 PST"'

dfs = make_dataframe(
    archiver.window_uuids(uuids, end, start, '1min', timeout=120))

for uid, df in dfs.items():

    if uid == uuids[0]:
        if 'mean' in df.columns:
            df = df[['mean']]
        df.columns = ['House Consumption']

    dfs[uid] = df.resample('1min').mean()

uid, df = dfs.items()[0]

df = df / (1000 * 60)

print df.resample('60T').sum().describe()
예제 #6
0
per_zone_occ_list = []

for zone_name in zones:

    query_list = []
    for i in uuids:
        if i[0] == zone_name:
            query_list.append(i[1])

    start = '"' + temp_now.strftime('%Y-%m-%d %H:%M:%S') + ' PST"'
    end = '"' + (temp_now -
                 timedelta(days=60)).strftime('%Y-%m-%d %H:%M:%S') + ' PST"'

    dfs = make_dataframe(
        archiver.window_uuids(query_list, end, start, '15min', timeout=120))

    for uid, df in dfs.items():
        if 'mean' in df.columns:
            df = df[['mean']]
        df.columns = ['occ']
        dfs[uid] = df.resample('15min').mean()

    df = dfs.values()[0]
    if len(dfs) > 1:
        for newdf in dfs.values()[1:]:
            df['occ'] += newdf['occ']
    df['occ'] = 1 * (df['occ'] > 0)

    df.index = df.index.tz_localize(pytz.timezone("America/Los_Angeles"))
    per_zone_occ_list.append(df)
예제 #7
0
    def __init__(self,
                 cfg,
                 now=datetime.datetime.utcnow().replace(
                     tzinfo=pytz.timezone("UTC")).astimezone(
                         tz=pytz.timezone("America/Los_Angeles"))):

        # query the server to get all the available occupancy sensors
        zone_name = cfg['zone']

        if cfg['Server']:
            c = get_client(agent='172.17.0.1:28589', entity="thanos.ent")
        else:
            c = get_client()
        archiver = DataClient(c)
        hod = HodClient("ciee/hod", c)

        occ_query = """SELECT ?sensor ?uuid ?zone WHERE {
		  ?sensor rdf:type brick:Occupancy_Sensor .
		  ?sensor bf:isLocatedIn/bf:isPartOf ?zone .
		  ?sensor bf:uuid ?uuid .
		  ?zone rdf:type brick:HVAC_Zone
		};
		"""

        results = hod.do_query(occ_query)
        uuids = [[x['?zone'], x['?uuid']] for x in results['Rows']]

        temp_now = now

        # select the sensors that are contained in the zone we are optimizing for
        query_list = []
        for i in uuids:
            if i[0] == zone_name:
                query_list.append(i[1])

        start = '"' + (temp_now).strftime('%Y-%m-%d %H:%M:%S') + ' PST"'
        end = '"' + (temp_now - timedelta(days=30)
                     ).strftime('%Y-%m-%d %H:%M:%S') + ' PST"'

        dfs = make_dataframe(
            archiver.window_uuids(query_list, end, start, '15min',
                                  timeout=120))

        for uid, df in dfs.items():
            if 'mean' in df.columns:
                df = df[['mean']]
            df.columns = ['occ']
            dfs[uid] = df.resample('15min').mean()

        df = dfs.values()[0]
        if len(dfs) > 1:
            for newdf in dfs.values()[1:]:
                df['occ'] += newdf['occ']
        df['occ'] = 1 * (df['occ'] > 0)

        df.index = df.index.tz_localize(pytz.timezone("America/Los_Angeles"))

        observation_length_addition = 4 * 60
        k = 5
        prediction_time = 4 * 60
        resample_time = 15
        #now = df.index[-prediction_time/resample_time]
        now = df.index[-1]

        observation_length = mins_in_day(now) + observation_length_addition
        similar_moments = find_similar_days(df, now, observation_length, k)
        self.predictions = predict(df, now, similar_moments, prediction_time,
                                   resample_time)
예제 #8
0
    def preprocess_thermal(self, cfg):

        # if state is 1 we are doing heating
        def f1(row):
            if row['a'] > 0 and row['a'] <= 1:
                val = 1
            else:
                val = 0
            return val

        # if state is 2 we are doing cooling
        def f2(row):
            if row['a'] > 1 and row['a'] <= 2:
                val = 1
            else:
                val = 0
            return val

        final_df = pd.DataFrame()
        flag = True
        heating_count = 0
        cooling_count = 0
        do_nothing_count = 0
        max_action_count = 50
        month_count = 0
        while flag:

            # query the server for the thermostat state and temperature

            if cfg['Server']:
                c = get_client(agent='172.17.0.1:28589', entity="thanos.ent")
            else:
                c = get_client()
            archiver = DataClient(c)

            uuids = [
                cfg['UUIDS']['thermostat_temperature'],
                cfg['UUIDS']['thermostat_state']
            ]

            temp_now = self.current_time

            start = '"' + (temp_now + timedelta(minutes=15) -
                           timedelta(days=(month_count) * 30)
                           ).strftime('%Y-%m-%d %H:%M:%S') + ' PST"'
            end = '"' + (temp_now - timedelta(days=(month_count + 1) * 30)
                         ).strftime('%Y-%m-%d %H:%M:%S') + ' PST"'

            dfs = make_dataframe(
                archiver.window_uuids(uuids, end, start, '15min', timeout=120))

            for uid, df in dfs.items():

                if uid == uuids[0]:
                    if 'mean' in df.columns:
                        df = df[['mean']]
                    df.columns = ['tin']
                elif uid == uuids[1]:
                    if 'max' in df.columns:
                        df = df[['max']]
                    df.columns = ['a']

                dfs[uid] = df.resample('15min').mean()

            df = pd.concat([dframe for uid, dframe in dfs.items()], axis=1)
            df['a1'] = df.apply(f1, axis=1)
            df['a2'] = df.apply(f2, axis=1)
            df['tin'] = df['tin'].replace(to_replace=0, method='pad')
            df['temp_next'] = df['tin'].shift(-1)
            df = df.dropna()

            for idx in reversed(df.index):
                if df.at[idx, 'a1'] == 1 and heating_count <= max_action_count:
                    if df.at[idx, 'tin'] <= df.at[idx, 'temp_next']:
                        final_df = final_df.append(df[df.index == idx])
                        heating_count += 1
                elif df.at[idx,
                           'a2'] == 1 and cooling_count < max_action_count:
                    if df.at[idx, 'tin'] >= df.at[idx, 'temp_next']:
                        final_df = final_df.append(df[df.index == idx])
                        cooling_count += 1
                elif df.at[idx, 'a1'] == 0 and df.at[
                        idx,
                        'a2'] == 0 and do_nothing_count < max_action_count:
                    final_df = final_df.append(df[df.index == idx])
                    do_nothing_count += 1
                if heating_count>=max_action_count and cooling_count>=max_action_count\
                 and do_nothing_count>=max_action_count:
                    flag = False
                    break
            month_count += 1

        return shuffle(final_df)