From aa2b18f3ddbedae6699e5e7e425497d57a31a0b6 Mon Sep 17 00:00:00 2001 From: XANTRONIX Industrial Date: Sat, 1 Mar 2025 12:30:30 -0500 Subject: [PATCH] Allow complete parsing of TTAA data --- lib/xmet/rawins.py | 60 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/lib/xmet/rawins.py b/lib/xmet/rawins.py index a519af8..e049827 100644 --- a/lib/xmet/rawins.py +++ b/lib/xmet/rawins.py @@ -48,7 +48,10 @@ class RawinsObs(): } def parse_timestamp(self, value: str): - day = int(value[0:2]) - 50 + if value[0:2] == '//': + return None + + day = int(value[0:2]) hour = int(value[2:4]) now = datetime.datetime.now(datetime.UTC) @@ -57,7 +60,7 @@ class RawinsObs(): 'timestamp': datetime.datetime( year = now.year, month = now.month, - day = day + day = day if day < 51 else day - 50 ) } @@ -68,13 +71,26 @@ class RawinsObs(): } def parse_temp_dewpoint(self, value: str): - tenths = int(value[2]) - sign = -1 if tenths % 1 == 0 else 1 + if value[2] == '/': + return { + 'temp': None, + 'dewpoint': None + } - temp = sign * 0.1 * float(value[0:3]) - dda = int(value[3:5]) - dd = dda * 0.1 if dda <= 50 else dda - 50 - dewpoint = temp - dd + if value[0:2] == '//': + temp = None + else: + tenths = int(value[2]) + sign = -1 if tenths % 1 == 0 else 1 + + temp = sign * 0.1 * float(value[0:3]) + + if value[3:5] == '//': + dewpoint = None + else: + dda = int(value[3:5]) + dd = dda * 0.1 if dda <= 50 else dda - 50 + dewpoint = temp - dd return { 'temp': temp, @@ -85,6 +101,9 @@ class RawinsObs(): base_speed = 0 base_dir = 0 + if value == '=': + return + if value[2] == '1': base_speed = 100 elif value[2] == '5': @@ -93,9 +112,25 @@ class RawinsObs(): base_speed = 100 base_dir = 5 + if value[0:3] == '///': + return { + 'dir': None, + 'speed': None + } + + if value[0:2] == '//': + wind_dir = None + else: + wind_dir = float(value[0:3]) + base_dir + + if value[3:5] == '//': + wind_speed = None + else: + wind_speed = float(value[3:5]) + base_speed + return { - 'dir': float(value[0:3]) + base_dir, - 'speed': float(value[4:]) + base_speed + 'dir': wind_dir, + 'speed': wind_speed } def parse_height_pressure(self, value: str): @@ -123,7 +158,7 @@ class RawinsObs(): samples = list() for i in range(2, len(self.values), 3): - if len(self.values) <= i+2: + if len(self.values) <= i+2 or self.values[i][-1] == '=': break samples.append({ @@ -132,6 +167,9 @@ class RawinsObs(): 'wind': self.parse_wind(self.values[i+2]) }) + if self.values[1][0:3] == 'NIL': + return None + return { 'timestamp': self.parse_timestamp(self.values[0]), 'station': int(self.values[1]),