carconnectivity-plugin-database 0.4.2__tar.gz → 0.4.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/CHANGELOG.md +6 -1
  2. {carconnectivity_plugin_database-0.4.2/src/carconnectivity_plugin_database.egg-info → carconnectivity_plugin_database-0.4.3}/PKG-INFO +1 -1
  3. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3/src/carconnectivity_plugin_database.egg-info}/PKG-INFO +1 -1
  4. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/_version.py +3 -3
  5. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/agents/charging_agent.py +27 -15
  6. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/agents/climatization_agent.py +3 -0
  7. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/agents/drive_state_agent.py +17 -0
  8. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/agents/refuel_agent.py +30 -19
  9. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/agents/state_agent.py +11 -0
  10. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/agents/trip_agent.py +14 -9
  11. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/plugin.py +1 -0
  12. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/.flake8 +0 -0
  13. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  14. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  15. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/.github/dependabot.yml +0 -0
  16. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/.github/workflows/build.yml +0 -0
  17. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/.github/workflows/build_and_publish.yml +0 -0
  18. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/.github/workflows/codeql-analysis.yml +0 -0
  19. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/.gitignore +0 -0
  20. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/LICENSE +0 -0
  21. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/Makefile +0 -0
  22. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/README.md +0 -0
  23. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/doc/Config.md +0 -0
  24. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/pyproject.toml +0 -0
  25. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/setup.cfg +0 -0
  26. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/setup_requirements.txt +0 -0
  27. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_database/__init__.py +0 -0
  28. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_database/carconnectivity_database_base.py +0 -0
  29. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugin_database.egg-info/SOURCES.txt +0 -0
  30. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugin_database.egg-info/dependency_links.txt +0 -0
  31. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugin_database.egg-info/entry_points.txt +0 -0
  32. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugin_database.egg-info/requires.txt +0 -0
  33. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugin_database.egg-info/top_level.txt +0 -0
  34. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/__init__.py +0 -0
  35. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/agents/base_agent.py +0 -0
  36. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/__init__.py +0 -0
  37. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/alembic.ini +0 -0
  38. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/base.py +0 -0
  39. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/battery_temperature.py +0 -0
  40. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/carconnectivity_schema/README +0 -0
  41. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/carconnectivity_schema/__init__.py +0 -0
  42. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/carconnectivity_schema/env.py +0 -0
  43. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/carconnectivity_schema/script.py.mako +0 -0
  44. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/carconnectivity_schema/versions/__init__.py +0 -0
  45. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/charging_power.py +0 -0
  46. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/charging_rate.py +0 -0
  47. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/charging_session.py +0 -0
  48. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/charging_state.py +0 -0
  49. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/charging_station.py +0 -0
  50. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/climatization_state.py +0 -0
  51. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/connection_state.py +0 -0
  52. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/datetime_decorator.py +0 -0
  53. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/drive.py +0 -0
  54. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/drive_consumption.py +0 -0
  55. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/drive_level.py +0 -0
  56. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/drive_range.py +0 -0
  57. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/drive_range_full.py +0 -0
  58. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/location.py +0 -0
  59. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/migrations.py +0 -0
  60. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/outside_temperature.py +0 -0
  61. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/refuel_session.py +0 -0
  62. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/state.py +0 -0
  63. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/tag.py +0 -0
  64. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/timedelta_decorator.py +0 -0
  65. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/trip.py +0 -0
  66. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/model/vehicle.py +0 -0
  67. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/ui/database_edit.py +0 -0
  68. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/ui/plugin_ui.py +0 -0
  69. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/ui/templates/database/edit/overview.html +0 -0
  70. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/ui/templates/database/edit/vehicles.html +0 -0
  71. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/src/carconnectivity_plugins/database/ui/templates/database/status.html +0 -0
  72. {carconnectivity_plugin_database-0.4.2 → carconnectivity_plugin_database-0.4.3}/test/integration_test/carConnectivity.json +0 -0
@@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file.
5
5
  ## [Unreleased]
6
6
  - No unreleased changes so far
7
7
 
8
+ ## [0.4.3] - 2026-02-07
9
+ ### Fixed
10
+ - Fixes a problem where the start position would not be correctly recorded
11
+
8
12
  ## [0.4.2] - 2026-01-23
9
13
  ### Fixed
10
14
  - Improved reliability on recording trips and charging sessions
@@ -34,7 +38,8 @@ All notable changes to this project will be documented in this file.
34
38
  ## [0.1] - 2026-01-04
