Python bindings to interact with all XBOS services.
Install using pip. Currently requires Python 2.
pip install xbos
Almost all interactions in XBOS begin with a BOSSWAVE client:
from xbos import get_client​# uses $BW2_AGENT, $BW2_DEFAULT_ENTITY by defaultclient = get_client()client = get_client(agent="172.17.0.1:28589",entity="/home/oski/myentity.ent")
xbos.devices
contains bindings for interacting with the following devices:
Thermostat
Plug
Light
The bindings respect the standard XBOS interfaces​
xbos.services
contains bindings for interacting with the following services:
​Archiver (PunDat)​
​Brick (HodDB)​
Below are a set of simple examples
from xbos import get_clientfrom xbos.devices.thermostat import Thermostat​# get a bosswave clientc = get_client() # defaults to $BW2_AGENT, $BW2_DEFAULT_ENTITY​# instantiate a thermostattstat = Thermostat(c, "410testbed/devices/venstar/s.venstar/420lab/i.xbos.thermostat")​# print cached state; blocks until we get first report.# maintains subscription in background.print tstat.heating_setpoint​# batch actuationstate = {"heating_setpoint": 72,"cooling_setpoint": 76}tstat.write(state)​# or individuallytstat.set_heating_setpoint(72)
from xbos import get_clientfrom xbos.services.pundat import DataClient, timestamp, make_dataframe​# get a bosswave clientc = get_client() # defaults to $BW2_AGENT, $BW2_DEFAULT_ENTITY​dc = DataClient(c,archivers=["ucberkeley"])​uuids = dc.uuids('name = "air_temp" and Deployment = "CIEE"')​# get timestampsstart = timestamp('6/25/2017')end = timestamp('6/28/2017')​# get 1-hour window data for the first uuiddata = dc.window_uuids(uuids[0], start, end, '1h')​# get a dataframe from the results, keyed by the UUIDdfs = make_dataframe(data)print dfs[uuids[0]].describe()
from xbos.services.hod import HodClientHTTP​hc = HodClientHTTP("http://ciee.cal-sdb.org")​q = """SELECT ?x ?uri WHERE {?x rdf:type/rdfs:subClassOf* brick:Temperature_Sensor .?x bf:uri ?uri .};"""print hc.do_query(q)#[{u'?uri': u'ciee/sensors/s.hamilton/00126d0700000060/i.temperature/signal/operative',# u'?x': u'hamilton_0060_air_temp'},#{u'?uri': u'ciee/sensors/s.hamilton/00126d070000005e/i.temperature/signal/operative',# u'?x': u'hamilton_005e_air_temp'},#{u'?uri': u'ciee/sensors/s.hamilton/00126d070000005d/i.temperature/signal/operative',# u'?x': u'hamilton_005d_air_temp'},#{u'?uri': u'ciee/sensors/s.hamilton/00126d070000005c/i.temperature/signal/operative',# u'?x': u'hamilton_005c_air_temp'},#{u'?uri': u'ciee/sensors/s.hamilton/00126d070000005b/i.temperature/signal/operative',# u'?x': u'hamilton_005b_air_temp'},#{u'?uri': u'ciee/sensors/s.hamilton/00126d070000005a/i.temperature/signal/operative',# u'?x': u'hamilton_005a_air_temp'},#{u'?uri': u'ciee/sensors/s.hamilton/00126d070000002e/i.temperature/signal/operative',# u'?x': u'hamilton_002e_air_temp'},#{u'?uri': u'ciee/sensors/s.hamilton/00126d070000002c/i.temperature/signal/operative',# u'?x': u'hamilton_002c_air_temp'},#{u'?uri': u'ciee/sensors/s.hamilton/00126d070000002b/i.temperature/signal/operative',# u'?x': u'hamilton_002b_air_temp'},#{u'?uri': u'ciee/sensors/s.hamilton/00126d070000002a/i.temperature/signal/operative',# u'?x': u'hamilton_002a_air_temp'},#{u'?uri': u'ciee/sensors/s.hamilton/00126d0700000029/i.temperature/signal/operative',# u'?x': u'hamilton_0029_air_temp'},#{u'?uri': u'ciee/sensors/s.hamilton/00126d0700000028/i.temperature/signal/operative',# u'?x': u'hamilton_0028_air_temp'},#{u'?uri': u'ciee/sensors/s.hamilton/00126d0700000027/i.temperature/signal/operative',# u'?x': u'hamilton_0027_air_temp'},#{u'?uri': u'ciee/sensors/s.hamilton/00126d0700000025/i.temperature/signal/operative',# u'?x': u'hamilton_0025_air_temp'},#{u'?uri': u'ciee/sensors/s.hamilton/00126d0700000022/i.temperature/signal/operative',# u'?x': u'hamilton_0022_air_temp'}]
from xbos import get_clientfrom xbos.services.pundat import DataClient, timestamp, make_dataframe, merge_dfsfrom xbos.services.hod import HodClientHTTPfrom xbos.devices.thermostat import Thermostat​# get a bosswave clientc = get_client() # defaults to $BW2_AGENT, $BW2_DEFAULT_ENTITY# get a HodDB clienthod = HodClientHTTP("http://ciee.cal-sdb.org")# get an archiver clientarchiver = DataClient(c,archivers=["ucberkeley"])​# query for CIEE occupancy sensorsq = """SELECT ?sensor ?uuid WHERE {?sensor rdf:type/rdfs:subClassOf* brick:Occupancy_Sensor .?sensor bf:uuid ?uuid .};"""res = hod.do_query(q)uuids = [r["?uuid"] for r in res]sensors = [r["?sensor"] for r in res]lookup = dict(zip(uuids, sensors))for uuid, sensorname in lookup.items():print uuid, '=>', sensornamestart = '"2017-08-21 00:00:00 PST"'end = '"2017-07-20 00:00:00 PST"'# get 15min interval datadfs = make_dataframe(archiver.window_uuids(uuids, end, start, '15min', timeout=120))# resamples the merged dataframes to 10min mean bucketsmerged = merge_dfs(dfs, resample='10T', do_mean=True)merged.to_csv("data.csv")
from xbos import get_clientfrom xbos.services.pundat import DataClient, timestamp, make_dataframefrom xbos.services.hod import HodClientHTTPfrom xbos.devices.thermostat import Thermostat​# get a bosswave clientc = get_client() # defaults to $BW2_AGENT, $BW2_DEFAULT_ENTITY# get a HodDB clienthc = HodClientHTTP("http://ciee.cal-sdb.org")​# query for CIEE thermostatsq = """SELECT ?tstat ?uri WHERE {?tstat rdf:type brick:Thermostat .?tstat bf:uri ?uri .};"""ciee_tstats = hc.do_query(q)​# instantiate some classeststats = {}for info in ciee_tstats:tstats[info['?tstat']] = Thermostat(c, info['?uri'])​# print some settingsfor name, tstat in tstats.items():print name, 'has heat/cool', tstat.heating_setpoint, tstat.cooling_setpoint