예제 #1
0
    def test_measure(self):
        """Test the history statistics sensor measure."""
        later = dt_util.utcnow() - timedelta(seconds=15)
        earlier = later - timedelta(minutes=30)

        fake_states = {
            'binary_sensor.test_id': [
                ha.State('binary_sensor.test_id', 'on', last_changed=earlier),
                ha.State('binary_sensor.test_id', 'off', last_changed=later),
            ]
        }

        start = Template('{{ as_timestamp(now()) - 3600 }}', self.hass)
        end = Template('{{ now() }}', self.hass)

        sensor1 = HistoryStatsSensor(self.hass, 'binary_sensor.test_id', 'on',
                                     start, end, None, 'Test')

        sensor2 = HistoryStatsSensor(self.hass, 'unknown.id', 'on', start, end,
                                     None, 'Test')

        with patch(
                'homeassistant.components.history.'
                'state_changes_during_period',
                return_value=fake_states):
            with patch('homeassistant.components.history.get_state',
                       return_value=None):
                sensor1.update()
                sensor2.update()

        self.assertEqual(sensor1.value, 0.5)
        self.assertEqual(sensor2.value, 0)
        self.assertEqual(sensor1.device_state_attributes['ratio'], '50.0%')
    def test_period_parsing(self):
        """Test the conversion from templates to period."""
        today = Template('{{ now().replace(hour=0).replace(minute=0)'
                         '.replace(second=0) }}', self.hass)
        duration = timedelta(hours=2, minutes=1)

        sensor1 = HistoryStatsSensor(
            self.hass, 'test', 'on', today, None, duration, 'time', 'test')
        sensor2 = HistoryStatsSensor(
            self.hass, 'test', 'on', None, today, duration, 'time', 'test')

        sensor1.update_period()
        sensor1_start, sensor1_end = sensor1._period
        sensor2.update_period()
        sensor2_start, sensor2_end = sensor2._period

        # Start = 00:00:00
        self.assertEqual(sensor1_start.hour, 0)
        self.assertEqual(sensor1_start.minute, 0)
        self.assertEqual(sensor1_start.second, 0)

        # End = 02:01:00
        self.assertEqual(sensor1_end.hour, 2)
        self.assertEqual(sensor1_end.minute, 1)
        self.assertEqual(sensor1_end.second, 0)

        # Start = 21:59:00
        self.assertEqual(sensor2_start.hour, 21)
        self.assertEqual(sensor2_start.minute, 59)
        self.assertEqual(sensor2_start.second, 0)

        # End = 00:00:00
        self.assertEqual(sensor2_end.hour, 0)
        self.assertEqual(sensor2_end.minute, 0)
        self.assertEqual(sensor2_end.second, 0)
    def test_measure(self):
        """Test the history statistics sensor measure."""
        later = dt_util.utcnow() - timedelta(seconds=15)
        earlier = later - timedelta(minutes=30)

        fake_states = {
            'binary_sensor.test_id': [
                ha.State('binary_sensor.test_id', 'on', last_changed=earlier),
                ha.State('binary_sensor.test_id', 'off', last_changed=later),
            ]
        }

        start = Template('{{ as_timestamp(now()) - 3600 }}', self.hass)
        end = Template('{{ now() }}', self.hass)

        sensor1 = HistoryStatsSensor(
            self.hass, 'binary_sensor.test_id', 'on', start, end, None, 'Test')

        sensor2 = HistoryStatsSensor(
            self.hass, 'unknown.id', 'on', start, end, None, 'Test')

        with patch('homeassistant.components.history.'
                   'state_changes_during_period', return_value=fake_states):
            with patch('homeassistant.components.history.get_state',
                       return_value=None):
                sensor1.update()
                sensor2.update()

        self.assertEqual(sensor1.value, 0.5)
        self.assertEqual(sensor2.value, 0)
        self.assertEqual(sensor1.device_state_attributes['ratio'], '50.0%')
