A production-grade Python library for real-time vehicle telemetry and diagnostics
Project description
FourPoints
A production-grade Python library for real-time vehicle telemetry and diagnostics.
Features
- OBD-II Communication: Connect to vehicle ECUs via USB or Bluetooth (including BLE)
- Real-time Telemetry: Stream vehicle data in real-time with asyncio support
- Advanced Analytics: Health diagnostics, predictive maintenance, and sensor status monitoring
- AI-Powered Insights: Gemini API integration for DTC explanations and maintenance advice
- Location Tracking: GPS integration for location data and trip statistics
- Report Generation: Create PDF/HTML reports with charts and vehicle data
- FastAPI Endpoints: RESTful API and WebSocket streaming for easy integration
- Comprehensive Testing: Unit tests with pytest and mocked OBD responses
Installation
# Basic installation
pip install fourpoints
# With development tools
pip install fourpoints[dev]
# With documentation tools
pip install fourpoints[docs]
# Full installation with all dependencies
pip install fourpoints[dev,docs]
Gemini API Key
For AI-powered features (DTC explanations, maintenance advice, health insights), you'll need a Google Gemini API key:
-
Get your API key from Google AI Studio
-
Set it as an environment variable:
export GEMINI_API_KEY="your_api_key_here"
Or on Windows:
$env:GEMINI_API_KEY="your_api_key_here"
-
Alternatively, provide it directly when initializing the
GeminiClientor in theAPIConfig
Quick Start
from fourpoints.obd_client import OBDClient
from fourpoints.analytics import VehicleAnalytics
# Connect to vehicle
client = OBDClient()
client.connect()
# Get real-time telemetry
telemetry = client.get_telemetry()
print(f"RPM: {telemetry.get('RPM')}")
print(f"Speed: {telemetry.get('SPEED')} km/h")
# Check vehicle health
analytics = VehicleAnalytics(client)
health = analytics.get_health_status()
print(f"Health Score: {health['score']}/100")
API Server
Start the API server to expose vehicle data via REST API and WebSocket:
from fourpoints.api import FourPointsAPI, APIConfig
config = APIConfig(
host="localhost",
port=8000,
obd_port="/dev/ttyUSB0", # or auto-detect
enable_websocket=True,
gemini_api_key="YOUR_API_KEY" # For AI features
)
api = FourPointsAPI(config)
api.start()
Real-time Streaming
Stream vehicle data in real-time with asyncio:
import asyncio
from fourpoints.obd_client import OBDClient
from fourpoints.streaming import DataStream
async def main():
client = OBDClient()
client.connect()
stream = DataStream(client)
stream.add_commands(["RPM", "SPEED", "ENGINE_LOAD"])
# Set up event handlers
stream.on_data = lambda data: print(f"Data: {data}")
stream.on_threshold = lambda violations: print(f"Alert: {violations}")
# Set thresholds
stream.set_threshold("RPM", min_value=500, max_value=3000)
# Start streaming
stream.start()
# Run for 60 seconds
await asyncio.sleep(60)
# Stop streaming
stream.stop()
asyncio.run(main())
WebSocket Streaming
Connect to the WebSocket endpoint to receive real-time data:
// Browser JavaScript
const ws = new WebSocket('ws://localhost:8000/ws');
ws.onopen = () => {
// Subscribe to commands
ws.send(JSON.stringify({
action: 'subscribe',
commands: ['RPM', 'SPEED', 'ENGINE_LOAD']
}));
// Set threshold
ws.send(JSON.stringify({
action: 'set_threshold',
command: 'RPM',
min: 500,
max: 3000
}));
};
ws.onmessage = (event) => {
const message = JSON.parse(event.data);
if (message.type === 'data') {
console.log('Data:', message.data);
} else if (message.type === 'threshold') {
console.log('Threshold Alert:', message.violations);
}
};
Example Script
Check out the demo script for a comprehensive example of using FourPoints.
API Documentation
OBD Client
from fourpoints.obd_client import OBDClient, ConnectionType
# Create client
client = OBDClient(
port=None, # Auto-detect
connection_type=ConnectionType.AUTO, # AUTO, USB, BLUETOOTH, BLE, MOCK
timeout=2.0
)
# Connect to vehicle
client.connect()
# Get supported commands
commands = client.get_supported_commands()
# Query specific command
rpm = client.query_command("RPM")
# Get all telemetry
telemetry = client.get_telemetry()
# Get DTCs
dtcs = client.get_dtcs()
# Clear DTCs
client.clear_dtcs()
# Disconnect
client.disconnect()
Analytics
from fourpoints.analytics import VehicleAnalytics
# Create analytics
analytics = VehicleAnalytics(obd_client)
# Get health status
health = analytics.get_health_status()
# Get maintenance recommendations
maintenance = analytics.get_maintenance_recommendations()
# Get sensor status
sensors = analytics.get_sensor_status()
# Predict failures
predictions = analytics.predict_failures()
# Calculate health score
score = analytics.calculate_health_score()
Gemini AI Integration
from fourpoints.gemini_client import GeminiClient
# Create client with explicit API key
gemini = GeminiClient(api_key="YOUR_API_KEY")
# Or use environment variable (recommended)
# export GEMINI_API_KEY="your_api_key_here"
gemini = GeminiClient() # Will use GEMINI_API_KEY environment variable
# Get DTC explanation
explanation = gemini.explain_dtc("P0123")
# Get maintenance advice
advice = gemini.get_maintenance_advice(
dtcs=["P0123"],
telemetry={"RPM": 1500, "ENGINE_LOAD": 40}
)
# Get health insights
insights = gemini.get_health_insights(
telemetry={"RPM": 1500, "ENGINE_LOAD": 40}
)
Location Tracking
from fourpoints.location import LocationTracker, LocationSource
# Create tracker
tracker = LocationTracker()
# Start tracking
tracker.start_tracking(
source=LocationSource.GPSD, # GPSD, SERIAL, MOCK
port="/dev/ttyUSB1" # For SERIAL source
)
# Get current location
location = tracker.get_current_location()
print(f"Lat: {location.latitude}, Lon: {location.longitude}")
# Get trip data
trip = tracker.get_trip_data()
print(f"Distance: {trip.distance} km")
# Reset trip
tracker.reset_trip()
# Stop tracking
tracker.stop_tracking()
Report Generation
from fourpoints.reports import ReportGenerator, ReportFormat
# Create generator
generator = ReportGenerator(output_dir="reports")
# Generate report
report_path = generator.generate_report(
format=ReportFormat.PDF, # PDF, HTML
telemetry=telemetry,
dtcs=dtcs,
health_status=health,
maintenance=maintenance,
location=location.to_dict(),
trip_data=trip.__dict__,
vehicle_info={"make": "Toyota", "model": "Camry", "year": 2020}
)
# Get all reports
reports = generator.get_all_reports()
# Clean up old reports
generator.cleanup_old_reports(max_age_days=30)
License
MIT License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fourpoints-0.1.0.tar.gz.
File metadata
- Download URL: fourpoints-0.1.0.tar.gz
- Upload date:
- Size: 48.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd4c2ecfe858836e6865d14e4c5360092faaf805780d4e382744473104ac059f
|
|
| MD5 |
b0fb46ea5d811e5e9e801c0d0a12fc84
|
|
| BLAKE2b-256 |
3b6f59c55b230ccc343cf3d8df28d4bd5f3f074e6350cb8fef3a77edc4dfa43f
|
File details
Details for the file fourpoints-0.1.0-py3-none-any.whl.
File metadata
- Download URL: fourpoints-0.1.0-py3-none-any.whl
- Upload date:
- Size: 35.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
acce11b9d5d31789fdffe0cf4d3050813a6f963fe7a55104f886f3b2c1c921a9
|
|
| MD5 |
2475746331448da2dcc71e8b215c596d
|
|
| BLAKE2b-256 |
dde18b773ac672ce65a3f91dc95152377f91df0530097e7687e5953c865f2d30
|