It's not possible to answer your question with the information provided. If you don't get it, there must be a reason for it.
I explain more
We can add speed limit attribute while add device and this attribute save in device table .
I expect the traacar use this attribute in the device table for finding events with overspeedexceeded .but
The traccar use the below variable in code :double speedLimit = AttributeUtil.lookup(cacheManager, Keys.EVENT_OVERSPEED_LIMIT, deviceId);
public OverspeedEventHandler(Config config, CacheManager cacheManager, Storage storage) {
this.cacheManager = cacheManager;
this.storage = storage;
minimalDuration = config.getLong(Keys.EVENT_OVERSPEED_MINIMAL_DURATION) * 1000;
preferLowest = config.getBoolean(Keys.EVENT_OVERSPEED_PREFER_LOWEST);
multiplier = config.getDouble(Keys.EVENT_OVERSPEED_THRESHOLD_MULTIPLIER);
}
@Override
public void analyzePosition(Position position, Callback callback) {
long deviceId = position.getDeviceId();
Device device = cacheManager.getObject(Device.class, position.getDeviceId());
if (device == null) {
return;
}
if (!PositionUtil.isLatest(cacheManager, position) || !position.getValid()) {
return;
}
double speedLimit = AttributeUtil.lookup(cacheManager, Keys.EVENT_OVERSPEED_LIMIT, deviceId);
double positionSpeedLimit = position.getDouble(Position.KEY_SPEED_LIMIT);
if (positionSpeedLimit > 0) {
speedLimit = positionSpeedLimit;
}
double geofenceSpeedLimit = 0;
long overspeedGeofenceId = 0;
if (position.getGeofenceIds() != null) {
for (long geofenceId : position.getGeofenceIds()) {
Geofence geofence = cacheManager.getObject(Geofence.class, geofenceId);
if (geofence != null) {
double currentSpeedLimit = geofence.getDouble(Keys.EVENT_OVERSPEED_LIMIT.getKey());
if (currentSpeedLimit > 0 && geofenceSpeedLimit == 0
|| preferLowest && currentSpeedLimit < geofenceSpeedLimit
|| !preferLowest && currentSpeedLimit > geofenceSpeedLimit) {
geofenceSpeedLimit = currentSpeedLimit;
overspeedGeofenceId = geofenceId;
}
}
}
}
if (geofenceSpeedLimit > 0) {
speedLimit = geofenceSpeedLimit;
}
if (speedLimit == 0) {
return;
}
OverspeedState state = OverspeedState.fromDevice(device);
OverspeedProcessor.updateState(state, position, speedLimit, multiplier, minimalDuration, overspeedGeofenceId);
if (state.isChanged()) {
state.toDevice(device);
try {
storage.updateObject(device, new Request(
new Columns.Include("overspeedState", "overspeedTime", "overspeedGeofenceId"),
new Condition.Equals("id", device.getId())));
} catch (StorageException e) {
LOGGER.warn("Update device overspeed error", e);
}
}
if (state.getEvent() != null) {
callback.eventDetected(state.getEvent());
}
}
}
This looks like outdated code. Also why post the code here instead of just link?
This code in master branch
we have this code in OverspeedEventHandler class:
but we save speed limit in attributes of device class. why we do not get speedlimit from device class?