35
39
  Initial release, let's go and give this to the public to try out...
36
40
 
37
- [unreleased]: https://github.com/tillsteinbach/CarConnectivity-plugin-database/compare/v0.4.2...HEAD
41
+ [unreleased]: https://github.com/tillsteinbach/CarConnectivity-plugin-database/compare/v0.4.3...HEAD
42
+ [0.4.3]: https://github.com/tillsteinbach/CarConnectivity-plugin-database/releases/tag/v0.4.3
38
43
  [0.4.2]: https://github.com/tillsteinbach/CarConnectivity-plugin-database/releases/tag/v0.4.2
39
44
  [0.4.1]: https://github.com/tillsteinbach/CarConnectivity-plugin-database/releases/tag/v0.4.1
40
45
  [0.4]: https://github.com/tillsteinbach/CarConnectivity-plugin-database/releases/tag/v0.4
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: carconnectivity-plugin-database
3
- Version: 0.4.2
3
+ Version: 0.4.3
4
4
  Summary: CarConnectivity plugin for storing data to Databases
5
5
  Author: Till Steinbach
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: carconnectivity-plugin-database
3
- Version: 0.4.2
3
+ Version: 0.4.3
4
4
  Summary: CarConnectivity plugin for storing data to Databases
5
5
  Author: Till Steinbach
6
6
  License-Expression: MIT
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.4.2'
32
- __version_tuple__ = version_tuple = (0, 4, 2)
31
+ __version__ = version = '0.4.3'
32
+ __version_tuple__ = version_tuple = (0, 4, 3)
33
33
 
34
- __commit_id__ = commit_id = 'g6a55f964d'
34
+ __commit_id__ = commit_id = 'g0d9350942'
@@ -173,6 +173,18 @@ class ChargingAgent(BaseAgent):
173
173
  self.__on_battery_temperature_change(electric_drive.battery.temperature, Observable.ObserverEvent.UPDATED)
174
174
  self.session_factory.remove()
175
175
 
176
+ def __del__(self) -> None:
177
+ self.carconnectivity_vehicle.charging.connector.connection_state.remove_observer(self.__on_connector_state_change)
178
+ self.carconnectivity_vehicle.charging.connector.lock_state.remove_observer(self.__on_connector_lock_state_change)
179
+ self.carconnectivity_vehicle.charging.state.remove_observer(self.__on_charging_state_change)
180
+ self.carconnectivity_vehicle.charging.rate.remove_observer(self.__on_charging_rate_change)
181
+ self.carconnectivity_vehicle.charging.power.remove_observer(self.__on_charging_power_change)
182
+ self.carconnectivity_vehicle.charging.type.remove_observer(self._on_charging_type_change)
183
+ electric_drive: Optional[ElectricDrive] = self.carconnectivity_vehicle.get_electric_drive()
184
+ if electric_drive is not None:
185
+ electric_drive.level.remove_observer(self._on_battery_level_change)
186
+ electric_drive.battery.temperature.remove_observer(self.__on_battery_temperature_change)
187
+
176
188
  # pylint: disable=too-many-branches, too-many-statements
177
189
  def __on_charging_state_change(self, element: EnumAttribute[Charging.ChargingState], flags: Observable.ObserverEvent) -> None:
178
190
  del flags
@@ -628,21 +640,21 @@ class ChargingAgent(BaseAgent):
628
640
  self.database_plugin.healthy._set_value(value=False) # pylint: disable=protected-access
629
641
  else:
630
642
  LOG.info("Starting new charging session for vehicle %s due to connector locked state on startup", self.vehicle.vin)
631
- new_session: ChargingSession = ChargingSession(vin=self.vehicle.vin, plug_locked_date=element.last_changed)
632
- try:
633
- session.add(new_session)
634
- self._update_session_odometer(session, new_session)
635
- self._update_session_position(session, new_session)
636
- session.commit()
637
- LOG.debug('Added new charging session for vehicle %s to database', self.vehicle.vin)
638
- self.last_charging_session = new_session
639
- except IntegrityError as err:
640
- session.rollback()
641
- LOG.error('IntegrityError while adding charging session for vehicle %s to database: %s', self.vehicle.vin, err)
642
- except DatabaseError as err:
643
- session.rollback()
644
- LOG.error('DatabaseError while adding charging session for vehicle %s to database: %s', self.vehicle.vin, err)
645
- self.database_plugin.healthy._set_value(value=False) # pylint: disable=protected-access
643
+ new_session: ChargingSession = ChargingSession(vin=self.vehicle.vin, plug_locked_date=element.last_changed)
644
+ try:
645
+ session.add(new_session)
646
+ self._update_session_odometer(session, new_session)
647
+ self._update_session_position(session, new_session)
648
+ session.commit()
649
+ LOG.debug('Added new charging session for vehicle %s to database', self.vehicle.vin)
650
+ self.last_charging_session = new_session
651
+ except IntegrityError as err:
652
+ session.rollback()
653
+ LOG.error('IntegrityError while adding charging session for vehicle %s to database: %s', self.vehicle.vin, err)
654
+ except DatabaseError as err:
655
+ session.rollback()
656
+ LOG.error('DatabaseError while adding charging session for vehicle %s to database: %s', self.vehicle.vin, err)
657
+ self.database_plugin.healthy._set_value(value=False) # pylint: disable=protected-access
646
658
  elif self.last_charging_session is not None and not self.last_charging_session.was_locked():
