add_new_sample()   B
last analyzed

Complexity

Conditions 6

Size

Total Lines 40

Duplication

Lines 0
Ratio 0 %

Importance

Changes 7
Bugs 0 Features 0
Metric Value
c 7
b 0
f 0
dl 0
loc 40
rs 7.5384
cc 6
1
import datetime
2
import logging
3
4
from app.database import db
5
from app.models import Sample, Sensor
6
7
logger = logging.getLogger(__name__)
8
9
10
def add_new_sample(sensor_id, dt, svalue, deltaminutes=10):
11
    """
12
    Adds a new sample with an associacted remote sensor
13
    if there hasn't been a sample recorded within the last deltaminutes
14
    (default is 10).
15
    Arguments:
16
        sensor_id (int): Primary key for sensor
17
        dt (datetime): Datetime of sample
18
        svalue (float): Value of sample
19
    """
20
    delta = datetime.datetime.now() - datetime.timedelta(minutes=deltaminutes)
21
    sample = Sample.query.filter_by(sensor_id=sensor_id)\
22
                         .order_by(Sample.datetime.desc()).first()
23
    if sample is None or (sample.datetime < delta and
24
                          (sample.datetime != dt.replace(tzinfo=None))):
25
        new_sample = Sample(sensor_id=sensor_id,
26
                            value=svalue,
27
                            datetime=dt)
28
        db.session.add(new_sample)
29
        db.session.commit()
30
        logger.debug('Saved sample (%s - %s - %s) for sensor %s',
31
                     new_sample.id,
32
                     svalue,
33
                     dt,
34
                     sensor_id)
35
    else:
36
        message = ''
37
        if sample.datetime == dt.replace(tzinfo=None):
38
            message = message + 'Sample times are the same. '
39
        if sample.datetime < delta:
40
            message = message + 'Last sample was more than {0} min ago '.format(deltaminutes)
41
        else:
42
            message = message + 'Last sample was less than {0} min ago '.format(deltaminutes)
43
        logger.warning('Discarded sample (%s - %s) for sensor %s, compared to (%s - %s). %s',
44
                       svalue,
45
                       dt,
46
                       sensor_id,
47
                       sample.value,
48
                       sample.datetime,
49
                       message)
50
51
52
class RemoteGage(object):
53
    """
54
    Base abstraction of the gage updating process
55
    """
56
    def sensor(self, sensor_id):
57
        """
58
        Returns selected sensor object
59
        """
60
        return Sensor.query.get(sensor_id)
61
62
    def get_sample(self, sensor_id):
63
        """
64
        Get a single sample and save latest values
65
        """
66
        raise NotImplementedError
67
68
    def get_multiple_samples(self, sensor_ids):
69
        """
70
        Smartly get multiple samples if possible and save latest values
71
        """
72
        for sensor_id in sensor_ids:
73
            self.get_sample(sensor_id)
74