#!/usr/bin/python
from __future__ import print_function, division
import unittest
from os.path import join
from nilmtk.tests.testingtools import data_dir
from nilmtk import (Appliance, MeterGroup, ElecMeter, HDFDataStore,
global_meter_group, TimeFrame, DataSet)
from nilmtk.utils import tree_root, nodes_adjacent_to_root
from nilmtk.elecmeter import ElecMeterID
from nilmtk.building import BuildingID
[docs]class TestMeterGroup(unittest.TestCase):
@classmethod
[docs] def setUpClass(cls):
filename = join(data_dir(), 'energy.h5')
cls.datastore = HDFDataStore(filename)
ElecMeter.load_meter_devices(cls.datastore)
@classmethod
[docs] def tearDownClass(cls):
cls.datastore.close()
[docs] def test_getitem(self):
fridge_meter = ElecMeter()
fridge = Appliance({'type':'fridge', 'instance':1})
fridge_meter.appliances = [fridge]
mg = MeterGroup([fridge_meter])
# test good keys
for key in ['fridge', ('fridge', 1), {'type':'fridge'},
{'type':'fridge', 'instance': 1}]:
self.assertEqual(mg[key], fridge_meter)
# test bad key values
for key in ['foo', ('foo', 2), ('fridge', 2),
{'type':'fridge', 'instance': -12}]:
with self.assertRaises(KeyError):
mg[key]
# test bad key types
for key in [True, False, ['fridge']]:
with self.assertRaises(TypeError):
mg[key]
[docs] def test_select(self):
fridge_meter = ElecMeter()
fridge = Appliance({'type':'fridge', 'instance':1})
fridge_meter.appliances = [fridge]
mg = MeterGroup([fridge_meter])
self.assertEqual(mg.select_using_appliances(category='cold'), mg)
# TODO: make this test more rigorous!
[docs] def test_wiring_graph(self):
meter1 = ElecMeter(metadata={'site_meter': True},
meter_id=ElecMeterID(1,1,'REDD'))
meter2 = ElecMeter(metadata={'submeter_of': 1},
meter_id=ElecMeterID(2,1,'REDD'))
meter3 = ElecMeter(metadata={'submeter_of': 2},
meter_id=ElecMeterID(3,1,'REDD'))
mg = MeterGroup([meter1, meter2, meter3])
wiring_graph = mg.wiring_graph()
self.assertIs(mg.mains(), meter1)
self.assertEqual(mg.meters_directly_downstream_of_mains().meters, [meter2])
self.assertEqual(wiring_graph.nodes(), [meter2, meter3, meter1])
[docs] def test_proportion_of_energy_submetered(self):
meters = []
for i in [1,2,3]:
meter_meta = self.datastore.load_metadata('building1')['elec_meters'][i]
meter_id = ElecMeterID(i, 1, 'REDD')
meter = ElecMeter(self.datastore, meter_meta, meter_id)
meters.append(meter)
mains = meters[0]
mg = MeterGroup(meters)
self.assertEqual(mg.proportion_of_energy_submetered(), 1.0)
# Check a second time to check cache works
self.assertEqual(mg.proportion_of_energy_submetered(), 1.0)
mg.clear_cache()
[docs] def test_dual_supply(self):
elec_meters = {1: {'data_location': '/building1/elec/meter1',
'device_model': 'Energy Meter'},
2: {'data_location': '/building1/elec/meter1',
'device_model': 'Energy Meter'},
3: {'data_location': '/building1/elec/meter1',
'device_model': 'Energy Meter'}}
appliances = [{'type': 'washer dryer', 'instance': 1, 'meters': [1,2]},
{'type': 'fridge', 'instance': 1, 'meters': [3]}]
mg = MeterGroup()
mg.import_metadata(self.datastore, elec_meters, appliances, BuildingID(1, 'REDD'))
self.assertEqual(mg['washer dryer'].total_energy()['active'],
mg['fridge'].total_energy()['active'] * 2)
# Test total_energy a second time to check cache works
self.assertEqual(mg['washer dryer'].total_energy()['active'],
mg['fridge'].total_energy()['active'] * 2)
self.assertIsInstance(mg['washer dryer'], MeterGroup)
self.assertIsInstance(mg['fridge'], ElecMeter)
mg.clear_cache()
[docs] def test_from_list(self):
meters = []
for i in range(1,6):
meters.append(ElecMeter(meter_id=ElecMeterID(i, 1, None)))
mg = global_meter_group.from_list([
ElecMeterID(1,1,None),
(ElecMeterID(2,1,None),
(ElecMeterID(3,1,None), ElecMeterID(4,1,None), ElecMeterID(5,1,None)))
])
"""
Commented for the time being
self.assertIs(mg.meters[0], meters[0])
self.assertIs(mg.meters[1].meters[0], meters[1])
self.assertEqual(len(mg.meters[1].meters[1].meters), 3)
self.assertEqual(len(mg.meters), 2)
"""
[docs] def test_full_results_with_no_sections_raises_runtime_error(self):
mg = MeterGroup([ElecMeter(), ElecMeter()])
with self.assertRaises(RuntimeError):
mg.dropout_rate(full_results=True)
[docs] def test_total_energy(self):
filename = join(data_dir(), 'random.h5')
ds = DataSet(filename)
ds.buildings[1].elec.total_energy()
ds.buildings[1].elec.total_energy() # test cache
ds.buildings[1].elec.clear_cache()
ds.store.close()
[docs] def test_load(self):
filename = join(data_dir(), 'energy.h5')
ds = DataSet(filename)
elec = ds.buildings[1].elec
df = elec.load().next()
self.assertEqual(len(df), 13)
df = elec.load(chunksize=5).next()
self.assertEqual(len(df), 5)
df = elec.load(physical_quantity='energy').next()
self.assertEqual(len(df), 13)
self.assertEqual(df.columns.levels, [['energy'], ['reactive']])
df = elec.load(ac_type='active').next()
self.assertEqual(df.columns.levels, [['power'], ['active']])
if __name__ == '__main__':
unittest.main()