Skip to content

Commit d915878

Browse files
committed
Implement
Implements: Fix issue 80: Weather packet decoding. rossengeorgiev#81
1 parent 09ac002 commit d915878

6 files changed

Lines changed: 32 additions & 22 deletions

File tree

aprslib/parsing/common.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,15 @@ def parse_data_extentions(body):
138138
# course speed bearing nrq
139139
# Page 27 of the spec
140140
# format: 111/222/333/444text
141+
# Speed is in mph
141142
match = re.findall(r"^([0-9 \.]{3})/([0-9 \.]{3})", body)
142143
if match:
143144
cse, spd = match[0]
144145
body = body[7:]
145146
if cse.isdigit() and cse != "000":
146147
parsed.update({'course': int(cse) if 1 <= int(cse) <= 360 else 0})
147148
if spd.isdigit() and spd != "000":
148-
parsed.update({'speed': int(spd)*1.852})
149+
parsed.update({'speed': int(spd)})
149150

150151
# DF Report format
151152
# Page 29 of teh spec

aprslib/parsing/position.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,19 @@ def parse_position(packet_type, body):
6363
# attempt to parse winddir/speed
6464
# Page 92 of the spec
6565
body, result = parse_data_extentions(body)
66-
parsed.update(result)
66+
wind_speed = result.get("speed")
67+
wind_direction = result.get("course")
6768

6869
logger.debug("Attempting to parse weather report from comment")
6970
body, result = parse_weather_data(body)
71+
if wind_speed:
72+
result.update({
73+
'wind_speed': wind_speed,
74+
})
75+
if wind_direction:
76+
result.update({
77+
'wind_direction': wind_direction,
78+
})
7079
parsed.update({
7180
'comment': body.strip(' '),
7281
'weather': result,
@@ -204,5 +213,3 @@ def parse_normal(body):
204213
})
205214

206215
return (body, parsed)
207-
208-

aprslib/parsing/weather.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
]
88

99
# constants
10-
wind_multiplier = 0.44704
11-
rain_multiplier = 0.254
10+
# wind is in miles per hour
11+
wind_multiplier = 1
12+
# Spec 1.1 Rain is in hundredths of an inch.
13+
rain_multiplier = 0.01
1214

1315
key_map = {
1416
'g': 'wind_gust',

tests/test_parse_common.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ def test_course_speed(self):
253253
self.assertEqual(remaining, '/text')
254254
self.assertEqual(parsed, {
255255
'course': 123,
256-
'speed': 100*1.852,
256+
'speed': 100,
257257
})
258258

259259
def test_course_speed_spaces(self):
@@ -305,7 +305,7 @@ def test_empty_bearing_nrq(self):
305305
self.assertEqual(remaining, 'text')
306306
self.assertEqual(parsed, {
307307
'course': 111,
308-
'speed': 100*1.852,
308+
'speed': 100,
309309
})
310310

311311
body = "111/100/2 /33.text"
@@ -314,7 +314,7 @@ def test_empty_bearing_nrq(self):
314314
self.assertEqual(remaining, 'text')
315315
self.assertEqual(parsed, {
316316
'course': 111,
317-
'speed': 100*1.852,
317+
'speed': 100,
318318
})
319319

320320
def test_course_speed_bearing_nrq_empty_cse_speed(self):
@@ -335,7 +335,7 @@ def test_course_speed_bearing_nrq(self):
335335
self.assertEqual(remaining, 'text')
336336
self.assertEqual(parsed, {
337337
'course': 123,
338-
'speed': 100*1.852,
338+
'speed': 100,
339339
'bearing': 234,
340340
'nrq': 345,
341341
})

tests/test_parse_position.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def test_position_packet_only_weather_valid(self):
3030
'wind_gust': 0.0,
3131
'temperature': 18.88888888888889,
3232
'rain_1h': 0.0,
33-
'rain_24h': 0.0
33+
'rain_24h': 0.0,
3434
}
3535
}
3636

@@ -50,14 +50,14 @@ def test_position_packet_data_ext_and_weather_valid(self):
5050
'symbol_table': '/',
5151
'latitude': 49.05833333333333,
5252
'longitude': -72.02916666666667,
53-
'course': 90,
54-
'speed': 1*1.852,
5553
'comment': '...dUII',
5654
'weather': {
5755
'wind_gust': 0.0,
5856
'temperature': 18.88888888888889,
5957
'rain_1h': 0.0,
60-
'rain_24h': 0.0
58+
'rain_24h': 0.0,
59+
'wind_direction': 90,
60+
'wind_speed': 1,
6161
}
6262
}
6363

@@ -77,13 +77,13 @@ def test_position_packet_optional_speed(self):
7777
'symbol_table': '/',
7878
'latitude': 49.05833333333333,
7979
'longitude': -72.02916666666667,
80-
'course': 90,
8180
'comment': '...dUII',
8281
'weather': {
8382
'wind_gust': 0.0,
8483
'temperature': 18.88888888888889,
8584
'rain_1h': 0.0,
86-
'rain_24h': 0.0
85+
'rain_24h': 0.0,
86+
'wind_direction': 90
8787
}
8888
}
8989

@@ -103,13 +103,13 @@ def test_position_packet_optional_course(self):
103103
'symbol_table': '/',
104104
'latitude': 49.05833333333333,
105105
'longitude': -72.02916666666667,
106-
'speed': 1*1.852,
107106
'comment': '...dUII',
108107
'weather': {
109108
'wind_gust': 0.0,
110109
'temperature': 18.88888888888889,
111110
'rain_1h': 0.0,
112-
'rain_24h': 0.0
111+
'rain_24h': 0.0,
112+
'wind_speed': 1,
113113
}
114114
}
115115

@@ -153,13 +153,13 @@ def test_position_packet_optional_course(self):
153153
'symbol_table': '/',
154154
'latitude': 49.05833333333333,
155155
'longitude': -72.02916666666667,
156-
'speed': 1*1.852,
157156
'comment': '...dUII',
158157
'weather': {
159158
'wind_gust': 0.0,
160159
'temperature': 18.88888888888889,
161160
'rain_1h': 0.0,
162-
'rain_24h': 0.0
161+
'rain_24h': 0.0,
162+
'wind_speed': 1,
163163
}
164164
}
165165

tests/test_parse_weather_data.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
from aprslib.parsing import parse_weather_data
44
from aprslib.parsing import parse
55

6-
wind_multiplier = 0.44704
7-
mm_multiplier = 0.254
6+
wind_multiplier = 1
7+
mm_multiplier = 0.010
88

99
class ParseCommentWeather(unittest.TestCase):
1010
def setUp(self):

0 commit comments

Comments
 (0)