コード例 #1
0
    def testGetZoneById_validZoneId_returnValidZone(self):
        zone1 = Zone('ff')
        self.zm.addZone(zone1)

        zone2 = Zone('2f')
        self.zm.addZone(zone2)

        self.assertEqual(zone1.getName(),
                         self.zm.getZoneById(zone1.getId()).getName())
        self.assertEqual(zone2.getName(),
                         self.zm.getZoneById(zone2.getId()).getName())
コード例 #2
0
ファイル: zone_test.py プロジェクト: yfaway/openhab-rules
    def testGetNeighborZones_noNeighborTypesSpecified_returnsCorrectList(self):
        zone1 = Zone('foyer')
        zone2 = Zone('porch')
        zone3 = Zone('office')

        zone1 = zone1.addNeighbor(
            Neighbor(zone2.getId(), NeighborType.OPEN_SPACE))
        zone1 = zone1.addNeighbor(
            Neighbor(zone3.getId(), NeighborType.OPEN_SPACE_MASTER))
        zm = MockedZoneManager([zone1, zone2, zone3])

        self.assertEqual(2, len(zone1.getNeighborZones(zm)))
コード例 #3
0
ファイル: zone_test.py プロジェクト: yfaway/openhab-rules
 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()))
コード例 #4
0
    def testOnAction_switchOnEventAndAudioSinkInNeighborZone_playsStreamAndReturnsTrue(
            self):
        zone1 = Zone('shower')
        zone2 = Zone('washroom').addDevice(self.sink)

        zone1 = zone1.addNeighbor(
            Neighbor(zone2.getId(), NeighborType.OPEN_SPACE))

        eventInfo = EventInfo(ZoneEvent.SWITCH_TURNED_ON, ITEMS[0], zone1,
                              MockedZoneManager([zone1, zone2]), scope.events)
        value = self.action.onAction(eventInfo)
        self.assertTrue(value)
        self.assertEqual('playStream', self.sink._getLastTestCommand())
コード例 #5
0
    def _createZone(self, itemName, zoneName):
        '''
        :return: the zone associated with the itemName
        :rtype: Zone
        '''
        levelMeta = MetadataRegistry.get(MetadataKey('level', itemName))
        if None == levelMeta:
            raise ValueError(
                'The zone level must be specified as BM, FF, SF, or TF')

        level = self._getZoneLevel(levelMeta.value)

        externalMeta = MetadataRegistry.get(MetadataKey('external', itemName))
        external = None != externalMeta and "true" == externalMeta.value.lower(
        )

        displayIconMeta = MetadataRegistry.get(
            MetadataKey('displayIcon', itemName))
        if None != displayIconMeta:
            displayIcon = displayIconMeta.value
        else:
            displayIcon = None

        displayOrderMeta = MetadataRegistry.get(
            MetadataKey('displayOrder', itemName))
        if None != displayOrderMeta:
            displayOrder = int(displayOrderMeta.value)
        else:
            displayOrder = 9999

        zone = Zone(zoneName, [], level, [], {}, external, displayIcon,
                    displayOrder)

        neighbors = []

        openSpaceMeta = MetadataRegistry.get(
            MetadataKey('openSpaceNeighbors', itemName))
        if None != openSpaceMeta:
            for neighborId in openSpaceMeta.value.split(','):
                neighborId = neighborId.strip()
                # Temporary replacement to align with HABapp zone-apis code.
                neighborId = neighborId.replace('FF_', '1_')
                neighborId = neighborId.replace('SF_', '2_')
                neighbors.append(
                    [zone.getId(), neighborId, NeighborType.OPEN_SPACE])

        return [zone, neighbors]