647
659
  try:
648
660
  self.last_charging_session.plug_locked_date = element.last_changed
@@ -76,6 +76,9 @@ class ClimatizationAgent(BaseAgent):
76
76
  self.__on_state_change(self.carconnectivity_vehicle.climatization.state, Observable.ObserverEvent.UPDATED)
77
77
  self.session_factory.remove()
78
78
 
79
+ def __del__(self) -> None:
80
+ self.carconnectivity_vehicle.climatization.state.remove_observer(self.__on_state_change)
81
+
79
82
  def __on_state_change(self, element: EnumAttribute[Climatization.ClimatizationState], flags: Observable.ObserverEvent) -> None:
80
83
  del flags
81
84
  if element.enabled:
@@ -155,6 +155,23 @@ class DriveStateAgent(BaseAgent):
155
155
  self.__on_range_estimated_full_change(self.carconnectivity_drive.range_estimated_full, Observable.ObserverEvent.UPDATED)
156
156
  session_factory.remove()
157
157
 
158
+ def __del__(self) -> None:
159
+ self.carconnectivity_drive.type.remove_observer(self.__on_type_change)
160
+ self.carconnectivity_drive.range_wltp.remove_observer(self.__on_range_wltp_change)
161
+
162
+ if isinstance(self.carconnectivity_drive, ElectricDrive):
163
+ self.carconnectivity_drive.battery.total_capacity.remove_observer(self.__on_electric_total_capacity_change)
164
+ self.carconnectivity_drive.battery.available_capacity.remove_observer(self.__on_electric_available_capacity_change)
165
+ self.carconnectivity_drive.consumption.remove_observer(self.__on_electric_consumption_change)
166
+
167
+ elif isinstance(self.carconnectivity_drive, CombustionDrive):
168
+ self.carconnectivity_drive.fuel_tank.available_capacity.remove_observer(self.__on_fuel_available_capacity_change)
169
+ self.carconnectivity_drive.consumption.remove_observer(self.__on_fuel_consumption_change)
170
+
171
+ self.carconnectivity_drive.level.remove_observer(self.__on_level_change)
172
+ self.carconnectivity_drive.range.remove_observer(self.__on_range_change)
173
+ self.carconnectivity_drive.range_estimated_full.remove_observer(self.__on_range_estimated_full_change)
174
+
158
175
  def __on_level_change(self, element: LevelAttribute, flags: Observable.ObserverEvent) -> None:
159
176
  del flags
160
177
  if element.enabled:
@@ -81,6 +81,10 @@ class RefuelAgent(BaseAgent):
81
81
 
82
82
  self.carconnectivity_vehicle.position.longitude.add_observer(self.__on_longitude_change, Observable.ObserverEvent.UPDATED)
83
83
 
84
+ def __del__(self) -> None:
85
+ self.carconnectivity_drive.level.remove_observer(self.__on_level_change)
86
+ self.carconnectivity_vehicle.position.longitude.remove_observer(self.__on_longitude_change)
87
+
84
88
  def __on_level_change(self, element: LevelAttribute, flags: Observable.ObserverEvent) -> None:
85
89
  del flags
86
90
  if element.enabled and element.value is not None:
@@ -141,22 +145,29 @@ class RefuelAgent(BaseAgent):
141
145
  self.database_plugin.healthy._set_value(value=False) # pylint: disable=protected-access
142
146
  if refuel_session.location is None and self.carconnectivity_vehicle.position.enabled \
143
147
  and refuel_session.session_position_latitude is not None and refuel_session.session_position_longitude is not None:
