def _normalizeNeighbors(self, zone): ''' If a zone has the same neighbor with more than one OPEN_SPACE type, remove the generic one NeighborType.OPEN_SPACE :rtype: Zone new object ''' zoneIdToType = {} for neighbor in zone.getNeighbors(): zoneId = neighbor.getZoneId() if zoneId in zoneIdToType: types = zoneIdToType[zoneId] else: types = [] zoneIdToType[zoneId] = types types.append(neighbor.getType()) for types in zoneIdToType.values(): if NeighborType.OPEN_SPACE_MASTER in types \ or NeighborType.OPEN_SPACE_SLAVE in types: if NeighborType.OPEN_SPACE in types: types.remove(NeighborType.OPEN_SPACE) zone = Zone(zone.getName(), zone.getDevices(), zone.getLevel(), [], {}, zone.isExternal(), zone.getDisplayIcon(), zone.getDisplayOrder()) for zoneId in zoneIdToType.keys(): for type in zoneIdToType[zoneId]: zone = zone.addNeighbor(Neighbor(zoneId, type)) return zone
def testZoneCtor_validParams_gettersReturnValidValues(self): zoneName = 'bed room' zone = Zone(zoneName, [self.light], Level.SECOND_FLOOR) self.assertEqual(zoneName, zone.getName()) self.assertEqual(Level.SECOND_FLOOR, zone.getLevel()) self.assertEqual( str(Level.SECOND_FLOOR) + '_' + zoneName, zone.getId()) self.assertEqual(1, len(zone.getDevices()))
def testRemoveDevice_validDevice_deviceRemoved(self): zone = Zone('ff', [self.light]) self.assertEqual(1, len(zone.getDevices())) zone = zone.removeDevice(self.light) self.assertEqual(0, len(zone.getDevices()))
def testAddDevice_validDevice_deviceAdded(self): zone = Zone('ff').addDevice(self.light) self.assertEqual(1, len(zone.getDevices()))
def parse(self, items, itemRegistry, zoneManager): ''' :param scope.items items: :param scope.itemRegistry itemRegistry: :rtype: list(Zone) ''' zoneMap = {} # map from string zoneId to Zone # Each item is a list of 3 items: zone id, zone id, neighbor type. neighbors = [] # pre-add all zone items for itemName in items.keys(): match = re.search(ZONE_NAME_PATTERN, itemName) if not match: continue zoneName = match.group(1) (zone, localNeighbors) = self._createZone(itemName, zoneName) zoneMap[zone.getId()] = zone for n in localNeighbors: neighbors.append(n) # now add the items for itemName in items.keys(): match = re.search(ITEM_NAME_PATTERN, itemName) if not match: continue levelString = match.group(1) location = match.group(2) deviceName = match.group(3) zoneId = self._getZoneIdFromItemName(itemName) if zoneId in zoneMap: zone = zoneMap[zoneId] else: zone = Zone(location, [], self._getZoneLevel(levelString)) openHabItem = itemRegistry.getItem(itemName) device = self._createCamera(deviceName, openHabItem, zone) \ or self._createDoor(deviceName, openHabItem) \ or self._createNetworkPresence(deviceName, openHabItem) \ or self._createSwitches( deviceName, openHabItem, zone, itemRegistry, neighbors) \ or self._createPlugs(deviceName, openHabItem, itemRegistry) \ or self._createAlarmPartition( deviceName, openHabItem, itemRegistry) \ or self._createChromeCasts(deviceName, openHabItem) \ or self._createHumiditySensors(deviceName, openHabItem) \ or self._createTemperatureSensors(deviceName, openHabItem) \ or self._createCo2Sensors(deviceName, openHabItem, itemRegistry) \ or self._createNaturalGasSensors( deviceName, openHabItem, itemRegistry) \ or self._createSmokeSensors( deviceName, openHabItem, itemRegistry) \ or self._createTv( deviceName, openHabItem, itemRegistry) if None != device: device = device.setZoneManager(zoneManager) zone = self._addDeviceToZone(device, zone) if len(zone.getDevices()) > 0: zoneMap[zoneId] = zone # end looping items astroSensor = AstroSensor(itemRegistry.getItem(TIME_OF_DAY_ITEM_NAME)) astroSensor = astroSensor.setZoneManager(zoneManager) for z in zoneMap.values(): if len(z.getDevicesByType(Light)) > 0 or \ len(z.getDevicesByType(Dimmer)) > 0: z = z.addDevice(astroSensor) zoneMap[z.getId()] = z for neighborInfo in neighbors: zone = zoneMap[neighborInfo[0]] zone = zone.addNeighbor(Neighbor(neighborInfo[1], neighborInfo[2])) zoneMap[neighborInfo[0]] = zone return [self._normalizeNeighbors(z) for z in zoneMap.values()]