예제 #1
0
 def __is_refuel_or_recharging(self, start, end, distance):
     decharge, fuel_consumption = self.get_level_consumption(start, end)
     if fuel_consumption < 0:
         logger.debugv("refuel detected")
         return True
     if TripParser.is_recharging(decharge, distance):
         logger.debugv("charge detected")
         return True
     return False
예제 #2
0
 def set_fuel_consumption(self, consumption) -> float:
     if self.distance is None:
         raise ValueError("Distance not set")
     if consumption < 0:
         logger.debugv("trip has negative fuel consumption")
     self.consumption_fuel = round(consumption, 2)  # L
     self.consumption_fuel_km = round(100 * self.consumption_fuel /
                                      self.distance, 2)  # L/100 km
     return self.consumption_fuel_km
예제 #3
0
 def set_consumption(self, diff_level: float) -> float:
     if self.distance is None:
         raise ValueError("Distance not set")
     if diff_level < 0:
         logger.debugv("trip has negative consumption")
         diff_level = 0
     self.consumption = diff_level * self.car.battery_power / 100
     self.consumption_km = 100 * self.consumption / self.distance  # kw/100 km
     return self.consumption_km
예제 #4
0
 def __is_refuel(self, start, end, distance):
     fuel_consumption = self.get_level_consumption(start, end)[1]
     if fuel_consumption < 0:
         logger.debugv("refuel detected")
         return True
     return False
예제 #5
0
 def get_trips(vehicles_list: Cars) -> Dict[str, Trips]:
     conn = get_db()
     vehicles = conn.execute(
         "SELECT DISTINCT vin FROM position;").fetchall()
     trips_by_vin = {}
     for vin in vehicles:
         trips = Trips()
         vin = vin[0]
         res = conn.execute(
             'SELECT * FROM position WHERE VIN=? ORDER BY Timestamp',
             (vin, )).fetchall()
         if len(res) > 1:
             car = vehicles_list.get_car_by_vin(vin)
             assert car is not None
             trip_parser = TripParser(car)
             start = res[0]
             end = res[1]
             tr = Trip()
             # for debugging use this line res = list(map(dict,res))
             for x in range(0, len(res) - 2):
                 logger.debugv("%s mileage:%.1f level:%s level_fuel:%s",
                               res[x]['Timestamp'], res[x]['mileage'],
                               res[x]['level'], res[x]['level_fuel'])
                 next_el = res[x + 2]
                 distance = end["mileage"] - start["mileage"]
                 duration = (end["Timestamp"] -
                             start["Timestamp"]).total_seconds() / 3600
                 try:
                     speed_average = distance / duration
                 except ZeroDivisionError:
                     speed_average = 0
                 restart_trip = False
                 if trip_parser.is_refuel(start, end, distance):
                     restart_trip = True
                 elif speed_average < 0.2 and duration > 0.05:
                     restart_trip = True
                     logger.debugv("low speed detected")
                 if restart_trip:
                     start = end
                     tr = Trip()
                     logger.debugv(
                         "restart trip at %s mileage:%.1f level:%s level_fuel:%s",
                         start['Timestamp'], start['mileage'],
                         start['level'], start['level_fuel'])
                 else:
                     distance = next_el["mileage"] - end["mileage"]  # km
                     duration = (next_el["Timestamp"] -
                                 end["Timestamp"]).total_seconds() / 3600
                     try:
                         speed_average = distance / duration
                     except ZeroDivisionError:
                         speed_average = 0
                     end_trip = False
                     if trip_parser.is_refuel(end, next_el, distance):
                         end_trip = True
                     elif speed_average < 0.2 and duration > 0.05:
                         # (distance == 0 and duration > 0.08) or duration > 2 or
                         # check the speed to handle missing point
                         end_trip = True
                         logger.debugv("low speed detected")
                     elif duration > 2:
                         end_trip = True
                         logger.debugv("too much time detected")
                     elif x == len(res) - 3:  # last record detected
                         # think if add point is needed
                         end = next_el
                         end_trip = True
                         logger.debugv("last position found")
                     if end_trip:
                         logger.debugv(
                             "stop trip at %s mileage:%.1f level:%s level_fuel:%s",
                             end['Timestamp'], end['mileage'], end['level'],
                             end['level_fuel'])
                         tr.distance = end["mileage"] - start[
                             "mileage"]  # km
                         if tr.distance > 0:
                             tr.start_at = start["Timestamp"]
                             tr.end_at = end["Timestamp"]
                             tr.add_points(end["longitude"],
                                           end["latitude"])
                             if end["temperature"] is not None and start[
                                     "temperature"] is not None:
                                 tr.add_temperature(end["temperature"])
                             tr.duration = (
                                 end["Timestamp"] -
                                 start["Timestamp"]).total_seconds() / 3600
                             tr.speed_average = tr.distance / tr.duration
                             diff_level, diff_level_fuel = trip_parser.get_level_consumption(
                                 start, end)
                             tr.car = car
                             if diff_level != 0:
                                 tr.set_consumption(diff_level)  # kw
                             if diff_level_fuel != 0:
                                 tr.set_fuel_consumption(diff_level_fuel)
                             tr.mileage = end["mileage"]
                             logger.debugv(
                                 "Trip: %s -> %s %.1fkm %.2fh %.0fkm/h %.2fkWh %.2fkWh/100km %.2fL "
                                 "%.2fL/100km %.1fkm", tr.start_at,
                                 tr.end_at, tr.distance, tr.duration,
                                 tr.speed_average, tr.consumption,
                                 tr.consumption_km, tr.consumption_fuel,
                                 tr.consumption_fuel_km, tr.mileage)
                             # filter bad value
                             trips.check_and_append(tr)
                         start = next_el
                         tr = Trip()
                     else:
                         tr.add_points(end["longitude"], end["latitude"])
                 end = next_el
             trips_by_vin[vin] = trips
     return trips_by_vin
예제 #6
0
 def check_and_append(self, tr: Trip):
     if tr.consumption_km <= tr.car.max_elec_consumption and tr.consumption_fuel_km <= tr.car.max_fuel_consumption:
         self.append(tr)
         return True
     logger.debugv("trip discarded")
     return False