예제 #4
0
    def test_bad_template(self):
        """Test Exception when the template cannot be parsed."""
        bad = Template('{{ x - 12 }}', self.hass)  # x is undefined
        duration = '01:00'

        sensor1 = HistoryStatsSensor(self.hass, 'test', 'on', bad, None,
                                     duration, 'Test')
        sensor2 = HistoryStatsSensor(self.hass, 'test', 'on', None, bad,
                                     duration, 'Test')

        before_update1 = sensor1._period
        before_update2 = sensor2._period

        sensor1.update_period()
        sensor2.update_period()

        self.assertEqual(before_update1, sensor1._period)
        self.assertEqual(before_update2, sensor2._period)
예제 #5
0
    def test_wrong_date(self):
        """Test when start or end value is not a timestamp or a date."""
        good = Template('{{ now() }}', self.hass)
        bad = Template('{{ TEST }}', self.hass)

        sensor1 = HistoryStatsSensor(self.hass, 'test', 'on', good, bad, None,
                                     'Test')
        sensor2 = HistoryStatsSensor(self.hass, 'test', 'on', bad, good, None,
                                     'Test')

        before_update1 = sensor1._period
        before_update2 = sensor2._period

        sensor1.update_period()
        sensor2.update_period()

        self.assertEqual(before_update1, sensor1._period)
        self.assertEqual(before_update2, sensor2._period)
예제 #6
0
    def test_measure(self):
        """Test the history statistics sensor measure."""
        t0 = dt_util.utcnow() - timedelta(minutes=40)
        t1 = t0 + timedelta(minutes=20)
        t2 = dt_util.utcnow() - timedelta(minutes=10)

        # Start     t0        t1        t2        End
        # |--20min--|--20min--|--10min--|--10min--|
        # |---off---|---on----|---off---|---on----|

        fake_states = {
            'binary_sensor.test_id': [
                ha.State('binary_sensor.test_id', 'on', last_changed=t0),
                ha.State('binary_sensor.test_id', 'off', last_changed=t1),
                ha.State('binary_sensor.test_id', 'on', last_changed=t2),
            ]
        }

        start = Template('{{ as_timestamp(now()) - 3600 }}', self.hass)
        end = Template('{{ now() }}', self.hass)

        sensor1 = HistoryStatsSensor(self.hass, 'binary_sensor.test_id', 'on',
                                     start, end, None, 'Test')

        sensor2 = HistoryStatsSensor(self.hass, 'unknown.id', 'on', start, end,
                                     None, 'Test')

        with patch(
                'homeassistant.components.history.'
                'state_changes_during_period',
                return_value=fake_states):
            with patch('homeassistant.components.history.get_state',
                       return_value=None):
                sensor1.update()
                sensor2.update()

        self.assertEqual(round(sensor1.value, 3), 0.5)
        self.assertEqual(round(sensor2.value, 3), 0)
        self.assertEqual(sensor1.device_state_attributes['ratio'], '50.0%')
예제 #7
0
    def test_period_parsing(self):
        """Test the conversion from templates to period."""
        now = datetime(2019, 1, 1, 23, 30, 0, tzinfo=pytz.utc)
        with patch.dict(template.ENV.globals, {'now': lambda: now}):
            today = Template(
                '{{ now().replace(hour=0).replace(minute=0)'
                '.replace(second=0) }}', self.hass)
            duration = timedelta(hours=2, minutes=1)

            sensor1 = HistoryStatsSensor(self.hass, 'test', 'on', today, None,
                                         duration, 'time', 'test')
            sensor2 = HistoryStatsSensor(self.hass, 'test', 'on', None, today,
                                         duration, 'time', 'test')

            sensor1.update_period()
            sensor1_start, sensor1_end = sensor1._period
            sensor2.update_period()
            sensor2_start, sensor2_end = sensor2._period

        # Start = 00:00:00
        assert sensor1_start.hour == 0
        assert sensor1_start.minute == 0
        assert sensor1_start.second == 0

        # End = 02:01:00
        assert sensor1_end.hour == 2
        assert sensor1_end.minute == 1
        assert sensor1_end.second == 0

        # Start = 21:59:00
        assert sensor2_start.hour == 21
        assert sensor2_start.minute == 59
        assert sensor2_start.second == 0

        # End = 00:00:00
        assert sensor2_end.hour == 0
        assert sensor2_end.minute == 0
        assert sensor2_end.second == 0
