EvaluationEfficiencyOptimiz.../davisAPI/PyWeather/weather/stations/station.py

105 lines
3.5 KiB
Python
Raw Normal View History

2024-10-08 17:47:23 +04:00
"""Base class for all Weather Station implementations."""
import datetime
import time as time_module
from ..units.temp import fahrenheit_to_celsius, celsius_to_fahrenheit
__all__ = ['WeatherPoint', 'Station']
class WeatherPoint:
"""
Represents a single weather measurement.
"""
time: datetime.datetime = None
_temperature_c: float = None # Temperature in Celsius
_temperature_f: float = None # Temperature in Fahrenheit
humidity: int = None # Relative humidity in percent
dew_point_f: float = None # Dew point in Fahrenheit
pressure: float = None # Atmospheric pressure
rain_rate_in: float = None # Rain rate in inches
rain_day_in: float = None # Rain inches so far today
wind_speed_mph: float = None # Wind's speed in miles per hour
wind_direction: int = None # Wind's direction, in degrees
def __init__(
self,
time=None,
temperature_c: float = None,
temperature_f: float = None,
humidity: int = None,
dew_point_f: float = None,
pressure: float = None,
rain_rate_in: float = None,
rain_day_in: float = None,
wind_speed_mph: float = None,
wind_direction: int = None,
):
self.time = time or time_module.gmtime()
if temperature_c is not None and temperature_f is not None:
raise ValueError('Only one of temperature_c and temperature_f can be passed.')
if temperature_c is not None:
self.temperature_c = temperature_c
else:
self.temperature_f = temperature_f
self.humidity = humidity
self.dew_point_f = dew_point_f
self.pressure = pressure
self.rain_rate_in = rain_rate_in
self.rain_day_in = rain_day_in
self.wind_speed_mph = wind_speed_mph
self.wind_direction = wind_direction
@property
def temperature_f(self) -> float:
if self._temperature_f is not None:
return self._temperature_f
elif self._temperature_c is not None:
return celsius_to_fahrenheit(self._temperature_c)
@temperature_f.setter
def temperature_f(self, value: float):
self._temperature_f = value
self._temperature_c = None
@property
def temperature_c(self) -> float:
if self._temperature_c is not None:
return self._temperature_c
elif self._temperature_f is not None:
return fahrenheit_to_celsius(self._temperature_f)
@temperature_c.setter
def temperature_c(self, value: float):
self._temperature_f = None
self._temperature_c = value
def __eq__(self, other):
return (
self.time == other.time and
self._temperature_c == other._temperature_c and
self._temperature_f == other._temperature_f and
self.humidity == other.humidity and
self.dew_point_f == other.dew_point_f and
self.pressure == other.pressure and
self.rain_rate_in == other.rain_rate_in and
self.rain_day_in == other.rain_day_in and
self.wind_speed_mph == other.wind_speed_mph and
self.wind_direction == other.wind_direction
)
def __repr__(self):
return str(self.__dict__)
class Station:
"""Base class for all Weather Station implementations."""
def get_reading(self) -> WeatherPoint:
"""Returns a single weather point."""
raise NotImplementedError('Not implemented')