144
- location_service: Optional[BaseService] = self.database_plugin.car_connectivity.get_service_for(ServiceType.LOCATION_GAS_STATION)
145
- if location_service is not None and isinstance(location_service, LocationService):
146
- location_result: Optional[CarConnectivityLocation] = location_service.gas_station_from_lat_lon(
147
- latitude=refuel_session.session_position_latitude,
148
- longitude=refuel_session.session_position_longitude,
149
- radius=150,
150
- location=None)
151
- if location_result is not None:
152
- LOG.debug('Resolved location from position (%s, %s)', refuel_session.session_position_latitude,
153
- refuel_session.session_position_longitude)
154
- location: Location = Location.from_carconnectivity_location(location=location_result)
155
- try:
156
- location = session.merge(location)
157
- refuel_session.location = location
158
- except DatabaseError as err:
159
- session.rollback()
160
- LOG.error('DatabaseError while merging location for refuel session of vehicle %s in database: %s',
161
- self.carconnectivity_vehicle.vin.value, err)
162
- self.database_plugin.healthy._set_value(value=False) # pylint: disable=protected-access
148
+ location_services: Optional[list[BaseService]] = self.database_plugin.car_connectivity.get_services_for(ServiceType.LOCATION_GAS_STATION)
149
+ if location_services is None or len(location_services) == 0:
150
+ LOG.debug('No LocationService available to resolve location from position for refuel session')
151
+ return
152
+ location_result: Optional[CarConnectivityLocation] = None
153
+ for location_service in location_services:
154
+ if location_service is not None and isinstance(location_service, LocationService):
155
+ location_result = location_service.gas_station_from_lat_lon(
156
+ latitude=refuel_session.session_position_latitude,
157
+ longitude=refuel_session.session_position_longitude,
158
+ radius=150,
159
+ location=None)
160
+ if location_result is not None:
161
+ break
162
+ if location_result is not None:
163
+ LOG.debug('Resolved location from position (%s, %s)', refuel_session.session_position_latitude,
164
+ refuel_session.session_position_longitude)
165
+ location: Location = Location.from_carconnectivity_location(location=location_result)
166
+ try:
167
+ location = session.merge(location)
168
+ refuel_session.location = location
169
+ except DatabaseError as err:
170
+ session.rollback()
171
+ LOG.error('DatabaseError while merging location for refuel session of vehicle %s in database: %s',
172
+ self.carconnectivity_vehicle.vin.value, err)
173
+ self.database_plugin.healthy._set_value(value=False) # pylint: disable=protected-access
@@ -89,6 +89,17 @@ class StateAgent(BaseAgent):
89
89
  on_transaction_end=True)
90
90
  self.session_factory.remove()
91
91
 
92
+ def __del__(self) -> None:
93
+ self.carconnectivity_vehicle.state.remove_observer(self.__on_state_change)
94
+ self.carconnectivity_vehicle.connection_state.remove_observer(self.__on_connection_state_change)
95
+ self.carconnectivity_vehicle.outside_temperature.remove_observer(self.__on_outside_temperature_change)
96
+ self.carconnectivity_vehicle.name.remove_observer(self.__on_name_change)
97
+ self.carconnectivity_vehicle.manufacturer.remove_observer(self.__on_manufacturer_change)
98
+ self.carconnectivity_vehicle.model.remove_observer(self.__on_model_change)
99
+ self.carconnectivity_vehicle.model_year.remove_observer(self.__on_model_year_change)
100
+ self.carconnectivity_vehicle.type.remove_observer(self.__on_type_change)
101
+ self.carconnectivity_vehicle.license_plate.remove_observer(self.__on_license_plate_change)
102
+
92
103
  def __on_state_change(self, element: EnumAttribute[GenericVehicle.State], flags: Observable.ObserverEvent) -> None:
93
104
  del flags
94
105
  if element.enabled:
@@ -14,6 +14,7 @@ from sqlalchemy.orm.exc import ObjectDeletedError
14
14
  from carconnectivity.observable import Observable
15
15
  from carconnectivity.vehicle import GenericVehicle
16
16
  from carconnectivity.utils.timeout_lock import TimeoutLock
17
+ from carconnectivity.location import Location as CarConnectivityLocation
17
18
 
18
19
  from carconnectivity_plugins.database.agents.base_agent import BaseAgent
19
20
  from carconnectivity_plugins.database.model.trip import Trip
@@ -95,6 +96,12 @@ class TripAgent(BaseAgent):
95
96
  on_transaction_end=True)