예제 #8
0
    def test_period_parsing(self):
        """Test the conversion from templates to period."""
        today = Template(
            '{{ now().replace(hour=0).replace(minute=0)'
            '.replace(second=0) }}', self.hass)
        duration = timedelta(hours=2, minutes=1)

        sensor1 = HistoryStatsSensor(self.hass, 'test', 'on', today, None,
                                     duration, 'test')
        sensor2 = HistoryStatsSensor(self.hass, 'test', 'on', None, today,
                                     duration, 'test')

        sensor1.update_period()
        sensor2.update_period()

        self.assertEqual(sensor1.device_state_attributes['from'][-8:],
                         '00:00:00')
        self.assertEqual(sensor1.device_state_attributes['to'][-8:],
                         '02:01:00')
        self.assertEqual(sensor2.device_state_attributes['from'][-8:],
                         '21:59:00')
        self.assertEqual(sensor2.device_state_attributes['to'][-8:],
                         '00:00:00')
예제 #9
0
    def test_period_parsing(self):
        """Test the conversion from templates to period."""
        today = Template(
            '{{ now().replace(hour=0).replace(minute=0)'
            '.replace(second=0) }}', self.hass)
        duration = timedelta(hours=2, minutes=1)

        sensor1 = HistoryStatsSensor(self.hass, 'test', 'on', today, None,
                                     duration, 'time', 'test')
        sensor2 = HistoryStatsSensor(self.hass, 'test', 'on', None, today,
                                     duration, 'time', 'test')

        sensor1.update_period()
        sensor1_start, sensor1_end = sensor1._period
        sensor2.update_period()
        sensor2_start, sensor2_end = sensor2._period

        # Start = 00:00:00
        self.assertEqual(sensor1_start.hour, 0)
        self.assertEqual(sensor1_start.minute, 0)
        self.assertEqual(sensor1_start.second, 0)

        # End = 02:01:00
        self.assertEqual(sensor1_end.hour, 2)
        self.assertEqual(sensor1_end.minute, 1)
        self.assertEqual(sensor1_end.second, 0)

        # Start = 21:59:00
        self.assertEqual(sensor2_start.hour, 21)
        self.assertEqual(sensor2_start.minute, 59)
        self.assertEqual(sensor2_start.second, 0)

        # End = 00:00:00
        self.assertEqual(sensor2_end.hour, 0)
        self.assertEqual(sensor2_end.minute, 0)
        self.assertEqual(sensor2_end.second, 0)
    def test_bad_template(self):
        """Test Exception when the template cannot be parsed."""
        bad = Template('{{ x - 12 }}', self.hass)  # x is undefined
        duration = '01:00'

        sensor1 = HistoryStatsSensor(
            self.hass, 'test', 'on', bad, None, duration, 'time', 'Test')
        sensor2 = HistoryStatsSensor(
            self.hass, 'test', 'on', None, bad, duration, 'time', 'Test')

        before_update1 = sensor1._period
        before_update2 = sensor2._period

        sensor1.update_period()
        sensor2.update_period()

        self.assertEqual(before_update1, sensor1._period)
        self.assertEqual(before_update2, sensor2._period)
    def test_wrong_date(self):
        """Test when start or end value is not a timestamp or a date."""
        good = Template('{{ now() }}', self.hass)
        bad = Template('{{ TEST }}', self.hass)

        sensor1 = HistoryStatsSensor(
            self.hass, 'test', 'on', good, bad, None, 'time', 'Test')
        sensor2 = HistoryStatsSensor(
            self.hass, 'test', 'on', bad, good, None, 'time', 'Test')

        before_update1 = sensor1._period
        before_update2 = sensor2._period

        sensor1.update_period()
        sensor2.update_period()

        self.assertEqual(before_update1, sensor1._period)
        self.assertEqual(before_update2, sensor2._period)
    def test_period_parsing(self):
        """Test the conversion from templates to period."""
        today = Template('{{ now().replace(hour=0).replace(minute=0)'
                         '.replace(second=0) }}', self.hass)
        duration = timedelta(hours=2, minutes=1)

        sensor1 = HistoryStatsSensor(
            self.hass, 'test', 'on', today, None, duration, 'test')
        sensor2 = HistoryStatsSensor(
            self.hass, 'test', 'on', None, today, duration, 'test')

        sensor1.update_period()
        sensor2.update_period()

        self.assertEqual(
            sensor1.device_state_attributes['from'][-8:], '00:00:00')
        self.assertEqual(
            sensor1.device_state_attributes['to'][-8:], '02:01:00')
        self.assertEqual(
            sensor2.device_state_attributes['from'][-8:], '21:59:00')
        self.assertEqual(
            sensor2.device_state_attributes['to'][-8:], '00:00:00')