コード例 #6
0
class TurnOnSwitchTest(DeviceTest):
    def setUp(self):
        super(TurnOnSwitchTest, self).setUp()

        [
            self.lightItem1, self.lightItem2, self.illuminanceSensorItem,
            self.motionSensorItem1, self.motionSensorItem2, self.lightItem3
        ] = self.getItems()

        self.illuminanceSensor = IlluminanceSensor(self.illuminanceSensorItem)
        self.light1 = Light(self.lightItem1, 30, ILLUMINANCE_THRESHOLD_IN_LUX)
        self.light2 = Light(self.lightItem2, 30, ILLUMINANCE_THRESHOLD_IN_LUX)
        self.light3 = Light(self.lightItem3, 30, ILLUMINANCE_THRESHOLD_IN_LUX)
        self.motionSensor1 = MotionSensor(self.motionSensorItem1)
        self.motionSensor2 = MotionSensor(self.motionSensorItem2)

        self.zone1 = Zone(
            'great room',
            [self.light1, self.illuminanceSensor, self.motionSensor1])
        self.zone2 = Zone(
            'kitchen',
            [self.light2, self.illuminanceSensor, self.motionSensor2])
        self.zone3 = Zone('foyer', [self.light3, self.illuminanceSensor])

    def getItems(self, resetState=False):
        if resetState:
            for item in ITEMS:
                if isinstance(item, SwitchItem):
                    item.setState(scope.OnOffType.OFF)
                elif isinstance(item, SwitchItem):
                    item.setState(UndefState)

        return ITEMS

    def testOnAction_illuminanceBelowThreshold_turnsOnLight(self):
        self.illuminanceSensorItem.setState(
            DecimalType(ILLUMINANCE_THRESHOLD_IN_LUX - 1))

        self.assertTrue(self.turnOn())

    def testOnAction_illuminanceAboveThreshold_returnsFalse(self):
        self.illuminanceSensorItem.setState(
            DecimalType(ILLUMINANCE_THRESHOLD_IN_LUX + 1))

        self.assertFalse(self.turnOn())

    def testOnAction_renewTimerIfLightIsAlreadyOnEvenIfIlluminanceIsAboveThreshold_returnsTrue(
            self):
        self.illuminanceSensorItem.setState(
            DecimalType(ILLUMINANCE_THRESHOLD_IN_LUX + 1))
        self.light1.turnOn(self.getMockedEventDispatcher())

        self.assertTrue(self.turnOn())

    def testOnAction_switchDisablesTriggeringByMotionSensor_returnsFalse(self):
        self.light1 = Light(self.lightItem1, 30, ILLUMINANCE_THRESHOLD_IN_LUX,
                            True)
        self.zone1 = Zone('foyer', [self.light1, self.illuminanceSensor])

        self.illuminanceSensorItem.setState(
            DecimalType(ILLUMINANCE_THRESHOLD_IN_LUX - 1))

        self.assertFalse(self.turnOn())

    def testOnAction_switchWasJustTurnedOff_returnsFalse(self):
        self.light1.onSwitchTurnedOff(self.getMockedEventDispatcher(),
                                      self.light1.getItemName())

        self.illuminanceSensorItem.setState(
            DecimalType(ILLUMINANCE_THRESHOLD_IN_LUX - 1))

        self.assertFalse(self.turnOn())

    def testOnAction_adjacentZoneWasNotOn_returnsTrue(self):
        self.setUpNeighborRelationship(self.zone2, NeighborType.OPEN_SPACE,
                                       True)

        # shared channel
        self.motionSensor1.getChannel = lambda: 'a channel'
        self.motionSensor2.getChannel = lambda: 'a channel'

        self.illuminanceSensorItem.setState(
            DecimalType(ILLUMINANCE_THRESHOLD_IN_LUX - 1))

        self.assertTrue(self.turnOn())

    def testOnAction_adjacentZoneWasJustTurnedOff_returnsFalse(self):
        self.setUpNeighborRelationship(self.zone2, NeighborType.OPEN_SPACE,
                                       True)

        # shared channel
        self.motionSensor1.getChannel = lambda: 'a channel'
        self.motionSensor2.getChannel = lambda: 'a channel'

        self.light2.onSwitchTurnedOff(self.getMockedEventDispatcher(),
                                      self.light2.getItemName())

        self.illuminanceSensorItem.setState(
            DecimalType(ILLUMINANCE_THRESHOLD_IN_LUX - 1))

        self.assertFalse(self.turnOn())

    def testOnAction_openSpaceMasterNeighborIsOn_returnsFalse(self):
        self.setUpNeighborRelationship(self.zone2,
                                       NeighborType.OPEN_SPACE_MASTER, True)

        self.assertFalse(self.turnOn())

    def testOnAction_openSpaceMasterNeighborIsOff_returnsFalse(self):
        self.setUpNeighborRelationship(self.zone2,
                                       NeighborType.OPEN_SPACE_MASTER, False)

        self.assertTrue(self.turnOn())

    def testOnAction_openSpaceNeighborIsOn_returnsTrueAndTurnOffNeighbor(self):
        self.setUpNeighborRelationship(self.zone2, NeighborType.OPEN_SPACE,
                                       True)
        self.assertTrue(self.zone2.isLightOn())

        self.assertTrue(self.turnOn())
        self.assertFalse(self.zone2.isLightOn())

    def testOnAction_openSpaceNeighborIsOff_returnsTrue(self):
        self.setUpNeighborRelationship(self.zone2, NeighborType.OPEN_SPACE,
                                       False)
        self.assertFalse(self.zone2.isLightOn())

        self.assertTrue(self.turnOn())
        self.assertTrue(self.zone1.isLightOn())
        self.assertFalse(self.zone2.isLightOn())

    def testOnAction_openSpaceSlaveNeighborIsOn_returnsTrueAndTurnOffNeighbor(
            self):
        self.setUpNeighborRelationship(self.zone2,
                                       NeighborType.OPEN_SPACE_SLAVE, True)
        self.assertTrue(self.zone2.isLightOn())

        self.assertTrue(self.turnOn())
        self.assertFalse(self.zone2.isLightOn())

    def testOnAction_openSpaceSlaveNeighborIsOff_returnsTrue(self):
        self.setUpNeighborRelationship(self.zone2,
                                       NeighborType.OPEN_SPACE_SLAVE, False)
        self.assertFalse(self.zone2.isLightOn())

        self.assertTrue(self.turnOn())
        self.assertTrue(self.zone1.isLightOn())
        self.assertFalse(self.zone2.isLightOn())

    def testOnAction_renewTimerWhenBothMasterAndSlaveAreOn_returnsTrueAndNotTurningOffNeighbor(
            self):
        self.setUpNeighborRelationship(self.zone2,
                                       NeighborType.OPEN_SPACE_SLAVE, True)
        self.lightItem1.setState(scope.OnOffType.ON)

        self.assertTrue(self.turnOn())
        self.assertTrue(self.zone2.isLightOn())

    def testOnAction_masterIsOn_returnsTrueAndNotTurningOffOpenSpaceNeighbor(
            self):
        self.illuminanceSensorItem.setState(
            DecimalType(ILLUMINANCE_THRESHOLD_IN_LUX - 1))

        # zone3 (foyer) is an open space neighbor with zone2
        self.zone2 = self.zone2.addNeighbor(
            Neighbor(self.zone3.getId(), NeighborType.OPEN_SPACE))
        # zone2 (kitchen) is an open space slave with zone1 (great room)
        self.zone2 = self.zone2.addNeighbor(
            Neighbor(self.zone1.getId(), NeighborType.OPEN_SPACE_MASTER))

        # Turn on the light in the great room and the foyer.
        # We want to make sure that when the motion sensor in the kitchen is
        # triggered, it won't be turn on, and also the foyer light must not
        # be turned off.
        # The rationale is that someone just open the door to come to the foyer
        # area. However, as the great room light was already on, that indicates
        # someone is already in that area. As such, any movement in that
        # area must not prematurely turn off the the foyer light.
        self.lightItem1.setState(scope.OnOffType.ON)
        self.lightItem3.setState(scope.OnOffType.ON)

        eventInfo = EventInfo(ZoneEvent.MOTION, ITEMS[0], self.zone2,
                              self.createMockedZoneManager(),
                              self.getMockedEventDispatcher())
        returnVal = TurnOnSwitch().onAction(eventInfo)
        self.assertFalse(returnVal)
        self.assertFalse(self.zone2.isLightOn())
        self.assertTrue(self.zone3.isLightOn())

    def turnOn(self):
        eventInfo = EventInfo(ZoneEvent.MOTION, ITEMS[0], self.zone1,
                              self.createMockedZoneManager(),
                              self.getMockedEventDispatcher())
        return TurnOnSwitch().onAction(eventInfo)

    # Helper method to set up the relationship between the provided zone and zone1.
    def setUpNeighborRelationship(self, zone, type, neighborLightOn):
        self.illuminanceSensorItem.setState(
            DecimalType(ILLUMINANCE_THRESHOLD_IN_LUX - 1))
        self.zone1 = self.zone1.addNeighbor(Neighbor(zone.getId(), type))

        if neighborLightOn:
            self.lightItem2.setState(scope.OnOffType.ON)

    def createMockedZoneManager(self):
        return MockedZoneManager([self.zone1, self.zone2, self.zone3])
