platypush/platypush/schemas/gps.py

170 lines
3.8 KiB
Python

from marshmallow import EXCLUDE, fields, pre_load
from marshmallow.schema import Schema
from platypush.schemas import DateTime
class GpsDeviceSchema(Schema):
"""
Schema for a GPS device.
"""
# pylint: disable=too-few-public-methods
class Meta: # type: ignore
"""
Exclude unknown fields from the deserialized output.
"""
unknown = EXCLUDE
path = fields.String(
required=True,
metadata={
"description": "Device path",
"example": "/dev/ttyUSB0",
},
)
activated = DateTime(
metadata={
"description": "Device activation status",
"example": True,
},
)
native = fields.Boolean(
metadata={
"description": "Device native status",
"example": False,
},
)
baudrate = fields.Integer(
data_key="bps",
metadata={
"description": "Device baudrate",
"example": 9600,
},
)
parity = fields.String(
metadata={
"description": "Device parity",
"example": "N",
},
)
stopbits = fields.Integer(
metadata={
"description": "Device stopbits",
"example": 1,
},
)
cycle = fields.Integer(
metadata={
"description": "Device cycle",
"example": 1,
},
)
driver = fields.String(
metadata={
"description": "Device driver",
"example": "NMEA",
},
)
subtype = fields.String(
metadata={
"description": "Device subtype",
"example": "AXN_2.31_3339_13101700,5632,PA6H,1.0",
},
)
mode = fields.String(
validate=lambda mode: mode in ["NO_FIX", "TWO_D", "THREE_D"],
metadata={
"description": "Device mode, one of NO_FIX, TWO_D, THREE_D",
"example": "3D",
},
)
@pre_load
def pre_load(self, data, **_):
from platypush.plugins.gps import DeviceMode
if data and data.get("mode"):
data["mode"] = DeviceMode(data["mode"]).value
return data
class GpsStatusSchema(Schema):
"""
Schema for the GPS status.
"""
latitude = fields.Float(
metadata={
"description": "Latitude",
"example": 45.4642,
},
)
longitude = fields.Float(
metadata={
"description": "Longitude",
"example": 9.1900,
},
)
altitude = fields.Float(
metadata={
"description": "Altitude (in meters)",
"example": 100,
},
)
speed = fields.Float(
metadata={
"description": "Measured speed, if available (in km/h)",
"example": 10,
},
)
satellites_used = fields.Integer(
metadata={
"description": "Number of satellites used for the fix",
"example": 4,
},
)
timestamp = DateTime(
metadata={
"description": "Timestamp of the last GPS update",
"example": "2021-08-01T00:00:00",
},
)
devices = fields.Dict(
keys=fields.String(),
values=fields.Nested(GpsDeviceSchema),
metadata={
"description": "Available GPS devices",
"example": {
"/dev/ttyUSB0": {
"path": "/dev/ttyUSB0",
"activated": "2021-08-01T00:00:00",
"native": False,
"baudrate": 9600,
"parity": "N",
"stopbits": 1,
"cycle": 1,
"driver": "NMEA",
"subtype": "AXN_2.31_3339_13101700,5632,PA6H,1.0",
"mode": "3D",
}
},
},
)