예제 #13
0
    def test_period_parsing(self):
        """Test the conversion from templates to period."""
        now = datetime(2019, 1, 1, 23, 30, 0, tzinfo=pytz.utc)
        with patch.dict(template.ENV.globals, {'now': lambda: now}):
            print(dt_util.now())
            today = Template('{{ now().replace(hour=0).replace(minute=0)'
                             '.replace(second=0) }}', self.hass)
            duration = timedelta(hours=2, minutes=1)

            sensor1 = HistoryStatsSensor(
                self.hass, 'test', 'on', today, None, duration, 'time', 'test')
            sensor2 = HistoryStatsSensor(
                self.hass, 'test', 'on', None, today, duration, 'time', 'test')

            sensor1.update_period()
            sensor1_start, sensor1_end = sensor1._period
            sensor2.update_period()
            sensor2_start, sensor2_end = sensor2._period

        # Start = 00:00:00
        assert sensor1_start.hour == 0
        assert sensor1_start.minute == 0
        assert sensor1_start.second == 0

        # End = 02:01:00
        assert sensor1_end.hour == 2
        assert sensor1_end.minute == 1
        assert sensor1_end.second == 0

        # Start = 21:59:00
        assert sensor2_start.hour == 21
        assert sensor2_start.minute == 59
        assert sensor2_start.second == 0

        # End = 00:00:00
        assert sensor2_end.hour == 0
        assert sensor2_end.minute == 0
        assert sensor2_end.second == 0
예제 #14
0
    def test_measure(self):
        """Test the history statistics sensor measure."""
        t0 = dt_util.utcnow() - timedelta(minutes=40)
        t1 = t0 + timedelta(minutes=20)
        t2 = dt_util.utcnow() - timedelta(minutes=10)

        # Start     t0        t1        t2        End
        # |--20min--|--20min--|--10min--|--10min--|
        # |---off---|---on----|---off---|---on----|

        fake_states = {
            'binary_sensor.test_id': [
                ha.State('binary_sensor.test_id', 'on', last_changed=t0),
                ha.State('binary_sensor.test_id', 'off', last_changed=t1),
                ha.State('binary_sensor.test_id', 'on', last_changed=t2),
            ]
        }

        start = Template('{{ as_timestamp(now()) - 3600 }}', self.hass)
        end = Template('{{ now() }}', self.hass)

        sensor1 = HistoryStatsSensor(
            self.hass, 'binary_sensor.test_id', 'on', start, end, None, 'Test')

        sensor2 = HistoryStatsSensor(
            self.hass, 'unknown.id', 'on', start, end, None, 'Test')

        with patch('homeassistant.components.history.'
                   'state_changes_during_period', return_value=fake_states):
            with patch('homeassistant.components.history.get_state',
                       return_value=None):
                sensor1.update()
                sensor2.update()

        self.assertEqual(round(sensor1.value, 3), 0.5)
        self.assertEqual(round(sensor2.value, 3), 0)
        self.assertEqual(sensor1.device_state_attributes['ratio'], '50.0%')
예제 #15
0
    def test_measure(self):
        """Test the history statistics sensor measure."""
        t0 = dt_util.utcnow() - timedelta(minutes=40)
        t1 = t0 + timedelta(minutes=20)
        t2 = dt_util.utcnow() - timedelta(minutes=10)

        # Start     t0        t1        t2        End
        # |--20min--|--20min--|--10min--|--10min--|
        # |---off---|---on----|---off---|---on----|

        fake_states = {
            'binary_sensor.test_id': [
                ha.State('binary_sensor.test_id', 'on', last_changed=t0),
                ha.State('binary_sensor.test_id', 'off', last_changed=t1),
                ha.State('binary_sensor.test_id', 'on', last_changed=t2),
            ]
        }

        start = Template('{{ as_timestamp(now()) - 3600 }}', self.hass)
        end = Template('{{ now() }}', self.hass)

        sensor1 = HistoryStatsSensor(
            self.hass, 'binary_sensor.test_id', 'on', start, end, None,
            'time', 'Test')

        sensor2 = HistoryStatsSensor(
            self.hass, 'unknown.id', 'on', start, end, None, 'time', 'Test')

        sensor3 = HistoryStatsSensor(
            self.hass, 'binary_sensor.test_id', 'on', start, end, None,
            'count', 'test')

        sensor4 = HistoryStatsSensor(
            self.hass, 'binary_sensor.test_id', 'on', start, end, None,
            'ratio', 'test')

        assert sensor1._type == 'time'
        assert sensor3._type == 'count'
        assert sensor4._type == 'ratio'

        with patch('homeassistant.components.history.'
                   'state_changes_during_period', return_value=fake_states):
            with patch('homeassistant.components.history.get_state',
                       return_value=None):
                sensor1.update()
                sensor2.update()
                sensor3.update()
                sensor4.update()

        assert sensor1.state == 0.5
        assert sensor2.state is None
        assert sensor3.state == 2
        assert sensor4.state == 50
예제 #16
0
    def test_measure(self):
        """Test the history statistics sensor measure."""
        t0 = dt_util.utcnow() - timedelta(minutes=40)
        t1 = t0 + timedelta(minutes=20)
        t2 = dt_util.utcnow() - timedelta(minutes=10)

        # Start     t0        t1        t2        End
        # |--20min--|--20min--|--10min--|--10min--|
        # |---off---|---on----|---off---|---on----|

        fake_states = {
            'binary_sensor.test_id': [
                ha.State('binary_sensor.test_id', 'on', last_changed=t0),
                ha.State('binary_sensor.test_id', 'off', last_changed=t1),
                ha.State('binary_sensor.test_id', 'on', last_changed=t2),
            ]
        }

        start = Template('{{ as_timestamp(now()) - 3600 }}', self.hass)
        end = Template('{{ now() }}', self.hass)

        sensor1 = HistoryStatsSensor(self.hass, 'binary_sensor.test_id', 'on',
                                     start, end, None, 'time', 'Test')

        sensor2 = HistoryStatsSensor(self.hass, 'unknown.id', 'on', start, end,
                                     None, 'time', 'Test')

        sensor3 = HistoryStatsSensor(self.hass, 'binary_sensor.test_id', 'on',
                                     start, end, None, 'count', 'test')

        sensor4 = HistoryStatsSensor(self.hass, 'binary_sensor.test_id', 'on',
                                     start, end, None, 'ratio', 'test')

        assert sensor1._type == 'time'
        assert sensor3._type == 'count'
        assert sensor4._type == 'ratio'

        with patch(
                'homeassistant.components.history.'
                'state_changes_during_period',
                return_value=fake_states):
            with patch('homeassistant.components.history.get_state',
                       return_value=None):
                sensor1.update()
                sensor2.update()
                sensor3.update()
                sensor4.update()

        assert sensor1.state == 0.5
        assert sensor2.state is None
        assert sensor3.state == 2
        assert sensor4.state == 50