├── .gitignore ├── .gitmodules ├── 1. Brick Composition.ipynb ├── 2. Brick Conversion (Tutorial).ipynb ├── 2.1. Brick Conversion (Full).ipynb ├── 3. Brick Queries and Data Analysis.ipynb ├── LICENSE ├── README.md ├── common.py ├── data ├── 1.csv ├── 10.csv ├── 11.csv ├── 12.csv ├── 13.csv ├── 14.csv ├── 15.csv ├── 16.csv ├── 17.csv ├── 18.csv ├── 19.csv ├── 2.csv ├── 20.csv ├── 21.csv ├── 22.csv ├── 23.csv ├── 24.csv ├── 25.csv ├── 26.csv ├── 27.csv ├── 28.csv ├── 29.csv ├── 3.csv ├── 30.csv ├── 31.csv ├── 32.csv ├── 33.csv ├── 34.csv ├── 35.csv ├── 36.csv ├── 37.csv ├── 38.csv ├── 39.csv ├── 4.csv ├── 40.csv ├── 41.csv ├── 42.csv ├── 43.csv ├── 44.csv ├── 45.csv ├── 46.csv ├── 47.csv ├── 48.csv ├── 49.csv ├── 5.csv ├── 50.csv ├── 51.csv ├── 6.csv ├── 7.csv ├── 8.csv ├── 9.csv └── summer │ ├── 1.csv │ ├── 10.csv │ ├── 11.csv │ ├── 12.csv │ ├── 13.csv │ ├── 14.csv │ ├── 15.csv │ ├── 16.csv │ ├── 17.csv │ ├── 18.csv │ ├── 19.csv │ ├── 2.csv │ ├── 20.csv │ ├── 21.csv │ ├── 22.csv │ ├── 23.csv │ ├── 24.csv │ ├── 25.csv │ ├── 26.csv │ ├── 27.csv │ ├── 28.csv │ ├── 29.csv │ ├── 3.csv │ ├── 30.csv │ ├── 31.csv │ ├── 32.csv │ ├── 33.csv │ ├── 34.csv │ ├── 35.csv │ ├── 36.csv │ ├── 37.csv │ ├── 38.csv │ ├── 39.csv │ ├── 4.csv │ ├── 40.csv │ ├── 41.csv │ ├── 42.csv │ ├── 43.csv │ ├── 44.csv │ ├── 45.csv │ ├── 46.csv │ ├── 47.csv │ ├── 48.csv │ ├── 49.csv │ ├── 5.csv │ ├── 50.csv │ ├── 51.csv │ ├── 6.csv │ ├── 7.csv │ ├── 8.csv │ └── 9.csv ├── files ├── classgraph.png ├── composition │ ├── ahu.png │ ├── ahu_room.png │ ├── ahu_room_vav.png │ ├── ahu_room_vav_zone.png │ └── ahu_room_vav_zone_znt.png ├── feeds_query.png ├── refresher.png ├── tempsensorclass.png ├── tempsensorquery.png ├── type_query.png ├── vavclass.png ├── vavclassq.png ├── vavhvac.png └── vavneighbor.png ├── metadata ├── brick_sample_building_raw.csv ├── equip_map.json ├── re_dict.json ├── sample_building.ttl └── zone_room_map.json ├── query.py ├── sample_building.ttl └── sample_building_sol.ttl /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # Jupyter Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # SageMath parsed files 80 | *.sage.py 81 | 82 | # dotenv 83 | .env 84 | 85 | # virtualenv 86 | .venv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | .spyproject 93 | 94 | # Rope project settings 95 | .ropeproject 96 | 97 | # mkdocs documentation 98 | /site 99 | 100 | # mypy 101 | .mypy_cache/ 102 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "Brick"] 2 | path = Brick 3 | url = https://github.com/BuildSysUniformMetadata/Brick.git 4 | -------------------------------------------------------------------------------- /1. Brick Composition.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "# Install necessary Python pakcages\n", 12 | "# rdflib: RDF composition and querying with SPARQL in Python.\n", 13 | "from rdflib import RDFS, RDF, Namespace, Graph, URIRef\n", 14 | "\n", 15 | "# Other imports\n", 16 | "from common import *" 17 | ] 18 | }, 19 | { 20 | "cell_type": "markdown", 21 | "metadata": {}, 22 | "source": [ 23 | "## 1. Initialize a graph and define namespaces\n", 24 | "1. Initialize a graph in rdflib. A graph in RDF is like a whiteboard where you will put your triples.\n", 25 | "2. A URI represents an entity and a URI consists of a namespace and an identifier. All URIs should be unique and namespaces are prefixes that help avoiding reusing the same identifiers in other domains.\n", 26 | " - Namespace: \"http://example.com#\", Identifier: \"AHU-1\", -> URI: \"http://example.com#AHU-1\"\n", 27 | " - E.g., If you want to use AHU-1 for Building-A and Building-B, you may want to use different namespaces for different buildings while using AHU-1 consistently.\n", 28 | "3. We use following namespaces:\n", 29 | " - RDFS and RDF are namespaces defined for general purpose in Semantic Web.\n", 30 | " - BRICK is Brick's namespace for TagSets. \n", 31 | " - EX is our building's namespace. We will intantiate our entities under this namespace." 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": null, 37 | "metadata": { 38 | "collapsed": true 39 | }, 40 | "outputs": [], 41 | "source": [ 42 | "g = Graph() # Initialize a graph\n", 43 | "RDFS # predefined namespace as 'http://www.w3.org/2000/01/rdf-schema#'\n", 44 | "RDF # predefined namespace as 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'\n", 45 | "BRICK = Namespace('https://brickschema.org/schema/1.0.1/Brick#')\n", 46 | "BF = Namespace('https://brickschema.org/schema/1.0.1/BrickFrame#')\n", 47 | "EX = Namespace('http://example.com#')\n", 48 | "g.bind('ex', EX)\n", 49 | "g.bind('brick', BRICK)\n", 50 | "g.bind('bf', BF)\n", 51 | "g.bind('rdfs', RDFS)\n", 52 | "g.bind('rdf', RDF)" 53 | ] 54 | }, 55 | { 56 | "cell_type": "markdown", 57 | "metadata": {}, 58 | "source": [ 59 | "## 2. Adding triples\n", 60 | "### 2.1. Your first triple.\n", 61 | "Each triple consists of Subject-Predicate-Object. Each of S-P-O is a URI. Let's make \"*AHU-1 is an instance of AHU TagSet*\". AHU-1 is the name of our instance in EX. AHU in Brick is a TagSet. AHU-1 and AHU is associated with instantiation relationship. \n", 62 | "\n", 63 | "- In RDF (Turtle syntax), their full URIs are:\n", 64 | "```turtle\n", 65 | "\n", 66 | "\n", 67 | "\n", 68 | "```\n", 69 | "- It can be reduced by using namespace prefixes (Turtle syntax)\n", 70 | "```turtle\n", 71 | "ex:AHU-1\n", 72 | "rdf:type # It is often written as \"a\", which is an abbreviation of \"is a\".\n", 73 | "brick:AHU\n", 74 | "```\n", 75 | "- Python RDFLib\n", 76 | "```python\n", 77 | "EX['AHU-1']\n", 78 | "RDF['type']\n", 79 | "BRICK['AHU']\n", 80 | "```\n", 81 | "\n", 82 | "Triple is the minimum unit that you can add into a graph. In is represented as just enumeration of S-P-O in a line in Turtle and a tuple in RDFLib. Below examples represent same things.\n", 83 | "\n", 84 | "- Turtle with full namespaces\n", 85 | "```turtle\n", 86 | " .\n", 87 | "```\n", 88 | "- Turtle with namesapce abbreviations\n", 89 | "```turtle\n", 90 | "ex:AHU-1 rdf:type brick:AHU .\n", 91 | "```\n", 92 | "- RDFLib (Python code)\n", 93 | "```python\n", 94 | "(EX['AHU-1'], RDF['type'], BRICK['AHU'])\n", 95 | "```\n", 96 | "\n", 97 | "We will use RDFLib for composition in Python and serialize them in Turtle." 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": null, 103 | "metadata": { 104 | "collapsed": true 105 | }, 106 | "outputs": [], 107 | "source": [ 108 | "# Add the triple using RDFLib's syntactic sugar.\n", 109 | "\n", 110 | "first_triple1 = (EX['AHU-1'], RDF.type, BRICK['AHU']) # AHU-1 is an instance of a TagSet, BLD-A\n", 111 | "print('The triple in Python:')\n", 112 | "print(first_triple1)\n", 113 | "print('\\nThe triple in Turtle:')\n", 114 | "g.add(first_triple1)\n", 115 | "print_graph(g)\n", 116 | "# \"a\" is a common abbreviation of \"rdf:type\"'" 117 | ] 118 | }, 119 | { 120 | "cell_type": "code", 121 | "execution_count": null, 122 | "metadata": { 123 | "collapsed": true 124 | }, 125 | "outputs": [], 126 | "source": [ 127 | "# Add the triple using RDFLib with bare URIs.\n", 128 | "# first_triple1 is same as first_triple2 but in different style.\n", 129 | "\n", 130 | "first_triple2 = (URIRef('http://example.com#AHU-1'), URIRef('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), URIRef('https://brickschema.org/schema/1.0.1/Brick#AHU'))\n", 131 | "g.add(first_triple2)\n", 132 | "print_graph(g)" 133 | ] 134 | }, 135 | { 136 | "cell_type": "markdown", 137 | "metadata": {}, 138 | "source": [ 139 | "" 140 | ] 141 | }, 142 | { 143 | "cell_type": "markdown", 144 | "metadata": {}, 145 | "source": [ 146 | "### 2.2. Add location information for AHU-1\n", 147 | "1. Let's add other information, AHU-1's location. Say AHU-1 is located in Room-B100, which is in the basement.\n", 148 | " - Say the basement's URI is [ex:Room-B100](http://example.com#Room-B2150).\n", 149 | " - Define the basement is an instance of [brick:Basement](https://brickschema.org/schema/1.0.1/Brick#Basement).\n", 150 | " - AHU-1 is located in BLD-A. [bf:isLocatedIn](https://brickschema.org/schema/1.0.1/BrickFrame#isLocatedIn)." 151 | ] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "execution_count": null, 156 | "metadata": { 157 | "collapsed": true 158 | }, 159 | "outputs": [], 160 | "source": [ 161 | "# Use RDFLib syntax hereafter\n", 162 | "\n", 163 | "# Rm-B100 is an instance of Basement.\n", 164 | "g.add((EX['Room-B100'], RDF['type'], BRICK['Basement'])) \n", 165 | "\n", 166 | "# AHU-1 is located in Room-B100.\n", 167 | "g.add((EX['AHU-1'], BF['isLocatedIn'], EX['Room-B100']))\n", 168 | "\n", 169 | "print_graph(g)" 170 | ] 171 | }, 172 | { 173 | "cell_type": "markdown", 174 | "metadata": {}, 175 | "source": [ 176 | "" 177 | ] 178 | }, 179 | { 180 | "cell_type": "markdown", 181 | "metadata": {}, 182 | "source": [ 183 | "### Excercise 2.1. Add other information for AHU-1\n", 184 | "1. We stated that \"AHU-1\" is an instance of Brick's AHU TagSet. What kind of information do you want to put more? Let's add those: \n", 185 | " - Define VAV-2150 is an instance of VAV (https://brickschema.org/schema/1.0.1/Brick#VAV)\n", 186 | " - Define AHU-1 feeds air to VAV-2150 (https://brickschema.org/schema/1.0.1/BrickFrame#feeds)" 187 | ] 188 | }, 189 | { 190 | "cell_type": "code", 191 | "execution_count": null, 192 | "metadata": { 193 | "collapsed": true, 194 | "scrolled": true 195 | }, 196 | "outputs": [], 197 | "source": [ 198 | "# VAV-2150 is an instance of VAV\n", 199 | "g.add((EX['VAV-2150'], RDF['type'], BRICK['VAV']))\n", 200 | "\n", 201 | "# AHU-1 feeds VAV-2150\n", 202 | "g.add((EX['AHU-1'], BF['feeds'], BRICK['VAV-2150']))\n", 203 | "\n", 204 | "print_graph(g)" 205 | ] 206 | }, 207 | { 208 | "cell_type": "markdown", 209 | "metadata": {}, 210 | "source": [ 211 | "### Expected Output:\n", 212 | "```turtle\n", 213 | "@prefix bf: .\n", 214 | "@prefix brick: .\n", 215 | "@prefix ex: .\n", 216 | "@prefix rdf: .\n", 217 | "@prefix rdfs: .\n", 218 | "@prefix xml: .\n", 219 | "@prefix xsd: .\n", 220 | "\n", 221 | "ex:AHU-1 a brick:AHU ;\n", 222 | " bf:feeds ex:VAV-2150 ;\n", 223 | " bf:isLocatedIn ex:Room-B100 .\n", 224 | "\n", 225 | "ex:Room-B100 a brick:Basement .\n", 226 | "\n", 227 | "ex:VAV-2150 a brick:VAV .\n", 228 | "```" 229 | ] 230 | }, 231 | { 232 | "cell_type": "markdown", 233 | "metadata": {}, 234 | "source": [ 235 | "" 236 | ] 237 | }, 238 | { 239 | "cell_type": "markdown", 240 | "metadata": {}, 241 | "source": [ 242 | "## Excercise 2.2. Add a Zone associated with VAV-2150\n", 243 | "1. Let's define Zone that VAV-2150 is feeding.\n", 244 | " - Define Zone-2150 is an instance of HVAC_Zone\n", 245 | " - Define VAV-2150 feeds Zone-2150\n", 246 | " - Define AHU-1 feeds VAV-2150" 247 | ] 248 | }, 249 | { 250 | "cell_type": "code", 251 | "execution_count": null, 252 | "metadata": { 253 | "collapsed": true 254 | }, 255 | "outputs": [], 256 | "source": [ 257 | "# Zone-2150 is an instance of HVAC_Zone\n", 258 | "g.add((EX['Zone-2150'], RDF['type'], BRICK['HVAC_Zone']))\n", 259 | "\n", 260 | "# VAV-2150 feeds Zone-2150\n", 261 | "g.add((EX['VAV-2150'], BF['feeds'], EX['Zone-2150']))\n", 262 | "\n", 263 | "print_graph(g)" 264 | ] 265 | }, 266 | { 267 | "cell_type": "markdown", 268 | "metadata": {}, 269 | "source": [ 270 | "### Expected Output:\n", 271 | "```turtle\n", 272 | "@prefix bf: .\n", 273 | "@prefix brick: .\n", 274 | "@prefix ex: .\n", 275 | "@prefix rdf: .\n", 276 | "@prefix rdfs: .\n", 277 | "@prefix xml: .\n", 278 | "@prefix xsd: .\n", 279 | "\n", 280 | "ex:AHU-1 a brick:AHU ;\n", 281 | " bf:feeds brick:VAV-2150 ;\n", 282 | " bf:isLocatedIn ex:Room-B100 .\n", 283 | "\n", 284 | "ex:VAV-2150 a brick:VAV ;\n", 285 | " bf:feeds ex:Zone-2150 .\n", 286 | "\n", 287 | "ex:Room-B100 a brick:Basement .\n", 288 | "\n", 289 | "ex:Zone-2150 a brick:HVAC_Zone .\n", 290 | "```" 291 | ] 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "metadata": {}, 296 | "source": [ 297 | "" 298 | ] 299 | }, 300 | { 301 | "cell_type": "markdown", 302 | "metadata": {}, 303 | "source": [ 304 | "### Excercise 2.3. Add a Zone_Temperature_Sensor called ZNT-2150 and associate it with others.\n", 305 | "1. Define ZNT-2150 as an instance of Zone_Temperature_Sensor\n", 306 | "2. ZNT-2150 is point of VAV-2150 (i.e., ZNT-2150 functions for VAV-2150)\n", 307 | "3. ZNT-2150 is located in Zone-2150." 308 | ] 309 | }, 310 | { 311 | "cell_type": "code", 312 | "execution_count": null, 313 | "metadata": { 314 | "collapsed": true 315 | }, 316 | "outputs": [], 317 | "source": [ 318 | "# ZNT-2150 is an instance of Zone_Temperature_Sensor\n", 319 | "g.add((EX['ZNT-2150'], RDF['type'], BRICK['Zone_Temperature_Sensor']))\n", 320 | "\n", 321 | "# ZNT-2150 is point of VAV-2150\n", 322 | "g.add((EX['ZNT-2150'], BF['isPointOf'], EX['VAV-2150']))\n", 323 | "\n", 324 | "# ZNT-2150 is located In Zone-2150\n", 325 | "g.add((EX['ZNT-2150'], BF['isLocatedIn'], EX['Zone-2150']))\n", 326 | "\n", 327 | "print_graph(g)" 328 | ] 329 | }, 330 | { 331 | "cell_type": "markdown", 332 | "metadata": {}, 333 | "source": [ 334 | "### Expected Output:\n", 335 | "```turtle\n", 336 | "ex:AHU-1 a brick:AHU ;\n", 337 | " bf:feeds brick:VAV-2150 ;\n", 338 | " bf:isLocatedIn ex:Room-B100 .\n", 339 | "\n", 340 | "ex:ZNT-2150 a brick:Zone_Temperature_Sensor ;\n", 341 | " bf:isLocatedIn ex:Zone-2150 ;\n", 342 | " bf:isPointOf ex:VAV-2150 .\n", 343 | "\n", 344 | "ex:Room-B100 a brick:Basement .\n", 345 | "\n", 346 | "ex:VAV-2150 a brick:VAV ;\n", 347 | " bf:feeds ex:Zone-2150 .\n", 348 | "\n", 349 | "ex:Zone-2150 a brick:HVAC_Zone .\n", 350 | "```" 351 | ] 352 | }, 353 | { 354 | "cell_type": "markdown", 355 | "metadata": {}, 356 | "source": [ 357 | "" 358 | ] 359 | }, 360 | { 361 | "cell_type": "markdown", 362 | "metadata": {}, 363 | "source": [ 364 | "## 3. Save/Load the graph in Turtle \n", 365 | "1. We can save and load the graph. We stick to Turtle format among multiple possible serialization formats.\n", 366 | "2. When you load, you can load multiple graph files into a graph." 367 | ] 368 | }, 369 | { 370 | "cell_type": "code", 371 | "execution_count": null, 372 | "metadata": { 373 | "collapsed": true 374 | }, 375 | "outputs": [], 376 | "source": [ 377 | "# Save the graph\n", 378 | "g.serialize(destination='sample_building_sol.ttl', format='turtle') # You can open the file in jupyter GUI.\n", 379 | "\n", 380 | "# Load the graph\n", 381 | "g = Graph() # Initialize a new graph.\n", 382 | "g.parse('sample_building_sol.ttl', format='turtle') # Load the stored graph.\n", 383 | "g.parse('Brick/dist/Brick.ttl', format='turtle') # Load Brick schema." 384 | ] 385 | }, 386 | { 387 | "cell_type": "markdown", 388 | "metadata": {}, 389 | "source": [ 390 | "## 4. SPARQL Basic\n", 391 | "1. [SPARQL](https://www.w3.org/TR/sparql11-query/) is a standard query langauge over RDF.\n", 392 | "2. You can define variables and a query pattern, then the SPARQL querying engine returns instances matching the pattern.\n", 393 | "3. Define variables followed by a question mark (?) after \"select\". Define a desired pattern inside \"where\". \n", 394 | " - Find ?s where any ?p and any ?o are associated with ?s as predicate and object individually. \n", 395 | " ```SPARQL\n", 396 | " select ?s where {\n", 397 | " ?s ?p ?o .\n", 398 | " }\n", 399 | " ```\n", 400 | " This returns all subjects in the entire graph.\n", 401 | " - Find ?s where ?s is a type of any subclasses of Sensor and also ?s is located in Room-101.\n", 402 | " ```SPARQL\n", 403 | " PREFIX brick: \n", 404 | " PREFIX bf: \n", 405 | " PREFIX rdf: \n", 406 | " PREFIX rdfs: \n", 407 | " PREFIX rdf: \n", 408 | " PREFIX ex: \n", 409 | " select ?s where {\n", 410 | " ?sensortype rdfs:subClassOf+ brick:Sensor .\n", 411 | " ?s rdf:type ?sensortype .\n", 412 | " ?s bf:isLocatedIn ex:Room-101 .\n", 413 | " }\n", 414 | " ```" 415 | ] 416 | }, 417 | { 418 | "cell_type": "markdown", 419 | "metadata": {}, 420 | "source": [ 421 | "### 4.1. Iterating SPARQL Results in RDFLib.\n", 422 | "\n", 423 | "- A row of results in SPARQL is a tuple of variables in the query.\n", 424 | "- Let's see the result of the very basic query." 425 | ] 426 | }, 427 | { 428 | "cell_type": "code", 429 | "execution_count": null, 430 | "metadata": { 431 | "collapsed": true 432 | }, 433 | "outputs": [], 434 | "source": [ 435 | "### Querying All S, P and O.\n", 436 | "\n", 437 | "g = Graph()\n", 438 | "g.parse('sample_building_sol.ttl', format='turtle')\n", 439 | "q = \"\"\"\n", 440 | "select ?s ?p ?o where {\n", 441 | "?s ?p ?o .\n", 442 | "}\n", 443 | "\"\"\"\n", 444 | "res = g.query(q)\n", 445 | "for row in res:\n", 446 | " print(row)" 447 | ] 448 | }, 449 | { 450 | "cell_type": "code", 451 | "execution_count": null, 452 | "metadata": { 453 | "collapsed": true 454 | }, 455 | "outputs": [], 456 | "source": [ 457 | "### Querying Only S and P \n", 458 | "# ?o is inside the where clauses but not in the varible declarations. \n", 459 | "# ?o will be considered for the pattern but not included in the answer..\n", 460 | "\n", 461 | "q = \"\"\"\n", 462 | "select ?s ?p where {\n", 463 | "?s ?p ?o .\n", 464 | "}\n", 465 | "\"\"\"\n", 466 | "res = g.query(q)\n", 467 | "for row in res:\n", 468 | " print(row)" 469 | ] 470 | }, 471 | { 472 | "cell_type": "markdown", 473 | "metadata": {}, 474 | "source": [ 475 | "### 4.2. Subclass and intsance relationships" 476 | ] 477 | }, 478 | { 479 | "cell_type": "code", 480 | "execution_count": null, 481 | "metadata": { 482 | "collapsed": true 483 | }, 484 | "outputs": [], 485 | "source": [ 486 | "# Load the graph with Brick for querying.\n", 487 | "g = Graph() # Initialize a new graph.\n", 488 | "g.parse('sample_building_sol.ttl', format='turtle') # Load the stored graph.\n", 489 | "g.parse('Brick/dist/Brick.ttl', format='turtle') # Load Brick schema. We need it to exploit the hierarchy." 490 | ] 491 | }, 492 | { 493 | "cell_type": "markdown", 494 | "metadata": {}, 495 | "source": [ 496 | "" 497 | ] 498 | }, 499 | { 500 | "cell_type": "code", 501 | "execution_count": null, 502 | "metadata": { 503 | "collapsed": true 504 | }, 505 | "outputs": [], 506 | "source": [ 507 | "### Find ?s where ?s is an instance of Zone_Temperature_Sensor.\n", 508 | "\n", 509 | "q = \"\"\"\n", 510 | "PREFIX brick: \n", 511 | "PREFIX rdf: \n", 512 | "PREFIX rdfs: \n", 513 | "PREFIX rdf: \n", 514 | "\n", 515 | "select ?s where {\n", 516 | "?s rdf:type brick:Zone_Temperature_Sensor.\n", 517 | "}\n", 518 | "\"\"\"\n", 519 | "\n", 520 | "res = g.query(q)\n", 521 | "for row in res:\n", 522 | " print(row)" 523 | ] 524 | }, 525 | { 526 | "cell_type": "code", 527 | "execution_count": null, 528 | "metadata": { 529 | "collapsed": true 530 | }, 531 | "outputs": [], 532 | "source": [ 533 | "### Find ?s where ?s is any type of Sensor.\n", 534 | "\n", 535 | "q = \"\"\"\n", 536 | "PREFIX brick: \n", 537 | "PREFIX rdf: \n", 538 | "PREFIX rdfs: \n", 539 | "PREFIX rdf: \n", 540 | "select ?s where {\n", 541 | "?s rdf:type ?sensorClass .\n", 542 | "?sensorClass rdfs:subClassOf+ brick:Sensor .\n", 543 | "}\n", 544 | "\"\"\"\n", 545 | "res = g.query(q)\n", 546 | "for row in res:\n", 547 | " print(row)" 548 | ] 549 | }, 550 | { 551 | "cell_type": "markdown", 552 | "metadata": {}, 553 | "source": [ 554 | "## Excercise 4.1. Find zones.\n", 555 | "1. Let's find zones. Use the rdf:type and/or rdfs:subClassOf+ " 556 | ] 557 | }, 558 | { 559 | "cell_type": "code", 560 | "execution_count": null, 561 | "metadata": { 562 | "collapsed": true, 563 | "scrolled": false 564 | }, 565 | "outputs": [], 566 | "source": [ 567 | "q = \"\"\"\n", 568 | "PREFIX brick: \n", 569 | "PREFIX rdf: \n", 570 | "PREFIX rdfs: \n", 571 | "PREFIX bf: \n", 572 | "\n", 573 | "select ?z where {\n", 574 | "?z rdf:type brick:HVAC_Zone .\n", 575 | "#?z rdf:type/rdfs:subClassOf brick:Zone . # use this if you want to be more agnostic to zone types.\n", 576 | "}\n", 577 | "\"\"\"\n", 578 | "res = g.query(q)\n", 579 | "for row in res:\n", 580 | " print(row)" 581 | ] 582 | }, 583 | { 584 | "cell_type": "markdown", 585 | "metadata": {}, 586 | "source": [ 587 | "### Expected Output:\n", 588 | "(rdflib.term.URIRef('http://example.com#Zone-2150'),)\n" 589 | ] 590 | }, 591 | { 592 | "cell_type": "markdown", 593 | "metadata": {}, 594 | "source": [ 595 | "## Excercise 4.2. Find zones fed+ by AHU-1.\n", 596 | "1. Extend Excercise 3.1. to relate feeds relationships with the zones found there." 597 | ] 598 | }, 599 | { 600 | "cell_type": "code", 601 | "execution_count": null, 602 | "metadata": { 603 | "collapsed": true 604 | }, 605 | "outputs": [], 606 | "source": [ 607 | "# VAV-2150 is an instance of VAV\n", 608 | "q = \"\"\"\n", 609 | "PREFIX brick: \n", 610 | "PREFIX rdf: \n", 611 | "PREFIX rdfs: \n", 612 | "PREFIX bf: \n", 613 | "select ?z where {\n", 614 | "?z rdf:type brick:HVAC_Zone .\n", 615 | "ex:AHU-1 bf:feeds+ ?z .\n", 616 | "}\n", 617 | "\"\"\"\n", 618 | "res = g.query(q)\n", 619 | "for row in res:\n", 620 | " print(row)" 621 | ] 622 | }, 623 | { 624 | "cell_type": "markdown", 625 | "metadata": {}, 626 | "source": [ 627 | "### 4.3. Querying tuples.\n", 628 | "1. SPARQL is capable of finding tuples of variables. The variables after select constitutte a tuple format." 629 | ] 630 | }, 631 | { 632 | "cell_type": "code", 633 | "execution_count": null, 634 | "metadata": { 635 | "collapsed": true 636 | }, 637 | "outputs": [], 638 | "source": [ 639 | "q = \"\"\"\n", 640 | "PREFIX brick: \n", 641 | "PREFIX rdf: \n", 642 | "PREFIX rdfs: \n", 643 | "PREFIX bf: \n", 644 | "select ?s ?r where {\n", 645 | " ?s bf:isLocatedIn ?r .\n", 646 | " ?s rdf:type brick:Zone_Temperature_Sensor .\n", 647 | " ?r rdf:type brick:HVAC_Zone .\n", 648 | "}\n", 649 | "\n", 650 | "\"\"\"\n", 651 | "res = g.query(q)\n", 652 | "for row in res:\n", 653 | " print(row)" 654 | ] 655 | } 656 | ], 657 | "metadata": { 658 | "kernelspec": { 659 | "display_name": "Python 3", 660 | "language": "python", 661 | "name": "python3" 662 | }, 663 | "language_info": { 664 | "codemirror_mode": { 665 | "name": "ipython", 666 | "version": 3 667 | }, 668 | "file_extension": ".py", 669 | "mimetype": "text/x-python", 670 | "name": "python", 671 | "nbconvert_exporter": "python", 672 | "pygments_lexer": "ipython3", 673 | "version": "3.6.1" 674 | } 675 | }, 676 | "nbformat": 4, 677 | "nbformat_minor": 2 678 | } 679 | -------------------------------------------------------------------------------- /2. Brick Conversion (Tutorial).ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "# Install necessary Python pakcages\n", 12 | "# rdflib: RDF composition and querying with SPARQL in Python.\n", 13 | "from rdflib import RDFS, RDF, Namespace, Graph, URIRef, Literal\n", 14 | "\n", 15 | "from common import *" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": null, 21 | "metadata": { 22 | "collapsed": true 23 | }, 24 | "outputs": [], 25 | "source": [ 26 | "import json\n", 27 | "import pandas as pd\n", 28 | "import re" 29 | ] 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "metadata": {}, 34 | "source": [ 35 | "### Sample raw metadata\n", 36 | "\n", 37 | "1. Those data are fairly semi-structured by some conventions.\n", 38 | " - Each information is somewhat separated by dots." 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": null, 44 | "metadata": { 45 | "collapsed": true 46 | }, 47 | "outputs": [], 48 | "source": [ 49 | "raw_metadata_dict = {\n", 50 | " '51': 'BLDA.RM-2150..ZN-T',\n", 51 | " '43': 'BLDA.RM-2150..DMPR-POS',\n", 52 | " '1': 'BLDA.AH1.CHWR1-T'\n", 53 | "}" 54 | ] 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "metadata": {}, 59 | "source": [ 60 | "### Regular expressions (RE)\n", 61 | "1. We will use regular expressions to identify if certain information is included in the metadata.\n", 62 | "2. Assuming that each information is separated by dots." 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": null, 68 | "metadata": { 69 | "collapsed": true 70 | }, 71 | "outputs": [], 72 | "source": [ 73 | "# key: RE pattern, value: identified TagSet.\n", 74 | "re_dict = {\n", 75 | " 'BLDA': 'Building',\n", 76 | " 'AH': 'AHU',\n", 77 | " 'CHWR\\\\d-T': 'Chilled_Water_Return_Temperature_Sensor',\n", 78 | " 'RM-\\\\d+': 'HVAC_Zone',\n", 79 | " 'DMPR-POS': 'Damper_Position_Sensor',\n", 80 | " 'ZN-T': 'Zone_Temperature_Sensor'\n", 81 | " \n", 82 | "}" 83 | ] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "metadata": {}, 88 | "source": [ 89 | "### VAV <-> Zone\n", 90 | "1. VAV information is omitted in the metadata. From the prior knowledge, a VAV corresponds to a Zone." 91 | ] 92 | }, 93 | { 94 | "cell_type": "markdown", 95 | "metadata": {}, 96 | "source": [ 97 | "### Zone <-> Room information\n", 98 | "1. It is usually not given in metadata accessible through BMSes.\n", 99 | "2. You need to make such information from any source you have (asking building managers or extract it from a schematic.)\n", 100 | "3. Assume that it's given as below." 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": null, 106 | "metadata": {}, 107 | "outputs": [], 108 | "source": [ 109 | "zone_room_map = {\n", 110 | " \"RM-2150\": [\"RM-2151\", \"RM-2152\"]\n", 111 | "}" 112 | ] 113 | }, 114 | { 115 | "cell_type": "markdown", 116 | "metadata": {}, 117 | "source": [ 118 | "### AHU <-> VAV information.\n", 119 | "1. It is also not given by BMSes usually.\n", 120 | "2. Assume given as below" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": null, 126 | "metadata": { 127 | "collapsed": true 128 | }, 129 | "outputs": [], 130 | "source": [ 131 | "feeds_map = {\n", 132 | " 'AH1': 'VAV_RM-2150'\n", 133 | "}" 134 | ] 135 | }, 136 | { 137 | "cell_type": "markdown", 138 | "metadata": {}, 139 | "source": [ 140 | "### Init an RDF whiteboard." 141 | ] 142 | }, 143 | { 144 | "cell_type": "code", 145 | "execution_count": null, 146 | "metadata": { 147 | "collapsed": true 148 | }, 149 | "outputs": [], 150 | "source": [ 151 | "g = Graph() # Initialize a graph\n", 152 | "RDFS # predefined namespace as 'http://www.w3.org/2000/01/rdf-schema#'\n", 153 | "RDF # predefined namespace as 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'\n", 154 | "BRICK = Namespace('https://brickschema.org/schema/1.0.1/Brick#')\n", 155 | "BF = Namespace('https://brickschema.org/schema/1.0.1/BrickFrame#')\n", 156 | "EX = Namespace('http://example.com#')\n", 157 | "g.bind('ex', EX)\n", 158 | "g.bind('brick', BRICK)\n", 159 | "g.bind('bf', BF)\n", 160 | "g.bind('rdfs', RDFS)\n", 161 | "g.bind('rdf', RDF)\n", 162 | "\n" 163 | ] 164 | }, 165 | { 166 | "cell_type": "markdown", 167 | "metadata": {}, 168 | "source": [ 169 | "### Let's convert into Brick.\n", 170 | "- We will convert the first metadata first to see each step and then the others in a loop." 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": null, 176 | "metadata": {}, 177 | "outputs": [], 178 | "source": [ 179 | "# Initialization: Words separation\n", 180 | "vendor_name = raw_metadata_dict['51']\n", 181 | "entity_dict = dict() # This will contain all entities found in this vendor_name\n", 182 | "raw_words = vendor_name.split('.') # This building uses '.' as a delimiter but not always it's comprehensive.\n", 183 | "print('Raw metadata: {0}\\nSeparated raw words: {1}'.format(vendor_name, raw_words))" 184 | ] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": null, 189 | "metadata": {}, 190 | "outputs": [], 191 | "source": [ 192 | "# Find entities in the words\n", 193 | "entity_dict = dict()\n", 194 | "for word in raw_words:\n", 195 | " for re_rule, tagset in re_dict.items():\n", 196 | " if re.findall(re_rule, word):\n", 197 | " entity_dict[word] = tagset" 198 | ] 199 | }, 200 | { 201 | "cell_type": "code", 202 | "execution_count": null, 203 | "metadata": {}, 204 | "outputs": [], 205 | "source": [ 206 | "# Define instance relationships\n", 207 | "for entity, tagset in entity_dict.items():\n", 208 | " g.add((EX[entity], RDF['type'], BRICK[tagset]))\n", 209 | "print_graph(g)" 210 | ] 211 | }, 212 | { 213 | "cell_type": "code", 214 | "execution_count": null, 215 | "metadata": {}, 216 | "outputs": [], 217 | "source": [ 218 | "# Assumtion that Zone is associated with VAV\n", 219 | "for entity, tagset in entity_dict.items():\n", 220 | " if tagset == 'HVAC_Zone':\n", 221 | " vav_name = 'VAV_' + entity\n", 222 | " g.add((EX[vav_name], RDF['type'], BRICK['VAV']))\n", 223 | " g.add((EX[vav_name], BF['feeds'], EX[entity]))\n", 224 | "print_graph(g)" 225 | ] 226 | }, 227 | { 228 | "cell_type": "code", 229 | "execution_count": null, 230 | "metadata": {}, 231 | "outputs": [], 232 | "source": [ 233 | "# Assumtion that zone and ZNT has location relationship\n", 234 | "for entity, tagset in entity_dict.items():\n", 235 | " if tagset == 'Zone_Temperature_Sensor':\n", 236 | " for entity2, tagset2 in entity_dict.items():\n", 237 | " if tagset2 == 'HVAC_Zone':\n", 238 | " g.add((EX[entity], BF['isLocatedIn'], EX[entity2]))\n", 239 | "print_graph(g)" 240 | ] 241 | }, 242 | { 243 | "cell_type": "markdown", 244 | "metadata": {}, 245 | "source": [ 246 | "### Apply the rules to the entire raw metadata\n", 247 | "\n", 248 | "Refer the full versoin of Brick Conversion for actual iteration." 249 | ] 250 | } 251 | ], 252 | "metadata": { 253 | "kernelspec": { 254 | "display_name": "Python 3", 255 | "language": "python", 256 | "name": "python3" 257 | }, 258 | "language_info": { 259 | "codemirror_mode": { 260 | "name": "ipython", 261 | "version": 3 262 | }, 263 | "file_extension": ".py", 264 | "mimetype": "text/x-python", 265 | "name": "python", 266 | "nbconvert_exporter": "python", 267 | "pygments_lexer": "ipython3", 268 | "version": "3.6.1" 269 | } 270 | }, 271 | "nbformat": 4, 272 | "nbformat_minor": 2 273 | } 274 | -------------------------------------------------------------------------------- /2.1. Brick Conversion (Full).ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "# Install necessary Python pakcages\n", 12 | "# rdflib: RDF composition and querying with SPARQL in Python.\n", 13 | "from rdflib import RDFS, RDF, Namespace, Graph, URIRef, Literal\n", 14 | "\n", 15 | "from common import *" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 2, 21 | "metadata": { 22 | "collapsed": true 23 | }, 24 | "outputs": [], 25 | "source": [ 26 | "import json\n", 27 | "import pandas as pd\n", 28 | "import re" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 3, 34 | "metadata": { 35 | "collapsed": true 36 | }, 37 | "outputs": [], 38 | "source": [ 39 | "# Load knowledge for the conversion.\n", 40 | "with open('metadata/re_dict.json', 'r') as fp:\n", 41 | " re_dict = json.load(fp)\n", 42 | "equip_order = ['AHU', 'Return_Fan', 'Supply_Fan']\n", 43 | "with open('metadata/zone_room_map.json', 'r') as fp:\n", 44 | " zone_room_map = json.load(fp)\n", 45 | " \n", 46 | "# Load raw data\n", 47 | "df = pd.read_csv('metadata/brick_sample_building_raw.csv')" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": 4, 53 | "metadata": { 54 | "collapsed": true 55 | }, 56 | "outputs": [], 57 | "source": [ 58 | "# Consruct knowledge from Brick schema\n", 59 | "\n", 60 | "bg = Graph()\n", 61 | "bg.parse('Brick/dist/Brick.ttl', format='turtle') # Load Brick schema.\n", 62 | "subclasses_query = \"\"\"\n", 63 | "PREFIX brick: \n", 64 | "select ?tagset where {{\n", 65 | "?tagset rdfs:subClassOf+ brick:{0}.\n", 66 | "}}\n", 67 | "\"\"\"\n", 68 | "point_query = subclasses_query.format('Point')\n", 69 | "equip_query = subclasses_query.format('Equipment')\n", 70 | "loc_query = subclasses_query.format('Location')\n", 71 | "points = [str(row[0]).split('#')[-1] for row in bg.query(point_query)]\n", 72 | "equips = [str(row[0]).split('#')[-1] for row in bg.query(equip_query)]\n", 73 | "locs = [str(row[0]).split('#')[-1] for row in bg.query(loc_query)]\n", 74 | "\n", 75 | "# Cleanup rules\n", 76 | "equips = [equip for equip in equips if \\\n", 77 | " not 'Command' in equip and\n", 78 | " not 'Sensor' in equip and\n", 79 | " not 'Status' in equip and\n", 80 | " not 'Alarm' in equip\n", 81 | " ]" 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": 5, 87 | "metadata": { 88 | "collapsed": true 89 | }, 90 | "outputs": [], 91 | "source": [ 92 | "g = Graph() # Initialize a graph\n", 93 | "RDFS # predefined namespace as 'http://www.w3.org/2000/01/rdf-schema#'\n", 94 | "RDF # predefined namespace as 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'\n", 95 | "BRICK = Namespace('https://brickschema.org/schema/1.0.1/Brick#')\n", 96 | "BF = Namespace('https://brickschema.org/schema/1.0.1/BrickFrame#')\n", 97 | "EX = Namespace('http://example.com#')\n", 98 | "g.bind('ex', EX)\n", 99 | "g.bind('brick', BRICK)\n", 100 | "g.bind('bf', BF)\n", 101 | "g.bind('rdfs', RDFS)\n", 102 | "g.bind('rdf', RDF)\n", 103 | "\n" 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": 6, 109 | "metadata": { 110 | "collapsed": true 111 | }, 112 | "outputs": [], 113 | "source": [ 114 | "for row in df.iterrows():\n", 115 | " vendor_name = row[1]['Vendor Given Name']\n", 116 | " uuid = row[1]['uuid']\n", 117 | " ############# Parsing Phase\n", 118 | " # Extract all entities in vendor_name\n", 119 | " entity_dict = dict()\n", 120 | " raw_words = vendor_name.split('.') # This building uses '.' as a delimiter but not always it's comprehensive.\n", 121 | " \n", 122 | " # split more if needed\n", 123 | " words = []\n", 124 | " for word in raw_words:\n", 125 | " if 'SF' in word or 'RF' in word:\n", 126 | " words += word.split('-')\n", 127 | " else:\n", 128 | " words.append(word)\n", 129 | " # Apply RE rules to detect tagsets.\n", 130 | " for word in words:\n", 131 | " for key, tagset in re_dict.items():\n", 132 | " if re.findall(key, word):\n", 133 | " if tagset in points:\n", 134 | " entity_dict[vendor_name] = tagset\n", 135 | " else:\n", 136 | " entity_dict[word] = tagset # We will use a word as an entity name.\n", 137 | " \n", 138 | " ############# Add Brick Relationships\n", 139 | " # Add instance relationships\n", 140 | " for entity, tagset in entity_dict.items():\n", 141 | " g.add((EX[entity], RDF['type'], BRICK[tagset]))\n", 142 | " \n", 143 | " # Add Location <-> Others\n", 144 | " ## Find all location entities\n", 145 | " loc_entities = list()\n", 146 | " for entity, tagset in entity_dict.items():\n", 147 | " if tagset in locs:\n", 148 | " loc_entities.append(entity)\n", 149 | " ## Assign hasLocation relationships to all non-location entities with the location entities.\n", 150 | " for entity, tagset in entity_dict.items():\n", 151 | " if tagset not in locs:\n", 152 | " for loc_entity in loc_entities:\n", 153 | " g.add((EX[entity], BF['hasLocation'], EX[loc_entity]))\n", 154 | " \n", 155 | " # Zone corresponds to a VAV.\n", 156 | " vav_entity = None\n", 157 | " for entity, tagset in entity_dict.items():\n", 158 | " if tagset == 'HVAC_Zone':\n", 159 | " vav_entity = 'VAV_' + entity\n", 160 | " g.add((EX[vav_entity], RDF['type'], BRICK['VAV']))\n", 161 | " g.add((EX[vav_entity], BF['feeds'], EX[entity]))\n", 162 | " if vav_entity:\n", 163 | " entity_dict[vav_entity] = 'VAV'\n", 164 | " \n", 165 | " # Add Equip <-> Point\n", 166 | " ## Find all equip entities\n", 167 | " equip_entities = list()\n", 168 | " for entity, tagset in entity_dict.items():\n", 169 | " if tagset in equips:\n", 170 | " equip_entities.append(entity)\n", 171 | " ## Assign isPointOf relationships to all Point entities \n", 172 | " for entity, tagset in entity_dict.items():\n", 173 | " if tagset in points:\n", 174 | " for equip_entity in equip_entities:\n", 175 | " g.add((EX[entity], BF['isPointOf'], EX[equip_entity]))\n", 176 | " ## Add inclusive relationships among equipments\n", 177 | " #if len(equip_entities) > 1:\n", 178 | " # rank_equip_list = [(equip, equip_orders.index(equip))]\n", 179 | " # sorted(equip_entities)\n", 180 | " \n", 181 | " # Add UUID\n", 182 | " for entity, tagset in entity_dict.items():\n", 183 | " if tagset in points:\n", 184 | " g.add((EX[entity], BRICK['hasUuid'], Literal(str(uuid))))" 185 | ] 186 | }, 187 | { 188 | "cell_type": "code", 189 | "execution_count": 7, 190 | "metadata": { 191 | "collapsed": true 192 | }, 193 | "outputs": [], 194 | "source": [ 195 | "# Add zone-room inclusive relationships\n", 196 | "for zone, rooms in zone_room_map.items():\n", 197 | " for room in rooms:\n", 198 | " g.add((EX[room], RDF['type'], BRICK['Room']))\n", 199 | " g.add((EX[room], BF['isPartOf'], EX[zone]))\n", 200 | " \n", 201 | "# The AHU feeds all VAVs\n", 202 | "## find VAVs.\n", 203 | "res = g.query(\"select ?vav where {?vav a }\")\n", 204 | "vavs = [str(row[0]).split('#')[-1] for row in res]\n", 205 | "## Add feeds relationship\n", 206 | "for vav in vavs:\n", 207 | " g.add((EX['AH1'], BF['feeds'], EX[vav]))" 208 | ] 209 | }, 210 | { 211 | "cell_type": "code", 212 | "execution_count": 8, 213 | "metadata": { 214 | "scrolled": true 215 | }, 216 | "outputs": [ 217 | { 218 | "data": { 219 | "text/markdown": [ 220 | "```turtle\n", 221 | "@prefix bf: .\n", 222 | "@prefix brick: .\n", 223 | "@prefix ex: .\n", 224 | "@prefix rdf: .\n", 225 | "@prefix rdfs: .\n", 226 | "@prefix xml: .\n", 227 | "@prefix xsd: .\n", 228 | "\n", 229 | "ex:AH1-1 a brick:AHU ;\n", 230 | " bf:hasLocation ex:BLDA .\n", 231 | "\n", 232 | "ex:BLDA.AH1.CHWR1-T a brick:Chilled_Water_Return_Temperature_Sensor ;\n", 233 | " brick:hasUuid \"1\" ;\n", 234 | " bf:hasLocation ex:BLDA ;\n", 235 | " bf:isPointOf ex:AH1 .\n", 236 | "\n", 237 | "ex:BLDA.AH1.CHWR2-T a brick:Chilled_Water_Return_Temperature_Sensor ;\n", 238 | " brick:hasUuid \"2\" ;\n", 239 | " bf:hasLocation ex:BLDA ;\n", 240 | " bf:isPointOf ex:AH1 .\n", 241 | "\n", 242 | "ex:BLDA.AH1.CLG-VLV1 a brick:Cooling_Valve_Command ;\n", 243 | " brick:hasUuid \"3\" ;\n", 244 | " bf:hasLocation ex:BLDA ;\n", 245 | " bf:isPointOf ex:AH1 .\n", 246 | "\n", 247 | "ex:BLDA.AH1.CLG-VLV2 a brick:Cooling_Valve_Command ;\n", 248 | " brick:hasUuid \"4\" ;\n", 249 | " bf:hasLocation ex:BLDA ;\n", 250 | " bf:isPointOf ex:AH1 .\n", 251 | "\n", 252 | "ex:BLDA.RM-1100A..ACTCLGSP a brick:Effective_Cooling_Temperature_Setpoint ;\n", 253 | " brick:hasUuid \"15\" ;\n", 254 | " bf:hasLocation ex:BLDA,\n", 255 | " ex:RM-1100A ;\n", 256 | " bf:isPointOf ex:VAV_RM-1100A .\n", 257 | "\n", 258 | "ex:BLDA.RM-1100A..ACTHTGSP a brick:Effective_Heating_Temperature_Setpoint ;\n", 259 | " brick:hasUuid \"16\" ;\n", 260 | " bf:hasLocation ex:BLDA,\n", 261 | " ex:RM-1100A ;\n", 262 | " bf:isPointOf ex:VAV_RM-1100A .\n", 263 | "\n", 264 | "ex:BLDA.RM-1100A..COMMONSP a brick:Zone_Temperature_Setpoint ;\n", 265 | " brick:hasUuid \"18\" ;\n", 266 | " bf:hasLocation ex:BLDA,\n", 267 | " ex:RM-1100A ;\n", 268 | " bf:isPointOf ex:VAV_RM-1100A .\n", 269 | "\n", 270 | "ex:BLDA.RM-1100A..DPR-C a brick:Damper_Command ;\n", 271 | " brick:hasUuid \"20\" ;\n", 272 | " bf:hasLocation ex:BLDA,\n", 273 | " ex:RM-1100A ;\n", 274 | " bf:isPointOf ex:VAV_RM-1100A .\n", 275 | "\n", 276 | "ex:BLDA.RM-1100A..OCC-CMD a brick:Occupied_Command ;\n", 277 | " brick:hasUuid \"22\" ;\n", 278 | " bf:hasLocation ex:BLDA,\n", 279 | " ex:RM-1100A ;\n", 280 | " bf:isPointOf ex:VAV_RM-1100A .\n", 281 | "\n", 282 | "ex:BLDA.RM-1100A..RH-VLV a brick:Reheat_Valve_Command ;\n", 283 | " brick:hasUuid \"23\" ;\n", 284 | " bf:hasLocation ex:BLDA,\n", 285 | " ex:RM-1100A ;\n", 286 | " bf:isPointOf ex:VAV_RM-1100A .\n", 287 | "\n", 288 | "ex:BLDA.RM-1100A..SUP-FLOW a brick:Supply_Air_Flow_Sensor ;\n", 289 | " brick:hasUuid \"25\" ;\n", 290 | " bf:hasLocation ex:BLDA,\n", 291 | " ex:RM-1100A ;\n", 292 | " bf:isPointOf ex:VAV_RM-1100A .\n", 293 | "\n", 294 | "ex:BLDA.RM-1100A..SUPFLO-SP a brick:Supply_Air_Flow_Setpoint ;\n", 295 | " brick:hasUuid \"24\" ;\n", 296 | " bf:hasLocation ex:BLDA,\n", 297 | " ex:RM-1100A ;\n", 298 | " bf:isPointOf ex:VAV_RM-1100A .\n", 299 | "\n", 300 | "ex:BLDA.RM-1100D..ACTCLGSP a brick:Effective_Cooling_Temperature_Setpoint ;\n", 301 | " brick:hasUuid \"27\" ;\n", 302 | " bf:hasLocation ex:BLDA,\n", 303 | " ex:RM-1100D ;\n", 304 | " bf:isPointOf ex:VAV_RM-1100D .\n", 305 | "\n", 306 | "ex:BLDA.RM-1100D..ACTHTGSP a brick:Effective_Heating_Temperature_Setpoint ;\n", 307 | " brick:hasUuid \"28\" ;\n", 308 | " bf:hasLocation ex:BLDA,\n", 309 | " ex:RM-1100D ;\n", 310 | " bf:isPointOf ex:VAV_RM-1100D .\n", 311 | "\n", 312 | "ex:BLDA.RM-1100D..COMMONSP a brick:Zone_Temperature_Setpoint ;\n", 313 | " brick:hasUuid \"30\" ;\n", 314 | " bf:hasLocation ex:BLDA,\n", 315 | " ex:RM-1100D ;\n", 316 | " bf:isPointOf ex:VAV_RM-1100D .\n", 317 | "\n", 318 | "ex:BLDA.RM-1100D..DPR-C a brick:Damper_Command ;\n", 319 | " brick:hasUuid \"32\" ;\n", 320 | " bf:hasLocation ex:BLDA,\n", 321 | " ex:RM-1100D ;\n", 322 | " bf:isPointOf ex:VAV_RM-1100D .\n", 323 | "\n", 324 | "ex:BLDA.RM-1100D..OCC-CMD a brick:Occupied_Command ;\n", 325 | " brick:hasUuid \"34\" ;\n", 326 | " bf:hasLocation ex:BLDA,\n", 327 | " ex:RM-1100D ;\n", 328 | " bf:isPointOf ex:VAV_RM-1100D .\n", 329 | "\n", 330 | "ex:BLDA.RM-1100D..RH-VLV a brick:Reheat_Valve_Command ;\n", 331 | " brick:hasUuid \"35\" ;\n", 332 | " bf:hasLocation ex:BLDA,\n", 333 | " ex:RM-1100D ;\n", 334 | " bf:isPointOf ex:VAV_RM-1100D .\n", 335 | "\n", 336 | "ex:BLDA.RM-1100D..SUP-FLOW a brick:Supply_Air_Flow_Sensor ;\n", 337 | " brick:hasUuid \"37\" ;\n", 338 | " bf:hasLocation ex:BLDA,\n", 339 | " ex:RM-1100D ;\n", 340 | " bf:isPointOf ex:VAV_RM-1100D .\n", 341 | "\n", 342 | "ex:BLDA.RM-1100D..SUPFLO-SP a brick:Supply_Air_Flow_Setpoint ;\n", 343 | " brick:hasUuid \"36\" ;\n", 344 | " bf:hasLocation ex:BLDA,\n", 345 | " ex:RM-1100D ;\n", 346 | " bf:isPointOf ex:VAV_RM-1100D .\n", 347 | "\n", 348 | "ex:BLDA.RM-2150..ACTCLGSP a brick:Effective_Cooling_Temperature_Setpoint ;\n", 349 | " brick:hasUuid \"39\" ;\n", 350 | " bf:hasLocation ex:BLDA,\n", 351 | " ex:RM-2150 ;\n", 352 | " bf:isPointOf ex:VAV_RM-2150 .\n", 353 | "\n", 354 | "ex:BLDA.RM-2150..ACTHTGSP a brick:Effective_Heating_Temperature_Setpoint ;\n", 355 | " brick:hasUuid \"40\" ;\n", 356 | " bf:hasLocation ex:BLDA,\n", 357 | " ex:RM-2150 ;\n", 358 | " bf:isPointOf ex:VAV_RM-2150 .\n", 359 | "\n", 360 | "ex:BLDA.RM-2150..COMMONSP a brick:Zone_Temperature_Setpoint ;\n", 361 | " brick:hasUuid \"42\" ;\n", 362 | " bf:hasLocation ex:BLDA,\n", 363 | " ex:RM-2150 ;\n", 364 | " bf:isPointOf ex:VAV_RM-2150 .\n", 365 | "\n", 366 | "ex:BLDA.RM-2150..DPR-C a brick:Damper_Command ;\n", 367 | " brick:hasUuid \"44\" ;\n", 368 | " bf:hasLocation ex:BLDA,\n", 369 | " ex:RM-2150 ;\n", 370 | " bf:isPointOf ex:VAV_RM-2150 .\n", 371 | "\n", 372 | "ex:BLDA.RM-2150..HTGFLOW a brick:Occupied_Heating_Discharge_Air_Flow_Setpoint ;\n", 373 | " brick:hasUuid \"45\" ;\n", 374 | " bf:hasLocation ex:BLDA,\n", 375 | " ex:RM-2150 ;\n", 376 | " bf:isPointOf ex:VAV_RM-2150 .\n", 377 | "\n", 378 | "ex:BLDA.RM-2150..OCC-CMD a brick:Occupied_Command ;\n", 379 | " brick:hasUuid \"47\" ;\n", 380 | " bf:hasLocation ex:BLDA,\n", 381 | " ex:RM-2150 ;\n", 382 | " bf:isPointOf ex:VAV_RM-2150 .\n", 383 | "\n", 384 | "ex:BLDA.RM-2150..RH-VLV a brick:Reheat_Valve_Command ;\n", 385 | " brick:hasUuid \"48\" ;\n", 386 | " bf:hasLocation ex:BLDA,\n", 387 | " ex:RM-2150 ;\n", 388 | " bf:isPointOf ex:VAV_RM-2150 .\n", 389 | "\n", 390 | "ex:BLDA.RM-2150..SUP-FLOW a brick:Supply_Air_Flow_Sensor ;\n", 391 | " brick:hasUuid \"50\" ;\n", 392 | " bf:hasLocation ex:BLDA,\n", 393 | " ex:RM-2150 ;\n", 394 | " bf:isPointOf ex:VAV_RM-2150 .\n", 395 | "\n", 396 | "ex:BLDA.RM-2150..SUPFLO-SP a brick:Supply_Air_Flow_Setpoint ;\n", 397 | " brick:hasUuid \"49\" ;\n", 398 | " bf:hasLocation ex:BLDA,\n", 399 | " ex:RM-2150 ;\n", 400 | " bf:isPointOf ex:VAV_RM-2150 .\n", 401 | "\n", 402 | "ex:RF a brick:Return_Fan ;\n", 403 | " bf:hasLocation ex:BLDA .\n", 404 | "\n", 405 | "ex:RF1 a brick:Return_Fan ;\n", 406 | " bf:hasLocation ex:BLDA .\n", 407 | "\n", 408 | "ex:RF2 a brick:Return_Fan ;\n", 409 | " bf:hasLocation ex:BLDA .\n", 410 | "\n", 411 | "ex:RM-1100 a brick:Room ;\n", 412 | " bf:isPartOf ex:RM-1100A,\n", 413 | " ex:RM-1100D .\n", 414 | "\n", 415 | "ex:RM-2151 a brick:Room ;\n", 416 | " bf:isPartOf ex:RM-2150 .\n", 417 | "\n", 418 | "ex:RM-2152 a brick:Room ;\n", 419 | " bf:isPartOf ex:RM-2150 .\n", 420 | "\n", 421 | "ex:SF a brick:Supply_Fan ;\n", 422 | " bf:hasLocation ex:BLDA .\n", 423 | "\n", 424 | "ex:SF1 a brick:Supply_Fan ;\n", 425 | " bf:hasLocation ex:BLDA .\n", 426 | "\n", 427 | "ex:SF2 a brick:Supply_Fan ;\n", 428 | " bf:hasLocation ex:BLDA .\n", 429 | "\n", 430 | "ex:AH1 a brick:AHU ;\n", 431 | " bf:feeds ex:VAV_RM-1100A,\n", 432 | " ex:VAV_RM-1100D,\n", 433 | " ex:VAV_RM-2150 ;\n", 434 | " bf:hasLocation ex:BLDA .\n", 435 | "\n", 436 | "ex:VAV_RM-1100A a brick:VAV ;\n", 437 | " bf:feeds ex:RM-1100A .\n", 438 | "\n", 439 | "ex:VAV_RM-1100D a brick:VAV ;\n", 440 | " bf:feeds ex:RM-1100D .\n", 441 | "\n", 442 | "ex:RM-1100A a brick:HVAC_Zone .\n", 443 | "\n", 444 | "ex:RM-1100D a brick:HVAC_Zone .\n", 445 | "\n", 446 | "ex:VAV_RM-2150 a brick:VAV ;\n", 447 | " bf:feeds ex:RM-2150 .\n", 448 | "\n", 449 | "ex:RM-2150 a brick:HVAC_Zone .\n", 450 | "\n", 451 | "ex:BLDA a brick:Building .\n", 452 | "\n", 453 | "\n", 454 | "```" 455 | ], 456 | "text/plain": [ 457 | "" 458 | ] 459 | }, 460 | "metadata": {}, 461 | "output_type": "display_data" 462 | } 463 | ], 464 | "source": [ 465 | "print_graph(g)" 466 | ] 467 | }, 468 | { 469 | "cell_type": "markdown", 470 | "metadata": {}, 471 | "source": [ 472 | "### Conversion Rules (for this building)\n", 473 | "1. A metadata is the name of the data point.\n", 474 | "2. Implicit Relationships:\n", 475 | " - When a location is found, every other entitiy hasLocation the location.\n", 476 | " - When equipment is is found, the point isPointOf the equipment.\n", 477 | " - When multiple equipment is found, their hierarchy is assumed. In AHU-SF, SF isPartOf AHU. Same for AHU-RF.\n", 478 | " - When HVAC Zone is found, there is a corresponding VAV." 479 | ] 480 | }, 481 | { 482 | "cell_type": "code", 483 | "execution_count": 9, 484 | "metadata": { 485 | "collapsed": true 486 | }, 487 | "outputs": [], 488 | "source": [ 489 | "g.serialize('metadata/sample_building.ttl', format='turtle')" 490 | ] 491 | } 492 | ], 493 | "metadata": { 494 | "kernelspec": { 495 | "display_name": "Python 3", 496 | "language": "python", 497 | "name": "python3" 498 | }, 499 | "language_info": { 500 | "codemirror_mode": { 501 | "name": "ipython", 502 | "version": 3 503 | }, 504 | "file_extension": ".py", 505 | "mimetype": "text/x-python", 506 | "name": "python", 507 | "nbconvert_exporter": "python", 508 | "pygments_lexer": "ipython3", 509 | "version": "3.6.1" 510 | } 511 | }, 512 | "nbformat": 4, 513 | "nbformat_minor": 2 514 | } 515 | -------------------------------------------------------------------------------- /3. Brick Queries and Data Analysis.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import pandas as pd\n", 10 | "from collections import defaultdict\n", 11 | "%matplotlib inline" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": {}, 17 | "source": [ 18 | "# RDF Primer\n", 19 | "\n", 20 | "The RDF data model represents a directed, labeled graph as a set of *triples*. A triple consists of a *subject* (node), a *predicate* (directed edge) and an *object* (node). We will interact with the graph by way of these triples\n", 21 | "\n", 22 | "\n", 23 | "\n" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": null, 29 | "metadata": {}, 30 | "outputs": [], 31 | "source": [] 32 | }, 33 | { 34 | "cell_type": "markdown", 35 | "metadata": {}, 36 | "source": [ 37 | "# Analysis with Brick" 38 | ] 39 | }, 40 | { 41 | "cell_type": "markdown", 42 | "metadata": {}, 43 | "source": [ 44 | "One of the primary benefits of having a machine-readable representation of a building is the ability to build portable analytics. Rather than hard-coding the specific data streams and points from a building into an analytics script, we can discover that structure dynamically by querying the Brick model.\n", 45 | "\n", 46 | "The goal of this part of the tutorial is to demonstrate how to write SPARQL queries that pull information from such graphs, and how to use these queries to write portable analytics.\n", 47 | "\n", 48 | "To help guide the queries we want to write, we've rendered a simple visualization of how class instances are connected in our sample building Brick model. The below figure tells us:\n", 49 | "- nodes of type `brick:VAV` have `feeds` relationships with nodes of type `brick:HVAC_Zone`\n", 50 | "- nodes of type `brick:Room` have `isPartOf` relationships with nodes of type `brick:HVAC_Zone`\n", 51 | "\n", 52 | "\n", 53 | "\n", 54 | "Here is the full graph:\n", 55 | "\n", 56 | "\n", 57 | "\n", 58 | "There are only a few types of relationships (edge labels) that Brick captures, but these are sufficient for what we need. Here's a brief recap:\n", 59 | "\n", 60 | "- **Subcomponents**: `hasPart`/`isPartOf`. Used for mechanical composition, relating HVAC zones with physical spaces\n", 61 | "- **Identifying flows**: `feeds`/`isFedBy`. Used for flows of water, electricity, air, etc.\n", 62 | "- **Sensing + actuation**: `hasPoint`/`isPointOf`. Used for associating sensor, setpoints, statuses, commands, meters, etc with related equipment, locations, etc\n", 63 | "- **Location**: `hasLocation`/`isLocationOf`. Identifies the physical location of something\n", 64 | "- **Instantiation**: `type` (implicit in the graph above)\n", 65 | "\n", 66 | "The way we write SPARQL queries is by considering the types of \"things\" we care about as well as the nature of the relationships between those things." 67 | ] 68 | }, 69 | { 70 | "cell_type": "markdown", 71 | "metadata": {}, 72 | "source": [ 73 | "The first thing we do is set up our query environment. For convenience, we're using the SPARQL engine included in the RDFlib Python library. We provide a brief wrapper around that library for queries, which takes care of most of the boilerplate involved in SPARQL queries. The most important part of this boilerplate are the namespace abbreviations.\n", 74 | "\n", 75 | "Recall that in the RDF data model, all nodes are either Literals (strings) or URIs. All URIs have a namespace: for example in the URI `https://brickschema.org/schema/1.0.1/Brick#VAV`, the namespace is `https://brickschema.org/schema/1.0.1/Brick#` and the \"node\" is `VAV`. For convenience, we will abbreviate the URI so we can write `brick:VAV` instead of `https://brickschema.org/schema/1.0.1/Brick#VAV`.\n", 76 | "\n", 77 | "Here are the abbreviations we will use:\n", 78 | "\n", 79 | "| Namespace | Usage | Abbreviation |\n", 80 | "|-----------|-------|--------------|\n", 81 | "| `https://brickschema.org/schema/1.0.1/Brick#` | Brick classes | `brick:` |\n", 82 | "| `https://brickschema.org/schema/1.0.1/BrickFrame#` | Brick relationships | `bf:` |\n", 83 | "| `http://www.w3.org/1999/02/22-rdf-syntax-ns#` | class instantiation | `rdf:` |\n", 84 | "| `http://www.w3.org/2000/01/rdf-schema#` | subclassing | `rdfs:` |\n", 85 | "| `http://example.com#` | Nodes in our building | `ex:` |" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": null, 91 | "metadata": {}, 92 | "outputs": [], 93 | "source": [ 94 | "from query import BrickGraph\n", 95 | "bldg = BrickGraph()" 96 | ] 97 | }, 98 | { 99 | "cell_type": "markdown", 100 | "metadata": {}, 101 | "source": [ 102 | "# SPARQL Queries\n", 103 | "\n", 104 | "## Exploring a Brick Model" 105 | ] 106 | }, 107 | { 108 | "cell_type": "markdown", 109 | "metadata": {}, 110 | "source": [ 111 | "We begin by executing the 'identity' SPARQL query that lists all of the triples in our model. We have chosen the variable names `?sub` `?pred` `?obj` for clarity; the *position* of the variable within a SPARQL triple conveys its role, rather than the name. For example, because `?obj` is the third item in the SPARQL triple, we know it corresponds to a node in the graph." 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": null, 117 | "metadata": {}, 118 | "outputs": [], 119 | "source": [ 120 | "rows = bldg.query(\"\"\"select ?sub ?pred ?obj where {\n", 121 | "?sub ?pred ?obj .\n", 122 | "}\"\"\", fullURI=False)\n", 123 | "\n", 124 | "# print the first 10 rows\n", 125 | "for row in rows[:10]:\n", 126 | " print(row)" 127 | ] 128 | }, 129 | { 130 | "cell_type": "markdown", 131 | "metadata": {}, 132 | "source": [ 133 | "We can see the node/edge/node construction in the returned triples.\n", 134 | "\n", 135 | "**Listing Instances**\n", 136 | "\n", 137 | "Let's amend this query so it starts giving us some more useful information. To start, let's list all of the VAVs in the building. To do this, we want to find all nodes that have a `rdf:type` edge (which indicates instantiation) to the `brick:VAV` node which represents the Brick VAV class. In the corresponding triple, we will put `rdf:type` in the \"predicate\" slot and `brick:VAV` in the \"object\" slot. In the subject slot, we will place a variable that will be populated when the query executes:\n", 138 | "\n", 139 | "```sparql\n", 140 | "?vav rdf:type brick:VAV\n", 141 | "```\n", 142 | "\n", 143 | "This corresponds to finding instances of the following subgraph:\n", 144 | "\n", 145 | "" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": null, 151 | "metadata": {}, 152 | "outputs": [], 153 | "source": [ 154 | "rows = bldg.query(\"\"\"select ?vav where {\n", 155 | "?vav rdf:type brick:VAV .\n", 156 | "}\"\"\", fullURI=False)\n", 157 | "for row in rows:\n", 158 | " print('?vav =',row[0])" 159 | ] 160 | }, 161 | { 162 | "cell_type": "markdown", 163 | "metadata": {}, 164 | "source": [ 165 | "**Listing Neighbors**\n", 166 | "\n", 167 | "A natural question when interacting with a new Brick model is what kind of information is associated with a particular VAV. We can express this as a SPARQL query by seeing which triples exist that have a VAV as the subject.\n", 168 | "\n", 169 | "```sparql\n", 170 | "ex:VAV_RM-1100D ?pred ?obj \n", 171 | "```\n", 172 | "\n", 173 | "This corresponds to finding instances of the following subgraph:\n", 174 | "\n", 175 | "" 176 | ] 177 | }, 178 | { 179 | "cell_type": "code", 180 | "execution_count": null, 181 | "metadata": {}, 182 | "outputs": [], 183 | "source": [ 184 | "rows = bldg.query(\"\"\"select ?pred ?obj where {\n", 185 | "ex:VAV_RM-2150 ?pred ?obj .\n", 186 | "}\"\"\", fullURI=False)\n", 187 | "for row in rows:\n", 188 | " print('ex:VAV_RM-2150 has edge', row[0], 'to', row[1])" 189 | ] 190 | }, 191 | { 192 | "cell_type": "markdown", 193 | "metadata": {}, 194 | "source": [ 195 | "**Listing Types**\n", 196 | "\n", 197 | "The above queries work well if we know the exact classes instantiated in our Brick model. If we don't have this information and want to discover it, we can leverage Brick's class hierarchy.\n", 198 | "\n", 199 | "\n", 200 | "\n", 201 | "A common use case is finding which kinds of temperature sensors exist in the Brick model. The basic form of this uses both the `rdf:type` relationship (instantiation) and the `rdfs:subClassOf` relationship. By default, mentioning a predicate only traverses a single edge in the graph. We use SPARQL's `*` operator to match \"0 or more\" instances of an edge to transparently query more than one level of the hierarchy. SPARQL also provides a `+` operator to match \"1 or more\" edges.\n", 202 | "\n", 203 | "\n", 204 | "This matches instances that are *immediate* subclasses of `brick:Temperature_Sensor`\n", 205 | "```sparql\n", 206 | "?sensor rdf:type/rdfs:subClassOf brick:Temperature_Sensor\n", 207 | "```\n", 208 | "\n", 209 | "This matches instances of `brick:Temperature_Sensor` as well as instances of *any* subclass of `brick:Temperature_Sensor`\n", 210 | "```sparql\n", 211 | "?sensor rdf:type/rdfs:subClassOf* brick:Temperature_Sensor\n", 212 | "```\n", 213 | "\n", 214 | "This query corresponds to the following subgraph in the case of Zone Air Temperature Sensors\n", 215 | "\n", 216 | "\n", 217 | "\n", 218 | "We can now run this query on our real Brick model to see what flavors of Temperature Sensor exist" 219 | ] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "execution_count": null, 224 | "metadata": {}, 225 | "outputs": [], 226 | "source": [ 227 | "rows = bldg.query(\"\"\"select ?sensor ?class where {\n", 228 | "?sensor rdf:type ?class .\n", 229 | "?class rdfs:subClassOf* brick:Temperature_Sensor .\n", 230 | "}\"\"\", fullURI=False)\n", 231 | "for row in rows:\n", 232 | " print(row[0], 'is an instance of', row[1])" 233 | ] 234 | }, 235 | { 236 | "cell_type": "markdown", 237 | "metadata": {}, 238 | "source": [ 239 | "If we are not interested in the intermediate class name, we can combine the expression of the `rdf:type` and `rdfs:subClassOf*` predicates using the `/` SPARQL operator:" 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": null, 245 | "metadata": {}, 246 | "outputs": [], 247 | "source": [ 248 | "rows = bldg.query(\"\"\"select ?sensor where {\n", 249 | "?sensor rdf:type/rdfs:subClassOf* brick:Temperature_Sensor .\n", 250 | "}\"\"\", fullURI=False)\n", 251 | "for row in rows:\n", 252 | " print(row[0], 'is an instance of a subclass of Temperature_Sensor')" 253 | ] 254 | }, 255 | { 256 | "cell_type": "markdown", 257 | "metadata": { 258 | "collapsed": true 259 | }, 260 | "source": [ 261 | "## Cross-Subsystem Queries\n", 262 | "\n", 263 | "One of the main benefits of Brick is its ability to represent multiple building subsystems and query across them. We will explore these capabilities of Brick through the implementation of two analytics applications:\n", 264 | "- Stuck Damper Detection\n", 265 | "- Simultaneous Heating and Cooling Detection\n", 266 | "\n", 267 | "The point of these explorations is not to implement cutting-edge fault detection/diagnosis algorithms, but rather to illustrate how Brick can make it easier to find the relevant data streams and make an implementation portable across buildings." 268 | ] 269 | }, 270 | { 271 | "cell_type": "markdown", 272 | "metadata": {}, 273 | "source": [ 274 | "### Stuck Damper Detection\n", 275 | "\n", 276 | "One method of detecting stuck dampers is to look at the difference between the supply air flow sensor and setpoint for a VAV.\n", 277 | "\n", 278 | "- If the measured air flow is within some delta of the air flow setpoint, then the damper is fine\n", 279 | "- Else, it might be broken\n", 280 | "\n", 281 | "First, we write the Brick query(ies) to extract the relevant data streams: namely, the supply air flow sensor and supply air flow setpoint for each VAV in our building. In addition to the names of those points, we also extract from the Brick model some \"timeseries identifier\" that will point us to where we can obtain the actual data. Here, we use the `brick:hasUuid` relationship which points to an RDF literal corresponding to the name of a CSV data file.\n", 282 | "\n", 283 | "Lets progressively build up the query. First, lets begin by identifying all the VAVs in the building:\n", 284 | "\n", 285 | "```sparql\n", 286 | "?vav rdf:type brick:VAV .\n", 287 | "```\n", 288 | "\n", 289 | "We will then identify the supply air flow setpoints and sensors using the `rdf:type` relationship, and because they measure an aspect of a VAV, we know they will be related to a VAV using the `isPointOf` relationship.\n", 290 | "\n", 291 | "```sparql\n", 292 | "?setpoint rdf:type brick:Supply_Air_Flow_Setpoint .\n", 293 | "?sensor rdf:type brick:Supply_Air_Flow_Sensor .\n", 294 | "?setpoint bf:isPointOf brick:VAV .\n", 295 | "?sensor bf:isPointOf brick:VAV .\n", 296 | "```\n", 297 | "\n", 298 | "Lastly, we pull out the UUIDs for the timeseries\n", 299 | "\n", 300 | "```sparql\n", 301 | "?setpoint brick:hasUuid ?setpoint_uuid .\n", 302 | "?sensor brick:hasUuid ?sensor_uuid .\n", 303 | "```" 304 | ] 305 | }, 306 | { 307 | "cell_type": "code", 308 | "execution_count": null, 309 | "metadata": { 310 | "scrolled": true 311 | }, 312 | "outputs": [], 313 | "source": [ 314 | "rows = bldg.query(\"\"\"select ?vav ?sensor ?setpoint ?sensor_uuid ?setpoint_uuid where {\n", 315 | "?vav rdf:type brick:VAV .\n", 316 | "?setpoint rdf:type brick:Supply_Air_Flow_Setpoint .\n", 317 | "?sensor rdf:type brick:Supply_Air_Flow_Sensor .\n", 318 | "?setpoint bf:isPointOf ?vav .\n", 319 | "?sensor bf:isPointOf ?vav .\n", 320 | "?setpoint brick:hasUuid ?setpoint_uuid .\n", 321 | "?sensor brick:hasUuid ?sensor_uuid .\n", 322 | "}\"\"\", fullURI=False)\n", 323 | "\n", 324 | "# build a simple associative structure for the VAV points\n", 325 | "vavs = {}\n", 326 | "for row in rows:\n", 327 | " vavs[row[0]] = {'setpoint': row[4], 'sensor': row[3]}\n", 328 | "print(vavs)" 329 | ] 330 | }, 331 | { 332 | "cell_type": "code", 333 | "execution_count": null, 334 | "metadata": { 335 | "scrolled": false 336 | }, 337 | "outputs": [], 338 | "source": [ 339 | "THRESHOLD = 100\n", 340 | "for vavname, points in vavs.items():\n", 341 | " setpoint_df = pd.read_csv('data/{0}.csv'.format(points['setpoint']), usecols=['timestamp','value'])\n", 342 | " sensor_df = pd.read_csv('data/{0}.csv'.format(points['sensor']), usecols=['timestamp','value'])\n", 343 | " \n", 344 | " # parse timestamps\n", 345 | " setpoint_df = setpoint_df.set_index(pd.to_datetime(setpoint_df.pop('timestamp')))\n", 346 | " sensor_df = sensor_df.set_index(pd.to_datetime(sensor_df.pop('timestamp')))\n", 347 | " \n", 348 | " # resample 10-min mean\n", 349 | " setpoint_df = setpoint_df.resample('10T').mean()\n", 350 | " sensor_df = sensor_df.resample('10T').mean()\n", 351 | " \n", 352 | " # join the dataframes together so we can compare the values easier\n", 353 | " vav_df = setpoint_df.join(sensor_df, lsuffix='_setpoint', rsuffix='_sensor')\n", 354 | " ax = vav_df.plot(figsize=(15,10))\n", 355 | " ax.set_title('{0} Supply Air Flow/Setpoint'.format(vavname))\n", 356 | " ax.set_ylabel('Supply Air Flow (cfm)')\n", 357 | " \n", 358 | " # find datapoints where the difference between setpoint and sensor is greater than the threshold\n", 359 | " broken = vav_df[(vav_df['value_setpoint'] - vav_df['value_sensor']).abs() > THRESHOLD]\n", 360 | " if len(broken) > 0:\n", 361 | " print(vavname, 'has faults!!')\n", 362 | " broken.pop('value_setpoint')\n", 363 | " broken.columns = ['Broken Damper']\n", 364 | " broken.plot(style='ro',ax=ax)\n", 365 | " else:\n", 366 | " print(vavname,'has no faults')" 367 | ] 368 | }, 369 | { 370 | "cell_type": "markdown", 371 | "metadata": {}, 372 | "source": [ 373 | "### Simultaneous Heating and Cooling Detection\n", 374 | "\n", 375 | "Properly identifying simultaneous heating and cooling in a building involves traversing the HVAC and spatial hierarchies of the building. We must first find rooms that are contained within more than one HVAC zone and therefore are conditioned by more than one VAV.\n", 376 | "\n", 377 | "From this, we have a few possible avenues. First, we can compare the reheat coil percentages for the VAVs feeding a single zone. Additionally, we can look at the cooling coil percentage for the AHU upstream of each VAV combined with the supply air flow as further evidence.\n", 378 | "\n", 379 | "To begin, we need to find rooms that are in more than one HVAC zone. We follow the same procedure for building up the query: identify the instances of the relevant classes, and then filter these by the required relationships.\n", 380 | "\n", 381 | "The instances we are interested in for this first queries are rooms and HVAC zones:\n", 382 | "\n", 383 | "```sparql\n", 384 | "?room rdf:type brick:Room .\n", 385 | "?zone rdf:type brick:HVAC_Zone .\n", 386 | "```\n", 387 | "\n", 388 | "We then relate rooms and HVAC zones using the proper `isPartOf` relationship:\n", 389 | "\n", 390 | "```sparql\n", 391 | "?room bf:isPartOf ?zone .\n", 392 | "```" 393 | ] 394 | }, 395 | { 396 | "cell_type": "code", 397 | "execution_count": null, 398 | "metadata": {}, 399 | "outputs": [], 400 | "source": [ 401 | "rows = bldg.query(\"\"\"select ?zone ?room where {\n", 402 | "?room rdf:type brick:Room .\n", 403 | "?zone rdf:type brick:HVAC_Zone .\n", 404 | "?room bf:isPartOf ?zone .\n", 405 | "}\"\"\", fullURI=False)\n", 406 | "\n", 407 | "# build a simple associative structure for the room -> zone mapping\n", 408 | "rooms = defaultdict(list)\n", 409 | "for row in rows:\n", 410 | " rooms[row[1]].append(row[0])\n", 411 | "\n", 412 | "rooms_to_examine = []\n", 413 | "for room, zonelist in rooms.items():\n", 414 | " if len(zonelist) > 1:\n", 415 | " print('Room {0} has {1} zones'.format(room, len(zonelist)))\n", 416 | " rooms_to_examine.append(room)" 417 | ] 418 | }, 419 | { 420 | "cell_type": "markdown", 421 | "metadata": { 422 | "collapsed": true 423 | }, 424 | "source": [ 425 | "For each of the rooms in multiple HVAC zones, we get the reheat coil valve command for the VAVs feeding those zones. Following the rules of composition for the Brick model, we know there is:\n", 426 | "\n", 427 | "- an `isPartOf` relationship from the room to the zone\n", 428 | "- a `feeds` relationship from the VAV to the zone\n", 429 | "- a `isPointOf` relationship from the reheat valve command to the VAV\n", 430 | "\n", 431 | "We combine these into the following SPARQL triples:\n", 432 | "\n", 433 | "```sparql\n", 434 | "?zone rdf:type brick:HVAC_Zone .\n", 435 | "?vav rdf:type brick:VAV .\n", 436 | "?rhc rdf:type brick:Reheat_Valve_Command .\n", 437 | "\n", 438 | " bf:isPartOf ?zone .\n", 439 | "?vav bf:feeds ?zone .\n", 440 | "?rhc bf:isPointOf ?vav .\n", 441 | "?rhc brick:hasUuid ?rhc_uuid .\n", 442 | "```\n", 443 | "\n", 444 | "The last triple gets us the UUID for the timeseries data representing the actual reheat valve command values.\n", 445 | "\n", 446 | "We add to our query the Supply Air Flow sensors so we can tell how much hot/cold air is being blown into a room from the different VAVs\n", 447 | "\n", 448 | "```sparql\n", 449 | "?saf rdf:type brick:Supply_Air_Flow_Sensor .\n", 450 | "?saf bf:isPointOf ?vav .\n", 451 | "?saf brick:hasUuid ?saf_uuid .\n", 452 | "```" 453 | ] 454 | }, 455 | { 456 | "cell_type": "code", 457 | "execution_count": null, 458 | "metadata": {}, 459 | "outputs": [], 460 | "source": [ 461 | "RHC_THRESHOLD = 50\n", 462 | "for room in rooms_to_examine:\n", 463 | " rows = bldg.query(\"\"\"select ?vav ?rhc_uuid ?saf_uuid where {{\n", 464 | " ?zone rdf:type brick:HVAC_Zone .\n", 465 | " ?vav rdf:type brick:VAV .\n", 466 | " ?rhc rdf:type brick:Reheat_Valve_Command .\n", 467 | " ?saf rdf:type brick:Supply_Air_Flow_Sensor .\n", 468 | " {0} bf:isPartOf ?zone .\n", 469 | " ?vav bf:feeds ?zone .\n", 470 | " ?rhc bf:isPointOf ?vav .\n", 471 | " ?rhc brick:hasUuid ?rhc_uuid .\n", 472 | " ?saf bf:isPointOf ?vav .\n", 473 | " ?saf brick:hasUuid ?saf_uuid .\n", 474 | " }}\"\"\".format(room), fullURI=False)\n", 475 | " print(rows)\n", 476 | " rhc1 = pd.read_csv('data/{0}.csv'.format(rows[0][1]), usecols=['timestamp','value'])\n", 477 | " flow1 = pd.read_csv('data/{0}.csv'.format(rows[0][2]), usecols=['timestamp','value'])\n", 478 | "\n", 479 | " rhc2 = pd.read_csv('data/{0}.csv'.format(rows[1][1]), usecols=['timestamp','value'])\n", 480 | " flow2 = pd.read_csv('data/{0}.csv'.format(rows[1][2]), usecols=['timestamp','value'])\n", 481 | "\n", 482 | " # parse timestamps\n", 483 | " rhc1 = rhc1.set_index(pd.to_datetime(rhc1.pop('timestamp'))).resample('10T').mean()\n", 484 | " flow1 = flow1.set_index(pd.to_datetime(flow1.pop('timestamp'))).resample('10T').mean()\n", 485 | " rhc2 = rhc2.set_index(pd.to_datetime(rhc2.pop('timestamp'))).resample('10T').mean()\n", 486 | " flow2 = flow2.set_index(pd.to_datetime(flow2.pop('timestamp'))).resample('10T').mean()\n", 487 | " \n", 488 | " # join the dataframes together so we can compare the values easier\n", 489 | " rhc = rhc1.join(rhc2, lsuffix='_rhc1', rsuffix='_rhc2')\n", 490 | " flow = flow1.join(flow2, lsuffix='_flow1', rsuffix='_flow2')\n", 491 | " #rhc.plot(figsize=(15,10))\n", 492 | " #flow.plot(figsize=(15,10))\n", 493 | " \n", 494 | " # find ranges where the reheat coil commands are more than RHC_THRESHOLD away \n", 495 | " # from each other and the supply air flow is non-zero for both\n", 496 | " diff_rhc_values = ((rhc['value_rhc1'] - rhc['value_rhc2']).abs() >= RHC_THRESHOLD)\n", 497 | " non_zero_saf = ((flow['value_flow1'] > 50) & (flow['value_flow2'] > 50))\n", 498 | " ax = flow[(diff_rhc_values & non_zero_saf)].plot(figsize=(15,10))\n", 499 | " ax.set_title('Possible Simultaneous Heating/Cooling')\n", 500 | " ax.set_ylabel('Air Flow (cfm)')" 501 | ] 502 | }, 503 | { 504 | "cell_type": "markdown", 505 | "metadata": {}, 506 | "source": [ 507 | "Another way of looking at the simultaneous heating/cooling problem is by comparing the heating/cooling setpoints for the two VAVs. Similar to how we ask the Brick model for the reheat coil command and supply air flow temperature sensor, we can also ask the Brick model for the heating/cooling setpoints for the zone.\n", 508 | "\n", 509 | "The building we're working with exposes the *effective* setpoint rather than the *actual* setpoint, so we need to adjust our query from asking for instances of `Heating Temperature Setpoint` to instances of *subclasses* of `Heating Temperature Setpoint`. A sufficiently advanced application might treat effective setpoints differently, but for our basic analysis, we will make this conflation.\n", 510 | "\n", 511 | "Below, we construct the Brick query to obtain this information, and then compute the \"effective deadband\", which is the actual range of temperatures allowed before one of the VAVs starts operating. As we can see from the data, the effective deadband is only about 1 degree Fahrenheit" 512 | ] 513 | }, 514 | { 515 | "cell_type": "code", 516 | "execution_count": null, 517 | "metadata": {}, 518 | "outputs": [], 519 | "source": [ 520 | "for room in rooms_to_examine:\n", 521 | " rows = bldg.query(\"\"\"select ?vav ?hsp_uuid ?csp_uuid where {{\n", 522 | " ?zone rdf:type brick:HVAC_Zone .\n", 523 | " ?vav rdf:type brick:VAV .\n", 524 | " ?hsp rdf:type/rdfs:subClassOf* brick:Heating_Temperature_Setpoint .\n", 525 | " ?csp rdf:type/rdfs:subClassOf* brick:Cooling_Temperature_Setpoint .\n", 526 | " {0} bf:isPartOf ?zone .\n", 527 | " ?vav bf:feeds ?zone .\n", 528 | " ?hsp bf:isPointOf ?vav .\n", 529 | " ?hsp brick:hasUuid ?hsp_uuid .\n", 530 | " ?csp bf:isPointOf ?vav .\n", 531 | " ?csp brick:hasUuid ?csp_uuid .\n", 532 | " }}\"\"\".format(room), fullURI=False)\n", 533 | " print(rows)\n", 534 | " vav1_hsp = pd.read_csv('data/{0}.csv'.format(rows[0][1]), usecols=['timestamp','value'])\n", 535 | " vav1_csp = pd.read_csv('data/{0}.csv'.format(rows[0][2]), usecols=['timestamp','value'])\n", 536 | " vav2_hsp = pd.read_csv('data/{0}.csv'.format(rows[1][1]), usecols=['timestamp','value'])\n", 537 | " vav2_csp = pd.read_csv('data/{0}.csv'.format(rows[1][2]), usecols=['timestamp','value'])\n", 538 | "\n", 539 | " \n", 540 | " # parse timestamps + resample\n", 541 | " vav1_hsp = vav1_hsp.set_index(pd.to_datetime(vav1_hsp.pop('timestamp'))).resample('10T').mean()\n", 542 | " vav1_csp = vav1_csp.set_index(pd.to_datetime(vav1_csp.pop('timestamp'))).resample('10T').mean()\n", 543 | " vav2_hsp = vav2_hsp.set_index(pd.to_datetime(vav2_hsp.pop('timestamp'))).resample('10T').mean()\n", 544 | " vav2_csp = vav2_csp.set_index(pd.to_datetime(vav2_csp.pop('timestamp'))).resample('10T').mean()\n", 545 | " vav1_hsp.columns=['hsp']\n", 546 | " vav2_hsp.columns=['hsp']\n", 547 | " vav1_csp.columns=['csp']\n", 548 | " vav2_csp.columns=['csp']\n", 549 | " \n", 550 | " # join the dataframes together so we can compare the values easier\n", 551 | " hsp = vav1_hsp.join(vav2_hsp, lsuffix='_vav1', rsuffix='_vav2')\n", 552 | " ax = hsp.plot(style=['r-', 'r--'], figsize=(15,10))\n", 553 | " csp = vav1_csp.join(vav2_csp, lsuffix='_vav1', rsuffix='_vav2')\n", 554 | " csp.plot(style=['b-','b--'], figsize=(15,10), ax=ax)\n", 555 | " ax.set_title('All deadbands')\n", 556 | " \n", 557 | " # compute effective deadband\n", 558 | " effective = pd.DataFrame({'hsp': hsp.max(axis=1), 'csp': csp.min(axis=1)})\n", 559 | " ax2= effective.plot(style=['r-','b-'], figsize=(15,10))\n", 560 | " ax2.set_title('Effective deadband')" 561 | ] 562 | }, 563 | { 564 | "cell_type": "code", 565 | "execution_count": null, 566 | "metadata": {}, 567 | "outputs": [], 568 | "source": [] 569 | }, 570 | { 571 | "cell_type": "code", 572 | "execution_count": null, 573 | "metadata": {}, 574 | "outputs": [], 575 | "source": [] 576 | } 577 | ], 578 | "metadata": { 579 | "kernelspec": { 580 | "display_name": "Python 3", 581 | "language": "python", 582 | "name": "python3" 583 | }, 584 | "language_info": { 585 | "codemirror_mode": { 586 | "name": "ipython", 587 | "version": 3 588 | }, 589 | "file_extension": ".py", 590 | "mimetype": "text/x-python", 591 | "name": "python", 592 | "nbconvert_exporter": "python", 593 | "pygments_lexer": "ipython3", 594 | "version": "3.5.2" 595 | } 596 | }, 597 | "nbformat": 4, 598 | "nbformat_minor": 1 599 | } 600 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Jason Beomkyu Koh 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Brick Tutorial at BuildSys 2017 2 | 3 | ## Contents 4 | - `1. Brick Composition.ipynb`: Learning what Brick instance looks internally with constructing it from the scratch. This would not be a repetitive work that you need to do for everytime, but useful for understanding Brick's concepts. You can learn SPARQL basic also. 5 | - `2. Brick Conversion (Tutorial).ipynb`: Tutorial of how to convert some raw metdata in BMS to Brick. It uses simple regular expression rules and relationship mapping to automate the process 6 | - `2.1. Brick Conversion (Full).ipynb`: Converting the all sample raw metadata defined in `metadata/brick_sample_building_raw.csv`. It is not intended for the tutorial, but it is more complete than Brick conversoin (Tutorial) and one may look into it if interested. 7 | - `3. Brick Queries and Data Analysis.ipynb`: How to use SPARQL to query Brick for complex question and how to use integrate with usable data analysis (fault diagnosis) that can be used across any buildings in Brick. 8 | 9 | 10 | ### Data Description 11 | - `metadata/brick_sample_building_raw.csv`: sample raw metadata from a BMS. 12 | - `metadata/sample_building.ttl`: Brickified sample building. Intantiated from the above file with the ``2.1. Brick Conversion (Full).ipynb`` 13 | - `data/`: timeseries data corresponding to UUIDs described in the ``metadata/brick_sample_building_raw.csv`` 14 | 15 | 16 | ## Resources 17 | - [Brick Official Website](http://brickschema.org/) 18 | - [Brick Github Repository](https://github.com/BuildSysUniformMetadata/Brick.git) 19 | - [BuildSys 2017](http://buildsys.acm.org/2017/) 20 | - [Brick Tutorial at BuildSys 2017](https://brickschema.org/buildsys2017/) 21 | -------------------------------------------------------------------------------- /common.py: -------------------------------------------------------------------------------- 1 | try: 2 | from IPython.display import display, Markdown 3 | except: 4 | pass 5 | 6 | # Helper functions 7 | def is_notebook(): 8 | try: 9 | shell = get_ipython().__class__.__name__ 10 | if shell == 'ZMQInteractiveShell': 11 | return True # Jupyter notebook or qtconsole 12 | elif shell == 'TerminalInteractiveShell': 13 | return False # Terminal running IPython 14 | else: 15 | return False # Other type (?) 16 | except NameError: 17 | return False # Probably standard Python interpreter 18 | 19 | def print_graph(g): 20 | g_str = g.serialize(format='turtle').decode('utf-8') 21 | new_g_str = '' 22 | for line in g_str.split('\n'): 23 | if 'prefix' not in line: 24 | new_g_str += line + '\n' 25 | if is_notebook(): 26 | display(Markdown('```turtle\n' + new_g_str + '\n```')) 27 | else: 28 | print(g_str) 29 | -------------------------------------------------------------------------------- /data/14.csv: -------------------------------------------------------------------------------- 1 | ,timestamp,value 2 | 0,2015-02-01T08:04:21+00:00,1.0 3 | 1,2015-02-01T08:09:52+00:00,1.0 4 | 2,2015-02-01T08:15:10+00:00,1.0 5 | 3,2015-02-01T08:20:31+00:00,1.0 6 | 4,2015-02-01T08:25:57+00:00,1.0 7 | 5,2015-02-01T08:31:22+00:00,1.0 8 | 6,2015-02-01T08:36:50+00:00,1.0 9 | 7,2015-02-01T08:42:12+00:00,1.0 10 | 8,2015-02-01T08:47:34+00:00,1.0 11 | 9,2015-02-01T08:53:06+00:00,1.0 12 | 10,2015-02-01T08:58:34+00:00,1.0 13 | 11,2015-02-01T09:03:49+00:00,1.0 14 | 12,2015-02-01T09:09:07+00:00,1.0 15 | 13,2015-02-01T09:14:35+00:00,1.0 16 | 14,2015-02-01T09:19:54+00:00,1.0 17 | 15,2015-02-01T09:25:13+00:00,1.0 18 | 16,2015-02-01T09:30:21+00:00,1.0 19 | 17,2015-02-01T09:35:37+00:00,1.0 20 | 18,2015-02-01T09:40:43+00:00,1.0 21 | 19,2015-02-01T09:46:07+00:00,1.0 22 | 20,2015-02-01T09:51:26+00:00,1.0 23 | 21,2015-02-01T09:56:50+00:00,1.0 24 | 22,2015-02-01T10:02:02+00:00,1.0 25 | 23,2015-02-01T10:07:23+00:00,1.0 26 | 24,2015-02-01T10:12:38+00:00,1.0 27 | 25,2015-02-01T10:18:12+00:00,1.0 28 | 26,2015-02-01T10:23:31+00:00,1.0 29 | 27,2015-02-01T10:28:54+00:00,1.0 30 | 28,2015-02-01T10:34:19+00:00,1.0 31 | 29,2015-02-01T10:39:35+00:00,1.0 32 | 30,2015-02-01T10:44:54+00:00,1.0 33 | 31,2015-02-01T10:50:01+00:00,1.0 34 | 32,2015-02-01T10:55:13+00:00,1.0 35 | 33,2015-02-01T11:00:25+00:00,1.0 36 | 34,2015-02-01T11:05:48+00:00,1.0 37 | 35,2015-02-01T11:10:59+00:00,1.0 38 | 36,2015-02-01T11:16:16+00:00,1.0 39 | 37,2015-02-01T11:21:28+00:00,1.0 40 | 38,2015-02-01T11:26:48+00:00,1.0 41 | 39,2015-02-01T11:32:08+00:00,1.0 42 | 40,2015-02-01T11:37:28+00:00,1.0 43 | 41,2015-02-01T11:42:44+00:00,1.0 44 | 42,2015-02-01T11:48:08+00:00,1.0 45 | 43,2015-02-01T11:53:25+00:00,1.0 46 | 44,2015-02-01T11:58:43+00:00,1.0 47 | 45,2015-02-01T12:03:54+00:00,1.0 48 | 46,2015-02-01T12:09:18+00:00,1.0 49 | 47,2015-02-01T12:14:43+00:00,1.0 50 | 48,2015-02-01T12:20:05+00:00,1.0 51 | 49,2015-02-01T12:25:27+00:00,1.0 52 | 50,2015-02-01T12:30:56+00:00,1.0 53 | 51,2015-02-01T12:36:23+00:00,1.0 54 | 52,2015-02-01T12:41:47+00:00,1.0 55 | 53,2015-02-01T12:47:17+00:00,1.0 56 | 54,2015-02-01T12:52:37+00:00,1.0 57 | 55,2015-02-01T12:57:59+00:00,1.0 58 | 56,2015-02-01T13:03:29+00:00,1.0 59 | 57,2015-02-01T13:08:52+00:00,1.0 60 | 58,2015-02-01T13:14:15+00:00,1.0 61 | 59,2015-02-01T13:19:46+00:00,1.0 62 | 60,2015-02-01T13:25:14+00:00,1.0 63 | 61,2015-02-01T13:30:44+00:00,1.0 64 | 62,2015-02-01T13:36:18+00:00,1.0 65 | 63,2015-02-01T13:41:39+00:00,1.0 66 | 64,2015-02-01T13:47:04+00:00,1.0 67 | 65,2015-02-01T13:52:30+00:00,1.0 68 | 66,2015-02-01T13:57:53+00:00,1.0 69 | 67,2015-02-01T14:03:29+00:00,1.0 70 | 68,2015-02-01T14:09:01+00:00,1.0 71 | 69,2015-02-01T14:14:31+00:00,1.0 72 | 70,2015-02-01T14:20:02+00:00,1.0 73 | 71,2015-02-01T14:25:30+00:00,1.0 74 | 72,2015-02-01T14:31:00+00:00,1.0 75 | 73,2015-02-01T14:36:25+00:00,1.0 76 | 74,2015-02-01T14:41:44+00:00,1.0 77 | 75,2015-02-01T14:46:54+00:00,1.0 78 | 76,2015-02-01T14:52:14+00:00,1.0 79 | 77,2015-02-01T14:57:37+00:00,1.0 80 | 78,2015-02-01T15:03:02+00:00,1.0 81 | 79,2015-02-01T15:08:19+00:00,1.0 82 | 80,2015-02-01T15:13:32+00:00,1.0 83 | 81,2015-02-01T15:18:47+00:00,1.0 84 | 82,2015-02-01T15:24:14+00:00,1.0 85 | 83,2015-02-01T15:29:33+00:00,1.0 86 | 84,2015-02-01T15:34:54+00:00,1.0 87 | 85,2015-02-01T15:40:09+00:00,1.0 88 | 86,2015-02-01T15:45:29+00:00,1.0 89 | 87,2015-02-01T15:50:43+00:00,1.0 90 | 88,2015-02-01T15:56:00+00:00,1.0 91 | 89,2015-02-01T16:01:24+00:00,1.0 92 | 90,2015-02-01T16:06:49+00:00,1.0 93 | 91,2015-02-01T16:12:05+00:00,1.0 94 | 92,2015-02-01T16:17:27+00:00,1.0 95 | 93,2015-02-01T16:22:48+00:00,1.0 96 | 94,2015-02-01T16:28:03+00:00,1.0 97 | 95,2015-02-01T16:33:24+00:00,1.0 98 | 96,2015-02-01T16:38:39+00:00,1.0 99 | 97,2015-02-01T16:44:01+00:00,1.0 100 | 98,2015-02-01T16:49:25+00:00,1.0 101 | 99,2015-02-01T16:54:48+00:00,1.0 102 | 100,2015-02-01T17:00:09+00:00,1.0 103 | 101,2015-02-01T17:05:28+00:00,1.0 104 | 102,2015-02-01T17:10:47+00:00,1.0 105 | 103,2015-02-01T17:15:59+00:00,1.0 106 | 104,2015-02-01T17:21:12+00:00,1.0 107 | 105,2015-02-01T17:26:31+00:00,1.0 108 | 106,2015-02-01T17:31:50+00:00,1.0 109 | 107,2015-02-01T17:37:18+00:00,1.0 110 | 108,2015-02-01T17:42:39+00:00,1.0 111 | 109,2015-02-01T17:47:59+00:00,1.0 112 | 110,2015-02-01T17:53:23+00:00,1.0 113 | 111,2015-02-01T17:58:49+00:00,1.0 114 | 112,2015-02-01T18:04:15+00:00,1.0 115 | 113,2015-02-01T18:09:40+00:00,1.0 116 | 114,2015-02-01T18:15:05+00:00,1.0 117 | 115,2015-02-01T18:20:24+00:00,1.0 118 | 116,2015-02-01T18:25:53+00:00,1.0 119 | 117,2015-02-01T18:31:17+00:00,1.0 120 | 118,2015-02-01T18:36:33+00:00,1.0 121 | 119,2015-02-01T18:41:49+00:00,1.0 122 | 120,2015-02-01T18:47:13+00:00,1.0 123 | 121,2015-02-01T18:52:30+00:00,1.0 124 | 122,2015-02-01T18:57:39+00:00,1.0 125 | 123,2015-02-01T19:02:50+00:00,1.0 126 | 124,2015-02-01T19:08:06+00:00,1.0 127 | 125,2015-02-01T19:13:18+00:00,1.0 128 | 126,2015-02-01T19:18:47+00:00,1.0 129 | 127,2015-02-01T19:24:10+00:00,1.0 130 | 128,2015-02-01T19:29:31+00:00,1.0 131 | 129,2015-02-01T19:34:53+00:00,1.0 132 | 130,2015-02-01T19:40:11+00:00,1.0 133 | 131,2015-02-01T19:45:37+00:00,1.0 134 | 132,2015-02-01T19:51:01+00:00,1.0 135 | 133,2015-02-01T19:56:28+00:00,1.0 136 | 134,2015-02-01T20:01:51+00:00,1.0 137 | 135,2015-02-01T20:07:11+00:00,1.0 138 | 136,2015-02-01T20:12:44+00:00,1.0 139 | 137,2015-02-01T20:18:01+00:00,1.0 140 | 138,2015-02-01T20:23:37+00:00,1.0 141 | 139,2015-02-01T20:28:58+00:00,1.0 142 | 140,2015-02-01T20:34:11+00:00,1.0 143 | 141,2015-02-01T20:39:25+00:00,1.0 144 | 142,2015-02-01T20:44:51+00:00,1.0 145 | 143,2015-02-01T20:50:14+00:00,1.0 146 | 144,2015-02-01T20:55:42+00:00,1.0 147 | 145,2015-02-01T21:01:10+00:00,1.0 148 | 146,2015-02-01T21:06:45+00:00,1.0 149 | 147,2015-02-01T21:12:12+00:00,1.0 150 | 148,2015-02-01T21:17:37+00:00,1.0 151 | 149,2015-02-01T21:23:07+00:00,1.0 152 | 150,2015-02-01T21:28:37+00:00,1.0 153 | 151,2015-02-01T21:34:22+00:00,1.0 154 | 152,2015-02-01T21:39:57+00:00,1.0 155 | 153,2015-02-01T21:45:19+00:00,1.0 156 | 154,2015-02-01T21:50:43+00:00,1.0 157 | 155,2015-02-01T21:56:09+00:00,1.0 158 | 156,2015-02-01T22:01:31+00:00,1.0 159 | 157,2015-02-01T22:06:50+00:00,1.0 160 | 158,2015-02-01T22:12:23+00:00,1.0 161 | 159,2015-02-01T22:17:42+00:00,1.0 162 | 160,2015-02-01T22:23:08+00:00,1.0 163 | 161,2015-02-01T22:28:41+00:00,1.0 164 | 162,2015-02-01T22:33:58+00:00,1.0 165 | 163,2015-02-01T22:39:21+00:00,1.0 166 | 164,2015-02-01T22:44:57+00:00,1.0 167 | 165,2015-02-01T22:50:25+00:00,1.0 168 | 166,2015-02-01T22:55:50+00:00,1.0 169 | 167,2015-02-01T23:01:26+00:00,1.0 170 | 168,2015-02-01T23:06:56+00:00,1.0 171 | 169,2015-02-01T23:12:17+00:00,1.0 172 | 170,2015-02-01T23:17:39+00:00,1.0 173 | 171,2015-02-01T23:22:54+00:00,1.0 174 | 172,2015-02-01T23:28:21+00:00,1.0 175 | 173,2015-02-01T23:33:44+00:00,1.0 176 | 174,2015-02-01T23:39:05+00:00,1.0 177 | 175,2015-02-01T23:44:22+00:00,1.0 178 | 176,2015-02-01T23:49:39+00:00,1.0 179 | 177,2015-02-01T23:55:00+00:00,1.0 180 | 178,2015-02-02T00:00:29+00:00,1.0 181 | 179,2015-02-02T00:06:04+00:00,1.0 182 | 180,2015-02-02T00:11:36+00:00,1.0 183 | 181,2015-02-02T00:17:03+00:00,1.0 184 | 182,2015-02-02T00:22:25+00:00,1.0 185 | 183,2015-02-02T00:27:52+00:00,1.0 186 | 184,2015-02-02T00:33:03+00:00,1.0 187 | 185,2015-02-02T00:38:28+00:00,1.0 188 | 186,2015-02-02T00:43:48+00:00,1.0 189 | 187,2015-02-02T00:49:05+00:00,1.0 190 | 188,2015-02-02T00:54:40+00:00,1.0 191 | 189,2015-02-02T01:00:01+00:00,1.0 192 | 190,2015-02-02T01:05:33+00:00,1.0 193 | 191,2015-02-02T01:10:51+00:00,1.0 194 | 192,2015-02-02T01:16:11+00:00,1.0 195 | 193,2015-02-02T01:21:28+00:00,1.0 196 | 194,2015-02-02T01:26:52+00:00,1.0 197 | 195,2015-02-02T01:32:04+00:00,1.0 198 | 196,2015-02-02T01:37:24+00:00,1.0 199 | 197,2015-02-02T01:42:44+00:00,1.0 200 | 198,2015-02-02T01:48:12+00:00,1.0 201 | 199,2015-02-02T01:53:30+00:00,1.0 202 | 200,2015-02-02T01:58:53+00:00,1.0 203 | 201,2015-02-02T02:04:24+00:00,1.0 204 | 202,2015-02-02T02:09:47+00:00,1.0 205 | 203,2015-02-02T02:15:18+00:00,1.0 206 | 204,2015-02-02T02:20:40+00:00,1.0 207 | 205,2015-02-02T02:25:57+00:00,1.0 208 | 206,2015-02-02T02:31:19+00:00,1.0 209 | 207,2015-02-02T02:36:33+00:00,1.0 210 | 208,2015-02-02T02:41:50+00:00,1.0 211 | 209,2015-02-02T02:47:07+00:00,1.0 212 | 210,2015-02-02T02:52:27+00:00,1.0 213 | 211,2015-02-02T02:57:59+00:00,1.0 214 | 212,2015-02-02T03:03:29+00:00,1.0 215 | 213,2015-02-02T03:08:57+00:00,1.0 216 | 214,2015-02-02T03:14:25+00:00,1.0 217 | 215,2015-02-02T03:19:40+00:00,1.0 218 | 216,2015-02-02T03:24:53+00:00,1.0 219 | 217,2015-02-02T03:30:14+00:00,1.0 220 | 218,2015-02-02T03:35:44+00:00,1.0 221 | 219,2015-02-02T03:41:01+00:00,1.0 222 | 220,2015-02-02T03:46:28+00:00,1.0 223 | 221,2015-02-02T03:51:49+00:00,1.0 224 | 222,2015-02-02T03:57:14+00:00,1.0 225 | 223,2015-02-02T04:02:38+00:00,1.0 226 | 224,2015-02-02T04:08:01+00:00,1.0 227 | 225,2015-02-02T04:13:15+00:00,1.0 228 | 226,2015-02-02T04:18:33+00:00,1.0 229 | 227,2015-02-02T04:23:49+00:00,1.0 230 | 228,2015-02-02T04:29:23+00:00,1.0 231 | 229,2015-02-02T04:34:46+00:00,1.0 232 | 230,2015-02-02T04:40:09+00:00,1.0 233 | 231,2015-02-02T04:45:39+00:00,1.0 234 | 232,2015-02-02T04:50:56+00:00,1.0 235 | 233,2015-02-02T04:56:28+00:00,1.0 236 | 234,2015-02-02T05:01:59+00:00,1.0 237 | 235,2015-02-02T05:07:23+00:00,1.0 238 | 236,2015-02-02T05:12:52+00:00,1.0 239 | 237,2015-02-02T05:18:09+00:00,1.0 240 | 238,2015-02-02T05:23:28+00:00,1.0 241 | 239,2015-02-02T05:28:49+00:00,1.0 242 | 240,2015-02-02T05:34:16+00:00,1.0 243 | 241,2015-02-02T05:39:41+00:00,1.0 244 | 242,2015-02-02T05:45:11+00:00,1.0 245 | 243,2015-02-02T05:50:25+00:00,1.0 246 | 244,2015-02-02T05:55:43+00:00,1.0 247 | 245,2015-02-02T06:01:08+00:00,1.0 248 | 246,2015-02-02T06:06:28+00:00,1.0 249 | 247,2015-02-02T06:11:44+00:00,1.0 250 | 248,2015-02-02T06:17:00+00:00,1.0 251 | 249,2015-02-02T06:22:15+00:00,1.0 252 | 250,2015-02-02T06:27:26+00:00,1.0 253 | 251,2015-02-02T06:32:40+00:00,1.0 254 | 252,2015-02-02T06:37:58+00:00,1.0 255 | 253,2015-02-02T06:43:12+00:00,1.0 256 | 254,2015-02-02T06:48:38+00:00,1.0 257 | 255,2015-02-02T06:54:00+00:00,1.0 258 | 256,2015-02-02T06:59:22+00:00,1.0 259 | 257,2015-02-02T07:04:47+00:00,1.0 260 | 258,2015-02-02T07:10:10+00:00,1.0 261 | 259,2015-02-02T07:15:26+00:00,1.0 262 | 260,2015-02-02T07:20:49+00:00,1.0 263 | 261,2015-02-02T07:26:15+00:00,1.0 264 | 262,2015-02-02T07:31:47+00:00,1.0 265 | 263,2015-02-02T07:37:08+00:00,1.0 266 | 264,2015-02-02T07:42:27+00:00,1.0 267 | 265,2015-02-02T07:47:39+00:00,1.0 268 | 266,2015-02-02T07:52:52+00:00,1.0 269 | 267,2015-02-02T07:57:36+00:00,1.0 270 | 268,2015-02-02T08:02:36+00:00,1.0 271 | 269,2015-02-02T08:07:24+00:00,1.0 272 | 270,2015-02-02T08:12:17+00:00,1.0 273 | 271,2015-02-02T08:17:08+00:00,1.0 274 | 272,2015-02-02T08:21:56+00:00,1.0 275 | 273,2015-02-02T08:26:45+00:00,1.0 276 | 274,2015-02-02T08:31:40+00:00,1.0 277 | 275,2015-02-02T08:36:26+00:00,1.0 278 | 276,2015-02-02T08:41:02+00:00,1.0 279 | 277,2015-02-02T08:45:54+00:00,1.0 280 | 278,2015-02-02T08:50:45+00:00,1.0 281 | 279,2015-02-02T08:55:30+00:00,1.0 282 | 280,2015-02-02T09:00:17+00:00,1.0 283 | 281,2015-02-02T09:05:06+00:00,1.0 284 | 282,2015-02-02T09:09:55+00:00,1.0 285 | 283,2015-02-02T09:14:50+00:00,1.0 286 | 284,2015-02-02T09:19:42+00:00,1.0 287 | 285,2015-02-02T09:24:38+00:00,1.0 288 | 286,2015-02-02T09:29:26+00:00,1.0 289 | 287,2015-02-02T09:34:14+00:00,1.0 290 | 288,2015-02-02T09:39:03+00:00,1.0 291 | 289,2015-02-02T09:43:54+00:00,1.0 292 | 290,2015-02-02T09:48:42+00:00,1.0 293 | 291,2015-02-02T09:53:31+00:00,1.0 294 | 292,2015-02-02T09:58:17+00:00,1.0 295 | 293,2015-02-02T10:03:09+00:00,1.0 296 | 294,2015-02-02T10:07:56+00:00,1.0 297 | 295,2015-02-02T10:12:47+00:00,1.0 298 | 296,2015-02-02T10:17:38+00:00,1.0 299 | 297,2015-02-02T10:22:28+00:00,1.0 300 | 298,2015-02-02T10:27:18+00:00,1.0 301 | 299,2015-02-02T10:32:05+00:00,1.0 302 | 300,2015-02-02T10:36:55+00:00,1.0 303 | 301,2015-02-02T10:41:45+00:00,1.0 304 | 302,2015-02-02T10:46:34+00:00,1.0 305 | 303,2015-02-02T10:51:23+00:00,1.0 306 | 304,2015-02-02T10:56:13+00:00,1.0 307 | 305,2015-02-02T11:01:03+00:00,1.0 308 | 306,2015-02-02T11:05:46+00:00,1.0 309 | 307,2015-02-02T11:10:41+00:00,1.0 310 | 308,2015-02-02T11:15:27+00:00,1.0 311 | 309,2015-02-02T11:20:17+00:00,1.0 312 | 310,2015-02-02T11:25:11+00:00,1.0 313 | 311,2015-02-02T11:30:01+00:00,1.0 314 | 312,2015-02-02T11:34:53+00:00,1.0 315 | 313,2015-02-02T11:39:44+00:00,1.0 316 | 314,2015-02-02T11:44:33+00:00,1.0 317 | 315,2015-02-02T11:49:26+00:00,1.0 318 | 316,2015-02-02T11:54:19+00:00,1.0 319 | 317,2015-02-02T11:59:10+00:00,1.0 320 | 318,2015-02-02T12:03:57+00:00,1.0 321 | 319,2015-02-02T12:08:47+00:00,1.0 322 | 320,2015-02-02T12:13:38+00:00,1.0 323 | 321,2015-02-02T12:18:27+00:00,1.0 324 | 322,2015-02-02T12:23:09+00:00,1.0 325 | 323,2015-02-02T12:27:57+00:00,1.0 326 | 324,2015-02-02T12:32:48+00:00,1.0 327 | 325,2015-02-02T12:37:40+00:00,1.0 328 | 326,2015-02-02T12:42:33+00:00,1.0 329 | 327,2015-02-02T12:47:25+00:00,1.0 330 | 328,2015-02-02T12:52:20+00:00,1.0 331 | 329,2015-02-02T12:57:15+00:00,1.0 332 | 330,2015-02-02T13:02:05+00:00,1.0 333 | 331,2015-02-02T13:06:53+00:00,1.0 334 | 332,2015-02-02T13:11:49+00:00,1.0 335 | 333,2015-02-02T13:16:40+00:00,1.0 336 | 334,2015-02-02T13:21:33+00:00,1.0 337 | 335,2015-02-02T13:26:22+00:00,1.0 338 | 336,2015-02-02T13:31:14+00:00,1.0 339 | 337,2015-02-02T13:36:04+00:00,1.0 340 | 338,2015-02-02T13:40:50+00:00,1.0 341 | 339,2015-02-02T13:45:40+00:00,1.0 342 | 340,2015-02-02T13:50:30+00:00,1.0 343 | 341,2015-02-02T13:55:18+00:00,1.0 344 | 342,2015-02-02T14:00:09+00:00,1.0 345 | 343,2015-02-02T14:05:01+00:00,1.0 346 | 344,2015-02-02T14:09:50+00:00,1.0 347 | 345,2015-02-02T14:14:44+00:00,1.0 348 | 346,2015-02-02T14:19:34+00:00,1.0 349 | 347,2015-02-02T14:24:26+00:00,1.0 350 | 348,2015-02-02T14:29:21+00:00,1.0 351 | 349,2015-02-02T14:34:12+00:00,1.0 352 | 350,2015-02-02T14:39:02+00:00,1.0 353 | 351,2015-02-02T14:43:51+00:00,1.0 354 | 352,2015-02-02T14:48:38+00:00,1.0 355 | 353,2015-02-02T14:53:24+00:00,1.0 356 | 354,2015-02-02T14:58:10+00:00,1.0 357 | 355,2015-02-02T15:03:10+00:00,1.0 358 | 356,2015-02-02T15:07:56+00:00,1.0 359 | 357,2015-02-02T15:12:45+00:00,1.0 360 | 358,2015-02-02T15:17:36+00:00,1.0 361 | 359,2015-02-02T15:22:31+00:00,1.0 362 | 360,2015-02-02T15:27:28+00:00,1.0 363 | 361,2015-02-02T15:32:20+00:00,1.0 364 | 362,2015-02-02T15:37:12+00:00,1.0 365 | 363,2015-02-02T15:42:04+00:00,1.0 366 | 364,2015-02-02T15:46:53+00:00,1.0 367 | 365,2015-02-02T15:51:42+00:00,1.0 368 | 366,2015-02-02T15:56:32+00:00,1.0 369 | 367,2015-02-02T16:01:20+00:00,1.0 370 | 368,2015-02-02T16:06:13+00:00,1.0 371 | 369,2015-02-02T16:11:04+00:00,1.0 372 | 370,2015-02-02T16:15:56+00:00,1.0 373 | 371,2015-02-02T16:20:46+00:00,1.0 374 | 372,2015-02-02T16:25:33+00:00,1.0 375 | 373,2015-02-02T16:30:22+00:00,1.0 376 | 374,2015-02-02T16:35:08+00:00,1.0 377 | 375,2015-02-02T16:39:54+00:00,1.0 378 | 376,2015-02-02T16:44:45+00:00,1.0 379 | 377,2015-02-02T16:49:35+00:00,1.0 380 | 378,2015-02-02T16:54:29+00:00,1.0 381 | 379,2015-02-02T16:59:23+00:00,1.0 382 | 380,2015-02-02T17:04:20+00:00,1.0 383 | 381,2015-02-02T17:09:10+00:00,1.0 384 | 382,2015-02-02T17:14:00+00:00,1.0 385 | 383,2015-02-02T17:18:49+00:00,1.0 386 | 384,2015-02-02T17:23:40+00:00,1.0 387 | 385,2015-02-02T17:28:32+00:00,1.0 388 | 386,2015-02-02T17:33:19+00:00,1.0 389 | 387,2015-02-02T17:38:06+00:00,1.0 390 | 388,2015-02-02T17:43:00+00:00,1.0 391 | 389,2015-02-02T17:47:48+00:00,1.0 392 | 390,2015-02-02T17:52:37+00:00,1.0 393 | 391,2015-02-02T17:57:31+00:00,1.0 394 | 392,2015-02-02T18:02:25+00:00,1.0 395 | 393,2015-02-02T18:07:20+00:00,1.0 396 | 394,2015-02-02T18:12:11+00:00,1.0 397 | 395,2015-02-02T18:17:01+00:00,1.0 398 | 396,2015-02-02T18:21:49+00:00,1.0 399 | 397,2015-02-02T18:26:39+00:00,1.0 400 | 398,2015-02-02T18:31:33+00:00,1.0 401 | 399,2015-02-02T18:36:21+00:00,1.0 402 | 400,2015-02-02T18:41:14+00:00,1.0 403 | 401,2015-02-02T18:46:06+00:00,1.0 404 | 402,2015-02-02T18:51:01+00:00,1.0 405 | 403,2015-02-02T18:55:55+00:00,1.0 406 | 404,2015-02-02T19:00:44+00:00,1.0 407 | 405,2015-02-02T19:05:32+00:00,1.0 408 | 406,2015-02-02T19:10:33+00:00,1.0 409 | 407,2015-02-02T19:15:23+00:00,1.0 410 | 408,2015-02-02T19:20:20+00:00,1.0 411 | 409,2015-02-02T19:25:09+00:00,1.0 412 | 410,2015-02-02T19:30:01+00:00,1.0 413 | 411,2015-02-02T19:34:50+00:00,1.0 414 | 412,2015-02-02T19:39:41+00:00,1.0 415 | 413,2015-02-02T19:44:35+00:00,1.0 416 | 414,2015-02-02T19:49:25+00:00,1.0 417 | 415,2015-02-02T19:54:19+00:00,1.0 418 | 416,2015-02-02T19:59:15+00:00,1.0 419 | 417,2015-02-02T20:04:18+00:00,1.0 420 | 418,2015-02-02T20:09:14+00:00,1.0 421 | 419,2015-02-02T20:14:09+00:00,1.0 422 | 420,2015-02-02T20:19:00+00:00,1.0 423 | 421,2015-02-02T20:23:55+00:00,1.0 424 | 422,2015-02-02T20:28:48+00:00,1.0 425 | 423,2015-02-02T20:33:37+00:00,1.0 426 | 424,2015-02-02T20:38:30+00:00,1.0 427 | 425,2015-02-02T20:43:25+00:00,1.0 428 | 426,2015-02-02T20:48:37+00:00,1.0 429 | 427,2015-02-02T20:53:33+00:00,1.0 430 | 428,2015-02-02T20:58:23+00:00,1.0 431 | 429,2015-02-02T21:03:32+00:00,1.0 432 | 430,2015-02-02T21:08:22+00:00,1.0 433 | 431,2015-02-02T21:13:12+00:00,1.0 434 | 432,2015-02-02T21:18:05+00:00,1.0 435 | 433,2015-02-02T21:22:55+00:00,1.0 436 | 434,2015-02-02T21:28:00+00:00,1.0 437 | 435,2015-02-02T21:32:51+00:00,1.0 438 | 436,2015-02-02T21:37:41+00:00,1.0 439 | 437,2015-02-02T21:42:31+00:00,1.0 440 | 438,2015-02-02T21:47:18+00:00,1.0 441 | 439,2015-02-02T21:52:08+00:00,1.0 442 | 440,2015-02-02T21:56:58+00:00,1.0 443 | 441,2015-02-02T22:01:51+00:00,1.0 444 | 442,2015-02-02T22:06:46+00:00,1.0 445 | 443,2015-02-02T22:11:36+00:00,1.0 446 | 444,2015-02-02T22:16:27+00:00,1.0 447 | 445,2015-02-02T22:21:19+00:00,1.0 448 | 446,2015-02-02T22:26:11+00:00,1.0 449 | 447,2015-02-02T22:31:10+00:00,1.0 450 | 448,2015-02-02T22:36:03+00:00,1.0 451 | 449,2015-02-02T22:40:49+00:00,1.0 452 | 450,2015-02-03T00:34:48+00:00,1.0 453 | 451,2015-02-03T00:39:48+00:00,1.0 454 | 452,2015-02-03T00:45:18+00:00,1.0 455 | 453,2015-02-03T00:50:18+00:00,1.0 456 | 454,2015-02-03T00:55:15+00:00,1.0 457 | 455,2015-02-03T01:00:15+00:00,1.0 458 | 456,2015-02-03T01:05:13+00:00,1.0 459 | 457,2015-02-03T01:10:13+00:00,1.0 460 | 458,2015-02-03T01:15:15+00:00,1.0 461 | 459,2015-02-03T01:20:15+00:00,1.0 462 | 460,2015-02-03T01:25:08+00:00,1.0 463 | 461,2015-02-03T01:30:08+00:00,1.0 464 | 462,2015-02-03T01:35:06+00:00,1.0 465 | 463,2015-02-03T01:40:06+00:00,1.0 466 | 464,2015-02-03T01:45:08+00:00,1.0 467 | 465,2015-02-03T01:50:07+00:00,1.0 468 | 466,2015-02-03T01:55:02+00:00,1.0 469 | 467,2015-02-03T01:59:59+00:00,1.0 470 | 468,2015-02-03T02:05:02+00:00,1.0 471 | 469,2015-02-03T02:09:56+00:00,1.0 472 | 470,2015-02-03T02:14:56+00:00,1.0 473 | 471,2015-02-03T02:19:55+00:00,1.0 474 | 472,2015-02-03T02:24:54+00:00,1.0 475 | 473,2015-02-03T02:29:56+00:00,1.0 476 | 474,2015-02-03T02:34:58+00:00,1.0 477 | 475,2015-02-03T02:39:55+00:00,1.0 478 | 476,2015-02-03T02:44:51+00:00,1.0 479 | 477,2015-02-03T02:49:51+00:00,1.0 480 | 478,2015-02-03T02:54:50+00:00,1.0 481 | 479,2015-02-03T02:59:44+00:00,1.0 482 | 480,2015-02-03T03:04:55+00:00,1.0 483 | 481,2015-02-03T03:09:55+00:00,1.0 484 | 482,2015-02-03T03:14:51+00:00,1.0 485 | 483,2015-02-03T03:19:51+00:00,1.0 486 | 484,2015-02-03T03:24:53+00:00,1.0 487 | 485,2015-02-03T03:29:55+00:00,1.0 488 | 486,2015-02-03T03:34:53+00:00,1.0 489 | 487,2015-02-03T03:39:52+00:00,1.0 490 | 488,2015-02-03T03:44:49+00:00,1.0 491 | 489,2015-02-03T03:49:48+00:00,1.0 492 | 490,2015-02-03T03:54:47+00:00,1.0 493 | 491,2015-02-03T03:59:48+00:00,1.0 494 | 492,2015-02-03T04:04:54+00:00,1.0 495 | 493,2015-02-03T04:10:00+00:00,1.0 496 | 494,2015-02-03T04:15:06+00:00,1.0 497 | 495,2015-02-03T04:20:11+00:00,1.0 498 | 496,2015-02-03T04:25:12+00:00,1.0 499 | 497,2015-02-03T04:30:13+00:00,1.0 500 | 498,2015-02-03T04:35:12+00:00,1.0 501 | 499,2015-02-03T04:40:17+00:00,1.0 502 | 500,2015-02-03T04:45:20+00:00,1.0 503 | 501,2015-02-03T04:50:27+00:00,1.0 504 | 502,2015-02-03T04:55:35+00:00,1.0 505 | 503,2015-02-03T05:00:39+00:00,1.0 506 | 504,2015-02-03T05:05:44+00:00,1.0 507 | 505,2015-02-03T05:10:51+00:00,1.0 508 | 506,2015-02-03T05:15:49+00:00,1.0 509 | 507,2015-02-03T05:20:48+00:00,1.0 510 | 508,2015-02-03T05:25:49+00:00,1.0 511 | 509,2015-02-03T05:30:47+00:00,1.0 512 | 510,2015-02-03T05:35:44+00:00,1.0 513 | 511,2015-02-03T05:40:48+00:00,1.0 514 | 512,2015-02-03T05:45:46+00:00,1.0 515 | 513,2015-02-03T05:50:43+00:00,1.0 516 | 514,2015-02-03T05:55:46+00:00,1.0 517 | 515,2015-02-03T06:00:49+00:00,1.0 518 | 516,2015-02-03T06:05:51+00:00,1.0 519 | 517,2015-02-03T06:10:55+00:00,1.0 520 | 518,2015-02-03T06:15:50+00:00,1.0 521 | 519,2015-02-03T06:20:52+00:00,1.0 522 | 520,2015-02-03T06:25:54+00:00,1.0 523 | 521,2015-02-03T06:30:51+00:00,1.0 524 | 522,2015-02-03T06:35:52+00:00,1.0 525 | 523,2015-02-03T06:40:51+00:00,1.0 526 | 524,2015-02-03T06:45:53+00:00,1.0 527 | 525,2015-02-03T06:50:54+00:00,1.0 528 | 526,2015-02-03T06:55:55+00:00,1.0 529 | 527,2015-02-03T07:00:54+00:00,1.0 530 | 528,2015-02-03T07:05:50+00:00,1.0 531 | 529,2015-02-03T07:10:54+00:00,1.0 532 | 530,2015-02-03T07:16:00+00:00,1.0 533 | 531,2015-02-03T07:21:17+00:00,1.0 534 | 532,2015-02-03T07:26:37+00:00,1.0 535 | 533,2015-02-03T07:31:55+00:00,1.0 536 | 534,2015-02-03T07:37:08+00:00,1.0 537 | 535,2015-02-03T07:42:28+00:00,1.0 538 | 536,2015-02-03T07:47:36+00:00,1.0 539 | 537,2015-02-03T07:52:40+00:00,1.0 540 | 538,2015-02-03T07:57:48+00:00,1.0 541 | 539,2015-02-03T08:03:01+00:00,1.0 542 | 540,2015-02-03T08:08:00+00:00,1.0 543 | 541,2015-02-03T08:13:05+00:00,1.0 544 | 542,2015-02-03T08:18:10+00:00,1.0 545 | 543,2015-02-03T08:23:13+00:00,1.0 546 | 544,2015-02-03T08:28:16+00:00,1.0 547 | 545,2015-02-03T08:33:19+00:00,1.0 548 | 546,2015-02-03T08:38:20+00:00,1.0 549 | 547,2015-02-03T08:43:18+00:00,1.0 550 | 548,2015-02-03T08:48:07+00:00,1.0 551 | 549,2015-02-03T08:53:13+00:00,1.0 552 | 550,2015-02-03T08:58:15+00:00,1.0 553 | 551,2015-02-03T09:03:17+00:00,1.0 554 | 552,2015-02-03T09:08:23+00:00,1.0 555 | 553,2015-02-03T09:13:27+00:00,1.0 556 | 554,2015-02-03T09:18:26+00:00,1.0 557 | 555,2015-02-03T09:23:28+00:00,1.0 558 | 556,2015-02-03T09:28:32+00:00,1.0 559 | 557,2015-02-03T09:33:34+00:00,1.0 560 | 558,2015-02-03T09:38:38+00:00,1.0 561 | 559,2015-02-03T09:43:39+00:00,1.0 562 | 560,2015-02-03T09:48:43+00:00,1.0 563 | 561,2015-02-03T09:53:47+00:00,1.0 564 | 562,2015-02-03T09:58:44+00:00,1.0 565 | 563,2015-02-03T10:03:48+00:00,1.0 566 | 564,2015-02-03T10:08:50+00:00,1.0 567 | 565,2015-02-03T10:13:54+00:00,1.0 568 | 566,2015-02-03T10:18:59+00:00,1.0 569 | 567,2015-02-03T10:23:54+00:00,1.0 570 | 568,2015-02-03T10:28:50+00:00,1.0 571 | 569,2015-02-03T10:33:49+00:00,1.0 572 | 570,2015-02-03T10:38:48+00:00,1.0 573 | 571,2015-02-03T10:43:48+00:00,1.0 574 | 572,2015-02-03T10:49:00+00:00,1.0 575 | 573,2015-02-03T10:54:00+00:00,1.0 576 | 574,2015-02-03T10:58:58+00:00,1.0 577 | 575,2015-02-03T11:04:01+00:00,1.0 578 | 576,2015-02-03T11:09:03+00:00,1.0 579 | 577,2015-02-03T11:13:58+00:00,1.0 580 | 578,2015-02-03T11:18:52+00:00,1.0 581 | 579,2015-02-03T11:23:43+00:00,1.0 582 | 580,2015-02-03T11:28:39+00:00,1.0 583 | 581,2015-02-03T11:33:37+00:00,1.0 584 | 582,2015-02-03T11:38:32+00:00,1.0 585 | 583,2015-02-03T11:43:28+00:00,1.0 586 | 584,2015-02-03T11:48:24+00:00,1.0 587 | 585,2015-02-03T11:53:17+00:00,1.0 588 | 586,2015-02-03T11:58:14+00:00,1.0 589 | 587,2015-02-03T12:03:18+00:00,1.0 590 | 588,2015-02-03T12:08:13+00:00,1.0 591 | 589,2015-02-03T12:13:10+00:00,1.0 592 | 590,2015-02-03T12:18:11+00:00,1.0 593 | 591,2015-02-03T12:23:19+00:00,1.0 594 | 592,2015-02-03T12:28:13+00:00,1.0 595 | 593,2015-02-03T12:33:10+00:00,1.0 596 | 594,2015-02-03T12:38:15+00:00,1.0 597 | 595,2015-02-03T12:43:15+00:00,1.0 598 | 596,2015-02-03T12:48:14+00:00,1.0 599 | 597,2015-02-03T12:53:11+00:00,1.0 600 | 598,2015-02-03T12:58:09+00:00,1.0 601 | 599,2015-02-03T13:03:12+00:00,1.0 602 | 600,2015-02-03T13:08:13+00:00,1.0 603 | 601,2015-02-03T13:13:15+00:00,1.0 604 | 602,2015-02-03T13:18:16+00:00,1.0 605 | 603,2015-02-03T13:23:15+00:00,1.0 606 | 604,2015-02-03T13:28:15+00:00,1.0 607 | 605,2015-02-03T13:33:14+00:00,1.0 608 | 606,2015-02-03T13:38:15+00:00,1.0 609 | 607,2015-02-03T13:43:14+00:00,1.0 610 | 608,2015-02-03T13:48:12+00:00,1.0 611 | 609,2015-02-03T13:53:15+00:00,1.0 612 | 610,2015-02-03T13:58:18+00:00,1.0 613 | 611,2015-02-03T14:03:23+00:00,1.0 614 | 612,2015-02-03T14:08:20+00:00,1.0 615 | 613,2015-02-03T14:13:22+00:00,1.0 616 | 614,2015-02-03T14:18:24+00:00,1.0 617 | 615,2015-02-03T14:23:21+00:00,1.0 618 | 616,2015-02-03T14:28:23+00:00,1.0 619 | 617,2015-02-03T14:33:20+00:00,1.0 620 | 618,2015-02-03T14:38:23+00:00,1.0 621 | 619,2015-02-03T14:43:23+00:00,1.0 622 | 620,2015-02-03T14:48:21+00:00,1.0 623 | 621,2015-02-03T14:53:22+00:00,1.0 624 | 622,2015-02-03T14:58:20+00:00,1.0 625 | 623,2015-02-03T15:03:34+00:00,1.0 626 | 624,2015-02-03T15:08:33+00:00,1.0 627 | 625,2015-02-03T15:13:36+00:00,1.0 628 | 626,2015-02-03T15:18:42+00:00,1.0 629 | 627,2015-02-03T15:23:44+00:00,1.0 630 | 628,2015-02-03T15:28:44+00:00,1.0 631 | 629,2015-02-03T15:33:43+00:00,1.0 632 | 630,2015-02-03T15:38:44+00:00,1.0 633 | 631,2015-02-03T15:43:46+00:00,1.0 634 | 632,2015-02-03T15:48:47+00:00,1.0 635 | 633,2015-02-03T15:53:47+00:00,1.0 636 | 634,2015-02-03T15:58:44+00:00,1.0 637 | 635,2015-02-03T16:03:48+00:00,1.0 638 | 636,2015-02-03T16:08:47+00:00,1.0 639 | 637,2015-02-03T16:13:47+00:00,1.0 640 | 638,2015-02-03T16:18:47+00:00,1.0 641 | 639,2015-02-03T16:23:50+00:00,1.0 642 | 640,2015-02-03T16:28:54+00:00,1.0 643 | 641,2015-02-03T16:33:58+00:00,1.0 644 | 642,2015-02-03T16:38:59+00:00,1.0 645 | 643,2015-02-03T16:43:56+00:00,1.0 646 | 644,2015-02-03T16:49:03+00:00,1.0 647 | 645,2015-02-03T16:54:02+00:00,1.0 648 | 646,2015-02-03T16:59:01+00:00,1.0 649 | 647,2015-02-03T17:04:03+00:00,1.0 650 | 648,2015-02-03T17:09:08+00:00,1.0 651 | 649,2015-02-03T17:14:11+00:00,1.0 652 | 650,2015-02-03T17:19:13+00:00,1.0 653 | 651,2015-02-03T17:24:14+00:00,1.0 654 | 652,2015-02-03T17:29:15+00:00,1.0 655 | 653,2015-02-03T17:34:50+00:00,1.0 656 | 654,2015-02-03T17:40:42+00:00,1.0 657 | 655,2015-02-03T17:46:45+00:00,1.0 658 | 656,2015-02-03T17:52:40+00:00,1.0 659 | 657,2015-02-03T17:58:56+00:00,1.0 660 | 658,2015-02-03T18:04:36+00:00,1.0 661 | 659,2015-02-03T18:09:28+00:00,1.0 662 | 660,2015-02-03T18:14:24+00:00,1.0 663 | 661,2015-02-03T18:19:21+00:00,1.0 664 | 662,2015-02-03T18:24:23+00:00,1.0 665 | 663,2015-02-03T18:29:21+00:00,1.0 666 | 664,2015-02-03T18:34:23+00:00,1.0 667 | 665,2015-02-03T18:39:27+00:00,1.0 668 | 666,2015-02-03T18:44:23+00:00,1.0 669 | 667,2015-02-03T18:49:20+00:00,1.0 670 | 668,2015-02-03T18:54:19+00:00,1.0 671 | 669,2015-02-03T18:59:17+00:00,1.0 672 | 670,2015-02-03T19:04:15+00:00,1.0 673 | 671,2015-02-03T19:09:14+00:00,1.0 674 | 672,2015-02-03T19:14:13+00:00,1.0 675 | 673,2015-02-03T19:19:20+00:00,1.0 676 | 674,2015-02-03T19:24:20+00:00,1.0 677 | 675,2015-02-03T19:29:14+00:00,1.0 678 | 676,2015-02-03T19:34:09+00:00,1.0 679 | 677,2015-02-03T19:39:06+00:00,1.0 680 | 678,2015-02-03T19:44:08+00:00,1.0 681 | 679,2015-02-03T19:49:08+00:00,1.0 682 | 680,2015-02-03T19:54:06+00:00,1.0 683 | 681,2015-02-03T19:59:05+00:00,1.0 684 | 682,2015-02-03T20:04:04+00:00,1.0 685 | 683,2015-02-03T20:09:04+00:00,1.0 686 | 684,2015-02-03T20:14:00+00:00,1.0 687 | 685,2015-02-03T20:18:56+00:00,1.0 688 | 686,2015-02-03T20:23:55+00:00,1.0 689 | 687,2015-02-03T20:28:54+00:00,1.0 690 | 688,2015-02-03T20:33:50+00:00,1.0 691 | 689,2015-02-03T20:38:47+00:00,1.0 692 | 690,2015-02-03T20:43:50+00:00,1.0 693 | 691,2015-02-03T20:48:53+00:00,1.0 694 | 692,2015-02-03T20:53:51+00:00,1.0 695 | 693,2015-02-03T20:58:53+00:00,1.0 696 | 694,2015-02-03T21:03:53+00:00,1.0 697 | 695,2015-02-03T21:08:49+00:00,1.0 698 | 696,2015-02-03T21:13:49+00:00,1.0 699 | 697,2015-02-03T21:18:50+00:00,1.0 700 | 698,2015-02-03T21:23:52+00:00,1.0 701 | 699,2015-02-03T21:28:55+00:00,1.0 702 | 700,2015-02-03T21:33:59+00:00,1.0 703 | 701,2015-02-03T21:38:58+00:00,1.0 704 | 702,2015-02-03T21:43:58+00:00,1.0 705 | 703,2015-02-03T21:49:03+00:00,1.0 706 | 704,2015-02-03T21:54:16+00:00,1.0 707 | 705,2015-02-03T21:59:20+00:00,1.0 708 | 706,2015-02-03T22:04:23+00:00,1.0 709 | 707,2015-02-03T22:09:22+00:00,1.0 710 | 708,2015-02-03T22:14:20+00:00,1.0 711 | 709,2015-02-03T22:19:24+00:00,1.0 712 | 710,2015-02-03T22:24:25+00:00,1.0 713 | 711,2015-02-03T22:29:36+00:00,1.0 714 | 712,2015-02-03T22:34:38+00:00,1.0 715 | 713,2015-02-03T22:39:50+00:00,1.0 716 | 714,2015-02-03T22:44:53+00:00,1.0 717 | 715,2015-02-03T22:49:53+00:00,1.0 718 | 716,2015-02-03T22:54:51+00:00,1.0 719 | 717,2015-02-03T22:59:50+00:00,1.0 720 | 718,2015-02-03T23:05:00+00:00,1.0 721 | 719,2015-02-03T23:10:05+00:00,1.0 722 | 720,2015-02-03T23:15:03+00:00,1.0 723 | 721,2015-02-03T23:20:06+00:00,1.0 724 | 722,2015-02-03T23:25:09+00:00,1.0 725 | 723,2015-02-03T23:30:12+00:00,1.0 726 | 724,2015-02-03T23:35:08+00:00,1.0 727 | 725,2015-02-03T23:40:07+00:00,1.0 728 | 726,2015-02-03T23:45:05+00:00,1.0 729 | 727,2015-02-03T23:50:00+00:00,1.0 730 | 728,2015-02-03T23:54:52+00:00,1.0 731 | 729,2015-02-03T23:59:53+00:00,1.0 732 | 730,2015-02-04T00:04:51+00:00,1.0 733 | 731,2015-02-04T00:09:52+00:00,1.0 734 | 732,2015-02-04T00:14:52+00:00,1.0 735 | 733,2015-02-04T00:19:50+00:00,1.0 736 | 734,2015-02-04T00:24:45+00:00,1.0 737 | 735,2015-02-04T00:29:53+00:00,1.0 738 | 736,2015-02-04T00:34:54+00:00,1.0 739 | 737,2015-02-04T00:39:51+00:00,1.0 740 | 738,2015-02-04T00:44:52+00:00,1.0 741 | 739,2015-02-04T00:49:52+00:00,1.0 742 | 740,2015-02-04T00:54:54+00:00,1.0 743 | 741,2015-02-04T00:59:54+00:00,1.0 744 | 742,2015-02-04T01:04:53+00:00,1.0 745 | 743,2015-02-04T01:09:52+00:00,1.0 746 | 744,2015-02-04T01:14:51+00:00,1.0 747 | 745,2015-02-04T01:19:57+00:00,1.0 748 | 746,2015-02-04T01:24:56+00:00,1.0 749 | 747,2015-02-04T01:29:53+00:00,1.0 750 | 748,2015-02-04T01:35:01+00:00,1.0 751 | 749,2015-02-04T01:40:03+00:00,1.0 752 | 750,2015-02-04T01:45:06+00:00,1.0 753 | 751,2015-02-04T01:50:06+00:00,1.0 754 | 752,2015-02-04T01:55:06+00:00,1.0 755 | 753,2015-02-04T02:00:05+00:00,1.0 756 | 754,2015-02-04T02:05:07+00:00,1.0 757 | 755,2015-02-04T02:10:13+00:00,1.0 758 | 756,2015-02-04T02:15:08+00:00,1.0 759 | 757,2015-02-04T02:20:07+00:00,1.0 760 | 758,2015-02-04T02:25:06+00:00,1.0 761 | 759,2015-02-04T02:30:09+00:00,1.0 762 | 760,2015-02-04T02:35:14+00:00,1.0 763 | 761,2015-02-04T02:40:12+00:00,1.0 764 | 762,2015-02-04T02:45:02+00:00,1.0 765 | 763,2015-02-04T02:49:59+00:00,1.0 766 | 764,2015-02-04T02:54:55+00:00,1.0 767 | 765,2015-02-04T02:59:55+00:00,1.0 768 | 766,2015-02-04T03:05:03+00:00,1.0 769 | 767,2015-02-04T03:10:01+00:00,1.0 770 | 768,2015-02-04T03:15:00+00:00,1.0 771 | 769,2015-02-04T03:20:01+00:00,1.0 772 | 770,2015-02-04T03:24:58+00:00,1.0 773 | 771,2015-02-04T03:29:55+00:00,1.0 774 | 772,2015-02-04T03:34:51+00:00,1.0 775 | 773,2015-02-04T03:39:53+00:00,1.0 776 | 774,2015-02-04T03:44:50+00:00,1.0 777 | 775,2015-02-04T03:49:48+00:00,1.0 778 | 776,2015-02-04T03:54:42+00:00,1.0 779 | 777,2015-02-04T03:59:44+00:00,1.0 780 | 778,2015-02-04T04:04:42+00:00,1.0 781 | 779,2015-02-04T04:09:49+00:00,1.0 782 | 780,2015-02-04T04:14:47+00:00,1.0 783 | 781,2015-02-04T04:19:48+00:00,1.0 784 | 782,2015-02-04T04:24:46+00:00,1.0 785 | 783,2015-02-04T04:29:42+00:00,1.0 786 | 784,2015-02-04T04:34:43+00:00,1.0 787 | 785,2015-02-04T04:39:36+00:00,1.0 788 | 786,2015-02-04T04:44:33+00:00,1.0 789 | 787,2015-02-04T04:49:30+00:00,1.0 790 | 788,2015-02-04T04:54:33+00:00,1.0 791 | 789,2015-02-04T04:59:38+00:00,1.0 792 | 790,2015-02-04T05:04:44+00:00,1.0 793 | 791,2015-02-04T05:09:50+00:00,1.0 794 | 792,2015-02-04T05:14:55+00:00,1.0 795 | 793,2015-02-04T05:19:55+00:00,1.0 796 | 794,2015-02-04T05:24:55+00:00,1.0 797 | 795,2015-02-04T05:29:52+00:00,1.0 798 | 796,2015-02-04T05:34:52+00:00,1.0 799 | 797,2015-02-04T05:39:54+00:00,1.0 800 | 798,2015-02-04T05:44:50+00:00,1.0 801 | 799,2015-02-04T05:49:43+00:00,1.0 802 | 800,2015-02-04T05:54:48+00:00,1.0 803 | 801,2015-02-04T05:59:48+00:00,1.0 804 | 802,2015-02-04T06:04:48+00:00,1.0 805 | 803,2015-02-04T06:09:50+00:00,1.0 806 | 804,2015-02-04T06:14:54+00:00,1.0 807 | 805,2015-02-04T06:19:49+00:00,1.0 808 | 806,2015-02-04T06:24:50+00:00,1.0 809 | 807,2015-02-04T06:29:47+00:00,1.0 810 | 808,2015-02-04T06:34:45+00:00,1.0 811 | 809,2015-02-04T06:39:43+00:00,1.0 812 | 810,2015-02-04T06:44:37+00:00,1.0 813 | 811,2015-02-04T06:49:36+00:00,1.0 814 | 812,2015-02-04T06:54:28+00:00,1.0 815 | 813,2015-02-04T06:59:23+00:00,1.0 816 | 814,2015-02-04T07:04:27+00:00,1.0 817 | 815,2015-02-04T07:09:26+00:00,1.0 818 | 816,2015-02-04T07:14:40+00:00,1.0 819 | 817,2015-02-04T07:19:59+00:00,1.0 820 | 818,2015-02-04T07:25:19+00:00,1.0 821 | 819,2015-02-04T07:30:37+00:00,1.0 822 | 820,2015-02-04T07:35:49+00:00,1.0 823 | 821,2015-02-04T07:41:00+00:00,1.0 824 | 822,2015-02-04T07:46:00+00:00,1.0 825 | 823,2015-02-04T07:51:06+00:00,1.0 826 | 824,2015-02-04T07:56:06+00:00,1.0 827 | 825,2015-02-04T08:01:14+00:00,1.0 828 | 826,2015-02-04T08:06:12+00:00,1.0 829 | 827,2015-02-04T08:11:18+00:00,1.0 830 | 828,2015-02-04T08:16:14+00:00,1.0 831 | 829,2015-02-04T08:21:17+00:00,1.0 832 | 830,2015-02-04T08:26:19+00:00,1.0 833 | 831,2015-02-04T08:31:16+00:00,1.0 834 | 832,2015-02-04T08:36:10+00:00,1.0 835 | 833,2015-02-04T08:41:05+00:00,1.0 836 | 834,2015-02-04T08:46:02+00:00,1.0 837 | 835,2015-02-04T08:51:07+00:00,1.0 838 | 836,2015-02-04T08:56:10+00:00,1.0 839 | 837,2015-02-04T09:01:18+00:00,1.0 840 | 838,2015-02-04T09:06:26+00:00,1.0 841 | 839,2015-02-04T09:11:31+00:00,1.0 842 | 840,2015-02-04T09:16:28+00:00,1.0 843 | 841,2015-02-04T09:21:35+00:00,1.0 844 | 842,2015-02-04T09:26:41+00:00,1.0 845 | 843,2015-02-04T09:31:52+00:00,1.0 846 | 844,2015-02-04T09:37:00+00:00,1.0 847 | 845,2015-02-04T09:42:03+00:00,1.0 848 | 846,2015-02-04T09:47:11+00:00,1.0 849 | 847,2015-02-04T09:52:14+00:00,1.0 850 | 848,2015-02-04T09:57:19+00:00,1.0 851 | 849,2015-02-04T10:02:30+00:00,1.0 852 | 850,2015-02-04T10:07:37+00:00,1.0 853 | 851,2015-02-04T10:12:41+00:00,1.0 854 | 852,2015-02-04T10:17:45+00:00,1.0 855 | 853,2015-02-04T10:22:48+00:00,1.0 856 | 854,2015-02-04T10:27:53+00:00,1.0 857 | 855,2015-02-04T10:32:52+00:00,1.0 858 | 856,2015-02-04T10:37:59+00:00,1.0 859 | 857,2015-02-04T10:42:59+00:00,1.0 860 | 858,2015-02-04T10:48:01+00:00,1.0 861 | 859,2015-02-04T10:53:05+00:00,1.0 862 | 860,2015-02-04T10:58:11+00:00,1.0 863 | 861,2015-02-04T11:03:14+00:00,1.0 864 | 862,2015-02-04T11:08:00+00:00,1.0 865 | 863,2015-02-04T11:13:03+00:00,1.0 866 | 864,2015-02-04T11:18:11+00:00,1.0 867 | 865,2015-02-04T11:23:22+00:00,1.0 868 | 866,2015-02-04T11:28:29+00:00,1.0 869 | 867,2015-02-04T11:33:38+00:00,1.0 870 | 868,2015-02-04T11:38:47+00:00,1.0 871 | 869,2015-02-04T11:43:50+00:00,1.0 872 | 870,2015-02-04T11:48:52+00:00,1.0 873 | 871,2015-02-04T11:54:00+00:00,1.0 874 | 872,2015-02-04T11:59:05+00:00,1.0 875 | 873,2015-02-04T12:04:05+00:00,1.0 876 | 874,2015-02-04T12:09:20+00:00,1.0 877 | 875,2015-02-04T12:14:24+00:00,1.0 878 | 876,2015-02-04T12:19:28+00:00,1.0 879 | 877,2015-02-04T12:24:43+00:00,1.0 880 | 878,2015-02-04T12:29:52+00:00,1.0 881 | 879,2015-02-04T12:35:00+00:00,1.0 882 | 880,2015-02-04T12:40:06+00:00,1.0 883 | 881,2015-02-04T12:45:09+00:00,1.0 884 | 882,2015-02-04T12:50:12+00:00,1.0 885 | 883,2015-02-04T12:55:15+00:00,1.0 886 | 884,2015-02-04T13:00:17+00:00,1.0 887 | 885,2015-02-04T13:05:24+00:00,1.0 888 | 886,2015-02-04T13:10:34+00:00,1.0 889 | 887,2015-02-04T13:15:33+00:00,1.0 890 | 888,2015-02-04T13:20:35+00:00,1.0 891 | 889,2015-02-04T13:25:40+00:00,1.0 892 | 890,2015-02-04T13:30:43+00:00,1.0 893 | 891,2015-02-04T13:35:50+00:00,1.0 894 | 892,2015-02-04T13:40:53+00:00,1.0 895 | 893,2015-02-04T13:45:57+00:00,1.0 896 | 894,2015-02-04T13:50:57+00:00,1.0 897 | 895,2015-02-04T13:56:02+00:00,1.0 898 | 896,2015-02-04T14:01:12+00:00,1.0 899 | 897,2015-02-04T14:06:11+00:00,1.0 900 | 898,2015-02-04T14:11:15+00:00,1.0 901 | 899,2015-02-04T14:16:22+00:00,1.0 902 | 900,2015-02-04T14:21:27+00:00,1.0 903 | 901,2015-02-04T14:26:29+00:00,1.0 904 | 902,2015-02-04T14:31:28+00:00,1.0 905 | 903,2015-02-04T14:36:28+00:00,1.0 906 | 904,2015-02-04T14:41:34+00:00,1.0 907 | 905,2015-02-04T14:46:36+00:00,1.0 908 | 906,2015-02-04T14:51:44+00:00,1.0 909 | 907,2015-02-04T14:56:43+00:00,1.0 910 | 908,2015-02-04T15:01:52+00:00,1.0 911 | 909,2015-02-04T15:06:58+00:00,1.0 912 | 910,2015-02-04T15:11:58+00:00,1.0 913 | 911,2015-02-04T15:17:07+00:00,1.0 914 | 912,2015-02-04T15:22:16+00:00,1.0 915 | 913,2015-02-04T15:27:23+00:00,1.0 916 | 914,2015-02-04T15:32:28+00:00,1.0 917 | 915,2015-02-04T15:37:29+00:00,1.0 918 | 916,2015-02-04T15:42:34+00:00,1.0 919 | 917,2015-02-04T15:47:38+00:00,1.0 920 | 918,2015-02-04T15:52:46+00:00,1.0 921 | 919,2015-02-04T15:57:51+00:00,1.0 922 | 920,2015-02-04T16:03:00+00:00,1.0 923 | 921,2015-02-04T16:07:59+00:00,1.0 924 | 922,2015-02-04T16:13:06+00:00,1.0 925 | 923,2015-02-04T16:18:11+00:00,1.0 926 | 924,2015-02-04T16:23:15+00:00,1.0 927 | 925,2015-02-04T16:28:15+00:00,1.0 928 | 926,2015-02-04T16:33:25+00:00,1.0 929 | 927,2015-02-04T16:38:27+00:00,1.0 930 | 928,2015-02-04T16:43:36+00:00,1.0 931 | 929,2015-02-04T16:48:41+00:00,1.0 932 | 930,2015-02-04T16:53:46+00:00,1.0 933 | 931,2015-02-04T16:58:55+00:00,1.0 934 | 932,2015-02-04T17:04:11+00:00,1.0 935 | 933,2015-02-04T17:09:19+00:00,1.0 936 | 934,2015-02-04T17:14:27+00:00,1.0 937 | 935,2015-02-04T17:19:36+00:00,1.0 938 | 936,2015-02-04T17:24:44+00:00,1.0 939 | 937,2015-02-04T17:29:55+00:00,1.0 940 | 938,2015-02-04T17:34:54+00:00,1.0 941 | 939,2015-02-04T17:39:49+00:00,1.0 942 | 940,2015-02-04T17:44:46+00:00,1.0 943 | 941,2015-02-04T17:49:40+00:00,1.0 944 | 942,2015-02-04T17:54:39+00:00,1.0 945 | 943,2015-02-04T17:59:42+00:00,1.0 946 | 944,2015-02-04T18:04:39+00:00,1.0 947 | 945,2015-02-04T18:09:37+00:00,1.0 948 | 946,2015-02-04T18:14:40+00:00,1.0 949 | 947,2015-02-04T18:19:41+00:00,1.0 950 | 948,2015-02-04T18:24:39+00:00,1.0 951 | 949,2015-02-04T18:29:38+00:00,1.0 952 | 950,2015-02-04T18:34:37+00:00,1.0 953 | 951,2015-02-04T18:39:41+00:00,1.0 954 | 952,2015-02-04T18:44:40+00:00,1.0 955 | 953,2015-02-04T18:49:45+00:00,1.0 956 | 954,2015-02-04T18:54:45+00:00,1.0 957 | 955,2015-02-04T18:59:48+00:00,1.0 958 | 956,2015-02-04T19:04:46+00:00,1.0 959 | 957,2015-02-04T19:09:44+00:00,1.0 960 | 958,2015-02-04T19:14:50+00:00,1.0 961 | 959,2015-02-04T19:19:50+00:00,1.0 962 | 960,2015-02-04T19:24:48+00:00,1.0 963 | 961,2015-02-04T19:29:48+00:00,1.0 964 | 962,2015-02-04T19:34:50+00:00,1.0 965 | 963,2015-02-04T19:39:47+00:00,1.0 966 | 964,2015-02-04T19:44:44+00:00,1.0 967 | 965,2015-02-04T19:49:39+00:00,1.0 968 | 966,2015-02-04T19:54:35+00:00,1.0 969 | 967,2015-02-04T19:59:36+00:00,1.0 970 | 968,2015-02-04T20:04:39+00:00,1.0 971 | 969,2015-02-04T20:09:37+00:00,1.0 972 | 970,2015-02-04T20:14:37+00:00,1.0 973 | 971,2015-02-04T20:19:35+00:00,1.0 974 | 972,2015-02-04T20:24:35+00:00,1.0 975 | 973,2015-02-04T20:29:40+00:00,1.0 976 | 974,2015-02-04T20:34:45+00:00,1.0 977 | 975,2015-02-04T20:39:49+00:00,1.0 978 | 976,2015-02-04T20:44:55+00:00,1.0 979 | 977,2015-02-04T20:49:56+00:00,1.0 980 | 978,2015-02-04T20:54:59+00:00,1.0 981 | 979,2015-02-04T21:00:01+00:00,1.0 982 | 980,2015-02-04T21:05:01+00:00,1.0 983 | 981,2015-02-04T21:10:04+00:00,1.0 984 | 982,2015-02-04T21:15:08+00:00,1.0 985 | 983,2015-02-04T21:20:10+00:00,1.0 986 | 984,2015-02-04T21:25:11+00:00,1.0 987 | 985,2015-02-04T21:30:08+00:00,1.0 988 | 986,2015-02-04T21:35:07+00:00,1.0 989 | 987,2015-02-04T21:40:07+00:00,1.0 990 | 988,2015-02-04T21:45:04+00:00,1.0 991 | 989,2015-02-04T21:50:05+00:00,1.0 992 | 990,2015-02-04T21:55:05+00:00,1.0 993 | 991,2015-02-04T22:00:05+00:00,1.0 994 | 992,2015-02-04T22:05:06+00:00,1.0 995 | 993,2015-02-04T22:10:08+00:00,1.0 996 | 994,2015-02-04T22:15:19+00:00,1.0 997 | 995,2015-02-04T22:20:27+00:00,1.0 998 | 996,2015-02-04T22:25:31+00:00,1.0 999 | 997,2015-02-04T22:30:38+00:00,1.0 1000 | 998,2015-02-04T22:35:54+00:00,1.0 1001 | 999,2015-02-04T22:40:56+00:00,1.0 1002 | 1000,2015-02-04T22:45:59+00:00,1.0 1003 | 1001,2015-02-04T22:51:01+00:00,1.0 1004 | 1002,2015-02-04T22:55:59+00:00,1.0 1005 | 1003,2015-02-04T23:01:02+00:00,1.0 1006 | 1004,2015-02-04T23:06:02+00:00,1.0 1007 | 1005,2015-02-04T23:10:59+00:00,1.0 1008 | 1006,2015-02-04T23:16:04+00:00,1.0 1009 | 1007,2015-02-04T23:21:08+00:00,1.0 1010 | 1008,2015-02-04T23:26:16+00:00,1.0 1011 | 1009,2015-02-04T23:31:15+00:00,1.0 1012 | 1010,2015-02-04T23:36:09+00:00,1.0 1013 | 1011,2015-02-04T23:41:03+00:00,1.0 1014 | 1012,2015-02-04T23:46:00+00:00,1.0 1015 | 1013,2015-02-04T23:50:55+00:00,1.0 1016 | 1014,2015-02-04T23:55:52+00:00,1.0 1017 | 1015,2015-02-05T00:00:48+00:00,1.0 1018 | 1016,2015-02-05T00:05:42+00:00,1.0 1019 | 1017,2015-02-05T00:10:38+00:00,1.0 1020 | 1018,2015-02-05T00:15:36+00:00,1.0 1021 | 1019,2015-02-05T00:20:30+00:00,1.0 1022 | 1020,2015-02-05T00:25:24+00:00,1.0 1023 | 1021,2015-02-05T00:30:20+00:00,1.0 1024 | 1022,2015-02-05T00:35:16+00:00,1.0 1025 | 1023,2015-02-05T00:40:08+00:00,1.0 1026 | 1024,2015-02-05T00:45:02+00:00,1.0 1027 | 1025,2015-02-05T00:50:02+00:00,1.0 1028 | 1026,2015-02-05T00:54:56+00:00,1.0 1029 | 1027,2015-02-05T00:59:51+00:00,1.0 1030 | 1028,2015-02-05T01:04:42+00:00,1.0 1031 | 1029,2015-02-05T01:09:36+00:00,1.0 1032 | 1030,2015-02-05T01:14:23+00:00,1.0 1033 | 1031,2015-02-05T01:19:20+00:00,1.0 1034 | 1032,2015-02-05T01:24:13+00:00,1.0 1035 | 1033,2015-02-05T01:29:01+00:00,1.0 1036 | 1034,2015-02-05T01:33:46+00:00,1.0 1037 | 1035,2015-02-05T01:38:22+00:00,1.0 1038 | 1036,2015-02-05T01:42:59+00:00,1.0 1039 | 1037,2015-02-05T01:47:39+00:00,1.0 1040 | 1038,2015-02-05T01:52:19+00:00,1.0 1041 | 1039,2015-02-05T01:57:01+00:00,1.0 1042 | 1040,2015-02-05T02:01:50+00:00,1.0 1043 | 1041,2015-02-05T02:06:36+00:00,1.0 1044 | 1042,2015-02-05T02:11:25+00:00,1.0 1045 | 1043,2015-02-05T02:16:14+00:00,1.0 1046 | 1044,2015-02-05T02:21:00+00:00,1.0 1047 | 1045,2015-02-05T02:25:44+00:00,1.0 1048 | 1046,2015-02-05T02:30:32+00:00,1.0 1049 | 1047,2015-02-05T02:35:18+00:00,1.0 1050 | 1048,2015-02-05T02:40:08+00:00,1.0 1051 | 1049,2015-02-05T02:44:57+00:00,1.0 1052 | 1050,2015-02-05T02:49:49+00:00,1.0 1053 | 1051,2015-02-05T02:54:34+00:00,1.0 1054 | 1052,2015-02-05T02:59:19+00:00,1.0 1055 | 1053,2015-02-05T03:04:17+00:00,1.0 1056 | 1054,2015-02-05T03:09:02+00:00,1.0 1057 | 1055,2015-02-05T03:13:50+00:00,1.0 1058 | 1056,2015-02-05T03:18:42+00:00,1.0 1059 | 1057,2015-02-05T03:23:28+00:00,1.0 1060 | 1058,2015-02-05T03:28:21+00:00,1.0 1061 | 1059,2015-02-05T03:33:07+00:00,1.0 1062 | 1060,2015-02-05T03:37:50+00:00,1.0 1063 | 1061,2015-02-05T03:42:39+00:00,1.0 1064 | 1062,2015-02-05T03:47:37+00:00,1.0 1065 | 1063,2015-02-05T03:52:24+00:00,1.0 1066 | 1064,2015-02-05T03:57:13+00:00,1.0 1067 | 1065,2015-02-05T04:02:04+00:00,1.0 1068 | 1066,2015-02-05T04:06:47+00:00,1.0 1069 | 1067,2015-02-05T04:11:37+00:00,1.0 1070 | 1068,2015-02-05T04:16:20+00:00,1.0 1071 | 1069,2015-02-05T04:21:02+00:00,1.0 1072 | 1070,2015-02-05T04:25:49+00:00,1.0 1073 | 1071,2015-02-05T04:30:27+00:00,1.0 1074 | 1072,2015-02-05T04:35:08+00:00,1.0 1075 | 1073,2015-02-05T04:40:00+00:00,1.0 1076 | 1074,2015-02-05T04:44:43+00:00,1.0 1077 | 1075,2015-02-05T04:49:32+00:00,1.0 1078 | 1076,2015-02-05T04:54:22+00:00,1.0 1079 | 1077,2015-02-05T04:59:21+00:00,1.0 1080 | 1078,2015-02-05T05:04:18+00:00,1.0 1081 | 1079,2015-02-05T05:09:03+00:00,1.0 1082 | 1080,2015-02-05T05:13:49+00:00,1.0 1083 | 1081,2015-02-05T05:18:34+00:00,1.0 1084 | 1082,2015-02-05T05:23:19+00:00,1.0 1085 | 1083,2015-02-05T05:28:06+00:00,1.0 1086 | 1084,2015-02-05T05:32:50+00:00,1.0 1087 | 1085,2015-02-05T05:37:32+00:00,1.0 1088 | 1086,2015-02-05T05:42:19+00:00,1.0 1089 | 1087,2015-02-05T05:47:04+00:00,1.0 1090 | 1088,2015-02-05T05:51:47+00:00,1.0 1091 | 1089,2015-02-05T05:56:35+00:00,1.0 1092 | 1090,2015-02-05T06:01:18+00:00,1.0 1093 | 1091,2015-02-05T06:06:03+00:00,1.0 1094 | 1092,2015-02-05T06:10:50+00:00,1.0 1095 | 1093,2015-02-05T06:15:35+00:00,1.0 1096 | 1094,2015-02-05T06:20:17+00:00,1.0 1097 | 1095,2015-02-05T06:25:07+00:00,1.0 1098 | 1096,2015-02-05T06:29:53+00:00,1.0 1099 | 1097,2015-02-05T06:34:41+00:00,1.0 1100 | 1098,2015-02-05T06:39:25+00:00,1.0 1101 | 1099,2015-02-05T06:44:04+00:00,1.0 1102 | 1100,2015-02-05T06:48:46+00:00,1.0 1103 | 1101,2015-02-05T06:53:35+00:00,1.0 1104 | 1102,2015-02-05T06:58:20+00:00,1.0 1105 | 1103,2015-02-05T07:02:58+00:00,1.0 1106 | 1104,2015-02-05T07:07:41+00:00,1.0 1107 | 1105,2015-02-05T07:12:26+00:00,1.0 1108 | 1106,2015-02-05T07:17:30+00:00,1.0 1109 | 1107,2015-02-05T07:22:33+00:00,1.0 1110 | 1108,2015-02-05T07:27:30+00:00,1.0 1111 | 1109,2015-02-05T07:32:22+00:00,1.0 1112 | 1110,2015-02-05T07:37:18+00:00,1.0 1113 | 1111,2015-02-05T07:42:21+00:00,1.0 1114 | 1112,2015-02-05T07:47:10+00:00,1.0 1115 | 1113,2015-02-05T07:51:54+00:00,1.0 1116 | 1114,2015-02-05T07:56:38+00:00,1.0 1117 | 1115,2015-02-05T08:01:27+00:00,1.0 1118 | 1116,2015-02-05T08:06:16+00:00,1.0 1119 | 1117,2015-02-05T08:10:55+00:00,1.0 1120 | 1118,2015-02-05T08:15:41+00:00,1.0 1121 | 1119,2015-02-05T08:20:29+00:00,1.0 1122 | 1120,2015-02-05T08:25:12+00:00,1.0 1123 | 1121,2015-02-05T08:29:58+00:00,1.0 1124 | 1122,2015-02-05T08:34:50+00:00,1.0 1125 | 1123,2015-02-05T08:39:41+00:00,1.0 1126 | 1124,2015-02-05T08:44:27+00:00,1.0 1127 | 1125,2015-02-05T08:49:14+00:00,1.0 1128 | 1126,2015-02-05T08:54:00+00:00,1.0 1129 | 1127,2015-02-05T08:58:48+00:00,1.0 1130 | 1128,2015-02-05T09:03:34+00:00,1.0 1131 | 1129,2015-02-05T09:08:24+00:00,1.0 1132 | 1130,2015-02-05T09:13:12+00:00,1.0 1133 | 1131,2015-02-05T09:17:56+00:00,1.0 1134 | 1132,2015-02-05T09:22:41+00:00,1.0 1135 | 1133,2015-02-05T09:27:28+00:00,1.0 1136 | 1134,2015-02-05T09:32:18+00:00,1.0 1137 | 1135,2015-02-05T09:37:08+00:00,1.0 1138 | 1136,2015-02-05T09:41:52+00:00,1.0 1139 | 1137,2015-02-05T09:46:34+00:00,1.0 1140 | 1138,2015-02-05T09:51:17+00:00,1.0 1141 | 1139,2015-02-05T09:56:00+00:00,1.0 1142 | 1140,2015-02-05T10:00:38+00:00,1.0 1143 | 1141,2015-02-05T10:05:20+00:00,1.0 1144 | 1142,2015-02-05T10:09:55+00:00,1.0 1145 | 1143,2015-02-05T10:14:41+00:00,1.0 1146 | 1144,2015-02-05T10:19:25+00:00,1.0 1147 | 1145,2015-02-05T10:24:12+00:00,1.0 1148 | 1146,2015-02-05T10:28:58+00:00,1.0 1149 | 1147,2015-02-05T10:33:44+00:00,1.0 1150 | 1148,2015-02-05T10:38:29+00:00,1.0 1151 | 1149,2015-02-05T10:43:17+00:00,1.0 1152 | 1150,2015-02-05T10:47:56+00:00,1.0 1153 | 1151,2015-02-05T10:52:46+00:00,1.0 1154 | 1152,2015-02-05T10:57:33+00:00,1.0 1155 | 1153,2015-02-05T11:02:25+00:00,1.0 1156 | 1154,2015-02-05T11:07:06+00:00,1.0 1157 | 1155,2015-02-05T11:11:55+00:00,1.0 1158 | 1156,2015-02-05T11:16:40+00:00,1.0 1159 | 1157,2015-02-05T11:21:30+00:00,1.0 1160 | 1158,2015-02-05T11:26:20+00:00,1.0 1161 | 1159,2015-02-05T11:31:09+00:00,1.0 1162 | 1160,2015-02-05T11:35:55+00:00,1.0 1163 | 1161,2015-02-05T11:40:45+00:00,1.0 1164 | 1162,2015-02-05T11:45:32+00:00,1.0 1165 | 1163,2015-02-05T11:50:16+00:00,1.0 1166 | 1164,2015-02-05T11:55:04+00:00,1.0 1167 | 1165,2015-02-05T11:59:49+00:00,1.0 1168 | 1166,2015-02-05T12:04:36+00:00,1.0 1169 | 1167,2015-02-05T12:09:25+00:00,1.0 1170 | 1168,2015-02-05T12:14:12+00:00,1.0 1171 | 1169,2015-02-05T12:19:01+00:00,1.0 1172 | 1170,2015-02-05T12:23:42+00:00,1.0 1173 | 1171,2015-02-05T12:28:27+00:00,1.0 1174 | 1172,2015-02-05T12:33:14+00:00,1.0 1175 | 1173,2015-02-05T12:37:54+00:00,1.0 1176 | 1174,2015-02-05T12:42:39+00:00,1.0 1177 | 1175,2015-02-05T12:47:28+00:00,1.0 1178 | 1176,2015-02-05T12:52:15+00:00,1.0 1179 | 1177,2015-02-05T12:57:06+00:00,1.0 1180 | 1178,2015-02-05T13:01:52+00:00,1.0 1181 | 1179,2015-02-05T13:06:38+00:00,1.0 1182 | 1180,2015-02-05T13:11:28+00:00,1.0 1183 | 1181,2015-02-05T13:16:16+00:00,1.0 1184 | 1182,2015-02-05T13:21:05+00:00,1.0 1185 | 1183,2015-02-05T13:25:51+00:00,1.0 1186 | 1184,2015-02-05T13:30:35+00:00,1.0 1187 | 1185,2015-02-05T13:35:16+00:00,1.0 1188 | 1186,2015-02-05T13:40:02+00:00,1.0 1189 | 1187,2015-02-05T13:44:51+00:00,1.0 1190 | 1188,2015-02-05T13:50:03+00:00,1.0 1191 | 1189,2015-02-05T13:54:50+00:00,1.0 1192 | 1190,2015-02-05T13:59:39+00:00,1.0 1193 | 1191,2015-02-05T14:04:35+00:00,1.0 1194 | 1192,2015-02-05T14:09:26+00:00,1.0 1195 | 1193,2015-02-05T14:14:21+00:00,1.0 1196 | 1194,2015-02-05T14:19:12+00:00,1.0 1197 | 1195,2015-02-05T14:24:07+00:00,1.0 1198 | 1196,2015-02-05T14:28:53+00:00,1.0 1199 | 1197,2015-02-05T14:33:51+00:00,1.0 1200 | 1198,2015-02-05T14:38:46+00:00,1.0 1201 | 1199,2015-02-05T14:43:52+00:00,1.0 1202 | 1200,2015-02-05T14:48:45+00:00,1.0 1203 | 1201,2015-02-05T14:53:47+00:00,1.0 1204 | 1202,2015-02-05T14:58:45+00:00,1.0 1205 | 1203,2015-02-05T15:04:00+00:00,1.0 1206 | 1204,2015-02-05T15:08:58+00:00,1.0 1207 | 1205,2015-02-05T15:13:58+00:00,1.0 1208 | 1206,2015-02-05T15:19:01+00:00,1.0 1209 | 1207,2015-02-05T15:23:59+00:00,1.0 1210 | 1208,2015-02-05T15:28:57+00:00,1.0 1211 | 1209,2015-02-05T15:33:57+00:00,1.0 1212 | 1210,2015-02-05T15:38:55+00:00,1.0 1213 | 1211,2015-02-05T15:43:46+00:00,1.0 1214 | 1212,2015-02-05T15:48:53+00:00,1.0 1215 | 1213,2015-02-05T15:53:52+00:00,1.0 1216 | 1214,2015-02-05T15:58:54+00:00,1.0 1217 | 1215,2015-02-05T16:03:58+00:00,1.0 1218 | 1216,2015-02-05T16:09:00+00:00,1.0 1219 | 1217,2015-02-05T16:14:02+00:00,1.0 1220 | 1218,2015-02-05T16:18:59+00:00,1.0 1221 | 1219,2015-02-05T16:23:57+00:00,1.0 1222 | 1220,2015-02-05T16:28:58+00:00,1.0 1223 | 1221,2015-02-05T16:33:57+00:00,1.0 1224 | 1222,2015-02-05T16:38:50+00:00,1.0 1225 | 1223,2015-02-05T16:43:49+00:00,1.0 1226 | 1224,2015-02-05T16:48:50+00:00,1.0 1227 | 1225,2015-02-05T16:53:55+00:00,1.0 1228 | 1226,2015-02-05T16:58:59+00:00,1.0 1229 | 1227,2015-02-05T17:04:00+00:00,1.0 1230 | 1228,2015-02-05T17:09:02+00:00,1.0 1231 | 1229,2015-02-05T17:14:06+00:00,1.0 1232 | 1230,2015-02-05T17:19:04+00:00,1.0 1233 | 1231,2015-02-05T17:24:06+00:00,1.0 1234 | 1232,2015-02-05T17:29:03+00:00,1.0 1235 | 1233,2015-02-05T17:34:01+00:00,1.0 1236 | 1234,2015-02-05T17:38:56+00:00,1.0 1237 | 1235,2015-02-05T17:43:51+00:00,1.0 1238 | 1236,2015-02-05T17:48:47+00:00,1.0 1239 | 1237,2015-02-05T17:54:04+00:00,1.0 1240 | 1238,2015-02-05T17:59:02+00:00,1.0 1241 | 1239,2015-02-05T18:04:02+00:00,1.0 1242 | 1240,2015-02-05T18:09:03+00:00,1.0 1243 | 1241,2015-02-05T18:14:02+00:00,1.0 1244 | 1242,2015-02-05T18:19:02+00:00,1.0 1245 | 1243,2015-02-05T18:24:02+00:00,1.0 1246 | 1244,2015-02-05T18:29:02+00:00,1.0 1247 | 1245,2015-02-05T18:34:06+00:00,1.0 1248 | 1246,2015-02-05T18:39:12+00:00,1.0 1249 | 1247,2015-02-05T18:44:14+00:00,1.0 1250 | 1248,2015-02-05T18:49:21+00:00,1.0 1251 | 1249,2015-02-05T18:54:38+00:00,1.0 1252 | 1250,2015-02-05T18:59:52+00:00,1.0 1253 | 1251,2015-02-05T19:05:03+00:00,1.0 1254 | 1252,2015-02-05T19:10:11+00:00,1.0 1255 | 1253,2015-02-05T19:15:22+00:00,1.0 1256 | 1254,2015-02-05T19:20:28+00:00,1.0 1257 | 1255,2015-02-05T19:25:36+00:00,1.0 1258 | 1256,2015-02-05T19:30:41+00:00,1.0 1259 | 1257,2015-02-05T19:35:51+00:00,1.0 1260 | 1258,2015-02-05T19:41:03+00:00,1.0 1261 | 1259,2015-02-05T19:46:17+00:00,1.0 1262 | 1260,2015-02-05T19:51:31+00:00,1.0 1263 | 1261,2015-02-05T19:56:43+00:00,1.0 1264 | 1262,2015-02-05T20:01:59+00:00,1.0 1265 | 1263,2015-02-05T20:07:06+00:00,1.0 1266 | 1264,2015-02-05T20:12:22+00:00,1.0 1267 | 1265,2015-02-05T20:17:33+00:00,1.0 1268 | 1266,2015-02-05T20:22:40+00:00,1.0 1269 | 1267,2015-02-05T20:27:49+00:00,1.0 1270 | 1268,2015-02-05T20:32:56+00:00,1.0 1271 | 1269,2015-02-05T20:38:07+00:00,1.0 1272 | 1270,2015-02-05T20:43:17+00:00,1.0 1273 | 1271,2015-02-05T20:48:22+00:00,1.0 1274 | 1272,2015-02-05T20:53:28+00:00,1.0 1275 | 1273,2015-02-05T20:58:34+00:00,1.0 1276 | 1274,2015-02-05T21:03:35+00:00,1.0 1277 | 1275,2015-02-05T21:08:44+00:00,1.0 1278 | 1276,2015-02-05T21:14:00+00:00,1.0 1279 | 1277,2015-02-05T21:19:13+00:00,1.0 1280 | 1278,2015-02-05T21:24:23+00:00,1.0 1281 | 1279,2015-02-05T21:29:29+00:00,1.0 1282 | 1280,2015-02-05T21:34:36+00:00,1.0 1283 | 1281,2015-02-05T21:39:47+00:00,1.0 1284 | 1282,2015-02-05T21:44:59+00:00,1.0 1285 | 1283,2015-02-05T21:50:13+00:00,1.0 1286 | 1284,2015-02-05T21:55:23+00:00,1.0 1287 | 1285,2015-02-05T22:00:32+00:00,1.0 1288 | 1286,2015-02-05T22:05:47+00:00,1.0 1289 | 1287,2015-02-05T22:10:57+00:00,1.0 1290 | 1288,2015-02-05T22:16:09+00:00,1.0 1291 | 1289,2015-02-05T22:21:19+00:00,1.0 1292 | 1290,2015-02-05T22:26:34+00:00,1.0 1293 | 1291,2015-02-05T22:31:51+00:00,1.0 1294 | 1292,2015-02-05T22:37:06+00:00,1.0 1295 | 1293,2015-02-05T22:42:17+00:00,1.0 1296 | 1294,2015-02-05T22:47:27+00:00,1.0 1297 | 1295,2015-02-05T22:52:44+00:00,1.0 1298 | 1296,2015-02-05T22:57:51+00:00,1.0 1299 | 1297,2015-02-05T23:03:05+00:00,1.0 1300 | 1298,2015-02-05T23:08:14+00:00,1.0 1301 | 1299,2015-02-05T23:13:25+00:00,1.0 1302 | 1300,2015-02-05T23:18:33+00:00,1.0 1303 | 1301,2015-02-05T23:23:44+00:00,1.0 1304 | 1302,2015-02-05T23:28:51+00:00,1.0 1305 | 1303,2015-02-05T23:33:56+00:00,1.0 1306 | 1304,2015-02-05T23:39:03+00:00,1.0 1307 | 1305,2015-02-05T23:44:14+00:00,1.0 1308 | 1306,2015-02-05T23:49:24+00:00,1.0 1309 | 1307,2015-02-05T23:54:34+00:00,1.0 1310 | 1308,2015-02-05T23:59:48+00:00,1.0 1311 | 1309,2015-02-06T00:04:59+00:00,1.0 1312 | 1310,2015-02-06T00:10:06+00:00,1.0 1313 | 1311,2015-02-06T00:15:10+00:00,1.0 1314 | 1312,2015-02-06T00:20:16+00:00,1.0 1315 | 1313,2015-02-06T00:25:20+00:00,1.0 1316 | 1314,2015-02-06T00:30:25+00:00,1.0 1317 | 1315,2015-02-06T00:35:29+00:00,1.0 1318 | 1316,2015-02-06T00:40:27+00:00,1.0 1319 | 1317,2015-02-06T00:45:29+00:00,1.0 1320 | 1318,2015-02-06T00:50:30+00:00,1.0 1321 | 1319,2015-02-06T00:55:30+00:00,1.0 1322 | 1320,2015-02-06T01:00:35+00:00,1.0 1323 | 1321,2015-02-06T01:05:41+00:00,1.0 1324 | 1322,2015-02-06T01:10:42+00:00,1.0 1325 | 1323,2015-02-06T01:15:44+00:00,1.0 1326 | 1324,2015-02-06T01:20:39+00:00,1.0 1327 | 1325,2015-02-06T01:25:37+00:00,1.0 1328 | 1326,2015-02-06T01:30:35+00:00,1.0 1329 | 1327,2015-02-06T01:35:36+00:00,1.0 1330 | 1328,2015-02-06T01:40:34+00:00,1.0 1331 | 1329,2015-02-06T01:45:32+00:00,1.0 1332 | 1330,2015-02-06T01:50:33+00:00,1.0 1333 | 1331,2015-02-06T01:55:32+00:00,1.0 1334 | 1332,2015-02-06T02:00:32+00:00,1.0 1335 | 1333,2015-02-06T02:05:37+00:00,1.0 1336 | 1334,2015-02-06T02:10:35+00:00,1.0 1337 | 1335,2015-02-06T02:15:34+00:00,1.0 1338 | 1336,2015-02-06T02:20:36+00:00,1.0 1339 | 1337,2015-02-06T02:25:37+00:00,1.0 1340 | 1338,2015-02-06T02:30:34+00:00,1.0 1341 | 1339,2015-02-06T02:35:31+00:00,1.0 1342 | 1340,2015-02-06T02:40:33+00:00,1.0 1343 | 1341,2015-02-06T02:45:56+00:00,1.0 1344 | 1342,2015-02-06T02:51:36+00:00,1.0 1345 | 1343,2015-02-06T02:57:02+00:00,1.0 1346 | 1344,2015-02-06T03:02:36+00:00,1.0 1347 | 1345,2015-02-06T03:08:06+00:00,1.0 1348 | 1346,2015-02-06T03:13:30+00:00,1.0 1349 | 1347,2015-02-06T03:18:57+00:00,1.0 1350 | 1348,2015-02-06T03:24:23+00:00,1.0 1351 | 1349,2015-02-06T03:29:47+00:00,1.0 1352 | 1350,2015-02-06T03:35:11+00:00,1.0 1353 | 1351,2015-02-06T03:40:33+00:00,1.0 1354 | 1352,2015-02-06T03:46:03+00:00,1.0 1355 | 1353,2015-02-06T03:51:26+00:00,1.0 1356 | 1354,2015-02-06T03:56:52+00:00,1.0 1357 | 1355,2015-02-06T04:02:20+00:00,1.0 1358 | 1356,2015-02-06T04:07:44+00:00,1.0 1359 | 1357,2015-02-06T04:13:05+00:00,1.0 1360 | 1358,2015-02-06T04:18:22+00:00,1.0 1361 | 1359,2015-02-06T04:23:55+00:00,1.0 1362 | 1360,2015-02-06T04:29:17+00:00,1.0 1363 | 1361,2015-02-06T04:34:41+00:00,1.0 1364 | 1362,2015-02-06T04:40:02+00:00,1.0 1365 | 1363,2015-02-06T04:45:24+00:00,1.0 1366 | 1364,2015-02-06T04:50:49+00:00,1.0 1367 | 1365,2015-02-06T04:56:15+00:00,1.0 1368 | 1366,2015-02-06T05:01:49+00:00,1.0 1369 | 1367,2015-02-06T05:07:10+00:00,1.0 1370 | 1368,2015-02-06T05:12:35+00:00,1.0 1371 | 1369,2015-02-06T05:17:59+00:00,1.0 1372 | 1370,2015-02-06T05:23:22+00:00,1.0 1373 | 1371,2015-02-06T05:28:46+00:00,1.0 1374 | 1372,2015-02-06T05:34:19+00:00,1.0 1375 | 1373,2015-02-06T05:39:39+00:00,1.0 1376 | 1374,2015-02-06T05:45:09+00:00,1.0 1377 | 1375,2015-02-06T05:50:32+00:00,1.0 1378 | 1376,2015-02-06T05:55:54+00:00,1.0 1379 | 1377,2015-02-06T06:01:22+00:00,1.0 1380 | 1378,2015-02-06T06:06:39+00:00,1.0 1381 | 1379,2015-02-06T06:12:03+00:00,1.0 1382 | 1380,2015-02-06T06:17:20+00:00,1.0 1383 | 1381,2015-02-06T06:22:45+00:00,1.0 1384 | 1382,2015-02-06T06:28:10+00:00,1.0 1385 | 1383,2015-02-06T06:33:31+00:00,1.0 1386 | 1384,2015-02-06T06:38:52+00:00,1.0 1387 | 1385,2015-02-06T06:44:20+00:00,1.0 1388 | 1386,2015-02-06T06:49:47+00:00,1.0 1389 | 1387,2015-02-06T06:55:09+00:00,1.0 1390 | 1388,2015-02-06T07:00:33+00:00,1.0 1391 | 1389,2015-02-06T07:05:55+00:00,1.0 1392 | 1390,2015-02-06T07:11:16+00:00,1.0 1393 | 1391,2015-02-06T07:16:48+00:00,1.0 1394 | 1392,2015-02-06T07:22:21+00:00,1.0 1395 | 1393,2015-02-06T07:28:00+00:00,1.0 1396 | 1394,2015-02-06T07:33:40+00:00,1.0 1397 | 1395,2015-02-06T07:39:27+00:00,1.0 1398 | 1396,2015-02-06T07:45:02+00:00,1.0 1399 | 1397,2015-02-06T07:50:36+00:00,1.0 1400 | 1398,2015-02-06T07:56:00+00:00,1.0 1401 | 1399,2015-02-06T08:01:24+00:00,1.0 1402 | 1400,2015-02-06T08:06:47+00:00,1.0 1403 | 1401,2015-02-06T08:12:10+00:00,1.0 1404 | 1402,2015-02-06T08:17:35+00:00,1.0 1405 | 1403,2015-02-06T08:23:08+00:00,1.0 1406 | 1404,2015-02-06T08:28:30+00:00,1.0 1407 | 1405,2015-02-06T08:33:53+00:00,1.0 1408 | 1406,2015-02-06T08:39:16+00:00,1.0 1409 | 1407,2015-02-06T08:44:43+00:00,1.0 1410 | 1408,2015-02-06T08:50:03+00:00,1.0 1411 | 1409,2015-02-06T08:55:29+00:00,1.0 1412 | 1410,2015-02-06T09:00:55+00:00,1.0 1413 | 1411,2015-02-06T09:06:31+00:00,1.0 1414 | 1412,2015-02-06T09:11:50+00:00,1.0 1415 | 1413,2015-02-06T09:17:12+00:00,1.0 1416 | 1414,2015-02-06T09:22:36+00:00,1.0 1417 | 1415,2015-02-06T09:28:00+00:00,1.0 1418 | 1416,2015-02-06T09:33:23+00:00,1.0 1419 | 1417,2015-02-06T09:38:47+00:00,1.0 1420 | 1418,2015-02-06T09:44:11+00:00,1.0 1421 | 1419,2015-02-06T09:49:35+00:00,1.0 1422 | 1420,2015-02-06T09:54:58+00:00,1.0 1423 | 1421,2015-02-06T10:00:21+00:00,1.0 1424 | 1422,2015-02-06T10:05:45+00:00,1.0 1425 | 1423,2015-02-06T10:11:12+00:00,1.0 1426 | 1424,2015-02-06T10:16:27+00:00,1.0 1427 | 1425,2015-02-06T10:21:51+00:00,1.0 1428 | 1426,2015-02-06T10:27:08+00:00,1.0 1429 | 1427,2015-02-06T10:32:29+00:00,1.0 1430 | 1428,2015-02-06T10:37:57+00:00,1.0 1431 | 1429,2015-02-06T10:43:22+00:00,1.0 1432 | 1430,2015-02-06T10:48:47+00:00,1.0 1433 | 1431,2015-02-06T10:54:14+00:00,1.0 1434 | 1432,2015-02-06T10:59:27+00:00,1.0 1435 | 1433,2015-02-06T11:04:59+00:00,1.0 1436 | 1434,2015-02-06T11:10:29+00:00,1.0 1437 | 1435,2015-02-06T11:15:48+00:00,1.0 1438 | 1436,2015-02-06T11:21:06+00:00,1.0 1439 | 1437,2015-02-06T11:26:29+00:00,1.0 1440 | 1438,2015-02-06T11:31:57+00:00,1.0 1441 | 1439,2015-02-06T11:37:23+00:00,1.0 1442 | 1440,2015-02-06T11:42:38+00:00,1.0 1443 | 1441,2015-02-06T11:48:02+00:00,1.0 1444 | 1442,2015-02-06T11:53:24+00:00,1.0 1445 | 1443,2015-02-06T11:58:50+00:00,1.0 1446 | 1444,2015-02-06T12:04:09+00:00,1.0 1447 | 1445,2015-02-06T12:09:32+00:00,1.0 1448 | 1446,2015-02-06T12:14:57+00:00,1.0 1449 | 1447,2015-02-06T12:20:20+00:00,1.0 1450 | 1448,2015-02-06T12:25:46+00:00,1.0 1451 | 1449,2015-02-06T12:31:17+00:00,1.0 1452 | 1450,2015-02-06T12:36:38+00:00,1.0 1453 | 1451,2015-02-06T12:42:00+00:00,1.0 1454 | 1452,2015-02-06T12:47:23+00:00,1.0 1455 | 1453,2015-02-06T12:52:43+00:00,1.0 1456 | 1454,2015-02-06T12:58:04+00:00,1.0 1457 | 1455,2015-02-06T13:03:28+00:00,1.0 1458 | 1456,2015-02-06T13:08:48+00:00,1.0 1459 | 1457,2015-02-06T13:13:59+00:00,1.0 1460 | 1458,2015-02-06T13:19:28+00:00,1.0 1461 | 1459,2015-02-06T13:24:50+00:00,1.0 1462 | 1460,2015-02-06T13:30:20+00:00,1.0 1463 | 1461,2015-02-06T13:35:48+00:00,1.0 1464 | 1462,2015-02-06T13:41:10+00:00,1.0 1465 | 1463,2015-02-06T13:46:31+00:00,1.0 1466 | 1464,2015-02-06T13:51:56+00:00,1.0 1467 | 1465,2015-02-06T13:57:27+00:00,1.0 1468 | 1466,2015-02-06T14:02:57+00:00,1.0 1469 | 1467,2015-02-06T14:08:16+00:00,1.0 1470 | 1468,2015-02-06T14:13:36+00:00,1.0 1471 | 1469,2015-02-06T14:18:57+00:00,1.0 1472 | 1470,2015-02-06T14:24:22+00:00,1.0 1473 | 1471,2015-02-06T14:29:46+00:00,1.0 1474 | 1472,2015-02-06T14:35:19+00:00,1.0 1475 | 1473,2015-02-06T14:40:40+00:00,1.0 1476 | 1474,2015-02-06T14:45:57+00:00,1.0 1477 | 1475,2015-02-06T14:51:17+00:00,1.0 1478 | 1476,2015-02-06T14:56:31+00:00,1.0 1479 | 1477,2015-02-06T15:01:59+00:00,1.0 1480 | 1478,2015-02-06T15:07:28+00:00,1.0 1481 | 1479,2015-02-06T15:12:53+00:00,1.0 1482 | 1480,2015-02-06T15:18:14+00:00,1.0 1483 | 1481,2015-02-06T15:23:45+00:00,1.0 1484 | 1482,2015-02-06T15:29:06+00:00,1.0 1485 | 1483,2015-02-06T15:34:25+00:00,1.0 1486 | 1484,2015-02-06T15:39:47+00:00,1.0 1487 | 1485,2015-02-06T15:45:12+00:00,1.0 1488 | 1486,2015-02-06T15:50:42+00:00,1.0 1489 | 1487,2015-02-06T15:56:01+00:00,1.0 1490 | 1488,2015-02-06T16:01:18+00:00,1.0 1491 | 1489,2015-02-06T16:06:38+00:00,1.0 1492 | 1490,2015-02-06T16:12:05+00:00,1.0 1493 | 1491,2015-02-06T16:17:36+00:00,1.0 1494 | 1492,2015-02-06T16:23:01+00:00,1.0 1495 | 1493,2015-02-06T16:28:23+00:00,1.0 1496 | 1494,2015-02-06T16:33:39+00:00,1.0 1497 | 1495,2015-02-06T16:39:00+00:00,1.0 1498 | 1496,2015-02-06T16:44:33+00:00,1.0 1499 | 1497,2015-02-06T16:49:58+00:00,1.0 1500 | 1498,2015-02-06T16:55:15+00:00,1.0 1501 | 1499,2015-02-06T17:00:40+00:00,1.0 1502 | 1500,2015-02-06T17:06:16+00:00,1.0 1503 | 1501,2015-02-06T17:11:39+00:00,1.0 1504 | 1502,2015-02-06T17:17:07+00:00,1.0 1505 | 1503,2015-02-06T17:22:32+00:00,1.0 1506 | 1504,2015-02-06T17:27:58+00:00,1.0 1507 | 1505,2015-02-06T17:33:21+00:00,1.0 1508 | 1506,2015-02-06T17:38:40+00:00,1.0 1509 | 1507,2015-02-06T17:44:09+00:00,1.0 1510 | 1508,2015-02-06T17:49:35+00:00,1.0 1511 | 1509,2015-02-06T17:54:56+00:00,1.0 1512 | 1510,2015-02-06T18:00:20+00:00,1.0 1513 | 1511,2015-02-06T18:05:41+00:00,1.0 1514 | 1512,2015-02-06T18:11:01+00:00,1.0 1515 | 1513,2015-02-06T18:16:22+00:00,1.0 1516 | 1514,2015-02-06T18:21:50+00:00,1.0 1517 | 1515,2015-02-06T18:27:15+00:00,1.0 1518 | 1516,2015-02-06T18:32:40+00:00,1.0 1519 | 1517,2015-02-06T18:38:15+00:00,1.0 1520 | 1518,2015-02-06T18:43:39+00:00,1.0 1521 | 1519,2015-02-06T18:49:13+00:00,1.0 1522 | 1520,2015-02-06T18:54:32+00:00,1.0 1523 | 1521,2015-02-06T18:59:56+00:00,1.0 1524 | 1522,2015-02-06T19:05:22+00:00,1.0 1525 | 1523,2015-02-06T19:10:50+00:00,1.0 1526 | 1524,2015-02-06T19:16:13+00:00,1.0 1527 | 1525,2015-02-06T19:21:42+00:00,1.0 1528 | 1526,2015-02-06T19:27:06+00:00,1.0 1529 | 1527,2015-02-06T19:32:32+00:00,1.0 1530 | 1528,2015-02-06T19:37:54+00:00,1.0 1531 | 1529,2015-02-06T19:43:17+00:00,1.0 1532 | 1530,2015-02-06T19:48:36+00:00,1.0 1533 | 1531,2015-02-06T19:54:07+00:00,1.0 1534 | 1532,2015-02-06T19:59:31+00:00,1.0 1535 | 1533,2015-02-06T20:05:03+00:00,1.0 1536 | 1534,2015-02-06T20:10:23+00:00,1.0 1537 | 1535,2015-02-06T20:15:47+00:00,1.0 1538 | 1536,2015-02-06T20:21:14+00:00,1.0 1539 | 1537,2015-02-06T20:26:47+00:00,1.0 1540 | 1538,2015-02-06T20:32:13+00:00,1.0 1541 | 1539,2015-02-06T20:37:32+00:00,1.0 1542 | 1540,2015-02-06T20:42:57+00:00,1.0 1543 | 1541,2015-02-06T20:48:18+00:00,1.0 1544 | 1542,2015-02-06T20:53:40+00:00,1.0 1545 | 1543,2015-02-06T20:59:10+00:00,1.0 1546 | 1544,2015-02-06T21:04:42+00:00,1.0 1547 | 1545,2015-02-06T21:10:04+00:00,1.0 1548 | 1546,2015-02-06T21:15:35+00:00,1.0 1549 | 1547,2015-02-06T21:20:56+00:00,1.0 1550 | 1548,2015-02-06T21:26:17+00:00,1.0 1551 | 1549,2015-02-06T21:31:46+00:00,1.0 1552 | 1550,2015-02-06T21:37:10+00:00,1.0 1553 | 1551,2015-02-06T21:42:28+00:00,1.0 1554 | 1552,2015-02-06T21:47:56+00:00,1.0 1555 | 1553,2015-02-06T21:53:28+00:00,1.0 1556 | 1554,2015-02-06T21:58:48+00:00,1.0 1557 | 1555,2015-02-06T22:04:18+00:00,1.0 1558 | 1556,2015-02-06T22:09:43+00:00,1.0 1559 | 1557,2015-02-06T22:15:10+00:00,1.0 1560 | 1558,2015-02-06T22:20:41+00:00,1.0 1561 | 1559,2015-02-06T22:26:10+00:00,1.0 1562 | 1560,2015-02-06T22:31:36+00:00,1.0 1563 | 1561,2015-02-06T22:37:01+00:00,1.0 1564 | 1562,2015-02-06T22:42:34+00:00,1.0 1565 | 1563,2015-02-06T22:48:05+00:00,1.0 1566 | 1564,2015-02-06T22:53:35+00:00,1.0 1567 | 1565,2015-02-06T22:59:09+00:00,1.0 1568 | 1566,2015-02-06T23:04:44+00:00,1.0 1569 | 1567,2015-02-06T23:10:17+00:00,1.0 1570 | 1568,2015-02-06T23:15:47+00:00,1.0 1571 | 1569,2015-02-06T23:21:35+00:00,1.0 1572 | 1570,2015-02-06T23:27:16+00:00,1.0 1573 | 1571,2015-02-06T23:32:49+00:00,1.0 1574 | 1572,2015-02-06T23:38:26+00:00,1.0 1575 | 1573,2015-02-06T23:44:01+00:00,1.0 1576 | 1574,2015-02-06T23:49:58+00:00,1.0 1577 | 1575,2015-02-06T23:55:34+00:00,1.0 1578 | 1576,2015-02-07T00:01:29+00:00,1.0 1579 | 1577,2015-02-07T00:07:13+00:00,1.0 1580 | 1578,2015-02-07T00:12:49+00:00,1.0 1581 | 1579,2015-02-07T00:18:36+00:00,1.0 1582 | 1580,2015-02-07T00:24:21+00:00,1.0 1583 | 1581,2015-02-07T00:30:14+00:00,1.0 1584 | 1582,2015-02-07T00:35:47+00:00,1.0 1585 | 1583,2015-02-07T00:41:27+00:00,1.0 1586 | 1584,2015-02-07T00:47:15+00:00,1.0 1587 | 1585,2015-02-07T00:52:57+00:00,1.0 1588 | 1586,2015-02-07T00:58:55+00:00,1.0 1589 | 1587,2015-02-07T01:04:34+00:00,1.0 1590 | 1588,2015-02-07T01:10:09+00:00,1.0 1591 | 1589,2015-02-07T01:15:45+00:00,1.0 1592 | 1590,2015-02-07T01:21:32+00:00,1.0 1593 | 1591,2015-02-07T01:27:16+00:00,1.0 1594 | 1592,2015-02-07T01:32:55+00:00,1.0 1595 | 1593,2015-02-07T01:38:30+00:00,1.0 1596 | 1594,2015-02-07T01:44:02+00:00,1.0 1597 | 1595,2015-02-07T01:49:35+00:00,1.0 1598 | 1596,2015-02-07T01:55:11+00:00,1.0 1599 | 1597,2015-02-07T02:00:47+00:00,1.0 1600 | 1598,2015-02-07T02:06:22+00:00,1.0 1601 | 1599,2015-02-07T02:11:46+00:00,1.0 1602 | 1600,2015-02-07T02:17:14+00:00,1.0 1603 | 1601,2015-02-07T02:22:39+00:00,1.0 1604 | 1602,2015-02-07T02:28:05+00:00,1.0 1605 | 1603,2015-02-07T02:33:46+00:00,1.0 1606 | 1604,2015-02-07T02:39:21+00:00,1.0 1607 | 1605,2015-02-07T02:44:51+00:00,1.0 1608 | 1606,2015-02-07T02:50:15+00:00,1.0 1609 | 1607,2015-02-07T02:55:37+00:00,1.0 1610 | 1608,2015-02-07T03:01:08+00:00,1.0 1611 | 1609,2015-02-07T03:06:37+00:00,1.0 1612 | 1610,2015-02-07T03:12:02+00:00,1.0 1613 | 1611,2015-02-07T03:17:17+00:00,1.0 1614 | 1612,2015-02-07T03:22:41+00:00,1.0 1615 | 1613,2015-02-07T03:27:54+00:00,1.0 1616 | 1614,2015-02-07T03:33:15+00:00,1.0 1617 | 1615,2015-02-07T03:38:46+00:00,1.0 1618 | 1616,2015-02-07T03:44:13+00:00,1.0 1619 | 1617,2015-02-07T03:49:37+00:00,1.0 1620 | 1618,2015-02-07T03:55:03+00:00,1.0 1621 | 1619,2015-02-07T04:00:22+00:00,1.0 1622 | 1620,2015-02-07T04:05:45+00:00,1.0 1623 | 1621,2015-02-07T04:11:13+00:00,1.0 1624 | 1622,2015-02-07T04:16:40+00:00,1.0 1625 | 1623,2015-02-07T04:22:23+00:00,1.0 1626 | 1624,2015-02-07T04:28:02+00:00,1.0 1627 | 1625,2015-02-07T04:33:30+00:00,1.0 1628 | 1626,2015-02-07T04:38:55+00:00,1.0 1629 | 1627,2015-02-07T04:44:20+00:00,1.0 1630 | 1628,2015-02-07T04:50:09+00:00,1.0 1631 | 1629,2015-02-07T04:55:49+00:00,1.0 1632 | 1630,2015-02-07T05:01:19+00:00,1.0 1633 | 1631,2015-02-07T05:07:09+00:00,1.0 1634 | 1632,2015-02-07T05:12:42+00:00,1.0 1635 | 1633,2015-02-07T05:18:18+00:00,1.0 1636 | 1634,2015-02-07T05:23:41+00:00,1.0 1637 | 1635,2015-02-07T05:29:17+00:00,1.0 1638 | 1636,2015-02-07T05:34:45+00:00,1.0 1639 | 1637,2015-02-07T05:40:12+00:00,1.0 1640 | 1638,2015-02-07T05:45:39+00:00,1.0 1641 | 1639,2015-02-07T05:51:21+00:00,1.0 1642 | 1640,2015-02-07T05:56:50+00:00,1.0 1643 | 1641,2015-02-07T06:02:11+00:00,1.0 1644 | 1642,2015-02-07T06:07:29+00:00,1.0 1645 | 1643,2015-02-07T06:12:58+00:00,1.0 1646 | 1644,2015-02-07T06:18:18+00:00,1.0 1647 | 1645,2015-02-07T06:23:51+00:00,1.0 1648 | 1646,2015-02-07T06:29:29+00:00,1.0 1649 | 1647,2015-02-07T06:35:07+00:00,1.0 1650 | 1648,2015-02-07T06:40:38+00:00,1.0 1651 | 1649,2015-02-07T06:46:17+00:00,1.0 1652 | 1650,2015-02-07T06:51:46+00:00,1.0 1653 | 1651,2015-02-07T06:57:08+00:00,1.0 1654 | 1652,2015-02-07T07:02:33+00:00,1.0 1655 | 1653,2015-02-07T07:07:56+00:00,1.0 1656 | 1654,2015-02-07T07:13:13+00:00,1.0 1657 | 1655,2015-02-07T07:18:48+00:00,1.0 1658 | 1656,2015-02-07T07:24:23+00:00,1.0 1659 | 1657,2015-02-07T07:30:03+00:00,1.0 1660 | 1658,2015-02-07T07:35:41+00:00,1.0 1661 | 1659,2015-02-07T07:41:15+00:00,1.0 1662 | 1660,2015-02-07T07:46:52+00:00,1.0 1663 | 1661,2015-02-07T07:52:23+00:00,1.0 1664 | 1662,2015-02-07T07:57:48+00:00,1.0 1665 | 1663,2015-02-07T08:03:22+00:00,1.0 1666 | 1664,2015-02-07T08:08:42+00:00,1.0 1667 | 1665,2015-02-07T08:14:13+00:00,1.0 1668 | 1666,2015-02-07T08:19:40+00:00,1.0 1669 | 1667,2015-02-07T08:25:01+00:00,1.0 1670 | 1668,2015-02-07T08:30:26+00:00,1.0 1671 | 1669,2015-02-07T08:35:57+00:00,1.0 1672 | 1670,2015-02-07T08:41:14+00:00,1.0 1673 | 1671,2015-02-07T08:46:23+00:00,1.0 1674 | 1672,2015-02-07T08:51:44+00:00,1.0 1675 | 1673,2015-02-07T08:57:00+00:00,1.0 1676 | 1674,2015-02-07T09:02:24+00:00,1.0 1677 | 1675,2015-02-07T09:07:52+00:00,1.0 1678 | 1676,2015-02-07T09:13:11+00:00,1.0 1679 | 1677,2015-02-07T09:18:33+00:00,1.0 1680 | 1678,2015-02-07T09:23:58+00:00,1.0 1681 | 1679,2015-02-07T09:29:21+00:00,1.0 1682 | 1680,2015-02-07T09:34:45+00:00,1.0 1683 | 1681,2015-02-07T09:40:14+00:00,1.0 1684 | 1682,2015-02-07T09:45:33+00:00,1.0 1685 | 1683,2015-02-07T09:50:55+00:00,1.0 1686 | 1684,2015-02-07T09:56:15+00:00,1.0 1687 | 1685,2015-02-07T10:01:32+00:00,1.0 1688 | 1686,2015-02-07T10:06:50+00:00,1.0 1689 | 1687,2015-02-07T10:12:14+00:00,1.0 1690 | 1688,2015-02-07T10:17:31+00:00,1.0 1691 | 1689,2015-02-07T10:22:58+00:00,1.0 1692 | 1690,2015-02-07T10:28:17+00:00,1.0 1693 | 1691,2015-02-07T10:33:37+00:00,1.0 1694 | 1692,2015-02-07T10:39:04+00:00,1.0 1695 | 1693,2015-02-07T10:44:33+00:00,1.0 1696 | 1694,2015-02-07T10:50:00+00:00,1.0 1697 | 1695,2015-02-07T10:55:05+00:00,1.0 1698 | 1696,2015-02-07T11:00:33+00:00,1.0 1699 | 1697,2015-02-07T11:05:57+00:00,1.0 1700 | 1698,2015-02-07T11:11:17+00:00,1.0 1701 | 1699,2015-02-07T11:16:40+00:00,1.0 1702 | 1700,2015-02-07T11:21:57+00:00,1.0 1703 | 1701,2015-02-07T11:27:22+00:00,1.0 1704 | 1702,2015-02-07T11:32:36+00:00,1.0 1705 | 1703,2015-02-07T11:37:53+00:00,1.0 1706 | 1704,2015-02-07T11:43:13+00:00,1.0 1707 | 1705,2015-02-07T11:48:37+00:00,1.0 1708 | 1706,2015-02-07T11:54:03+00:00,1.0 1709 | 1707,2015-02-07T11:59:22+00:00,1.0 1710 | 1708,2015-02-07T12:04:42+00:00,1.0 1711 | 1709,2015-02-07T12:10:01+00:00,1.0 1712 | 1710,2015-02-07T12:15:18+00:00,1.0 1713 | 1711,2015-02-07T12:20:36+00:00,1.0 1714 | 1712,2015-02-07T12:25:53+00:00,1.0 1715 | 1713,2015-02-07T12:31:16+00:00,1.0 1716 | 1714,2015-02-07T12:36:36+00:00,1.0 1717 | 1715,2015-02-07T12:41:58+00:00,1.0 1718 | 1716,2015-02-07T12:47:08+00:00,1.0 1719 | 1717,2015-02-07T12:52:27+00:00,1.0 1720 | 1718,2015-02-07T12:57:39+00:00,1.0 1721 | 1719,2015-02-07T13:03:03+00:00,1.0 1722 | 1720,2015-02-07T13:09:07+00:00,1.0 1723 | 1721,2015-02-07T13:14:38+00:00,1.0 1724 | 1722,2015-02-07T13:19:56+00:00,1.0 1725 | 1723,2015-02-07T13:25:15+00:00,1.0 1726 | 1724,2015-02-07T13:30:31+00:00,1.0 1727 | 1725,2015-02-07T13:35:43+00:00,1.0 1728 | 1726,2015-02-07T13:41:01+00:00,1.0 1729 | 1727,2015-02-07T13:46:28+00:00,1.0 1730 | 1728,2015-02-07T13:51:53+00:00,1.0 1731 | 1729,2015-02-07T13:57:10+00:00,1.0 1732 | 1730,2015-02-07T14:02:39+00:00,1.0 1733 | 1731,2015-02-07T14:08:05+00:00,1.0 1734 | 1732,2015-02-07T14:13:25+00:00,1.0 1735 | 1733,2015-02-07T14:18:54+00:00,1.0 1736 | 1734,2015-02-07T14:24:09+00:00,1.0 1737 | 1735,2015-02-07T14:29:40+00:00,1.0 1738 | 1736,2015-02-07T14:35:05+00:00,1.0 1739 | 1737,2015-02-07T14:40:17+00:00,1.0 1740 | 1738,2015-02-07T14:45:38+00:00,1.0 1741 | 1739,2015-02-07T14:50:52+00:00,1.0 1742 | 1740,2015-02-07T14:56:06+00:00,1.0 1743 | 1741,2015-02-07T15:01:24+00:00,1.0 1744 | 1742,2015-02-07T15:06:52+00:00,1.0 1745 | 1743,2015-02-07T15:12:08+00:00,1.0 1746 | 1744,2015-02-07T15:17:29+00:00,1.0 1747 | 1745,2015-02-07T15:22:55+00:00,1.0 1748 | 1746,2015-02-07T15:28:10+00:00,1.0 1749 | 1747,2015-02-07T15:33:35+00:00,1.0 1750 | 1748,2015-02-07T15:38:50+00:00,1.0 1751 | 1749,2015-02-07T15:44:13+00:00,1.0 1752 | 1750,2015-02-07T15:49:33+00:00,1.0 1753 | 1751,2015-02-07T15:55:01+00:00,1.0 1754 | 1752,2015-02-07T16:00:27+00:00,1.0 1755 | 1753,2015-02-07T16:05:48+00:00,1.0 1756 | 1754,2015-02-07T16:11:01+00:00,1.0 1757 | 1755,2015-02-07T16:16:17+00:00,1.0 1758 | 1756,2015-02-07T16:21:36+00:00,1.0 1759 | 1757,2015-02-07T16:27:03+00:00,1.0 1760 | 1758,2015-02-07T16:32:17+00:00,1.0 1761 | 1759,2015-02-07T16:37:46+00:00,1.0 1762 | 1760,2015-02-07T16:42:59+00:00,1.0 1763 | 1761,2015-02-07T16:48:12+00:00,1.0 1764 | 1762,2015-02-07T16:53:29+00:00,1.0 1765 | 1763,2015-02-07T16:58:45+00:00,1.0 1766 | 1764,2015-02-07T17:04:11+00:00,1.0 1767 | 1765,2015-02-07T17:09:27+00:00,1.0 1768 | 1766,2015-02-07T17:14:53+00:00,1.0 1769 | 1767,2015-02-07T17:20:13+00:00,1.0 1770 | 1768,2015-02-07T17:25:27+00:00,1.0 1771 | 1769,2015-02-07T17:30:44+00:00,1.0 1772 | 1770,2015-02-07T17:36:02+00:00,1.0 1773 | 1771,2015-02-07T17:41:16+00:00,1.0 1774 | 1772,2015-02-07T17:46:32+00:00,1.0 1775 | 1773,2015-02-07T17:51:55+00:00,1.0 1776 | 1774,2015-02-07T17:57:14+00:00,1.0 1777 | 1775,2015-02-07T18:02:44+00:00,1.0 1778 | 1776,2015-02-07T18:08:08+00:00,1.0 1779 | 1777,2015-02-07T18:13:32+00:00,1.0 1780 | 1778,2015-02-07T18:18:50+00:00,1.0 1781 | 1779,2015-02-07T18:24:14+00:00,1.0 1782 | 1780,2015-02-07T18:29:33+00:00,1.0 1783 | 1781,2015-02-07T18:35:02+00:00,1.0 1784 | 1782,2015-02-07T18:40:19+00:00,1.0 1785 | 1783,2015-02-07T18:45:39+00:00,1.0 1786 | 1784,2015-02-07T18:51:05+00:00,1.0 1787 | 1785,2015-02-07T18:56:25+00:00,1.0 1788 | 1786,2015-02-07T19:01:46+00:00,1.0 1789 | 1787,2015-02-07T19:07:12+00:00,1.0 1790 | 1788,2015-02-07T19:12:39+00:00,1.0 1791 | 1789,2015-02-07T19:17:58+00:00,1.0 1792 | 1790,2015-02-07T19:23:16+00:00,1.0 1793 | 1791,2015-02-07T19:28:38+00:00,1.0 1794 | 1792,2015-02-07T19:33:55+00:00,1.0 1795 | 1793,2015-02-07T19:39:28+00:00,1.0 1796 | 1794,2015-02-07T19:44:44+00:00,1.0 1797 | 1795,2015-02-07T19:50:13+00:00,1.0 1798 | 1796,2015-02-07T19:55:36+00:00,1.0 1799 | 1797,2015-02-07T20:01:00+00:00,1.0 1800 | 1798,2015-02-07T20:06:29+00:00,1.0 1801 | 1799,2015-02-07T20:11:51+00:00,1.0 1802 | 1800,2015-02-07T20:17:17+00:00,1.0 1803 | 1801,2015-02-07T20:22:48+00:00,1.0 1804 | 1802,2015-02-07T20:28:10+00:00,1.0 1805 | 1803,2015-02-07T20:33:32+00:00,1.0 1806 | 1804,2015-02-07T20:38:49+00:00,1.0 1807 | 1805,2015-02-07T20:44:22+00:00,1.0 1808 | 1806,2015-02-07T20:49:45+00:00,1.0 1809 | 1807,2015-02-07T20:55:13+00:00,1.0 1810 | 1808,2015-02-07T21:00:32+00:00,1.0 1811 | 1809,2015-02-07T21:05:56+00:00,1.0 1812 | 1810,2015-02-07T21:11:33+00:00,1.0 1813 | 1811,2015-02-07T21:17:04+00:00,1.0 1814 | 1812,2015-02-07T21:22:34+00:00,1.0 1815 | 1813,2015-02-07T21:28:02+00:00,1.0 1816 | 1814,2015-02-07T21:33:29+00:00,1.0 1817 | 1815,2015-02-07T21:38:51+00:00,1.0 1818 | 1816,2015-02-07T21:44:20+00:00,1.0 1819 | 1817,2015-02-07T21:49:51+00:00,1.0 1820 | 1818,2015-02-07T21:55:16+00:00,1.0 1821 | 1819,2015-02-07T22:00:40+00:00,1.0 1822 | 1820,2015-02-07T22:06:02+00:00,1.0 1823 | 1821,2015-02-07T22:11:29+00:00,1.0 1824 | 1822,2015-02-07T22:16:55+00:00,1.0 1825 | 1823,2015-02-07T22:22:22+00:00,1.0 1826 | 1824,2015-02-07T22:27:44+00:00,1.0 1827 | 1825,2015-02-07T22:33:27+00:00,1.0 1828 | 1826,2015-02-07T22:38:59+00:00,1.0 1829 | 1827,2015-02-07T22:44:31+00:00,1.0 1830 | 1828,2015-02-07T22:49:59+00:00,1.0 1831 | 1829,2015-02-07T22:55:23+00:00,1.0 1832 | 1830,2015-02-07T23:00:50+00:00,1.0 1833 | 1831,2015-02-07T23:06:27+00:00,1.0 1834 | 1832,2015-02-07T23:11:56+00:00,1.0 1835 | 1833,2015-02-07T23:17:31+00:00,1.0 1836 | 1834,2015-02-07T23:23:14+00:00,1.0 1837 | 1835,2015-02-07T23:28:51+00:00,1.0 1838 | 1836,2015-02-07T23:34:22+00:00,1.0 1839 | 1837,2015-02-07T23:40:05+00:00,1.0 1840 | 1838,2015-02-07T23:45:36+00:00,1.0 1841 | 1839,2015-02-07T23:51:15+00:00,1.0 1842 | 1840,2015-02-07T23:56:47+00:00,1.0 1843 | 1841,2015-02-08T00:02:20+00:00,1.0 1844 | 1842,2015-02-08T00:07:53+00:00,1.0 1845 | 1843,2015-02-08T00:13:28+00:00,1.0 1846 | 1844,2015-02-08T00:19:00+00:00,1.0 1847 | 1845,2015-02-08T00:24:41+00:00,1.0 1848 | 1846,2015-02-08T00:30:15+00:00,1.0 1849 | 1847,2015-02-08T00:35:52+00:00,1.0 1850 | 1848,2015-02-08T00:41:29+00:00,1.0 1851 | 1849,2015-02-08T00:47:05+00:00,1.0 1852 | 1850,2015-02-08T00:52:39+00:00,1.0 1853 | 1851,2015-02-08T00:58:14+00:00,1.0 1854 | 1852,2015-02-08T01:04:00+00:00,1.0 1855 | 1853,2015-02-08T01:09:46+00:00,1.0 1856 | 1854,2015-02-08T01:15:24+00:00,1.0 1857 | 1855,2015-02-08T01:21:00+00:00,1.0 1858 | 1856,2015-02-08T01:26:30+00:00,1.0 1859 | 1857,2015-02-08T01:32:08+00:00,1.0 1860 | 1858,2015-02-08T01:37:37+00:00,1.0 1861 | 1859,2015-02-08T01:43:19+00:00,1.0 1862 | 1860,2015-02-08T01:48:53+00:00,1.0 1863 | 1861,2015-02-08T01:54:33+00:00,1.0 1864 | 1862,2015-02-08T02:00:11+00:00,1.0 1865 | 1863,2015-02-08T02:05:50+00:00,1.0 1866 | 1864,2015-02-08T02:11:31+00:00,1.0 1867 | 1865,2015-02-08T02:17:12+00:00,1.0 1868 | 1866,2015-02-08T02:22:50+00:00,1.0 1869 | 1867,2015-02-08T02:28:22+00:00,1.0 1870 | 1868,2015-02-08T02:33:58+00:00,1.0 1871 | 1869,2015-02-08T02:39:26+00:00,1.0 1872 | 1870,2015-02-08T02:45:02+00:00,1.0 1873 | 1871,2015-02-08T02:50:35+00:00,1.0 1874 | 1872,2015-02-08T02:56:10+00:00,1.0 1875 | 1873,2015-02-08T03:01:48+00:00,1.0 1876 | 1874,2015-02-08T03:07:14+00:00,1.0 1877 | 1875,2015-02-08T03:12:47+00:00,1.0 1878 | 1876,2015-02-08T03:18:23+00:00,1.0 1879 | 1877,2015-02-08T03:23:58+00:00,1.0 1880 | 1878,2015-02-08T03:29:42+00:00,1.0 1881 | 1879,2015-02-08T03:35:24+00:00,1.0 1882 | 1880,2015-02-08T03:41:04+00:00,1.0 1883 | 1881,2015-02-08T03:46:39+00:00,1.0 1884 | 1882,2015-02-08T03:52:22+00:00,1.0 1885 | 1883,2015-02-08T03:57:55+00:00,1.0 1886 | 1884,2015-02-08T04:03:22+00:00,1.0 1887 | 1885,2015-02-08T04:09:02+00:00,1.0 1888 | 1886,2015-02-08T04:14:37+00:00,1.0 1889 | 1887,2015-02-08T04:20:22+00:00,1.0 1890 | 1888,2015-02-08T04:25:55+00:00,1.0 1891 | 1889,2015-02-08T04:31:32+00:00,1.0 1892 | 1890,2015-02-08T04:36:55+00:00,1.0 1893 | 1891,2015-02-08T04:42:13+00:00,1.0 1894 | 1892,2015-02-08T04:47:33+00:00,1.0 1895 | 1893,2015-02-08T04:52:59+00:00,1.0 1896 | 1894,2015-02-08T04:58:30+00:00,1.0 1897 | 1895,2015-02-08T05:04:02+00:00,1.0 1898 | 1896,2015-02-08T05:09:41+00:00,1.0 1899 | 1897,2015-02-08T05:15:09+00:00,1.0 1900 | 1898,2015-02-08T05:20:46+00:00,1.0 1901 | 1899,2015-02-08T05:26:17+00:00,1.0 1902 | 1900,2015-02-08T05:31:41+00:00,1.0 1903 | 1901,2015-02-08T05:37:05+00:00,1.0 1904 | 1902,2015-02-08T05:42:27+00:00,1.0 1905 | 1903,2015-02-08T05:47:54+00:00,1.0 1906 | 1904,2015-02-08T05:53:23+00:00,1.0 1907 | 1905,2015-02-08T05:58:44+00:00,1.0 1908 | 1906,2015-02-08T06:04:09+00:00,1.0 1909 | 1907,2015-02-08T06:09:32+00:00,1.0 1910 | 1908,2015-02-08T06:15:05+00:00,1.0 1911 | 1909,2015-02-08T06:20:28+00:00,1.0 1912 | 1910,2015-02-08T06:25:52+00:00,1.0 1913 | 1911,2015-02-08T06:31:16+00:00,1.0 1914 | 1912,2015-02-08T06:36:45+00:00,1.0 1915 | 1913,2015-02-08T06:42:07+00:00,1.0 1916 | 1914,2015-02-08T06:47:30+00:00,1.0 1917 | 1915,2015-02-08T06:52:46+00:00,1.0 1918 | 1916,2015-02-08T06:58:10+00:00,1.0 1919 | 1917,2015-02-08T07:03:39+00:00,1.0 1920 | 1918,2015-02-08T07:09:06+00:00,1.0 1921 | 1919,2015-02-08T07:14:34+00:00,1.0 1922 | 1920,2015-02-08T07:20:02+00:00,1.0 1923 | 1921,2015-02-08T07:25:27+00:00,1.0 1924 | 1922,2015-02-08T07:30:48+00:00,1.0 1925 | 1923,2015-02-08T07:36:09+00:00,1.0 1926 | 1924,2015-02-08T07:41:31+00:00,1.0 1927 | 1925,2015-02-08T07:46:56+00:00,1.0 1928 | 1926,2015-02-08T07:52:25+00:00,1.0 1929 | 1927,2015-02-08T07:57:52+00:00,1.0 1930 | -------------------------------------------------------------------------------- /files/classgraph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/classgraph.png -------------------------------------------------------------------------------- /files/composition/ahu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/composition/ahu.png -------------------------------------------------------------------------------- /files/composition/ahu_room.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/composition/ahu_room.png -------------------------------------------------------------------------------- /files/composition/ahu_room_vav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/composition/ahu_room_vav.png -------------------------------------------------------------------------------- /files/composition/ahu_room_vav_zone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/composition/ahu_room_vav_zone.png -------------------------------------------------------------------------------- /files/composition/ahu_room_vav_zone_znt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/composition/ahu_room_vav_zone_znt.png -------------------------------------------------------------------------------- /files/feeds_query.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/feeds_query.png -------------------------------------------------------------------------------- /files/refresher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/refresher.png -------------------------------------------------------------------------------- /files/tempsensorclass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/tempsensorclass.png -------------------------------------------------------------------------------- /files/tempsensorquery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/tempsensorquery.png -------------------------------------------------------------------------------- /files/type_query.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/type_query.png -------------------------------------------------------------------------------- /files/vavclass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/vavclass.png -------------------------------------------------------------------------------- /files/vavclassq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/vavclassq.png -------------------------------------------------------------------------------- /files/vavhvac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/vavhvac.png -------------------------------------------------------------------------------- /files/vavneighbor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BuildSysUniformMetadata/brick-tutorial-buildsys2017/d6f2fa586b08aa357833f09d077881901eb57926/files/vavneighbor.png -------------------------------------------------------------------------------- /metadata/brick_sample_building_raw.csv: -------------------------------------------------------------------------------- 1 | uuid,Vendor Given Name 2 | 1,BLDA.AH1.CHWR1-T 3 | 2,BLDA.AH1.CHWR2-T 4 | 3,BLDA.AH1.CLG-VLV1 5 | 4,BLDA.AH1.CLG-VLV2 6 | 5,BLDA.AH1.DA1-T 7 | 6,BLDA.AH1.DA2-T 8 | 7,BLDA.AH1.DA-SP 9 | 8,BLDA.AH1.RF1-F 10 | 9,BLDA.AH1.RF2-F 11 | 10,BLDA.AH1-1.RF-SPD 12 | 11,BLDA.AH1.SF1-F 13 | 12,BLDA.AH1.SF2-F 14 | 13,BLDA.AH1.SF-SPD 15 | 14,BLDA.AH1.SYSENA 16 | 15,BLDA.RM-1100A..ACTCLGSP 17 | 16,BLDA.RM-1100A..ACTHTGSP 18 | 17,BLDA.RM-1100A..CLGPID-O 19 | 18,BLDA.RM-1100A..COMMONSP 20 | 19,BLDA.RM-1100A..DMPR-POS 21 | 20,BLDA.RM-1100A..DPR-C 22 | 21,BLDA.RM-1100A..HTGPID-O 23 | 22,BLDA.RM-1100A..OCC-CMD 24 | 23,BLDA.RM-1100A..RH-VLV 25 | 24,BLDA.RM-1100A..SUPFLO-SP 26 | 25,BLDA.RM-1100A..SUP-FLOW 27 | 26,BLDA.RM-1100A..ZN-T 28 | 27,BLDA.RM-1100D..ACTCLGSP 29 | 28,BLDA.RM-1100D..ACTHTGSP 30 | 29,BLDA.RM-1100D..CLGPID-O 31 | 30,BLDA.RM-1100D..COMMONSP 32 | 31,BLDA.RM-1100D..DMPR-POS 33 | 32,BLDA.RM-1100D..DPR-C 34 | 33,BLDA.RM-1100D..HTGPID-O 35 | 34,BLDA.RM-1100D..OCC-CMD 36 | 35,BLDA.RM-1100D..RH-VLV 37 | 36,BLDA.RM-1100D..SUPFLO-SP 38 | 37,BLDA.RM-1100D..SUP-FLOW 39 | 38,BLDA.RM-1100D..ZN-T 40 | 39,BLDA.RM-2150..ACTCLGSP 41 | 40,BLDA.RM-2150..ACTHTGSP 42 | 41,BLDA.RM-2150..CLGPID-O 43 | 42,BLDA.RM-2150..COMMONSP 44 | 43,BLDA.RM-2150..DMPR-POS 45 | 44,BLDA.RM-2150..DPR-C 46 | 45,BLDA.RM-2150..HTGFLOW 47 | 46,BLDA.RM-2150..HTGPID-O 48 | 47,BLDA.RM-2150..OCC-CMD 49 | 48,BLDA.RM-2150..RH-VLV 50 | 49,BLDA.RM-2150..SUPFLO-SP 51 | 50,BLDA.RM-2150..SUP-FLOW 52 | 51,BLDA.RM-2150..ZN-T 53 | -------------------------------------------------------------------------------- /metadata/equip_map.json: -------------------------------------------------------------------------------- 1 | { 2 | "SF2": "AH1", 3 | "SF1": "AH1", 4 | "RF2": "AH1", 5 | "RF1": "AH1", 6 | "SF": "AH1", 7 | "RF": "AH1" 8 | } 9 | -------------------------------------------------------------------------------- /metadata/re_dict.json: -------------------------------------------------------------------------------- 1 | { 2 | "BLDA": "Building", 3 | "AH": "AHU", 4 | "CHWR\\d-T": "Chilled_Water_Return_Temperature_Sensor", 5 | "CLG-VLV": "Cooling_Valve_Command", 6 | "SF": "Supply_Fan", 7 | "RF": "Return_Fan", 8 | "RM": "HVAC_Zone", 9 | "ACTCLGSP": "Effective_Cooling_Temperature_Setpoint", 10 | "ACTHTGSP": "Effective_Heating_Temperature_Setpoint", 11 | "CLGMAXFLO": "Cooling_Max_Discharge_Air_Flow_Setpoint", 12 | "CLGMAXFLO": "Cooling_Min_Discharge_Air_Flow_Setpoint", 13 | "CLGPID_O": "Cooling_Command", 14 | "HTGPID_O": "Heating_Command", 15 | "HTGFLOW": "Occupied_Heating_Discharge_Air_Flow_Setpoint", 16 | "DMPR_POS": "Damper_Position_Sensor", 17 | "DPR-C": "Damper_Command", 18 | "OCC-CMD": "Occupied_Command", 19 | "RH-VLV": "Reheat_Valve_Command", 20 | "SUPFLO-SP": "Supply_Air_Flow_Setpoint", 21 | "SUP-FLOW": "Supply_Air_Flow_Sensor", 22 | "W-C-ADJ": "Warm_Cool_Adjust_Setpoint", 23 | "DIRECTION": "Run_Direction_Status", 24 | "DIRECT-CMD": "Run_Direction_Command", 25 | "FAULT": "Fault_Status", 26 | "FLT_RESET": "Filter_Reset_Setpoint", 27 | "COMMONSP": "Zone_Temperature_Setpoint" 28 | } 29 | -------------------------------------------------------------------------------- /metadata/sample_building.ttl: -------------------------------------------------------------------------------- 1 | @prefix bf: . 2 | @prefix brick: . 3 | @prefix ex: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix xml: . 7 | @prefix xsd: . 8 | 9 | ex:AH1-1 a brick:AHU ; 10 | bf:hasLocation ex:BLDA . 11 | 12 | ex:BLDA.AH1.CHWR1-T a brick:Chilled_Water_Return_Temperature_Sensor ; 13 | brick:hasUuid "1" ; 14 | bf:hasLocation ex:BLDA ; 15 | bf:isPointOf ex:AH1 . 16 | 17 | ex:BLDA.AH1.CHWR2-T a brick:Chilled_Water_Return_Temperature_Sensor ; 18 | brick:hasUuid "2" ; 19 | bf:hasLocation ex:BLDA ; 20 | bf:isPointOf ex:AH1 . 21 | 22 | ex:BLDA.AH1.CLG-VLV1 a brick:Cooling_Valve_Command ; 23 | brick:hasUuid "3" ; 24 | bf:hasLocation ex:BLDA ; 25 | bf:isPointOf ex:AH1 . 26 | 27 | ex:BLDA.AH1.CLG-VLV2 a brick:Cooling_Valve_Command ; 28 | brick:hasUuid "4" ; 29 | bf:hasLocation ex:BLDA ; 30 | bf:isPointOf ex:AH1 . 31 | 32 | ex:BLDA.RM-1100A..ACTCLGSP a brick:Effective_Cooling_Temperature_Setpoint ; 33 | brick:hasUuid "15" ; 34 | bf:hasLocation ex:BLDA, 35 | ex:RM-1100A ; 36 | bf:isPointOf ex:VAV_RM-1100A . 37 | 38 | ex:BLDA.RM-1100A..ACTHTGSP a brick:Effective_Heating_Temperature_Setpoint ; 39 | brick:hasUuid "16" ; 40 | bf:hasLocation ex:BLDA, 41 | ex:RM-1100A ; 42 | bf:isPointOf ex:VAV_RM-1100A . 43 | 44 | ex:BLDA.RM-1100A..COMMONSP a brick:Zone_Temperature_Setpoint ; 45 | brick:hasUuid "18" ; 46 | bf:hasLocation ex:BLDA, 47 | ex:RM-1100A ; 48 | bf:isPointOf ex:VAV_RM-1100A . 49 | 50 | ex:BLDA.RM-1100A..DPR-C a brick:Damper_Command ; 51 | brick:hasUuid "20" ; 52 | bf:hasLocation ex:BLDA, 53 | ex:RM-1100A ; 54 | bf:isPointOf ex:VAV_RM-1100A . 55 | 56 | ex:BLDA.RM-1100A..OCC-CMD a brick:Occupied_Command ; 57 | brick:hasUuid "22" ; 58 | bf:hasLocation ex:BLDA, 59 | ex:RM-1100A ; 60 | bf:isPointOf ex:VAV_RM-1100A . 61 | 62 | ex:BLDA.RM-1100A..RH-VLV a brick:Reheat_Valve_Command ; 63 | brick:hasUuid "23" ; 64 | bf:hasLocation ex:BLDA, 65 | ex:RM-1100A ; 66 | bf:isPointOf ex:VAV_RM-1100A . 67 | 68 | ex:BLDA.RM-1100A..SUP-FLOW a brick:Supply_Air_Flow_Sensor ; 69 | brick:hasUuid "25" ; 70 | bf:hasLocation ex:BLDA, 71 | ex:RM-1100A ; 72 | bf:isPointOf ex:VAV_RM-1100A . 73 | 74 | ex:BLDA.RM-1100A..SUPFLO-SP a brick:Supply_Air_Flow_Setpoint ; 75 | brick:hasUuid "24" ; 76 | bf:hasLocation ex:BLDA, 77 | ex:RM-1100A ; 78 | bf:isPointOf ex:VAV_RM-1100A . 79 | 80 | ex:BLDA.RM-1100D..ACTCLGSP a brick:Effective_Cooling_Temperature_Setpoint ; 81 | brick:hasUuid "27" ; 82 | bf:hasLocation ex:BLDA, 83 | ex:RM-1100D ; 84 | bf:isPointOf ex:VAV_RM-1100D . 85 | 86 | ex:BLDA.RM-1100D..ACTHTGSP a brick:Effective_Heating_Temperature_Setpoint ; 87 | brick:hasUuid "28" ; 88 | bf:hasLocation ex:BLDA, 89 | ex:RM-1100D ; 90 | bf:isPointOf ex:VAV_RM-1100D . 91 | 92 | ex:BLDA.RM-1100D..COMMONSP a brick:Zone_Temperature_Setpoint ; 93 | brick:hasUuid "30" ; 94 | bf:hasLocation ex:BLDA, 95 | ex:RM-1100D ; 96 | bf:isPointOf ex:VAV_RM-1100D . 97 | 98 | ex:BLDA.RM-1100D..DPR-C a brick:Damper_Command ; 99 | brick:hasUuid "32" ; 100 | bf:hasLocation ex:BLDA, 101 | ex:RM-1100D ; 102 | bf:isPointOf ex:VAV_RM-1100D . 103 | 104 | ex:BLDA.RM-1100D..OCC-CMD a brick:Occupied_Command ; 105 | brick:hasUuid "34" ; 106 | bf:hasLocation ex:BLDA, 107 | ex:RM-1100D ; 108 | bf:isPointOf ex:VAV_RM-1100D . 109 | 110 | ex:BLDA.RM-1100D..RH-VLV a brick:Reheat_Valve_Command ; 111 | brick:hasUuid "35" ; 112 | bf:hasLocation ex:BLDA, 113 | ex:RM-1100D ; 114 | bf:isPointOf ex:VAV_RM-1100D . 115 | 116 | ex:BLDA.RM-1100D..SUP-FLOW a brick:Supply_Air_Flow_Sensor ; 117 | brick:hasUuid "37" ; 118 | bf:hasLocation ex:BLDA, 119 | ex:RM-1100D ; 120 | bf:isPointOf ex:VAV_RM-1100D . 121 | 122 | ex:BLDA.RM-1100D..SUPFLO-SP a brick:Supply_Air_Flow_Setpoint ; 123 | brick:hasUuid "36" ; 124 | bf:hasLocation ex:BLDA, 125 | ex:RM-1100D ; 126 | bf:isPointOf ex:VAV_RM-1100D . 127 | 128 | ex:BLDA.RM-2150..ACTCLGSP a brick:Effective_Cooling_Temperature_Setpoint ; 129 | brick:hasUuid "39" ; 130 | bf:hasLocation ex:BLDA, 131 | ex:RM-2150 ; 132 | bf:isPointOf ex:VAV_RM-2150 . 133 | 134 | ex:BLDA.RM-2150..ACTHTGSP a brick:Effective_Heating_Temperature_Setpoint ; 135 | brick:hasUuid "40" ; 136 | bf:hasLocation ex:BLDA, 137 | ex:RM-2150 ; 138 | bf:isPointOf ex:VAV_RM-2150 . 139 | 140 | ex:BLDA.RM-2150..COMMONSP a brick:Zone_Temperature_Setpoint ; 141 | brick:hasUuid "42" ; 142 | bf:hasLocation ex:BLDA, 143 | ex:RM-2150 ; 144 | bf:isPointOf ex:VAV_RM-2150 . 145 | 146 | ex:BLDA.RM-2150..DPR-C a brick:Damper_Command ; 147 | brick:hasUuid "44" ; 148 | bf:hasLocation ex:BLDA, 149 | ex:RM-2150 ; 150 | bf:isPointOf ex:VAV_RM-2150 . 151 | 152 | ex:BLDA.RM-2150..HTGFLOW a brick:Occupied_Heating_Discharge_Air_Flow_Setpoint ; 153 | brick:hasUuid "45" ; 154 | bf:hasLocation ex:BLDA, 155 | ex:RM-2150 ; 156 | bf:isPointOf ex:VAV_RM-2150 . 157 | 158 | ex:BLDA.RM-2150..OCC-CMD a brick:Occupied_Command ; 159 | brick:hasUuid "47" ; 160 | bf:hasLocation ex:BLDA, 161 | ex:RM-2150 ; 162 | bf:isPointOf ex:VAV_RM-2150 . 163 | 164 | ex:BLDA.RM-2150..RH-VLV a brick:Reheat_Valve_Command ; 165 | brick:hasUuid "48" ; 166 | bf:hasLocation ex:BLDA, 167 | ex:RM-2150 ; 168 | bf:isPointOf ex:VAV_RM-2150 . 169 | 170 | ex:BLDA.RM-2150..SUP-FLOW a brick:Supply_Air_Flow_Sensor ; 171 | brick:hasUuid "50" ; 172 | bf:hasLocation ex:BLDA, 173 | ex:RM-2150 ; 174 | bf:isPointOf ex:VAV_RM-2150 . 175 | 176 | ex:BLDA.RM-2150..SUPFLO-SP a brick:Supply_Air_Flow_Setpoint ; 177 | brick:hasUuid "49" ; 178 | bf:hasLocation ex:BLDA, 179 | ex:RM-2150 ; 180 | bf:isPointOf ex:VAV_RM-2150 . 181 | 182 | ex:RF a brick:Return_Fan ; 183 | bf:hasLocation ex:BLDA . 184 | 185 | ex:RF1 a brick:Return_Fan ; 186 | bf:hasLocation ex:BLDA . 187 | 188 | ex:RF2 a brick:Return_Fan ; 189 | bf:hasLocation ex:BLDA . 190 | 191 | ex:RM-1100 a brick:Room ; 192 | bf:isPartOf ex:RM-1100A, 193 | ex:RM-1100D . 194 | 195 | ex:RM-2151 a brick:Room ; 196 | bf:isPartOf ex:RM-2150 . 197 | 198 | ex:RM-2152 a brick:Room ; 199 | bf:isPartOf ex:RM-2150 . 200 | 201 | ex:SF a brick:Supply_Fan ; 202 | bf:hasLocation ex:BLDA . 203 | 204 | ex:SF1 a brick:Supply_Fan ; 205 | bf:hasLocation ex:BLDA . 206 | 207 | ex:SF2 a brick:Supply_Fan ; 208 | bf:hasLocation ex:BLDA . 209 | 210 | ex:AH1 a brick:AHU ; 211 | bf:feeds ex:VAV_RM-1100A, 212 | ex:VAV_RM-1100D, 213 | ex:VAV_RM-2150 ; 214 | bf:hasLocation ex:BLDA . 215 | 216 | ex:VAV_RM-1100A a brick:VAV ; 217 | bf:feeds ex:RM-1100A . 218 | 219 | ex:VAV_RM-1100D a brick:VAV ; 220 | bf:feeds ex:RM-1100D . 221 | 222 | ex:RM-1100A a brick:HVAC_Zone . 223 | 224 | ex:RM-1100D a brick:HVAC_Zone . 225 | 226 | ex:VAV_RM-2150 a brick:VAV ; 227 | bf:feeds ex:RM-2150 . 228 | 229 | ex:RM-2150 a brick:HVAC_Zone . 230 | 231 | ex:BLDA a brick:Building . 232 | 233 | -------------------------------------------------------------------------------- /metadata/zone_room_map.json: -------------------------------------------------------------------------------- 1 | { 2 | "RM-1100A": ["RM-1100"], 3 | "RM-1100D": ["RM-1100"], 4 | "RM-2150": ["RM-2151", "RM-2152"] 5 | } 6 | -------------------------------------------------------------------------------- /query.py: -------------------------------------------------------------------------------- 1 | # high-level interface for interacting with Brick graphs using rdflib 2 | # setup our query environment 3 | from rdflib import RDFS, RDF, Namespace, Graph, URIRef 4 | 5 | class BrickGraph(object): 6 | def __init__(self, filename='metadata/sample_building.ttl'): 7 | self.bldg = Graph() 8 | self.bldg = Graph() 9 | self.bldg.parse("Brick/dist/Brick.ttl", format='turtle') 10 | self.bldg.parse(filename, format='turtle') 11 | BRICK = Namespace('https://brickschema.org/schema/1.0.1/Brick#') 12 | BF = Namespace('https://brickschema.org/schema/1.0.1/BrickFrame#') 13 | EX = Namespace('http://example.com#') 14 | self.bldg.bind('ex', EX) 15 | self.bldg.bind('brick', BRICK) 16 | self.bldg.bind('bf', BF) 17 | self.m = { 18 | 'https://brickschema.org/schema/1.0.1/Brick': 'brick', 19 | 'http://www.w3.org/1999/02/22-rdf-syntax-ns': 'rdf', 20 | 'http://www.w3.org/2000/01/rdf-schema': 'rdfs', 21 | 'https://brickschema.org/schema/1.0.1/BrickFrame': 'bf', 22 | 'http://www.w3.org/2002/07/owl': 'owl', 23 | 'http://www.w3.org/2004/02/skos/core': 'skos', 24 | 'http://example.com': 'ex', 25 | } 26 | def query(self, query, fullURI=False): 27 | query = """PREFIX brick: 28 | PREFIX rdf: 29 | PREFIX rdfs: 30 | PREFIX bf: 31 | PREFIX ex: 32 | """+query 33 | rows = self.bldg.query(query) 34 | if not fullURI: 35 | rows = [[self.m[r.split('#')[0]] + ':' + r.split('#')[1] if isinstance(r, URIRef) and '#' in r else r for r in row] for row in rows] 36 | return rows 37 | return list(rows) -------------------------------------------------------------------------------- /sample_building.ttl: -------------------------------------------------------------------------------- 1 | @prefix bf: . 2 | @prefix brick: . 3 | @prefix ex: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix xml: . 7 | @prefix xsd: . 8 | 9 | ex:AHU-1 a brick:AHU ; 10 | bf:isLocatedIn ex:Room-B100 . 11 | 12 | ex:Room-B100 a brick:Basement . 13 | 14 | -------------------------------------------------------------------------------- /sample_building_sol.ttl: -------------------------------------------------------------------------------- 1 | @prefix bf: . 2 | @prefix brick: . 3 | @prefix ex: . 4 | @prefix rdf: . 5 | @prefix rdfs: . 6 | @prefix xml: . 7 | @prefix xsd: . 8 | 9 | ex:AHU-1 a brick:AHU ; 10 | bf:feeds ex:VAV-2150 ; 11 | bf:isLocatedIn ex:Room-B100 . 12 | 13 | ex:ZNT-2150 a brick:Zone_Temperature_Sensor ; 14 | bf:isLocatedIn ex:Zone-2150 ; 15 | bf:isPointOf ex:VAV-2150 . 16 | 17 | ex:Room-B100 a brick:Basement . 18 | 19 | ex:VAV-2150 a brick:VAV ; 20 | bf:feeds ex:Zone-2150 . 21 | 22 | ex:Zone-2150 a brick:HVAC_Zone . 23 | 24 | --------------------------------------------------------------------------------