d8b12da36d
Das Backend liegt jetzt als custom_components/audi_dashboard/ vor - eine normale Home-Assistant-Integration mit Config-Flow, einer sensor-Plattform und 18 Diensten. Damit ist die App über HACS installierbar; bis das Repo auf GitHub gespiegelt ist (HACS spricht ausschließlich mit GitHub), installiert homeassistant/installationspaket/install.ps1 denselben Ordner ohne HACS. Fünf Installationsschritte entfallen ersatzlos: der pyscript:-Block, der panel_custom:-Block, das Kopieren der Oberfläche nach www/, das langlebige Zugriffstoken (der Verlauf wird direkt über die recorder-API gelesen) und "pip install pypdf" (steht in manifest.json). Das Fahrzeugprofil legt die Integration beim ersten Start aus ihrer Vorlage an. Drei alte Schwächen sind dabei mit erledigt: - Die Nutzlast landet nicht mehr in der Recorder-Datenbank (_unrecorded_attributes - das kann nur eine echte Entität). - Eine laufende Fahrt überlebt einen Neustart (Store statt Arbeitsspeicher); fiel sie während eines Ausfalls ins Ende, schließt nach_neustart_fortsetzen() sie beim letzten aufgezeichneten Zeitpunkt. - Sensor-Zuordnungen wirken sofort - die Zustandsbeobachter werden neu gebunden, der Neustart-Hinweis und der Neustart-Dienst sind weg. Namensvertrag geändert, beide Oberflächen mitgezogen: pyscript.audi_dashboard_x -> sensor.audi_dashboard_x, pyscript.audi_dashboard_y -> audi_dashboard.y. Eine Companion-App vom alten Stand findet nach dem Umstieg nichts mehr und muss neu gebaut werden; das Panel liegt in der Integration und kann nicht driften. Der selbstgebaute Updater entfällt - HACS ist die Update-Mechanik, die Home Assistant kennt. Die Versionierung schrumpft auf eine Quelle: manifest.json. Geprüft am laufenden Testcontainer (Container byteweise identisch mit dem Repo): alle 18 Dienste, Panel, Config-Entry neu laden, Historienimport, echter Shell-Beleg in-process, Neuinstallation im Wegwerf-Container blank mit automatisch nachinstalliertem pypdf. Companion-App: tsc sauber, 112/112 Tests, beide Rauchtests gegen das laufende Backend grün. Belegparser 8/8. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
258 lines
5.4 KiB
YAML
258 lines
5.4 KiB
YAML
# Felder und Eingabehilfen für Entwicklerwerkzeuge -> Aktionen.
|
|
# Namen und Beschreibungen stehen in strings.json bzw. translations/, nicht
|
|
# hier - so steht jeder Text genau einmal.
|
|
#
|
|
# Beide Oberflächen rufen diese Dienste über die WebSocket- bzw. REST-API auf
|
|
# und brauchen diese Datei nicht. Sie ist dafür da, dass die Dienste in Home
|
|
# Assistant selbst bedienbar und nachvollziehbar sind - zum Nachschauen, zum
|
|
# Ausprobieren und für eigene Automationen des Nutzers.
|
|
|
|
jetzt_aktualisieren:
|
|
screening_jetzt:
|
|
backup_jetzt:
|
|
|
|
profil_schreiben:
|
|
fields:
|
|
profil_json:
|
|
required: true
|
|
selector:
|
|
object:
|
|
|
|
entitaeten_schreiben:
|
|
fields:
|
|
zuordnung_json:
|
|
required: true
|
|
selector:
|
|
object:
|
|
|
|
fahrt_manuell_anlegen:
|
|
fields:
|
|
ts_start:
|
|
required: true
|
|
example: "2026-08-23T07:30:00+02:00"
|
|
selector:
|
|
text:
|
|
ts_end:
|
|
required: true
|
|
example: "2026-08-23T08:05:00+02:00"
|
|
selector:
|
|
text:
|
|
art:
|
|
selector:
|
|
select:
|
|
options: ["privat", "arbeitsweg"]
|
|
start_ort:
|
|
selector:
|
|
text:
|
|
ziel_ort:
|
|
selector:
|
|
text:
|
|
odo_start:
|
|
selector:
|
|
number: { min: 0, max: 2000000, step: 0.1, mode: box, unit_of_measurement: km }
|
|
odo_end:
|
|
selector:
|
|
number: { min: 0, max: 2000000, step: 0.1, mode: box, unit_of_measurement: km }
|
|
distanz:
|
|
selector:
|
|
number: { min: 0, max: 10000, step: 0.1, mode: box, unit_of_measurement: km }
|
|
|
|
fahrt_aktualisieren:
|
|
fields:
|
|
trip_id:
|
|
required: true
|
|
example: t-4f2a91c30b7e
|
|
selector:
|
|
text:
|
|
ts_start:
|
|
selector:
|
|
text:
|
|
ts_end:
|
|
selector:
|
|
text:
|
|
art:
|
|
selector:
|
|
select:
|
|
options: ["privat", "arbeitsweg"]
|
|
start_ort:
|
|
selector:
|
|
text:
|
|
ziel_ort:
|
|
selector:
|
|
text:
|
|
odo_start:
|
|
selector:
|
|
number: { min: 0, max: 2000000, step: 0.1, mode: box, unit_of_measurement: km }
|
|
odo_end:
|
|
selector:
|
|
number: { min: 0, max: 2000000, step: 0.1, mode: box, unit_of_measurement: km }
|
|
distanz:
|
|
selector:
|
|
number: { min: 0, max: 10000, step: 0.1, mode: box, unit_of_measurement: km }
|
|
|
|
fahrt_loeschen:
|
|
fields:
|
|
trip_id:
|
|
required: true
|
|
selector:
|
|
text:
|
|
|
|
beleg_hochladen:
|
|
fields:
|
|
pdf_base64:
|
|
required: true
|
|
selector:
|
|
text:
|
|
multiline: true
|
|
dateiname:
|
|
selector:
|
|
text:
|
|
tank_id:
|
|
selector:
|
|
text:
|
|
|
|
tankvorgang_manuell:
|
|
fields:
|
|
ts:
|
|
selector:
|
|
text:
|
|
liter:
|
|
selector:
|
|
number: { min: 0, max: 200, step: 0.01, mode: box, unit_of_measurement: L }
|
|
kosten:
|
|
selector:
|
|
number: { min: 0, max: 2000, step: 0.01, mode: box, unit_of_measurement: EUR }
|
|
km:
|
|
selector:
|
|
number: { min: 0, max: 2000000, step: 0.1, mode: box, unit_of_measurement: km }
|
|
ersparnis:
|
|
selector:
|
|
number: { min: 0, max: 500, step: 0.01, mode: box, unit_of_measurement: EUR }
|
|
station:
|
|
selector:
|
|
text:
|
|
distanz:
|
|
selector:
|
|
number: { min: 0, max: 10000, step: 0.1, mode: box, unit_of_measurement: km }
|
|
kraftstoff:
|
|
selector:
|
|
text:
|
|
receipt_key:
|
|
selector:
|
|
text:
|
|
receipt_file:
|
|
selector:
|
|
text:
|
|
|
|
tankvorgang_aktualisieren:
|
|
fields:
|
|
tank_id:
|
|
required: true
|
|
selector:
|
|
text:
|
|
ts:
|
|
selector:
|
|
text:
|
|
liter:
|
|
selector:
|
|
number: { min: 0, max: 200, step: 0.01, mode: box, unit_of_measurement: L }
|
|
kosten:
|
|
selector:
|
|
number: { min: 0, max: 2000, step: 0.01, mode: box, unit_of_measurement: EUR }
|
|
km:
|
|
selector:
|
|
number: { min: 0, max: 2000000, step: 0.1, mode: box, unit_of_measurement: km }
|
|
ersparnis:
|
|
selector:
|
|
number: { min: 0, max: 500, step: 0.01, mode: box, unit_of_measurement: EUR }
|
|
station:
|
|
selector:
|
|
text:
|
|
distanz:
|
|
selector:
|
|
number: { min: 0, max: 10000, step: 0.1, mode: box, unit_of_measurement: km }
|
|
kraftstoff:
|
|
selector:
|
|
text:
|
|
receipt_key:
|
|
selector:
|
|
text:
|
|
receipt_file:
|
|
selector:
|
|
text:
|
|
|
|
tankvorgang_loeschen:
|
|
fields:
|
|
tank_id:
|
|
required: true
|
|
selector:
|
|
text:
|
|
|
|
bild_hochladen:
|
|
fields:
|
|
dateiname:
|
|
required: true
|
|
example: seitenansicht.webp
|
|
selector:
|
|
text:
|
|
daten_base64:
|
|
required: true
|
|
selector:
|
|
text:
|
|
multiline: true
|
|
|
|
bild_loeschen:
|
|
fields:
|
|
dateiname:
|
|
required: true
|
|
selector:
|
|
text:
|
|
|
|
reifen_wechseln:
|
|
fields:
|
|
satz:
|
|
required: true
|
|
selector:
|
|
select:
|
|
options: ["sommer", "winter"]
|
|
|
|
reifen_km_setzen:
|
|
fields:
|
|
satz:
|
|
required: true
|
|
selector:
|
|
select:
|
|
options: ["sommer", "winter"]
|
|
km:
|
|
required: true
|
|
selector:
|
|
number: { min: 0, max: 2000000, step: 0.1, mode: box, unit_of_measurement: km }
|
|
|
|
backup_wiederherstellen:
|
|
fields:
|
|
profil_json:
|
|
selector:
|
|
object:
|
|
fahrten_json:
|
|
selector:
|
|
object:
|
|
tankvorgaenge_json:
|
|
selector:
|
|
object:
|
|
entitaeten_json:
|
|
selector:
|
|
object:
|
|
|
|
historie_importieren:
|
|
fields:
|
|
start:
|
|
required: true
|
|
example: "2026-01-01T00:00:00"
|
|
selector:
|
|
text:
|
|
ende:
|
|
required: true
|
|
example: "2026-08-23T00:00:00"
|
|
selector:
|
|
text:
|