platypush/platypush/schemas/weather/buienradar.py

169 lines
3.9 KiB
Python

from marshmallow import EXCLUDE, fields
from marshmallow.schema import Schema
from platypush.schemas import DateTime
class WeatherSchema(Schema):
"""
Schema for weather data.
"""
class Meta: # pylint: disable=too-few-public-methods
"""
Weather schema metadata.
"""
unknown = EXCLUDE
time = DateTime(
required=True,
attribute='datetime',
metadata={
'description': 'Date and time of the weather data',
'example': '2020-01-01T00:00:00+00:00',
},
)
summary = fields.Function(
lambda obj: obj.get('condition', {}).get('exact', 'Unknown'),
metadata={
'description': 'Summary of the weather condition',
'example': 'Cloudy',
},
)
image = fields.Function(
lambda obj: obj.get('condition', {}).get('image'),
metadata={
'description': 'Image URL representing the weather condition',
'example': 'https://www.buienradar.nl/resources/images/icons/weather/30x30/cc.png',
},
)
precip_intensity = fields.Float(
attribute='rainlasthour',
metadata={
'description': 'Amount of precipitation in the last hour in mm/h',
'example': 0.0,
},
)
precip_type = fields.Function(
lambda obj: 'snow' if obj.get('snow') else 'rain',
metadata={
'description': 'Type of precipitation',
'example': 'rain',
},
)
temperature = fields.Float(
metadata={
'description': 'Temperature in Celsius',
'example': 10.0,
},
)
apparent_temperature = fields.Float(
attribute='feeltemperature',
metadata={
'description': 'Apparent temperature in Celsius',
'example': 9.0,
},
)
humidity = fields.Float(
metadata={
'description': 'Humidity percentage, between 0 and 100',
'example': 30,
},
)
pressure = fields.Float(
metadata={
'description': 'Pressure in hPa',
'example': 1000.0,
},
)
rain_chance = fields.Float(
attribute='rainchance',
metadata={
'description': 'Chance of rain in percentage, between 0 and 100',
'example': 30,
},
)
wind_speed = fields.Float(
attribute='windspeed',
metadata={
'description': 'Wind speed in the configured unit of measure',
'example': 10.0,
},
)
wind_direction = fields.Float(
attribute='windazimuth',
metadata={
'description': 'Wind direction in degrees',
'example': 180,
},
)
wind_gust = fields.Float(
attribute='windgust',
metadata={
'description': 'Wind gust in the configured unit of measure',
'example': 15.0,
},
)
visibility = fields.Float(
metadata={
'description': 'Visibility in meters',
'example': 2000.0,
},
)
units = fields.Constant(
'metric',
metadata={
'description': 'Unit of measure',
'example': 'metric',
},
)
class PrecipitationForecastSchema(Schema):
"""
Schema for precipitation forecast data.
"""
class Meta: # pylint: disable=too-few-public-methods
"""
Precipitation forecast schema metadata.
"""
unknown = EXCLUDE
timeframe = fields.Integer(
metadata={
'description': 'Time frame in minutes',
'example': 60,
},
)
total = fields.Float(
metadata={
'description': 'Total precipitation in mm/h',
'example': 0.5,
},
)
average = fields.Float(
metadata={
'description': 'Average precipitation in mm/h',
'example': 0.25,
},
)