158 lines
3.7 KiB
Python
158 lines
3.7 KiB
Python
from marshmallow import EXCLUDE, fields
|
|
from marshmallow.schema import Schema
|
|
|
|
|
|
class WeatherSchema(Schema):
|
|
"""
|
|
Schema for weather data.
|
|
"""
|
|
|
|
class Meta: # pylint: disable=too-few-public-methods
|
|
"""
|
|
Weather schema metadata.
|
|
"""
|
|
|
|
unknown = EXCLUDE
|
|
|
|
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,
|
|
},
|
|
)
|