96
97
  self._on_position_location_change(self.carconnectivity_vehicle.position.location.uid, Observable.ObserverEvent.UPDATED)
97
98
 
99
+ def __del__(self) -> None:
100
+ self.carconnectivity_vehicle.state.remove_observer(self.__on_state_change)
101
+ self.carconnectivity_vehicle.position.latitude.remove_observer(self._on_position_latitude_change)
102
+ self.carconnectivity_vehicle.position.longitude.remove_observer(self._on_position_longitude_change)
103
+ self.carconnectivity_vehicle.position.location.uid.remove_observer(self._on_position_location_change)
104
+
98
105
  # pylint: disable-next=too-many-branches,too-many-statements
99
106
  def __on_state_change(self, element: EnumAttribute[GenericVehicle.State], flags: Observable.ObserverEvent) -> None:
100
107
  del flags
@@ -131,7 +138,7 @@ class TripAgent(BaseAgent):
131
138
  self.carconnectivity_vehicle.odometer.value is not None:
132
139
  new_trip.start_odometer = self.carconnectivity_vehicle.odometer.in_locale(locale=self.database_plugin.locale)[0]
133
140
  if not self._update_trip_position(session=session, trip=new_trip, start=True):
134
- # if now no position is available try the last known position that is not older than 5min
141
+ # if now no position is available try the last known position
135
142
  if self.last_parked_position_latitude is not None and self.last_parked_position_longitude is not None:
136
143
  self._update_trip_position(session=session, trip=new_trip, start=True,
137
144
  latitude=self.last_parked_position_latitude,
@@ -188,11 +195,9 @@ class TripAgent(BaseAgent):
188
195
  del flags
189
196
  if element.enabled and element.value is not None:
190
197
  location_object: GenericObject = element.parent
191
- if isinstance(location_object, Location):
198
+ if isinstance(location_object, CarConnectivityLocation):
192
199
  self.last_parked_location = Location.from_carconnectivity_location(location=location_object)
193
- self._on_location_change()
194
- else:
195
- self.last_parked_location = None
200
+ self._on_location_change()
196
201
 
197
202
  def _on_position_change(self) -> None:
198
203
  # Check if there is a finished trip that lacks destination position. We allow 5min after destination_date to set the position.
@@ -240,7 +245,7 @@ class TripAgent(BaseAgent):
240
245
  if self.trip is not None and self.trip.destination_date is not None and self.trip.destination_location is None \
241
246
  and self.last_parked_position_time is not None \
242
247
  and self.last_parked_position_time < (self.trip.destination_date + timedelta(minutes=5)):
243
- location: Location = Location.from_carconnectivity_location(location=self.last_parked_location)
248
+ location: Location = self.last_parked_location
244
249
  try:
245
250
  location = session.merge(location)
246
251
  self.trip.destination_location = location
@@ -256,7 +261,7 @@ class TripAgent(BaseAgent):
256
261
  latitude: Optional[float] = None, longitude: Optional[float] = None, location: Optional[Location] = None) -> bool:
257
262
  if self.carconnectivity_vehicle is None:
258
263
  raise ValueError("Vehicle's carconnectivity_vehicle attribute is None")
259
- if latitude or longitude is None:
264
+ if latitude is None or longitude is None:
260
265
  if self.carconnectivity_vehicle.position.enabled and self.carconnectivity_vehicle.position.latitude.enabled \
261
266
  and self.carconnectivity_vehicle.position.longitude.enabled \
262
267
  and self.carconnectivity_vehicle.position.latitude.value is not None \
@@ -267,8 +272,8 @@ class TripAgent(BaseAgent):
267
272
  if start:
268
273
  if trip.start_position_latitude is None and trip.start_position_longitude is None:
269
274
  try:
270
- trip.start_position_latitude = self.carconnectivity_vehicle.position.latitude.value
271
- trip.start_position_longitude = self.carconnectivity_vehicle.position.longitude.value
275
+ trip.start_position_latitude = latitude
276
+ trip.start_position_longitude = longitude
272
277
  session.commit()
273
278
  except DatabaseError as err:
274
279
  session.rollback()
@@ -148,6 +148,7 @@ class Plugin(BasePlugin): # pylint: disable=too-many-instance-attributes
148
148
  self.scoped_session_factory.remove()
149
149
 
150
150
  def shutdown(self) -> None:
151
+ self.car_connectivity.garage.remove_observer(self.__on_add_vehicle)
151
152
  self._stop_event.set()
152
153
  if self._background_thread is not None:
153
154
  self._background_thread.join()