diff --git a/README.md b/README.md index db8596d..9de28bf 100644 --- a/README.md +++ b/README.md @@ -55,12 +55,14 @@ available commands: [db] init Initialize the database. - updateddb Update the ddb data. + update_ddb_file Update devices with data from local file. + update_ddb_ogn Update devices with data from ogn. [gateway] run Run the aprs client. [logbook] + compute Compute takeoffs and landings. show Show a logbook for located at given position. [show.receiver] @@ -78,17 +80,17 @@ The task server must be running for `db.updateddb`. - [x] Document/Improve cli commands - [ ] Separate settings from module (currently at ogn/command/dbutils.py) - [ ] Enable granular data acquisition (eg. store receiver beacons only) -- [ ] Future Database-Migrations: Use Alembic? - - [ ] Rename 'Flarm' to 'Device'? - - [ ] Rename self.heared\_aircraft\_IDs (lowercase) in aircraft\_beacon - - [ ] Rename self.heared\_aircraft\_IDs -- [ ] Fix command/logbook.py (@Meisterschueler?) +- [x] Future Database-Migrations: Use Alembic? + - [x] Rename 'Flarm' to 'Device'? + - [x] Rename self.heared\_aircraft\_IDs (lowercase) in aircraft\_beacon + - [x] Rename self.heared\_aircraft\_IDs +- [x] Fix command/logbook.py (@Meisterschueler?) - [ ] Introduce scheduled tasks with 'celery beat' (eg. updateddb) ### Scheduled tasks - ogn.collect.fetchddb (generate Flarm table) - ogn.collect.receiver (generate Receiver table) -- ogn.collect.logbook (generate TaoffLanding table) +- ogn.collect.logbook (generate TakeoffLanding table) ## How to use virtualenv ``` diff --git a/alembic/versions/2c7144443d8_aircraft_beacon_changes.py b/alembic/versions/2c7144443d8_aircraft_beacon_changes.py new file mode 100644 index 0000000..6ded4dd --- /dev/null +++ b/alembic/versions/2c7144443d8_aircraft_beacon_changes.py @@ -0,0 +1,28 @@ +"""logbook changes + +Revision ID: 2c7144443d8 +Revises: 104107d119d +Create Date: 2015-11-27 22:05:31.417449 + +""" + +# revision identifiers, used by Alembic. +revision = '2c7144443d8' +down_revision = '104107d119d' +branch_labels = None +depends_on = None + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.alter_column('aircraft_beacon', 'real_id', new_column_name='real_address') + op.add_column('aircraft_beacon', sa.Column('flight_state', sa.SmallInteger)) + op.create_index('ix_aircraft_beacon_flight_state', 'aircraft_beacon', ['flight_state']) + + +def downgrade(): + op.alter_column('aircraft_beacon', 'real_address', new_column_name='real_id') + op.drop_column('aircraft_beacon', 'flight_state') + op.drop_index('ix_aircraft_beacon_flight_state', 'aircraft_beacon') diff --git a/ogn/collect/fetchddb.py b/ogn/collect/fetchddb.py index 6b6fc57..f351ca6 100644 --- a/ogn/collect/fetchddb.py +++ b/ogn/collect/fetchddb.py @@ -3,9 +3,8 @@ from __future__ import absolute_import from celery.utils.log import get_task_logger from ogn.collect.celery import app -from ogn.model import Device +from ogn.model import AddressOrigin, Device from ogn.utils import get_ddb -from ogn.model.address_origin import AddressOrigin logger = get_task_logger(__name__) diff --git a/ogn/model/aircraft_beacon.py b/ogn/model/aircraft_beacon.py index f794ff3..352c1f3 100644 --- a/ogn/model/aircraft_beacon.py +++ b/ogn/model/aircraft_beacon.py @@ -24,7 +24,7 @@ class AircraftBeacon(Beacon): software_version = Column(Float) hardware_version = Column(SmallInteger) - real_id = Column(String(6)) + real_address = Column(String(6)) flightlevel = Column(Float) @@ -33,6 +33,8 @@ class AircraftBeacon(Beacon): theta = Column(Float) phi = Column(Float) + flight_state = Column(SmallInteger) + # Pattern address_pattern = re.compile(r"id(\S{2})(\S{6})") climb_rate_pattern = re.compile(r"([\+\-]\d+)fpm") @@ -40,18 +42,18 @@ class AircraftBeacon(Beacon): signal_strength_pattern = re.compile(r"(\d+\.\d+)dB") error_count_pattern = re.compile(r"(\d+)e") coordinates_extension_pattern = re.compile(r"\!W(.)(.)!") - hear_ID_pattern = re.compile(r"hear(\w{4})") + hear_address_pattern = re.compile(r"hear(\w{4})") frequency_offset_pattern = re.compile(r"([\+\-]\d+\.\d+)kHz") gps_status_pattern = re.compile(r"gps(\d+x\d+)") software_version_pattern = re.compile(r"s(\d+\.\d+)") hardware_version_pattern = re.compile(r"h(\d+)") - real_id_pattern = re.compile(r"r(\w{6})") + real_address_pattern = re.compile(r"r(\w{6})") flightlevel_pattern = re.compile(r"FL(\d{3}\.\d{2})") def __init__(self, beacon=None): - self.heared_aircraft_IDs = list() + self.heared_aircraft_addresses = list() if beacon is not None: self.name = beacon.name @@ -77,13 +79,13 @@ class AircraftBeacon(Beacon): signal_strength_match = self.signal_strength_pattern.match(part) error_count_match = self.error_count_pattern.match(part) coordinates_extension_match = self.coordinates_extension_pattern.match(part) - hear_ID_match = self.hear_ID_pattern.match(part) + hear_address_match = self.hear_address_pattern.match(part) frequency_offset_match = self.frequency_offset_pattern.match(part) gps_status_match = self.gps_status_pattern.match(part) software_version_match = self.software_version_pattern.match(part) hardware_version_match = self.hardware_version_pattern.match(part) - real_id_match = self.real_id_pattern.match(part) + real_address_match = self.real_address_pattern.match(part) flightlevel_match = self.flightlevel_pattern.match(part) @@ -111,8 +113,8 @@ class AircraftBeacon(Beacon): self.latitude = self.latitude + dlat self.longitude = self.longitude + dlon - elif hear_ID_match is not None: - self.heared_aircraft_IDs.append(hear_ID_match.group(1)) + elif hear_address_match is not None: + self.heared_aircraft_addresses.append(hear_address_match.group(1)) elif frequency_offset_match is not None: self.frequency_offset = float(frequency_offset_match.group(1)) elif gps_status_match is not None: @@ -122,8 +124,8 @@ class AircraftBeacon(Beacon): self.software_version = float(software_version_match.group(1)) elif hardware_version_match is not None: self.hardware_version = int(hardware_version_match.group(1)) - elif real_id_match is not None: - self.real_id = real_id_match.group(1) + elif real_address_match is not None: + self.real_address = real_address_match.group(1) elif flightlevel_match is not None: self.flightlevel = float(flightlevel_match.group(1)) diff --git a/tests/model/test_aircraft_beacon.py b/tests/model/test_aircraft_beacon.py index b7062f4..b3b6d1c 100644 --- a/tests/model/test_aircraft_beacon.py +++ b/tests/model/test_aircraft_beacon.py @@ -24,10 +24,10 @@ class TestStringMethods(unittest.TestCase): self.assertEqual(aircraft_beacon.frequency_offset, 51.2) self.assertEqual(aircraft_beacon.gps_status, '4x5') - self.assertEqual(len(aircraft_beacon.heared_aircraft_IDs), 3) - self.assertEqual(aircraft_beacon.heared_aircraft_IDs[0], '1084') - self.assertEqual(aircraft_beacon.heared_aircraft_IDs[1], 'B597') - self.assertEqual(aircraft_beacon.heared_aircraft_IDs[2], 'B598') + self.assertEqual(len(aircraft_beacon.heared_aircraft_addresses), 3) + self.assertEqual(aircraft_beacon.heared_aircraft_addresses[0], '1084') + self.assertEqual(aircraft_beacon.heared_aircraft_addresses[1], 'B597') + self.assertEqual(aircraft_beacon.heared_aircraft_addresses[2], 'B598') def test_stealth(self): aircraft_beacon = AircraftBeacon() @@ -45,7 +45,7 @@ class TestStringMethods(unittest.TestCase): self.assertEqual(aircraft_beacon.longitude, 6 / 1000 / 60) self.assertEqual(aircraft_beacon.software_version, 6.02) self.assertEqual(aircraft_beacon.hardware_version, 44) - self.assertEqual(aircraft_beacon.real_id, "DF0C56") + self.assertEqual(aircraft_beacon.real_address, "DF0C56") def test_v024_ogn_tracker(self): aircraft_beacon = AircraftBeacon()