コード例 #7
0
class TurnOffAdjacentZonesTest(DeviceTest):
    def setUp(self):
        super(TurnOffAdjacentZonesTest, self).setUp()

        [self.lightItem1, self.lightItem2, self.lightItem3,
         self.fanItem] = self.getItems()

        self.light1 = Light(self.lightItem1, 5)
        self.light2 = Light(self.lightItem2, 5)
        self.light3 = Light(self.lightItem3, 5, ILLUMINANCE_THRESHOLD_IN_LUX,
                            False, "0-23:59")  # always stay on
        self.fan = Fan(self.fanItem, 5)

        self.washroom = Zone('washroom', [self.light1])
        self.shower = Zone('shower', [self.fan])
        self.lobby = Zone('lobby', [self.light2])
        self.foyer = Zone('foyer', [self.light3])
        self.zoneManager = MockedZoneManager(
            [self.washroom, self.shower, self.lobby, self.foyer])

        self.lobby = self.lobby.addNeighbor(
            Neighbor(self.foyer.getId(), NeighborType.OPEN_SPACE))

        self.washroom = self.washroom.addNeighbor(
            Neighbor(self.lobby.getId(), NeighborType.OPEN_SPACE))
        self.washroom = self.washroom.addNeighbor(
            Neighbor(self.shower.getId(), NeighborType.OPEN_SPACE))

    def getItems(self, resetState=False):
        if resetState:
            for item in ITEMS:
                if isinstance(item, SwitchItem):
                    item.setState(scope.OnOffType.OFF)

        return ITEMS

    def testOnAction_normalOpenSpaceNeighbor_turnsOffLight(self):
        self.lightItem2.setState(scope.OnOffType.ON)

        self.assertTrue(self.turnOff(self.washroom))
        self.assertFalse(self.lobby.isLightOn())

    def testOnAction_openSpaceButDisableTurnOffByNeightbor_mustNotTurnsOffLight(
            self):
        self.lightItem3.setState(scope.OnOffType.ON)

        self.assertTrue(self.turnOff(self.lobby))
        self.assertTrue(self.foyer.isLightOn())

    def testOnAction_fanZone_returnsFalse(self):
        self.fanItem.setState(scope.OnOffType.ON)
        self.assertFalse(self.turnOff(self.shower))

    def testOnAction_neighborWithFan_mustNotTurnOffNeighborFan(self):
        self.fanItem.setState(scope.OnOffType.ON)
        self.lightItem2.setState(scope.OnOffType.ON)

        self.assertTrue(self.turnOff(self.washroom))
        self.assertFalse(self.lobby.isLightOn())
        self.assertEqual(scope.OnOffType.ON, self.fanItem.getState())

    def turnOff(self, zone):
        eventInfo = EventInfo(ZoneEvent.SWITCH_TURNED_ON, ITEMS[0],
                              zone, self.zoneManager,
                              self.getMockedEventDispatcher())

        return TurnOffAdjacentZones().onAction(eventInfo)