Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

External device meta data #200

Open
bessman opened this issue Jul 2, 2021 · 1 comment
Open

External device meta data #200

bessman opened this issue Jul 2, 2021 · 1 comment

Comments

@bessman
Copy link
Collaborator

bessman commented Jul 2, 2021

Devices in pslab.external, such as sensors, motors, and displays, should include some kind of meta data so that front ends like pslab-desktop and pslab-cli can use them without large amounts of custom code.

One possible solution is a JSON file for every supported device, with a structure like this:

{
"name": "MLX90614",
"modes":
    {
    "thermometer":
        {
        "input": 
            {
            "name": "source",
            "type": "selection",
            "options": ["object", "ambient"],
            },
        "output": 
            {
            "name": "temperature",
            "type": "float", 
            "range": [-127, 128],
            "unit": "degC",
            },
        },
    },
}

This file specifies that the MLX90614 class has:

  • A single mode called "thermometer".
  • A set method which accepts "source" followed by either "object" or "ambient" as its argument.
  • A get method which accepts "temperature" and returns a float between -127 degC and 128 degC.

A more complex example:

{
"name": "BMP180",
"modes":
    {
    "thermometer":
        {
        "output": 
            {
            "name": "temperature",
            "type": "float", 
            "range": [-127, 128],
            "unit": "degC",
            },
        "default": 1,
        },
    "pressure meter":
        {
        "output": 
            {
            "name": "pressure",
            "type": "float", 
            "range": [0, 1e7],
            "unit": "Pa",
            },
        "default": 0,
        },
    "altitude meter":
        {
        "input":
            {
            "name": "baseline",
            "type": "float",
            "range": [0, 1e7],
            "unit": "Pa",
            },
        "output": 
            {
            "name": "altitude",
            "type": "float", 
            "range": [-1e2, 1e4],
            "unit": "m",
            },
        "default": 0,
        },
    },
}

This file specifies that the BMP180 class has:

  • Multiple modes, which can be selected by setting the BMP180.mode property, the default being "thermometer".
  • No setters in the "thermometer" or "pressure meter" modes.

By reading these files, the front end does not need to know any details about the sensors and requires no custom code. @orangecms what do you think?

@nkpro2000sr
Copy link
Member

Also Adafruit's drivers which uses CircuitPython-busio can be included with external sensors, since pslab-python has busio now.

Example:

# pslab/external/busio/si7021.py
import adafruit_si7021
from pslab.bus import busio

class SI7021(adafruit_si7021.SI7021):
    _ADDRESS = 0x40

    def __init__(self, **args):
        self._ADDRESS = args.get('address', self._ADDRESS)
        self._i2c = args.get('i2c_buss', busio.I2C())
        super().__init__(self._i2c, self._ADDRESS)
{
"name": "SI7021",
"modes":
    {
    "thermometer":
        {
        "output": 
            {
            "name": "temperature",
            "type": "float", 
            "range": [-10, 85],
            "unit": "degC",
            },
        "default": 1,
        },
    "moisture meter":
        {
        "output": 
            {
            "name": "relative_humidity",
            "type": "int", 
            "range": [0, 80],
            "unit": "% RH",
            },
        "default": 0,
        },
    },
"dependencies" :
    [
        "adafruit-circuitpython-si7021",
    ],
}

We also need "dependencies" to check/install/manage dependencies for these sensors.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants