Files
elmer/run.py
T

109 lines
3.9 KiB
Python

#!/usr/bin/env python3
"""Elmer — главный вход.
Порядок работы:
1. Подключается к ELM327 по Bluetooth
2. Читает VIN
3. Читает коды ошибок (stored + pending)
4. Читает базовые параметры ЭБУ
5. Отправляет в DeepSeek
6. Печатает диагноз
7. Сохраняет всё в SQLite
Использование:
DEEPSEEK_API_KEY=sk-... python run.py
"""
import sys
from elmer.config import load
from elmer.db import Database
from elmer.diagnose import Diagnoser
from elmer.elm import ELM327
from elmer.prompts import SYSTEM_PROMPT, build_user_prompt
def main():
config = load()
# ── 1. ELM327 ────────────────────────────────────
print("🔌 Подключение к ELM327...")
elm_cfg = config["elm327"]
try:
elm = ELM327(port=elm_cfg["port"], baudrate=elm_cfg["baudrate"])
except Exception as e:
print(f"❌ Не удалось открыть порт {elm_cfg['port']}: {e}")
print(" Проверь Bluetooth-сопряжение: bluetoothctl pair <MAC>")
sys.exit(1)
if not elm.init():
print("❌ ELM327 не ответил на ATZ. Проверь соединение.")
sys.exit(1)
print("✅ ELM327 готов")
# ── 2. VIN ───────────────────────────────────────
print("🚗 Чтение VIN...")
vin = elm.read_vin()
if not vin:
print("❌ Не удалось прочитать VIN. Машина поддерживает режим 09?")
elm.close()
sys.exit(1)
print(f"✅ VIN: {vin}")
# ── 3. Коды ошибок ──────────────────────────────
print("🔍 Чтение кодов ошибок...")
dtc_stored = elm.read_dtc_codes("03")
dtc_pending = elm.read_dtc_codes("07")
dtc_codes = dtc_stored + dtc_pending
if dtc_codes:
for dtc in dtc_codes:
print(f" ⚠️ {dtc['code']} [{dtc['status']}]")
else:
print(" ✅ Ошибок нет")
# ── 4. Параметры ЭБУ ────────────────────────────
print("📊 Чтение параметров...")
parameters = elm.read_all_pids(config.get("pids"))
for p in parameters:
print(f" {p['name']}: {p['value']} {p['unit']}")
elm.close()
# ── 5. DeepSeek ──────────────────────────────────
api_key = config["deepseek"]["api_key"]
if not api_key:
print("\n❌ DEEPSEEK_API_KEY не задан. Установи переменную окружения.")
sys.exit(1)
print("\n🧠 Отправка в DeepSeek...")
diagnoser = Diagnoser(
api_key=api_key,
model=config["deepseek"].get("model", "deepseek-chat"),
)
user_prompt = build_user_prompt(vin, dtc_codes, parameters)
answer = diagnoser.diagnose(SYSTEM_PROMPT, user_prompt)
print("\n" + "=" * 60)
print(answer)
print("=" * 60)
# ── 6. Сохранение в SQLite ──────────────────────
db = Database()
car_id = db.get_or_create_car(vin)
token_id = db.create_token(car_id)
for dtc in dtc_codes:
db.add_dtc(token_id, dtc["code"], dtc.get("description", ""), dtc["status"])
for p in parameters:
db.add_parameter(token_id, p["pid_code"], p["name"], p["value"], p["unit"])
db.add_llm_message(token_id, "user", user_prompt)
db.add_llm_message(token_id, "assistant", answer)
print(f"\n💾 Сохранено в elmer.db (token_id={token_id})")
if __name__ == "__main__":
main()