Skip to main content

Record arbitrary sensors periodically in an asynchronous manner. Control their properties in real time from CLI. Graph/view tools to visualize live data/images are also provided.

Project description

About

Periodic REcording and Visualization of sensor Objects

This package provides base classes to rapidly create interactive data recording for various applications (e.g. recording of temperature, time-lapses with cameras etc.). Sensors are read in a asynchronous fashion and can have different time intervals for data reading (or be continuous, i.e. as fast as possible). Tools for graphical visualizations of data during recording are also provided.

Install

pip install prevo

Main Contents

For using the package for asynchronous recording of data, three base classes must/can be subclassed:

  • SensorBase (requires subclassing)
  • RecordingBase (requires subclassing)
  • RecordBase (can be used as is or be subclassed)

A minimal example is provided below, to record pressure and temperature asynchronously, assuming the user already has classes (Temp, Gauge) to take single-point measurements (it could be functions as well). Let's assume that the pressure measurement also has an averaging parameter to smooth the data.

  1. Define the sensors

    from prevo.record import SensorBase
    
    
    class TemperatureSensor(SensorBase):
    
        name = 'T'
    
        def _read(self):
            """This method must have no arguments"""
            return Temp.read()
    
    
    class PressureSensor(SensorBase):
    
        name = 'P'
    
        def __init__(self):
            self.avg = 10  # default value
    
        def _read(self):
            return Gauge.read(averaging=self.avg)
    
  2. Define the individual recordings

    Note: subclassing can help significantly reduce the code below.

    from prevo.record import RecordingBase
    
    
    class RecordingT(RecordingBase):
        """Recording temperature data periodically"""
    
        def __init__(self):
    
            super().__init__(Sensor=TemperatureSensor,
                             dt=10)  # by default, record every 10 sec
            self.file = 'Temperature.txt'
            # Below, this allows the user to change time interval in real time
            self.controlled_properties = 'timer.interval',
    
        def init_file(self, file):
            """Define if you want to write column titles etc.
            (assuming the file is already open)
            """
            pass
    
        def format_measurement(self, data):
            """Define here how to format data from Sensor._read().
            (e.g., add time information, etc.). Returns a 'measurement'."""
            pass
    
        def save(self, measurement, file):
            """Define here how to save the measurement above into self.file.
            (assuming the file is already open)
            """
            pass
    
    
    class RecordingP(RecordingBase):
        """Recording pressure data periodically"""
    
        def __init__(self):
    
            super().__init__(Sensor=PressureSensor,
                             dt=1)  # by default, record every second
            self.file = 'Pressure.txt'
            # Here we can also control the averaging in real time
            self.controlled_properties = 'timer.interval', 'sensor.avg'
    
        def init_file(self, file):
            """same as above"""
            pass
    
        def format_measurement(self, data):
            """same as above"""
            pass
    
        def save(self):
            """same as above"""
            pass
    
  3. Define and start asynchronous recording

    from prevo.record import RecordBase
    
    
    class Record(RecordBase):
        """Options exist to add metadata saving or graphing"""
        pass
    
    
    # Keys must correspond to sensor names
    recordings = {'T': RecordingT(), 'P': RecordingP()}
    
    # All properties that can be controlled by CLI
    # (keys must correspond to some controlled_properties)
    properties = {'timer.interval': {'repr': 'Δt (s)',
                                     'commands': ('dt',),
                                     },
                  'sensor.avg': {'repr': 'Averaging',
                                 'commands': ('avg',),
                                 }
                  }
    
    # Start recording. A CLI will appear; type '?' for help
    Record(recordings=recordings, properties=properties).start()
    

Note: context managers also possible (i.e. define __enter__ and __exit__ in Sensor class) e.g. if sensors have to be opened once at the beginning and closed in the end; this is managed automatically by RecordBase if a context manager is defined.

See docstrings for more help.

Additional tools

Some elements are also provided to simplify and/or extend the classes above:

  • read / save with CSV files (see prevo.csv)
  • plot numerical data in real time (see prevo.plot)
  • live view images from camera-like sensors (see prevo.viewers)
  • some tools to format measurements for Record-like classes (see prevo.measurements)

See docstrings for more help.

Misc. info

Module requirements

Modules outside of standard library

(installed automatically by pip if necessary)

  • tqdm
  • tzlocal < 3.0
  • oclock >= 1.2.2 (timing tools)
  • clivo >= 0.2.0 (command line interface)
  • matplotlib >= 3.1 (due to cache_frame_data option in FuncAnimation)
  • pandas (optional, for csv loading methods)
  • opencv-python (optional, for specific camera viewers)

Python requirements

Python : >= 3.6

Author

Olivier Vincent

(ovinc.py@gmail.com)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

prevo-0.7.0.tar.gz (368.3 kB view details)

Uploaded Source

Built Distribution

prevo-0.7.0-py3-none-any.whl (39.6 kB view details)

Uploaded Python 3

File details

Details for the file prevo-0.7.0.tar.gz.

File metadata

  • Download URL: prevo-0.7.0.tar.gz
  • Upload date:
  • Size: 368.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.3.1.post20201107 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.5

File hashes

Hashes for prevo-0.7.0.tar.gz
Algorithm Hash digest
SHA256 13841cabd69010ae6e8d8aa4fc29a296a282c3ef701703db80dc3f91e233dab5
MD5 3e8d163ede3393f46e4dcb1078071564
BLAKE2b-256 eb8ee5781bda983b9c72e389255679cbd2e553ecded6b7b96f9bfe6973d9ce17

See more details on using hashes here.

File details

Details for the file prevo-0.7.0-py3-none-any.whl.

File metadata

  • Download URL: prevo-0.7.0-py3-none-any.whl
  • Upload date:
  • Size: 39.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.3.1.post20201107 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.5

File hashes

Hashes for prevo-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c13040cdf4b8c6f85f7feedd08c0f32a4656571eb3efc9d08ebe29a914ab5e22
MD5 94a16baed00130bdce4df77140d7f9a7
BLAKE2b-256 f44fdb36c294281b32745eaaf1941e134b8c2aefe4cc03ca687c4e52da99503b

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page