/** * Einstellungen. Vorlage: `vEinst()` im alten Panel — die umfangreichste * Seite: Fahrzeugdaten, Darstellung, Fotos, SmartDeal, Pausenzeit, Sicherung, * Datenausgabe und Zugang. */ import { useRef, useState } from "react" import { ActionButton, Feld, Seg, Switch, Tile } from "@audi-dash/ui" import { zugangVerwerfen } from "../api" import { useDaten } from "../daten/DatenKontext" import type { Einstellungen as EinstellungenWerte } from "../daten/profilAdapter" import { datumZeit, de, isoTag } from "../format" import { useTheme } from "../theme" import { Wertzeile, Werteliste, bestaetigen } from "./bausteine" import { Bild } from "./Bild" import { BILDPLAETZE } from "./bilder" import { csvHerunterladen } from "./csv" import { zugangVergessen } from "./zugang" export function Einstellungen({ tabBeschriftung, setzeTabBeschriftung, beiAbmeldung, }: { tabBeschriftung: boolean setzeTabBeschriftung: (an: boolean) => void beiAbmeldung: () => void }) { const { einstellungen, fahrzeug, fahrten, tankvorgaenge, rohprofil, api, profilSpeichern } = useDaten() const [theme, themeSetzen] = useTheme() const [entwurf, setzeEntwurf] = useState(null) const [laeuft, setzeLaeuft] = useState(false) const [gespeichert, setzeGespeichert] = useState(false) const dateiwahl = useRef(null) if (!einstellungen || !fahrzeug) return null const werte = entwurf ?? einstellungen const aendern = (teil: Partial) => setzeEntwurf({ ...werte, ...teil }) const speichern = async () => { if (!entwurf) return setzeLaeuft(true) setzeGespeichert(false) try { await profilSpeichern({ einstellungen: entwurf }) setzeEntwurf(null) setzeGespeichert(true) } finally { setzeLaeuft(false) } } const abmelden = async () => { if (!bestaetigen("Zugang von diesem Gerät entfernen? Die Daten auf dem Server bleiben.")) return await zugangVerwerfen() zugangVergessen() beiAbmeldung() } const profilExportieren = () => { const inhalt = JSON.stringify( { profil: rohprofil, fahrten, tankvorgaenge, erzeugt: new Date().toISOString() }, null, 2, ) const blob = new Blob([inhalt], { type: "application/json" }) const url = URL.createObjectURL(blob) const verweis = document.createElement("a") verweis.href = url verweis.download = `datametric360-sicherung-${isoTag()}.json` verweis.click() URL.revokeObjectURL(url) } return ( <> Fahrzeug aendern({ fahrzeugtitel: e.target.value })} /> aendern({ fahrzeugzusatz: e.target.value })} /> aendern({ kennzeichen: e.target.value })} /> aendern({ tankvolumen: Number(e.target.value) || 0 })} /> Fahrten aendern({ pauseMin: Number(e.target.value) || 0 })} /> aendern({ nachtVon: e.target.value })} /> aendern({ nachtBis: e.target.value })} />

Setzt das Fahrzeug innerhalb der Pausenzeit die Fahrt fort, zählt das als eine Fahrt und nicht als zwei — etwa bei einem Tankstopp.

Darstellung themeSetzen(neu as "nacht" | "tag")} /> Bild auf der Übersicht
{BILDPLAETZE.map((platz) => ( ))}

Fotos lädst du über die Verwaltung im Home Assistant hoch. Die Dateinamen sind fest vergeben — der Server nimmt nur diese an.

Tankrabatt void profilSpeichern({ fahrzeug: { ...fahrzeug, smartdeal: { ...fahrzeug.smartdeal, aktiv: an }, }, }) } aria-label="Tankrabatt aktiv" /> void profilSpeichern({ fahrzeug: { ...fahrzeug, smartdeal: { ...fahrzeug.smartdeal, laeuftAb: e.target.value || null }, }, }) } />

Das Datum gilt einschließlich — am Stichtag selbst zählt der Rabatt noch, erst am Folgetag schaltet er ab.

Sicherung } />
void api.rest.dienstAufrufen("pyscript", "audi_dashboard_backup_jetzt") } > Jetzt sichern Auf dieses Gerät laden
Daten ausgeben

Als CSV mit Semikolon und deutschem Zahlenformat — so öffnet Excel die Datei ohne Nachfragen.

csvHerunterladen( "fahrten", ["Beginn", "Ende", "Strecke km", "Dauer s", "Art", "Status"], fahrten.map((f) => [ f.ts_start, f.ts_end, f.distance_km ?? "", f.duration_s, f.art, f.status, ]), ) } > Fahrten csvHerunterladen( "tankvorgaenge", ["Zeitpunkt", "Liter", "Betrag", "Preis je Liter", "Tankstelle", "Kilometerstand"], tankvorgaenge.map((t) => [ t.ts, t.liters ?? "", t.fuel_total_eur ?? "", t.price_per_l ?? "", t.station_name ?? "", t.odometer_km ?? "", ]), ) } > Tankvorgänge
Zugang } />
void abmelden()}> Verbindung trennen
{gespeichert &&

Gespeichert.

} {entwurf && (
void speichern()} disabled={laeuft}> {laeuft ? "Speichere …" : "Änderungen speichern"}
)} ) }