diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..ac62d70 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,18 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + # Maintain dependencies for Go + - package-ecosystem: "gomod" + directory: "/" + schedule: + interval: "weekly" + + # Maintain dependencies for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..b3fa13a --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,40 @@ +name: Test + +on: + push: + branches: [main] + pull_request: + branches: [main] + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + go-version: [1.20", "1.21", "1.22"] + + steps: + - uses: actions/checkout@v4 + - name: Setup Go ${{ matrix.go-version }} + uses: actions/setup-go@v5 + with: + go-version: ${{ matrix.go-version }} + # You can test your matrix by printing the current Go version + + - name: Get dependencies + run: | + go get -v -t ./... + go install gotest.tools/gotestsum@latest + + - name: modVerify + run: go mod verify + + - name: Run Tests with go testsum + run: gotestsum --format pkgname --jsonfile test.json + + - name: Annotate tests + if: always() + uses: guyarb/golang-test-annotations@v0.8.0 + with: + test-results: test.json diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..9a740c4 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,27 @@ +name: golangci-lint +on: + pull_request: + branches: ["**"] +env: + GOPRIVATE: github.com/DIMO-Network + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +jobs: + golangci: + runs-on: ubuntu-latest + + name: lint + steps: + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: 1.21 + + - name: Checkout code + uses: actions/checkout@v4 + + - name: golangci-lint + uses: golangci/golangci-lint-action@v4 + with: + version: latest + only-new-issues: false + args: --modules-download-mode=readonly --timeout=5m diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..736f516 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Go workspace file +go.work + +# VS code files +.vscode/* +*.code-workspace +.history/ + +# allow launch.json +!.vscode/launch.json + +# GoLand +.idea/ + + diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..a18ed53 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,58 @@ +linters-settings: + funlen: + lines: 100 + statements: 50 + gocyclo: + min-complexity: 15 + goimports: + local-prefixes: github.com/DIMO-Network/mnemonic + govet: + check-shadowing: true + misspell: + locale: US + ignore-words: + - artefact + nolintlint: + allow-unused: false # report any unused nolint directives + require-explanation: true # require an explanation for nolint directives + require-specific: false # don't require nolint directives to be specific about which linter is being skipped + revive: + confidence: 0 + +linters: + disable-all: true + enable: + - bodyclose + - dogsled + - dupl + - errcheck + - exportloopref + - funlen + - gocritic + - goconst + - gocyclo + - gofumpt + - goimports + - revive + - rowserrcheck + - goprintffuncname + - gosec + - gosimple + - govet + - ineffassign + - misspell + - nakedret + - noctx + - nolintlint + - staticcheck + - stylecheck + - sqlclosecheck + - typecheck + - unconvert + - unparam + - unused + - whitespace + +issues: + # enable issues excluded by default + exclude-use-default: false diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..e85ccfc --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,21 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Run codegen", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/internal/codegen/cmd", + "args": [ + "-output=${workspaceFolder}/pkg/vss", + "-spec=${workspaceFolder}/schema/vss_rel_4.2-DIMO.csv", + "-migrations=${workspaceFolder}/schema/migrations.json", + "-package=vss" + ] + } + ] +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..7eeca64 --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +# Model Garage + +![GitHub license](https://img.shields.io/badge/license-Apache%202.0-blue.svg) +[![GoDoc](https://godoc.org/github.com/KevinJoiner/model-garage?status.svg)](https://godoc.org/github.com/KevinJoiner/model-garage) +[![Go Report Card](https://goreportcard.com/badge/github.com/KevinJoiner/model-garage)](https://goreportcard.com/report/github.com/KevinJoiner/model-garage) + +Welcome to the **Model Garage**, a Golang toolkit for managing and working with DIMO models generated from vspec CSV schemas. Model Garage provides the following features: + +## Features + +1. **Model Creation**: Create models from vspec CSV schemas, represented as Go structs and matching Clickhouse tables. + +2. **JSON Conversion**: Easily convert JSON data for your models with automatically generated and customizable conversion functions. + +3. **Random Data Generation**: [**Coming Soon**] Quickly generate models populated with random data for testing or sample data. + +## Getting Started + +1. **Installation**: + ```bash + go get github.com/your-username/model-garage + ``` + +2. **Import in Your Code**: + ```go + import "github.com/your-username/model-garage" + ``` + +3. **Usage**: + Explore the documentation to start using Model Garage in your project. diff --git a/generate.go b/generate.go new file mode 100644 index 0000000..8575cfa --- /dev/null +++ b/generate.go @@ -0,0 +1,2 @@ +//go:generate go run ./internal/codegen/cmd -output=./pkg/vss -spec=./schema/vss_rel_4.2-DIMO.csv -migrations=./schema/migrations.json -package=vss +package main diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..6f6e3c5 --- /dev/null +++ b/go.mod @@ -0,0 +1,14 @@ +module github.com/KevinJoiner/model-garage + +go 1.22.0 + +require ( + github.com/tidwall/gjson v1.17.1 + golang.org/x/tools v0.18.0 +) + +require ( + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + golang.org/x/mod v0.15.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..c95b037 --- /dev/null +++ b/go.sum @@ -0,0 +1,10 @@ +github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= +github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= diff --git a/internal/codegen/clickhouse/clickhouse.go b/internal/codegen/clickhouse/clickhouse.go new file mode 100644 index 0000000..ea5457a --- /dev/null +++ b/internal/codegen/clickhouse/clickhouse.go @@ -0,0 +1,51 @@ +package clickhouse + +import ( + _ "embed" + "fmt" + "os" + "path/filepath" + "strings" + "text/template" + + "github.com/KevinJoiner/model-garage/internal/codegen" +) + +//go:embed vssTable.tmpl +var clickhouseTableTemplate string + +// Generate creates a new ClickHouse table file. +func Generate(tmplData *codegen.TemplateData, outputDir string) error { + // create a new ClickHouse table template. + clickhouseTableTmpl, err := createClickHouseTableTemplate() + if err != nil { + return err + } + + // execute the ClickHouse table template directly to a file. + clickhouseTableOutputFile, err := os.Create(filepath.Join(outputDir, codegen.ClickhouseFileName)) + if err != nil { + return fmt.Errorf("error creating ClickHouse table output file: %w", err) + } + defer func() { + if cerr := clickhouseTableOutputFile.Close(); err == nil && cerr != nil { + err = cerr + } + }() + + err = clickhouseTableTmpl.Execute(clickhouseTableOutputFile, &tmplData) + if err != nil { + return fmt.Errorf("error executing ClickHouse table template: %w", err) + } + return nil +} + +func createClickHouseTableTemplate() (*template.Template, error) { + tmpl, err := template.New("clickhouseTableTemplate").Funcs(template.FuncMap{ + "escapeDesc": func(desc string) string { return strings.ReplaceAll(desc, `'`, `\'`) }, + }).Parse(clickhouseTableTemplate) + if err != nil { + return nil, fmt.Errorf("error parsing ClickHouse table template: %w", err) + } + return tmpl, nil +} diff --git a/internal/codegen/clickhouse/vssTable.tmpl b/internal/codegen/clickhouse/vssTable.tmpl new file mode 100644 index 0000000..3893773 --- /dev/null +++ b/internal/codegen/clickhouse/vssTable.tmpl @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS vss ( +{{- range .DataSignals }} + {{ .CHName }} {{ .CHType }} COMMENT '{{ escapeDesc .Desc }}', +{{- end }} +) +ENGINE = MergeTree() +ORDER BY (Vehicle_DIMO_Subject, Vehicle_DIMO_Timestamp) \ No newline at end of file diff --git a/internal/codegen/cmd/main.go b/internal/codegen/cmd/main.go new file mode 100644 index 0000000..e55b93c --- /dev/null +++ b/internal/codegen/cmd/main.go @@ -0,0 +1,48 @@ +package main + +import ( + "flag" + "log" + + "github.com/KevinJoiner/model-garage/internal/codegen" + "github.com/KevinJoiner/model-garage/internal/codegen/clickhouse" + "github.com/KevinJoiner/model-garage/internal/codegen/convert" + "github.com/KevinJoiner/model-garage/internal/codegen/model" +) + +func main() { + // Command-line flags + outputDir := flag.String("output", ".", "Output directory for the generated Go file") + vspecPath := flag.String("spec", "./vspec.csv", "Path to the vspec CSV file") + migrationPath := flag.String("migrations", "./migrations.json", "Path to the migrations JSON file") + packageName := flag.String("package", "vspec", "Name of the package to generate") + flag.Parse() + + err := codegen.EnsureDir(*outputDir) + if err != nil { + log.Fatal(err) + } + + signals, err := codegen.GetMigratedSignals(*vspecPath, *migrationPath) + if err != nil { + log.Fatal(err) + } + + tmplData := codegen.TemplateData{*packageName, signals} + + err = model.Generate(&tmplData, *outputDir) + if err != nil { + log.Fatalf("failed to generate model: %v", err) + } + + err = clickhouse.Generate(&tmplData, *outputDir) + if err != nil { + log.Fatalf("failed to generate ClickHouse file: %v", err) + } + + err = convert.Generate(&tmplData, *outputDir) + if err != nil { + log.Fatalf("failed to generate convert file: %v", err) + } + +} diff --git a/internal/codegen/codegen.go b/internal/codegen/codegen.go new file mode 100644 index 0000000..38a2832 --- /dev/null +++ b/internal/codegen/codegen.go @@ -0,0 +1,88 @@ +// Package codegen provides the code generation functionality for converting VSPEC signals to Go structs and ClickHouse tables. +package codegen + +import ( + _ "embed" + "fmt" + "os" + + "golang.org/x/tools/imports" +) + +const ( + ClickhouseFileName = "vss-table.sql" + StructFileName = "vss-structs.go" + ConvertFileName = "vss-convert.go" + ConvertFuncFileName = "vss-convert-funcs.go" + readAll = 0755 +) + +// TemplateData contains the data to be used during template execution. +type TemplateData struct { + PackageName string + DataSignals []*SignalInfo +} + +// GetMigratedSignals reads the signals and migrations files and merges them. +func GetMigratedSignals(specFile, migrationFile string) ([]*SignalInfo, error) { + signals, err := loadSignalsCSV(specFile) + if err != nil { + return nil, fmt.Errorf("error reading signals: %w", err) + } + + migrations, err := loadMigrationJSON(migrationFile) + if err != nil { + return nil, fmt.Errorf("error reading migration file: %w", err) + } + + migratedSignals := migrations.MigratedSignal(signals) + return migratedSignals, nil +} + +// EnsureDir ensures the output directory exists. +func EnsureDir(dir string) error { + info, err := os.Stat(dir) + if err == nil { + if !info.IsDir() { + return fmt.Errorf("output directory is not a directory") + } + return nil + } + + if !os.IsNotExist(err) { + return fmt.Errorf("error checking output directory: %w", err) + } + // create the output directory + err = os.MkdirAll(dir, readAll) + if err != nil { + return fmt.Errorf("error creating output directory: %w", err) + } + return nil +} + +// FormatAndWriteToFile formats the go source with goimports and writes it to the output file. +func FormatAndWriteToFile(goData []byte, outputPath string) error { + formatted, err := imports.Process(outputPath, goData, &imports.Options{ + AllErrors: true, + Comments: true, + }) + if err != nil { + // print the error and continue + fmt.Printf("error formatting go source: %v\n", err) + formatted = goData + } + goOutputFile, err := os.Create(outputPath) + if err != nil { + return fmt.Errorf("error creating output file: %w", err) + } + defer func() { + if cerr := goOutputFile.Close(); err == nil && cerr != nil { + err = cerr + } + }() + _, err = goOutputFile.Write(formatted) + if err != nil { + return fmt.Errorf("error writing to file: %w", err) + } + return nil +} diff --git a/internal/codegen/convert/convert.go b/internal/codegen/convert/convert.go new file mode 100644 index 0000000..8c98d43 --- /dev/null +++ b/internal/codegen/convert/convert.go @@ -0,0 +1,179 @@ +package convert + +import ( + "bytes" + _ "embed" + "fmt" + "go/ast" + "go/parser" + "go/token" + "os" + "path/filepath" + "strings" + "text/template" + + "github.com/KevinJoiner/model-garage/internal/codegen" +) + +//go:embed convert.tmpl +var convertTemplate string + +//go:embed convertFunc.tmpl +var convertFuncTemplate string + +const header = `package %s + +// This file is automatically populated with conversion functions for each field of a vehicle struct. +// any conversion functions already defined in this package will not be generated. +// Code generated by model-garage. +` + +// Generate creates a conversion functions for each field of a vehicle struct. +// as well as the entire vehicle struct. +func Generate(tmplData *codegen.TemplateData, outputDir string) (err error) { + goTemplate, err := createGoTemplate() + if err != nil { + return err + } + convertFuncTemplate, err := createConvertFuncTemplate() + if err != nil { + return err + } + + // execute the struct template + var outBuf bytes.Buffer + if err := goTemplate.Execute(&outBuf, &tmplData); err != nil { + return fmt.Errorf("error executing template: %w", err) + } + + goOutputPath := filepath.Join(outputDir, codegen.ConvertFileName) + // format and write the go file. + err = codegen.FormatAndWriteToFile(outBuf.Bytes(), goOutputPath) + if err != nil { + return fmt.Errorf("error formatting and writing to file: %w", err) + } + + existingFuncs, err := getDeclaredFunctions(outputDir) + if err != nil { + return fmt.Errorf("error getting declared functions: %w", err) + } + + // get a list of SignalInfos that need new convert functions + var needsConvertFunc []*codegen.SignalInfo + for _, signal := range tmplData.DataSignals { + if signal.Conversion != nil && !existingFuncs[convertName(signal)] { + needsConvertFunc = append(needsConvertFunc, signal) + } + } + if len(needsConvertFunc) == 0 { + return nil + } + + // check if we need to create convertFunc file + convertFuncPath := filepath.Join(outputDir, codegen.ConvertFuncFileName) + + err = ensureFuncFile(convertFuncPath, tmplData.PackageName) + if err != nil { + return err + } + + convertData, err := os.ReadFile(convertFuncPath) + if err != nil { + return fmt.Errorf("error reading convertFunc file: %w", err) + } + convertBuff := bytes.NewBuffer(convertData) + for _, signal := range needsConvertFunc { + if err := convertFuncTemplate.Execute(convertBuff, signal); err != nil { + return fmt.Errorf("error executing convertFunc template: %w", err) + } + } + err = codegen.FormatAndWriteToFile(convertBuff.Bytes(), convertFuncPath) + if err != nil { + return fmt.Errorf("error formatting and writing to file: %w", err) + } + + return nil +} + +func createGoTemplate() (*template.Template, error) { + tmpl, err := template.New("convertTemplate").Funcs(template.FuncMap{ + "convertName": convertName, + }).Parse(convertTemplate) + if err != nil { + return nil, fmt.Errorf("error parsing go struct template: %w", err) + } + return tmpl, nil +} + +func createConvertFuncTemplate() (*template.Template, error) { + tmpl, err := template.New("convertFuncTemplate").Funcs(template.FuncMap{ + "convertName": convertName, + }).Parse(convertFuncTemplate) + if err != nil { + return nil, fmt.Errorf("error parsing go struct template: %w", err) + } + return tmpl, nil +} + +func getDeclaredFunctions(outputPath string) (map[string]bool, error) { + fset := token.NewFileSet() + declaredFunctions := map[string]bool{} + + list, err := os.ReadDir(outputPath) + if err != nil { + return nil, err + } + + for _, d := range list { + if d.IsDir() || !strings.HasSuffix(d.Name(), ".go") { + continue + } + filename := filepath.Join(outputPath, d.Name()) + src, err := parser.ParseFile(fset, filename, nil, parser.SkipObjectResolution|parser.ParseComments) + if err != nil { + return nil, fmt.Errorf("error parsing file: %w", err) + } + for _, decl := range src.Decls { + fn, ok := decl.(*ast.FuncDecl) + if !ok || fn.Recv != nil { + continue + } + declaredFunctions[fn.Name.Name] = true + } + + } + + return declaredFunctions, nil +} + +func convertName(signal *codegen.SignalInfo) string { + return "To" + signal.GOName +} + +// ensureFuncFile checks if the convertFunc file exists and creates it if it does not. +// It also writes the package header to the file if it is created. +func ensureFuncFile(convertFuncPath string, packageName string) error { + _, err := os.Stat(convertFuncPath) + if err == nil { + return nil + } + if !os.IsNotExist(err) { + return fmt.Errorf("error checking for %s file: %w", codegen.ConvertFuncFileName, err) + } + // create the convertFunc file + funcFile, err := os.Create(convertFuncPath) + if err != nil { + return fmt.Errorf("error creating convertFunc file: %w", err) + } + _, err = funcFile.WriteString(fmt.Sprintf(header, packageName)) + if err != nil { + _ = funcFile.Close() + return fmt.Errorf("error writing to convertFunc file: %w", err) + } + err = funcFile.Close() + if err != nil { + return fmt.Errorf("error closing convertFunc file: %w", err) + } + + return nil +} diff --git a/internal/codegen/convert/convert.tmpl b/internal/codegen/convert/convert.tmpl new file mode 100644 index 0000000..215b7d6 --- /dev/null +++ b/internal/codegen/convert/convert.tmpl @@ -0,0 +1,71 @@ +// Code generated by "model-garage" DO NOT EDIT. +package {{ .PackageName }} + +var ( + // errInvalidType is returned when a field is not of the expected type or not found. + errInvalidType = errors.New("invalid type") + + // errNotFound is returned when a field is not found. + errNotFound = errors.New("not found") +) + +// IsNotFound returns true if the error is of type errNotFound. +func IsNotFound(err error) bool { + return errors.Is(err, errNotFound) +} + +// IsInvalidType returns true if the error is of type errInvalidType. +func IsInvalidType(err error) bool { + return errors.Is(err, errInvalidType) +} + + +// FromData creates a new Vehicle from a map of data. Using defined conversion functions. +// If skipNotFound is true, the function will not return an error if a key is not found. +// insetad the field will be set to the zero value of the type. +func FromData(jsonData []byte, skipNotFound bool) (*Vehicle, error) { + vehicle := Vehicle{} + +{{ $first := true }} +{{- range .DataSignals }} + {{ if not .Conversion }} {{ continue }} {{ end }} + {{ if $first }} + var err error + var result gjson.Result + {{ $first = false }} {{ end }} + + // convert {{ .Conversion.OriginalName }} to {{ .GOName }} + result = gjson.GetBytes(jsonData, "{{ .Conversion.OriginalName }}") + if result.Exists() { + {{ if .Conversion.IsArray -}} + if !result.IsArray() { + return nil, fmt.Errorf("%w, field '{{ .Conversion.OriginalName }}' is not an array", errInvalidType) + } + slice{{ .GOName}} := make([]{{ .Conversion.OriginalType }}, len(result.Array())) + for i, res := range result.Array() { + v, ok := res.Value().({{ .Conversion.OriginalType }}) + if !ok{ + return nil, fmt.Errorf("%w, field '{{ .Conversion.OriginalName }}' array element %d is not of type {{ .Conversion.OriginalType }}", errInvalidType, i) + } + slice{{ .GOName}}[i] = v + } + vehicle.{{ .GOName }}, err = {{ convertName . }}(slice{{ .GOName}} ) + if err != nil { + return nil, fmt.Errorf("failed to convert '{{ .Conversion.OriginalName }}': %w", err) + } + {{ else -}} + val{{ .GOName}}, ok := result.Value().({{ .Conversion.OriginalType }}) + if !ok { + return nil, fmt.Errorf("%w, field '{{ .Conversion.OriginalName }}' is not of type {{ .Conversion.OriginalType }}", errInvalidType) + } + vehicle.{{ .GOName }}, err = {{ convertName . }}(val{{ .GOName}}) + if err != nil { + return nil, fmt.Errorf("failed to convert '{{ .Conversion.OriginalName }}': %w", err) + } + {{ end -}} + } else if !skipNotFound{ + return nil, fmt.Errorf("%w, field '{{ .Conversion.OriginalName }}'", errNotFound) + } +{{- end }} + return &vehicle, nil +} diff --git a/internal/codegen/convert/convertFunc.tmpl b/internal/codegen/convert/convertFunc.tmpl new file mode 100644 index 0000000..3b04990 --- /dev/null +++ b/internal/codegen/convert/convertFunc.tmpl @@ -0,0 +1,9 @@ + +// {{ convertName . }} converts data as {{ .Conversion.OriginalType }} to {{ .GOType }} +func {{ convertName . }}(val {{ .Conversion.OriginalType }}) ({{ .GOType }}, error) { + {{ if eq .Conversion.OriginalType .GOType -}} + return val, nil + {{- else -}} + panic("not implemented") + {{- end }} +} diff --git a/internal/codegen/load.go b/internal/codegen/load.go new file mode 100644 index 0000000..4b2b1a8 --- /dev/null +++ b/internal/codegen/load.go @@ -0,0 +1,60 @@ +package codegen + +import ( + "encoding/csv" + "encoding/json" + "fmt" + "os" + "slices" + "strings" +) + +func loadSignalsCSV(filePath string) ([]*SignalInfo, error) { + file, err := os.Open(filePath) + if err != nil { + return nil, err + } + defer file.Close() + + reader := csv.NewReader(file) + records, err := reader.ReadAll() + if err != nil { + return nil, err + } + + var signals []*SignalInfo + for i := 1; i < len(records); i++ { + record := records[i] + signals = append(signals, NewSignalInfo(record)) + } + + // Sort the signals by name + slices.SortStableFunc(signals, func(a, b *SignalInfo) int { + return strings.Compare(a.Name, b.Name) + }) + + return signals, nil +} + +func loadMigrationJSON(filePath string) (*Migrations, error) { + file, err := os.Open(filePath) + if err != nil { + return nil, fmt.Errorf("failed to open file: %w", err) + } + defer file.Close() + + decoder := json.NewDecoder(file) + var transInfos []*MigrationInfo + err = decoder.Decode(&transInfos) + if err != nil { + return nil, fmt.Errorf("failed to decode json: %w", err) + } + migrations := &Migrations{ + FromName: map[string]*MigrationInfo{}, + } + for _, info := range transInfos { + migrations.FromName[info.VspecName] = info + } + + return migrations, nil +} diff --git a/internal/codegen/model/model.go b/internal/codegen/model/model.go new file mode 100644 index 0000000..3d5ab8e --- /dev/null +++ b/internal/codegen/model/model.go @@ -0,0 +1,47 @@ +package model + +import ( + "bytes" + _ "embed" + "fmt" + "path/filepath" + "text/template" + + "github.com/KevinJoiner/model-garage/internal/codegen" +) + +//go:embed vehicle.tmpl +var structTemplate string + +// Generate creates a new Go struct file to represent the vehicle struct. +func Generate(tmplData *codegen.TemplateData, outputDir string) error { + modelTemplate, err := createModelTemplate() + if err != nil { + return err + } + + // execute the struct template + var outBuf bytes.Buffer + if err := modelTemplate.Execute(&outBuf, &tmplData); err != nil { + return fmt.Errorf("error executing template: %w", err) + } + + goOutputPath := filepath.Join(outputDir, codegen.StructFileName) + // format and write the go file. + err = codegen.FormatAndWriteToFile(outBuf.Bytes(), goOutputPath) + if err != nil { + return err + } + + return nil +} + +func createModelTemplate() (*template.Template, error) { + tmpl, err := template.New("structTemplate").Funcs(template.FuncMap{ + "sqlFileName": func() string { return codegen.ClickhouseFileName }, + }).Parse(structTemplate) + if err != nil { + return nil, fmt.Errorf("error parsing go struct template: %w", err) + } + return tmpl, nil +} diff --git a/internal/codegen/model/vehicle.tmpl b/internal/codegen/model/vehicle.tmpl new file mode 100644 index 0000000..3adf61f --- /dev/null +++ b/internal/codegen/model/vehicle.tmpl @@ -0,0 +1,30 @@ +// Code generated by "model-garage" DO NOT EDIT. +package {{ .PackageName }} + +import ( + _ "embed" + +) + +//go:embed {{ sqlFileName }} +var VSSTableCreateQuery string + +const ( +{{- range .DataSignals}} + // Field{{ .GOName }} {{ .Desc }} + Field{{ .GOName }} = "{{ .CHName }}" +{{- end}} +) + +type Vehicle struct { +{{- range .DataSignals }} + {{ if .Deprecated }}// Deprecated field{{ end -}} + // {{ .GOName }} {{ .Desc }} + {{ .GOName }} {{ .GOType }} `ch:"{{ .CHName }}" json:"{{ .CHName }},omitempty"` +{{- end }} +} + +// InsertStatement for inserting a vehicle and all its fields into the table. +{{$first := true}} +const InsertStatment = "INSERT INTO vss ({{- range .DataSignals -}}{{if $first}}{{$first = false}}{{else}}, {{end}}{{.CHName}}{{end}})" +const InsertStatmentValues = InsertStatment + " Values" \ No newline at end of file diff --git a/internal/codegen/signal.go b/internal/codegen/signal.go new file mode 100644 index 0000000..7500937 --- /dev/null +++ b/internal/codegen/signal.go @@ -0,0 +1,230 @@ +package codegen + +import ( + "fmt" + "regexp" + "strings" +) + +const ( + nameCol = 0 + typeCol = 1 + dataTypeCol = 2 + deprecatedCol = 3 + unitCol = 4 + minCol = 5 + maxCol = 6 + descCol = 7 + colLen = 8 +) + +// SignalInfo contains the information for a signal. +// This information comes from the combinations of the spec and migration files. +type SignalInfo struct { + // From spec CSV + Name string + Type string + DataType string + Unit string + Min string + Max string + Desc string + Deprecated bool + + // Derived + IsArray bool + GOName string + BaseGoType string + BaseCHType string + CHName string + Conversion *ConversionInfo +} + +// ConversionInfo contains the conversion information for a field. +type ConversionInfo struct { + OriginalName string `json:"originalName"` + OriginalType string `json:"originalType"` + IsArray bool `json:"isArray"` +} + +// MigrationInfo contains the migration information for a field. +type MigrationInfo struct { + IsArray *bool `json:"isArray"` + Conversion *ConversionInfo `json:"conversion"` + VspecName string `json:"vspecName"` + ClickHouseType string `json:"clickHouseType"` + GoType string `json:"goType"` +} + +// Migrations is a map of migrations from clickhouse Name to migration info. +type Migrations struct { + FromName map[string]*MigrationInfo + Signals []*SignalInfo +} + +// MigratedSignal returns a new slice of signals with the migration information applied. +// excluding signals that are not in the migration file. +func (m *Migrations) MigratedSignal(signal []*SignalInfo) []*SignalInfo { + sigs := []*SignalInfo{} + for _, sig := range signal { + if migration, ok := m.FromName[sig.Name]; ok { + newSignal := *sig + newSignal.MergeWithMigration(migration) + sigs = append(sigs, &newSignal) + } + } + return sigs +} + +// NewSignalInfo creates a new SignalInfo from a record from the CSV file. +func NewSignalInfo(record []string) *SignalInfo { + if len(record) < colLen { + return nil + } + sig := &SignalInfo{ + Name: record[nameCol], + Type: record[typeCol], + DataType: record[dataTypeCol], + Deprecated: record[deprecatedCol] == "true", + Unit: record[unitCol], + Min: record[minCol], + Max: record[maxCol], + Desc: record[descCol], + } + // arrays are denoted by [] at the end of the type ex uint8[] + sig.IsArray = strings.HasSuffix(sig.DataType, "[]") + baseType := sig.DataType + if sig.IsArray { + // remove the [] from the type + baseType = sig.DataType[:len(sig.DataType)-2] + } + if baseType != "" { + // if this is not a branch type, we can convert it to default golang and clickhouse types + sig.BaseGoType = goTypeFromVSPEC(baseType) + sig.BaseCHType = chTypeFromVSPEC(baseType) + } + sig.GOName = goName(sig.Name) + sig.CHName = chName(sig.Name) + + return sig +} + +// MergeWithMigration merges the signal with the migration information. +func (s *SignalInfo) MergeWithMigration(migration *MigrationInfo) { + if migration.ClickHouseType != "" { + s.BaseCHType = migration.ClickHouseType + } + if migration.GoType != "" { + s.BaseGoType = migration.GoType + } + if migration.IsArray != nil { + s.IsArray = *migration.IsArray + } + if migration.Conversion != nil { + s.Conversion = migration.Conversion + if s.Conversion.OriginalType == "" { + s.Conversion.OriginalType = s.GOType() + } + } +} + +// GOType returns the golang type of the signal. +func (s *SignalInfo) GOType() string { + if s.IsArray { + return "[]" + s.BaseGoType + } + return s.BaseGoType +} + +// CHType returns the clickhouse type of the signal. +func (s *SignalInfo) CHType() string { + if s.IsArray { + return "Array(" + s.BaseCHType + ")" + } + return s.BaseCHType +} + +// CHColType returns the clickhouse proto.Column type of the signal. +func (s *SignalInfo) CHColType() string { + var builder strings.Builder + _, _ = builder.WriteString("new(proto.Col") + switch s.BaseCHType { + case "UInt8", "Int8", "UInt16", "Int16", "UInt32", "Int32", "UInt64", "Int64", "Float32", "Float64", "Bool", "DateTime": + _, _ = builder.WriteString(s.BaseCHType) + case "String": + _, _ = builder.WriteString("Str") + default: + _, _ = builder.WriteString("Auto") + } + _, _ = builder.WriteString(")") + if s.IsArray { + _, _ = builder.WriteString(".Array()") + } + return builder.String() +} + +// AppendArg returns the argument to be used in the Append method of the column. +func (s *SignalInfo) AppendArg() string { + if s.IsArray { + return fmt.Sprintf("%s{vehicle.%s}", s.GOType(), s.GOName) + } + return "vehicle." + s.GOName +} + +func goName(name string) string { + // Remove special characters and ensure PascalCase + re := regexp.MustCompile("[^a-zA-Z0-9]+") + return re.ReplaceAllString(name, "") +} + +func chName(name string) string { + return strings.ReplaceAll(name, ".", "_") +} + +// goTypeFromVSPEC converts vspec type to golang types. +func goTypeFromVSPEC(dataType string) string { + switch dataType { + case "uint8", "int8", "uint16", "int16", "uint32", "int32", "uint64", "int64", "string": + return dataType + case "boolean": + return "bool" + case "float": + return "float32" + case "double": + return "float64" + default: + return "any" + } +} + +// chTypeFromVSPEC converts vspec type to clickhouse types. +func chTypeFromVSPEC(baseType string) string { + switch baseType { + case "uint8": + return "UInt8" + case "int8": + return "Int8" + case "uint16": + return "UInt16" + case "int16": + return "Int16" + case "uint32": + return "UInt32" + case "int32": + return "Int32" + case "uint64": + return "UInt64" + case "int64": + return "Int64" + case "string": + return "String" + case "boolean": + return "Bool" + case "float": + return "Float32" + case "double": + return "Float64" + default: + return "String" + } +} diff --git a/internal/convert/convert.go b/internal/convert/convert.go new file mode 100644 index 0000000..d4ea862 --- /dev/null +++ b/internal/convert/convert.go @@ -0,0 +1,58 @@ +// Package convert holds common functionality for generating conversion functions. +package convert + +import ( + "math" +) + +// Float64Tofloat32 converts float64 to float32. +func Float64Tofloat32(val float64) float32 { + if val > math.MaxFloat32 { + return math.MaxFloat32 + } + return float32(val) +} + +// Float64toUint32 converts float64 to uint32. +func Float64toUint32(val float64) uint32 { + if val > math.MaxUint32 { + return math.MaxUint32 + } + if val < 0 { + return 0 + } + return uint32(val) +} + +// Float64toUint16 converts float64 to uint16. +func Float64toUint16(val float64) uint16 { + if val > math.MaxUint16 { + return math.MaxUint16 + } + if val < 0 { + return 0 + } + return uint16(val) +} + +// Float64toUint16 converts float64 to int16. +func Float64toInt16(val float64) int16 { + if val > math.MaxInt16 { + return math.MaxInt16 + } + if val < math.MinInt16 { + return math.MinInt16 + } + return int16(val) +} + +// Float64toUint8 converts float64 to uint8 +func Float64toUint8(val float64) uint8 { + if val > math.MaxUint8 { + return math.MaxUint8 + } + if val < 0 { + return 0 + } + return uint8(val) +} diff --git a/pkg/vss/vss-convert-funcs.go b/pkg/vss/vss-convert-funcs.go new file mode 100644 index 0000000..4bf4b88 --- /dev/null +++ b/pkg/vss/vss-convert-funcs.go @@ -0,0 +1,202 @@ +package vss + +import ( + "time" + + "github.com/KevinJoiner/model-garage/internal/convert" +) + +// This file is automatically populated with conversion functions for each field of a vehicle struct. +// any conversion functions already defined in this package will not be generated. +// Code generated by model-garage. + +// ToVehicleChassisAxleRow1WheelLeftTirePressure converts data as float64 to uint16 +func ToVehicleChassisAxleRow1WheelLeftTirePressure(val float64) (uint16, error) { + return convert.Float64toUint16(val), nil +} + +// ToVehicleChassisAxleRow1WheelRightTirePressure converts data as float64 to uint16 +func ToVehicleChassisAxleRow1WheelRightTirePressure(val float64) (uint16, error) { + return convert.Float64toUint16(val), nil +} + +// ToVehicleChassisAxleRow2WheelLeftTirePressure converts data as float64 to uint16 +func ToVehicleChassisAxleRow2WheelLeftTirePressure(val float64) (uint16, error) { + return convert.Float64toUint16(val), nil +} + +// ToVehicleChassisAxleRow2WheelRightTirePressure converts data as float64 to uint16 +func ToVehicleChassisAxleRow2WheelRightTirePressure(val float64) (uint16, error) { + return convert.Float64toUint16(val), nil +} + +// ToVehicleCurrentLocationAltitude converts data as float64 to float64 +func ToVehicleCurrentLocationAltitude(val float64) (float64, error) { + return val, nil +} + +// ToVehicleCurrentLocationLatitude converts data as float64 to float64 +func ToVehicleCurrentLocationLatitude(val float64) (float64, error) { + return val, nil +} + +// ToVehicleCurrentLocationLongitude converts data as float64 to float64 +func ToVehicleCurrentLocationLongitude(val float64) (float64, error) { + return val, nil +} + +// ToVehicleCurrentLocationTimestamp converts data as string to time.Time +func ToVehicleCurrentLocationTimestamp(val string) (time.Time, error) { + return time.Parse(time.RFC3339, val) +} + +// ToVehicleDIMODefinitionID converts data as string to string +func ToVehicleDIMODefinitionID(val string) (string, error) { + return val, nil +} + +// ToVehicleDIMOSource converts data as string to string +func ToVehicleDIMOSource(val string) (string, error) { + return val, nil +} + +// ToVehicleDIMOSubject converts data as string to string +func ToVehicleDIMOSubject(val string) (string, error) { + return val, nil +} + +// ToVehicleDIMOTimestamp converts data as string to time.Time +func ToVehicleDIMOTimestamp(val string) (time.Time, error) { + return time.Parse(time.RFC3339, val) +} + +// ToVehicleDIMOType converts data as string to string +func ToVehicleDIMOType(val string) (string, error) { + return val, nil +} + +// ToVehicleDIMOVehicleID converts data as string to string +func ToVehicleDIMOVehicleID(val string) (string, error) { + return val, nil +} + +// ToVehicleExteriorAirTemperature converts data as float64 to float32 +func ToVehicleExteriorAirTemperature(val float64) (float32, error) { + return convert.Float64Tofloat32(val), nil +} + +// ToVehicleLowVoltageBatteryCurrentVoltage converts data as float64 to float32 +func ToVehicleLowVoltageBatteryCurrentVoltage(val float64) (float32, error) { + return convert.Float64Tofloat32(val), nil +} + +// ToVehicleOBDBarometricPressure converts data as float64 to float32 +func ToVehicleOBDBarometricPressure(val float64) (float32, error) { + return convert.Float64Tofloat32(val), nil +} + +// ToVehicleOBDEngineLoad converts data as float64 to float32 +func ToVehicleOBDEngineLoad(val float64) (float32, error) { + return convert.Float64Tofloat32(val), nil +} + +// ToVehicleOBDIntakeTemp converts data as float64 to float32 +func ToVehicleOBDIntakeTemp(val float64) (float32, error) { + return convert.Float64Tofloat32(val), nil +} + +// ToVehicleOBDRunTime converts data as float64 to float32 +func ToVehicleOBDRunTime(val float64) (float32, error) { + return convert.Float64Tofloat32(val), nil +} + +// ToVehiclePowertrainCombustionEngineECT converts data as float64 to int16 +func ToVehiclePowertrainCombustionEngineECT(val float64) (int16, error) { + return convert.Float64toInt16(val), nil +} + +// ToVehiclePowertrainCombustionEngineEngineOilLevel converts data as float64 to string +func ToVehiclePowertrainCombustionEngineEngineOilLevel(oilLevel float64) (string, error) { + switch { + case oilLevel < 0.25: + return "CRITICALLY_LOW", nil + case oilLevel < 0.5: + return "LOW", nil + case oilLevel < 0.75: + return "NORMAL", nil + case oilLevel < .99: + return "HIGH", nil + default: + return "CRITICALLY_HIGH", nil + } +} + +// ToVehiclePowertrainCombustionEngineSpeed converts data as float64 to uint16 +func ToVehiclePowertrainCombustionEngineSpeed(val float64) (uint16, error) { + return convert.Float64toUint16(val), nil +} + +// ToVehiclePowertrainCombustionEngineTPS converts data as float64 to uint8 +func ToVehiclePowertrainCombustionEngineTPS(val float64) (uint8, error) { + return convert.Float64toUint8(val), nil +} + +// ToVehiclePowertrainFuelSystemAbsoluteLevel converts data as float64 to float32 +func ToVehiclePowertrainFuelSystemAbsoluteLevel(val float64) (float32, error) { + return convert.Float64Tofloat32(val), nil +} + +// ToVehiclePowertrainFuelSystemSupportedFuelTypes converts data as string to []string +func ToVehiclePowertrainFuelSystemSupportedFuelTypes(val string) ([]string, error) { + return []string{val}, nil +} + +// ToVehiclePowertrainRange converts data as float64 to uint32 +func ToVehiclePowertrainRange(val float64) (uint32, error) { + return convert.Float64toUint32(val), nil +} + +// ToVehiclePowertrainTractionBatteryChargingChargeLimit converts data as float64 to uint8 +func ToVehiclePowertrainTractionBatteryChargingChargeLimit(val float64) (uint8, error) { + return convert.Float64toUint8(val), nil +} + +// ToVehiclePowertrainTractionBatteryChargingIsCharging converts data as bool to bool +func ToVehiclePowertrainTractionBatteryChargingIsCharging(val bool) (bool, error) { + return val, nil +} + +// ToVehiclePowertrainTractionBatteryGrossCapacity converts data as float64 to uint16 +func ToVehiclePowertrainTractionBatteryGrossCapacity(val float64) (uint16, error) { + return convert.Float64toUint16(val), nil +} + +// ToVehiclePowertrainTractionBatteryStateOfChargeCurrent converts data as float64 to float32 +func ToVehiclePowertrainTractionBatteryStateOfChargeCurrent(val float64) (float32, error) { + return convert.Float64Tofloat32(val), nil +} + +// ToVehiclePowertrainTransmissionTravelledDistance converts data as float64 to float32 +func ToVehiclePowertrainTransmissionTravelledDistance(val float64) (float32, error) { + return convert.Float64Tofloat32(val), nil +} + +// ToVehicleSpeed converts data as float64 to float32 +func ToVehicleSpeed(val float64) (float32, error) { + return convert.Float64Tofloat32(val), nil +} + +// ToVehicleVehicleIdentificationBrand converts data as string to string +func ToVehicleVehicleIdentificationBrand(val string) (string, error) { + return val, nil +} + +// ToVehicleVehicleIdentificationModel converts data as string to string +func ToVehicleVehicleIdentificationModel(val string) (string, error) { + return val, nil +} + +// ToVehicleVehicleIdentificationYear converts data as float64 to uint16 +func ToVehicleVehicleIdentificationYear(val float64) (uint16, error) { + return convert.Float64toUint16(val), nil +} diff --git a/pkg/vss/vss-convert.go b/pkg/vss/vss-convert.go new file mode 100644 index 0000000..c223632 --- /dev/null +++ b/pkg/vss/vss-convert.go @@ -0,0 +1,578 @@ +// Code generated by "model-garage" DO NOT EDIT. +package vss + +import ( + "errors" + "fmt" + + "github.com/tidwall/gjson" +) + +var ( + // errInvalidType is returned when a field is not of the expected type or not found. + errInvalidType = errors.New("invalid type") + + // errNotFound is returned when a field is not found. + errNotFound = errors.New("not found") +) + +// IsNotFound returns true if the error is of type errNotFound. +func IsNotFound(err error) bool { + return errors.Is(err, errNotFound) +} + +// IsInvalidType returns true if the error is of type errInvalidType. +func IsInvalidType(err error) bool { + return errors.Is(err, errInvalidType) +} + +// FromData creates a new Vehicle from a map of data. Using defined conversion functions. +// If skipNotFound is true, the function will not return an error if a key is not found. +// insetad the field will be set to the zero value of the type. +func FromData(jsonData []byte, skipNotFound bool) (*Vehicle, error) { + vehicle := Vehicle{} + + var err error + var result gjson.Result + + // convert data.tires.frontLeft to VehicleChassisAxleRow1WheelLeftTirePressure + result = gjson.GetBytes(jsonData, "data.tires.frontLeft") + if result.Exists() { + valVehicleChassisAxleRow1WheelLeftTirePressure, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.tires.frontLeft' is not of type float64", errInvalidType) + } + vehicle.VehicleChassisAxleRow1WheelLeftTirePressure, err = ToVehicleChassisAxleRow1WheelLeftTirePressure(valVehicleChassisAxleRow1WheelLeftTirePressure) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.tires.frontLeft': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.tires.frontLeft'", errNotFound) + } + + // convert data.tires.frontRight to VehicleChassisAxleRow1WheelRightTirePressure + result = gjson.GetBytes(jsonData, "data.tires.frontRight") + if result.Exists() { + valVehicleChassisAxleRow1WheelRightTirePressure, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.tires.frontRight' is not of type float64", errInvalidType) + } + vehicle.VehicleChassisAxleRow1WheelRightTirePressure, err = ToVehicleChassisAxleRow1WheelRightTirePressure(valVehicleChassisAxleRow1WheelRightTirePressure) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.tires.frontRight': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.tires.frontRight'", errNotFound) + } + + // convert data.tires.backLeft to VehicleChassisAxleRow2WheelLeftTirePressure + result = gjson.GetBytes(jsonData, "data.tires.backLeft") + if result.Exists() { + valVehicleChassisAxleRow2WheelLeftTirePressure, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.tires.backLeft' is not of type float64", errInvalidType) + } + vehicle.VehicleChassisAxleRow2WheelLeftTirePressure, err = ToVehicleChassisAxleRow2WheelLeftTirePressure(valVehicleChassisAxleRow2WheelLeftTirePressure) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.tires.backLeft': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.tires.backLeft'", errNotFound) + } + + // convert data.tires.backRight to VehicleChassisAxleRow2WheelRightTirePressure + result = gjson.GetBytes(jsonData, "data.tires.backRight") + if result.Exists() { + valVehicleChassisAxleRow2WheelRightTirePressure, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.tires.backRight' is not of type float64", errInvalidType) + } + vehicle.VehicleChassisAxleRow2WheelRightTirePressure, err = ToVehicleChassisAxleRow2WheelRightTirePressure(valVehicleChassisAxleRow2WheelRightTirePressure) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.tires.backRight': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.tires.backRight'", errNotFound) + } + + // convert data.altitude to VehicleCurrentLocationAltitude + result = gjson.GetBytes(jsonData, "data.altitude") + if result.Exists() { + valVehicleCurrentLocationAltitude, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.altitude' is not of type float64", errInvalidType) + } + vehicle.VehicleCurrentLocationAltitude, err = ToVehicleCurrentLocationAltitude(valVehicleCurrentLocationAltitude) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.altitude': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.altitude'", errNotFound) + } + + // convert data.latitude to VehicleCurrentLocationLatitude + result = gjson.GetBytes(jsonData, "data.latitude") + if result.Exists() { + valVehicleCurrentLocationLatitude, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.latitude' is not of type float64", errInvalidType) + } + vehicle.VehicleCurrentLocationLatitude, err = ToVehicleCurrentLocationLatitude(valVehicleCurrentLocationLatitude) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.latitude': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.latitude'", errNotFound) + } + + // convert data.longitude to VehicleCurrentLocationLongitude + result = gjson.GetBytes(jsonData, "data.longitude") + if result.Exists() { + valVehicleCurrentLocationLongitude, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.longitude' is not of type float64", errInvalidType) + } + vehicle.VehicleCurrentLocationLongitude, err = ToVehicleCurrentLocationLongitude(valVehicleCurrentLocationLongitude) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.longitude': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.longitude'", errNotFound) + } + + // convert data.timestamp to VehicleCurrentLocationTimestamp + result = gjson.GetBytes(jsonData, "data.timestamp") + if result.Exists() { + valVehicleCurrentLocationTimestamp, ok := result.Value().(string) + if !ok { + return nil, fmt.Errorf("%w, field 'data.timestamp' is not of type string", errInvalidType) + } + vehicle.VehicleCurrentLocationTimestamp, err = ToVehicleCurrentLocationTimestamp(valVehicleCurrentLocationTimestamp) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.timestamp': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.timestamp'", errNotFound) + } + + // convert data.definitionID to VehicleDIMODefinitionID + result = gjson.GetBytes(jsonData, "data.definitionID") + if result.Exists() { + valVehicleDIMODefinitionID, ok := result.Value().(string) + if !ok { + return nil, fmt.Errorf("%w, field 'data.definitionID' is not of type string", errInvalidType) + } + vehicle.VehicleDIMODefinitionID, err = ToVehicleDIMODefinitionID(valVehicleDIMODefinitionID) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.definitionID': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.definitionID'", errNotFound) + } + + // convert source to VehicleDIMOSource + result = gjson.GetBytes(jsonData, "source") + if result.Exists() { + valVehicleDIMOSource, ok := result.Value().(string) + if !ok { + return nil, fmt.Errorf("%w, field 'source' is not of type string", errInvalidType) + } + vehicle.VehicleDIMOSource, err = ToVehicleDIMOSource(valVehicleDIMOSource) + if err != nil { + return nil, fmt.Errorf("failed to convert 'source': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'source'", errNotFound) + } + + // convert subject to VehicleDIMOSubject + result = gjson.GetBytes(jsonData, "subject") + if result.Exists() { + valVehicleDIMOSubject, ok := result.Value().(string) + if !ok { + return nil, fmt.Errorf("%w, field 'subject' is not of type string", errInvalidType) + } + vehicle.VehicleDIMOSubject, err = ToVehicleDIMOSubject(valVehicleDIMOSubject) + if err != nil { + return nil, fmt.Errorf("failed to convert 'subject': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'subject'", errNotFound) + } + + // convert time to VehicleDIMOTimestamp + result = gjson.GetBytes(jsonData, "time") + if result.Exists() { + valVehicleDIMOTimestamp, ok := result.Value().(string) + if !ok { + return nil, fmt.Errorf("%w, field 'time' is not of type string", errInvalidType) + } + vehicle.VehicleDIMOTimestamp, err = ToVehicleDIMOTimestamp(valVehicleDIMOTimestamp) + if err != nil { + return nil, fmt.Errorf("failed to convert 'time': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'time'", errNotFound) + } + + // convert type to VehicleDIMOType + result = gjson.GetBytes(jsonData, "type") + if result.Exists() { + valVehicleDIMOType, ok := result.Value().(string) + if !ok { + return nil, fmt.Errorf("%w, field 'type' is not of type string", errInvalidType) + } + vehicle.VehicleDIMOType, err = ToVehicleDIMOType(valVehicleDIMOType) + if err != nil { + return nil, fmt.Errorf("failed to convert 'type': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'type'", errNotFound) + } + + // convert data.vehicleID to VehicleDIMOVehicleID + result = gjson.GetBytes(jsonData, "data.vehicleID") + if result.Exists() { + valVehicleDIMOVehicleID, ok := result.Value().(string) + if !ok { + return nil, fmt.Errorf("%w, field 'data.vehicleID' is not of type string", errInvalidType) + } + vehicle.VehicleDIMOVehicleID, err = ToVehicleDIMOVehicleID(valVehicleDIMOVehicleID) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.vehicleID': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.vehicleID'", errNotFound) + } + + // convert data.ambientTemp to VehicleExteriorAirTemperature + result = gjson.GetBytes(jsonData, "data.ambientTemp") + if result.Exists() { + valVehicleExteriorAirTemperature, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.ambientTemp' is not of type float64", errInvalidType) + } + vehicle.VehicleExteriorAirTemperature, err = ToVehicleExteriorAirTemperature(valVehicleExteriorAirTemperature) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.ambientTemp': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.ambientTemp'", errNotFound) + } + + // convert data.batteryVoltage to VehicleLowVoltageBatteryCurrentVoltage + result = gjson.GetBytes(jsonData, "data.batteryVoltage") + if result.Exists() { + valVehicleLowVoltageBatteryCurrentVoltage, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.batteryVoltage' is not of type float64", errInvalidType) + } + vehicle.VehicleLowVoltageBatteryCurrentVoltage, err = ToVehicleLowVoltageBatteryCurrentVoltage(valVehicleLowVoltageBatteryCurrentVoltage) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.batteryVoltage': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.batteryVoltage'", errNotFound) + } + + // convert data.barometricPressure to VehicleOBDBarometricPressure + result = gjson.GetBytes(jsonData, "data.barometricPressure") + if result.Exists() { + valVehicleOBDBarometricPressure, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.barometricPressure' is not of type float64", errInvalidType) + } + vehicle.VehicleOBDBarometricPressure, err = ToVehicleOBDBarometricPressure(valVehicleOBDBarometricPressure) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.barometricPressure': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.barometricPressure'", errNotFound) + } + + // convert data.engineLoad to VehicleOBDEngineLoad + result = gjson.GetBytes(jsonData, "data.engineLoad") + if result.Exists() { + valVehicleOBDEngineLoad, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.engineLoad' is not of type float64", errInvalidType) + } + vehicle.VehicleOBDEngineLoad, err = ToVehicleOBDEngineLoad(valVehicleOBDEngineLoad) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.engineLoad': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.engineLoad'", errNotFound) + } + + // convert data.intakeTemp to VehicleOBDIntakeTemp + result = gjson.GetBytes(jsonData, "data.intakeTemp") + if result.Exists() { + valVehicleOBDIntakeTemp, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.intakeTemp' is not of type float64", errInvalidType) + } + vehicle.VehicleOBDIntakeTemp, err = ToVehicleOBDIntakeTemp(valVehicleOBDIntakeTemp) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.intakeTemp': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.intakeTemp'", errNotFound) + } + + // convert data.runTime to VehicleOBDRunTime + result = gjson.GetBytes(jsonData, "data.runTime") + if result.Exists() { + valVehicleOBDRunTime, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.runTime' is not of type float64", errInvalidType) + } + vehicle.VehicleOBDRunTime, err = ToVehicleOBDRunTime(valVehicleOBDRunTime) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.runTime': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.runTime'", errNotFound) + } + + // convert data.coolantTemp to VehiclePowertrainCombustionEngineECT + result = gjson.GetBytes(jsonData, "data.coolantTemp") + if result.Exists() { + valVehiclePowertrainCombustionEngineECT, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.coolantTemp' is not of type float64", errInvalidType) + } + vehicle.VehiclePowertrainCombustionEngineECT, err = ToVehiclePowertrainCombustionEngineECT(valVehiclePowertrainCombustionEngineECT) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.coolantTemp': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.coolantTemp'", errNotFound) + } + + // convert data.oil to VehiclePowertrainCombustionEngineEngineOilLevel + result = gjson.GetBytes(jsonData, "data.oil") + if result.Exists() { + valVehiclePowertrainCombustionEngineEngineOilLevel, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.oil' is not of type float64", errInvalidType) + } + vehicle.VehiclePowertrainCombustionEngineEngineOilLevel, err = ToVehiclePowertrainCombustionEngineEngineOilLevel(valVehiclePowertrainCombustionEngineEngineOilLevel) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.oil': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.oil'", errNotFound) + } + + // convert data.engineSpeed to VehiclePowertrainCombustionEngineSpeed + result = gjson.GetBytes(jsonData, "data.engineSpeed") + if result.Exists() { + valVehiclePowertrainCombustionEngineSpeed, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.engineSpeed' is not of type float64", errInvalidType) + } + vehicle.VehiclePowertrainCombustionEngineSpeed, err = ToVehiclePowertrainCombustionEngineSpeed(valVehiclePowertrainCombustionEngineSpeed) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.engineSpeed': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.engineSpeed'", errNotFound) + } + + // convert data.throttlePosition to VehiclePowertrainCombustionEngineTPS + result = gjson.GetBytes(jsonData, "data.throttlePosition") + if result.Exists() { + valVehiclePowertrainCombustionEngineTPS, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.throttlePosition' is not of type float64", errInvalidType) + } + vehicle.VehiclePowertrainCombustionEngineTPS, err = ToVehiclePowertrainCombustionEngineTPS(valVehiclePowertrainCombustionEngineTPS) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.throttlePosition': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.throttlePosition'", errNotFound) + } + + // convert data.fuelPercentRemaining to VehiclePowertrainFuelSystemAbsoluteLevel + result = gjson.GetBytes(jsonData, "data.fuelPercentRemaining") + if result.Exists() { + valVehiclePowertrainFuelSystemAbsoluteLevel, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.fuelPercentRemaining' is not of type float64", errInvalidType) + } + vehicle.VehiclePowertrainFuelSystemAbsoluteLevel, err = ToVehiclePowertrainFuelSystemAbsoluteLevel(valVehiclePowertrainFuelSystemAbsoluteLevel) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.fuelPercentRemaining': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.fuelPercentRemaining'", errNotFound) + } + + // convert data.fuelType to VehiclePowertrainFuelSystemSupportedFuelTypes + result = gjson.GetBytes(jsonData, "data.fuelType") + if result.Exists() { + valVehiclePowertrainFuelSystemSupportedFuelTypes, ok := result.Value().(string) + if !ok { + return nil, fmt.Errorf("%w, field 'data.fuelType' is not of type string", errInvalidType) + } + vehicle.VehiclePowertrainFuelSystemSupportedFuelTypes, err = ToVehiclePowertrainFuelSystemSupportedFuelTypes(valVehiclePowertrainFuelSystemSupportedFuelTypes) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.fuelType': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.fuelType'", errNotFound) + } + + // convert data.range to VehiclePowertrainRange + result = gjson.GetBytes(jsonData, "data.range") + if result.Exists() { + valVehiclePowertrainRange, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.range' is not of type float64", errInvalidType) + } + vehicle.VehiclePowertrainRange, err = ToVehiclePowertrainRange(valVehiclePowertrainRange) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.range': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.range'", errNotFound) + } + + // convert data.chargeLimit to VehiclePowertrainTractionBatteryChargingChargeLimit + result = gjson.GetBytes(jsonData, "data.chargeLimit") + if result.Exists() { + valVehiclePowertrainTractionBatteryChargingChargeLimit, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.chargeLimit' is not of type float64", errInvalidType) + } + vehicle.VehiclePowertrainTractionBatteryChargingChargeLimit, err = ToVehiclePowertrainTractionBatteryChargingChargeLimit(valVehiclePowertrainTractionBatteryChargingChargeLimit) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.chargeLimit': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.chargeLimit'", errNotFound) + } + + // convert data.charging to VehiclePowertrainTractionBatteryChargingIsCharging + result = gjson.GetBytes(jsonData, "data.charging") + if result.Exists() { + valVehiclePowertrainTractionBatteryChargingIsCharging, ok := result.Value().(bool) + if !ok { + return nil, fmt.Errorf("%w, field 'data.charging' is not of type bool", errInvalidType) + } + vehicle.VehiclePowertrainTractionBatteryChargingIsCharging, err = ToVehiclePowertrainTractionBatteryChargingIsCharging(valVehiclePowertrainTractionBatteryChargingIsCharging) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.charging': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.charging'", errNotFound) + } + + // convert data.batteryCapacity to VehiclePowertrainTractionBatteryGrossCapacity + result = gjson.GetBytes(jsonData, "data.batteryCapacity") + if result.Exists() { + valVehiclePowertrainTractionBatteryGrossCapacity, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.batteryCapacity' is not of type float64", errInvalidType) + } + vehicle.VehiclePowertrainTractionBatteryGrossCapacity, err = ToVehiclePowertrainTractionBatteryGrossCapacity(valVehiclePowertrainTractionBatteryGrossCapacity) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.batteryCapacity': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.batteryCapacity'", errNotFound) + } + + // convert data.soc to VehiclePowertrainTractionBatteryStateOfChargeCurrent + result = gjson.GetBytes(jsonData, "data.soc") + if result.Exists() { + valVehiclePowertrainTractionBatteryStateOfChargeCurrent, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.soc' is not of type float64", errInvalidType) + } + vehicle.VehiclePowertrainTractionBatteryStateOfChargeCurrent, err = ToVehiclePowertrainTractionBatteryStateOfChargeCurrent(valVehiclePowertrainTractionBatteryStateOfChargeCurrent) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.soc': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.soc'", errNotFound) + } + + // convert data.odometer to VehiclePowertrainTransmissionTravelledDistance + result = gjson.GetBytes(jsonData, "data.odometer") + if result.Exists() { + valVehiclePowertrainTransmissionTravelledDistance, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.odometer' is not of type float64", errInvalidType) + } + vehicle.VehiclePowertrainTransmissionTravelledDistance, err = ToVehiclePowertrainTransmissionTravelledDistance(valVehiclePowertrainTransmissionTravelledDistance) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.odometer': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.odometer'", errNotFound) + } + + // convert data.speed to VehicleSpeed + result = gjson.GetBytes(jsonData, "data.speed") + if result.Exists() { + valVehicleSpeed, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.speed' is not of type float64", errInvalidType) + } + vehicle.VehicleSpeed, err = ToVehicleSpeed(valVehicleSpeed) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.speed': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.speed'", errNotFound) + } + + // convert data.make to VehicleVehicleIdentificationBrand + result = gjson.GetBytes(jsonData, "data.make") + if result.Exists() { + valVehicleVehicleIdentificationBrand, ok := result.Value().(string) + if !ok { + return nil, fmt.Errorf("%w, field 'data.make' is not of type string", errInvalidType) + } + vehicle.VehicleVehicleIdentificationBrand, err = ToVehicleVehicleIdentificationBrand(valVehicleVehicleIdentificationBrand) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.make': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.make'", errNotFound) + } + + // convert data.model to VehicleVehicleIdentificationModel + result = gjson.GetBytes(jsonData, "data.model") + if result.Exists() { + valVehicleVehicleIdentificationModel, ok := result.Value().(string) + if !ok { + return nil, fmt.Errorf("%w, field 'data.model' is not of type string", errInvalidType) + } + vehicle.VehicleVehicleIdentificationModel, err = ToVehicleVehicleIdentificationModel(valVehicleVehicleIdentificationModel) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.model': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.model'", errNotFound) + } + + // convert data.year to VehicleVehicleIdentificationYear + result = gjson.GetBytes(jsonData, "data.year") + if result.Exists() { + valVehicleVehicleIdentificationYear, ok := result.Value().(float64) + if !ok { + return nil, fmt.Errorf("%w, field 'data.year' is not of type float64", errInvalidType) + } + vehicle.VehicleVehicleIdentificationYear, err = ToVehicleVehicleIdentificationYear(valVehicleVehicleIdentificationYear) + if err != nil { + return nil, fmt.Errorf("failed to convert 'data.year': %w", err) + } + } else if !skipNotFound { + return nil, fmt.Errorf("%w, field 'data.year'", errNotFound) + } + return &vehicle, nil +} diff --git a/pkg/vss/vss-structs.go b/pkg/vss/vss-structs.go new file mode 100644 index 0000000..3aa3837 --- /dev/null +++ b/pkg/vss/vss-structs.go @@ -0,0 +1,165 @@ +// Code generated by "model-garage" DO NOT EDIT. +package vss + +import ( + _ "embed" + "time" +) + +//go:embed vss-table.sql +var VSSTableCreateQuery string + +const ( + // FieldVehicleChassisAxleRow1WheelLeftTirePressure Tire pressure in kilo-Pascal. + FieldVehicleChassisAxleRow1WheelLeftTirePressure = "Vehicle_Chassis_Axle_Row1_Wheel_Left_Tire_Pressure" + // FieldVehicleChassisAxleRow1WheelRightTirePressure Tire pressure in kilo-Pascal. + FieldVehicleChassisAxleRow1WheelRightTirePressure = "Vehicle_Chassis_Axle_Row1_Wheel_Right_Tire_Pressure" + // FieldVehicleChassisAxleRow2WheelLeftTirePressure Tire pressure in kilo-Pascal. + FieldVehicleChassisAxleRow2WheelLeftTirePressure = "Vehicle_Chassis_Axle_Row2_Wheel_Left_Tire_Pressure" + // FieldVehicleChassisAxleRow2WheelRightTirePressure Tire pressure in kilo-Pascal. + FieldVehicleChassisAxleRow2WheelRightTirePressure = "Vehicle_Chassis_Axle_Row2_Wheel_Right_Tire_Pressure" + // FieldVehicleCurrentLocationAltitude Current altitude relative to WGS 84 reference ellipsoid, as measured at the position of GNSS receiver antenna. + FieldVehicleCurrentLocationAltitude = "Vehicle_CurrentLocation_Altitude" + // FieldVehicleCurrentLocationLatitude Current latitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna. + FieldVehicleCurrentLocationLatitude = "Vehicle_CurrentLocation_Latitude" + // FieldVehicleCurrentLocationLongitude Current longitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna. + FieldVehicleCurrentLocationLongitude = "Vehicle_CurrentLocation_Longitude" + // FieldVehicleCurrentLocationTimestamp Timestamp from GNSS system for current location, formatted according to ISO 8601 with UTC time zone. + FieldVehicleCurrentLocationTimestamp = "Vehicle_CurrentLocation_Timestamp" + // FieldVehicleDIMODefinitionID ID for the vehicles definition + FieldVehicleDIMODefinitionID = "Vehicle_DIMO_DefinitionID" + // FieldVehicleDIMOSource where the data was sourced from + FieldVehicleDIMOSource = "Vehicle_DIMO_Source" + // FieldVehicleDIMOSubject subjet of this vehicle data + FieldVehicleDIMOSubject = "Vehicle_DIMO_Subject" + // FieldVehicleDIMOTimestamp timestamp of when this data was colllected + FieldVehicleDIMOTimestamp = "Vehicle_DIMO_Timestamp" + // FieldVehicleDIMOType type of data collected + FieldVehicleDIMOType = "Vehicle_DIMO_Type" + // FieldVehicleDIMOVehicleID unque DIMO ID for the vehicle + FieldVehicleDIMOVehicleID = "Vehicle_DIMO_VehicleID" + // FieldVehicleExteriorAirTemperature Air temperature outside the vehicle. + FieldVehicleExteriorAirTemperature = "Vehicle_Exterior_AirTemperature" + // FieldVehicleLowVoltageBatteryCurrentVoltage Current Voltage of the low voltage battery. + FieldVehicleLowVoltageBatteryCurrentVoltage = "Vehicle_LowVoltageBattery_CurrentVoltage" + // FieldVehicleOBDBarometricPressure PID 33 - Barometric pressure + FieldVehicleOBDBarometricPressure = "Vehicle_OBD_BarometricPressure" + // FieldVehicleOBDEngineLoad PID 04 - Engine load in percent - 0 = no load, 100 = full load + FieldVehicleOBDEngineLoad = "Vehicle_OBD_EngineLoad" + // FieldVehicleOBDIntakeTemp PID 0F - Intake temperature + FieldVehicleOBDIntakeTemp = "Vehicle_OBD_IntakeTemp" + // FieldVehicleOBDRunTime PID 1F - Engine run time + FieldVehicleOBDRunTime = "Vehicle_OBD_RunTime" + // FieldVehiclePowertrainCombustionEngineECT Engine coolant temperature. + FieldVehiclePowertrainCombustionEngineECT = "Vehicle_Powertrain_CombustionEngine_ECT" + // FieldVehiclePowertrainCombustionEngineEngineOilLevel Engine oil level. + FieldVehiclePowertrainCombustionEngineEngineOilLevel = "Vehicle_Powertrain_CombustionEngine_EngineOilLevel" + // FieldVehiclePowertrainCombustionEngineSpeed Engine speed measured as rotations per minute. + FieldVehiclePowertrainCombustionEngineSpeed = "Vehicle_Powertrain_CombustionEngine_Speed" + // FieldVehiclePowertrainCombustionEngineTPS Current throttle position. + FieldVehiclePowertrainCombustionEngineTPS = "Vehicle_Powertrain_CombustionEngine_TPS" + // FieldVehiclePowertrainFuelSystemAbsoluteLevel Current available fuel in the fuel tank expressed in liters. + FieldVehiclePowertrainFuelSystemAbsoluteLevel = "Vehicle_Powertrain_FuelSystem_AbsoluteLevel" + // FieldVehiclePowertrainFuelSystemSupportedFuelTypes High level information of fuel types supported + FieldVehiclePowertrainFuelSystemSupportedFuelTypes = "Vehicle_Powertrain_FuelSystem_SupportedFuelTypes" + // FieldVehiclePowertrainRange Remaining range in meters using all energy sources available in the vehicle. + FieldVehiclePowertrainRange = "Vehicle_Powertrain_Range" + // FieldVehiclePowertrainTractionBatteryChargingChargeLimit Target charge limit (state of charge) for battery. + FieldVehiclePowertrainTractionBatteryChargingChargeLimit = "Vehicle_Powertrain_TractionBattery_Charging_ChargeLimit" + // FieldVehiclePowertrainTractionBatteryChargingIsCharging True if charging is ongoing. Charging is considered to be ongoing if energy is flowing from charger to vehicle. + FieldVehiclePowertrainTractionBatteryChargingIsCharging = "Vehicle_Powertrain_TractionBattery_Charging_IsCharging" + // FieldVehiclePowertrainTractionBatteryGrossCapacity Gross capacity of the battery. + FieldVehiclePowertrainTractionBatteryGrossCapacity = "Vehicle_Powertrain_TractionBattery_GrossCapacity" + // FieldVehiclePowertrainTractionBatteryStateOfChargeCurrent Physical state of charge of the high voltage battery, relative to net capacity. This is not necessarily the state of charge being displayed to the customer. + FieldVehiclePowertrainTractionBatteryStateOfChargeCurrent = "Vehicle_Powertrain_TractionBattery_StateOfCharge_Current" + // FieldVehiclePowertrainTransmissionTravelledDistance Odometer reading, total distance travelled during the lifetime of the transmission. + FieldVehiclePowertrainTransmissionTravelledDistance = "Vehicle_Powertrain_Transmission_TravelledDistance" + // FieldVehicleSpeed Vehicle speed. + FieldVehicleSpeed = "Vehicle_Speed" + // FieldVehicleVehicleIdentificationBrand Vehicle brand or manufacturer. + FieldVehicleVehicleIdentificationBrand = "Vehicle_VehicleIdentification_Brand" + // FieldVehicleVehicleIdentificationModel Vehicle model. + FieldVehicleVehicleIdentificationModel = "Vehicle_VehicleIdentification_Model" + // FieldVehicleVehicleIdentificationYear Model year of the vehicle. + FieldVehicleVehicleIdentificationYear = "Vehicle_VehicleIdentification_Year" +) + +type Vehicle struct { + // VehicleChassisAxleRow1WheelLeftTirePressure Tire pressure in kilo-Pascal. + VehicleChassisAxleRow1WheelLeftTirePressure uint16 `ch:"Vehicle_Chassis_Axle_Row1_Wheel_Left_Tire_Pressure" json:"Vehicle_Chassis_Axle_Row1_Wheel_Left_Tire_Pressure,omitempty"` + // VehicleChassisAxleRow1WheelRightTirePressure Tire pressure in kilo-Pascal. + VehicleChassisAxleRow1WheelRightTirePressure uint16 `ch:"Vehicle_Chassis_Axle_Row1_Wheel_Right_Tire_Pressure" json:"Vehicle_Chassis_Axle_Row1_Wheel_Right_Tire_Pressure,omitempty"` + // VehicleChassisAxleRow2WheelLeftTirePressure Tire pressure in kilo-Pascal. + VehicleChassisAxleRow2WheelLeftTirePressure uint16 `ch:"Vehicle_Chassis_Axle_Row2_Wheel_Left_Tire_Pressure" json:"Vehicle_Chassis_Axle_Row2_Wheel_Left_Tire_Pressure,omitempty"` + // VehicleChassisAxleRow2WheelRightTirePressure Tire pressure in kilo-Pascal. + VehicleChassisAxleRow2WheelRightTirePressure uint16 `ch:"Vehicle_Chassis_Axle_Row2_Wheel_Right_Tire_Pressure" json:"Vehicle_Chassis_Axle_Row2_Wheel_Right_Tire_Pressure,omitempty"` + // VehicleCurrentLocationAltitude Current altitude relative to WGS 84 reference ellipsoid, as measured at the position of GNSS receiver antenna. + VehicleCurrentLocationAltitude float64 `ch:"Vehicle_CurrentLocation_Altitude" json:"Vehicle_CurrentLocation_Altitude,omitempty"` + // VehicleCurrentLocationLatitude Current latitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna. + VehicleCurrentLocationLatitude float64 `ch:"Vehicle_CurrentLocation_Latitude" json:"Vehicle_CurrentLocation_Latitude,omitempty"` + // VehicleCurrentLocationLongitude Current longitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna. + VehicleCurrentLocationLongitude float64 `ch:"Vehicle_CurrentLocation_Longitude" json:"Vehicle_CurrentLocation_Longitude,omitempty"` + // VehicleCurrentLocationTimestamp Timestamp from GNSS system for current location, formatted according to ISO 8601 with UTC time zone. + VehicleCurrentLocationTimestamp time.Time `ch:"Vehicle_CurrentLocation_Timestamp" json:"Vehicle_CurrentLocation_Timestamp,omitempty"` + // VehicleDIMODefinitionID ID for the vehicles definition + VehicleDIMODefinitionID string `ch:"Vehicle_DIMO_DefinitionID" json:"Vehicle_DIMO_DefinitionID,omitempty"` + // VehicleDIMOSource where the data was sourced from + VehicleDIMOSource string `ch:"Vehicle_DIMO_Source" json:"Vehicle_DIMO_Source,omitempty"` + // VehicleDIMOSubject subjet of this vehicle data + VehicleDIMOSubject string `ch:"Vehicle_DIMO_Subject" json:"Vehicle_DIMO_Subject,omitempty"` + // VehicleDIMOTimestamp timestamp of when this data was colllected + VehicleDIMOTimestamp time.Time `ch:"Vehicle_DIMO_Timestamp" json:"Vehicle_DIMO_Timestamp,omitempty"` + // VehicleDIMOType type of data collected + VehicleDIMOType string `ch:"Vehicle_DIMO_Type" json:"Vehicle_DIMO_Type,omitempty"` + // VehicleDIMOVehicleID unque DIMO ID for the vehicle + VehicleDIMOVehicleID string `ch:"Vehicle_DIMO_VehicleID" json:"Vehicle_DIMO_VehicleID,omitempty"` + // VehicleExteriorAirTemperature Air temperature outside the vehicle. + VehicleExteriorAirTemperature float32 `ch:"Vehicle_Exterior_AirTemperature" json:"Vehicle_Exterior_AirTemperature,omitempty"` + // VehicleLowVoltageBatteryCurrentVoltage Current Voltage of the low voltage battery. + VehicleLowVoltageBatteryCurrentVoltage float32 `ch:"Vehicle_LowVoltageBattery_CurrentVoltage" json:"Vehicle_LowVoltageBattery_CurrentVoltage,omitempty"` + // VehicleOBDBarometricPressure PID 33 - Barometric pressure + VehicleOBDBarometricPressure float32 `ch:"Vehicle_OBD_BarometricPressure" json:"Vehicle_OBD_BarometricPressure,omitempty"` + // VehicleOBDEngineLoad PID 04 - Engine load in percent - 0 = no load, 100 = full load + VehicleOBDEngineLoad float32 `ch:"Vehicle_OBD_EngineLoad" json:"Vehicle_OBD_EngineLoad,omitempty"` + // VehicleOBDIntakeTemp PID 0F - Intake temperature + VehicleOBDIntakeTemp float32 `ch:"Vehicle_OBD_IntakeTemp" json:"Vehicle_OBD_IntakeTemp,omitempty"` + // VehicleOBDRunTime PID 1F - Engine run time + VehicleOBDRunTime float32 `ch:"Vehicle_OBD_RunTime" json:"Vehicle_OBD_RunTime,omitempty"` + // VehiclePowertrainCombustionEngineECT Engine coolant temperature. + VehiclePowertrainCombustionEngineECT int16 `ch:"Vehicle_Powertrain_CombustionEngine_ECT" json:"Vehicle_Powertrain_CombustionEngine_ECT,omitempty"` + // VehiclePowertrainCombustionEngineEngineOilLevel Engine oil level. + VehiclePowertrainCombustionEngineEngineOilLevel string `ch:"Vehicle_Powertrain_CombustionEngine_EngineOilLevel" json:"Vehicle_Powertrain_CombustionEngine_EngineOilLevel,omitempty"` + // VehiclePowertrainCombustionEngineSpeed Engine speed measured as rotations per minute. + VehiclePowertrainCombustionEngineSpeed uint16 `ch:"Vehicle_Powertrain_CombustionEngine_Speed" json:"Vehicle_Powertrain_CombustionEngine_Speed,omitempty"` + // VehiclePowertrainCombustionEngineTPS Current throttle position. + VehiclePowertrainCombustionEngineTPS uint8 `ch:"Vehicle_Powertrain_CombustionEngine_TPS" json:"Vehicle_Powertrain_CombustionEngine_TPS,omitempty"` + // VehiclePowertrainFuelSystemAbsoluteLevel Current available fuel in the fuel tank expressed in liters. + VehiclePowertrainFuelSystemAbsoluteLevel float32 `ch:"Vehicle_Powertrain_FuelSystem_AbsoluteLevel" json:"Vehicle_Powertrain_FuelSystem_AbsoluteLevel,omitempty"` + // VehiclePowertrainFuelSystemSupportedFuelTypes High level information of fuel types supported + VehiclePowertrainFuelSystemSupportedFuelTypes []string `ch:"Vehicle_Powertrain_FuelSystem_SupportedFuelTypes" json:"Vehicle_Powertrain_FuelSystem_SupportedFuelTypes,omitempty"` + // VehiclePowertrainRange Remaining range in meters using all energy sources available in the vehicle. + VehiclePowertrainRange uint32 `ch:"Vehicle_Powertrain_Range" json:"Vehicle_Powertrain_Range,omitempty"` + // VehiclePowertrainTractionBatteryChargingChargeLimit Target charge limit (state of charge) for battery. + VehiclePowertrainTractionBatteryChargingChargeLimit uint8 `ch:"Vehicle_Powertrain_TractionBattery_Charging_ChargeLimit" json:"Vehicle_Powertrain_TractionBattery_Charging_ChargeLimit,omitempty"` + // VehiclePowertrainTractionBatteryChargingIsCharging True if charging is ongoing. Charging is considered to be ongoing if energy is flowing from charger to vehicle. + VehiclePowertrainTractionBatteryChargingIsCharging bool `ch:"Vehicle_Powertrain_TractionBattery_Charging_IsCharging" json:"Vehicle_Powertrain_TractionBattery_Charging_IsCharging,omitempty"` + // VehiclePowertrainTractionBatteryGrossCapacity Gross capacity of the battery. + VehiclePowertrainTractionBatteryGrossCapacity uint16 `ch:"Vehicle_Powertrain_TractionBattery_GrossCapacity" json:"Vehicle_Powertrain_TractionBattery_GrossCapacity,omitempty"` + // VehiclePowertrainTractionBatteryStateOfChargeCurrent Physical state of charge of the high voltage battery, relative to net capacity. This is not necessarily the state of charge being displayed to the customer. + VehiclePowertrainTractionBatteryStateOfChargeCurrent float32 `ch:"Vehicle_Powertrain_TractionBattery_StateOfCharge_Current" json:"Vehicle_Powertrain_TractionBattery_StateOfCharge_Current,omitempty"` + // VehiclePowertrainTransmissionTravelledDistance Odometer reading, total distance travelled during the lifetime of the transmission. + VehiclePowertrainTransmissionTravelledDistance float32 `ch:"Vehicle_Powertrain_Transmission_TravelledDistance" json:"Vehicle_Powertrain_Transmission_TravelledDistance,omitempty"` + // VehicleSpeed Vehicle speed. + VehicleSpeed float32 `ch:"Vehicle_Speed" json:"Vehicle_Speed,omitempty"` + // VehicleVehicleIdentificationBrand Vehicle brand or manufacturer. + VehicleVehicleIdentificationBrand string `ch:"Vehicle_VehicleIdentification_Brand" json:"Vehicle_VehicleIdentification_Brand,omitempty"` + // VehicleVehicleIdentificationModel Vehicle model. + VehicleVehicleIdentificationModel string `ch:"Vehicle_VehicleIdentification_Model" json:"Vehicle_VehicleIdentification_Model,omitempty"` + // VehicleVehicleIdentificationYear Model year of the vehicle. + VehicleVehicleIdentificationYear uint16 `ch:"Vehicle_VehicleIdentification_Year" json:"Vehicle_VehicleIdentification_Year,omitempty"` +} + +// InsertStatement for inserting a vehicle and all its fields into the table. + +const InsertStatment = "INSERT INTO vss (Vehicle_Chassis_Axle_Row1_Wheel_Left_Tire_Pressure, Vehicle_Chassis_Axle_Row1_Wheel_Right_Tire_Pressure, Vehicle_Chassis_Axle_Row2_Wheel_Left_Tire_Pressure, Vehicle_Chassis_Axle_Row2_Wheel_Right_Tire_Pressure, Vehicle_CurrentLocation_Altitude, Vehicle_CurrentLocation_Latitude, Vehicle_CurrentLocation_Longitude, Vehicle_CurrentLocation_Timestamp, Vehicle_DIMO_DefinitionID, Vehicle_DIMO_Source, Vehicle_DIMO_Subject, Vehicle_DIMO_Timestamp, Vehicle_DIMO_Type, Vehicle_DIMO_VehicleID, Vehicle_Exterior_AirTemperature, Vehicle_LowVoltageBattery_CurrentVoltage, Vehicle_OBD_BarometricPressure, Vehicle_OBD_EngineLoad, Vehicle_OBD_IntakeTemp, Vehicle_OBD_RunTime, Vehicle_Powertrain_CombustionEngine_ECT, Vehicle_Powertrain_CombustionEngine_EngineOilLevel, Vehicle_Powertrain_CombustionEngine_Speed, Vehicle_Powertrain_CombustionEngine_TPS, Vehicle_Powertrain_FuelSystem_AbsoluteLevel, Vehicle_Powertrain_FuelSystem_SupportedFuelTypes, Vehicle_Powertrain_Range, Vehicle_Powertrain_TractionBattery_Charging_ChargeLimit, Vehicle_Powertrain_TractionBattery_Charging_IsCharging, Vehicle_Powertrain_TractionBattery_GrossCapacity, Vehicle_Powertrain_TractionBattery_StateOfCharge_Current, Vehicle_Powertrain_Transmission_TravelledDistance, Vehicle_Speed, Vehicle_VehicleIdentification_Brand, Vehicle_VehicleIdentification_Model, Vehicle_VehicleIdentification_Year)" +const InsertStatmentValues = InsertStatment + " Values" diff --git a/pkg/vss/vss-table.sql b/pkg/vss/vss-table.sql new file mode 100644 index 0000000..ba81063 --- /dev/null +++ b/pkg/vss/vss-table.sql @@ -0,0 +1,40 @@ +CREATE TABLE IF NOT EXISTS vss ( + Vehicle_Chassis_Axle_Row1_Wheel_Left_Tire_Pressure UInt16 COMMENT 'Tire pressure in kilo-Pascal.', + Vehicle_Chassis_Axle_Row1_Wheel_Right_Tire_Pressure UInt16 COMMENT 'Tire pressure in kilo-Pascal.', + Vehicle_Chassis_Axle_Row2_Wheel_Left_Tire_Pressure UInt16 COMMENT 'Tire pressure in kilo-Pascal.', + Vehicle_Chassis_Axle_Row2_Wheel_Right_Tire_Pressure UInt16 COMMENT 'Tire pressure in kilo-Pascal.', + Vehicle_CurrentLocation_Altitude Float64 COMMENT 'Current altitude relative to WGS 84 reference ellipsoid, as measured at the position of GNSS receiver antenna.', + Vehicle_CurrentLocation_Latitude Float64 COMMENT 'Current latitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna.', + Vehicle_CurrentLocation_Longitude Float64 COMMENT 'Current longitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna.', + Vehicle_CurrentLocation_Timestamp DateTime COMMENT 'Timestamp from GNSS system for current location, formatted according to ISO 8601 with UTC time zone.', + Vehicle_DIMO_DefinitionID String COMMENT 'ID for the vehicles definition', + Vehicle_DIMO_Source String COMMENT 'where the data was sourced from', + Vehicle_DIMO_Subject String COMMENT 'subjet of this vehicle data', + Vehicle_DIMO_Timestamp DateTime COMMENT 'timestamp of when this data was colllected', + Vehicle_DIMO_Type String COMMENT 'type of data collected', + Vehicle_DIMO_VehicleID String COMMENT 'unque DIMO ID for the vehicle', + Vehicle_Exterior_AirTemperature Float32 COMMENT 'Air temperature outside the vehicle.', + Vehicle_LowVoltageBattery_CurrentVoltage Float32 COMMENT 'Current Voltage of the low voltage battery.', + Vehicle_OBD_BarometricPressure Float32 COMMENT 'PID 33 - Barometric pressure', + Vehicle_OBD_EngineLoad Float32 COMMENT 'PID 04 - Engine load in percent - 0 = no load, 100 = full load', + Vehicle_OBD_IntakeTemp Float32 COMMENT 'PID 0F - Intake temperature', + Vehicle_OBD_RunTime Float32 COMMENT 'PID 1F - Engine run time', + Vehicle_Powertrain_CombustionEngine_ECT Int16 COMMENT 'Engine coolant temperature.', + Vehicle_Powertrain_CombustionEngine_EngineOilLevel String COMMENT 'Engine oil level.', + Vehicle_Powertrain_CombustionEngine_Speed UInt16 COMMENT 'Engine speed measured as rotations per minute.', + Vehicle_Powertrain_CombustionEngine_TPS UInt8 COMMENT 'Current throttle position.', + Vehicle_Powertrain_FuelSystem_AbsoluteLevel Float32 COMMENT 'Current available fuel in the fuel tank expressed in liters.', + Vehicle_Powertrain_FuelSystem_SupportedFuelTypes Array(String) COMMENT 'High level information of fuel types supported', + Vehicle_Powertrain_Range UInt32 COMMENT 'Remaining range in meters using all energy sources available in the vehicle.', + Vehicle_Powertrain_TractionBattery_Charging_ChargeLimit UInt8 COMMENT 'Target charge limit (state of charge) for battery.', + Vehicle_Powertrain_TractionBattery_Charging_IsCharging Bool COMMENT 'True if charging is ongoing. Charging is considered to be ongoing if energy is flowing from charger to vehicle.', + Vehicle_Powertrain_TractionBattery_GrossCapacity UInt16 COMMENT 'Gross capacity of the battery.', + Vehicle_Powertrain_TractionBattery_StateOfCharge_Current Float32 COMMENT 'Physical state of charge of the high voltage battery, relative to net capacity. This is not necessarily the state of charge being displayed to the customer.', + Vehicle_Powertrain_Transmission_TravelledDistance Float32 COMMENT 'Odometer reading, total distance travelled during the lifetime of the transmission.', + Vehicle_Speed Float32 COMMENT 'Vehicle speed.', + Vehicle_VehicleIdentification_Brand String COMMENT 'Vehicle brand or manufacturer.', + Vehicle_VehicleIdentification_Model String COMMENT 'Vehicle model.', + Vehicle_VehicleIdentification_Year UInt16 COMMENT 'Model year of the vehicle.', +) +ENGINE = MergeTree() +ORDER BY (Vehicle_DIMO_Subject, Vehicle_DIMO_Timestamp) \ No newline at end of file diff --git a/schema/migrations.json b/schema/migrations.json new file mode 100644 index 0000000..3f1bda6 --- /dev/null +++ b/schema/migrations.json @@ -0,0 +1,268 @@ +[ + { + "vspecName": "Vehicle.Powertrain.FuelSystem.SupportedFuelTypes", + "conversion": { + "originalName": "data.fuelType", + "originalType": "string" + } + }, + { + "vspecName": "Vehicle.VehicleIdentification.Brand", + "conversion": { + "originalName": "data.make", + "originalType": "string" + } + }, + { + "originalName": "data.model", + "vspecName": "Vehicle.VehicleIdentification.Model", + "conversion": { + "originalName": "data.model", + "originalType": "string" + } + }, + { + "vspecName": "", + "conversion": { + "originalName": "data.vin", + "originalType": "string" + } + }, + { + "vspecName": "Vehicle.DIMO.VehicleID", + "conversion": { + "originalName": "data.vehicleID", + "originalType": "string" + } + }, + { + "vspecName": "Vehicle.DIMO.DefinitionID", + "conversion": { + "originalName": "data.definitionID", + "originalType": "string" + } + }, + { + "vspecName": "Vehicle.CurrentLocation.Altitude", + "conversion": { + "originalName": "data.altitude", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.CurrentLocation.Latitude", + "conversion": { + "originalName": "data.latitude", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.CurrentLocation.Longitude", + "conversion": { + "originalName": "data.longitude", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.CurrentLocation.Timestamp", + "conversion": { + "originalName": "data.timestamp", + "originalType": "string" + }, + "clickHouseType": "DateTime", + "goType": "time.Time", + "isArray": false + }, + { + "vspecName": "Vehicle.Exterior.AirTemperature", + "conversion": { + "originalName": "data.ambientTemp", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.LowVoltageBattery.CurrentVoltage", + "conversion": { + "originalName": "data.batteryVoltage", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.OBD.BarometricPressure", + "conversion": { + "originalName": "data.barometricPressure", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.OBD.EngineLoad", + "conversion": { + "originalName": "data.engineLoad", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.OBD.IntakeTemp", + "conversion": { + "originalName": "data.intakeTemp", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.OBD.RunTime", + "conversion": { + "originalName": "data.runTime", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Powertrain.CombustionEngine.ECT", + "conversion": { + "originalName": "data.coolantTemp", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Powertrain.CombustionEngine.EngineOilLevel", + "conversion": { + "originalName": "data.oil", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Powertrain.CombustionEngine.Speed", + "conversion": { + "originalName": "data.engineSpeed", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Powertrain.CombustionEngine.TPS", + "conversion": { + "originalName": "data.throttlePosition", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Powertrain.FuelSystem.AbsoluteLevel", + "conversion": { + "originalName": "data.fuelPercentRemaining", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Powertrain.Range", + "conversion": { + "originalName": "data.range", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Powertrain.TractionBattery.Charging.ChargeLimit", + "conversion": { + "originalName": "data.chargeLimit", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Powertrain.TractionBattery.Charging.IsCharging", + "conversion": { + "originalName": "data.charging", + "originalType": "bool" + } + }, + { + "vspecName": "Vehicle.Powertrain.TractionBattery.GrossCapacity", + "conversion": { + "originalName": "data.batteryCapacity", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Powertrain.TractionBattery.StateOfCharge.Current", + "conversion": { + "originalName": "data.soc", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Speed", + "conversion": { + "originalName": "data.speed", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Powertrain.Transmission.TravelledDistance", + "conversion": { + "originalName": "data.odometer", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.VehicleIdentification.Year", + "conversion": { + "originalName": "data.year", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Chassis.Axle.Row1.Wheel.Left.Tire.Pressure", + "conversion": { + "originalName": "data.tires.frontLeft", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Chassis.Axle.Row1.Wheel.Right.Tire.Pressure", + "conversion": { + "originalName": "data.tires.frontRight", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Chassis.Axle.Row2.Wheel.Left.Tire.Pressure", + "conversion": { + "originalName": "data.tires.backLeft", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.Chassis.Axle.Row2.Wheel.Right.Tire.Pressure", + "conversion": { + "originalName": "data.tires.backRight", + "originalType": "float64" + } + }, + { + "vspecName": "Vehicle.DIMO.Subject", + "conversion": { + "originalName": "subject", + "originalType": "string" + } + }, + { + "vspecName": "Vehicle.DIMO.Timestamp", + "clickHouseType": "DateTime", + "goType": "time.Time", + "isArray": false, + "conversion": { + "originalName": "time", + "originalType": "string" + } + }, + { + "vspecName": "Vehicle.DIMO.Type", + "conversion": { + "originalName": "type", + "originalType": "string" + } + }, + { + "vspecName": "Vehicle.DIMO.Source", + "conversion": { + "originalName": "source", + "originalType": "string" + } + } +] \ No newline at end of file diff --git a/schema/vss_rel_4.2-DIMO.csv b/schema/vss_rel_4.2-DIMO.csv new file mode 100644 index 0000000..5fa99ad --- /dev/null +++ b/schema/vss_rel_4.2-DIMO.csv @@ -0,0 +1,1279 @@ +"Signal","Type","DataType","Deprecated","Unit","Min","Max","Desc","Comment","Allowed","Default","Id" +"Vehicle","branch","","","","","","High-level vehicle data.","","","","ccc825f94139544dbb5f4bfd033bece6" +"Vehicle.VersionVSS","branch","","","","","","Supported Version of VSS.","","","","9a687e56f1305eedb20f6a021ea58f48" +"Vehicle.VersionVSS.Major","attribute","uint32","","","","","Supported Version of VSS - Major version.","","","4","5edf1a338c975cbb84d4ce3cfe1aa4b4" +"Vehicle.VersionVSS.Minor","attribute","uint32","","","","","Supported Version of VSS - Minor version.","","","1","6e70a598dbc7534c96c58c18e9888cfd" +"Vehicle.VersionVSS.Patch","attribute","uint32","","","","","Supported Version of VSS - Patch version.","","","0","69858f224af459338b9bfbff436dda45" +"Vehicle.VersionVSS.Label","attribute","string","","","","","Label to further describe the version.","COVESA VSS project typically use dev for latest master, and empty string for released versions.","","","7c92cd50d24b5662922b27cb9a327e53" +"Vehicle.VehicleIdentification","branch","","","","","","Attributes that identify a vehicle.","","","","c33861c3e9125208b05f23fe922bf08e" +"Vehicle.VehicleIdentification.VIN","attribute","string","","","","","17-character Vehicle Identification Number (VIN) as defined by ISO 3779.","","","","6f0b6fa8c34f589baa92e565bc9df5bd" +"Vehicle.VehicleIdentification.WMI","attribute","string","","","","","3-character World Manufacturer Identification (WMI) as defined by ISO 3780.","","","","e7c86defbcd554a79f90ba85de58e133" +"Vehicle.VehicleIdentification.Brand","attribute","string","","","","","Vehicle brand or manufacturer.","","","","19fd645ff5385767bcdbf5dd4313483f" +"Vehicle.VehicleIdentification.Model","attribute","string","","","","","Vehicle model.","","","","dd3d3b72e6a85b3695ba25f829255403" +"Vehicle.VehicleIdentification.Year","attribute","uint16","","","","","Model year of the vehicle.","","","","9a76b0aca8e45f6fb33dbaf5b976b8b5" +"Vehicle.VehicleIdentification.AcrissCode","attribute","string","","","","","The ACRISS Car Classification Code is a code used by many car rental companies.","","","","115a821e8e0b57f08e4b9e61e85d7156" +"Vehicle.VehicleIdentification.BodyType","attribute","string","","","","","Indicates the design and body style of the vehicle (e.g. station wagon, hatchback, etc.).","","","","e6d5c71ecec95d68b0b59bb7e93af759" +"Vehicle.VehicleIdentification.DateVehicleFirstRegistered","attribute","string","","iso8601","","","The date in ISO 8601 format of the first registration of the vehicle with the respective public authorities.","","","","046f47acf62e50bd863d6568d73743d7" +"Vehicle.VehicleIdentification.LicensePlate","attribute","string","","","","","The license plate of the vehicle.","Depending on the context, this attribute might not be up to date or might be misconfigured, and therefore should be considered untrustworthy in the absence of another method of verification.","","","81ddd35883995a61a5fb71e26d31adaa" +"Vehicle.VehicleIdentification.MeetsEmissionStandard","attribute","string","","","","","Indicates that the vehicle meets the respective emission standard.","","","","d75dedbfadca54d8b6c7261c37ad5d83" +"Vehicle.VehicleIdentification.ProductionDate","attribute","string","","iso8601","","","The date in ISO 8601 format of production of the item, e.g. vehicle.","","","","5683877c4bac504d915b268c9476c190" +"Vehicle.VehicleIdentification.PurchaseDate","attribute","string","","iso8601","","","The date in ISO 8601 format of the item e.g. vehicle was purchased by the current owner.","","","","31302f8b57e85c4197afda3e3201fce8" +"Vehicle.VehicleIdentification.VehicleModelDate","attribute","string","","iso8601","","","The release date in ISO 8601 format of a vehicle model (often used to differentiate versions of the same make and model).","","","","c71b63f83dea536bac58e62bbe537f11" +"Vehicle.VehicleIdentification.VehicleConfiguration","attribute","string","","","","","A short text indicating the configuration of the vehicle, e.g. '5dr hatchback ST 2.5 MT 225 hp' or 'limited edition'.","","","","2526c7ba4c8458c78000a9e5f2fe89d5" +"Vehicle.VehicleIdentification.VehicleSeatingCapacity","attribute","uint16","","","","","The number of passengers that can be seated in the vehicle, both in terms of the physical space available, and in terms of limitations set by law.","","","","7ae5db0e0482555686b9be71dd8a0c38" +"Vehicle.VehicleIdentification.VehicleSpecialUsage","attribute","string","","","","","Indicates whether the vehicle has been used for special purposes, like commercial rental, driving school.","","","","7e6e8a48f54a5549a8f6af8f1dc5eb8d" +"Vehicle.VehicleIdentification.VehicleExteriorColor","attribute","string","","","","","The main color of the exterior within the basic color palette (eg. red, blue, black, white, ...).","","","","07c48d164c615369b87ccc2920edf802" +"Vehicle.VehicleIdentification.VehicleInteriorColor","attribute","string","","","","","The color or color combination of the interior of the vehicle.","","","","67a8b069b8bf573993d51959c24f04e2" +"Vehicle.VehicleIdentification.VehicleInteriorType","attribute","string","","","","","The type or material of the interior of the vehicle (e.g. synthetic fabric, leather, wood, etc.).","","","","4c4eed302b2e51daa9b6f5f398987a77" +"Vehicle.VehicleIdentification.KnownVehicleDamages","attribute","string","","","","","A textual description of known damages, both repaired and unrepaired.","","","","e87f352cddb15e94b340506b17207586" +"Vehicle.VehicleIdentification.OptionalExtras","attribute","string[]","","","","","Optional extras refers to all car equipment options that are not installed as standard by the manufacturer.","Allowed values are not standardized, each OEM can specify detail descriptions of array elements.","","","d9ecc64b0c995595967e05009d6fc1b9" +"Vehicle.LowVoltageSystemState","sensor","string","","","","","State of the supply voltage of the control units (usually 12V).","","['UNDEFINED', 'LOCK', 'OFF', 'ACC', 'ON', 'START']","","d7391ceb132e5519b02d4c13d5513d99" +"Vehicle.LowVoltageBattery","branch","","","","","","Signals related to low voltage battery.","","","","ab8c5816d44f55b68f6e1d6d9e5acb0b" +"Vehicle.LowVoltageBattery.NominalVoltage","attribute","uint16","","V","","","Nominal Voltage of the battery.","Nominal voltage typically refers to voltage of fully charged battery when delivering rated capacity.","","","bd5d4b6ee33f507fb49782505c3040e0" +"Vehicle.LowVoltageBattery.NominalCapacity","attribute","uint16","","Ah","","","Nominal capacity of the low voltage battery.","","","","d9f32612cb2f58d3b863a0dae21ff7af" +"Vehicle.LowVoltageBattery.CurrentVoltage","sensor","float","","V","","","Current Voltage of the low voltage battery.","","","","1394234e8b975a279959ae82e03df786" +"Vehicle.LowVoltageBattery.CurrentCurrent","sensor","float","","A","","","Current current flowing in/out of the low voltage battery. Positive = Current flowing in to battery, e.g. during charging or driving. Negative = Current flowing out of battery, e.g. when using the battery to start a combustion engine.","","","","e1d76e489d505b03ace30771ba4291b1" +"Vehicle.Speed","sensor","float","","km/h","","","Vehicle speed.","","","","efe50798638d55fab18ab7d43cc490e9" +"Vehicle.TraveledDistance","sensor","float","","km","","","Odometer reading, total distance traveled during the lifetime of the vehicle.","","","","32c3c3585f105d8aa5566ef5a038a741" +"Vehicle.TraveledDistanceSinceStart","sensor","float","","km","","","Distance traveled since start of current trip.","A new trip is considered to start when engine gets enabled (e.g. LowVoltageSystemState in ON or START mode). A trip is considered to end when engine is no longer enabled. The signal may however keep the value of the last trip until a new trip is started.","","","cfc6efd2793152e487f9fe3f4e03fd5d" +"Vehicle.StartTime","attribute","string","","iso8601","","","Start time of current or latest trip, formatted according to ISO 8601 with UTC time zone.","This signal is supposed to be set whenever a new trip starts. A new trip is considered to start when engine gets enabled (e.g. LowVoltageSystemState in ON or START mode). A trip is considered to end when engine is no longer enabled. The default value indicates that the vehicle never has been started, or that latest start time is unknown.","","0000-01-01T00:00Z","3790b5f4513c5a3d90a0503a965bbbe0" +"Vehicle.TripDuration","sensor","float","","s","","","Duration of latest trip.","This signal is not assumed to be continuously updated, but instead set to 0 when a trip starts and set to the actual duration of the trip when a trip ends. A new trip is considered to start when engine gets enabled (e.g. LowVoltageSystemState in ON or START mode). A trip is considered to end when engine is no longer enabled.","","","84b9558ad33555389791b57d505f27a8" +"Vehicle.TripMeterReading","actuator","float","","km","","","Trip meter reading.","The trip meter is an odometer that can be manually reset by the driver","","","81f51ebfe29c591190171d7b96e1c948" +"Vehicle.IsBrokenDown","sensor","boolean","","","","","Vehicle breakdown or any similar event causing vehicle to stop on the road, that might pose a risk to other road users. True = Vehicle broken down on the road, due to e.g. engine problems, flat tire, out of gas, brake problems. False = Vehicle not broken down.","Actual criteria and method used to decide if a vehicle is broken down is implementation specific.","","","469ebd2a76b45e5b97b799262a085330" +"Vehicle.IsMoving","sensor","boolean","","","","","Indicates whether the vehicle is stationary or moving.","","","","db69549cc7375e919c2a2883b41cd19c" +"Vehicle.AverageSpeed","sensor","float","","km/h","","","Average speed for the current trip.","A new trip is considered to start when engine gets enabled (e.g. LowVoltageSystemState in ON or START mode). A trip is considered to end when engine is no longer enabled. The signal may however keep the value of the last trip until a new trip is started. Calculation of average speed may exclude periods when the vehicle for example is not moving or transmission is in neutral.","","","43a489636a665c3abb99b63174eb552b" +"Vehicle.Acceleration","branch","","","","","","Spatial acceleration. Axis definitions according to ISO 8855.","","","","6c490e6a798c5abc8f0178ed6deae0a8" +"Vehicle.Acceleration.Longitudinal","sensor","float","","m/s^2","","","Vehicle acceleration in X (longitudinal acceleration).","","","","3d511fe7232b5841be311b37f322de5a" +"Vehicle.Acceleration.Lateral","sensor","float","","m/s^2","","","Vehicle acceleration in Y (lateral acceleration).","","","","7522c5d6b7665b16a099643b2700e93c" +"Vehicle.Acceleration.Vertical","sensor","float","","m/s^2","","","Vehicle acceleration in Z (vertical acceleration).","","","","a4a8a7c4ac5b52deb0b3ee4ed8787c59" +"Vehicle.AngularVelocity","branch","","","","","","Spatial rotation. Axis definitions according to ISO 8855.","","","","1eef530a43de56aab665d2766483cde2" +"Vehicle.AngularVelocity.Roll","sensor","float","","degrees/s","","","Vehicle rotation rate along X (longitudinal).","","","","221e6b93881e5771bcbd03e0849e0075" +"Vehicle.AngularVelocity.Pitch","sensor","float","","degrees/s","","","Vehicle rotation rate along Y (lateral).","","","","42236f4a01f45313a97fdd9b6848ce4f" +"Vehicle.AngularVelocity.Yaw","sensor","float","","degrees/s","","","Vehicle rotation rate along Z (vertical).","","","","4114c41552565c1f9035670cabe2a611" +"Vehicle.RoofLoad","attribute","int16","","kg","","","The permitted total weight of cargo and installations (e.g. a roof rack) on top of the vehicle.","","","","97dc98269a19591d9efa455a8d943c16" +"Vehicle.CargoVolume","attribute","float","","l","0","","The available volume for cargo or luggage. For automobiles, this is usually the trunk volume.","","","","789feabca2e8560ea3c1852371b4096e" +"Vehicle.EmissionsCO2","attribute","int16","","g/km","","","The CO2 emissions.","","","","b73e8f1ed17d584fad3f088c666dc2a5" +"Vehicle.CurrentOverallWeight","sensor","uint16","","kg","","","Current overall Vehicle weight. Including passengers, cargo and other load inside the car.","","","","75599d7628bb5f35839055269d3ad205" +"Vehicle.CurbWeight","attribute","uint16","","kg","","","Vehicle curb weight, including all liquids and full tank of fuel, but no cargo or passengers.","","","0","69ac6ca079de59d19737f75e4c5c4342" +"Vehicle.GrossWeight","attribute","uint16","","kg","","","Curb weight of vehicle, including all liquids and full tank of fuel and full load of cargo and passengers.","","","0","9671cb551dd8570fbe5d7cd797265e6a" +"Vehicle.MaxTowWeight","attribute","uint16","","kg","","","Maximum weight of trailer.","","","0","a1b8fd65897654aa8a418bccf443f1f3" +"Vehicle.MaxTowBallWeight","attribute","uint16","","kg","","","Maximum vertical weight on the tow ball of a trailer.","","","0","fec550f2064750e8b65b54fbf1368d68" +"Vehicle.Length","attribute","uint16","","mm","","","Overall vehicle length.","","","0","885f1be6842a513582e52a42edb3176f" +"Vehicle.Height","attribute","uint16","","mm","","","Overall vehicle height.","","","0","9784d39f68b8541f90c355178ded7d7c" +"Vehicle.Width","attribute","uint16","v4.1 replaced with WidthExcludingMirrors and WidthIncludingMirrors","mm","","","Overall vehicle width.","","","0","b4aabe144e3259adb1459a2e25fec9bd" +"Vehicle.WidthExcludingMirrors","attribute","uint16","","mm","","","Overall vehicle width excluding mirrors, as defined by SAE J1100-2009 W103.","","","0","3b942451854151a182d8310e795dfb35" +"Vehicle.WidthIncludingMirrors","attribute","uint16","","mm","","","Overall vehicle width including mirrors, as defined by SAE J1100-2009 W144.","","","","25bd8bd35fbd59f8b7b6423a90219ca1" +"Vehicle.WidthFoldedMirrors","attribute","uint16","","mm","","","Overall vehicle width with mirrors folded, as defined by SAE J1100-2009 W145.","","","","ee3490808cc35184af9639fb2f345f38" +"Vehicle.TurningDiameter","attribute","uint16","","mm","","","Minimum turning diameter, Wall-to-Wall, as defined by SAE J1100-2009 D102.","","","","acc4b8faccf45139a948e97570767736" +"Vehicle.Trailer","branch","","","","","","Trailer signals.","","","","66206ee5c25a5817bef214c0c8ae8013" +"Vehicle.Trailer.IsConnected","sensor","boolean","","","","","Signal indicating if trailer is connected or not.","","","","77f28ed03c125ac9a19d22e9436b0ec4" +"Vehicle.CurrentLocation","branch","","","","","","The current latitude and longitude of the vehicle.","","","","24777bd485f15fb69550ae0520c40ad5" +"Vehicle.CurrentLocation.Timestamp","sensor","string","","iso8601","","","Timestamp from GNSS system for current location, formatted according to ISO 8601 with UTC time zone.","","","","094aeff73be05c08905690be0e82a438" +"Vehicle.CurrentLocation.Latitude","sensor","double","","degrees","-90","90","Current latitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna.","","","","08933c5a445055df80bea15fbfa07f1c" +"Vehicle.CurrentLocation.Longitude","sensor","double","","degrees","-180","180","Current longitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna.","","","","5246f2ec5fea550cb1b36f110854cfbb" +"Vehicle.CurrentLocation.Heading","sensor","double","","degrees","0","360","Current heading relative to geographic north. 0 = North, 90 = East, 180 = South, 270 = West.","","","","2a8f0afa2b315943aa001278875ce012" +"Vehicle.CurrentLocation.HorizontalAccuracy","sensor","double","","m","","","Accuracy of the latitude and longitude coordinates.","","","","bf25ef243f0c5f839f7ef874f9c57fda" +"Vehicle.CurrentLocation.Altitude","sensor","double","","m","","","Current altitude relative to WGS 84 reference ellipsoid, as measured at the position of GNSS receiver antenna.","","","","d3ead98ab0b751c1a5b5dd5bc0e5e216" +"Vehicle.CurrentLocation.VerticalAccuracy","sensor","double","","m","","","Accuracy of altitude.","","","","8f54055bce9e5e8e97fb6051582707ab" +"Vehicle.CurrentLocation.GNSSReceiver","branch","","","","","","Information on the GNSS receiver used for determining current location.","","","","b1bea5d88662539a8cff6f8fe4974740" +"Vehicle.CurrentLocation.GNSSReceiver.FixType","sensor","string","","","","","Fix status of GNSS receiver.","","['NONE', 'TWO_D', 'TWO_D_SATELLITE_BASED_AUGMENTATION', 'TWO_D_GROUND_BASED_AUGMENTATION', 'TWO_D_SATELLITE_AND_GROUND_BASED_AUGMENTATION', 'THREE_D', 'THREE_D_SATELLITE_BASED_AUGMENTATION', 'THREE_D_GROUND_BASED_AUGMENTATION', 'THREE_D_SATELLITE_AND_GROUND_BASED_AUGMENTATION']","","52853b33d4605608bd0ae50595c69309" +"Vehicle.CurrentLocation.GNSSReceiver.MountingPosition","branch","","","","","","Mounting position of GNSS receiver antenna relative to vehicle coordinate system. Axis definitions according to ISO 8855. Origin at center of (first) rear axle.","","","","5c0887bce6fb5eb79402baaccb203e61" +"Vehicle.CurrentLocation.GNSSReceiver.MountingPosition.X","attribute","int16","","mm","","","Mounting position of GNSS receiver antenna relative to vehicle coordinate system. Axis definitions according to ISO 8855. Origin at center of (first) rear axle. Positive values = forward of rear axle. Negative values = backward of rear axle.","","","","f23d40f3556b5676a0d1e3def037197f" +"Vehicle.CurrentLocation.GNSSReceiver.MountingPosition.Y","attribute","int16","","mm","","","Mounting position of GNSS receiver antenna relative to vehicle coordinate system. Axis definitions according to ISO 8855. Origin at center of (first) rear axle. Positive values = left of origin. Negative values = right of origin. Left/Right is as seen from driver perspective, i.e. by a person looking forward.","","","","16745ae827c0527ea2c48c20f0c146f1" +"Vehicle.CurrentLocation.GNSSReceiver.MountingPosition.Z","attribute","int16","","mm","","","Mounting position of GNSS receiver on Z-axis. Axis definitions according to ISO 8855. Origin at center of (first) rear axle. Positive values = above center of rear axle. Negative values = below center of rear axle.","","","","a4d04e86518e5c5ab60e5e4face35756" +"Vehicle.PowerOptimizeLevel","actuator","uint8","","","0","10","Power optimization level for this branch/subsystem. A higher number indicates more aggressive power optimization. Level 0 indicates that all functionality is enabled, no power optimization enabled. Level 10 indicates most aggressive power optimization mode, only essential functionality enabled.","","","","add77f60f7885e39a84baae200569077" +"Vehicle.IsAutoPowerOptimize","actuator","boolean","","","","","Auto Power Optimization Flag When set to 'true', the system enables automatic power optimization, dynamically adjusting the power optimization level based on runtime conditions or features managed by the OEM. When set to 'false', manual control of the power optimization level is allowed.","","","","233a02ed58b65171907e0d395cbe1b5f" +"Vehicle.Powertrain","branch","","","","","","Powertrain data for battery management, etc.","","","","12f35ec7bd1c58d1a329565ce3d053d5" +"Vehicle.Powertrain.AccumulatedBrakingEnergy","sensor","float","","kWh","","","The accumulated energy from regenerative braking over lifetime.","","","","0dd466d28d3d5ad094f2015adafb91a5" +"Vehicle.Powertrain.Range","sensor","uint32","","m","","","Remaining range in meters using all energy sources available in the vehicle.","","","","ea4b6de772d65d20b1fa611f997aa7b8" +"Vehicle.Powertrain.TimeRemaining","sensor","uint32","","s","","","Time remaining in seconds before all energy sources available in the vehicle are empty.","","","","f0154f73e2575ab5a39fd10a44ec7149" +"Vehicle.Powertrain.Type","attribute","string","","","","","Defines the powertrain type of the vehicle.","For vehicles with a combustion engine (including hybrids) more detailed information on fuels supported can be found in FuelSystem.SupportedFuelTypes and FuelSystem.SupportedFuels.","['COMBUSTION', 'HYBRID', 'ELECTRIC']","","2a000da4204658a4a6e3ecd5176bdfba" +"Vehicle.Powertrain.PowerOptimizeLevel","actuator","uint8","","","0","10","Power optimization level for this branch/subsystem. A higher number indicates more aggressive power optimization. Level 0 indicates that all functionality is enabled, no power optimization enabled. Level 10 indicates most aggressive power optimization mode, only essential functionality enabled.","","","","d740b02e2fb35c07bf88a6e5ebe2f6e4" +"Vehicle.Powertrain.IsAutoPowerOptimize","actuator","boolean","","","","","Auto Power Optimization Flag When set to 'true', the system enables automatic power optimization, dynamically adjusting the power optimization level based on runtime conditions or features managed by the OEM. When set to 'false', manual control of the power optimization level is allowed.","","","","2f76567bacce582aac9d9e62da78ce9c" +"Vehicle.Powertrain.CombustionEngine","branch","","","","","","Engine-specific data, stopping at the bell housing.","","","","159e2e3e75f0590f95b4d2f6cfae54b5" +"Vehicle.Powertrain.CombustionEngine.EngineCode","attribute","string","","","","","Engine code designation, as specified by vehicle manufacturer.","For hybrid vehicles the engine code may refer to the combination of combustion and electric engine.","","","4ec845911b8e5b64b2cb1d34063184de" +"Vehicle.Powertrain.CombustionEngine.Displacement","attribute","uint16","","cm^3","","","Displacement in cubic centimetres.","","","","94dbd928847150ab842c00fa5caaf272" +"Vehicle.Powertrain.CombustionEngine.StrokeLength","attribute","float","","mm","","","Stroke length in millimetres.","","","","1bdfdab7904d51ed93e101b84ea54ddf" +"Vehicle.Powertrain.CombustionEngine.Bore","attribute","float","","mm","","","Bore in millimetres.","","","","1618fb16035b5464961570cc1afd934e" +"Vehicle.Powertrain.CombustionEngine.Configuration","attribute","string","","","","","Engine configuration.","","['UNKNOWN', 'STRAIGHT', 'V', 'BOXER', 'W', 'ROTARY', 'RADIAL', 'SQUARE', 'H', 'U', 'OPPOSED', 'X']","UNKNOWN","586be4567fe059ee9e6cf42901c2e773" +"Vehicle.Powertrain.CombustionEngine.NumberOfCylinders","attribute","uint16","","","","","Number of cylinders.","","","","b2cd342c218257e88d214cdb511df82b" +"Vehicle.Powertrain.CombustionEngine.NumberOfValvesPerCylinder","attribute","uint16","","","","","Number of valves per cylinder.","","","","44633204726e561ca21beff31f3fef80" +"Vehicle.Powertrain.CombustionEngine.CompressionRatio","attribute","string","","","","","Engine compression ratio, specified in the format 'X:1', e.g. '9.2:1'.","","","","ead42922511051a0a0a1b634781f3c09" +"Vehicle.Powertrain.CombustionEngine.EngineOilCapacity","attribute","float","","l","","","Engine oil capacity in liters.","","","","2ca7af6facb55a13885989faa9bc6ca7" +"Vehicle.Powertrain.CombustionEngine.EngineCoolantCapacity","attribute","float","","l","","","Engine coolant capacity in liters.","","","","90b5b64808ea5f4fa2798d96143b0d60" +"Vehicle.Powertrain.CombustionEngine.MaxPower","attribute","uint16","","kW","","","Peak power, in kilowatts, that engine can generate.","","","0","81fbdd5e90f557a38b96578a38dc137d" +"Vehicle.Powertrain.CombustionEngine.MaxTorque","attribute","uint16","","Nm","","","Peak torque, in newton meter, that the engine can generate.","","","0","471cd478c1e8597f8e97c85b4e4ebe26" +"Vehicle.Powertrain.CombustionEngine.AspirationType","attribute","string","","","","","Type of aspiration (natural, turbocharger, supercharger etc).","","['UNKNOWN', 'NATURAL', 'SUPERCHARGER', 'TURBOCHARGER']","UNKNOWN","3ca6a8ff30275c20a9d8d6d6829574eb" +"Vehicle.Powertrain.CombustionEngine.EngineOilLevel","sensor","string","","","","","Engine oil level.","","['CRITICALLY_LOW', 'LOW', 'NORMAL', 'HIGH', 'CRITICALLY_HIGH']","","e3813f59e94b509eb865fd97255a8a4f" +"Vehicle.Powertrain.CombustionEngine.OilLifeRemaining","sensor","int32","","s","","","Remaining engine oil life in seconds. Negative values can be used to indicate that lifetime has been exceeded.","In addition to this a signal a vehicle can report remaining time to service (including e.g. oil change) by Vehicle.Service.TimeToService.","","","94303734c68c5353a02625f652103918" +"Vehicle.Powertrain.CombustionEngine.IsRunning","sensor","boolean","","","","","Engine Running. True if engine is rotating (Speed > 0).","","","","57652c27679757398c44d56af7a044d3" +"Vehicle.Powertrain.CombustionEngine.Speed","sensor","uint16","","rpm","","","Engine speed measured as rotations per minute.","","","","557ce24c5a4d51cc825059c948ac9e29" +"Vehicle.Powertrain.CombustionEngine.EngineHours","sensor","float","","h","","","Accumulated time during engine lifetime with 'engine speed (rpm) > 0'.","","","","a23a62e24f58514d961890f53262e4e0" +"Vehicle.Powertrain.CombustionEngine.IdleHours","sensor","float","","h","","","Accumulated idling time during engine lifetime. Definition of idling is not standardized.","Vehicles may calculate accumulated idle time for an engine. It might be based on engine speed (rpm) below a certain limit or any other mechanism.","","","6caa3d7e669c5cc6aecd4a6be9a302d4" +"Vehicle.Powertrain.CombustionEngine.ECT","sensor","int16","","celsius","","","Engine coolant temperature.","","","","fff3cad23cac5b189a1a075c3ab562cd" +"Vehicle.Powertrain.CombustionEngine.EOT","sensor","int16","","celsius","","","Engine oil temperature.","","","","eae6f5eae04f530e80f6b024f95b767d" +"Vehicle.Powertrain.CombustionEngine.MAP","sensor","uint16","","kPa","","","Manifold absolute pressure possibly boosted using forced induction.","","","","28d4354fa34056369acb857aa7cc76ac" +"Vehicle.Powertrain.CombustionEngine.MAF","sensor","uint16","","g/s","","","Grams of air drawn into engine per second.","","","","1e222ed8c48b5dcea60e43ac8af7d6df" +"Vehicle.Powertrain.CombustionEngine.TPS","sensor","uint8","","percent","","100","Current throttle position.","","","","1ddb77860de558b4876ffb399a442bda" +"Vehicle.Powertrain.CombustionEngine.EOP","sensor","uint16","","kPa","","","Engine oil pressure.","","","","76c7039dc7975ec3a003f0f4a04895ec" +"Vehicle.Powertrain.CombustionEngine.Power","sensor","uint16","","kW","","","Current engine power output. Shall be reported as 0 during engine breaking.","","","","20e8b5d2187758c2848ed421248c180d" +"Vehicle.Powertrain.CombustionEngine.Torque","sensor","uint16","","Nm","","","Current engine torque. Shall be reported as 0 during engine breaking.","During engine breaking the engine delivers a negative torque to the transmission. This negative torque shall be ignored, instead 0 shall be reported.","","","b81f504bdb57513299ae6e9402ec7bcd" +"Vehicle.Powertrain.CombustionEngine.DieselExhaustFluid","branch","","","","","","Signals related to Diesel Exhaust Fluid (DEF). DEF is called AUS32 in ISO 22241.","In retail and marketing other names are typically used for the fluid.","","","81d8eec46d9357a3b1064bfb5d070fa2" +"Vehicle.Powertrain.CombustionEngine.DieselExhaustFluid.Capacity","attribute","float","","l","","","Capacity in liters of the Diesel Exhaust Fluid Tank.","","","","863c16ad452b5cf5b7a37f58bdda14c3" +"Vehicle.Powertrain.CombustionEngine.DieselExhaustFluid.Level","sensor","uint8","","percent","0","100","Level of the Diesel Exhaust Fluid tank as percent of capacity. 0 = empty. 100 = full.","","","","f5b0269b58ff5a8e8399f6d96963a3b6" +"Vehicle.Powertrain.CombustionEngine.DieselExhaustFluid.Range","sensor","uint32","","m","","","Remaining range in meters of the Diesel Exhaust Fluid present in the vehicle.","","","","124afbee975c5a67b316413f7b805eac" +"Vehicle.Powertrain.CombustionEngine.DieselExhaustFluid.IsLevelLow","sensor","boolean","","","","","Indicates if the Diesel Exhaust Fluid level is low. True if level is low. Definition of low is vehicle dependent.","","","","811af3fe4f7f5270b4119bb66cff8759" +"Vehicle.Powertrain.CombustionEngine.DieselParticulateFilter","branch","","","","","","Diesel Particulate Filter signals.","","","","eeddd99ad6475b1a92b9ec7bd7cefdbd" +"Vehicle.Powertrain.CombustionEngine.DieselParticulateFilter.InletTemperature","sensor","float","","celsius","","","Inlet temperature of Diesel Particulate Filter.","","","","70e90d202d3054bd967e67dce95c8ef2" +"Vehicle.Powertrain.CombustionEngine.DieselParticulateFilter.OutletTemperature","sensor","float","","celsius","","","Outlet temperature of Diesel Particulate Filter.","","","","e2b7f9d97bec5c0d94ade71a5e2f6518" +"Vehicle.Powertrain.CombustionEngine.DieselParticulateFilter.DeltaPressure","sensor","float","","Pa","","","Delta Pressure of Diesel Particulate Filter.","","","","a6f476775c60531b93acb835e0bc6ab6" +"Vehicle.Powertrain.Transmission","branch","","","","","","Transmission-specific data, stopping at the drive shafts.","","","","6b71e284b63a527caa6296a66e9fdd0c" +"Vehicle.Powertrain.Transmission.Type","attribute","string","","","","","Transmission type.","","['UNKNOWN', 'SEQUENTIAL', 'H', 'AUTOMATIC', 'DSG', 'CVT']","UNKNOWN","f83b9e5464d85a0288fcb32c164d3c63" +"Vehicle.Powertrain.Transmission.GearCount","attribute","int8","","","","","Number of forward gears in the transmission. -1 = CVT.","","","0","84293f40d3ed57f1a08992d97b1a9ccd" +"Vehicle.Powertrain.Transmission.DriveType","attribute","string","","","","","Drive type.","","['UNKNOWN', 'FORWARD_WHEEL_DRIVE', 'REAR_WHEEL_DRIVE', 'ALL_WHEEL_DRIVE']","UNKNOWN","0e480b76fb2d5f8bb08fb586f90ee6ae" +"Vehicle.Powertrain.Transmission.TravelledDistance","sensor","float","","km","","","Odometer reading, total distance travelled during the lifetime of the transmission.","","","","b9dd66f20c7f5b12a046766b94dc20c1" +"Vehicle.Powertrain.Transmission.CurrentGear","sensor","int8","","","","","The current gear. 0=Neutral, 1/2/..=Forward, -1/-2/..=Reverse.","","","","cd0ba1d772565e16bff46cbd5c9361da" +"Vehicle.Powertrain.Transmission.SelectedGear","actuator","int8","","","","","The selected gear. 0=Neutral, 1/2/..=Forward, -1/-2/..=Reverse, 126=Park, 127=Drive.","","","","490fd99b9d5f562eb180c19e8cef5e12" +"Vehicle.Powertrain.Transmission.IsParkLockEngaged","actuator","boolean","","","","","Is the transmission park lock engaged or not. False = Disengaged. True = Engaged.","","","","1578da3f925e54ac9df978abd0195408" +"Vehicle.Powertrain.Transmission.IsLowRangeEngaged","actuator","boolean","","","","","Is gearbox in low range mode or not. False = Normal/High range engaged. True = Low range engaged.","The possibility to switch between low and high gear range is typically only available in heavy vehicles and off-road vehicles.","","","63ba7593926b574ebbe4f90b28557e78" +"Vehicle.Powertrain.Transmission.IsElectricalPowertrainEngaged","actuator","boolean","","","","","Is electrical powertrain mechanically connected/engaged to the drivetrain or not. False = Disconnected/Disengaged. True = Connected/Engaged.","In some hybrid solutions it is possible to disconnect/disengage the electrical powertrain mechanically to avoid induced voltage reaching a too high level when driving at high speed.","","","6660cf1d88d15430b1e7c8908a7b769b" +"Vehicle.Powertrain.Transmission.PerformanceMode","actuator","string","","","","","Current gearbox performance mode.","","['NORMAL', 'SPORT', 'ECONOMY', 'SNOW', 'RAIN']","","6b5cfd85cb595e559503ccf993be04dd" +"Vehicle.Powertrain.Transmission.GearChangeMode","actuator","string","","","","","Is the gearbox in automatic or manual (paddle) mode.","","['MANUAL', 'AUTOMATIC']","","ff3c69378c2f598286e51f7dac13adaa" +"Vehicle.Powertrain.Transmission.Temperature","sensor","int16","","celsius","","","The current gearbox temperature.","","","","4f5e48c3511b5e1abff11aa7ec62dd18" +"Vehicle.Powertrain.Transmission.ClutchEngagement","actuator","float","","percent","0","100","Clutch engagement. 0% = Clutch fully disengaged. 100% = Clutch fully engaged.","","","","2890bd4a2b6a56c19b62d7bd95151fc6" +"Vehicle.Powertrain.Transmission.ClutchWear","sensor","uint8","","percent","","100","Clutch wear as a percent. 0 = no wear. 100 = worn.","","","","c113405ad165571a9d53ae4cf55dc929" +"Vehicle.Powertrain.Transmission.DiffLockFrontEngagement","actuator","float","","percent","0","100","Front Diff Lock engagement. 0% = Diff lock fully disengaged. 100% = Diff lock fully engaged.","","","","5149afe37fbd5c24847b5820821abc02" +"Vehicle.Powertrain.Transmission.DiffLockRearEngagement","actuator","float","","percent","0","100","Rear Diff Lock engagement. 0% = Diff lock fully disengaged. 100% = Diff lock fully engaged.","","","","197c939bd1405613b80179becec6db83" +"Vehicle.Powertrain.Transmission.TorqueDistribution","actuator","float","","percent","-100","100","Torque distribution between front and rear axle in percent. -100% = Full torque to front axle, 0% = 50:50 Front/Rear, 100% = Full torque to rear axle.","","","","d3bcaaf973d3512287817049db9bd677" +"Vehicle.Powertrain.ElectricMotor","branch","","","","","","Electric Motor specific data.","","","","1ade64f6b0d05f6c9340e7a667555ae2" +"Vehicle.Powertrain.ElectricMotor.EngineCode","attribute","string","","","","","Engine code designation, as specified by vehicle manufacturer.","","","","e4102a5142ed501495e5edafd3d36dfb" +"Vehicle.Powertrain.ElectricMotor.MaxPower","attribute","uint16","","kW","","","Peak power, in kilowatts, that motor(s) can generate.","","","0","825ec7911ee958abb199b9f7903df3a6" +"Vehicle.Powertrain.ElectricMotor.MaxTorque","attribute","uint16","","Nm","","","Peak power, in newton meter, that the motor(s) can generate.","","","0","cf31eabcde5151f589e9b0f7a6090512" +"Vehicle.Powertrain.ElectricMotor.MaxRegenPower","attribute","uint16","","kW","","","Peak regen/brake power, in kilowatts, that motor(s) can generate.","","","0","7f2cb2650ba95485b7156ffe76e27366" +"Vehicle.Powertrain.ElectricMotor.MaxRegenTorque","attribute","uint16","","Nm","","","Peak regen/brake torque, in newton meter, that the motor(s) can generate.","","","0","0e5190c2517b55aa80fcb9bf698e02d6" +"Vehicle.Powertrain.ElectricMotor.Speed","sensor","int32","","rpm","","","Motor rotational speed measured as rotations per minute. Negative values indicate reverse driving mode.","","","","ca961aa6ca435095a89f9d404a5d849d" +"Vehicle.Powertrain.ElectricMotor.Temperature","sensor","int16","","celsius","","","Motor temperature.","","","","1b7c15e5341052139995bfacea2c05b2" +"Vehicle.Powertrain.ElectricMotor.CoolantTemperature","sensor","int16","","celsius","","","Motor coolant temperature (if applicable).","","","","3c5ea8c7700956518f2ae7a2a0f34f1c" +"Vehicle.Powertrain.ElectricMotor.Power","sensor","int16","","kW","","","Current motor power output. Negative values indicate regen mode.","","","","46b86286fba059349a733fed9a0e3232" +"Vehicle.Powertrain.ElectricMotor.Torque","sensor","int16","","Nm","","","Current motor torque. Negative values indicate regen mode.","","","","aceffe768ddf5b828fff0975349d2433" +"Vehicle.Powertrain.TractionBattery","branch","","","","","","Battery Management data.","","","","1a2515d1a8875d86873431194ade2b50" +"Vehicle.Powertrain.TractionBattery.Id","attribute","string","","","","","Battery Identification Number as assigned by OEM.","This could be serial number, part number plus serial number, UUID, or any other identifier that the OEM want to use to uniquely identify the battery individual.","","","c8279874660c55b38c7ac64a8503a519" +"Vehicle.Powertrain.TractionBattery.ProductionDate","attribute","string","","iso8601","","","Production date of battery in ISO8601 format, e.g. YYYY-MM-DD.","","","","c9509ba4d76c56d9a8c1d6e2280ae02f" +"Vehicle.Powertrain.TractionBattery.ErrorCodes","sensor","string[]","","","","","Current error codes related to the battery, if any.","Error code format is not defined, it may be DTCs according to OBD II (SAE-J2012DA_201812) standard ([P|C|B|U]XXXXX ) or any other format.","","","bbc1f199a5965e5eb4f99709052a7cc4" +"Vehicle.Powertrain.TractionBattery.IsPowerConnected","sensor","boolean","","","","","Indicating if the power (positive terminator) of the traction battery is connected to the powertrain.","It might be possible to disconnect the traction battery used by an electric powertrain. This is achieved by connectors, typically one for plus and one for minus.","","","e30ef59fc2a25f6b8990248e19a5cdf9" +"Vehicle.Powertrain.TractionBattery.IsGroundConnected","sensor","boolean","","","","","Indicating if the ground (negative terminator) of the traction battery is connected to the powertrain.","It might be possible to disconnect the traction battery used by an electric powertrain. This is achieved by connectors, typically one for plus and one for minus.","","","dd38d1c7ee12530aac03f49ad01d5c04" +"Vehicle.Powertrain.TractionBattery.Temperature","branch","","","","","","Temperature Information for the battery pack.","","","","1cfbcf8c152959dcb3eb2c54fc42e623" +"Vehicle.Powertrain.TractionBattery.Temperature.Average","sensor","float","","celsius","","","Current average temperature of the battery cells.","","","","ae28e502137f56b9a037ed9b32bc04e1" +"Vehicle.Powertrain.TractionBattery.Temperature.Min","sensor","float","","celsius","","","Current minimum temperature of the battery cells, i.e. temperature of the coldest cell.","","","","4e3f630fefa7558fa302b175bc7eb5c7" +"Vehicle.Powertrain.TractionBattery.Temperature.Max","sensor","float","","celsius","","","Current maximum temperature of the battery cells, i.e. temperature of the hottest cell.","","","","07aa7c8ba1d355398d7469c2b337152a" +"Vehicle.Powertrain.TractionBattery.Temperature.CellTemperature","sensor","float[]","","","","","Array of cell temperatures. Length or array shall correspond to number of cells in vehicle.","Cells are identified by relative position in array.","","","e92fede319da5e428f4bd024d7dd6970" +"Vehicle.Powertrain.TractionBattery.CellVoltage","branch","","","","","","Voltage information for cells in the battery pack.","","","","0070210b80125f1a8e9473f8875fe3d1" +"Vehicle.Powertrain.TractionBattery.CellVoltage.Min","sensor","float","","V","","","Current voltage of the battery cell with lowest voltage.","","","","b868f28cc42a5ba28a127647cd16cb93" +"Vehicle.Powertrain.TractionBattery.CellVoltage.IdMin","sensor","uint16","","","","","Identifier of the battery cell with lowest voltage.","Identifier is supposed to be relative index of the cell, starting with 0 the first cell.","","","cbaef92ad3f55b20bc71188fba79d00d" +"Vehicle.Powertrain.TractionBattery.CellVoltage.Max","sensor","float","","V","","","Current voltage of the battery cell with highest voltage.","","","","bde40aa6b442580db3c0d4c1efed8a09" +"Vehicle.Powertrain.TractionBattery.CellVoltage.IdMax","sensor","uint16","","","","","Identifier of the battery cell with highest voltage.","Identifier is supposed to be relative index of the cell, starting with 0 the first cell.","","","c84a89bd5faa5e9cb0a9bf191bfeec9c" +"Vehicle.Powertrain.TractionBattery.CellVoltage.CellVoltages","sensor","float[]","","","","","Array of cell voltages. Length or array shall correspond to number of cells in vehicle.","Cells are identified by relative position in array.","","","1970692bc3a457f1b6f58aa53c905264" +"Vehicle.Powertrain.TractionBattery.GrossCapacity","attribute","uint16","","kWh","","","Gross capacity of the battery.","","","","5460530488435dc8bfa1298bf47a993d" +"Vehicle.Powertrain.TractionBattery.NetCapacity","sensor","uint16","","kWh","","","Total net capacity of the battery considering aging.","","","","9c68fe42cb81501eb6349f8c9b0b6899" +"Vehicle.Powertrain.TractionBattery.StateOfHealth","sensor","float","","percent","0","100","Calculated battery state of health at standard conditions.","Exact formula is implementation dependent. Could be e.g. current capacity at 20 degrees Celsius divided with original capacity at the same temperature.","","","4d982c47f3245048bcfec1190973a3ed" +"Vehicle.Powertrain.TractionBattery.StateOfCharge","branch","","","","","","Information on the state of charge of the vehicle's high voltage battery.","","","","26bae2ce7c4d5e2a951915ef2f5d8b7d" +"Vehicle.Powertrain.TractionBattery.StateOfCharge.Current","sensor","float","","percent","0","100.0","Physical state of charge of the high voltage battery, relative to net capacity. This is not necessarily the state of charge being displayed to the customer.","","","","2e647ca3a1ff5e52af137aab240642da" +"Vehicle.Powertrain.TractionBattery.StateOfCharge.Displayed","sensor","float","","percent","0","100.0","State of charge displayed to the customer.","","","","1bfcc228293b5512aafe2508ab0500d2" +"Vehicle.Powertrain.TractionBattery.StateOfCharge.CurrentEnergy","sensor","float","","kWh","","","Physical state of charge of high voltage battery expressed in kWh.","Current energy could be calculated as .StateOfCharge.Current * .NetCapacity.","","","435ef8dbe4425450ae1ff6215fc9e40b" +"Vehicle.Powertrain.TractionBattery.NominalVoltage","attribute","uint16","","V","","","Nominal Voltage of the battery.","Nominal voltage typically refers to voltage of fully charged battery when delivering rated capacity.","","","3eccae5633185b998d5bdb6ea33cd926" +"Vehicle.Powertrain.TractionBattery.MaxVoltage","attribute","uint16","","V","","","Max allowed voltage of the battery, e.g. during charging.","","","","a81264a0ef0c55d288671cfc62c4add5" +"Vehicle.Powertrain.TractionBattery.CurrentVoltage","sensor","float","","V","","","Current Voltage of the battery.","","","","7b54ea22ee7d5f559da552aefcc07222" +"Vehicle.Powertrain.TractionBattery.CurrentCurrent","sensor","float","","A","","","Current current flowing in/out of battery. Positive = Current flowing in to battery, e.g. during charging. Negative = Current flowing out of battery, e.g. during driving.","","","","7a1488e0c83f50a6b69d8ea85c5bb592" +"Vehicle.Powertrain.TractionBattery.CurrentPower","sensor","float","","W","","","Current electrical energy flowing in/out of battery. Positive = Energy flowing in to battery, e.g. during charging. Negative = Energy flowing out of battery, e.g. during driving.","","","","8859e1b0386a5eda880a9c30cd0dfa8e" +"Vehicle.Powertrain.TractionBattery.AccumulatedChargedEnergy","sensor","float","","kWh","","","The accumulated energy delivered to the battery during charging over lifetime of the battery.","","","","739d06021d795da0877bc0ef3c107de1" +"Vehicle.Powertrain.TractionBattery.AccumulatedConsumedEnergy","sensor","float","","kWh","","","The accumulated energy leaving HV battery for propulsion and auxiliary loads over lifetime of the battery.","","","","b844cb96765f574d8d31edb09ccaef81" +"Vehicle.Powertrain.TractionBattery.AccumulatedChargedThroughput","sensor","float","","Ah","","","The accumulated charge throughput delivered to the battery during charging over lifetime of the battery.","","","","6d038ccc313351fba3a9104c1158a207" +"Vehicle.Powertrain.TractionBattery.AccumulatedConsumedThroughput","sensor","float","","Ah","","","The accumulated charge throughput leaving HV battery for propulsion and auxiliary loads over lifetime of the battery.","","","","f3e2ca21f3b550288d494827c9a172dd" +"Vehicle.Powertrain.TractionBattery.PowerLoss","sensor","float","","W","","","Electrical energy lost by power dissipation to heat inside the battery.","","","","880082aafe025cb3a5776b623f9a48b5" +"Vehicle.Powertrain.TractionBattery.Range","sensor","uint32","","m","","","Remaining range in meters using only battery.","","","","c0376a425e5d578d9d86ae0dc2ad9778" +"Vehicle.Powertrain.TractionBattery.TimeRemaining","sensor","uint32","","s","","","Time remaining in seconds before the battery is empty.","","","","7a51820010f35dcabe968e669173b27e" +"Vehicle.Powertrain.TractionBattery.Charging","branch","","","","","","Properties related to battery charging.","","","","49b9ef0c8b145a36afdf17d0cb44131b" +"Vehicle.Powertrain.TractionBattery.Charging.ChargeLimit","actuator","uint8","","percent","0","100","Target charge limit (state of charge) for battery.","","","100","62360a4ed1095275a7052d65112aaef1" +"Vehicle.Powertrain.TractionBattery.Charging.MaximumChargingCurrent","branch","","","","","","Maximum charging current that can be accepted by the system, as measured at the charging inlet.","","","","e3f2e57e7a395d9ca9931d429e540a34" +"Vehicle.Powertrain.TractionBattery.Charging.MaximumChargingCurrent.DC","sensor","float","","A","","","Maximum DC charging current at inlet that can be accepted by the system.","","","","5a70acfd3c8959898b43738151ab36e1" +"Vehicle.Powertrain.TractionBattery.Charging.MaximumChargingCurrent.Phase1","sensor","float","","A","","","Maximum AC charging current (rms) at inlet for Phase 1 that can be accepted by the system.","","","","e3c1034e89cc55968ff51b990906db43" +"Vehicle.Powertrain.TractionBattery.Charging.MaximumChargingCurrent.Phase2","sensor","float","","A","","","Maximum AC charging current (rms) at inlet for Phase 2 that can be accepted by the system.","","","","ab3514bc982e54f2b98698fb6c752368" +"Vehicle.Powertrain.TractionBattery.Charging.MaximumChargingCurrent.Phase3","sensor","float","","A","","","Maximum AC charging current (rms) at inlet for Phase 3 that can be accepted by the system.","","","","47dd5e99c30d562e9e2e1c58007846b6" +"Vehicle.Powertrain.TractionBattery.Charging.ChargePortFlap","actuator","string","V4.1 - Replaced with Charging.IsChargePortFlapOpen","","","","Status of the charge port cover(s), can potentially be controlled manually. OPEN if at least one is open.","","['OPEN', 'CLOSED']","","71bdd2145bb55c3393df194bfc2e03e5" +"Vehicle.Powertrain.TractionBattery.Charging.IsChargePortFlapOpen","actuator","boolean","","","","","Status of the charge port flap(s), can potentially be controlled manually. True if at least one is open.","","","","4999617956745477b905f7922b27d4ec" +"Vehicle.Powertrain.TractionBattery.Charging.IsChargingCableConnected","sensor","boolean","","","","","Indicates if a charging cable is physically connected to the vehicle or not.","","","","a1c8e2f662b95a54a9933a1b163fff84" +"Vehicle.Powertrain.TractionBattery.Charging.IsChargingCableLocked","actuator","boolean","","","","","Is charging cable locked to prevent removal.","Locking of charging cable can be used to prevent unintentional removing during charging.","","","7fa81693f3b8587f8d71e7b1619c8e21" +"Vehicle.Powertrain.TractionBattery.Charging.ChargePlugType","attribute","string[]","V4.1 renamed to Charging.ChargePortType","","","","Type of charge plugs (charging inlet) available on the vehicle. A charge plug type may occur multiple times in the list if there are multiple instances of that charge plug type. IEC types refer to IEC 62196, GBT refers to GB/T 20234.","A vehicle may have multiple charging inlets. The signal Charging.ChargePlugPosition can be used to indicate position of the charge plug. IEC_TYPE_1_AC refers to Type 1 as defined in IEC 62196-2. Also known as Yazaki or J1772 connector. IEC_TYPE_2_AC refers to Type 2 as defined in IEC 62196-2. Also known as Mennekes connector. IEC_TYPE_3_AC refers to Type 3 as defined in IEC 62196-2. Also known as Scame connector. IEC_TYPE_4_DC refers to AA configuration as defined in IEC 62196-3. Also known as Type 4 or CHAdeMO connector. IEC_TYPE_1_CCS_DC refers to EE Configuration as defined in IEC 62196-3. Also known as CCS1 or Combo1 connector. IEC_TYPE_2_CCS_DC refers to FF Configuration as defined in IEC 62196-3. Also known as CCS2 or Combo2 connector. TESLA_ROADSTER, TESLA_HPWC (High Power Wall Connector) and TESLA_SUPERCHARGER refer to non-standardized charging inlets/methods used by Tesla. GBT_AC refers to connector specified in GB/T 20234.2. GBT_DC refers to connector specified in GB/T 20234.3. Also specified as BB Configuration in IEC 62196-3. OTHER shall be used if the vehicle has a charging connector, but not one of the connectors listed above. For additional information see https://en.wikipedia.org/wiki/IEC_62196.","['IEC_TYPE_1_AC', 'IEC_TYPE_2_AC', 'IEC_TYPE_3_AC', 'IEC_TYPE_4_DC', 'IEC_TYPE_1_CCS_DC', 'IEC_TYPE_2_CCS_DC', 'TESLA_ROADSTER', 'TESLA_HPWC', 'TESLA_SUPERCHARGER', 'GBT_AC', 'GBT_DC', 'OTHER']","","4c56357a6f1d586395215a9beeb26d91" +"Vehicle.Powertrain.TractionBattery.Charging.ChargePortType","attribute","string[]","","","","","Type of charge ports (charging inlet) available on the vehicle. A charge port type may occur multiple times in the list if there are multiple instances of that charge port type. IEC types refer to IEC 62196, GBT refers to GB/T 20234.","A vehicle may have multiple charging ports. The signal Charging.ChargePortPosition can be used to indicate position of the charge port. IEC_TYPE_1_AC refers to Type 1 as defined in IEC 62196-2. Also known as Yazaki or J1772 connector. IEC_TYPE_2_AC refers to Type 2 as defined in IEC 62196-2. Also known as Mennekes connector. IEC_TYPE_3_AC refers to Type 3 as defined in IEC 62196-2. Also known as Scame connector. IEC_TYPE_4_DC refers to AA configuration as defined in IEC 62196-3. Also known as Type 4 or CHAdeMO connector. IEC_TYPE_1_CCS_DC refers to EE Configuration as defined in IEC 62196-3. Also known as CCS1 or Combo1 connector. IEC_TYPE_2_CCS_DC refers to FF Configuration as defined in IEC 62196-3. Also known as CCS2 or Combo2 connector. TESLA_ROADSTER, TESLA_HPWC (High Power Wall Connector) and TESLA_SUPERCHARGER refer to non-standardized charging ports/methods used by Tesla. GBT_AC refers to connector specified in GB/T 20234.2. GBT_DC refers to connector specified in GB/T 20234.3. Also specified as BB Configuration in IEC 62196-3. OTHER shall be used for charging ports not included in the list above. For additional information see https://en.wikipedia.org/wiki/IEC_62196.","['IEC_TYPE_1_AC', 'IEC_TYPE_2_AC', 'IEC_TYPE_3_AC', 'IEC_TYPE_4_DC', 'IEC_TYPE_1_CCS_DC', 'IEC_TYPE_2_CCS_DC', 'TESLA_ROADSTER', 'TESLA_HPWC', 'TESLA_SUPERCHARGER', 'GBT_AC', 'GBT_DC', 'OTHER']","","c6f471ec8f51546ab45b8e1fd6119d30" +"Vehicle.Powertrain.TractionBattery.Charging.ChargePortPosition","attribute","string[]","","","","","Location of the charge port(s). First part indicates side of vehicle, second part relative position on that side. If supported, the list in this attribute shall have the same length as Charging.ChargePortType, and use same the relative order.","Example - If this signal is [LEFT_FRONT, RIGHT_FRONT] and Charging.ChargePortType is [IEC_TYPE_2_AC, GBT_AC] that means that there is Mennekes port on the left side of the vehicle near the front, and a GB/T AC port on the right side, near the front.","['FRONT_LEFT', 'FRONT_MIDDLE', 'FRONT_RIGHT', 'REAR_LEFT', 'REAR_MIDDLE', 'REAR_RIGHT', 'LEFT_FRONT', 'LEFT_MIDDLE', 'LEFT_REAR', 'RIGHT_FRONT', 'RIGHT_MIDDLE', 'RIGHT_REAR']","","71ff249b26215714b9b28b1b8e066dba" +"Vehicle.Powertrain.TractionBattery.Charging.Mode","actuator","string","V4.1 - MANUAL and GRID are deprecated, please use AUTOMATIC/TRIGGERED or EXTERNAL_ENITY instead.","","","","Describes how the charging process is controlled. DEACTIVATED means that charging and discharging is deactivated, nothing will happen if charger is connected. AUTOMATIC means charging will be initiated as soon as charger is connected. TRIGGERED means charging will be initiated when triggered by user. TIMER means charging is timer-based. PROFILE means charging is controlled by profile downloaded to vehicle. EXTERNAL_ENTITY means charging/discharging is controlled by the external entity connected to the vehicle. This includes GRID-controlled charging (e.g. ISO 15118), but also other cases where vehicle is connected to an arbitrary load that is powered by the vehicle. MANUAL means manually initiated (plug-in event, companion app, etc). GRID means grid-controlled (e.g. ISO 15118).","EXTERNAL_ENTITY is the only mode where discharge may occur. The mechanism to provide a profile to the vehicle is currently not covered by VSS.","['DEACTIVATED', 'AUTOMATIC', 'TRIGGERED', 'TIMER', 'PROFILE', 'EXTERNAL_ENTITY', 'MANUAL', 'GRID']","","1e4be3280b265873945531f6f6d0ec6b" +"Vehicle.Powertrain.TractionBattery.Charging.IsCharging","sensor","boolean","","","","","True if charging is ongoing. Charging is considered to be ongoing if energy is flowing from charger to vehicle.","","","","d28244c9e3365899954bd3e38ef46bb9" +"Vehicle.Powertrain.TractionBattery.Charging.IsDischarging","sensor","boolean","","","","","True if discharging (vehicle to grid) is ongoing. Discharging is considered to be ongoing if energy is flowing from vehicle to charger/grid.","","","","534d884fb36652688535543b52419529" +"Vehicle.Powertrain.TractionBattery.Charging.StartStopCharging","actuator","string","","","","","Start or stop the charging process.","","['START', 'STOP']","","80506d3e9a2557c2b52f74a50d89593f" +"Vehicle.Powertrain.TractionBattery.Charging.ChargeCurrent","branch","","","","","","Current charging current.","","","","94739cf563735b438878ac0f85601f27" +"Vehicle.Powertrain.TractionBattery.Charging.ChargeCurrent.DC","sensor","float","","A","","","Current DC charging current at inlet. Negative if returning energy to grid.","","","","44204d7ae6fd5f8e954d0670a739bdf2" +"Vehicle.Powertrain.TractionBattery.Charging.ChargeCurrent.Phase1","sensor","float","","A","","","Current AC charging current (rms) at inlet for Phase 1. Negative if returning energy to grid.","","","","400dca50fcde52a6bb605d7e86f49776" +"Vehicle.Powertrain.TractionBattery.Charging.ChargeCurrent.Phase2","sensor","float","","A","","","Current AC charging current (rms) at inlet for Phase 2. Negative if returning energy to grid.","","","","32cb24d1c495503a9087d6f55997cf57" +"Vehicle.Powertrain.TractionBattery.Charging.ChargeCurrent.Phase3","sensor","float","","A","","","Current AC charging current (rms) at inlet for Phase 3. Negative if returning energy to grid.","","","","55fb7fb7ff4a5df9b6a3af435eac868e" +"Vehicle.Powertrain.TractionBattery.Charging.ChargeVoltage","branch","","","","","","Current charging voltage, as measured at the charging inlet.","","","","7170151d653b52c6bb5e75cb0a14d1c5" +"Vehicle.Powertrain.TractionBattery.Charging.ChargeVoltage.DC","sensor","float","","V","","","Current DC charging voltage at charging inlet.","","","","701c21d1a4815b35ba061415789ec911" +"Vehicle.Powertrain.TractionBattery.Charging.ChargeVoltage.Phase1","sensor","float","","V","","","Current AC charging voltage (rms) at inlet for Phase 1.","","","","15991c8316585816815d6f4fb6b06776" +"Vehicle.Powertrain.TractionBattery.Charging.ChargeVoltage.Phase2","sensor","float","","V","","","Current AC charging voltage (rms) at inlet for Phase 2.","","","","6c0dcf98169d5a5190736a6dd81291a4" +"Vehicle.Powertrain.TractionBattery.Charging.ChargeVoltage.Phase3","sensor","float","","V","","","Current AC charging voltage (rms) at inlet for Phase 3.","","","","1ab06b48231e54e2ac27e543508c84f0" +"Vehicle.Powertrain.TractionBattery.Charging.AveragePower","sensor","float","","kW","","","Average charging power of last or current charging event.","","","","acc1728f1839516287d86975f679ec33" +"Vehicle.Powertrain.TractionBattery.Charging.MaxPower","sensor","float","","kW","","","Maximum charging power of last or current charging event.","","","","a8abad6796d55f8abe925c1efd76280a" +"Vehicle.Powertrain.TractionBattery.Charging.EvseId","sensor","string","","","","","EVSE charging point ID (without separators) of last or current charging event according to ISO 15118-2 Annex H.","Length of id between 7 and 37 characters. ZZ00000 to be used if SECC cannot provide id","","","5cd32296574a5f0db05434ecb24ea778" +"Vehicle.Powertrain.TractionBattery.Charging.Location","branch","","","","","","Location of last or current charging event.","This may depending on implementation represent the location of (the charge port of) the vehicle during charging, or the actual location of the charger/load connected to the vehicle.","","","5fef3925dfd55bbeb5d6590181fbbad8" +"Vehicle.Powertrain.TractionBattery.Charging.Location.Latitude","sensor","double","","degrees","-90","90","Latitude of last or current charging event in WGS 84 geodetic coordinates.","","","","33fc44c112735cc2bc0ee02f1786d948" +"Vehicle.Powertrain.TractionBattery.Charging.Location.Longitude","sensor","double","","degrees","-180","180","Longitude of last or current charging event in WGS 84 geodetic coordinates.","","","","42db7473630c506eb5528c9bcaf8e8c6" +"Vehicle.Powertrain.TractionBattery.Charging.Location.Altitude","sensor","double","","m","","","Altitude relative to WGS 84 reference ellipsoid of last or current charging event.","","","","eed551cc893a5e12ba6a3b977d93cc03" +"Vehicle.Powertrain.TractionBattery.Charging.PowerLoss","sensor","float","","W","","","Electrical energy lost by power dissipation to heat inside the AC/DC converter.","","","","88f40bbeb80b5dfb97ceba13269665c5" +"Vehicle.Powertrain.TractionBattery.Charging.Temperature","sensor","float","","celsius","","","Current temperature of AC/DC converter converting grid voltage to battery voltage.","","","","c3c0ef3a41db5df1bab659803adbc7ba" +"Vehicle.Powertrain.TractionBattery.Charging.ChargeRate","sensor","float","","km/h","","","Current charging rate, as in kilometers of range added per hour.","","","","a287cea3fdaa533180c8e349343a7851" +"Vehicle.Powertrain.TractionBattery.Charging.TimeToComplete","sensor","uint32","","s","","","The time needed for the current charging process to reach Charging.ChargeLimit. 0 if charging is complete or no charging process is active or planned.","Shall consider time set by Charging.Timer.Time. E.g. if charging shall start in 3 hours and 2 hours of charging is needed, then Charging.TimeToComplete shall report 5 hours.","","","c6439c2e068652b08383b9654e2e784a" +"Vehicle.Powertrain.TractionBattery.Charging.Timer","branch","","","","","","Properties related to timing of battery charging sessions.","","","","cd5b57ada627510e83f90832efed9d5a" +"Vehicle.Powertrain.TractionBattery.Charging.Timer.Mode","actuator","string","","","","","Defines timer mode for charging: INACTIVE - no timer set, charging may start as soon as battery is connected to a charger. START_TIME - charging shall start at Charging.Timer.Time. END_TIME - charging shall be finished (reach Charging.ChargeLimit) at Charging.Timer.Time. When charging is completed the vehicle shall change mode to 'inactive' or set a new Charging.Timer.Time. Charging shall start immediately if mode is 'starttime' or 'endtime' and Charging.Timer.Time is a time in the past.","","['INACTIVE', 'START_TIME', 'END_TIME']","","b09fb52261735977af275dda1904a7a1" +"Vehicle.Powertrain.TractionBattery.Charging.Timer.Time","actuator","string","","iso8601","","","Time for next charging-related action, formatted according to ISO 8601 with UTC time zone. Value has no significance if Charging.Timer.Mode is 'inactive'.","","","","c08dcaeda02b5e26aacd7e2542f0fc90" +"Vehicle.Powertrain.TractionBattery.DCDC","branch","","","","","","Properties related to DC/DC converter converting high voltage (from high voltage battery) to vehicle low voltage (supply voltage, typically 12 Volts).","","","","01f4943795b55cbd8f94e1bca137fc0a" +"Vehicle.Powertrain.TractionBattery.DCDC.PowerLoss","sensor","float","","W","","","Electrical energy lost by power dissipation to heat inside DC/DC converter.","","","","f29e37087cdf57ca998188c7b945a77b" +"Vehicle.Powertrain.TractionBattery.DCDC.Temperature","sensor","float","","celsius","","","Current temperature of DC/DC converter converting battery high voltage to vehicle low voltage (typically 12 Volts).","","","","4e587c3af2aa5fbb9205e42a64fc8d77" +"Vehicle.Powertrain.FuelSystem","branch","","","","","","Fuel system data.","","","","dbc194a7f97d5a56bc8942c17c2db22e" +"Vehicle.Powertrain.FuelSystem.SupportedFuelTypes","attribute","string[]","","","","","High level information of fuel types supported","If a vehicle also has an electric drivetrain (e.g. hybrid) that will be obvious from the PowerTrain.Type signal.","['GASOLINE', 'DIESEL', 'E85', 'LPG', 'CNG', 'LNG', 'H2', 'OTHER']","","80edc3002aa25097aba6455fe459fa6c" +"Vehicle.Powertrain.FuelSystem.SupportedFuel","attribute","string[]","","","","","Detailed information on fuels supported by the vehicle. Identifiers originating from DIN EN 16942:2021-08, appendix B, with additional suffix for octane (RON) where relevant.","RON 95 is sometimes referred to as Super, RON 98 as Super Plus.","['E5_95', 'E5_98', 'E10_95', 'E10_98', 'E85', 'B7', 'B10', 'B20', 'B30', 'B100', 'XTL', 'LPG', 'CNG', 'LNG', 'H2', 'OTHER']","","7fd3bf2ef0c650e69ff2037875ec59ee" +"Vehicle.Powertrain.FuelSystem.HybridType","attribute","string","","","","","Defines the hybrid type of the vehicle.","","['UNKNOWN', 'NOT_APPLICABLE', 'STOP_START', 'BELT_ISG', 'CIMG', 'PHEV']","UNKNOWN","f0f72012f5e453c1935ff8c3a5aff696" +"Vehicle.Powertrain.FuelSystem.TankCapacity","attribute","float","","l","","","Capacity of the fuel tank in liters.","","","","362643b866c55d5386fdbdf383464e90" +"Vehicle.Powertrain.FuelSystem.AbsoluteLevel","sensor","float","","l","","","Current available fuel in the fuel tank expressed in liters.","","","","00a1399655ee5d9188022f3d55d8f05e" +"Vehicle.Powertrain.FuelSystem.RelativeLevel","sensor","uint8","","percent","0","100","Level in fuel tank as percent of capacity. 0 = empty. 100 = full.","","","","e90e3daa1dcd5165a9d78b09e890fb22" +"Vehicle.Powertrain.FuelSystem.Range","sensor","uint32","","m","","","Remaining range in meters using only liquid fuel.","","","","c5a0dbe5e754553897f0aed0069af57a" +"Vehicle.Powertrain.FuelSystem.TimeRemaining","sensor","uint32","","s","","","Time remaining in seconds before the fuel tank is empty.","","","","a531b80a16bc59949abb2ab5228a1034" +"Vehicle.Powertrain.FuelSystem.InstantConsumption","sensor","float","","l/100km","0","","Current consumption in liters per 100 km.","","","","cf65767ec8ad56ffadfdccd831e4b562" +"Vehicle.Powertrain.FuelSystem.AverageConsumption","sensor","float","","l/100km","0","","Average consumption in liters per 100 km.","","","","e2252108125a54dcab34e1bad0fe8bdc" +"Vehicle.Powertrain.FuelSystem.ConsumptionSinceStart","sensor","float","","l","","","Fuel amount in liters consumed since start of current trip.","A new trip is considered to start when engine gets enabled (e.g. LowVoltageSystemState in ON or START mode). A trip is considered to end when engine is no longer enabled. The signal may however keep the value of the last trip until a new trip is started.","","","adf0a40964ff556f92b10275ad918883" +"Vehicle.Powertrain.FuelSystem.IsEngineStopStartEnabled","sensor","boolean","","","","","Indicates whether eco start stop is currently enabled.","","","","176eed5bb0da582a9ee56f1c70e12075" +"Vehicle.Powertrain.FuelSystem.IsFuelLevelLow","sensor","boolean","","","","","Indicates that the fuel level is low (e.g. <50km range).","","","","65f18ee3b04f5d4c8bb76083227dd9fe" +"Vehicle.Powertrain.FuelSystem.RefuelPortPosition","attribute","string[]","","","","","Position of refuel port(s). First part indicates side of vehicle, second part relative position on that side.","","['FRONT_LEFT', 'FRONT_MIDDLE', 'FRONT_RIGHT', 'REAR_LEFT', 'REAR_MIDDLE', 'REAR_RIGHT', 'LEFT_FRONT', 'LEFT_MIDDLE', 'LEFT_REAR', 'RIGHT_FRONT', 'RIGHT_MIDDLE', 'RIGHT_REAR']","","a7b5eb269b345ef7b18602b66517f952" +"Vehicle.Powertrain.FuelSystem.IsFuelPortFlapOpen","actuator","boolean","","","","","Status of the fuel port flap(s). True if at least one is open.","","","","fded7edb113c5894a21722085834f3ae" +"Vehicle.Body","branch","","","","","","All body components.","","","","bd2854e6a9165c5698ce8dd9f0438ecc" +"Vehicle.Body.BodyType","attribute","string","","","","","Body type code as defined by ISO 3779.","","","","6253412513105deea63b1d424117fd88" +"Vehicle.Body.RefuelPosition","attribute","string","v4.1 replaced with Vehicle.Powertrain.TractionBattery.Charging.ChargePortPosition and Vehicle.Powertrain.FuelSystem.RefuelPortPosition","","","","Location of the fuel cap or charge port.","","['FRONT_LEFT', 'FRONT_RIGHT', 'MIDDLE_LEFT', 'MIDDLE_RIGHT', 'REAR_LEFT', 'REAR_RIGHT']","","53ef90a851fa57f0810d50238e852f02" +"Vehicle.Body.Hood","branch","","","","","","Hood status. Start position for Hood is Closed.","The hood is the hinged cover over the engine compartment of a motor vehicles. Depending on vehicle, it can be either in the front or back of the vehicle. Luggage compartments are in VSS called trunks, even if they are located at the front of the vehicle.","","","84510652bf915bbe8bf5f477aab2b44a" +"Vehicle.Body.Hood.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","890aa3359e1a579288af1cf8e6b5b71f" +"Vehicle.Body.Hood.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","b79e060142095986aaeffcddd26d0d53" +"Vehicle.Body.Hood.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","256f856f00725f1fbd733b78f864c10d" +"Vehicle.Body.Trunk","branch","","","","","","Trunk status. Start position for Trunk is Closed.","A trunk is a luggage compartment in a vehicle. Depending on vehicle, it can be either in the front or back of the vehicle. Some vehicles may have trunks both at the front and at the rear of the vehicle.","","","a584c6a5aa235cb88ac686f8d72a1dff" +"Vehicle.Body.Trunk.Front","branch","","","","","","Trunk status. Start position for Trunk is Closed.","A trunk is a luggage compartment in a vehicle. Depending on vehicle, it can be either in the front or back of the vehicle. Some vehicles may have trunks both at the front and at the rear of the vehicle.","","","a455aca5bae55c22b7949fd31a765a6c" +"Vehicle.Body.Trunk.Front.IsLocked","actuator","boolean","","","","","Is item locked or unlocked. True = Locked. False = Unlocked.","","","","e0eabc210f07505fa1b66b67729d681b" +"Vehicle.Body.Trunk.Front.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","2047de0896a352fcaf02baa06819a023" +"Vehicle.Body.Trunk.Front.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","6d871111a565517098cd29936a30dd22" +"Vehicle.Body.Trunk.Front.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","63a651cd414652aba970a937af0b3621" +"Vehicle.Body.Trunk.Front.IsLightOn","actuator","boolean","","","","","Is trunk light on","V4.0 Moved from Vehicle.Cabin.Lights.IsTrunkOn because Trunk is not defined as part of the Cabin.","","","43d7844934a45890bf2a287b676a994b" +"Vehicle.Body.Trunk.Rear","branch","","","","","","Trunk status. Start position for Trunk is Closed.","A trunk is a luggage compartment in a vehicle. Depending on vehicle, it can be either in the front or back of the vehicle. Some vehicles may have trunks both at the front and at the rear of the vehicle.","","","a6170ff5e4325f38b5d57402e1d95e5a" +"Vehicle.Body.Trunk.Rear.IsLocked","actuator","boolean","","","","","Is item locked or unlocked. True = Locked. False = Unlocked.","","","","8f9b55b002ed59d3ac2ef0b014abf4aa" +"Vehicle.Body.Trunk.Rear.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","3d3249e59306594698367b839b12c938" +"Vehicle.Body.Trunk.Rear.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","574ae721a062565b9c057d813782909e" +"Vehicle.Body.Trunk.Rear.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","7a9f400abf875713adb5c696ae29b2be" +"Vehicle.Body.Trunk.Rear.IsLightOn","actuator","boolean","","","","","Is trunk light on","V4.0 Moved from Vehicle.Cabin.Lights.IsTrunkOn because Trunk is not defined as part of the Cabin.","","","a1065214515c5f7aa86f51eb7bf36664" +"Vehicle.Body.Horn","branch","","","","","","Horn signals.","","","","09c76633887f52268b960740eb969c89" +"Vehicle.Body.Horn.IsActive","actuator","boolean","","","","","Horn active or inactive. True = Active. False = Inactive.","","","","ba20deed9314525bb9d552a2b787fb20" +"Vehicle.Body.Raindetection","branch","","","","","","Rain sensor signals.","","","","f16759f3dcfb5be4832e962da29ebd6c" +"Vehicle.Body.Raindetection.Intensity","sensor","uint8","","percent","","100","Rain intensity. 0 = Dry, No Rain. 100 = Covered.","","","","1ee0a2f22e8257d299425a4ff2652555" +"Vehicle.Body.Windshield","branch","","","","","","Windshield signals.","","","","73efba535dcb5032b9edc43406b050b8" +"Vehicle.Body.Windshield.Front","branch","","","","","","Windshield signals.","","","","8f0c61e4e4f557d98729210fc3c74f72" +"Vehicle.Body.Windshield.Front.Wiping","branch","","","","","","Windshield wiper signals.","","","","2cffeccdc19a587cbe2264f426c6881a" +"Vehicle.Body.Windshield.Front.Wiping.Mode","actuator","string","","","","","Wiper mode requested by user/driver. INTERVAL indicates intermittent wiping, with fixed time interval between each wipe. RAIN_SENSOR indicates intermittent wiping based on rain intensity.","","['OFF', 'SLOW', 'MEDIUM', 'FAST', 'INTERVAL', 'RAIN_SENSOR']","","3ee6552c96e551c5b06b79ad30226767" +"Vehicle.Body.Windshield.Front.Wiping.Intensity","actuator","uint8","","","","","Relative intensity/sensitivity for interval and rain sensor mode as requested by user/driver. Has no significance if Windshield.Wiping.Mode is OFF/SLOW/MEDIUM/FAST 0 - wipers inactive. 1 - minimum intensity (lowest frequency/sensitivity, longest interval). 2/3/4/... - higher intensity (higher frequency/sensitivity, shorter interval). Maximum value supported is vehicle specific.","","","","7cdd36d1cc8f5f9a9f079f663190b588" +"Vehicle.Body.Windshield.Front.Wiping.System","branch","","","","","","Signals to control behavior of wipers in detail. By default VSS expects only one instance.","These signals are typically not directly available to the user/driver of the vehicle. The overlay in overlays/extensions/dual_wiper_systems.vspec can be used to modify this branch to support two instances; Primary and Secondary.","","","9002ff76166950e0aa3b7c9df3b53468" +"Vehicle.Body.Windshield.Front.Wiping.System.Mode","actuator","string","","","","","Requested mode of wiper system. STOP_HOLD means that the wipers shall move to position given by TargetPosition and then hold the position. WIPE means that wipers shall move to the position given by TargetPosition and then hold the position if no new TargetPosition is requested. PLANT_MODE means that wiping is disabled. Exact behavior is vehicle specific. EMERGENCY_STOP means that wiping shall be immediately stopped without holding the position.","","['STOP_HOLD', 'WIPE', 'PLANT_MODE', 'EMERGENCY_STOP']","","d15518f5d1bc54a38718f43ef749dd34" +"Vehicle.Body.Windshield.Front.Wiping.System.Frequency","actuator","uint8","","cpm","","","Wiping frequency/speed, measured in cycles per minute. The signal concerns the actual speed of the wiper blades when moving. Intervals/pauses are excluded, i.e. the value corresponds to the number of cycles that would be completed in 1 minute if wiping permanently over default range.","Examples - 0 = Wipers stopped, 80 = Wipers doing 80 cycles per minute (in WIPE mode).","","","7394c8b8d20d52638881161ec1b41fc0" +"Vehicle.Body.Windshield.Front.Wiping.System.TargetPosition","actuator","float","","degrees","","","Requested position of main wiper blade for the wiper system relative to reference position. Location of reference position (0 degrees) and direction of positive/negative degrees is vehicle specific. System behavior when receiving TargetPosition depends on Mode and IsEndingWipeCycle. Supported values are vehicle specific and might be dynamically corrected. If IsEndingWipeCycle=True then wipers will complete current movement before actuating new TargetPosition. If IsEndingWipeCycle=False then wipers will directly change destination if the TargetPosition is changed.","Default parking position might be used as reference position.","","","7a4a3fdd2947596dbada6980c142f090" +"Vehicle.Body.Windshield.Front.Wiping.System.ActualPosition","actuator","float","","degrees","","","Actual position of main wiper blade for the wiper system relative to reference position. Location of reference position (0 degrees) and direction of positive/negative degrees is vehicle specific.","Default parking position might be used as reference position.","","","026307b591465a8a99ffc0ebf262b393" +"Vehicle.Body.Windshield.Front.Wiping.System.DriveCurrent","sensor","float","","A","","","Actual current used by wiper drive.","May be negative in special situations.","","","251e695821b758e7b7d459d5e2ab6ca4" +"Vehicle.Body.Windshield.Front.Wiping.System.IsWiping","sensor","boolean","","","","","Indicates wiper movement. True if wiper blades are moving. Change of direction shall be considered as IsWiping if wipers will continue to move directly after the change of direction.","","","","2015a4610d7a5fbdbb63b260640838e6" +"Vehicle.Body.Windshield.Front.Wiping.System.IsEndingWipeCycle","sensor","boolean","","","","","Indicates if current wipe movement is completed or near completion. True = Movement is completed or near completion. Changes to RequestedPosition will be executed first after reaching previous RequestedPosition, if it has not already been reached. False = Movement is not near completion. Any change to RequestedPosition will be executed immediately. Change of direction may not be allowed.","In continuous wiping between A and B this sensor can be used a trigger to update TargetPosition.","","","5000f7f0c39e5fed9a95413ae4166482" +"Vehicle.Body.Windshield.Front.Wiping.System.IsWiperError","sensor","boolean","","","","","Indicates system failure. True if wiping is disabled due to system failure.","","","","5276055d973f57998e1b8d6e536de735" +"Vehicle.Body.Windshield.Front.Wiping.System.IsPositionReached","sensor","boolean","","","","","Indicates if a requested position has been reached. IsPositionReached refers to the previous position in case the TargetPosition is updated while IsEndingWipeCycle=True. True = Current or Previous TargetPosition reached. False = Position not (yet) reached, or wipers have moved away from the reached position.","","","","d42149fa8982593991aa5cd13a1cdee9" +"Vehicle.Body.Windshield.Front.Wiping.System.IsBlocked","sensor","boolean","","","","","Indicates if wiper movement is blocked. True = Movement blocked. False = Movement not blocked.","","","","4b526a2c781e56e386c82df226061f9e" +"Vehicle.Body.Windshield.Front.Wiping.System.IsOverheated","sensor","boolean","","","","","Indicates if wiper system is overheated. True = Wiper system overheated. False = Wiper system not overheated.","","","","e05d376ec2525ba2b61039d55f93760f" +"Vehicle.Body.Windshield.Front.Wiping.WiperWear","sensor","uint8","","percent","","100","Wiper wear as percent. 0 = No Wear. 100 = Worn. Replacement required. Method for calculating or estimating wiper wear is vehicle specific. For windshields with multiple wipers the wear reported shall correspond to the most worn wiper.","","","","92c879c11bc65e6da30d582a3928caac" +"Vehicle.Body.Windshield.Front.Wiping.IsWipersWorn","sensor","boolean","","","","","Wiper wear status. True = Worn, Replacement recommended or required. False = Not Worn.","","","","b04ccc7daedb559c9bcdda6b00332be5" +"Vehicle.Body.Windshield.Front.IsHeatingOn","actuator","boolean","","","","","Windshield heater status. False - off, True - on.","","","","26e6a3b7e9bb58bebba29258faa6e300" +"Vehicle.Body.Windshield.Front.WasherFluid","branch","","","","","","Windshield washer fluid signals","","","","2de24016515353289953de5ea81efd3c" +"Vehicle.Body.Windshield.Front.WasherFluid.IsLevelLow","sensor","boolean","","","","","Low level indication for washer fluid. True = Level Low. False = Level OK.","","","","8ca54695ad115f9bb6f56d7c450781a7" +"Vehicle.Body.Windshield.Front.WasherFluid.Level","sensor","uint8","","percent","","100","Washer fluid level as a percent. 0 = Empty. 100 = Full.","","","","a36dfb91414f5792bd01d193dceff1f4" +"Vehicle.Body.Windshield.Rear","branch","","","","","","Windshield signals.","","","","095ff58459b854aaa742e56447fe7a93" +"Vehicle.Body.Windshield.Rear.Wiping","branch","","","","","","Windshield wiper signals.","","","","f56e80a50fd75dbca48581aea4f012b7" +"Vehicle.Body.Windshield.Rear.Wiping.Mode","actuator","string","","","","","Wiper mode requested by user/driver. INTERVAL indicates intermittent wiping, with fixed time interval between each wipe. RAIN_SENSOR indicates intermittent wiping based on rain intensity.","","['OFF', 'SLOW', 'MEDIUM', 'FAST', 'INTERVAL', 'RAIN_SENSOR']","","8cc0b88ac8b45f5fa30bb7755ce22648" +"Vehicle.Body.Windshield.Rear.Wiping.Intensity","actuator","uint8","","","","","Relative intensity/sensitivity for interval and rain sensor mode as requested by user/driver. Has no significance if Windshield.Wiping.Mode is OFF/SLOW/MEDIUM/FAST 0 - wipers inactive. 1 - minimum intensity (lowest frequency/sensitivity, longest interval). 2/3/4/... - higher intensity (higher frequency/sensitivity, shorter interval). Maximum value supported is vehicle specific.","","","","f18b13b9d96b51c492c031d3d86d22da" +"Vehicle.Body.Windshield.Rear.Wiping.System","branch","","","","","","Signals to control behavior of wipers in detail. By default VSS expects only one instance.","These signals are typically not directly available to the user/driver of the vehicle. The overlay in overlays/extensions/dual_wiper_systems.vspec can be used to modify this branch to support two instances; Primary and Secondary.","","","a00826f6ecc25c3fae7ad164361bdb33" +"Vehicle.Body.Windshield.Rear.Wiping.System.Mode","actuator","string","","","","","Requested mode of wiper system. STOP_HOLD means that the wipers shall move to position given by TargetPosition and then hold the position. WIPE means that wipers shall move to the position given by TargetPosition and then hold the position if no new TargetPosition is requested. PLANT_MODE means that wiping is disabled. Exact behavior is vehicle specific. EMERGENCY_STOP means that wiping shall be immediately stopped without holding the position.","","['STOP_HOLD', 'WIPE', 'PLANT_MODE', 'EMERGENCY_STOP']","","f2f47522466d570baa7618fac5b0359c" +"Vehicle.Body.Windshield.Rear.Wiping.System.Frequency","actuator","uint8","","cpm","","","Wiping frequency/speed, measured in cycles per minute. The signal concerns the actual speed of the wiper blades when moving. Intervals/pauses are excluded, i.e. the value corresponds to the number of cycles that would be completed in 1 minute if wiping permanently over default range.","Examples - 0 = Wipers stopped, 80 = Wipers doing 80 cycles per minute (in WIPE mode).","","","371171d971995c999585b028e19be461" +"Vehicle.Body.Windshield.Rear.Wiping.System.TargetPosition","actuator","float","","degrees","","","Requested position of main wiper blade for the wiper system relative to reference position. Location of reference position (0 degrees) and direction of positive/negative degrees is vehicle specific. System behavior when receiving TargetPosition depends on Mode and IsEndingWipeCycle. Supported values are vehicle specific and might be dynamically corrected. If IsEndingWipeCycle=True then wipers will complete current movement before actuating new TargetPosition. If IsEndingWipeCycle=False then wipers will directly change destination if the TargetPosition is changed.","Default parking position might be used as reference position.","","","c39bef0760185555904a92a305392080" +"Vehicle.Body.Windshield.Rear.Wiping.System.ActualPosition","actuator","float","","degrees","","","Actual position of main wiper blade for the wiper system relative to reference position. Location of reference position (0 degrees) and direction of positive/negative degrees is vehicle specific.","Default parking position might be used as reference position.","","","eddee2607a135582bbcf3d3afc845892" +"Vehicle.Body.Windshield.Rear.Wiping.System.DriveCurrent","sensor","float","","A","","","Actual current used by wiper drive.","May be negative in special situations.","","","7a254692329055dfb4089e2dcc1d4ef3" +"Vehicle.Body.Windshield.Rear.Wiping.System.IsWiping","sensor","boolean","","","","","Indicates wiper movement. True if wiper blades are moving. Change of direction shall be considered as IsWiping if wipers will continue to move directly after the change of direction.","","","","4e001bf679e85c9aa7319bafc3a86e75" +"Vehicle.Body.Windshield.Rear.Wiping.System.IsEndingWipeCycle","sensor","boolean","","","","","Indicates if current wipe movement is completed or near completion. True = Movement is completed or near completion. Changes to RequestedPosition will be executed first after reaching previous RequestedPosition, if it has not already been reached. False = Movement is not near completion. Any change to RequestedPosition will be executed immediately. Change of direction may not be allowed.","In continuous wiping between A and B this sensor can be used a trigger to update TargetPosition.","","","c1357156d87c58f49d4c43c2a6e97c03" +"Vehicle.Body.Windshield.Rear.Wiping.System.IsWiperError","sensor","boolean","","","","","Indicates system failure. True if wiping is disabled due to system failure.","","","","ac5983deacbe59d7ba1312d44bfd9cd4" +"Vehicle.Body.Windshield.Rear.Wiping.System.IsPositionReached","sensor","boolean","","","","","Indicates if a requested position has been reached. IsPositionReached refers to the previous position in case the TargetPosition is updated while IsEndingWipeCycle=True. True = Current or Previous TargetPosition reached. False = Position not (yet) reached, or wipers have moved away from the reached position.","","","","ad35e8d17cd95273b1091dcef2104ea1" +"Vehicle.Body.Windshield.Rear.Wiping.System.IsBlocked","sensor","boolean","","","","","Indicates if wiper movement is blocked. True = Movement blocked. False = Movement not blocked.","","","","046e818b4dd9595a8301503e9afe028b" +"Vehicle.Body.Windshield.Rear.Wiping.System.IsOverheated","sensor","boolean","","","","","Indicates if wiper system is overheated. True = Wiper system overheated. False = Wiper system not overheated.","","","","d30bc6f33b995ef491c252980a559ee2" +"Vehicle.Body.Windshield.Rear.Wiping.WiperWear","sensor","uint8","","percent","","100","Wiper wear as percent. 0 = No Wear. 100 = Worn. Replacement required. Method for calculating or estimating wiper wear is vehicle specific. For windshields with multiple wipers the wear reported shall correspond to the most worn wiper.","","","","afd6a352230f5eeaa8ac5f1f188bfd33" +"Vehicle.Body.Windshield.Rear.Wiping.IsWipersWorn","sensor","boolean","","","","","Wiper wear status. True = Worn, Replacement recommended or required. False = Not Worn.","","","","0e8d5f7cb6295b908be3a03e8792cca8" +"Vehicle.Body.Windshield.Rear.IsHeatingOn","actuator","boolean","","","","","Windshield heater status. False - off, True - on.","","","","76d811b4c4c356f4898dd6383e28bc6f" +"Vehicle.Body.Windshield.Rear.WasherFluid","branch","","","","","","Windshield washer fluid signals","","","","1ea4ac2370e1567b9b812c1e3020ddfb" +"Vehicle.Body.Windshield.Rear.WasherFluid.IsLevelLow","sensor","boolean","","","","","Low level indication for washer fluid. True = Level Low. False = Level OK.","","","","8ca0356548ae54e8af3aeace49e5ed71" +"Vehicle.Body.Windshield.Rear.WasherFluid.Level","sensor","uint8","","percent","","100","Washer fluid level as a percent. 0 = Empty. 100 = Full.","","","","c167e5b265895c108da1b9582de2dd91" +"Vehicle.Body.Lights","branch","","","","","","Exterior lights.","","","","399d1ec14d6f55bb825e078a801bde55" +"Vehicle.Body.Lights.LightSwitch","actuator","string","","","","","Status of the vehicle main light switch.","A vehicle typically does not support all alternatives. Which lights that actually are lit may vary according to vehicle configuration and local legislation. OFF is typically indicated by 0. POSITION is typically indicated by ISO 7000 symbol 0456. DAYTIME_RUNNING_LIGHTS (DRL) can be indicated by ISO 7000 symbol 2611. AUTO indicates that vehicle automatically selects suitable lights. BEAM is typically indicated by ISO 7000 symbol 0083.","['OFF', 'POSITION', 'DAYTIME_RUNNING_LIGHTS', 'AUTO', 'BEAM']","","2feb14a3558256339442413783969f4f" +"Vehicle.Body.Lights.IsHighBeamSwitchOn","actuator","boolean","","","","","Status of the high beam switch. True = high beam enabled. False = high beam not enabled.","This signal indicates the status of the switch and does not indicate if low or high beam actually are on. That typically depends on vehicle logic and other signals like Lights.LightSwitch and Vehicle.LowVoltageSystemState.","","","ac7db3cd30f55650bc6939df504f1a79" +"Vehicle.Body.Lights.Beam","branch","","","","","","Beam lights.","","","","6685308a9d955ecdad92a7cc68666a12" +"Vehicle.Body.Lights.Beam.Low","branch","","","","","","Beam lights.","","","","f6f21ea5b263545297f4411b2e15037f" +"Vehicle.Body.Lights.Beam.Low.IsOn","actuator","boolean","","","","","Indicates if light is on or off. True = On. False = Off.","","","","8b4d4855b0c95963a25dc564c9758610" +"Vehicle.Body.Lights.Beam.Low.IsDefect","sensor","boolean","","","","","Indicates if light is defect. True = Light is defect. False = Light has no defect.","","","","3a135f1267ea5b2a80aa9a17fc8072db" +"Vehicle.Body.Lights.Beam.High","branch","","","","","","Beam lights.","","","","306b51d2e1ec572fa80172aad6727da0" +"Vehicle.Body.Lights.Beam.High.IsOn","actuator","boolean","","","","","Indicates if light is on or off. True = On. False = Off.","","","","24d1346519b05697b872c06556a09fb4" +"Vehicle.Body.Lights.Beam.High.IsDefect","sensor","boolean","","","","","Indicates if light is defect. True = Light is defect. False = Light has no defect.","","","","83561d8c9a025cfdad6c4b325829fa00" +"Vehicle.Body.Lights.Running","branch","","","","","","Daytime running lights (DRL).","","","","38868a9f1bda573595501302c1f0a1db" +"Vehicle.Body.Lights.Running.IsOn","actuator","boolean","","","","","Indicates if light is on or off. True = On. False = Off.","","","","1c4e44f1e0275965b466ac674a5b8cac" +"Vehicle.Body.Lights.Running.IsDefect","sensor","boolean","","","","","Indicates if light is defect. True = Light is defect. False = Light has no defect.","","","","7cda127e6d45547681757e789c0b7a87" +"Vehicle.Body.Lights.Backup","branch","","","","","","Backup lights.","","","","4fe2cb68fc77506686eced7225aeff9a" +"Vehicle.Body.Lights.Backup.IsOn","actuator","boolean","","","","","Indicates if light is on or off. True = On. False = Off.","","","","ef23a3fa6106564195a66e21d8cf69b4" +"Vehicle.Body.Lights.Backup.IsDefect","sensor","boolean","","","","","Indicates if light is defect. True = Light is defect. False = Light has no defect.","","","","b907c4ac4ee459faa987c64a6da424c3" +"Vehicle.Body.Lights.Parking","branch","","","","","","Parking lights.","","","","dfb819be5cec5be09b9fb743829301c3" +"Vehicle.Body.Lights.Parking.IsOn","actuator","boolean","","","","","Indicates if light is on or off. True = On. False = Off.","","","","6ba0825427335408ad7d0f148d6250ea" +"Vehicle.Body.Lights.Parking.IsDefect","sensor","boolean","","","","","Indicates if light is defect. True = Light is defect. False = Light has no defect.","","","","56761305eae559c7931f6ff5fee0dfa8" +"Vehicle.Body.Lights.Fog","branch","","","","","","Fog lights.","","","","1e90cf42bb825217b283c7285a606953" +"Vehicle.Body.Lights.Fog.Rear","branch","","","","","","Fog lights.","","","","38359f258135516cb49c0fa1f093d478" +"Vehicle.Body.Lights.Fog.Rear.IsOn","actuator","boolean","","","","","Indicates if light is on or off. True = On. False = Off.","","","","1fe08a2f687c5c2880adef26cc7de746" +"Vehicle.Body.Lights.Fog.Rear.IsDefect","sensor","boolean","","","","","Indicates if light is defect. True = Light is defect. False = Light has no defect.","","","","1d44e594ffa35d73a6f620f479eeef4c" +"Vehicle.Body.Lights.Fog.Front","branch","","","","","","Fog lights.","","","","230cc65abaaf500c9085c29d48107552" +"Vehicle.Body.Lights.Fog.Front.IsOn","actuator","boolean","","","","","Indicates if light is on or off. True = On. False = Off.","","","","0ec10846d20a5d1b9b8a286303ecb844" +"Vehicle.Body.Lights.Fog.Front.IsDefect","sensor","boolean","","","","","Indicates if light is defect. True = Light is defect. False = Light has no defect.","","","","f9238f15d2615a22802ce9ec9f1d72e9" +"Vehicle.Body.Lights.LicensePlate","branch","","","","","","License plate lights.","","","","7bb12e42a8c45c198f83bf41b19131fa" +"Vehicle.Body.Lights.LicensePlate.IsOn","actuator","boolean","","","","","Indicates if light is on or off. True = On. False = Off.","","","","afeace5d76ed53f989ae4251090ba069" +"Vehicle.Body.Lights.LicensePlate.IsDefect","sensor","boolean","","","","","Indicates if light is defect. True = Light is defect. False = Light has no defect.","","","","4de6594de7815cec97e5b851d70e239b" +"Vehicle.Body.Lights.Brake","branch","","","","","","Brake lights.","","","","30eabe704102501cb299d03696fad92a" +"Vehicle.Body.Lights.Brake.IsActive","actuator","string","","","","","Indicates if break-light is active. INACTIVE means lights are off. ACTIVE means lights are on. ADAPTIVE means that break-light is indicating emergency-breaking.","","['INACTIVE', 'ACTIVE', 'ADAPTIVE']","","65eb84d61ea95313985054f626b85b59" +"Vehicle.Body.Lights.Brake.IsDefect","sensor","boolean","","","","","Indicates if light is defect. True = Light is defect. False = Light has no defect.","","","","1db542c5ba715e09b948527418966728" +"Vehicle.Body.Lights.Hazard","branch","","","","","","Hazard lights.","","","","803498c3be6253dfb074c0e0294be758" +"Vehicle.Body.Lights.Hazard.IsSignaling","actuator","boolean","","","","","Indicates if light is signaling or off. True = signaling. False = Off.","","","","c53950205aa15dffa304390dcb761cc3" +"Vehicle.Body.Lights.Hazard.IsDefect","sensor","boolean","","","","","Indicates if light is defect. True = Light is defect. False = Light has no defect.","","","","25cd3475beb6543a8538974b67544c43" +"Vehicle.Body.Lights.DirectionIndicator","branch","","","","","","Indicator lights.","","","","0566cb97d05c554eb88a07142f2475ac" +"Vehicle.Body.Lights.DirectionIndicator.Left","branch","","","","","","Indicator lights.","","","","446dea42b8e95d87b45e5e51c881bf98" +"Vehicle.Body.Lights.DirectionIndicator.Left.IsSignaling","actuator","boolean","","","","","Indicates if light is signaling or off. True = signaling. False = Off.","","","","33ac6ec5e4d9550aac6ae0ce97dae259" +"Vehicle.Body.Lights.DirectionIndicator.Left.IsDefect","sensor","boolean","","","","","Indicates if light is defect. True = Light is defect. False = Light has no defect.","","","","32a092936fb65165ba1dd8dfa38bf77d" +"Vehicle.Body.Lights.DirectionIndicator.Right","branch","","","","","","Indicator lights.","","","","9922f6b417e95f1c945ef9f414bcdf78" +"Vehicle.Body.Lights.DirectionIndicator.Right.IsSignaling","actuator","boolean","","","","","Indicates if light is signaling or off. True = signaling. False = Off.","","","","9b0a1dab153f5dcda8df2116c3b6d487" +"Vehicle.Body.Lights.DirectionIndicator.Right.IsDefect","sensor","boolean","","","","","Indicates if light is defect. True = Light is defect. False = Light has no defect.","","","","db70c2d885725583a7ed95b215a8ec6c" +"Vehicle.Body.Mirrors","branch","","","","","","All mirrors.","","","","a4ea618914885a239ef5fa62c671a800" +"Vehicle.Body.Mirrors.DriverSide","branch","","","","","","All mirrors.","","","","3c62705bbcf654489c8179b63118829f" +"Vehicle.Body.Mirrors.DriverSide.Tilt","actuator","int8","","percent","-100","100","Mirror tilt as a percent. 0 = Center Position. 100 = Fully Upward Position. -100 = Fully Downward Position.","","","","eafa81963c315aa78eda11eec8012d34" +"Vehicle.Body.Mirrors.DriverSide.Pan","actuator","int8","","percent","-100","100","Mirror pan as a percent. 0 = Center Position. 100 = Fully Left Position. -100 = Fully Right Position.","","","","4749ae14c526547c9b511f66a67b3d27" +"Vehicle.Body.Mirrors.DriverSide.IsHeatingOn","actuator","boolean","","","","","Mirror Heater on or off. True = Heater On. False = Heater Off.","","","","21262ce775a85abe9f6354f9c3ac9988" +"Vehicle.Body.Mirrors.DriverSide.IsLocked","actuator","boolean","","","","","Is mirror movement locked? True = Locked, mirror will not react to Tilt/Pan change. False = Unlocked.","","","","d267fc64959e59ce8335911faa87980f" +"Vehicle.Body.Mirrors.DriverSide.IsFolded","actuator","boolean","","","","","Is mirror folded? True = Fully or partially folded. False = Fully unfolded.","","","","0ade6b89326052829a49da918aacf0b7" +"Vehicle.Body.Mirrors.PassengerSide","branch","","","","","","All mirrors.","","","","8025a1e06e9d5ddb96405cce1f1f38cb" +"Vehicle.Body.Mirrors.PassengerSide.Tilt","actuator","int8","","percent","-100","100","Mirror tilt as a percent. 0 = Center Position. 100 = Fully Upward Position. -100 = Fully Downward Position.","","","","0f3734b090065873a7feb40931c72a28" +"Vehicle.Body.Mirrors.PassengerSide.Pan","actuator","int8","","percent","-100","100","Mirror pan as a percent. 0 = Center Position. 100 = Fully Left Position. -100 = Fully Right Position.","","","","d3dc2e11874f528fa0987e596993bde8" +"Vehicle.Body.Mirrors.PassengerSide.IsHeatingOn","actuator","boolean","","","","","Mirror Heater on or off. True = Heater On. False = Heater Off.","","","","9d64ad38532658298e5f59a2f999ef57" +"Vehicle.Body.Mirrors.PassengerSide.IsLocked","actuator","boolean","","","","","Is mirror movement locked? True = Locked, mirror will not react to Tilt/Pan change. False = Unlocked.","","","","b919c8699dae540a840fbd296df49aca" +"Vehicle.Body.Mirrors.PassengerSide.IsFolded","actuator","boolean","","","","","Is mirror folded? True = Fully or partially folded. False = Fully unfolded.","","","","2b0bedf76d29520d9b96469695c3e0e8" +"Vehicle.Body.RearMainSpoilerPosition","actuator","float","","percent","0","100","Rear spoiler position, 0% = Spoiler fully stowed. 100% = Spoiler fully exposed.","","","","6209a82390585b869cc3d00d069eade2" +"Vehicle.Body.PowerOptimizeLevel","actuator","uint8","","","0","10","Power optimization level for this branch/subsystem. A higher number indicates more aggressive power optimization. Level 0 indicates that all functionality is enabled, no power optimization enabled. Level 10 indicates most aggressive power optimization mode, only essential functionality enabled.","","","","2fe44a1c3bb155aca782b017efeb6175" +"Vehicle.Body.IsAutoPowerOptimize","actuator","boolean","","","","","Auto Power Optimization Flag When set to 'true', the system enables automatic power optimization, dynamically adjusting the power optimization level based on runtime conditions or features managed by the OEM. When set to 'false', manual control of the power optimization level is allowed.","","","","88dbf1bf7bbd5b94b8cc5d93113abb44" +"Vehicle.Cabin","branch","","","","","","All in-cabin components, including doors.","","","","1a94457b237f5e8eb3c77c0532ac88d7" +"Vehicle.Cabin.RearShade","branch","","","","","","Rear window shade. Open = Retracted, Closed = Deployed. Start position for RearShade is Open/Retracted.","","","","8a0c86f4fc6f5ea8ac8cf8f327969dcc" +"Vehicle.Cabin.RearShade.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","4190436709bc5b1896fad8fd5c624ff2" +"Vehicle.Cabin.RearShade.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","9e16fc53f2ec575dbf66c79f969949a9" +"Vehicle.Cabin.RearShade.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","da9f01e9baf35544842f1a7674c5172a" +"Vehicle.Cabin.HVAC","branch","","","","","","Climate control","","","","f8ff34337cdf568e91ab406a365c3249" +"Vehicle.Cabin.HVAC.Station","branch","","","","","","HVAC for single station in the vehicle","","","","253e683e6f135b83b6302a30b6c0ec8d" +"Vehicle.Cabin.HVAC.Station.Row1","branch","","","","","","HVAC for single station in the vehicle","","","","80860491fba75babaf3c439d1d471a6d" +"Vehicle.Cabin.HVAC.Station.Row1.Driver","branch","","","","","","HVAC for single station in the vehicle","","","","7480dcf1e7375c7491a4dc083a8a7d15" +"Vehicle.Cabin.HVAC.Station.Row1.Driver.FanSpeed","actuator","uint8","","percent","0","100","Fan Speed, 0 = off. 100 = max","","","","3db004f9a2ee528099499d660bfa715f" +"Vehicle.Cabin.HVAC.Station.Row1.Driver.Temperature","actuator","int8","","celsius","","","Temperature","","","","1eae45dbda85581ca794b6b4513376cd" +"Vehicle.Cabin.HVAC.Station.Row1.Driver.AirDistribution","actuator","string","","","","","Direction of airstream","","['UP', 'MIDDLE', 'DOWN']","","8b7412018a6f5c0a8467bdddb53e76f7" +"Vehicle.Cabin.HVAC.Station.Row1.Passenger","branch","","","","","","HVAC for single station in the vehicle","","","","e536a7f5f6a05ff48f26f96ef5772455" +"Vehicle.Cabin.HVAC.Station.Row1.Passenger.FanSpeed","actuator","uint8","","percent","0","100","Fan Speed, 0 = off. 100 = max","","","","2d00c3cf2f735a37b646d9a51e77ef9e" +"Vehicle.Cabin.HVAC.Station.Row1.Passenger.Temperature","actuator","int8","","celsius","","","Temperature","","","","3a7a6b5f8c4756d4bcf540ee41c781e1" +"Vehicle.Cabin.HVAC.Station.Row1.Passenger.AirDistribution","actuator","string","","","","","Direction of airstream","","['UP', 'MIDDLE', 'DOWN']","","610facc5829f5d52a40e8b1e9706866c" +"Vehicle.Cabin.HVAC.Station.Row2","branch","","","","","","HVAC for single station in the vehicle","","","","d98e8f5f94da5acfbf428c635a8bcc0c" +"Vehicle.Cabin.HVAC.Station.Row2.Driver","branch","","","","","","HVAC for single station in the vehicle","","","","d1dd7712867d51ec847afa67e6dd3c92" +"Vehicle.Cabin.HVAC.Station.Row2.Driver.FanSpeed","actuator","uint8","","percent","0","100","Fan Speed, 0 = off. 100 = max","","","","873e0193650f5f4a88bdb9777ead4df7" +"Vehicle.Cabin.HVAC.Station.Row2.Driver.Temperature","actuator","int8","","celsius","","","Temperature","","","","50d268809c555b82b275884f8c170825" +"Vehicle.Cabin.HVAC.Station.Row2.Driver.AirDistribution","actuator","string","","","","","Direction of airstream","","['UP', 'MIDDLE', 'DOWN']","","8a021c3941ee5fed99efb5b8c7e6882a" +"Vehicle.Cabin.HVAC.Station.Row2.Passenger","branch","","","","","","HVAC for single station in the vehicle","","","","ed9c94346bd8511584c4d9a8e2d49ec0" +"Vehicle.Cabin.HVAC.Station.Row2.Passenger.FanSpeed","actuator","uint8","","percent","0","100","Fan Speed, 0 = off. 100 = max","","","","a9d1c8e5a9e35e7ca924ec4871364de8" +"Vehicle.Cabin.HVAC.Station.Row2.Passenger.Temperature","actuator","int8","","celsius","","","Temperature","","","","a83b6548c3c95d288072caa1a7dc2904" +"Vehicle.Cabin.HVAC.Station.Row2.Passenger.AirDistribution","actuator","string","","","","","Direction of airstream","","['UP', 'MIDDLE', 'DOWN']","","06105fb9e69755f38a02132b4b432351" +"Vehicle.Cabin.HVAC.Station.Row3","branch","","","","","","HVAC for single station in the vehicle","","","","6eb8d63b66c859d5b36ef52d264aed2b" +"Vehicle.Cabin.HVAC.Station.Row3.Driver","branch","","","","","","HVAC for single station in the vehicle","","","","299b787af2fe56ab9721086824692e10" +"Vehicle.Cabin.HVAC.Station.Row3.Driver.FanSpeed","actuator","uint8","","percent","0","100","Fan Speed, 0 = off. 100 = max","","","","9c111ac7582752228e43bda739c0a26a" +"Vehicle.Cabin.HVAC.Station.Row3.Driver.Temperature","actuator","int8","","celsius","","","Temperature","","","","d16ac539f8035e209831c1f4c7c39c83" +"Vehicle.Cabin.HVAC.Station.Row3.Driver.AirDistribution","actuator","string","","","","","Direction of airstream","","['UP', 'MIDDLE', 'DOWN']","","ec927fbdee9e51c89ccba5c3752189cb" +"Vehicle.Cabin.HVAC.Station.Row3.Passenger","branch","","","","","","HVAC for single station in the vehicle","","","","810eed3a9836574a886923f2ddf67dfd" +"Vehicle.Cabin.HVAC.Station.Row3.Passenger.FanSpeed","actuator","uint8","","percent","0","100","Fan Speed, 0 = off. 100 = max","","","","71f5693b021f52ca888335848535db51" +"Vehicle.Cabin.HVAC.Station.Row3.Passenger.Temperature","actuator","int8","","celsius","","","Temperature","","","","1499ad96881c551886081c52d404d3e3" +"Vehicle.Cabin.HVAC.Station.Row3.Passenger.AirDistribution","actuator","string","","","","","Direction of airstream","","['UP', 'MIDDLE', 'DOWN']","","5cf67ab3c7d1500ab306c397b7dddb12" +"Vehicle.Cabin.HVAC.Station.Row4","branch","","","","","","HVAC for single station in the vehicle","","","","ff0c0fa26de7508dbe92a83bc087dff6" +"Vehicle.Cabin.HVAC.Station.Row4.Driver","branch","","","","","","HVAC for single station in the vehicle","","","","7211e138449252378f1a6ffbece35753" +"Vehicle.Cabin.HVAC.Station.Row4.Driver.FanSpeed","actuator","uint8","","percent","0","100","Fan Speed, 0 = off. 100 = max","","","","fbd6ca78cdc557078f91b3d649866ec2" +"Vehicle.Cabin.HVAC.Station.Row4.Driver.Temperature","actuator","int8","","celsius","","","Temperature","","","","9db31f66a7575255864758d62a4e0185" +"Vehicle.Cabin.HVAC.Station.Row4.Driver.AirDistribution","actuator","string","","","","","Direction of airstream","","['UP', 'MIDDLE', 'DOWN']","","984add0704f850f2bb06a748c43211fb" +"Vehicle.Cabin.HVAC.Station.Row4.Passenger","branch","","","","","","HVAC for single station in the vehicle","","","","30fac3fdc3785d7fa8eb4298da45e95b" +"Vehicle.Cabin.HVAC.Station.Row4.Passenger.FanSpeed","actuator","uint8","","percent","0","100","Fan Speed, 0 = off. 100 = max","","","","580538988d3f513c88612665621bba09" +"Vehicle.Cabin.HVAC.Station.Row4.Passenger.Temperature","actuator","int8","","celsius","","","Temperature","","","","06b974ba5325558793b8a7dccb560bde" +"Vehicle.Cabin.HVAC.Station.Row4.Passenger.AirDistribution","actuator","string","","","","","Direction of airstream","","['UP', 'MIDDLE', 'DOWN']","","2c829297b81e54cf85a04bde79f31f34" +"Vehicle.Cabin.HVAC.IsRecirculationActive","actuator","boolean","","","","","Is recirculation active.","","","","7b80c41c63b35c9299a410166cd33c81" +"Vehicle.Cabin.HVAC.IsFrontDefrosterActive","actuator","boolean","","","","","Is front defroster active.","","","","afa678c87182544bb6ab81fa6a770791" +"Vehicle.Cabin.HVAC.IsRearDefrosterActive","actuator","boolean","","","","","Is rear defroster active.","","","","d342a7939f2e5adeaeb5e68e3a314445" +"Vehicle.Cabin.HVAC.IsAirConditioningActive","actuator","boolean","","","","","Is Air conditioning active.","","","","dc4f79e4211c54a6b4eed0236aae84a6" +"Vehicle.Cabin.HVAC.AmbientAirTemperature","sensor","float","","celsius","","","Ambient air temperature inside the vehicle.","","","","611868a24bc25eb9a837208c235e9491" +"Vehicle.Cabin.HVAC.PowerOptimizeLevel","actuator","uint8","","","0","10","Power optimization level for this branch/subsystem. A higher number indicates more aggressive power optimization. Level 0 indicates that all functionality is enabled, no power optimization enabled. Level 10 indicates most aggressive power optimization mode, only essential functionality enabled.","","","","ee011a09ebc6519183177b05d7302ce8" +"Vehicle.Cabin.HVAC.IsAutoPowerOptimize","actuator","boolean","","","","","Auto Power Optimization Flag When set to 'true', the system enables automatic power optimization, dynamically adjusting the power optimization level based on runtime conditions or features managed by the OEM. When set to 'false', manual control of the power optimization level is allowed.","","","","83abc4d9c05f557d83482f2d4347eb32" +"Vehicle.Cabin.Infotainment","branch","","","","","","Infotainment system.","","","","d88f92fbdda35012a2443b5e130d5eff" +"Vehicle.Cabin.Infotainment.Media","branch","","","","","","All Media actions","","","","3f324d13873e501a84daf2cfade24d0f" +"Vehicle.Cabin.Infotainment.Media.Action","actuator","string","","","","","Tells if the media was","","['UNKNOWN', 'STOP', 'PLAY', 'FAST_FORWARD', 'FAST_BACKWARD', 'SKIP_FORWARD', 'SKIP_BACKWARD']","","0357aea525bf505981a14e4fc720094e" +"Vehicle.Cabin.Infotainment.Media.Played","branch","","","","","","Collection of signals updated in concert when a new media is played","","","","6585e9d3b6ff596da72a5f8c98d2d47a" +"Vehicle.Cabin.Infotainment.Media.Played.Source","actuator","string","","","","","Media selected for playback","","['UNKNOWN', 'SIRIUS_XM', 'AM', 'FM', 'DAB', 'TV', 'CD', 'DVD', 'AUX', 'USB', 'DISK', 'BLUETOOTH', 'INTERNET', 'VOICE', 'BEEP']","","54fb88a7d7cf5e3aab63e8f52415c187" +"Vehicle.Cabin.Infotainment.Media.Played.Artist","sensor","string","","","","","Name of artist being played","","","","076af7ad8aff5110ab5a64d1f58ccdcb" +"Vehicle.Cabin.Infotainment.Media.Played.Album","sensor","string","","","","","Name of album being played","","","","1d80b1e2c1085def92b3548b5db2786e" +"Vehicle.Cabin.Infotainment.Media.Played.Track","sensor","string","","","","","Name of track being played","","","","ee800d62a40351e6934649ca75927d69" +"Vehicle.Cabin.Infotainment.Media.Played.URI","sensor","string","","","","","User Resource associated with the media","","","","1ed22b9925c3502d8d1389c8e02d0f07" +"Vehicle.Cabin.Infotainment.Media.Played.PlaybackRate","actuator","float","","","","","Current playback rate of media being played.","The normal playback rate is multiplied by this value to obtain the current rate, so a value of 1.0 indicates normal speed. Values of lower than 1.0 make the media play slower than normal. Values of higher than 1.0 make the media play faster than normal.","","","f5e58f66f21f560fbd0124ab5b17460e" +"Vehicle.Cabin.Infotainment.Media.DeclinedURI","sensor","string","","","","","URI of suggested media that was declined","","","","51b0d6227db55b92bc35eedd8277f4c4" +"Vehicle.Cabin.Infotainment.Media.SelectedURI","actuator","string","","","","","URI of suggested media that was selected","","","","4820f7a961c25e91af12d3417a145d32" +"Vehicle.Cabin.Infotainment.Media.Volume","actuator","uint8","","percent","0","100","Current Media Volume","","","","8b344688816f5844ae5812bb136c8006" +"Vehicle.Cabin.Infotainment.Navigation","branch","","","","","","All navigation actions","","","","79bb0cc4acae5d1eb34fb214352d7863" +"Vehicle.Cabin.Infotainment.Navigation.DestinationSet","branch","","","","","","A navigation has been selected.","","","","f51ce253dc5b58168ecca99297139455" +"Vehicle.Cabin.Infotainment.Navigation.DestinationSet.Latitude","actuator","double","","degrees","-90","90","Latitude of destination in WGS 84 geodetic coordinates.","","","","3e33f3252934565d86de5409c761262b" +"Vehicle.Cabin.Infotainment.Navigation.DestinationSet.Longitude","actuator","double","","degrees","-180","180","Longitude of destination in WGS 84 geodetic coordinates.","","","","e9bd511146ca51639c8d42c0702e22ee" +"Vehicle.Cabin.Infotainment.Navigation.Mute","actuator","string","","","","","Navigation mute state that was selected.","","['MUTED', 'ALERT_ONLY', 'UNMUTED']","","d7ab68ec65aa5bafa95f042a60c91639" +"Vehicle.Cabin.Infotainment.Navigation.Volume","actuator","uint8","","percent","0","100","Current navigation volume","","","","3609ff09d29d54d596068f978cbc0777" +"Vehicle.Cabin.Infotainment.Navigation.GuidanceVoice","actuator","string","","","","","Navigation guidance state that was selected.","ETC indicates a voice alternative not covered by the explicitly listed alternatives.","['STANDARD_MALE', 'STANDARD_FEMALE', 'ETC']","","f5404f515db05e518d7b74460cf83eee" +"Vehicle.Cabin.Infotainment.Navigation.Map","branch","","","","","","All map actions","","","","4df6f1ab5f6c51d6b9c7af2b13daa2bc" +"Vehicle.Cabin.Infotainment.Navigation.Map.IsAutoScaleModeUsed","actuator","boolean","","","","","Used to select auto-scaling mode. This feature dynamically adjusts the zoom level of the map to provide an optimal view based on the current speed of the vehicle","If true, then auto-scaling mode is used. If false, then manual-scaling mode is used.","","","86cb8301b6205fa98a737cb02d3d5ce9" +"Vehicle.Cabin.Infotainment.HMI","branch","","","","","","HMI related signals","","","","271e3d9202825f37bd054820e5ea8141" +"Vehicle.Cabin.Infotainment.HMI.CurrentLanguage","sensor","string","","","","","ISO 639-1 standard language code for the current HMI","","","","dc29ee5b7f7154b4ab05a9771fe930b3" +"Vehicle.Cabin.Infotainment.HMI.FontSize","actuator","string","","","","","Font size used in the current HMI","","['STANDARD', 'LARGE', 'EXTRA_LARGE']","","630bf4a73340503799e8d86889ffd863" +"Vehicle.Cabin.Infotainment.HMI.DateFormat","actuator","string","","","","","Date format used in the current HMI","","['YYYY_MM_DD', 'DD_MM_YYYY', 'MM_DD_YYYY', 'YY_MM_DD', 'DD_MM_YY', 'MM_DD_YY']","","0f03c3955fe953e9893a1f52e964919e" +"Vehicle.Cabin.Infotainment.HMI.TimeFormat","actuator","string","","","","","Time format used in the current HMI","","['HR_12', 'HR_24']","","73083b87a4e25c02aee672ea32e40005" +"Vehicle.Cabin.Infotainment.HMI.DistanceUnit","actuator","string","","","","","Distance unit used in the current HMI","","['MILES', 'KILOMETERS']","","4b40e8bdb1a053ee9ee35338d8804e7b" +"Vehicle.Cabin.Infotainment.HMI.FuelVolumeUnit","actuator","string","","","","","Fuel volume unit used in the current HMI","","['LITER', 'GALLON_US', 'GALLON_UK']","","aef80d0bd01d593082e41abf072dab9b" +"Vehicle.Cabin.Infotainment.HMI.FuelEconomyUnits","actuator","string","","","","","Fuel economy unit used in the current HMI","","['MPG_UK', 'MPG_US', 'MILES_PER_LITER', 'KILOMETERS_PER_LITER', 'LITERS_PER_100_KILOMETERS']","","0e6a43ce1aa45243b753545ffa1f0f8c" +"Vehicle.Cabin.Infotainment.HMI.EVEconomyUnits","actuator","string","","","","","EV fuel economy unit used in the current HMI","","['MILES_PER_KILOWATT_HOUR', 'KILOMETERS_PER_KILOWATT_HOUR', 'KILOWATT_HOURS_PER_100_MILES', 'KILOWATT_HOURS_PER_100_KILOMETERS', 'WATT_HOURS_PER_MILE', 'WATT_HOURS_PER_KILOMETER']","","914846f6804757ba81ca6bcfac8d2c48" +"Vehicle.Cabin.Infotainment.HMI.TemperatureUnit","actuator","string","","","","","Temperature unit used in the current HMI","","['C', 'F']","","a7d1533490bb52b6b4f650280e72543d" +"Vehicle.Cabin.Infotainment.HMI.TirePressureUnit","actuator","string","","","","","Tire pressure unit used in the current HMI","","['PSI', 'KPA', 'BAR']","","e5ffaf58cc10523fa0858deafb61a8ce" +"Vehicle.Cabin.Infotainment.HMI.SpeedUnit","actuator","string","","","","","Speed unit used in the current HMI","","['METERS_PER_SECOND', 'MILES_PER_HOUR', 'KILOMETERS_PER_HOUR']","","9bb9811aaa1c5ce79e0c19f5ba6049bb" +"Vehicle.Cabin.Infotainment.HMI.EVEnergyUnits","actuator","string","","","","","EV energy unit used in the current HMI","Ampere hours is by definition not an energy unit, but can be used as a measurement of energy if the voltage, like nominal voltage of the battery, is known.","['WATT_HOURS', 'AMPERE_HOURS', 'KILOWATT_HOURS']","","cf09b365499859c5a916d7fc1ea2d3ba" +"Vehicle.Cabin.Infotainment.HMI.Brightness","actuator","float","","percent","0","100","Brightness of the HMI, relative to supported range. 0 = Lowest brightness possible. 100 = Maximum Brightness possible.","The value 0 does not necessarily correspond to a turned off HMI, as it may not be allowed/supported to turn off the HMI completely.","","","44147980dabd56b883ae4d2491383a17" +"Vehicle.Cabin.Infotainment.HMI.DayNightMode","actuator","string","","","","","Current display theme","","['DAY', 'NIGHT']","","a892039ba136588fa26b2670f839c0cc" +"Vehicle.Cabin.Infotainment.HMI.IsScreenAlwaysOn","actuator","boolean","","","","","Used to prevent the screen going black if no action placed.","","","","f6f2bffbad7e5e9098b351bf99b71624" +"Vehicle.Cabin.Infotainment.HMI.LastActionTime","sensor","string","","iso8601","","","Time for last hmi action, formatted according to ISO 8601 with UTC time zone.","","","","19b4f7e950bc526f8c263b4cc5954960" +"Vehicle.Cabin.Infotainment.HMI.DisplayOffDuration","actuator","uint16","","s","","","Duration in seconds before the display is turned off. Value shall be 0 if screen never shall turn off.","Display shall be turned off at HMI.LastActionTime + HMI.DisplayOffDuration, unless HMI.IsScreenAlwaysOn==True.","","","130114ebf81f59718cf257e198b90e01" +"Vehicle.Cabin.Infotainment.SmartphoneProjection","branch","","","","","","All smartphone projection actions.","","","","fd47f73b4d6b51679f4bed75f6d63518" +"Vehicle.Cabin.Infotainment.SmartphoneProjection.Active","actuator","string","","","","","Projection activation info.","NONE indicates that projection is not supported.","['NONE', 'ACTIVE', 'INACTIVE']","","7156b00b47a8513c8e86f50f7d152614" +"Vehicle.Cabin.Infotainment.SmartphoneProjection.Source","actuator","string","","","","","Connectivity source selected for projection.","","['USB', 'BLUETOOTH', 'WIFI']","","1c2d1f379f5752ac802456a992b88156" +"Vehicle.Cabin.Infotainment.SmartphoneProjection.SupportedMode","attribute","string[]","","","","","Supportable list for projection.","","['ANDROID_AUTO', 'APPLE_CARPLAY', 'MIRROR_LINK', 'OTHER']","","80fa132703655d989386bc6711afed49" +"Vehicle.Cabin.Infotainment.PowerOptimizeLevel","actuator","uint8","","","0","10","Power optimization level for this branch/subsystem. A higher number indicates more aggressive power optimization. Level 0 indicates that all functionality is enabled, no power optimization enabled. Level 10 indicates most aggressive power optimization mode, only essential functionality enabled.","","","","7be907e3d9fd5c46a516f7cd07f050a3" +"Vehicle.Cabin.Infotainment.IsAutoPowerOptimize","actuator","boolean","","","","","Auto Power Optimization Flag When set to 'true', the system enables automatic power optimization, dynamically adjusting the power optimization level based on runtime conditions or features managed by the OEM. When set to 'false', manual control of the power optimization level is allowed.","","","","e4b9efd3fc8d588cb7220058e0406868" +"Vehicle.Cabin.Sunroof","branch","","","","","","Sun roof status.","","","","8ff70db05c065e3eb530082a0b6983cf" +"Vehicle.Cabin.Sunroof.Position","sensor","int8","","percent","-100","100","Sunroof position. 0 = Fully closed 100 = Fully opened. -100 = Fully tilted.","","","","ab598697f1c852eda4df9ed62a956d17" +"Vehicle.Cabin.Sunroof.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or shade.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN', 'TILT_UP', 'TILT_DOWN']","","88c39afd45a25ea2b474ff581e1fb138" +"Vehicle.Cabin.Sunroof.Shade","branch","","","","","","Sun roof shade status. Open = Retracted, Closed = Deployed. Start position for Sunroof.Shade is Open/Retracted.","","","","eeaae5977adb5683b16f405993405b2e" +"Vehicle.Cabin.Sunroof.Shade.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","f6c7020849fe5431b648a8a283d9751b" +"Vehicle.Cabin.Sunroof.Shade.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","5f78c2a631b75abc88744f9bad277f5a" +"Vehicle.Cabin.Sunroof.Shade.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","3836077128c65381b01e74a1a8be1c40" +"Vehicle.Cabin.RearviewMirror","branch","","","","","","Rear-view mirror.","","","","e655b654ab9f55bbb04952a99755efae" +"Vehicle.Cabin.RearviewMirror.DimmingLevel","actuator","uint8","","percent","","100","Dimming level of rear-view mirror. 0 = Undimmed. 100 = Fully dimmed.","","","","4e2bcbaa6dc1586d8282324b475e5dee" +"Vehicle.Cabin.Light","branch","","","","","","Light that is part of the Cabin.","V4.0 branch renamed from ""Lights"" to ""Light"" to comply with singular naming of entities. Use SingleConfigurableLight.vspec to describe interior lights that can be configured.","","","2fc2ad48d5315cc4aa1e4638a6985585" +"Vehicle.Cabin.Light.IsGloveBoxOn","actuator","boolean","","","","","Is glove box light on","","","","9b4db6bf8cc95c7a855442b95e1e0e18" +"Vehicle.Cabin.Light.IsDomeOn","actuator","boolean","","","","","Is central dome light on","","","","0dcbdddcc3bb59d292bd7a0cf3747c83" +"Vehicle.Cabin.Light.PerceivedAmbientLight","sensor","uint8","","percent","0","100","The percentage of ambient light that is measured (e.g., by a sensor) inside the cabin. 0 = No ambient light. 100 = Full brightness.","V4.0 named changed from ""AmbientLight"" to ""PerceivedAmbientLight"". This is a read-only property that refers to the pre-existing light (e.g., natural light). If you are looking for the in-cabin decorative lights that sometimes are also called ""AmbientLights"", please refer to the branch Vehicle.Cabin.Light.AmbientLight.","","","4d605e0e591a510d9613bdb412175729" +"Vehicle.Cabin.Light.Spotlight","branch","","","","","","Spotlight for a specific area in the vehicle.","","","","a03cd35849a05136ac8e16f4e96d866b" +"Vehicle.Cabin.Light.Spotlight.Row1","branch","","","","","","Spotlight for a specific area in the vehicle.","","","","35f4c5574dbb5c5bafe82107b55377ec" +"Vehicle.Cabin.Light.Spotlight.Row1.DriverSide","branch","","","","","","Spotlight for a specific area in the vehicle.","","","","39ac4414f40754e2ab28a6bb10b397bb" +"Vehicle.Cabin.Light.Spotlight.Row1.DriverSide.IsLightOn","actuator","boolean","","","","","Indicates whether the light is turned on. True = On, False = Off.","","","","dff99845cbdf54239f1cc36834434a91" +"Vehicle.Cabin.Light.Spotlight.Row1.DriverSide.Intensity","actuator","uint8","","percent","1","100","How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).","Minimum value cannot be zero as on/off is controlled by the actuator IsLightOn. V4.0 moved from Cabin.Lights.AmbientLight.Intensity to enable individual control of lights via the SingleConfigurableLight.vspec.","","","497ba6de557452829f1c3bbcad2c1386" +"Vehicle.Cabin.Light.Spotlight.Row1.DriverSide.Color","actuator","string","","","","","Hexadecimal color code represented as a 3-byte RGB (i.e. Red, Green, and Blue) value preceded by a hash symbol ""#"". Allowed range ""#000000"" to ""#FFFFFF"".","For example; ""#C0C0C0"" = Silver, ""#FFD700"" = Gold, ""#000000"" = Black, ""#FFFFFF"" = White, etc.","","","838b3bc619d153d993ddfad96918ad7e" +"Vehicle.Cabin.Light.Spotlight.Row1.PassengerSide","branch","","","","","","Spotlight for a specific area in the vehicle.","","","","669fe375bd1151b497eab93492e41597" +"Vehicle.Cabin.Light.Spotlight.Row1.PassengerSide.IsLightOn","actuator","boolean","","","","","Indicates whether the light is turned on. True = On, False = Off.","","","","834df09382ee509b898b2ff2652a3ea2" +"Vehicle.Cabin.Light.Spotlight.Row1.PassengerSide.Intensity","actuator","uint8","","percent","1","100","How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).","Minimum value cannot be zero as on/off is controlled by the actuator IsLightOn. V4.0 moved from Cabin.Lights.AmbientLight.Intensity to enable individual control of lights via the SingleConfigurableLight.vspec.","","","a2d72853978f54379cd66a2c82cd63fa" +"Vehicle.Cabin.Light.Spotlight.Row1.PassengerSide.Color","actuator","string","","","","","Hexadecimal color code represented as a 3-byte RGB (i.e. Red, Green, and Blue) value preceded by a hash symbol ""#"". Allowed range ""#000000"" to ""#FFFFFF"".","For example; ""#C0C0C0"" = Silver, ""#FFD700"" = Gold, ""#000000"" = Black, ""#FFFFFF"" = White, etc.","","","7643021f0af15edeba9e35f7e87a7bd5" +"Vehicle.Cabin.Light.Spotlight.Row2","branch","","","","","","Spotlight for a specific area in the vehicle.","","","","259f6228620a532abbac5548c72b3c35" +"Vehicle.Cabin.Light.Spotlight.Row2.DriverSide","branch","","","","","","Spotlight for a specific area in the vehicle.","","","","92fe0ca17e39548d8681a0fdd4f2a035" +"Vehicle.Cabin.Light.Spotlight.Row2.DriverSide.IsLightOn","actuator","boolean","","","","","Indicates whether the light is turned on. True = On, False = Off.","","","","d7cdb8c7fe305b99a482ac7f8025519b" +"Vehicle.Cabin.Light.Spotlight.Row2.DriverSide.Intensity","actuator","uint8","","percent","1","100","How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).","Minimum value cannot be zero as on/off is controlled by the actuator IsLightOn. V4.0 moved from Cabin.Lights.AmbientLight.Intensity to enable individual control of lights via the SingleConfigurableLight.vspec.","","","054dfd5255675357b090663df26c6370" +"Vehicle.Cabin.Light.Spotlight.Row2.DriverSide.Color","actuator","string","","","","","Hexadecimal color code represented as a 3-byte RGB (i.e. Red, Green, and Blue) value preceded by a hash symbol ""#"". Allowed range ""#000000"" to ""#FFFFFF"".","For example; ""#C0C0C0"" = Silver, ""#FFD700"" = Gold, ""#000000"" = Black, ""#FFFFFF"" = White, etc.","","","fddcfd397c63530b8b7e6f3c5fd98b20" +"Vehicle.Cabin.Light.Spotlight.Row2.PassengerSide","branch","","","","","","Spotlight for a specific area in the vehicle.","","","","1e9617c06a0b53eca745dcf96f8d5d70" +"Vehicle.Cabin.Light.Spotlight.Row2.PassengerSide.IsLightOn","actuator","boolean","","","","","Indicates whether the light is turned on. True = On, False = Off.","","","","ded8281b9520524ead6bc1a5c3cccd5d" +"Vehicle.Cabin.Light.Spotlight.Row2.PassengerSide.Intensity","actuator","uint8","","percent","1","100","How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).","Minimum value cannot be zero as on/off is controlled by the actuator IsLightOn. V4.0 moved from Cabin.Lights.AmbientLight.Intensity to enable individual control of lights via the SingleConfigurableLight.vspec.","","","b5e5c87ee11c5f84a7d92dc7871f3241" +"Vehicle.Cabin.Light.Spotlight.Row2.PassengerSide.Color","actuator","string","","","","","Hexadecimal color code represented as a 3-byte RGB (i.e. Red, Green, and Blue) value preceded by a hash symbol ""#"". Allowed range ""#000000"" to ""#FFFFFF"".","For example; ""#C0C0C0"" = Silver, ""#FFD700"" = Gold, ""#000000"" = Black, ""#FFFFFF"" = White, etc.","","","bdc48b556b565f0e9fd4e68b814ee934" +"Vehicle.Cabin.Light.Spotlight.Row3","branch","","","","","","Spotlight for a specific area in the vehicle.","","","","7b6666a198e8514582f8c85525dccceb" +"Vehicle.Cabin.Light.Spotlight.Row3.DriverSide","branch","","","","","","Spotlight for a specific area in the vehicle.","","","","36bd0e114ba652b0919db771e3a0d946" +"Vehicle.Cabin.Light.Spotlight.Row3.DriverSide.IsLightOn","actuator","boolean","","","","","Indicates whether the light is turned on. True = On, False = Off.","","","","fa58686f4c925907a17f40aded066a01" +"Vehicle.Cabin.Light.Spotlight.Row3.DriverSide.Intensity","actuator","uint8","","percent","1","100","How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).","Minimum value cannot be zero as on/off is controlled by the actuator IsLightOn. V4.0 moved from Cabin.Lights.AmbientLight.Intensity to enable individual control of lights via the SingleConfigurableLight.vspec.","","","50376cb5f02750d599f3ae5932520952" +"Vehicle.Cabin.Light.Spotlight.Row3.DriverSide.Color","actuator","string","","","","","Hexadecimal color code represented as a 3-byte RGB (i.e. Red, Green, and Blue) value preceded by a hash symbol ""#"". Allowed range ""#000000"" to ""#FFFFFF"".","For example; ""#C0C0C0"" = Silver, ""#FFD700"" = Gold, ""#000000"" = Black, ""#FFFFFF"" = White, etc.","","","5394e601144f5d75ae66a1566d182c68" +"Vehicle.Cabin.Light.Spotlight.Row3.PassengerSide","branch","","","","","","Spotlight for a specific area in the vehicle.","","","","69b6df651e9b5154b46c5709ce167fb6" +"Vehicle.Cabin.Light.Spotlight.Row3.PassengerSide.IsLightOn","actuator","boolean","","","","","Indicates whether the light is turned on. True = On, False = Off.","","","","68eacf65617c56489f0c1f475576eaaa" +"Vehicle.Cabin.Light.Spotlight.Row3.PassengerSide.Intensity","actuator","uint8","","percent","1","100","How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).","Minimum value cannot be zero as on/off is controlled by the actuator IsLightOn. V4.0 moved from Cabin.Lights.AmbientLight.Intensity to enable individual control of lights via the SingleConfigurableLight.vspec.","","","b8e1a7326abe538199f595555c4c0ca0" +"Vehicle.Cabin.Light.Spotlight.Row3.PassengerSide.Color","actuator","string","","","","","Hexadecimal color code represented as a 3-byte RGB (i.e. Red, Green, and Blue) value preceded by a hash symbol ""#"". Allowed range ""#000000"" to ""#FFFFFF"".","For example; ""#C0C0C0"" = Silver, ""#FFD700"" = Gold, ""#000000"" = Black, ""#FFFFFF"" = White, etc.","","","b50787e8b3bf56ebb3e007ee21aa1f30" +"Vehicle.Cabin.Light.Spotlight.Row4","branch","","","","","","Spotlight for a specific area in the vehicle.","","","","41b0adb2cba85665824d3ad497b593a8" +"Vehicle.Cabin.Light.Spotlight.Row4.DriverSide","branch","","","","","","Spotlight for a specific area in the vehicle.","","","","661dcc2f512159329fc272128a054b0b" +"Vehicle.Cabin.Light.Spotlight.Row4.DriverSide.IsLightOn","actuator","boolean","","","","","Indicates whether the light is turned on. True = On, False = Off.","","","","ca9e9652c52757ce98744209c0d2344f" +"Vehicle.Cabin.Light.Spotlight.Row4.DriverSide.Intensity","actuator","uint8","","percent","1","100","How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).","Minimum value cannot be zero as on/off is controlled by the actuator IsLightOn. V4.0 moved from Cabin.Lights.AmbientLight.Intensity to enable individual control of lights via the SingleConfigurableLight.vspec.","","","5459910482cb507db1583252b26e62c7" +"Vehicle.Cabin.Light.Spotlight.Row4.DriverSide.Color","actuator","string","","","","","Hexadecimal color code represented as a 3-byte RGB (i.e. Red, Green, and Blue) value preceded by a hash symbol ""#"". Allowed range ""#000000"" to ""#FFFFFF"".","For example; ""#C0C0C0"" = Silver, ""#FFD700"" = Gold, ""#000000"" = Black, ""#FFFFFF"" = White, etc.","","","6cc3fc21887c593a90d799209dcc40c0" +"Vehicle.Cabin.Light.Spotlight.Row4.PassengerSide","branch","","","","","","Spotlight for a specific area in the vehicle.","","","","fbffb10dc86a523bb40f624c1ad385e7" +"Vehicle.Cabin.Light.Spotlight.Row4.PassengerSide.IsLightOn","actuator","boolean","","","","","Indicates whether the light is turned on. True = On, False = Off.","","","","c35925e7af4d5a929b153cb7f587ca5b" +"Vehicle.Cabin.Light.Spotlight.Row4.PassengerSide.Intensity","actuator","uint8","","percent","1","100","How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).","Minimum value cannot be zero as on/off is controlled by the actuator IsLightOn. V4.0 moved from Cabin.Lights.AmbientLight.Intensity to enable individual control of lights via the SingleConfigurableLight.vspec.","","","8be53f681198503bb8f93d331e2315cd" +"Vehicle.Cabin.Light.Spotlight.Row4.PassengerSide.Color","actuator","string","","","","","Hexadecimal color code represented as a 3-byte RGB (i.e. Red, Green, and Blue) value preceded by a hash symbol ""#"". Allowed range ""#000000"" to ""#FFFFFF"".","For example; ""#C0C0C0"" = Silver, ""#FFD700"" = Gold, ""#000000"" = Black, ""#FFFFFF"" = White, etc.","","","fde4be32cd6f5fcf8997b01564eaadaf" +"Vehicle.Cabin.Light.AmbientLight","branch","","","","","","Decorative coloured light inside the cabin, usually mounted on the door, ceiling, etc.","","","","c3983df208565cb78c8af970a57351fd" +"Vehicle.Cabin.Light.AmbientLight.Row1","branch","","","","","","Decorative coloured light inside the cabin, usually mounted on the door, ceiling, etc.","","","","b3447dca710f51e39ed1af3d240f8851" +"Vehicle.Cabin.Light.AmbientLight.Row1.DriverSide","branch","","","","","","Decorative coloured light inside the cabin, usually mounted on the door, ceiling, etc.","","","","e42bfc0abac857f0a40f579cc0ced424" +"Vehicle.Cabin.Light.AmbientLight.Row1.DriverSide.IsLightOn","actuator","boolean","","","","","Indicates whether the light is turned on. True = On, False = Off.","","","","3b6d9d8d6acb55bc81022522cf2499a3" +"Vehicle.Cabin.Light.AmbientLight.Row1.DriverSide.Intensity","actuator","uint8","","percent","1","100","How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).","Minimum value cannot be zero as on/off is controlled by the actuator IsLightOn. V4.0 moved from Cabin.Lights.AmbientLight.Intensity to enable individual control of lights via the SingleConfigurableLight.vspec.","","","a9ddbecc501e5ad4b95b7197cd4d6edf" +"Vehicle.Cabin.Light.AmbientLight.Row1.DriverSide.Color","actuator","string","","","","","Hexadecimal color code represented as a 3-byte RGB (i.e. Red, Green, and Blue) value preceded by a hash symbol ""#"". Allowed range ""#000000"" to ""#FFFFFF"".","For example; ""#C0C0C0"" = Silver, ""#FFD700"" = Gold, ""#000000"" = Black, ""#FFFFFF"" = White, etc.","","","c5717a5df33359959d1df3ae75dd687e" +"Vehicle.Cabin.Light.AmbientLight.Row1.PassengerSide","branch","","","","","","Decorative coloured light inside the cabin, usually mounted on the door, ceiling, etc.","","","","05a04fb5fb025049b9e9fbb109fef22a" +"Vehicle.Cabin.Light.AmbientLight.Row1.PassengerSide.IsLightOn","actuator","boolean","","","","","Indicates whether the light is turned on. True = On, False = Off.","","","","a52466424a9550868a5f6a1aa83f3dce" +"Vehicle.Cabin.Light.AmbientLight.Row1.PassengerSide.Intensity","actuator","uint8","","percent","1","100","How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).","Minimum value cannot be zero as on/off is controlled by the actuator IsLightOn. V4.0 moved from Cabin.Lights.AmbientLight.Intensity to enable individual control of lights via the SingleConfigurableLight.vspec.","","","9d9096fdd737597b8423214633a97063" +"Vehicle.Cabin.Light.AmbientLight.Row1.PassengerSide.Color","actuator","string","","","","","Hexadecimal color code represented as a 3-byte RGB (i.e. Red, Green, and Blue) value preceded by a hash symbol ""#"". Allowed range ""#000000"" to ""#FFFFFF"".","For example; ""#C0C0C0"" = Silver, ""#FFD700"" = Gold, ""#000000"" = Black, ""#FFFFFF"" = White, etc.","","","a58681f838a75596b6b64623803479cc" +"Vehicle.Cabin.Light.AmbientLight.Row2","branch","","","","","","Decorative coloured light inside the cabin, usually mounted on the door, ceiling, etc.","","","","f4462f76907e529fbcc7cc6761ca5cbe" +"Vehicle.Cabin.Light.AmbientLight.Row2.DriverSide","branch","","","","","","Decorative coloured light inside the cabin, usually mounted on the door, ceiling, etc.","","","","ddf477f1910e595f8c8055508cbdd808" +"Vehicle.Cabin.Light.AmbientLight.Row2.DriverSide.IsLightOn","actuator","boolean","","","","","Indicates whether the light is turned on. True = On, False = Off.","","","","c95376e9f63f5ae996907ab83fa40a0b" +"Vehicle.Cabin.Light.AmbientLight.Row2.DriverSide.Intensity","actuator","uint8","","percent","1","100","How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).","Minimum value cannot be zero as on/off is controlled by the actuator IsLightOn. V4.0 moved from Cabin.Lights.AmbientLight.Intensity to enable individual control of lights via the SingleConfigurableLight.vspec.","","","93c3bf189e045a52b2134aa20cfcf2b2" +"Vehicle.Cabin.Light.AmbientLight.Row2.DriverSide.Color","actuator","string","","","","","Hexadecimal color code represented as a 3-byte RGB (i.e. Red, Green, and Blue) value preceded by a hash symbol ""#"". Allowed range ""#000000"" to ""#FFFFFF"".","For example; ""#C0C0C0"" = Silver, ""#FFD700"" = Gold, ""#000000"" = Black, ""#FFFFFF"" = White, etc.","","","8eb7ad17cb3f546c96fb8f76a7ac09f6" +"Vehicle.Cabin.Light.AmbientLight.Row2.PassengerSide","branch","","","","","","Decorative coloured light inside the cabin, usually mounted on the door, ceiling, etc.","","","","b9a621db27d75d56b377890d98222d53" +"Vehicle.Cabin.Light.AmbientLight.Row2.PassengerSide.IsLightOn","actuator","boolean","","","","","Indicates whether the light is turned on. True = On, False = Off.","","","","e61968ff0fb15adf891efadc9181f78c" +"Vehicle.Cabin.Light.AmbientLight.Row2.PassengerSide.Intensity","actuator","uint8","","percent","1","100","How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).","Minimum value cannot be zero as on/off is controlled by the actuator IsLightOn. V4.0 moved from Cabin.Lights.AmbientLight.Intensity to enable individual control of lights via the SingleConfigurableLight.vspec.","","","1e9bcef987795ad3a38bc76de810df19" +"Vehicle.Cabin.Light.AmbientLight.Row2.PassengerSide.Color","actuator","string","","","","","Hexadecimal color code represented as a 3-byte RGB (i.e. Red, Green, and Blue) value preceded by a hash symbol ""#"". Allowed range ""#000000"" to ""#FFFFFF"".","For example; ""#C0C0C0"" = Silver, ""#FFD700"" = Gold, ""#000000"" = Black, ""#FFFFFF"" = White, etc.","","","6ed1d61f74155275bde970d8233f0f51" +"Vehicle.Cabin.Light.InteractiveLightBar","branch","","","","","","Decorative coloured light bar that supports effects, usually mounted on the dashboard (e.g. BMW i7 Interactive bar).","","","","de6062a1a9c05ff687128f748307e331" +"Vehicle.Cabin.Light.InteractiveLightBar.IsLightOn","actuator","boolean","","","","","Indicates whether the light is turned on. True = On, False = Off.","","","","7c858ba899585fd6bb65a981db056fd7" +"Vehicle.Cabin.Light.InteractiveLightBar.Intensity","actuator","uint8","","percent","1","100","How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).","Minimum value cannot be zero as on/off is controlled by the actuator IsLightOn. V4.0 moved from Cabin.Lights.AmbientLight.Intensity to enable individual control of lights via the SingleConfigurableLight.vspec.","","","9c73159ff0db5341af2bd3aaffc183c5" +"Vehicle.Cabin.Light.InteractiveLightBar.Color","actuator","string","","","","","Hexadecimal color code represented as a 3-byte RGB (i.e. Red, Green, and Blue) value preceded by a hash symbol ""#"". Allowed range ""#000000"" to ""#FFFFFF"".","For example; ""#C0C0C0"" = Silver, ""#FFD700"" = Gold, ""#000000"" = Black, ""#FFFFFF"" = White, etc.","","","099955ec87a0528ba1a89cc3e439c806" +"Vehicle.Cabin.Light.InteractiveLightBar.Effect","actuator","string","","","","","Light effect selection from a predefined set of allowed values.","Default and allowed values are OEM-specific and should be defined accordingly (e.g. with the use of overlays).","","","c0167026c1575ec8a2de0901a71d0d8d" +"Vehicle.Cabin.Door","branch","","","","","","All doors, including windows and switches.","","","","fd7f4d16f8965419a9a69fd66b40c1d7" +"Vehicle.Cabin.Door.Row1","branch","","","","","","All doors, including windows and switches.","","","","fd3fcb481cb953dc9a853125c6ca0453" +"Vehicle.Cabin.Door.Row1.DriverSide","branch","","","","","","All doors, including windows and switches.","","","","0fe04659010a505a9816a3a9457b3540" +"Vehicle.Cabin.Door.Row1.DriverSide.IsLocked","actuator","boolean","","","","","Is item locked or unlocked. True = Locked. False = Unlocked.","","","","9080712219dc57eaacf85d6630e01ca0" +"Vehicle.Cabin.Door.Row1.DriverSide.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","da3dccb4ab085fcabca24efd99435d87" +"Vehicle.Cabin.Door.Row1.DriverSide.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","6ef9c60445f9577e83ffff4ea6d863b9" +"Vehicle.Cabin.Door.Row1.DriverSide.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","1b93676e79ea5a9095327bde69927a21" +"Vehicle.Cabin.Door.Row1.DriverSide.Window","branch","","","","","","Door window status. Start position for Window is Closed.","","","","6ab9b77468d45cdfadebe124256aa910" +"Vehicle.Cabin.Door.Row1.DriverSide.Window.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","ff58aae512475431bec02b5c4a36b6f9" +"Vehicle.Cabin.Door.Row1.DriverSide.Window.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","83da2e0448465874bf2bff9aeff91793" +"Vehicle.Cabin.Door.Row1.DriverSide.Window.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","5d3f802110a95653b4518b8f21836113" +"Vehicle.Cabin.Door.Row1.DriverSide.IsChildLockActive","sensor","boolean","","","","","Is door child lock active. True = Door cannot be opened from inside. False = Door can be opened from inside.","","","","62a265895be0566694358eecab381a4c" +"Vehicle.Cabin.Door.Row1.DriverSide.Shade","branch","","","","","","Side window shade. Open = Retracted, Closed = Deployed. Start position for Shade is Open/Retracted.","","","","7220d013b9205e1b9e7ca6b95cb14058" +"Vehicle.Cabin.Door.Row1.DriverSide.Shade.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","112a180977c956aab6c5422cb6cc46e7" +"Vehicle.Cabin.Door.Row1.DriverSide.Shade.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","7ec218dfc5855bfa88af947d7b06b1f4" +"Vehicle.Cabin.Door.Row1.DriverSide.Shade.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","fea7f9577a8456128c548daf3c548ea4" +"Vehicle.Cabin.Door.Row1.PassengerSide","branch","","","","","","All doors, including windows and switches.","","","","9ea0425fb2085ded9a393d4e999ae90a" +"Vehicle.Cabin.Door.Row1.PassengerSide.IsLocked","actuator","boolean","","","","","Is item locked or unlocked. True = Locked. False = Unlocked.","","","","48d4388ec67b519ab500ee424ce4b6cb" +"Vehicle.Cabin.Door.Row1.PassengerSide.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","80aca3884840557db10f1314a27a5eeb" +"Vehicle.Cabin.Door.Row1.PassengerSide.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","7002316cdf9852afb027abc03309b15d" +"Vehicle.Cabin.Door.Row1.PassengerSide.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","c1244ebb7ef35c2a9e0f6ebf47710536" +"Vehicle.Cabin.Door.Row1.PassengerSide.Window","branch","","","","","","Door window status. Start position for Window is Closed.","","","","c588ac43d3945dc0a45994c4d298d9b0" +"Vehicle.Cabin.Door.Row1.PassengerSide.Window.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","120e3b950fd657fabd90069e6e01f44e" +"Vehicle.Cabin.Door.Row1.PassengerSide.Window.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","ec293d2eb9e052e88d01927c811711ef" +"Vehicle.Cabin.Door.Row1.PassengerSide.Window.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","36efa23a161a5fe1b65e36f5656738fb" +"Vehicle.Cabin.Door.Row1.PassengerSide.IsChildLockActive","sensor","boolean","","","","","Is door child lock active. True = Door cannot be opened from inside. False = Door can be opened from inside.","","","","74a842786a73553ba3491975c2077ac7" +"Vehicle.Cabin.Door.Row1.PassengerSide.Shade","branch","","","","","","Side window shade. Open = Retracted, Closed = Deployed. Start position for Shade is Open/Retracted.","","","","dfe64259f26a54bda64b9aa24362c7eb" +"Vehicle.Cabin.Door.Row1.PassengerSide.Shade.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","46bec5f9c4ef594fb41836d413e79400" +"Vehicle.Cabin.Door.Row1.PassengerSide.Shade.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","8f583d09021e51319aa6bdd0e29aefc8" +"Vehicle.Cabin.Door.Row1.PassengerSide.Shade.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","c700d6a13a16522ead84b81314fd452b" +"Vehicle.Cabin.Door.Row2","branch","","","","","","All doors, including windows and switches.","","","","74c8a76ad2545ceba474a85ae84eec8e" +"Vehicle.Cabin.Door.Row2.DriverSide","branch","","","","","","All doors, including windows and switches.","","","","996c7ede1ac453ae9aed508c2835ae56" +"Vehicle.Cabin.Door.Row2.DriverSide.IsLocked","actuator","boolean","","","","","Is item locked or unlocked. True = Locked. False = Unlocked.","","","","df98641aae1553a68b741826496d9d42" +"Vehicle.Cabin.Door.Row2.DriverSide.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","49c55921d1825bc1a82334a40eeb45f9" +"Vehicle.Cabin.Door.Row2.DriverSide.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","bf1d5b2f6a0b59bcb18abf24ea45c11e" +"Vehicle.Cabin.Door.Row2.DriverSide.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","3e46afea496054afb12653a9c82c66ad" +"Vehicle.Cabin.Door.Row2.DriverSide.Window","branch","","","","","","Door window status. Start position for Window is Closed.","","","","bb6ac206a45b507f9f1fe5fdfcf82b31" +"Vehicle.Cabin.Door.Row2.DriverSide.Window.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","1fa3b2f43118575aa2f136fdd15ff61f" +"Vehicle.Cabin.Door.Row2.DriverSide.Window.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","8a097ade895c5cd8afe9efeef79532fc" +"Vehicle.Cabin.Door.Row2.DriverSide.Window.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","4dd1a3858c1b54cc94a8dc4d011ea307" +"Vehicle.Cabin.Door.Row2.DriverSide.IsChildLockActive","sensor","boolean","","","","","Is door child lock active. True = Door cannot be opened from inside. False = Door can be opened from inside.","","","","707facc3d89052d8ae66675ffd8755a8" +"Vehicle.Cabin.Door.Row2.DriverSide.Shade","branch","","","","","","Side window shade. Open = Retracted, Closed = Deployed. Start position for Shade is Open/Retracted.","","","","9b08a5dc400253b8bf31776582f275fd" +"Vehicle.Cabin.Door.Row2.DriverSide.Shade.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","69c6da83b3aa51cd8156e57b2ba431a5" +"Vehicle.Cabin.Door.Row2.DriverSide.Shade.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","96227261fc205735adb031fb549de6bf" +"Vehicle.Cabin.Door.Row2.DriverSide.Shade.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","81f6196e909d590d858fe4da18c60590" +"Vehicle.Cabin.Door.Row2.PassengerSide","branch","","","","","","All doors, including windows and switches.","","","","16bc38dcd8055f50b54f87478f72f776" +"Vehicle.Cabin.Door.Row2.PassengerSide.IsLocked","actuator","boolean","","","","","Is item locked or unlocked. True = Locked. False = Unlocked.","","","","32fa3a8c0b2d5451a4a1976438417305" +"Vehicle.Cabin.Door.Row2.PassengerSide.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","84cab77c9c1d59aba1565b3484c5e01f" +"Vehicle.Cabin.Door.Row2.PassengerSide.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","74e971377a1053d284a6bf80cf1aa1c1" +"Vehicle.Cabin.Door.Row2.PassengerSide.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","1411f865d2065849aeb214875d0c099b" +"Vehicle.Cabin.Door.Row2.PassengerSide.Window","branch","","","","","","Door window status. Start position for Window is Closed.","","","","b64ba696bf7b5fdc8dba79ae5cb119d1" +"Vehicle.Cabin.Door.Row2.PassengerSide.Window.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","13e37e2924115c73a36df78f09fad493" +"Vehicle.Cabin.Door.Row2.PassengerSide.Window.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","e3e3fa03f4e357ae8ac8f43799a99350" +"Vehicle.Cabin.Door.Row2.PassengerSide.Window.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","174b3bc145625a22b23a283c424c28b4" +"Vehicle.Cabin.Door.Row2.PassengerSide.IsChildLockActive","sensor","boolean","","","","","Is door child lock active. True = Door cannot be opened from inside. False = Door can be opened from inside.","","","","082f7e3633ab56d4a48817329cf46ef9" +"Vehicle.Cabin.Door.Row2.PassengerSide.Shade","branch","","","","","","Side window shade. Open = Retracted, Closed = Deployed. Start position for Shade is Open/Retracted.","","","","8dc8133322a65057844f9b7eceee6ef9" +"Vehicle.Cabin.Door.Row2.PassengerSide.Shade.IsOpen","actuator","boolean","","","","","Is item open or closed? True = Fully or partially open. False = Fully closed.","","","","d667cda8637e518e900f0e599f59ca1d" +"Vehicle.Cabin.Door.Row2.PassengerSide.Shade.Position","actuator","uint8","","percent","0","100","Item position. 0 = Start position 100 = End position.","Relationship between Open/Close and Start/End position is item dependent.","","","aa5627291c29505b8d2f7d652cc4800d" +"Vehicle.Cabin.Door.Row2.PassengerSide.Shade.Switch","actuator","string","","","","","Switch controlling sliding action such as window, sunroof, or blind.","","['INACTIVE', 'CLOSE', 'OPEN', 'ONE_SHOT_CLOSE', 'ONE_SHOT_OPEN']","","0c33dd31375452d6ad0c531eac1637c6" +"Vehicle.Cabin.DoorCount","attribute","uint8","","","","","Number of doors in vehicle.","","","4","c293fbef75725c57a9918dd5a34055c4" +"Vehicle.Cabin.IsWindowChildLockEngaged","actuator","boolean","","","","","Is window child lock engaged. True = Engaged. False = Disengaged.","Window child lock refers to the functionality to disable the move window button next to most windows, so that they only can be operated by the driver.","","","23d94405d1035201ae2866f911f02063" +"Vehicle.Cabin.Seat","branch","","","","","","All seats.","","","","b0b253106b2851e3bb5c71ae3b09f09d" +"Vehicle.Cabin.Seat.Row1","branch","","","","","","All seats.","","","","7a420ddeac6f538eb3939bb4a242d136" +"Vehicle.Cabin.Seat.Row1.DriverSide","branch","","","","","","All seats.","","","","a8dd9e808a765a04874c2853c7926ed4" +"Vehicle.Cabin.Seat.Row1.DriverSide.IsOccupied","sensor","boolean","","","","","Does the seat have a passenger in it.","","","","e8b805d0bd3e56be9258685f390a7a9c" +"Vehicle.Cabin.Seat.Row1.DriverSide.Occupant","branch","","","","","","Occupant data.","","","","936f0c2fad4855d382e92393ec6223d7" +"Vehicle.Cabin.Seat.Row1.DriverSide.Occupant.Identifier","branch","","","","","","Identifier attributes based on OAuth 2.0.","","","","972f188af9425bc186a075224bbc3630" +"Vehicle.Cabin.Seat.Row1.DriverSide.Occupant.Identifier.Subject","sensor","string","","","","","Subject for the authentication of the occupant e.g. UserID 7331677.","","","","c4bb8a01fe8a5335b1c7c9288b9863c9" +"Vehicle.Cabin.Seat.Row1.DriverSide.Occupant.Identifier.Issuer","sensor","string","","","","","Unique Issuer for the authentication of the occupant e.g. https://accounts.funcorp.com.","","","","a48e731c91b55a2c9022b21774923b73" +"Vehicle.Cabin.Seat.Row1.DriverSide.IsBelted","sensor","boolean","","","","","Is the belt engaged.","","","","db477d45def05e11a90689c9e655cad9" +"Vehicle.Cabin.Seat.Row1.DriverSide.SeatBeltHeight","actuator","uint16","","mm","","","Seat belt position on vehicle z-axis. Position is relative within available movable range of the seat belt. 0 = Lowermost position supported.","","","","4e5f01eef7ce5005b4d8420fcd233336" +"Vehicle.Cabin.Seat.Row1.DriverSide.Heating","actuator","int8","v4.1 replaced with HeatingCooling","percent","-100","100","Seat cooling / heating. 0 = off. -100 = max cold. +100 = max heat.","","","","efeb2be118bb5f5eb796a81d298ab560" +"Vehicle.Cabin.Seat.Row1.DriverSide.HeatingCooling","actuator","int8","","percent","-100","100","Heating or Cooling requsted for the Item. -100 = Maximum cooling, 0 = Heating/cooling deactivated, 100 = Maximum heating.","","","","32ee42cdcf0c5ba3a963d0c11881e0c2" +"Vehicle.Cabin.Seat.Row1.DriverSide.Massage","actuator","uint8","","percent","0","100","Seat massage level. 0 = off. 100 = max massage.","","","","6d333404bc155fd2afa57a6380ecfd5c" +"Vehicle.Cabin.Seat.Row1.DriverSide.Position","actuator","uint16","","mm","0","","Seat position on vehicle x-axis. Position is relative to the frontmost position supported by the seat. 0 = Frontmost position supported.","","","","b9587caa89dd50d2af7167c99c13bc85" +"Vehicle.Cabin.Seat.Row1.DriverSide.Height","actuator","uint16","","mm","0","","Seat position on vehicle z-axis. Position is relative within available movable range of the seating. 0 = Lowermost position supported.","","","","f44c52884b5c58e4ae462656832c888b" +"Vehicle.Cabin.Seat.Row1.DriverSide.Tilt","actuator","float","","degrees","","","Tilting of seat (seating and backrest) relative to vehicle x-axis. 0 = seat bottom is flat, seat bottom and vehicle x-axis are parallel. Positive degrees = seat tilted backwards, seat x-axis tilted upward, seat z-axis is tilted backward.","In VSS it is assumed that tilting a seat affects both seating (seat bottom) and backrest, i.e. the angle between seating and backrest will not be affected when changing Tilt.","","","c4d3fb129999531a9b59ecff95cfc1c2" +"Vehicle.Cabin.Seat.Row1.DriverSide.Backrest","branch","","","","","","Describes signals related to the backrest of the seat.","","","","876fb7f9209155749108c95bb268836b" +"Vehicle.Cabin.Seat.Row1.DriverSide.Backrest.Recline","actuator","float","","degrees","","","Backrest recline compared to seat z-axis (seat vertical axis). 0 degrees = Upright/Vertical backrest. Negative degrees for forward recline. Positive degrees for backward recline.","Seat z-axis depends on seat tilt. This means that movement of backrest due to seat tilting will not affect Backrest.Recline as long as the angle between Seating and Backrest are constant. Absolute recline relative to vehicle z-axis can be calculated as Tilt + Backrest.Recline.","","","c58f21ae6ce150bc8f0b2cdd4698f958" +"Vehicle.Cabin.Seat.Row1.DriverSide.Backrest.Lumbar","branch","","","","","","Adjustable lumbar support mechanisms in seats allow the user to change the seat back shape.","","","","2112602ef7ab5470b3e57b85d6ff903f" +"Vehicle.Cabin.Seat.Row1.DriverSide.Backrest.Lumbar.Support","actuator","float","","percent","0","100","Lumbar support (in/out position). 0 = Innermost position. 100 = Outermost position.","","","","dc2da05595a151ada19e6d86037abaf0" +"Vehicle.Cabin.Seat.Row1.DriverSide.Backrest.Lumbar.Height","actuator","uint8","","mm","0","","Height of lumbar support. Position is relative within available movable range of the lumbar support. 0 = Lowermost position supported.","","","","637adce522d45075a064f3f94dc568ce" +"Vehicle.Cabin.Seat.Row1.DriverSide.Backrest.SideBolster","branch","","","","","","Backrest side bolster (lumbar side support) settings.","","","","bd36af767f2e582bae11c7a62b635789" +"Vehicle.Cabin.Seat.Row1.DriverSide.Backrest.SideBolster.Support","actuator","float","","percent","0","100","Side bolster support. 0 = Minimum support (widest side bolster setting). 100 = Maximum support.","","","","c3bcf9587aac58af827a41364bc91b55" +"Vehicle.Cabin.Seat.Row1.DriverSide.Seating","branch","","","","","","Describes signals related to the seat bottom of the seat.","Seating is here considered as the part of the seat that supports the thighs. Additional cushions (if any) for support of lower legs is not covered by this branch.","","","1e49fb9d59d85494b290e53b7753dd72" +"Vehicle.Cabin.Seat.Row1.DriverSide.Seating.Length","actuator","uint16","","mm","0","","Length adjustment of seating. 0 = Adjustable part of seating in rearmost position (Shortest length of seating).","","","","b030abb632dc503aa313ba5c75ba36f1" +"Vehicle.Cabin.Seat.Row1.DriverSide.Headrest","branch","","","","","","Headrest settings.","","","","4b193a02bffe52819b69d422d5e50042" +"Vehicle.Cabin.Seat.Row1.DriverSide.Headrest.Height","actuator","uint8","","mm","0","","Position of headrest relative to movable range of the head rest. 0 = Bottommost position supported.","","","","51de4b90534a5f089a9d81d53a663704" +"Vehicle.Cabin.Seat.Row1.DriverSide.Headrest.Angle","actuator","float","","degrees","","","Headrest angle, relative to backrest, 0 degrees if parallel to backrest, Positive degrees = tilted forward.","","","","55cf95c00d2056be859d330d0060a363" +"Vehicle.Cabin.Seat.Row1.DriverSide.Airbag","branch","","","","","","Airbag signals.","","","","cf3eca19b11e5e3ea66a078bed805968" +"Vehicle.Cabin.Seat.Row1.DriverSide.Airbag.IsDeployed","sensor","boolean","","","","","Airbag deployment status. True = Airbag deployed. False = Airbag not deployed.","","","","7308c4cd91025db3aad6dee3e4f9d2a1" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch","branch","","","","","","Seat switch signals","","","","3eb5fc8b515e5a90baaeb10bed7d68ca" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.IsWarmerEngaged","actuator","boolean","","","","","Warmer switch for Seat heater (SingleSeat.Heating).","","","","c7bd527be0fc59208eae631000d0ecf8" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.IsCoolerEngaged","actuator","boolean","","","","","Cooler switch for Seat heater (SingleSeat.Heating).","","","","5e450517dd065464ac9a4927abc936a7" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.IsForwardEngaged","actuator","boolean","","","","","Seat forward switch engaged (SingleSeat.Position).","","","","3414b4d1e0ea5887b900171cb52e13b5" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.IsBackwardEngaged","actuator","boolean","","","","","Seat backward switch engaged (SingleSeat.Position).","","","","242ef7b872b25d9b94db1553e7f0cb0e" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.IsUpEngaged","actuator","boolean","","","","","Seat up switch engaged (SingleSeat.Height).","","","","baef531919455c159b068c8ac8e2bca2" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.IsDownEngaged","actuator","boolean","","","","","Seat down switch engaged (SingleSeat.Height).","","","","d982ff943e5e5e06a7984a2e7bfe2f45" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.IsTiltForwardEngaged","actuator","boolean","","","","","Tilt forward switch engaged (SingleSeat.Tilt).","","","","abef0f196c08580f8b5e610071167e41" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.IsTiltBackwardEngaged","actuator","boolean","","","","","Tilt backward switch engaged (SingleSeat.Tilt).","","","","b3862480ad00587598d3f3f7c3468443" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Backrest","branch","","","","","","Describes switches related to the backrest of the seat.","","","","27ef6aedeefb5b288d191ca8e5306f55" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Backrest.IsReclineForwardEngaged","actuator","boolean","","","","","Backrest recline forward switch engaged (SingleSeat.Backrest.Recline).","","","","794645c172745cb0ba6b081d9903be78" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Backrest.IsReclineBackwardEngaged","actuator","boolean","","","","","Backrest recline backward switch engaged (SingleSeat.Backrest.Recline).","","","","7cc9aaaa51085baaa45be2ee7c7330bf" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Backrest.Lumbar","branch","","","","","","Switches for SingleSeat.Backrest.Lumbar.","","","","e69977f72c375925ac2817d8313a78e6" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Backrest.Lumbar.IsMoreSupportEngaged","actuator","boolean","","","","","Is switch for more lumbar support engaged (SingleSeat.Backrest.Lumbar.Support).","","","","9645281792d65ada94160182c5ef2722" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Backrest.Lumbar.IsLessSupportEngaged","actuator","boolean","","","","","Is switch for less lumbar support engaged (SingleSeat.Backrest.Lumbar.Support).","","","","30ac7b216df9562abc6b7a2c6e0f665c" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Backrest.Lumbar.IsUpEngaged","actuator","boolean","","","","","Lumbar up switch engaged (SingleSeat.Backrest.Lumbar.Support).","","","","07e098c9c24c5500ac7054a75529187d" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Backrest.Lumbar.IsDownEngaged","actuator","boolean","","","","","Lumbar down switch engaged (SingleSeat.Backrest.Lumbar.Support).","","","","e34e3c3330ac503a962eb076c7a05209" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Backrest.SideBolster","branch","","","","","","Switches for SingleSeat.Backrest.SideBolster.","","","","2702b44037a05092987a5da7a1b4e582" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Backrest.SideBolster.IsMoreSupportEngaged","actuator","boolean","","","","","Is switch for more side bolster support engaged (SingleSeat.Backrest.SideBolster.Support).","","","","056e7fa78a095b3e8c4e025ac7f69893" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Backrest.SideBolster.IsLessSupportEngaged","actuator","boolean","","","","","Is switch for less side bolster support engaged (SingleSeat.Backrest.SideBolster.Support).","","","","381639fd2a2751a9bb1429be5e0d5a99" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Seating","branch","","","","","","Describes switches related to the seating of the seat.","","","","d71f5acd57365612bf06f4c372bcbc13" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Seating.IsForwardEngaged","actuator","boolean","","","","","Is switch to increase seating length engaged (SingleSeat.Seating.Length).","","","","ea6bcaed18645c6fa9110c68b0dcc8b1" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Seating.IsBackwardEngaged","actuator","boolean","","","","","Is switch to decrease seating length engaged (SingleSeat.Seating.Length).","","","","7f35a13f8af55631bc280df0fedf00be" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Headrest","branch","","","","","","Switches for SingleSeat.Headrest.","","","","2839bf77f2e95c17afd1a63e2d85249c" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Headrest.IsUpEngaged","actuator","boolean","","","","","Head rest up switch engaged (SingleSeat.Headrest.Height).","","","","31d5f0a7c65f51c4b7e67d1c8b45b9b8" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Headrest.IsDownEngaged","actuator","boolean","","","","","Head rest down switch engaged (SingleSeat.Headrest.Height).","","","","14783a76b08953bca5d24ebc8d59b824" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Headrest.IsForwardEngaged","actuator","boolean","","","","","Head rest forward switch engaged (SingleSeat.Headrest.Angle).","","","","fe246f08a3ba5fe89703bf807c479528" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Headrest.IsBackwardEngaged","actuator","boolean","","","","","Head rest backward switch engaged (SingleSeat.Headrest.Angle).","","","","5d2d997eaadc510fa7a0ff4f0422aa7e" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Massage","branch","","","","","","Switches for SingleSeat.Massage.","","","","6d9d54a7a13e57769cf6ec91e63b4190" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Massage.IsIncreaseEngaged","actuator","boolean","","","","","Increase massage level switch engaged (SingleSeat.Massage).","","","","f321c48d000a5cf88d144e6c8aaebf64" +"Vehicle.Cabin.Seat.Row1.DriverSide.Switch.Massage.IsDecreaseEngaged","actuator","boolean","","","","","Decrease massage level switch engaged (SingleSeat.Massage).","","","","dfcf5fbc84955377b1024600afdb6128" +"Vehicle.Cabin.Seat.Row1.Middle","branch","","","","","","All seats.","","","","bb6213be75be5b33adf6ad5957bb64e9" +"Vehicle.Cabin.Seat.Row1.Middle.IsOccupied","sensor","boolean","","","","","Does the seat have a passenger in it.","","","","decf460a32ce5f1a9f2d4b68329707eb" +"Vehicle.Cabin.Seat.Row1.Middle.Occupant","branch","","","","","","Occupant data.","","","","cd842b8d4e7359d3ac47e8b39ab25ea9" +"Vehicle.Cabin.Seat.Row1.Middle.Occupant.Identifier","branch","","","","","","Identifier attributes based on OAuth 2.0.","","","","acfb210c54605ebeb1d231aa09d98575" +"Vehicle.Cabin.Seat.Row1.Middle.Occupant.Identifier.Subject","sensor","string","","","","","Subject for the authentication of the occupant e.g. UserID 7331677.","","","","d3fda2f366ea5b60a284b945c21aeb17" +"Vehicle.Cabin.Seat.Row1.Middle.Occupant.Identifier.Issuer","sensor","string","","","","","Unique Issuer for the authentication of the occupant e.g. https://accounts.funcorp.com.","","","","a22655ee843f5faf8c86daf55abad5f4" +"Vehicle.Cabin.Seat.Row1.Middle.IsBelted","sensor","boolean","","","","","Is the belt engaged.","","","","42a9c6f57d75550180138950e91e096e" +"Vehicle.Cabin.Seat.Row1.Middle.SeatBeltHeight","actuator","uint16","","mm","","","Seat belt position on vehicle z-axis. Position is relative within available movable range of the seat belt. 0 = Lowermost position supported.","","","","7e7b9ef4f3b350e9adf8091dff7e799f" +"Vehicle.Cabin.Seat.Row1.Middle.Heating","actuator","int8","v4.1 replaced with HeatingCooling","percent","-100","100","Seat cooling / heating. 0 = off. -100 = max cold. +100 = max heat.","","","","85e4a1400e1455149687f608cd4a4d08" +"Vehicle.Cabin.Seat.Row1.Middle.HeatingCooling","actuator","int8","","percent","-100","100","Heating or Cooling requsted for the Item. -100 = Maximum cooling, 0 = Heating/cooling deactivated, 100 = Maximum heating.","","","","fa7d96abfc2351fbbac29047c3bb46cd" +"Vehicle.Cabin.Seat.Row1.Middle.Massage","actuator","uint8","","percent","0","100","Seat massage level. 0 = off. 100 = max massage.","","","","17936943738e57888f4c11a38570f25c" +"Vehicle.Cabin.Seat.Row1.Middle.Position","actuator","uint16","","mm","0","","Seat position on vehicle x-axis. Position is relative to the frontmost position supported by the seat. 0 = Frontmost position supported.","","","","a9c61deb42ac5bb1b2c92fb5ee222db9" +"Vehicle.Cabin.Seat.Row1.Middle.Height","actuator","uint16","","mm","0","","Seat position on vehicle z-axis. Position is relative within available movable range of the seating. 0 = Lowermost position supported.","","","","e9ada64ce4b454928de166adaa4344da" +"Vehicle.Cabin.Seat.Row1.Middle.Tilt","actuator","float","","degrees","","","Tilting of seat (seating and backrest) relative to vehicle x-axis. 0 = seat bottom is flat, seat bottom and vehicle x-axis are parallel. Positive degrees = seat tilted backwards, seat x-axis tilted upward, seat z-axis is tilted backward.","In VSS it is assumed that tilting a seat affects both seating (seat bottom) and backrest, i.e. the angle between seating and backrest will not be affected when changing Tilt.","","","a9931f9f76cd5c9aa7cac23c43d09e38" +"Vehicle.Cabin.Seat.Row1.Middle.Backrest","branch","","","","","","Describes signals related to the backrest of the seat.","","","","5bef9412aeaf582284dc8f9cca5a5129" +"Vehicle.Cabin.Seat.Row1.Middle.Backrest.Recline","actuator","float","","degrees","","","Backrest recline compared to seat z-axis (seat vertical axis). 0 degrees = Upright/Vertical backrest. Negative degrees for forward recline. Positive degrees for backward recline.","Seat z-axis depends on seat tilt. This means that movement of backrest due to seat tilting will not affect Backrest.Recline as long as the angle between Seating and Backrest are constant. Absolute recline relative to vehicle z-axis can be calculated as Tilt + Backrest.Recline.","","","f16a244ea7e2560db3991cb581149683" +"Vehicle.Cabin.Seat.Row1.Middle.Backrest.Lumbar","branch","","","","","","Adjustable lumbar support mechanisms in seats allow the user to change the seat back shape.","","","","03d5b5e01dcb54e5a3f3ce890cd27cee" +"Vehicle.Cabin.Seat.Row1.Middle.Backrest.Lumbar.Support","actuator","float","","percent","0","100","Lumbar support (in/out position). 0 = Innermost position. 100 = Outermost position.","","","","22125fcec8aa5bc99fca8b86edbed2f0" +"Vehicle.Cabin.Seat.Row1.Middle.Backrest.Lumbar.Height","actuator","uint8","","mm","0","","Height of lumbar support. Position is relative within available movable range of the lumbar support. 0 = Lowermost position supported.","","","","32c42eb692605c0c8c2dc7df74a65f4e" +"Vehicle.Cabin.Seat.Row1.Middle.Backrest.SideBolster","branch","","","","","","Backrest side bolster (lumbar side support) settings.","","","","0c0b84957f8158d98f5a8c6d4f3265e5" +"Vehicle.Cabin.Seat.Row1.Middle.Backrest.SideBolster.Support","actuator","float","","percent","0","100","Side bolster support. 0 = Minimum support (widest side bolster setting). 100 = Maximum support.","","","","94e5f2630b7355c7b1b3ac75785bc5c6" +"Vehicle.Cabin.Seat.Row1.Middle.Seating","branch","","","","","","Describes signals related to the seat bottom of the seat.","Seating is here considered as the part of the seat that supports the thighs. Additional cushions (if any) for support of lower legs is not covered by this branch.","","","46a99e1f2b3553099fbb046a6b7dd86d" +"Vehicle.Cabin.Seat.Row1.Middle.Seating.Length","actuator","uint16","","mm","0","","Length adjustment of seating. 0 = Adjustable part of seating in rearmost position (Shortest length of seating).","","","","6fcbf711e9c852ba91f7d846f6066978" +"Vehicle.Cabin.Seat.Row1.Middle.Headrest","branch","","","","","","Headrest settings.","","","","a183fc37f47d55de8c5d2f2f27c779e0" +"Vehicle.Cabin.Seat.Row1.Middle.Headrest.Height","actuator","uint8","","mm","0","","Position of headrest relative to movable range of the head rest. 0 = Bottommost position supported.","","","","520ec12b50515918a664ae6f2ac6b702" +"Vehicle.Cabin.Seat.Row1.Middle.Headrest.Angle","actuator","float","","degrees","","","Headrest angle, relative to backrest, 0 degrees if parallel to backrest, Positive degrees = tilted forward.","","","","d5cc4a79f94f515aa8f5fa59184a5c35" +"Vehicle.Cabin.Seat.Row1.Middle.Airbag","branch","","","","","","Airbag signals.","","","","278a7e2126435a46a04dec92fd50ff8a" +"Vehicle.Cabin.Seat.Row1.Middle.Airbag.IsDeployed","sensor","boolean","","","","","Airbag deployment status. True = Airbag deployed. False = Airbag not deployed.","","","","41909de6e59a56f8b4d3d3a4296c4cb5" +"Vehicle.Cabin.Seat.Row1.Middle.Switch","branch","","","","","","Seat switch signals","","","","85bc5781995852329c3f56ab07a00a39" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.IsWarmerEngaged","actuator","boolean","","","","","Warmer switch for Seat heater (SingleSeat.Heating).","","","","874c7f1345975e67b6a691d541cf46f1" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.IsCoolerEngaged","actuator","boolean","","","","","Cooler switch for Seat heater (SingleSeat.Heating).","","","","4ad9208a44b555d5a80b819aaf97b2c8" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.IsForwardEngaged","actuator","boolean","","","","","Seat forward switch engaged (SingleSeat.Position).","","","","6ebb2556d17959ec9bfc1d796e1f34c6" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.IsBackwardEngaged","actuator","boolean","","","","","Seat backward switch engaged (SingleSeat.Position).","","","","3fdbbe5de45356d383be845b5deeceb8" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.IsUpEngaged","actuator","boolean","","","","","Seat up switch engaged (SingleSeat.Height).","","","","a5628090d3465668adb6f1bc32bd2329" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.IsDownEngaged","actuator","boolean","","","","","Seat down switch engaged (SingleSeat.Height).","","","","f108af06fb3954d5a87fb97cfadba808" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.IsTiltForwardEngaged","actuator","boolean","","","","","Tilt forward switch engaged (SingleSeat.Tilt).","","","","77dca23345a358fa99636c734b4de8ac" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.IsTiltBackwardEngaged","actuator","boolean","","","","","Tilt backward switch engaged (SingleSeat.Tilt).","","","","c7ece3b4d7435fed910b23f7ea5360d1" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Backrest","branch","","","","","","Describes switches related to the backrest of the seat.","","","","d386d2b7ca955caf8a4d2467d4c7603e" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Backrest.IsReclineForwardEngaged","actuator","boolean","","","","","Backrest recline forward switch engaged (SingleSeat.Backrest.Recline).","","","","8bd7805b426b5e439abd732e9b503bb3" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Backrest.IsReclineBackwardEngaged","actuator","boolean","","","","","Backrest recline backward switch engaged (SingleSeat.Backrest.Recline).","","","","a1b764756af559c0b850ee370d859c86" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Backrest.Lumbar","branch","","","","","","Switches for SingleSeat.Backrest.Lumbar.","","","","acb8e84f703d518dbf6c9c8b899766b0" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Backrest.Lumbar.IsMoreSupportEngaged","actuator","boolean","","","","","Is switch for more lumbar support engaged (SingleSeat.Backrest.Lumbar.Support).","","","","44923c7fe53c5fa39b632f999a6a951e" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Backrest.Lumbar.IsLessSupportEngaged","actuator","boolean","","","","","Is switch for less lumbar support engaged (SingleSeat.Backrest.Lumbar.Support).","","","","0f54dcace731576785322d02b68d2068" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Backrest.Lumbar.IsUpEngaged","actuator","boolean","","","","","Lumbar up switch engaged (SingleSeat.Backrest.Lumbar.Support).","","","","a947a1e52c3850e8ae81e12ef503c472" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Backrest.Lumbar.IsDownEngaged","actuator","boolean","","","","","Lumbar down switch engaged (SingleSeat.Backrest.Lumbar.Support).","","","","7f7face91df2506f9351f8c27915bc18" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Backrest.SideBolster","branch","","","","","","Switches for SingleSeat.Backrest.SideBolster.","","","","b2617422a80e5d409d5e327bec8a5895" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Backrest.SideBolster.IsMoreSupportEngaged","actuator","boolean","","","","","Is switch for more side bolster support engaged (SingleSeat.Backrest.SideBolster.Support).","","","","34016708d65655708157e432fad53f1f" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Backrest.SideBolster.IsLessSupportEngaged","actuator","boolean","","","","","Is switch for less side bolster support engaged (SingleSeat.Backrest.SideBolster.Support).","","","","a7d928b58dc152408e38fc7b6fdf6851" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Seating","branch","","","","","","Describes switches related to the seating of the seat.","","","","965137f2801f50e292cfc673a3e145ed" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Seating.IsForwardEngaged","actuator","boolean","","","","","Is switch to increase seating length engaged (SingleSeat.Seating.Length).","","","","e262f30a38285d7da365a42960f440e2" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Seating.IsBackwardEngaged","actuator","boolean","","","","","Is switch to decrease seating length engaged (SingleSeat.Seating.Length).","","","","c47a888b0ff85426a98fdcc6763abe10" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Headrest","branch","","","","","","Switches for SingleSeat.Headrest.","","","","ec7f8f340e005006bc966a96829f886d" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Headrest.IsUpEngaged","actuator","boolean","","","","","Head rest up switch engaged (SingleSeat.Headrest.Height).","","","","4abfea463f0359fcb387aa1538f12d52" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Headrest.IsDownEngaged","actuator","boolean","","","","","Head rest down switch engaged (SingleSeat.Headrest.Height).","","","","90d5bb0917875c009a7ee80b61a00e24" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Headrest.IsForwardEngaged","actuator","boolean","","","","","Head rest forward switch engaged (SingleSeat.Headrest.Angle).","","","","cbecebd77ff953c5830fbab699a3e0b8" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Headrest.IsBackwardEngaged","actuator","boolean","","","","","Head rest backward switch engaged (SingleSeat.Headrest.Angle).","","","","a7eee2a690c75ab7b7143d95b89d0678" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Massage","branch","","","","","","Switches for SingleSeat.Massage.","","","","d51481c8a5e05a1ca9481cd8fbaa6844" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Massage.IsIncreaseEngaged","actuator","boolean","","","","","Increase massage level switch engaged (SingleSeat.Massage).","","","","932e55cb1ea154a0ac35170f8c63cf01" +"Vehicle.Cabin.Seat.Row1.Middle.Switch.Massage.IsDecreaseEngaged","actuator","boolean","","","","","Decrease massage level switch engaged (SingleSeat.Massage).","","","","cd3226582b7a5f6590d983a6ed661a7b" +"Vehicle.Cabin.Seat.Row1.PassengerSide","branch","","","","","","All seats.","","","","c9eef94c5e075ce088020f8a568c0183" +"Vehicle.Cabin.Seat.Row1.PassengerSide.IsOccupied","sensor","boolean","","","","","Does the seat have a passenger in it.","","","","05a31ee58c97506485a19a2e0c213244" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Occupant","branch","","","","","","Occupant data.","","","","fd753377a2335b9fbda2cc2d29f826a6" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Occupant.Identifier","branch","","","","","","Identifier attributes based on OAuth 2.0.","","","","c7156b61e1b45698ae98b5d30c31ade3" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Occupant.Identifier.Subject","sensor","string","","","","","Subject for the authentication of the occupant e.g. UserID 7331677.","","","","121cb6ae3f4451df848f7809b313c392" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Occupant.Identifier.Issuer","sensor","string","","","","","Unique Issuer for the authentication of the occupant e.g. https://accounts.funcorp.com.","","","","bab527a608bd55d4b8a9d4b7d46c7037" +"Vehicle.Cabin.Seat.Row1.PassengerSide.IsBelted","sensor","boolean","","","","","Is the belt engaged.","","","","ed71588a6ea1511cbd4578967a94f963" +"Vehicle.Cabin.Seat.Row1.PassengerSide.SeatBeltHeight","actuator","uint16","","mm","","","Seat belt position on vehicle z-axis. Position is relative within available movable range of the seat belt. 0 = Lowermost position supported.","","","","3ad476825c6b598e8c468c49f0aaec10" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Heating","actuator","int8","v4.1 replaced with HeatingCooling","percent","-100","100","Seat cooling / heating. 0 = off. -100 = max cold. +100 = max heat.","","","","f62e56245db158508c9535a07474eed7" +"Vehicle.Cabin.Seat.Row1.PassengerSide.HeatingCooling","actuator","int8","","percent","-100","100","Heating or Cooling requsted for the Item. -100 = Maximum cooling, 0 = Heating/cooling deactivated, 100 = Maximum heating.","","","","9545cb7d8a4c53b6a0c27aeacc2c229f" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Massage","actuator","uint8","","percent","0","100","Seat massage level. 0 = off. 100 = max massage.","","","","89f7a63fc4f65f05b7df4b74b232cc9f" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Position","actuator","uint16","","mm","0","","Seat position on vehicle x-axis. Position is relative to the frontmost position supported by the seat. 0 = Frontmost position supported.","","","","3d09265704af56d59e5d80f92be3d66f" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Height","actuator","uint16","","mm","0","","Seat position on vehicle z-axis. Position is relative within available movable range of the seating. 0 = Lowermost position supported.","","","","ae6a103cb748510e9383e2b72d6f2a00" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Tilt","actuator","float","","degrees","","","Tilting of seat (seating and backrest) relative to vehicle x-axis. 0 = seat bottom is flat, seat bottom and vehicle x-axis are parallel. Positive degrees = seat tilted backwards, seat x-axis tilted upward, seat z-axis is tilted backward.","In VSS it is assumed that tilting a seat affects both seating (seat bottom) and backrest, i.e. the angle between seating and backrest will not be affected when changing Tilt.","","","086f231720875bb5b4d5e2b8ed0092df" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Backrest","branch","","","","","","Describes signals related to the backrest of the seat.","","","","999c7466ce1f5354b4695626f3a2e935" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Backrest.Recline","actuator","float","","degrees","","","Backrest recline compared to seat z-axis (seat vertical axis). 0 degrees = Upright/Vertical backrest. Negative degrees for forward recline. Positive degrees for backward recline.","Seat z-axis depends on seat tilt. This means that movement of backrest due to seat tilting will not affect Backrest.Recline as long as the angle between Seating and Backrest are constant. Absolute recline relative to vehicle z-axis can be calculated as Tilt + Backrest.Recline.","","","089f2ca3258e5f94871953539fe5acbc" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Backrest.Lumbar","branch","","","","","","Adjustable lumbar support mechanisms in seats allow the user to change the seat back shape.","","","","c2fbe0340f245b4ab3b1269de65b4c2d" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Backrest.Lumbar.Support","actuator","float","","percent","0","100","Lumbar support (in/out position). 0 = Innermost position. 100 = Outermost position.","","","","e8b52c64f1e957cbbbaf63b03c3dd9ef" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Backrest.Lumbar.Height","actuator","uint8","","mm","0","","Height of lumbar support. Position is relative within available movable range of the lumbar support. 0 = Lowermost position supported.","","","","0df596249cce5c77955e6938c0c9bea6" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Backrest.SideBolster","branch","","","","","","Backrest side bolster (lumbar side support) settings.","","","","4c48af687fd15c7785b9c4c075dc457c" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Backrest.SideBolster.Support","actuator","float","","percent","0","100","Side bolster support. 0 = Minimum support (widest side bolster setting). 100 = Maximum support.","","","","bd9dfba052ab5b24aa0eaa35fa47914f" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Seating","branch","","","","","","Describes signals related to the seat bottom of the seat.","Seating is here considered as the part of the seat that supports the thighs. Additional cushions (if any) for support of lower legs is not covered by this branch.","","","4ae8093ea56d5613a782b97c8b1be915" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Seating.Length","actuator","uint16","","mm","0","","Length adjustment of seating. 0 = Adjustable part of seating in rearmost position (Shortest length of seating).","","","","c4dfd494ffc95c4abdc49716a3b73c53" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Headrest","branch","","","","","","Headrest settings.","","","","f13eb4ad4b7a51bbad88db50dae636d3" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Headrest.Height","actuator","uint8","","mm","0","","Position of headrest relative to movable range of the head rest. 0 = Bottommost position supported.","","","","2701bc81fcc059b2b4ddc938407a503a" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Headrest.Angle","actuator","float","","degrees","","","Headrest angle, relative to backrest, 0 degrees if parallel to backrest, Positive degrees = tilted forward.","","","","5456d8e86ecb5cdf91b2bc08fe696d19" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Airbag","branch","","","","","","Airbag signals.","","","","c931d21b21005b5c9f0eb9a732f9b2ef" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Airbag.IsDeployed","sensor","boolean","","","","","Airbag deployment status. True = Airbag deployed. False = Airbag not deployed.","","","","31e4cea8ba6a5254bf1d1471402d0700" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch","branch","","","","","","Seat switch signals","","","","d7c6f91f09425d619cb93542ea55bed4" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.IsWarmerEngaged","actuator","boolean","","","","","Warmer switch for Seat heater (SingleSeat.Heating).","","","","597dd13468fd5b57858c6bbbc911392e" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.IsCoolerEngaged","actuator","boolean","","","","","Cooler switch for Seat heater (SingleSeat.Heating).","","","","5861078e66285792a4c5caa3158c3b93" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.IsForwardEngaged","actuator","boolean","","","","","Seat forward switch engaged (SingleSeat.Position).","","","","012004eeaa2250758c2fea329aec9dc2" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.IsBackwardEngaged","actuator","boolean","","","","","Seat backward switch engaged (SingleSeat.Position).","","","","d1a57d3e62725e51871433889877eb3e" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.IsUpEngaged","actuator","boolean","","","","","Seat up switch engaged (SingleSeat.Height).","","","","d4d0df3f6b5b51039847f748282d77ab" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.IsDownEngaged","actuator","boolean","","","","","Seat down switch engaged (SingleSeat.Height).","","","","ec27034136cd5e728c88c7ac0b87cf04" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.IsTiltForwardEngaged","actuator","boolean","","","","","Tilt forward switch engaged (SingleSeat.Tilt).","","","","1abb80c7ce615f73a2e0fb6583b09431" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.IsTiltBackwardEngaged","actuator","boolean","","","","","Tilt backward switch engaged (SingleSeat.Tilt).","","","","a49e3b4e3047525ab1034e04896f7a73" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Backrest","branch","","","","","","Describes switches related to the backrest of the seat.","","","","d035fd8a2e855edfb90e7955b3bd8065" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Backrest.IsReclineForwardEngaged","actuator","boolean","","","","","Backrest recline forward switch engaged (SingleSeat.Backrest.Recline).","","","","2a19419f5c355aff9a41ee8c8ec434a0" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Backrest.IsReclineBackwardEngaged","actuator","boolean","","","","","Backrest recline backward switch engaged (SingleSeat.Backrest.Recline).","","","","8e0c8a7fbb8a5cee933b3b1b50d4cbf1" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Backrest.Lumbar","branch","","","","","","Switches for SingleSeat.Backrest.Lumbar.","","","","73c59cba46725637bfa725a042713d0b" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Backrest.Lumbar.IsMoreSupportEngaged","actuator","boolean","","","","","Is switch for more lumbar support engaged (SingleSeat.Backrest.Lumbar.Support).","","","","c688f60d0f0650868ac32cba3d0c526e" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Backrest.Lumbar.IsLessSupportEngaged","actuator","boolean","","","","","Is switch for less lumbar support engaged (SingleSeat.Backrest.Lumbar.Support).","","","","cb08d335fa245f34b616f9c56fc529e0" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Backrest.Lumbar.IsUpEngaged","actuator","boolean","","","","","Lumbar up switch engaged (SingleSeat.Backrest.Lumbar.Support).","","","","10c691cb05f0581b8a6c4e764d81404d" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Backrest.Lumbar.IsDownEngaged","actuator","boolean","","","","","Lumbar down switch engaged (SingleSeat.Backrest.Lumbar.Support).","","","","5e8dd9ae1001569388bb4da677bdb377" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Backrest.SideBolster","branch","","","","","","Switches for SingleSeat.Backrest.SideBolster.","","","","8dfa254cccc059e881af97bce032cea9" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Backrest.SideBolster.IsMoreSupportEngaged","actuator","boolean","","","","","Is switch for more side bolster support engaged (SingleSeat.Backrest.SideBolster.Support).","","","","811d841212295f92a7d070dac262ef84" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Backrest.SideBolster.IsLessSupportEngaged","actuator","boolean","","","","","Is switch for less side bolster support engaged (SingleSeat.Backrest.SideBolster.Support).","","","","0ef641f1e4e75200879330a5de3d3315" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Seating","branch","","","","","","Describes switches related to the seating of the seat.","","","","12458c0216335477882e669e98330a1a" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Seating.IsForwardEngaged","actuator","boolean","","","","","Is switch to increase seating length engaged (SingleSeat.Seating.Length).","","","","aaf6db1585b15365be9ac729c11688e3" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Seating.IsBackwardEngaged","actuator","boolean","","","","","Is switch to decrease seating length engaged (SingleSeat.Seating.Length).","","","","87edf3b9896659f6a87d05531c260a36" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Headrest","branch","","","","","","Switches for SingleSeat.Headrest.","","","","3d328ade9dbf52e1bf8002caed74253f" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Headrest.IsUpEngaged","actuator","boolean","","","","","Head rest up switch engaged (SingleSeat.Headrest.Height).","","","","90a53f3c0a585c7cb5b1565092e62539" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Headrest.IsDownEngaged","actuator","boolean","","","","","Head rest down switch engaged (SingleSeat.Headrest.Height).","","","","2bd34fa3b02d54b0822890750a57eaae" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Headrest.IsForwardEngaged","actuator","boolean","","","","","Head rest forward switch engaged (SingleSeat.Headrest.Angle).","","","","5486d882309558cd95a5d0742d9eea2a" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Headrest.IsBackwardEngaged","actuator","boolean","","","","","Head rest backward switch engaged (SingleSeat.Headrest.Angle).","","","","e5b1e2a73c1d530298be5aa2b92ceb6a" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Massage","branch","","","","","","Switches for SingleSeat.Massage.","","","","3739036112535b9cbdad726a5f6e17a4" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Massage.IsIncreaseEngaged","actuator","boolean","","","","","Increase massage level switch engaged (SingleSeat.Massage).","","","","1d7d951e97b45aa5824f4e959c68737b" +"Vehicle.Cabin.Seat.Row1.PassengerSide.Switch.Massage.IsDecreaseEngaged","actuator","boolean","","","","","Decrease massage level switch engaged (SingleSeat.Massage).","","","","8044c9338f5e5df1a036c91cc4d91423" +"Vehicle.Cabin.Seat.Row2","branch","","","","","","All seats.","","","","8c3aaf015ef8595cb45d9461a9c1195f" +"Vehicle.Cabin.Seat.Row2.DriverSide","branch","","","","","","All seats.","","","","a3956dd19f73577a9e118e5ee6f5a180" +"Vehicle.Cabin.Seat.Row2.DriverSide.IsOccupied","sensor","boolean","","","","","Does the seat have a passenger in it.","","","","3752de2ef1d85781a6e0a20a6812b9fc" +"Vehicle.Cabin.Seat.Row2.DriverSide.Occupant","branch","","","","","","Occupant data.","","","","e4a46503b2945ab18ac1ad96f0517151" +"Vehicle.Cabin.Seat.Row2.DriverSide.Occupant.Identifier","branch","","","","","","Identifier attributes based on OAuth 2.0.","","","","a12121bc096c5224a14c2d8ab10ae88b" +"Vehicle.Cabin.Seat.Row2.DriverSide.Occupant.Identifier.Subject","sensor","string","","","","","Subject for the authentication of the occupant e.g. UserID 7331677.","","","","dfc0fb66d7c058b7925970667b284bea" +"Vehicle.Cabin.Seat.Row2.DriverSide.Occupant.Identifier.Issuer","sensor","string","","","","","Unique Issuer for the authentication of the occupant e.g. https://accounts.funcorp.com.","","","","a6b6158bc96c5ac98ad206193ff8b358" +"Vehicle.Cabin.Seat.Row2.DriverSide.IsBelted","sensor","boolean","","","","","Is the belt engaged.","","","","ec3dc746a34752a1b55ac428579c3dfc" +"Vehicle.Cabin.Seat.Row2.DriverSide.SeatBeltHeight","actuator","uint16","","mm","","","Seat belt position on vehicle z-axis. Position is relative within available movable range of the seat belt. 0 = Lowermost position supported.","","","","6a6313644782587d84fb04eb2c6397d8" +"Vehicle.Cabin.Seat.Row2.DriverSide.Heating","actuator","int8","v4.1 replaced with HeatingCooling","percent","-100","100","Seat cooling / heating. 0 = off. -100 = max cold. +100 = max heat.","","","","7ae50ab2fea25798adc27814579bd33b" +"Vehicle.Cabin.Seat.Row2.DriverSide.HeatingCooling","actuator","int8","","percent","-100","100","Heating or Cooling requsted for the Item. -100 = Maximum cooling, 0 = Heating/cooling deactivated, 100 = Maximum heating.","","","","2b4be8391f405e99a77ba65e3ea80aba" +"Vehicle.Cabin.Seat.Row2.DriverSide.Massage","actuator","uint8","","percent","0","100","Seat massage level. 0 = off. 100 = max massage.","","","","d7428179c70d576fb626a9a4bae4299e" +"Vehicle.Cabin.Seat.Row2.DriverSide.Position","actuator","uint16","","mm","0","","Seat position on vehicle x-axis. Position is relative to the frontmost position supported by the seat. 0 = Frontmost position supported.","","","","71b34d4141225b77bc232bd3a2efa86f" +"Vehicle.Cabin.Seat.Row2.DriverSide.Height","actuator","uint16","","mm","0","","Seat position on vehicle z-axis. Position is relative within available movable range of the seating. 0 = Lowermost position supported.","","","","2bd4b50c13d7541db0a86a945c728849" +"Vehicle.Cabin.Seat.Row2.DriverSide.Tilt","actuator","float","","degrees","","","Tilting of seat (seating and backrest) relative to vehicle x-axis. 0 = seat bottom is flat, seat bottom and vehicle x-axis are parallel. Positive degrees = seat tilted backwards, seat x-axis tilted upward, seat z-axis is tilted backward.","In VSS it is assumed that tilting a seat affects both seating (seat bottom) and backrest, i.e. the angle between seating and backrest will not be affected when changing Tilt.","","","68275a8560a95481a54b590ce458d0e9" +"Vehicle.Cabin.Seat.Row2.DriverSide.Backrest","branch","","","","","","Describes signals related to the backrest of the seat.","","","","1b7a7b3e344d50cca118327668f35be5" +"Vehicle.Cabin.Seat.Row2.DriverSide.Backrest.Recline","actuator","float","","degrees","","","Backrest recline compared to seat z-axis (seat vertical axis). 0 degrees = Upright/Vertical backrest. Negative degrees for forward recline. Positive degrees for backward recline.","Seat z-axis depends on seat tilt. This means that movement of backrest due to seat tilting will not affect Backrest.Recline as long as the angle between Seating and Backrest are constant. Absolute recline relative to vehicle z-axis can be calculated as Tilt + Backrest.Recline.","","","65cf20c7effb5d159fd1099869cd0ebe" +"Vehicle.Cabin.Seat.Row2.DriverSide.Backrest.Lumbar","branch","","","","","","Adjustable lumbar support mechanisms in seats allow the user to change the seat back shape.","","","","5eb73ac74d6a56ba9155cf16e145b9b4" +"Vehicle.Cabin.Seat.Row2.DriverSide.Backrest.Lumbar.Support","actuator","float","","percent","0","100","Lumbar support (in/out position). 0 = Innermost position. 100 = Outermost position.","","","","c8fec973719351b3b17f3824653d685a" +"Vehicle.Cabin.Seat.Row2.DriverSide.Backrest.Lumbar.Height","actuator","uint8","","mm","0","","Height of lumbar support. Position is relative within available movable range of the lumbar support. 0 = Lowermost position supported.","","","","eb67d32eadf15c0085f6314546e86e20" +"Vehicle.Cabin.Seat.Row2.DriverSide.Backrest.SideBolster","branch","","","","","","Backrest side bolster (lumbar side support) settings.","","","","2e06cc24d15651a1a1616fc77a5ba23b" +"Vehicle.Cabin.Seat.Row2.DriverSide.Backrest.SideBolster.Support","actuator","float","","percent","0","100","Side bolster support. 0 = Minimum support (widest side bolster setting). 100 = Maximum support.","","","","04cc8929b0f0509495b512a77b48afef" +"Vehicle.Cabin.Seat.Row2.DriverSide.Seating","branch","","","","","","Describes signals related to the seat bottom of the seat.","Seating is here considered as the part of the seat that supports the thighs. Additional cushions (if any) for support of lower legs is not covered by this branch.","","","5e581a713efc5867b769f38e64a2f320" +"Vehicle.Cabin.Seat.Row2.DriverSide.Seating.Length","actuator","uint16","","mm","0","","Length adjustment of seating. 0 = Adjustable part of seating in rearmost position (Shortest length of seating).","","","","4a5bd16967c65dd88eacf3e4ef8c071f" +"Vehicle.Cabin.Seat.Row2.DriverSide.Headrest","branch","","","","","","Headrest settings.","","","","67f772d705af5fac95ec768cf2bfe557" +"Vehicle.Cabin.Seat.Row2.DriverSide.Headrest.Height","actuator","uint8","","mm","0","","Position of headrest relative to movable range of the head rest. 0 = Bottommost position supported.","","","","916740f753715f3ea6c55b5284613f8e" +"Vehicle.Cabin.Seat.Row2.DriverSide.Headrest.Angle","actuator","float","","degrees","","","Headrest angle, relative to backrest, 0 degrees if parallel to backrest, Positive degrees = tilted forward.","","","","b7ee83ec92ac5595b56557cecbce7fd2" +"Vehicle.Cabin.Seat.Row2.DriverSide.Airbag","branch","","","","","","Airbag signals.","","","","215134942dea5de0bf542dc6b1f7aeb3" +"Vehicle.Cabin.Seat.Row2.DriverSide.Airbag.IsDeployed","sensor","boolean","","","","","Airbag deployment status. True = Airbag deployed. False = Airbag not deployed.","","","","1ec1956a54ae5107a802b9ec2b215b41" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch","branch","","","","","","Seat switch signals","","","","7a5a1ffb9ab65c6a9ee4cb581077f015" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.IsWarmerEngaged","actuator","boolean","","","","","Warmer switch for Seat heater (SingleSeat.Heating).","","","","65c26ab3824b5208bb21d7b8e2dd0124" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.IsCoolerEngaged","actuator","boolean","","","","","Cooler switch for Seat heater (SingleSeat.Heating).","","","","05e311e0669d5c128757475c8a83dc51" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.IsForwardEngaged","actuator","boolean","","","","","Seat forward switch engaged (SingleSeat.Position).","","","","95928045f69d5bfe9ef1c3eb2afec32a" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.IsBackwardEngaged","actuator","boolean","","","","","Seat backward switch engaged (SingleSeat.Position).","","","","a313045c29195b9ab11141155dd7ce17" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.IsUpEngaged","actuator","boolean","","","","","Seat up switch engaged (SingleSeat.Height).","","","","c2915c2c175c5a3a862b99d9d2a9cc9a" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.IsDownEngaged","actuator","boolean","","","","","Seat down switch engaged (SingleSeat.Height).","","","","192b6f898aa35459baa670b58c59c48f" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.IsTiltForwardEngaged","actuator","boolean","","","","","Tilt forward switch engaged (SingleSeat.Tilt).","","","","aa71ac6246895ec1b6c74fd76ceecdda" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.IsTiltBackwardEngaged","actuator","boolean","","","","","Tilt backward switch engaged (SingleSeat.Tilt).","","","","d4f3974ffcd75ba3a5f040f9e823fffe" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Backrest","branch","","","","","","Describes switches related to the backrest of the seat.","","","","55b0756c450a5df2b1a4b0e54b27804b" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Backrest.IsReclineForwardEngaged","actuator","boolean","","","","","Backrest recline forward switch engaged (SingleSeat.Backrest.Recline).","","","","838457df1a415fd1a9575eda730a3fa0" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Backrest.IsReclineBackwardEngaged","actuator","boolean","","","","","Backrest recline backward switch engaged (SingleSeat.Backrest.Recline).","","","","d45a563848b15928885bc7abb88a2d29" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Backrest.Lumbar","branch","","","","","","Switches for SingleSeat.Backrest.Lumbar.","","","","7789f295ccf75ab2aa899d2b095bafd4" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Backrest.Lumbar.IsMoreSupportEngaged","actuator","boolean","","","","","Is switch for more lumbar support engaged (SingleSeat.Backrest.Lumbar.Support).","","","","eeaa79b8443c59c28ba4eed3d2cc1aa1" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Backrest.Lumbar.IsLessSupportEngaged","actuator","boolean","","","","","Is switch for less lumbar support engaged (SingleSeat.Backrest.Lumbar.Support).","","","","9c6786e620f151a3a5eeb4b54395d2d8" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Backrest.Lumbar.IsUpEngaged","actuator","boolean","","","","","Lumbar up switch engaged (SingleSeat.Backrest.Lumbar.Support).","","","","ebf3534d31615c55803dc8b48d92ca6f" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Backrest.Lumbar.IsDownEngaged","actuator","boolean","","","","","Lumbar down switch engaged (SingleSeat.Backrest.Lumbar.Support).","","","","802ef996df3850c299f5c88dff83ab13" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Backrest.SideBolster","branch","","","","","","Switches for SingleSeat.Backrest.SideBolster.","","","","a5e3d845386b51c7bd2b054b81025112" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Backrest.SideBolster.IsMoreSupportEngaged","actuator","boolean","","","","","Is switch for more side bolster support engaged (SingleSeat.Backrest.SideBolster.Support).","","","","a5bcb578170d5442aad65c116302557c" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Backrest.SideBolster.IsLessSupportEngaged","actuator","boolean","","","","","Is switch for less side bolster support engaged (SingleSeat.Backrest.SideBolster.Support).","","","","ed76c57d2d0c5a1d851a708fbc750a29" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Seating","branch","","","","","","Describes switches related to the seating of the seat.","","","","f28ce1da77645fcd83aa72171ea172e8" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Seating.IsForwardEngaged","actuator","boolean","","","","","Is switch to increase seating length engaged (SingleSeat.Seating.Length).","","","","9ec6de29b168513f823be11c8f348e8c" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Seating.IsBackwardEngaged","actuator","boolean","","","","","Is switch to decrease seating length engaged (SingleSeat.Seating.Length).","","","","5d6d6db128965724a9e6f236d9532377" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Headrest","branch","","","","","","Switches for SingleSeat.Headrest.","","","","bb516988089154dfaff8b5b376778d76" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Headrest.IsUpEngaged","actuator","boolean","","","","","Head rest up switch engaged (SingleSeat.Headrest.Height).","","","","bf7acae10ed55aa49a9579f7dd028a8d" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Headrest.IsDownEngaged","actuator","boolean","","","","","Head rest down switch engaged (SingleSeat.Headrest.Height).","","","","10092cdf11165ffdb1e5b616fa5f841a" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Headrest.IsForwardEngaged","actuator","boolean","","","","","Head rest forward switch engaged (SingleSeat.Headrest.Angle).","","","","aa341f93f6095298ba328a8f164452cd" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Headrest.IsBackwardEngaged","actuator","boolean","","","","","Head rest backward switch engaged (SingleSeat.Headrest.Angle).","","","","c2654d9579905679b73ab44b6028b664" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Massage","branch","","","","","","Switches for SingleSeat.Massage.","","","","e40ca46bfdeb5a82965c1d6b0fc06890" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Massage.IsIncreaseEngaged","actuator","boolean","","","","","Increase massage level switch engaged (SingleSeat.Massage).","","","","a10a2542fdc85bd59286d62f5af32210" +"Vehicle.Cabin.Seat.Row2.DriverSide.Switch.Massage.IsDecreaseEngaged","actuator","boolean","","","","","Decrease massage level switch engaged (SingleSeat.Massage).","","","","854f8899693756e8840ee04c856dd12b" +"Vehicle.Cabin.Seat.Row2.Middle","branch","","","","","","All seats.","","","","a27650921e1e5ee0bd56562364c7dd6f" +"Vehicle.Cabin.Seat.Row2.Middle.IsOccupied","sensor","boolean","","","","","Does the seat have a passenger in it.","","","","50e0eeee98e95db58b87aa11a9285492" +"Vehicle.Cabin.Seat.Row2.Middle.Occupant","branch","","","","","","Occupant data.","","","","6850b36bd23f57d682a3ef7bc4faab5d" +"Vehicle.Cabin.Seat.Row2.Middle.Occupant.Identifier","branch","","","","","","Identifier attributes based on OAuth 2.0.","","","","3216275b8b6e5ab2a5f739232945c139" +"Vehicle.Cabin.Seat.Row2.Middle.Occupant.Identifier.Subject","sensor","string","","","","","Subject for the authentication of the occupant e.g. UserID 7331677.","","","","2b257368bdb556d087e8f13806003ab2" +"Vehicle.Cabin.Seat.Row2.Middle.Occupant.Identifier.Issuer","sensor","string","","","","","Unique Issuer for the authentication of the occupant e.g. https://accounts.funcorp.com.","","","","299d9f7fadef59859076cc783c2c6044" +"Vehicle.Cabin.Seat.Row2.Middle.IsBelted","sensor","boolean","","","","","Is the belt engaged.","","","","a4c37cf044a25eb9925b2278786b6cba" +"Vehicle.Cabin.Seat.Row2.Middle.SeatBeltHeight","actuator","uint16","","mm","","","Seat belt position on vehicle z-axis. Position is relative within available movable range of the seat belt. 0 = Lowermost position supported.","","","","6c22e3d28bcd51ae97e01c8ace4dee74" +"Vehicle.Cabin.Seat.Row2.Middle.Heating","actuator","int8","v4.1 replaced with HeatingCooling","percent","-100","100","Seat cooling / heating. 0 = off. -100 = max cold. +100 = max heat.","","","","3b6a82f5f68f56bba88b7c5349e1a45d" +"Vehicle.Cabin.Seat.Row2.Middle.HeatingCooling","actuator","int8","","percent","-100","100","Heating or Cooling requsted for the Item. -100 = Maximum cooling, 0 = Heating/cooling deactivated, 100 = Maximum heating.","","","","1b0129f265225acba5f18aef705b9c54" +"Vehicle.Cabin.Seat.Row2.Middle.Massage","actuator","uint8","","percent","0","100","Seat massage level. 0 = off. 100 = max massage.","","","","d5c053d69d3457ecb3b87be15ccbfe1c" +"Vehicle.Cabin.Seat.Row2.Middle.Position","actuator","uint16","","mm","0","","Seat position on vehicle x-axis. Position is relative to the frontmost position supported by the seat. 0 = Frontmost position supported.","","","","c7e61a5fe6f35d0fb50a4cbb3c5d15e8" +"Vehicle.Cabin.Seat.Row2.Middle.Height","actuator","uint16","","mm","0","","Seat position on vehicle z-axis. Position is relative within available movable range of the seating. 0 = Lowermost position supported.","","","","5e2a819627075c7ea1a6fb2c6b7e550d" +"Vehicle.Cabin.Seat.Row2.Middle.Tilt","actuator","float","","degrees","","","Tilting of seat (seating and backrest) relative to vehicle x-axis. 0 = seat bottom is flat, seat bottom and vehicle x-axis are parallel. Positive degrees = seat tilted backwards, seat x-axis tilted upward, seat z-axis is tilted backward.","In VSS it is assumed that tilting a seat affects both seating (seat bottom) and backrest, i.e. the angle between seating and backrest will not be affected when changing Tilt.","","","30d7caa224e6589a882751be94fb7a33" +"Vehicle.Cabin.Seat.Row2.Middle.Backrest","branch","","","","","","Describes signals related to the backrest of the seat.","","","","4f54b32f4c85549b88acbe7cd19dcb20" +"Vehicle.Cabin.Seat.Row2.Middle.Backrest.Recline","actuator","float","","degrees","","","Backrest recline compared to seat z-axis (seat vertical axis). 0 degrees = Upright/Vertical backrest. Negative degrees for forward recline. Positive degrees for backward recline.","Seat z-axis depends on seat tilt. This means that movement of backrest due to seat tilting will not affect Backrest.Recline as long as the angle between Seating and Backrest are constant. Absolute recline relative to vehicle z-axis can be calculated as Tilt + Backrest.Recline.","","","d24b223dcbb0534389c6c506126497e7" +"Vehicle.Cabin.Seat.Row2.Middle.Backrest.Lumbar","branch","","","","","","Adjustable lumbar support mechanisms in seats allow the user to change the seat back shape.","","","","f675492be60e5a1f9e4ed760a2ee4c33" +"Vehicle.Cabin.Seat.Row2.Middle.Backrest.Lumbar.Support","actuator","float","","percent","0","100","Lumbar support (in/out position). 0 = Innermost position. 100 = Outermost position.","","","","c281162d58ed50ccbd90fa58a1478047" +"Vehicle.Cabin.Seat.Row2.Middle.Backrest.Lumbar.Height","actuator","uint8","","mm","0","","Height of lumbar support. Position is relative within available movable range of the lumbar support. 0 = Lowermost position supported.","","","","1a20e907d2515d669c8207a464685be8" +"Vehicle.Cabin.Seat.Row2.Middle.Backrest.SideBolster","branch","","","","","","Backrest side bolster (lumbar side support) settings.","","","","10538af050535035a3a20e6f702ce99f" +"Vehicle.Cabin.Seat.Row2.Middle.Backrest.SideBolster.Support","actuator","float","","percent","0","100","Side bolster support. 0 = Minimum support (widest side bolster setting). 100 = Maximum support.","","","","b391d00bfb8f5e699fa2332cb5991cdb" +"Vehicle.Cabin.Seat.Row2.Middle.Seating","branch","","","","","","Describes signals related to the seat bottom of the seat.","Seating is here considered as the part of the seat that supports the thighs. Additional cushions (if any) for support of lower legs is not covered by this branch.","","","8a5674259c805a498c827cc4341b20c7" +"Vehicle.Cabin.Seat.Row2.Middle.Seating.Length","actuator","uint16","","mm","0","","Length adjustment of seating. 0 = Adjustable part of seating in rearmost position (Shortest length of seating).","","","","76071549a729587fbdebb78ef360cad9" +"Vehicle.Cabin.Seat.Row2.Middle.Headrest","branch","","","","","","Headrest settings.","","","","eb9a3ea623445fbab28e98ace9716f48" +"Vehicle.Cabin.Seat.Row2.Middle.Headrest.Height","actuator","uint8","","mm","0","","Position of headrest relative to movable range of the head rest. 0 = Bottommost position supported.","","","","987682ae6e7a539897bab4d96458fe15" +"Vehicle.Cabin.Seat.Row2.Middle.Headrest.Angle","actuator","float","","degrees","","","Headrest angle, relative to backrest, 0 degrees if parallel to backrest, Positive degrees = tilted forward.","","","","41f7b225f1485deaba50f489d58656da" +"Vehicle.Cabin.Seat.Row2.Middle.Airbag","branch","","","","","","Airbag signals.","","","","aa6d77c09158565787a2e418a1c9ea98" +"Vehicle.Cabin.Seat.Row2.Middle.Airbag.IsDeployed","sensor","boolean","","","","","Airbag deployment status. True = Airbag deployed. False = Airbag not deployed.","","","","cc06da5cab1e5b2e91d180c93c9e8eab" +"Vehicle.Cabin.Seat.Row2.Middle.Switch","branch","","","","","","Seat switch signals","","","","c634c8cf644d57098ae8b5337dec44a9" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.IsWarmerEngaged","actuator","boolean","","","","","Warmer switch for Seat heater (SingleSeat.Heating).","","","","2cdec47cb7565df3934ed28acf1e05a3" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.IsCoolerEngaged","actuator","boolean","","","","","Cooler switch for Seat heater (SingleSeat.Heating).","","","","36969412c2325b81906fc4a327a22c84" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.IsForwardEngaged","actuator","boolean","","","","","Seat forward switch engaged (SingleSeat.Position).","","","","0075b9cb31ae5a0c8172e966e6b40954" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.IsBackwardEngaged","actuator","boolean","","","","","Seat backward switch engaged (SingleSeat.Position).","","","","f9b78ecd6f065a59918c8fea51464f7a" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.IsUpEngaged","actuator","boolean","","","","","Seat up switch engaged (SingleSeat.Height).","","","","f8ded34424025a93b04ee9d47f451b22" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.IsDownEngaged","actuator","boolean","","","","","Seat down switch engaged (SingleSeat.Height).","","","","7507db75bf2d541e8eba802db5108fa7" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.IsTiltForwardEngaged","actuator","boolean","","","","","Tilt forward switch engaged (SingleSeat.Tilt).","","","","736dd231351d54389a65e77e39e28816" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.IsTiltBackwardEngaged","actuator","boolean","","","","","Tilt backward switch engaged (SingleSeat.Tilt).","","","","974123228c7a5fc0bbbc8b13063eb76e" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Backrest","branch","","","","","","Describes switches related to the backrest of the seat.","","","","ea42e74c9ee55a188af9e0728428a991" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Backrest.IsReclineForwardEngaged","actuator","boolean","","","","","Backrest recline forward switch engaged (SingleSeat.Backrest.Recline).","","","","2f81fa98e09b5cbdb462747053b61fe0" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Backrest.IsReclineBackwardEngaged","actuator","boolean","","","","","Backrest recline backward switch engaged (SingleSeat.Backrest.Recline).","","","","28a3b3bd920c552b8079c52743f10c22" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Backrest.Lumbar","branch","","","","","","Switches for SingleSeat.Backrest.Lumbar.","","","","11adccdb44b15e26b22252dd75810422" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Backrest.Lumbar.IsMoreSupportEngaged","actuator","boolean","","","","","Is switch for more lumbar support engaged (SingleSeat.Backrest.Lumbar.Support).","","","","703ec67285de5b3799ebd2e4f090e2eb" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Backrest.Lumbar.IsLessSupportEngaged","actuator","boolean","","","","","Is switch for less lumbar support engaged (SingleSeat.Backrest.Lumbar.Support).","","","","03390dc0feb256f4977f5aadcdef1663" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Backrest.Lumbar.IsUpEngaged","actuator","boolean","","","","","Lumbar up switch engaged (SingleSeat.Backrest.Lumbar.Support).","","","","24535eb7418f5bd4ac16900ea925c3ee" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Backrest.Lumbar.IsDownEngaged","actuator","boolean","","","","","Lumbar down switch engaged (SingleSeat.Backrest.Lumbar.Support).","","","","fbb8355fefd151b58936c7adbde8edd2" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Backrest.SideBolster","branch","","","","","","Switches for SingleSeat.Backrest.SideBolster.","","","","0618172eae735abdb3c40ed24481cb68" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Backrest.SideBolster.IsMoreSupportEngaged","actuator","boolean","","","","","Is switch for more side bolster support engaged (SingleSeat.Backrest.SideBolster.Support).","","","","dfcaac526f3952e0aa29caacf9cd796e" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Backrest.SideBolster.IsLessSupportEngaged","actuator","boolean","","","","","Is switch for less side bolster support engaged (SingleSeat.Backrest.SideBolster.Support).","","","","c67fc3cb95bf54ef988ec24b76db4221" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Seating","branch","","","","","","Describes switches related to the seating of the seat.","","","","473086da2fc4501f9b3bdbc94133eb92" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Seating.IsForwardEngaged","actuator","boolean","","","","","Is switch to increase seating length engaged (SingleSeat.Seating.Length).","","","","45ef8de577b55ff9b621aad08238edaf" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Seating.IsBackwardEngaged","actuator","boolean","","","","","Is switch to decrease seating length engaged (SingleSeat.Seating.Length).","","","","fb25e00b59f1513eb66355fd254e3bbe" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Headrest","branch","","","","","","Switches for SingleSeat.Headrest.","","","","84788fd7b9215fa78374c9ca196e5d2d" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Headrest.IsUpEngaged","actuator","boolean","","","","","Head rest up switch engaged (SingleSeat.Headrest.Height).","","","","2078f41ff0505639aab472a9793e0767" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Headrest.IsDownEngaged","actuator","boolean","","","","","Head rest down switch engaged (SingleSeat.Headrest.Height).","","","","e993d306024f5d5d8f1ffe8897d76a38" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Headrest.IsForwardEngaged","actuator","boolean","","","","","Head rest forward switch engaged (SingleSeat.Headrest.Angle).","","","","bbeb896cdb5059ea83add870abb45c69" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Headrest.IsBackwardEngaged","actuator","boolean","","","","","Head rest backward switch engaged (SingleSeat.Headrest.Angle).","","","","aec4843ad9435b9785f0d2485d457c56" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Massage","branch","","","","","","Switches for SingleSeat.Massage.","","","","dc5720a01af45e78a562d12a93db0fbd" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Massage.IsIncreaseEngaged","actuator","boolean","","","","","Increase massage level switch engaged (SingleSeat.Massage).","","","","9c2cd2dab1d65532b6b738966db8af41" +"Vehicle.Cabin.Seat.Row2.Middle.Switch.Massage.IsDecreaseEngaged","actuator","boolean","","","","","Decrease massage level switch engaged (SingleSeat.Massage).","","","","07e2a1c17a1854abb180fdf2038ece03" +"Vehicle.Cabin.Seat.Row2.PassengerSide","branch","","","","","","All seats.","","","","8cd32cb3e2d157b39af57d9cfe2e128c" +"Vehicle.Cabin.Seat.Row2.PassengerSide.IsOccupied","sensor","boolean","","","","","Does the seat have a passenger in it.","","","","516d511279a75513a53ca57adade3a99" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Occupant","branch","","","","","","Occupant data.","","","","0cd5c8c3bd3f55ee8cc4c876cad0b75f" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Occupant.Identifier","branch","","","","","","Identifier attributes based on OAuth 2.0.","","","","d18aded275a454068904eb5371a69f4d" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Occupant.Identifier.Subject","sensor","string","","","","","Subject for the authentication of the occupant e.g. UserID 7331677.","","","","9fc55976f51c552fac70632a7e61b1f4" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Occupant.Identifier.Issuer","sensor","string","","","","","Unique Issuer for the authentication of the occupant e.g. https://accounts.funcorp.com.","","","","3acca59e11b95e92945ac8ea568a3213" +"Vehicle.Cabin.Seat.Row2.PassengerSide.IsBelted","sensor","boolean","","","","","Is the belt engaged.","","","","c7d63d6c97845df5b602791f700968f7" +"Vehicle.Cabin.Seat.Row2.PassengerSide.SeatBeltHeight","actuator","uint16","","mm","","","Seat belt position on vehicle z-axis. Position is relative within available movable range of the seat belt. 0 = Lowermost position supported.","","","","9648e0ea501b583a86d211d09a953b14" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Heating","actuator","int8","v4.1 replaced with HeatingCooling","percent","-100","100","Seat cooling / heating. 0 = off. -100 = max cold. +100 = max heat.","","","","4c0ab40eaf745f12a09dc2c5acbedae9" +"Vehicle.Cabin.Seat.Row2.PassengerSide.HeatingCooling","actuator","int8","","percent","-100","100","Heating or Cooling requsted for the Item. -100 = Maximum cooling, 0 = Heating/cooling deactivated, 100 = Maximum heating.","","","","61dbad56f18e5ecba04d189ebd943770" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Massage","actuator","uint8","","percent","0","100","Seat massage level. 0 = off. 100 = max massage.","","","","bd9ec382d92e52ae826cb532ba13e11f" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Position","actuator","uint16","","mm","0","","Seat position on vehicle x-axis. Position is relative to the frontmost position supported by the seat. 0 = Frontmost position supported.","","","","07a8fe28cc1850dc96458e827a9ebeb5" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Height","actuator","uint16","","mm","0","","Seat position on vehicle z-axis. Position is relative within available movable range of the seating. 0 = Lowermost position supported.","","","","b1ca33bf7f4455ada6be941b92b824da" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Tilt","actuator","float","","degrees","","","Tilting of seat (seating and backrest) relative to vehicle x-axis. 0 = seat bottom is flat, seat bottom and vehicle x-axis are parallel. Positive degrees = seat tilted backwards, seat x-axis tilted upward, seat z-axis is tilted backward.","In VSS it is assumed that tilting a seat affects both seating (seat bottom) and backrest, i.e. the angle between seating and backrest will not be affected when changing Tilt.","","","646c179da57a59c39ca9777a4808980b" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Backrest","branch","","","","","","Describes signals related to the backrest of the seat.","","","","ea5285b1124c527681e1a45c51429bdb" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Backrest.Recline","actuator","float","","degrees","","","Backrest recline compared to seat z-axis (seat vertical axis). 0 degrees = Upright/Vertical backrest. Negative degrees for forward recline. Positive degrees for backward recline.","Seat z-axis depends on seat tilt. This means that movement of backrest due to seat tilting will not affect Backrest.Recline as long as the angle between Seating and Backrest are constant. Absolute recline relative to vehicle z-axis can be calculated as Tilt + Backrest.Recline.","","","6e3669fe31425539a49a2235c11bd5b5" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Backrest.Lumbar","branch","","","","","","Adjustable lumbar support mechanisms in seats allow the user to change the seat back shape.","","","","4eb3938a709f5e4dbdefeada15a4ddb9" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Backrest.Lumbar.Support","actuator","float","","percent","0","100","Lumbar support (in/out position). 0 = Innermost position. 100 = Outermost position.","","","","b29e1fd9898e5981807d74caa94dd16a" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Backrest.Lumbar.Height","actuator","uint8","","mm","0","","Height of lumbar support. Position is relative within available movable range of the lumbar support. 0 = Lowermost position supported.","","","","a8bcc5c7172e545db2b7d56611d5ab6a" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Backrest.SideBolster","branch","","","","","","Backrest side bolster (lumbar side support) settings.","","","","7e9c0a02e46b57879a2e3a0e66f02137" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Backrest.SideBolster.Support","actuator","float","","percent","0","100","Side bolster support. 0 = Minimum support (widest side bolster setting). 100 = Maximum support.","","","","a97af5b193b1521e90eb0fd33472ab38" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Seating","branch","","","","","","Describes signals related to the seat bottom of the seat.","Seating is here considered as the part of the seat that supports the thighs. Additional cushions (if any) for support of lower legs is not covered by this branch.","","","ef3307b33fae500b837da872d2fad454" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Seating.Length","actuator","uint16","","mm","0","","Length adjustment of seating. 0 = Adjustable part of seating in rearmost position (Shortest length of seating).","","","","68e28b1aadcf5c3db177943af27a9098" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Headrest","branch","","","","","","Headrest settings.","","","","a5449c4df2955aac981992fcbb581b84" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Headrest.Height","actuator","uint8","","mm","0","","Position of headrest relative to movable range of the head rest. 0 = Bottommost position supported.","","","","a82bd9a0a9745ef68dae31474a095294" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Headrest.Angle","actuator","float","","degrees","","","Headrest angle, relative to backrest, 0 degrees if parallel to backrest, Positive degrees = tilted forward.","","","","13f6bb21aa64545c97257c2b614622cb" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Airbag","branch","","","","","","Airbag signals.","","","","d16d61dc474f514fb10d1c8ecbeb9179" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Airbag.IsDeployed","sensor","boolean","","","","","Airbag deployment status. True = Airbag deployed. False = Airbag not deployed.","","","","a73fecde42375d07834a6670209228f4" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch","branch","","","","","","Seat switch signals","","","","dc15316849e75f6d9995d428eee65421" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.IsWarmerEngaged","actuator","boolean","","","","","Warmer switch for Seat heater (SingleSeat.Heating).","","","","a6ae083174c65a9599901c00819694f8" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.IsCoolerEngaged","actuator","boolean","","","","","Cooler switch for Seat heater (SingleSeat.Heating).","","","","119275e2b8b9579fbaf45f419f01879b" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.IsForwardEngaged","actuator","boolean","","","","","Seat forward switch engaged (SingleSeat.Position).","","","","6c4cb5e0ab59597db55b22918510c1a1" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.IsBackwardEngaged","actuator","boolean","","","","","Seat backward switch engaged (SingleSeat.Position).","","","","cefaab13d761577f86c35403460a83de" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.IsUpEngaged","actuator","boolean","","","","","Seat up switch engaged (SingleSeat.Height).","","","","0f1060fee7e05b2b91cc51d5a9b3da74" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.IsDownEngaged","actuator","boolean","","","","","Seat down switch engaged (SingleSeat.Height).","","","","00793becfbf35a1f9e22e62c0ee23382" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.IsTiltForwardEngaged","actuator","boolean","","","","","Tilt forward switch engaged (SingleSeat.Tilt).","","","","b601c11e3b525dd19933adaf807bc5c1" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.IsTiltBackwardEngaged","actuator","boolean","","","","","Tilt backward switch engaged (SingleSeat.Tilt).","","","","d6a316b6a3455e9da8769144aece2a74" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Backrest","branch","","","","","","Describes switches related to the backrest of the seat.","","","","9417cfbf4a08528f9a6bb6de95dd53a3" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Backrest.IsReclineForwardEngaged","actuator","boolean","","","","","Backrest recline forward switch engaged (SingleSeat.Backrest.Recline).","","","","9fca194c445257049d2ba0bc5d134e12" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Backrest.IsReclineBackwardEngaged","actuator","boolean","","","","","Backrest recline backward switch engaged (SingleSeat.Backrest.Recline).","","","","e9591a8c0ef551dd8d2da760bf96045a" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Backrest.Lumbar","branch","","","","","","Switches for SingleSeat.Backrest.Lumbar.","","","","ee7310791c475bcb946bd7074fb375af" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Backrest.Lumbar.IsMoreSupportEngaged","actuator","boolean","","","","","Is switch for more lumbar support engaged (SingleSeat.Backrest.Lumbar.Support).","","","","bc763cfcd7fd511cbdc8ae2cc64a0ac7" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Backrest.Lumbar.IsLessSupportEngaged","actuator","boolean","","","","","Is switch for less lumbar support engaged (SingleSeat.Backrest.Lumbar.Support).","","","","54dd7359d76f5caeb221807f3c9f05d6" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Backrest.Lumbar.IsUpEngaged","actuator","boolean","","","","","Lumbar up switch engaged (SingleSeat.Backrest.Lumbar.Support).","","","","8bc621f1041052c7abf17124cb6dc270" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Backrest.Lumbar.IsDownEngaged","actuator","boolean","","","","","Lumbar down switch engaged (SingleSeat.Backrest.Lumbar.Support).","","","","32defc92edd159bc96939d399202d4ca" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Backrest.SideBolster","branch","","","","","","Switches for SingleSeat.Backrest.SideBolster.","","","","a69bfc99fd21564b9d6e06504063f3f0" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Backrest.SideBolster.IsMoreSupportEngaged","actuator","boolean","","","","","Is switch for more side bolster support engaged (SingleSeat.Backrest.SideBolster.Support).","","","","cd893883ea4857b8a42e02dccd7c48d6" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Backrest.SideBolster.IsLessSupportEngaged","actuator","boolean","","","","","Is switch for less side bolster support engaged (SingleSeat.Backrest.SideBolster.Support).","","","","ccdd90ab2f3152be80c64b4500c78a8b" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Seating","branch","","","","","","Describes switches related to the seating of the seat.","","","","0b6331463cf65b44a5709705a1e55d7c" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Seating.IsForwardEngaged","actuator","boolean","","","","","Is switch to increase seating length engaged (SingleSeat.Seating.Length).","","","","ef90f29f5ab65b0cbf271a7e06fa848d" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Seating.IsBackwardEngaged","actuator","boolean","","","","","Is switch to decrease seating length engaged (SingleSeat.Seating.Length).","","","","ed70ebf0a7065894af1ac26e409d2408" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Headrest","branch","","","","","","Switches for SingleSeat.Headrest.","","","","0db2d43128845f65a029915777d30ac9" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Headrest.IsUpEngaged","actuator","boolean","","","","","Head rest up switch engaged (SingleSeat.Headrest.Height).","","","","b77c09fbcec95c5fb04a6d14af5b9f94" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Headrest.IsDownEngaged","actuator","boolean","","","","","Head rest down switch engaged (SingleSeat.Headrest.Height).","","","","263c5edb7c7c515581a853327df34215" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Headrest.IsForwardEngaged","actuator","boolean","","","","","Head rest forward switch engaged (SingleSeat.Headrest.Angle).","","","","d86793d827f6545e97e03d1b8363236d" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Headrest.IsBackwardEngaged","actuator","boolean","","","","","Head rest backward switch engaged (SingleSeat.Headrest.Angle).","","","","0f6c3fada9695cfc89309bca1941d0f5" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Massage","branch","","","","","","Switches for SingleSeat.Massage.","","","","bd644892090f5bd9a4b89281331cbe4d" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Massage.IsIncreaseEngaged","actuator","boolean","","","","","Increase massage level switch engaged (SingleSeat.Massage).","","","","ac7635aa2fc7578aae97d8a253e9a303" +"Vehicle.Cabin.Seat.Row2.PassengerSide.Switch.Massage.IsDecreaseEngaged","actuator","boolean","","","","","Decrease massage level switch engaged (SingleSeat.Massage).","","","","399c59f3d97151499a9005b329368baf" +"Vehicle.Cabin.DriverPosition","attribute","string","","","","","The position of the driver seat in row 1.","Some signals use DriverSide and PassengerSide as instances. If this signal specifies that DriverPosition is LEFT or MIDDLE, then DriverSide refers to left side and PassengerSide to right side. If this signal specifies that DriverPosition is RIGHT, then DriverSide refers to right side and PassengerSide to left side.","['LEFT', 'MIDDLE', 'RIGHT']","","bca9ccd50358584d8d20865694b0d15f" +"Vehicle.Cabin.SeatRowCount","attribute","uint8","","","","","Number of seat rows in vehicle.","Default value corresponds to two rows of seats.","","2","1002a7a4a954581b9cbc72fa438c5292" +"Vehicle.Cabin.SeatPosCount","attribute","uint8[]","","","","","Number of seats across each row from the front to the rear.","Default value corresponds to two seats in front row and 3 seats in second row.","","[2, 3]","8dd40ecd47ab51c79ed9c74ae4296d7e" +"Vehicle.Cabin.Convertible","branch","","","","","","Convertible roof.","","","","2aece85d39d6569e93cf842387a645d9" +"Vehicle.Cabin.Convertible.Status","sensor","string","","","","","Roof status on convertible vehicles.","","['UNDEFINED', 'CLOSED', 'OPEN', 'CLOSING', 'OPENING', 'STALLED']","","c8812698198a56d7a1adcc8bbe87845f" +"Vehicle.Cabin.PowerOptimizeLevel","actuator","uint8","","","0","10","Power optimization level for this branch/subsystem. A higher number indicates more aggressive power optimization. Level 0 indicates that all functionality is enabled, no power optimization enabled. Level 10 indicates most aggressive power optimization mode, only essential functionality enabled.","","","","728b62b170055bd8b1530ec423dd5a9a" +"Vehicle.Cabin.IsAutoPowerOptimize","actuator","boolean","","","","","Auto Power Optimization Flag When set to 'true', the system enables automatic power optimization, dynamically adjusting the power optimization level based on runtime conditions or features managed by the OEM. When set to 'false', manual control of the power optimization level is allowed.","","","","b1fa47b39a275bea8606460005de2b33" +"Vehicle.ADAS","branch","","","","","","All Advanced Driver Assist Systems data.","","","","14c2b2e1297b513197d320a5ce58f42e" +"Vehicle.ADAS.ActiveAutonomyLevel","sensor","string","","","","","Indicates the currently active level of autonomy according to SAE J3016 taxonomy.","Follows https://www.sae.org/news/2019/01/sae-updates-j3016-automated-driving-graphic taxonomy. For SAE levels 3 and 4 the system is required to alert the driver before it will disengage. Level 4 systems are required to reach a safe state even if a driver does not take over. Only level 5 systems are required to not rely on a driver at all. While level 2 systems require the driver to be monitoring the system at all times, many level 2 systems, often termed ""level 2.5"" systems, do warn the driver shortly before reaching their operational limits, therefore we also support the DISENGAGING state for SAE_2.","['SAE_0', 'SAE_1', 'SAE_2_DISENGAGING', 'SAE_2', 'SAE_3_DISENGAGING', 'SAE_3', 'SAE_4_DISENGAGING', 'SAE_4', 'SAE_5']","","b101c6928fc55948b1cc485e568ecd8d" +"Vehicle.ADAS.SupportedAutonomyLevel","attribute","string","","","","","Indicates the highest level of autonomy according to SAE J3016 taxonomy the vehicle is capable of.","","['SAE_0', 'SAE_1', 'SAE_2', 'SAE_3', 'SAE_4', 'SAE_5']","","020410189ab4517cb85ceda268b40f51" +"Vehicle.ADAS.CruiseControl","branch","","","","","","Signals from Cruise Control system.","","","","c4d751cf74f9576dbba3cc820991c1fb" +"Vehicle.ADAS.CruiseControl.IsEnabled","actuator","boolean","","","","","Indicates if cruise control system is enabled (e.g. ready to receive configurations and settings) True = Enabled. False = Disabled.","","","","018417f6c8535315895d0f54d209035a" +"Vehicle.ADAS.CruiseControl.IsActive","actuator","boolean","","","","","Indicates if cruise control system is active (i.e. actively controls speed). True = Active. False = Inactive.","","","","78ab5ce923dc5aa1a6622bcb948e1561" +"Vehicle.ADAS.CruiseControl.SpeedSet","actuator","float","","km/h","","","Set cruise control speed in kilometers per hour.","","","","b3f3a53ccd825e4da5cb1226f94dc005" +"Vehicle.ADAS.CruiseControl.IsError","sensor","boolean","","","","","Indicates if cruise control system incurred an error condition. True = Error. False = No Error.","","","","22923d4a36bc5192a08e40fe9e5ed458" +"Vehicle.ADAS.LaneDepartureDetection","branch","","","","","","Signals from Lane Departure Detection System.","","","","e45f33fdcf245f11981b2f201ee8281a" +"Vehicle.ADAS.LaneDepartureDetection.IsEnabled","actuator","boolean","","","","","Indicates if lane departure detection system is enabled. True = Enabled. False = Disabled.","","","","c099ae97260f5c418977cd14631e95be" +"Vehicle.ADAS.LaneDepartureDetection.IsWarning","sensor","boolean","","","","","Indicates if lane departure detection registered a lane departure.","","","","c32fcd1d56035cb08acfd380be224c6a" +"Vehicle.ADAS.LaneDepartureDetection.IsError","sensor","boolean","","","","","Indicates if lane departure system incurred an error condition. True = Error. False = No Error.","","","","73b2fc4f6a4952e4b7886671450e7798" +"Vehicle.ADAS.ObstacleDetection","branch","","","","","","Signals form Obstacle Sensor System.","","","","e7b6d81631cc5ac584d027d4c1a66cb5" +"Vehicle.ADAS.ObstacleDetection.IsEnabled","actuator","boolean","","","","","Indicates if obstacle sensor system is enabled (i.e. monitoring for obstacles). True = Enabled. False = Disabled.","","","","cc0cd497285e5034a1cccb25f02e9db9" +"Vehicle.ADAS.ObstacleDetection.IsWarning","sensor","boolean","","","","","Indicates if obstacle sensor system registered an obstacle.","","","","b0b1eab51f135ffcb2a17a7603415fec" +"Vehicle.ADAS.ObstacleDetection.IsError","sensor","boolean","","","","","Indicates if obstacle sensor system incurred an error condition. True = Error. False = No Error.","","","","368b74e2468d5217925a478ed6e34f9f" +"Vehicle.ADAS.ABS","branch","","","","","","Antilock Braking System signals.","","","","219270ef27c4531f874bbda63743b330" +"Vehicle.ADAS.ABS.IsEnabled","actuator","boolean","","","","","Indicates if ABS is enabled. True = Enabled. False = Disabled.","","","","cad374fbfdc65df9b777508f04d5b073" +"Vehicle.ADAS.ABS.IsError","sensor","boolean","","","","","Indicates if ABS incurred an error condition. True = Error. False = No Error.","","","","13cfabb3122254128234f9a696f14678" +"Vehicle.ADAS.ABS.IsEngaged","sensor","boolean","","","","","Indicates if ABS is currently regulating brake pressure. True = Engaged. False = Not Engaged.","","","","6dd21979a2225e31940dc2ece1aa9a04" +"Vehicle.ADAS.TCS","branch","","","","","","Traction Control System signals.","","","","0572e9f6b1aa5fb5b2f68086aff05073" +"Vehicle.ADAS.TCS.IsEnabled","actuator","boolean","","","","","Indicates if TCS is enabled. True = Enabled. False = Disabled.","","","","1d2dda19b11758a19ba7c1d5cd2d7956" +"Vehicle.ADAS.TCS.IsError","sensor","boolean","","","","","Indicates if TCS incurred an error condition. True = Error. False = No Error.","","","","08f88723ba63558b8c804b8fe8e3f149" +"Vehicle.ADAS.TCS.IsEngaged","sensor","boolean","","","","","Indicates if TCS is currently regulating traction. True = Engaged. False = Not Engaged.","","","","b33d70009ad5589fbffe17fa7e827242" +"Vehicle.ADAS.ESC","branch","","","","","","Electronic Stability Control System signals.","","","","636b4586ce7854b4b270a2f3b6c0af4f" +"Vehicle.ADAS.ESC.IsEnabled","actuator","boolean","","","","","Indicates if ESC is enabled. True = Enabled. False = Disabled.","","","","3f4f39b8d8c05c97a6de685282ba74b7" +"Vehicle.ADAS.ESC.IsError","sensor","boolean","","","","","Indicates if ESC incurred an error condition. True = Error. False = No Error.","","","","6c237535654b5bc7a70f6a70c760b9d4" +"Vehicle.ADAS.ESC.IsEngaged","sensor","boolean","","","","","Indicates if ESC is currently regulating vehicle stability. True = Engaged. False = Not Engaged.","","","","2088953a28385353a9d46b3a3dc11cac" +"Vehicle.ADAS.ESC.IsStrongCrossWindDetected","sensor","boolean","","","","","Indicates if the ESC system is detecting strong cross winds. True = Strong cross winds detected. False = No strong cross winds detected.","","","","ebfd609531345c37914b89e553df80cb" +"Vehicle.ADAS.ESC.RoadFriction","branch","","","","","","Road friction values reported by the ESC system.","","","","71a32e4eb131532c82195508d93807ed" +"Vehicle.ADAS.ESC.RoadFriction.MostProbable","sensor","float","","percent","0","100","Most probable road friction, as calculated by the ESC system. Exact meaning of most probable is implementation specific. 0 = no friction, 100 = maximum friction.","","","","b0eb72430cd95bfbba0d187fcb6e2a62" +"Vehicle.ADAS.ESC.RoadFriction.LowerBound","sensor","float","","percent","0","100","Lower bound road friction, as calculated by the ESC system. 5% possibility that road friction is below this value. 0 = no friction, 100 = maximum friction.","","","","634289f58b5d511ea9979f04a9d0f2ab" +"Vehicle.ADAS.ESC.RoadFriction.UpperBound","sensor","float","","percent","0","100","Upper bound road friction, as calculated by the ESC system. 95% possibility that road friction is below this value. 0 = no friction, 100 = maximum friction.","","","","ad0415a799575fcd8d1f49bed9a2baeb" +"Vehicle.ADAS.EBD","branch","","","","","","Electronic Brakeforce Distribution (EBD) System signals.","","","","3f4c74a588735b10ac9fe918d305cd5a" +"Vehicle.ADAS.EBD.IsEnabled","actuator","boolean","","","","","Indicates if EBD is enabled. True = Enabled. False = Disabled.","","","","30f88d3e68575b67853b14ce5f7a08e5" +"Vehicle.ADAS.EBD.IsError","sensor","boolean","","","","","Indicates if EBD incurred an error condition. True = Error. False = No Error.","","","","918157073be95015ae38913cd7a9796a" +"Vehicle.ADAS.EBD.IsEngaged","sensor","boolean","","","","","Indicates if EBD is currently regulating vehicle brakeforce distribution. True = Engaged. False = Not Engaged.","","","","67aa2a598f635edda6eb944af99b06db" +"Vehicle.ADAS.EBA","branch","","","","","","Emergency Brake Assist (EBA) System signals.","","","","51ec0930d0af5b91b84a0775c6e87a97" +"Vehicle.ADAS.EBA.IsEnabled","actuator","boolean","","","","","Indicates if EBA is enabled. True = Enabled. False = Disabled.","","","","3ae9171b69555fb08855054ab38e9b17" +"Vehicle.ADAS.EBA.IsError","sensor","boolean","","","","","Indicates if EBA incurred an error condition. True = Error. False = No Error.","","","","bae0fe856398502ba4a09283867c6c81" +"Vehicle.ADAS.EBA.IsEngaged","sensor","boolean","","","","","Indicates if EBA is currently regulating brake pressure. True = Engaged. False = Not Engaged.","","","","86360c44ead354d18af7ff14176151f6" +"Vehicle.ADAS.DMS","branch","","","","","","Driver Monitoring System signals.","","","","1cd72c7fc7fe5269a93c9954f46a4f60" +"Vehicle.ADAS.DMS.IsEnabled","actuator","boolean","","","","","Indicates if DMS is enabled. True = Enabled. False = Disabled.","","","","63e6d3803ce35fd79afc728c65295804" +"Vehicle.ADAS.DMS.IsWarning","sensor","boolean","","","","","Indicates if DMS has registered a driver alert condition.","","","","2c86cd0363cd55ffb175a9e07cc32e4d" +"Vehicle.ADAS.DMS.IsError","sensor","boolean","","","","","Indicates if DMS incurred an error condition. True = Error. False = No Error.","","","","d5213c8cb5d5575994b2c8ee1ad8eccf" +"Vehicle.ADAS.PowerOptimizeLevel","actuator","uint8","","","0","10","Power optimization level for this branch/subsystem. A higher number indicates more aggressive power optimization. Level 0 indicates that all functionality is enabled, no power optimization enabled. Level 10 indicates most aggressive power optimization mode, only essential functionality enabled.","","","","044ad42893e65993bfc439455fb08faa" +"Vehicle.ADAS.IsAutoPowerOptimize","actuator","boolean","","","","","Auto Power Optimization Flag When set to 'true', the system enables automatic power optimization, dynamically adjusting the power optimization level based on runtime conditions or features managed by the OEM. When set to 'false', manual control of the power optimization level is allowed.","","","","42553349ce4357a3900b80771c8481b1" +"Vehicle.Chassis","branch","","","","","","All data concerning steering, suspension, wheels, and brakes.","","","","87d260d635425da0a4ebd62bc4e5c313" +"Vehicle.Chassis.Wheelbase","attribute","uint16","","mm","","","Overall wheelbase, in mm.","","","0","11677e0433935dc7aa9c1806c96a8a6b" +"Vehicle.Chassis.Axle","branch","","","","","","Axle signals","","","","0a3ebde7efa85c04ac6c29b5676fec5d" +"Vehicle.Chassis.Axle.Row1","branch","","","","","","Axle signals","","","","d7e93a94af0752aaab36819f6be4f67a" +"Vehicle.Chassis.Axle.Row1.TreadWidth","attribute","uint16","","mm","","","The lateral distance between the centerlines of the base tires at ground, including camber angle. If there are dual rear wheels, measure from the midway points between the inner and outer tires.","Corresponds to SAE J1100-2009 W101.","","","0851716e0b635392b6bb64cb478e82b0" +"Vehicle.Chassis.Axle.Row1.TrackWidth","attribute","uint16","","mm","","","The lateral distance between the centers of the wheels, measured along the spindle, or axle axis. If there are dual rear wheels, measure from the midway points between the inner and outer tires.","Corresponds to SAE J1100-2009 W102.","","","d854bb9c72615e2896c1ed084db515fa" +"Vehicle.Chassis.Axle.Row1.AxleWidth","attribute","uint16","","mm","","","The lateral distance between the wheel mounting faces, measured along the spindle axis.","Corresponds to SAE J1100-2009 W113.","","","4458487c2a4e51efa3762349188ce2a1" +"Vehicle.Chassis.Axle.Row1.WheelCount","attribute","uint8","","","","","Number of wheels on the axle","","","","7232effafb7d5c908a9bafe1cef2ff3e" +"Vehicle.Chassis.Axle.Row1.WheelDiameter","attribute","float","","inch","","","Diameter of wheels (rims without tires), in inches, as per ETRTO / TRA standard.","","","","60d4b948ae8a5485bd77c45e1f648c13" +"Vehicle.Chassis.Axle.Row1.WheelWidth","attribute","float","","inch","","","Width of wheels (rims without tires), in inches, as per ETRTO / TRA standard.","","","","5b92bdab1e035ff4ba000330e20f826b" +"Vehicle.Chassis.Axle.Row1.SteeringAngle","sensor","float","","degrees","","","Single track two-axle model steering angle. Angle according to ISO 8855. Positive = degrees to the left. Negative = degrees to the right.","Single track two-axle model steering angle refers to the angle that a centrally mounted wheel would have.","","","91310e9ef88450c68791fbb07d83f104" +"Vehicle.Chassis.Axle.Row1.TireDiameter","attribute","float","","inch","","","Outer diameter of tires, in inches, as per ETRTO / TRA standard.","","","","ed9f037c1b5d53c78c90b71179db1f4f" +"Vehicle.Chassis.Axle.Row1.TireWidth","attribute","uint16","","mm","","","Nominal section width of tires, in mm, as per ETRTO / TRA standard.","","","","3444d8773c215cd7a076d688eb7f1afc" +"Vehicle.Chassis.Axle.Row1.TireAspectRatio","attribute","uint8","","percent","","","Aspect ratio between tire section height and tire section width, as per ETRTO / TRA standard.","","","","716fec24167e5c36b2b97daaf091f911" +"Vehicle.Chassis.Axle.Row1.Wheel","branch","","","","","","Wheel signals for axle","","","","8ed02c02eee0502ba6d94a5d5f1fb789" +"Vehicle.Chassis.Axle.Row1.Wheel.Left","branch","","","","","","Wheel signals for axle","","","","0cd478c6e72b55c6be6d3d9df9624545" +"Vehicle.Chassis.Axle.Row1.Wheel.Left.Brake","branch","","","","","","Brake signals for wheel","","","","162dab13d5815ec4bc22888b0bc59cbf" +"Vehicle.Chassis.Axle.Row1.Wheel.Left.Brake.FluidLevel","sensor","uint8","","percent","","100","Brake fluid level as percent. 0 = Empty. 100 = Full.","","","","63aa9c4973ef50b18bd7214c9f2634c5" +"Vehicle.Chassis.Axle.Row1.Wheel.Left.Brake.IsFluidLevelLow","sensor","boolean","","","","","Brake fluid level status. True = Brake fluid level low. False = Brake fluid level OK.","","","","713da56818e55714ac441e10870b3753" +"Vehicle.Chassis.Axle.Row1.Wheel.Left.Brake.PadWear","sensor","uint8","","percent","","100","Brake pad wear as percent. 0 = No Wear. 100 = Worn.","","","","b4ed36f8143d512fadaca3e641739ee2" +"Vehicle.Chassis.Axle.Row1.Wheel.Left.Brake.IsBrakesWorn","sensor","boolean","","","","","Brake pad wear status. True = Worn. False = Not Worn.","","","","901771088eb35dec9e69b56a8cb3e8f5" +"Vehicle.Chassis.Axle.Row1.Wheel.Left.Tire","branch","","","","","","Tire signals for wheel.","","","","17c60ec3c02054b4951c975156375d9a" +"Vehicle.Chassis.Axle.Row1.Wheel.Left.Tire.Pressure","sensor","uint16","","kPa","","","Tire pressure in kilo-Pascal.","","","","9fa3f176fd975d28a68f70c7d72e370f" +"Vehicle.Chassis.Axle.Row1.Wheel.Left.Tire.IsPressureLow","sensor","boolean","","","","","Tire Pressure Status. True = Low tire pressure. False = Good tire pressure.","","","","4088315cfaa05c28b51c3d3462c65339" +"Vehicle.Chassis.Axle.Row1.Wheel.Left.Tire.Temperature","sensor","float","","celsius","","","Tire temperature in Celsius.","","","","093d8fb119755f6bafa979e4eae201a0" +"Vehicle.Chassis.Axle.Row1.Wheel.Left.Speed","sensor","float","","km/h","","","Rotational speed of a vehicle's wheel.","","","","47897f20b2745b6aa2d0f76f1ecf824a" +"Vehicle.Chassis.Axle.Row1.Wheel.Right","branch","","","","","","Wheel signals for axle","","","","c7ae1f1787ec502d8aea41802dc9a203" +"Vehicle.Chassis.Axle.Row1.Wheel.Right.Brake","branch","","","","","","Brake signals for wheel","","","","f334a45b92215f86b4ecadbd82c8b249" +"Vehicle.Chassis.Axle.Row1.Wheel.Right.Brake.FluidLevel","sensor","uint8","","percent","","100","Brake fluid level as percent. 0 = Empty. 100 = Full.","","","","386bfddee4605e419d59755a51835650" +"Vehicle.Chassis.Axle.Row1.Wheel.Right.Brake.IsFluidLevelLow","sensor","boolean","","","","","Brake fluid level status. True = Brake fluid level low. False = Brake fluid level OK.","","","","bb2057bc31c25beda1da0610ca62bd51" +"Vehicle.Chassis.Axle.Row1.Wheel.Right.Brake.PadWear","sensor","uint8","","percent","","100","Brake pad wear as percent. 0 = No Wear. 100 = Worn.","","","","f3c53c8c5628527a8501e12778dae6c7" +"Vehicle.Chassis.Axle.Row1.Wheel.Right.Brake.IsBrakesWorn","sensor","boolean","","","","","Brake pad wear status. True = Worn. False = Not Worn.","","","","4c669b71c91e57dd8fd804ee68174b9c" +"Vehicle.Chassis.Axle.Row1.Wheel.Right.Tire","branch","","","","","","Tire signals for wheel.","","","","660f90ae8f14594cb6e97d000c1985a1" +"Vehicle.Chassis.Axle.Row1.Wheel.Right.Tire.Pressure","sensor","uint16","","kPa","","","Tire pressure in kilo-Pascal.","","","","ea8038b63e6650ffb1a20539e915064a" +"Vehicle.Chassis.Axle.Row1.Wheel.Right.Tire.IsPressureLow","sensor","boolean","","","","","Tire Pressure Status. True = Low tire pressure. False = Good tire pressure.","","","","93fa1125894e53259af5b7e1d991c8da" +"Vehicle.Chassis.Axle.Row1.Wheel.Right.Tire.Temperature","sensor","float","","celsius","","","Tire temperature in Celsius.","","","","58d4cee188d353d7996e855d48bb92df" +"Vehicle.Chassis.Axle.Row1.Wheel.Right.Speed","sensor","float","","km/h","","","Rotational speed of a vehicle's wheel.","","","","c288d064d56e53bfb94cef8670872587" +"Vehicle.Chassis.Axle.Row2","branch","","","","","","Axle signals","","","","8ef77768446659b6b5020a06c7b23c8b" +"Vehicle.Chassis.Axle.Row2.TreadWidth","attribute","uint16","","mm","","","The lateral distance between the centerlines of the base tires at ground, including camber angle. If there are dual rear wheels, measure from the midway points between the inner and outer tires.","Corresponds to SAE J1100-2009 W101.","","","bdfd2fb7c3b25091a48f873462466f84" +"Vehicle.Chassis.Axle.Row2.TrackWidth","attribute","uint16","","mm","","","The lateral distance between the centers of the wheels, measured along the spindle, or axle axis. If there are dual rear wheels, measure from the midway points between the inner and outer tires.","Corresponds to SAE J1100-2009 W102.","","","b6c5ba52f1985f179c9346edbabe2f9b" +"Vehicle.Chassis.Axle.Row2.AxleWidth","attribute","uint16","","mm","","","The lateral distance between the wheel mounting faces, measured along the spindle axis.","Corresponds to SAE J1100-2009 W113.","","","99860d78f2b25ae0b420660b76f933f0" +"Vehicle.Chassis.Axle.Row2.WheelCount","attribute","uint8","","","","","Number of wheels on the axle","","","","ac6fe103410153d382306426d14213ab" +"Vehicle.Chassis.Axle.Row2.WheelDiameter","attribute","float","","inch","","","Diameter of wheels (rims without tires), in inches, as per ETRTO / TRA standard.","","","","af27b1d18a5455e593692a9929909bb9" +"Vehicle.Chassis.Axle.Row2.WheelWidth","attribute","float","","inch","","","Width of wheels (rims without tires), in inches, as per ETRTO / TRA standard.","","","","889d279053c051979ebbe301bacac206" +"Vehicle.Chassis.Axle.Row2.SteeringAngle","sensor","float","","degrees","","","Single track two-axle model steering angle. Angle according to ISO 8855. Positive = degrees to the left. Negative = degrees to the right.","Single track two-axle model steering angle refers to the angle that a centrally mounted wheel would have.","","","bf1960525e725d2ca145ce12ba939ea3" +"Vehicle.Chassis.Axle.Row2.TireDiameter","attribute","float","","inch","","","Outer diameter of tires, in inches, as per ETRTO / TRA standard.","","","","4dc46ee7fe0a5240a6eb67f9bf43a1ea" +"Vehicle.Chassis.Axle.Row2.TireWidth","attribute","uint16","","mm","","","Nominal section width of tires, in mm, as per ETRTO / TRA standard.","","","","76a9071697b25fb8ab42393dfb77f0ef" +"Vehicle.Chassis.Axle.Row2.TireAspectRatio","attribute","uint8","","percent","","","Aspect ratio between tire section height and tire section width, as per ETRTO / TRA standard.","","","","9b4515273bf1554dab746212db05d352" +"Vehicle.Chassis.Axle.Row2.Wheel","branch","","","","","","Wheel signals for axle","","","","87b119ed6de254159877b24047fd3026" +"Vehicle.Chassis.Axle.Row2.Wheel.Left","branch","","","","","","Wheel signals for axle","","","","4c32a1c722a45ea09a52c389e8a8a618" +"Vehicle.Chassis.Axle.Row2.Wheel.Left.Brake","branch","","","","","","Brake signals for wheel","","","","774d0a5771d35975872870cf71ea1487" +"Vehicle.Chassis.Axle.Row2.Wheel.Left.Brake.FluidLevel","sensor","uint8","","percent","","100","Brake fluid level as percent. 0 = Empty. 100 = Full.","","","","4b0d4f80b8855973a55ffee80fdfc4ba" +"Vehicle.Chassis.Axle.Row2.Wheel.Left.Brake.IsFluidLevelLow","sensor","boolean","","","","","Brake fluid level status. True = Brake fluid level low. False = Brake fluid level OK.","","","","01f57161b0bf539fad1d2bfa9d9a9fc4" +"Vehicle.Chassis.Axle.Row2.Wheel.Left.Brake.PadWear","sensor","uint8","","percent","","100","Brake pad wear as percent. 0 = No Wear. 100 = Worn.","","","","8eff72d583015e1e94eab98bf8f0497e" +"Vehicle.Chassis.Axle.Row2.Wheel.Left.Brake.IsBrakesWorn","sensor","boolean","","","","","Brake pad wear status. True = Worn. False = Not Worn.","","","","3d9bae5bf0705de99789ecea26b99a5c" +"Vehicle.Chassis.Axle.Row2.Wheel.Left.Tire","branch","","","","","","Tire signals for wheel.","","","","edfee87117dc5a6f9d970167f26ec090" +"Vehicle.Chassis.Axle.Row2.Wheel.Left.Tire.Pressure","sensor","uint16","","kPa","","","Tire pressure in kilo-Pascal.","","","","ea414012c36e54fc84ec1d421f370ddd" +"Vehicle.Chassis.Axle.Row2.Wheel.Left.Tire.IsPressureLow","sensor","boolean","","","","","Tire Pressure Status. True = Low tire pressure. False = Good tire pressure.","","","","d895b1e23a4f59ec92735fc317e44769" +"Vehicle.Chassis.Axle.Row2.Wheel.Left.Tire.Temperature","sensor","float","","celsius","","","Tire temperature in Celsius.","","","","06ab6b3fe7bb5f7c9e2e104ee0e7cfd5" +"Vehicle.Chassis.Axle.Row2.Wheel.Left.Speed","sensor","float","","km/h","","","Rotational speed of a vehicle's wheel.","","","","427abdd04fc355769697d998a47d3f58" +"Vehicle.Chassis.Axle.Row2.Wheel.Right","branch","","","","","","Wheel signals for axle","","","","f59f6ce66b1454498f5dc71be581732a" +"Vehicle.Chassis.Axle.Row2.Wheel.Right.Brake","branch","","","","","","Brake signals for wheel","","","","5c33ec4bd8a15d3590f59e7257bf4d25" +"Vehicle.Chassis.Axle.Row2.Wheel.Right.Brake.FluidLevel","sensor","uint8","","percent","","100","Brake fluid level as percent. 0 = Empty. 100 = Full.","","","","83e5e261302d5ab38c9ee4dddc18c8ae" +"Vehicle.Chassis.Axle.Row2.Wheel.Right.Brake.IsFluidLevelLow","sensor","boolean","","","","","Brake fluid level status. True = Brake fluid level low. False = Brake fluid level OK.","","","","727823c7e0d551f48f26a5dd4f0578bd" +"Vehicle.Chassis.Axle.Row2.Wheel.Right.Brake.PadWear","sensor","uint8","","percent","","100","Brake pad wear as percent. 0 = No Wear. 100 = Worn.","","","","63a564bca18a5b1fabd7d3cff1af0e6d" +"Vehicle.Chassis.Axle.Row2.Wheel.Right.Brake.IsBrakesWorn","sensor","boolean","","","","","Brake pad wear status. True = Worn. False = Not Worn.","","","","9b5963e98a9c5b229a61df76ef5c86e0" +"Vehicle.Chassis.Axle.Row2.Wheel.Right.Tire","branch","","","","","","Tire signals for wheel.","","","","d855fe9ffb4e52be83ebfc7967c1c3ee" +"Vehicle.Chassis.Axle.Row2.Wheel.Right.Tire.Pressure","sensor","uint16","","kPa","","","Tire pressure in kilo-Pascal.","","","","0cd3dd4be36c5fcda49d6360556ba7c8" +"Vehicle.Chassis.Axle.Row2.Wheel.Right.Tire.IsPressureLow","sensor","boolean","","","","","Tire Pressure Status. True = Low tire pressure. False = Good tire pressure.","","","","da2f63312a455d92abd5edc405f01903" +"Vehicle.Chassis.Axle.Row2.Wheel.Right.Tire.Temperature","sensor","float","","celsius","","","Tire temperature in Celsius.","","","","7c08b5778bc05265bb8d4e08fdca29cf" +"Vehicle.Chassis.Axle.Row2.Wheel.Right.Speed","sensor","float","","km/h","","","Rotational speed of a vehicle's wheel.","","","","85b41a82f4775fcea57dcc6218fb6d7b" +"Vehicle.Chassis.AxleCount","attribute","uint8","","","","","Number of axles on the vehicle","","","2","86d084c9148d5f22b5402a030413ed79" +"Vehicle.Chassis.ParkingBrake","branch","","","","","","Parking brake signals","","","","3849d42292f4551590fa4bf716fc90f7" +"Vehicle.Chassis.ParkingBrake.IsEngaged","actuator","boolean","","","","","Parking brake status. True = Parking Brake is Engaged. False = Parking Brake is not Engaged.","","","","faa7f94e6a5555c6b2d62e3328520ce0" +"Vehicle.Chassis.ParkingBrake.IsAutoApplyEnabled","actuator","boolean","","","","","Indicates if parking brake will be automatically engaged when the vehicle engine is turned off.","","","","26c694c9a1c75b699cc8c1dd2986ab90" +"Vehicle.Chassis.SteeringWheel","branch","","","","","","Steering wheel signals","","","","8c759072791e5986ac4efe9df0c2b751" +"Vehicle.Chassis.SteeringWheel.Angle","sensor","int16","","degrees","","","Steering wheel angle. Positive = degrees to the left. Negative = degrees to the right.","","","","92cd3b3d37585b2291806fe5127d9393" +"Vehicle.Chassis.SteeringWheel.Tilt","actuator","uint8","","percent","0","100","Steering wheel column tilt. 0 = Lowest position. 100 = Highest position.","","","","33e979769f91521d8080384447d06c00" +"Vehicle.Chassis.SteeringWheel.Extension","actuator","uint8","","percent","0","100","Steering wheel column extension from dashboard. 0 = Closest to dashboard. 100 = Furthest from dashboard.","","","","6a84cc3604fc5960a1fb384fe63fae72" +"Vehicle.Chassis.SteeringWheel.HeatingCooling","actuator","int8","","percent","-100","100","Heating or Cooling requsted for the Item. -100 = Maximum cooling, 0 = Heating/cooling deactivated, 100 = Maximum heating.","","","","74e1f4888a9a5dc6b3bbdda9ecafef39" +"Vehicle.Chassis.Accelerator","branch","","","","","","Accelerator signals","","","","3b2b562086a45eb29c55186f3b710621" +"Vehicle.Chassis.Accelerator.PedalPosition","sensor","uint8","","percent","0","100","Accelerator pedal position as percent. 0 = Not depressed. 100 = Fully depressed.","","","","2fabd8b61db45f62b4e97e7a612b4a73" +"Vehicle.Chassis.Brake","branch","","","","","","Brake system signals","","","","38df972e5c6b558e93839a5e97238c5a" +"Vehicle.Chassis.Brake.PedalPosition","sensor","uint8","","percent","0","100","Brake pedal position as percent. 0 = Not depressed. 100 = Fully depressed.","","","","0477d3a4a831564ea473976cf34374f2" +"Vehicle.Chassis.Brake.IsDriverEmergencyBrakingDetected","sensor","boolean","","","","","Indicates if emergency braking initiated by driver is detected. True = Emergency braking detected. False = Emergency braking not detected.","Detection of emergency braking can trigger Emergency Brake Assist (EBA) to engage.","","","0d462892aeac5062a62ee7d07306f6a6" +"Vehicle.OBD","branch","","","","","","OBD data.","","","","7ad7c512ed5d52c8b31944d2d47a4bc3" +"Vehicle.OBD.PidsA","attribute","string[]","","","","","PID 00 - Array of the supported PIDs 01 to 20 in Hexadecimal.","","['01', '02', '03', '04', '05', '06', '07', '08', '09', '0A', '0B', '0C', '0D', '0E', '0F', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1A', '1B', '1C', '1D', '1E', '1F', '20']","","ba1c1b9034955d2d97249c3b4516beef" +"Vehicle.OBD.PidsB","attribute","string[]","","","","","PID 20 - Array of the supported PIDs 21 to 40 in Hexadecimal.","","['21', '22', '23', '24', '25', '26', '27', '28', '29', '2A', '2B', '2C', '2D', '2E', '2F', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3A', '3B', '3C', '3D', '3E', '3F', '40']","","00193c560a0a5525baa45681e07b50f6" +"Vehicle.OBD.PidsC","attribute","string[]","","","","","PID 40 - Array of the supported PIDs 41 to 60 in Hexadecimal.","","['41', '42', '43', '44', '45', '46', '47', '48', '49', '4A', '4B', '4C', '4D', '4E', '4F', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5A', '5B', '5C', '5D', '5E', '5F', '60']","","7c3a3f0ecc5d593aa996892668afe4b0" +"Vehicle.OBD.Status","branch","","","","","","PID 01 - OBD status","","","","474f58e593ee5bfebbb9c6ce4a453f96" +"Vehicle.OBD.Status.IsMILOn","sensor","boolean","","","","","Malfunction Indicator Light (MIL) False = Off, True = On","","","","8744bcb275205630932320b66185502c" +"Vehicle.OBD.Status.DTCCount","sensor","uint8","","","","","Number of Diagnostic Trouble Codes (DTC)","","","","4afdf65e788c5f69baf682597e69fb67" +"Vehicle.OBD.Status.IgnitionType","attribute","string","","","","","Type of the ignition for ICE - spark = spark plug ignition, compression = self-igniting (Diesel engines)","","['SPARK', 'COMPRESSION']","","7ffd71caac8e5bd18f93366afdfe534d" +"Vehicle.OBD.DTCList","sensor","string[]","","","","","List of currently active DTCs formatted according OBD II (SAE-J2012DA_201812) standard ([P|C|B|U]XXXXX )","","","","eee1b64e69845d5ab5e793b74631f9dc" +"Vehicle.OBD.FreezeDTC","sensor","string","","","","","PID 02 - DTC that triggered the freeze frame","","","","5b87fae8dda4522aae209ae528960782" +"Vehicle.OBD.FuelStatus","sensor","string","","","","","PID 03 - Fuel status","","","","15fa2f3f667a5f5786eda5c83435ef16" +"Vehicle.OBD.EngineLoad","sensor","float","","percent","","","PID 04 - Engine load in percent - 0 = no load, 100 = full load","","","","a8fda8a1b4c6534aa49c447bafc1c700" +"Vehicle.OBD.CoolantTemperature","sensor","float","","celsius","","","PID 05 - Coolant temperature","","","","824892cdc72d5f92a38ef3136576edc8" +"Vehicle.OBD.ShortTermFuelTrim1","sensor","float","","percent","","","PID 06 - Short Term (immediate) Fuel Trim - Bank 1 - negative percent leaner, positive percent richer","","","","569c983874335fb392d4e82a002654cb" +"Vehicle.OBD.LongTermFuelTrim1","sensor","float","","percent","","","PID 07 - Long Term (learned) Fuel Trim - Bank 1 - negative percent leaner, positive percent richer","","","","1c203b11667150f0b4ee1be26a60c084" +"Vehicle.OBD.ShortTermFuelTrim2","sensor","float","","percent","","","PID 08 - Short Term (immediate) Fuel Trim - Bank 2 - negative percent leaner, positive percent richer","","","","53a39620773a523a8182169027169ec2" +"Vehicle.OBD.LongTermFuelTrim2","sensor","float","","percent","","","PID 09 - Long Term (learned) Fuel Trim - Bank 2 - negative percent leaner, positive percent richer","","","","b02aff2efce05632b5694a256e5b9ec7" +"Vehicle.OBD.FuelPressure","sensor","float","","kPa","","","PID 0A - Fuel pressure","","","","34e6b0689f025d7b9bfa1fc49bb30c0f" +"Vehicle.OBD.MAP","sensor","float","","kPa","","","PID 0B - Intake manifold pressure","","","","335991b1b53f56f097fea7b05d4db83b" +"Vehicle.OBD.EngineSpeed","sensor","float","","rpm","","","PID 0C - Engine speed measured as rotations per minute","","","","b682eea93b3e5874ab3b52e95a1fad37" +"Vehicle.OBD.Speed","sensor","float","","km/h","","","PID 0D - Vehicle speed","","","","91ed0bb43eb054759813cd784b071764" +"Vehicle.OBD.TimingAdvance","sensor","float","","degrees","","","PID 0E - Time advance","","","","35533b7e327d5f839b17c932b630767c" +"Vehicle.OBD.IntakeTemp","sensor","float","","celsius","","","PID 0F - Intake temperature","","","","7c108305178b5854b430a23e125588bd" +"Vehicle.OBD.MAF","sensor","float","","g/s","","","PID 10 - Grams of air drawn into engine per second","","","","f3acdf89fb865313883d5d3126f15518" +"Vehicle.OBD.ThrottlePosition","sensor","float","","percent","","","PID 11 - Throttle position - 0 = closed throttle, 100 = open throttle","","","","ec1d372020205bb4a846a014b33801e1" +"Vehicle.OBD.AirStatus","sensor","string","","","","","PID 12 - Secondary air status","","","","548f65bf59ed505a86dfaa1c33342e4d" +"Vehicle.OBD.OxygenSensorsIn2Banks","sensor","uint8","","","","","PID 13 - Presence of oxygen sensors in 2 banks. [A0..A3] == Bank 1, Sensors 1-4. [A4..A7] == Bank 2, Sensors 1-4","","","","0a9ba3f0a9b256d78bafd62ee8ce73cd" +"Vehicle.OBD.O2","branch","","","","","","Oxygen sensors (PID 14 - PID 1B)","","","","31f007df72af50f0925d2b4647682a4d" +"Vehicle.OBD.O2.Sensor1","branch","","","","","","Oxygen sensors (PID 14 - PID 1B)","","","","3aa8859203d4545083196a9690d72627" +"Vehicle.OBD.O2.Sensor1.Voltage","sensor","float","","V","","","PID 1x (byte A) - Sensor voltage","","","","e95f4ea667265ee3a68ab57b86ecbf66" +"Vehicle.OBD.O2.Sensor1.ShortTermFuelTrim","sensor","float","","percent","","","PID 1x (byte B) - Short term fuel trim","","","","ee366d40132456c0bce8cac3a837f16a" +"Vehicle.OBD.O2.Sensor2","branch","","","","","","Oxygen sensors (PID 14 - PID 1B)","","","","efcb337cf94056c8a724e76bcfee6765" +"Vehicle.OBD.O2.Sensor2.Voltage","sensor","float","","V","","","PID 1x (byte A) - Sensor voltage","","","","5f1781bde96b53ce9b810a5a56b7c8ed" +"Vehicle.OBD.O2.Sensor2.ShortTermFuelTrim","sensor","float","","percent","","","PID 1x (byte B) - Short term fuel trim","","","","92e6e172777457a9866ca045d0d79853" +"Vehicle.OBD.O2.Sensor3","branch","","","","","","Oxygen sensors (PID 14 - PID 1B)","","","","b8c145402b7a5cffaa2699ed61b056fa" +"Vehicle.OBD.O2.Sensor3.Voltage","sensor","float","","V","","","PID 1x (byte A) - Sensor voltage","","","","a86a1986f0fe5d25b6c438a00438ff60" +"Vehicle.OBD.O2.Sensor3.ShortTermFuelTrim","sensor","float","","percent","","","PID 1x (byte B) - Short term fuel trim","","","","66c300d35eb85e7387dc42528cca48d9" +"Vehicle.OBD.O2.Sensor4","branch","","","","","","Oxygen sensors (PID 14 - PID 1B)","","","","853945bce86c5c4f95081075ae32261c" +"Vehicle.OBD.O2.Sensor4.Voltage","sensor","float","","V","","","PID 1x (byte A) - Sensor voltage","","","","772cbfab91be59f7bbf3ec4140ffbcc4" +"Vehicle.OBD.O2.Sensor4.ShortTermFuelTrim","sensor","float","","percent","","","PID 1x (byte B) - Short term fuel trim","","","","b71dcf9d850c5d5686f14ad46cd2cae3" +"Vehicle.OBD.O2.Sensor5","branch","","","","","","Oxygen sensors (PID 14 - PID 1B)","","","","f48c76c9c7ec5ddcb6838ced0bd7517b" +"Vehicle.OBD.O2.Sensor5.Voltage","sensor","float","","V","","","PID 1x (byte A) - Sensor voltage","","","","155a0816093b5aee8012ed2a8d532b7f" +"Vehicle.OBD.O2.Sensor5.ShortTermFuelTrim","sensor","float","","percent","","","PID 1x (byte B) - Short term fuel trim","","","","7604de26198b51e28a441f79b1d84242" +"Vehicle.OBD.O2.Sensor6","branch","","","","","","Oxygen sensors (PID 14 - PID 1B)","","","","5269c1877ded507b87d7d1d7bec10605" +"Vehicle.OBD.O2.Sensor6.Voltage","sensor","float","","V","","","PID 1x (byte A) - Sensor voltage","","","","85430592fb795e848d7bb91e6b9f1e00" +"Vehicle.OBD.O2.Sensor6.ShortTermFuelTrim","sensor","float","","percent","","","PID 1x (byte B) - Short term fuel trim","","","","2fb034769cab5089986d90bf7f9000ca" +"Vehicle.OBD.O2.Sensor7","branch","","","","","","Oxygen sensors (PID 14 - PID 1B)","","","","4b565102e4a052aa8aa64f27dc678ce3" +"Vehicle.OBD.O2.Sensor7.Voltage","sensor","float","","V","","","PID 1x (byte A) - Sensor voltage","","","","23984a68e63f532bab18679e1174130d" +"Vehicle.OBD.O2.Sensor7.ShortTermFuelTrim","sensor","float","","percent","","","PID 1x (byte B) - Short term fuel trim","","","","81f34b16b5e05d1ab159de9474eaf5bc" +"Vehicle.OBD.O2.Sensor8","branch","","","","","","Oxygen sensors (PID 14 - PID 1B)","","","","d5eef24c35f1561982127404b50ece11" +"Vehicle.OBD.O2.Sensor8.Voltage","sensor","float","","V","","","PID 1x (byte A) - Sensor voltage","","","","23e057b3629a5136bb585638725fe0a2" +"Vehicle.OBD.O2.Sensor8.ShortTermFuelTrim","sensor","float","","percent","","","PID 1x (byte B) - Short term fuel trim","","","","1699eb2267615e258259e480be0fa606" +"Vehicle.OBD.OBDStandards","attribute","uint8","","","","","PID 1C - OBD standards this vehicle conforms to","","","","1aa8d7d055cf5a29a31b04a12124f673" +"Vehicle.OBD.OxygenSensorsIn4Banks","sensor","uint8","","","","","PID 1D - Presence of oxygen sensors in 4 banks. Similar to PID 13, but [A0..A7] == [B1S1, B1S2, B2S1, B2S2, B3S1, B3S2, B4S1, B4S2]","","","","41d3377813d651aa9b9344ba9fd2f880" +"Vehicle.OBD.IsPTOActive","sensor","boolean","","","","","PID 1E - Auxiliary input status (power take off)","","","","ce291dc40bba5a969e57b17f11ae23a9" +"Vehicle.OBD.RunTime","sensor","float","","s","","","PID 1F - Engine run time","","","","acf70773752256d1a227ab48257624b5" +"Vehicle.OBD.DistanceWithMIL","sensor","float","","km","","","PID 21 - Distance traveled with MIL on","","","","a9a522e343f25522b08f11e81bb91349" +"Vehicle.OBD.FuelRailPressureVac","sensor","float","","kPa","","","PID 22 - Fuel rail pressure relative to vacuum","","","","b3b0adf44aa3572fa07e7434993e6458" +"Vehicle.OBD.FuelRailPressureDirect","sensor","float","","kPa","","","PID 23 - Fuel rail pressure direct inject","","","","039cb7bf1a8356a98d09eaf4fc029fe9" +"Vehicle.OBD.O2WR","branch","","","","","","Wide range/band oxygen sensors (PID 24 - 2B and PID 34 - 3B)","","","","a439f2bc16575318afe20d0bc6a8cacf" +"Vehicle.OBD.O2WR.Sensor1","branch","","","","","","Wide range/band oxygen sensors (PID 24 - 2B and PID 34 - 3B)","","","","496074cec04a5260b60fd39bb7ed1479" +"Vehicle.OBD.O2WR.Sensor1.Lambda","sensor","float","","","","","PID 2x (byte AB) and PID 3x (byte AB) - Lambda for wide range/band oxygen sensor","","","","b809083454a5516f995477c59bf4d3c6" +"Vehicle.OBD.O2WR.Sensor1.Voltage","sensor","float","","V","","","PID 2x (byte CD) - Voltage for wide range/band oxygen sensor","","","","396251cbfa5a57ffb1dd743298dfcdf9" +"Vehicle.OBD.O2WR.Sensor1.Current","sensor","float","","A","","","PID 3x (byte CD) - Current for wide range/band oxygen sensor","","","","bb4c70d9d2ae56c8a9a3be446db6f54c" +"Vehicle.OBD.O2WR.Sensor2","branch","","","","","","Wide range/band oxygen sensors (PID 24 - 2B and PID 34 - 3B)","","","","079f9960f75d5f399df7ff86fcea8f0c" +"Vehicle.OBD.O2WR.Sensor2.Lambda","sensor","float","","","","","PID 2x (byte AB) and PID 3x (byte AB) - Lambda for wide range/band oxygen sensor","","","","ce55aed0e8705a49970566db71ebcf90" +"Vehicle.OBD.O2WR.Sensor2.Voltage","sensor","float","","V","","","PID 2x (byte CD) - Voltage for wide range/band oxygen sensor","","","","a784675c3b765d42ad023d8ee412be26" +"Vehicle.OBD.O2WR.Sensor2.Current","sensor","float","","A","","","PID 3x (byte CD) - Current for wide range/band oxygen sensor","","","","442ab33180ca5028a37a487056ba4a51" +"Vehicle.OBD.O2WR.Sensor3","branch","","","","","","Wide range/band oxygen sensors (PID 24 - 2B and PID 34 - 3B)","","","","a8a83d3e33f9584b824088e830bcbaec" +"Vehicle.OBD.O2WR.Sensor3.Lambda","sensor","float","","","","","PID 2x (byte AB) and PID 3x (byte AB) - Lambda for wide range/band oxygen sensor","","","","f2ae7c781b0a5dcf8db91558e3cf4c13" +"Vehicle.OBD.O2WR.Sensor3.Voltage","sensor","float","","V","","","PID 2x (byte CD) - Voltage for wide range/band oxygen sensor","","","","a78f7621a3f75df2adc1dc940219834a" +"Vehicle.OBD.O2WR.Sensor3.Current","sensor","float","","A","","","PID 3x (byte CD) - Current for wide range/band oxygen sensor","","","","c942468e349e5aaebde4d90ee0bc3814" +"Vehicle.OBD.O2WR.Sensor4","branch","","","","","","Wide range/band oxygen sensors (PID 24 - 2B and PID 34 - 3B)","","","","bb67047ddad158ba98876a6a87d02e97" +"Vehicle.OBD.O2WR.Sensor4.Lambda","sensor","float","","","","","PID 2x (byte AB) and PID 3x (byte AB) - Lambda for wide range/band oxygen sensor","","","","be09013f423c588eae9c06da9ddf290f" +"Vehicle.OBD.O2WR.Sensor4.Voltage","sensor","float","","V","","","PID 2x (byte CD) - Voltage for wide range/band oxygen sensor","","","","abeca90ba22d5c32a34ee907cedf3192" +"Vehicle.OBD.O2WR.Sensor4.Current","sensor","float","","A","","","PID 3x (byte CD) - Current for wide range/band oxygen sensor","","","","f16b31fde63a516db04cb44feaa7c27b" +"Vehicle.OBD.O2WR.Sensor5","branch","","","","","","Wide range/band oxygen sensors (PID 24 - 2B and PID 34 - 3B)","","","","01c4160d39af5db59c66db844646195e" +"Vehicle.OBD.O2WR.Sensor5.Lambda","sensor","float","","","","","PID 2x (byte AB) and PID 3x (byte AB) - Lambda for wide range/band oxygen sensor","","","","16a957200f5c51f89824bbb76a23b9c0" +"Vehicle.OBD.O2WR.Sensor5.Voltage","sensor","float","","V","","","PID 2x (byte CD) - Voltage for wide range/band oxygen sensor","","","","699c4db2439f51af8465e823687018b8" +"Vehicle.OBD.O2WR.Sensor5.Current","sensor","float","","A","","","PID 3x (byte CD) - Current for wide range/band oxygen sensor","","","","40494cb5826554929f5ecadd5b9173fd" +"Vehicle.OBD.O2WR.Sensor6","branch","","","","","","Wide range/band oxygen sensors (PID 24 - 2B and PID 34 - 3B)","","","","cff12c30bde957798daaa3a91758b48b" +"Vehicle.OBD.O2WR.Sensor6.Lambda","sensor","float","","","","","PID 2x (byte AB) and PID 3x (byte AB) - Lambda for wide range/band oxygen sensor","","","","fdae9bb9a3a45b4680450f0347cf6d66" +"Vehicle.OBD.O2WR.Sensor6.Voltage","sensor","float","","V","","","PID 2x (byte CD) - Voltage for wide range/band oxygen sensor","","","","304c181c76d55c3abe75382a935c7bde" +"Vehicle.OBD.O2WR.Sensor6.Current","sensor","float","","A","","","PID 3x (byte CD) - Current for wide range/band oxygen sensor","","","","06a38b6b4784545bb637279e96d48eb5" +"Vehicle.OBD.O2WR.Sensor7","branch","","","","","","Wide range/band oxygen sensors (PID 24 - 2B and PID 34 - 3B)","","","","44459df1f25f5d43a07b00f2bad65ef5" +"Vehicle.OBD.O2WR.Sensor7.Lambda","sensor","float","","","","","PID 2x (byte AB) and PID 3x (byte AB) - Lambda for wide range/band oxygen sensor","","","","9221a5289157538b9dcaa0d961c335fa" +"Vehicle.OBD.O2WR.Sensor7.Voltage","sensor","float","","V","","","PID 2x (byte CD) - Voltage for wide range/band oxygen sensor","","","","0ad1d79dcce65c00ac48421b5b54ca0e" +"Vehicle.OBD.O2WR.Sensor7.Current","sensor","float","","A","","","PID 3x (byte CD) - Current for wide range/band oxygen sensor","","","","6ed46315325d540eb95c86ec61eef8e4" +"Vehicle.OBD.O2WR.Sensor8","branch","","","","","","Wide range/band oxygen sensors (PID 24 - 2B and PID 34 - 3B)","","","","b8865e72055d52a086f6935d5c188cc1" +"Vehicle.OBD.O2WR.Sensor8.Lambda","sensor","float","","","","","PID 2x (byte AB) and PID 3x (byte AB) - Lambda for wide range/band oxygen sensor","","","","c56db1195fa3519ab6718ab57d2cd543" +"Vehicle.OBD.O2WR.Sensor8.Voltage","sensor","float","","V","","","PID 2x (byte CD) - Voltage for wide range/band oxygen sensor","","","","ab7d6c739f025782bba640e58123f0c8" +"Vehicle.OBD.O2WR.Sensor8.Current","sensor","float","","A","","","PID 3x (byte CD) - Current for wide range/band oxygen sensor","","","","96de3c3b036c50c2978ab2aa490d4d9e" +"Vehicle.OBD.CommandedEGR","sensor","float","","percent","","","PID 2C - Commanded exhaust gas recirculation (EGR)","","","","0265890a4a695ee6952c9b9f565ddaa5" +"Vehicle.OBD.EGRError","sensor","float","","percent","","","PID 2D - Exhaust gas recirculation (EGR) error","","","","80a7000c5c7b5444b5571a26264061e5" +"Vehicle.OBD.CommandedEVAP","sensor","float","","percent","","","PID 2E - Commanded evaporative purge (EVAP) valve","","","","5e6295d04a9159b88f4698b561b86842" +"Vehicle.OBD.FuelLevel","sensor","float","","percent","","","PID 2F - Fuel level in the fuel tank","","","","fd39813424ee5cd08c44714b35697287" +"Vehicle.OBD.WarmupsSinceDTCClear","sensor","uint8","","","","","PID 30 - Number of warm-ups since codes cleared","","","","a63ba60721785fc591e3dd067c4dc2ae" +"Vehicle.OBD.DistanceSinceDTCClear","sensor","float","","km","","","PID 31 - Distance traveled since codes cleared","","","","0da628e2c69d561eb86216ddcb6e7b2a" +"Vehicle.OBD.EVAPVaporPressure","sensor","float","","Pa","","","PID 32 - Evaporative purge (EVAP) system pressure","","","","70b5dae2ffd0561eab73efed8ad2f0ad" +"Vehicle.OBD.BarometricPressure","sensor","float","","kPa","","","PID 33 - Barometric pressure","","","","1966bfff4d235767bfd9a21afb445ac7" +"Vehicle.OBD.Catalyst","branch","","","","","","Catalyst signals","","","","4eb0b191d6445de081f3f3f759af31c2" +"Vehicle.OBD.Catalyst.Bank1","branch","","","","","","Catalyst bank 1 signals","","","","0c3aaf014ba95b938b639d4202ef8b25" +"Vehicle.OBD.Catalyst.Bank1.Temperature1","sensor","float","","celsius","","","PID 3C - Catalyst temperature from bank 1, sensor 1","","","","5a770f13939e5d069682d408f160a895" +"Vehicle.OBD.Catalyst.Bank1.Temperature2","sensor","float","","celsius","","","PID 3E - Catalyst temperature from bank 1, sensor 2","","","","ca9419a5d23b5937af23b51d823722fa" +"Vehicle.OBD.Catalyst.Bank2","branch","","","","","","Catalyst bank 2 signals","","","","9a20459754755146a3b9608bf6384835" +"Vehicle.OBD.Catalyst.Bank2.Temperature1","sensor","float","","celsius","","","PID 3D - Catalyst temperature from bank 2, sensor 1","","","","011658e4ee89502c9a33877c92dbf888" +"Vehicle.OBD.Catalyst.Bank2.Temperature2","sensor","float","","celsius","","","PID 3F - Catalyst temperature from bank 2, sensor 2","","","","f60c68f0ebca5fcf97086ce04e16d661" +"Vehicle.OBD.DriveCycleStatus","branch","","","","","","PID 41 - OBD status for the current drive cycle","","","","5215e28062f75154822789b8a5f30630" +"Vehicle.OBD.DriveCycleStatus.IsMILOn","sensor","boolean","","","","","Malfunction Indicator Light (MIL) - False = Off, True = On","","","","e367394c9a075eef8fd66499e3d9cf14" +"Vehicle.OBD.DriveCycleStatus.DTCCount","sensor","uint8","","","","","Number of sensor Trouble Codes (DTC)","","","","312856f746ff560e8098c19196964d3b" +"Vehicle.OBD.DriveCycleStatus.IgnitionType","sensor","string","","","","","Type of the ignition for ICE - spark = spark plug ignition, compression = self-igniting (Diesel engines)","","['SPARK', 'COMPRESSION']","","1aeb7b6d025f5a8693104824abaa1c49" +"Vehicle.OBD.ControlModuleVoltage","sensor","float","","V","","","PID 42 - Control module voltage","","","","59e072b932605ffc88a299c874d885c4" +"Vehicle.OBD.AbsoluteLoad","sensor","float","","percent","","","PID 43 - Absolute load value","","","","b3dd889a42ce5de9a7904b7196ae325c" +"Vehicle.OBD.CommandedEquivalenceRatio","sensor","float","","ratio","","","PID 44 - Commanded equivalence ratio","","","","104e39e816f65fa791d0afa24603292b" +"Vehicle.OBD.RelativeThrottlePosition","sensor","float","","percent","","","PID 45 - Relative throttle position","","","","54ecf7dd671c5053aac4bc1bb061d64b" +"Vehicle.OBD.AmbientAirTemperature","sensor","float","","celsius","","","PID 46 - Ambient air temperature","","","","220a90f183c5583ea8b8b6454d774517" +"Vehicle.OBD.ThrottlePositionB","sensor","float","","percent","","","PID 47 - Absolute throttle position B","","","","701712a565ed5bf8b6630487a7152c87" +"Vehicle.OBD.ThrottlePositionC","sensor","float","","percent","","","PID 48 - Absolute throttle position C","","","","06f162dc00a85f628f9d5d1bc952665c" +"Vehicle.OBD.AcceleratorPositionD","sensor","float","","percent","","","PID 49 - Accelerator pedal position D","","","","7e63256081ac5a7b8a28a6fa3c2c2ff9" +"Vehicle.OBD.AcceleratorPositionE","sensor","float","","percent","","","PID 4A - Accelerator pedal position E","","","","4104e7fc25355e25b4522d233565d84b" +"Vehicle.OBD.AcceleratorPositionF","sensor","float","","percent","","","PID 4B - Accelerator pedal position F","","","","95f5c2a209a857ff930e2f8e32ac2d3f" +"Vehicle.OBD.ThrottleActuator","sensor","float","","percent","","","PID 4C - Commanded throttle actuator","","","","49a19905a1005ee3abe0c0a84d7112d1" +"Vehicle.OBD.RunTimeMIL","sensor","float","","min","","","PID 4D - Run time with MIL on","","","","555604a484535f60adf8894a6bd895b6" +"Vehicle.OBD.TimeSinceDTCCleared","sensor","float","","min","","","PID 4E - Time since trouble codes cleared","","","","66ea3984a2585dcdaaf6452eef835c0d" +"Vehicle.OBD.MaxMAF","sensor","float","","g/s","","","PID 50 - Maximum flow for mass air flow sensor","","","","e21826479f715ee7afe8dc485f109b11" +"Vehicle.OBD.FuelType","attribute","uint8","","","0","23","PID 51 - Fuel type","","","","aefb45bdd8035904b0c8f3ffcedc53a9" +"Vehicle.OBD.EthanolPercent","sensor","float","","percent","","","PID 52 - Percentage of ethanol in the fuel","","","","a207e7de17e1520c894b412af6f2522c" +"Vehicle.OBD.EVAPVaporPressureAbsolute","sensor","float","","kPa","","","PID 53 - Absolute evaporative purge (EVAP) system pressure","","","","ef188a1e1a1356f7bc425081e3e00805" +"Vehicle.OBD.EVAPVaporPressureAlternate","sensor","float","","Pa","","","PID 54 - Alternate evaporative purge (EVAP) system pressure","","","","68eaba3c79975d61bc35b92cd3e5e8d0" +"Vehicle.OBD.ShortTermO2Trim1","sensor","float","","percent","","","PID 55 (byte A) - Short term secondary O2 trim - Bank 1","","","","be7ed33a854557ba802da0c51f9f4564" +"Vehicle.OBD.ShortTermO2Trim3","sensor","float","","percent","","","PID 55 (byte B) - Short term secondary O2 trim - Bank 3","","","","af58212df970568b9edcc5e58fa36f8d" +"Vehicle.OBD.LongTermO2Trim1","sensor","float","","percent","","","PID 56 (byte A) - Long term secondary O2 trim - Bank 1","","","","9a9586e29a02567e9920cb9b0aa2e3f5" +"Vehicle.OBD.LongTermO2Trim3","sensor","float","","percent","","","PID 56 (byte B) - Long term secondary O2 trim - Bank 3","","","","50ea51ad343a5e59b1d214053e522a45" +"Vehicle.OBD.ShortTermO2Trim2","sensor","float","","percent","","","PID 57 (byte A) - Short term secondary O2 trim - Bank 2","","","","c8b962f8990e51d294621408ceaa21d9" +"Vehicle.OBD.ShortTermO2Trim4","sensor","float","","percent","","","PID 57 (byte B) - Short term secondary O2 trim - Bank 4","","","","8ef0516c0c965fd6aecbacd6b9120a5b" +"Vehicle.OBD.LongTermO2Trim2","sensor","float","","percent","","","PID 58 (byte A) - Long term secondary O2 trim - Bank 2","","","","e579f6c930605b389e8ce2d7edd92999" +"Vehicle.OBD.LongTermO2Trim4","sensor","float","","percent","","","PID 58 (byte B) - Long term secondary O2 trim - Bank 4","","","","f9c20edd12f456e5ace21581cea484bd" +"Vehicle.OBD.FuelRailPressureAbsolute","sensor","float","","kPa","","","PID 59 - Absolute fuel rail pressure","","","","83c88b13d30153949eeca1b1180a9061" +"Vehicle.OBD.RelativeAcceleratorPosition","sensor","float","","percent","","","PID 5A - Relative accelerator pedal position","","","","e25de9aacad3549285b4fb234f10be8f" +"Vehicle.OBD.HybridBatteryRemaining","sensor","float","","percent","","","PID 5B - Remaining life of hybrid battery","","","","c9517b6243df5e8d8f3aa3e57f71ec37" +"Vehicle.OBD.OilTemperature","sensor","float","","celsius","","","PID 5C - Engine oil temperature","","","","ef3dfc11085d5077b363b1a4e8e4a84e" +"Vehicle.OBD.FuelInjectionTiming","sensor","float","","degrees","","","PID 5D - Fuel injection timing","","","","ab4869446f5357d6936838983e1b8949" +"Vehicle.OBD.FuelRate","sensor","float","","l/h","","","PID 5E - Engine fuel rate","","","","4ab7c2b710f95ceb9c7d01d19dabac38" +"Vehicle.Driver","branch","","","","","","Driver data.","","","","1cac57e7b7e756dc8a154eaacbce6426" +"Vehicle.Driver.Identifier","branch","","","","","","Identifier attributes based on OAuth 2.0.","","","","89705397069c5ec58d607318f2ff0ea8" +"Vehicle.Driver.Identifier.Subject","sensor","string","","","","","Subject for the authentication of the occupant e.g. UserID 7331677.","","","","b41ec688af265f10824bc9635989ac55" +"Vehicle.Driver.Identifier.Issuer","sensor","string","","","","","Unique Issuer for the authentication of the occupant e.g. https://accounts.funcorp.com.","","","","ee7988d26d7156d2a030ecc506ea97e7" +"Vehicle.Driver.DistractionLevel","sensor","float","","percent","0","100","Distraction level of the driver, which can be evaluated by multiple factors e.g. driving situation, acoustical or optical signals inside the cockpit, ongoing phone calls.","","","","cb35ec0b924e58979e1469146d65c3fa" +"Vehicle.Driver.IsEyesOnRoad","sensor","boolean","","","","","Has driver the eyes on road or not?","","","","625e5009f1145aa0b797ee6c335ca2fe" +"Vehicle.Driver.IsHandsOnWheel","sensor","boolean","","","","","Are the driver's hands on the steering wheel or not?","","","","90d7dc2c408c528d941829ff88075f24" +"Vehicle.Driver.AttentiveProbability","sensor","float","","percent","0","100","Probability of attentiveness of the driver.","","","","fcd202467afb533fbbf9e7da89cc1cee" +"Vehicle.Driver.FatigueLevel","sensor","float","","percent","0","100","Fatigue level of the driver, which can be evaluated by multiple factors e.g. trip time, behaviour of steering, eye status.","","","","49b1626295705a79ae20d8a270c48b6b" +"Vehicle.Driver.HeartRate","sensor","uint16","","bpm","","","Heart rate of the driver.","","","","d71516905f785c4da867a2f86e774d93" +"Vehicle.Exterior","branch","","","","","","Information about exterior measured by vehicle.","","","","06c5def549f3580e8cdaffa3e0f5d25c" +"Vehicle.Exterior.AirTemperature","sensor","float","","celsius","","","Air temperature outside the vehicle.","","","","a38d3f5dfeb35317aca8b90453dc1a75" +"Vehicle.Exterior.Humidity","sensor","float","","percent","0","100","Relative humidity outside the vehicle. 0 = Dry, 100 = Air fully saturated.","","","","6c785ec5d9a5534f98be7ce198d25d6b" +"Vehicle.Exterior.LightIntensity","sensor","float","","percent","0","100","Light intensity outside the vehicle. 0 = No light detected, 100 = Fully lit.","Mapping to physical units and calculation method is sensor specific.","","","9b46b70490f853e891e1cc35dd08dddc" +"Vehicle.Service","branch","","","","","","Service data.","","","","b6463772705b56a7a993e23601bd3d47" +"Vehicle.Service.IsServiceDue","sensor","boolean","","","","","Indicates if vehicle needs service (of any kind). True = Service needed now or in the near future. False = No known need for service.","","","","3e28f85ccccd5702b9adbe9a761ea1b4" +"Vehicle.Service.DistanceToService","sensor","float","","km","","","Remaining distance to service (of any kind). Negative values indicate service overdue.","","","","6f4347ce149759819572c8c3a17e8d93" +"Vehicle.Service.TimeToService","sensor","int32","","s","","","Remaining time to service (of any kind). Negative values indicate service overdue.","","","","c968be91a5685fa9ae30b84a0f91934e" +"Vehicle.Connectivity","branch","","","","","","Connectivity data.","","","","89c267fccea35f3da9871cca2b4dc4df" +"Vehicle.Connectivity.IsConnectivityAvailable","sensor","boolean","","","","","Indicates if connectivity between vehicle and cloud is available. True = Connectivity is available. False = Connectivity is not available.","This signal can be used by onboard vehicle services to decide what features that shall be offered to the driver, for example disable the 'check for update' button if vehicle does not have connectivity.","","","b6d11be2a6565996b68ffb07a96595a7" +"Vehicle.DIMO","branch","","","","","","dimo specific metadata.","","","","9236bd87666d5490bfe805912da4dbe2" +"Vehicle.DIMO.Subject","sensor","string","","","","","subjet of this vehicle data","","","","fadb61b0f4e855a795252e9abfb4c28e" +"Vehicle.DIMO.Timestamp","sensor","string","","iso8601","","","timestamp of when this data was colllected","","","","bef0836ce4815bae98ae7c23928d630c" +"Vehicle.DIMO.Source","sensor","string","","","","","where the data was sourced from","","","","f7b9d7f7f2d85c09a4f1c6cd3b640a57" +"Vehicle.DIMO.Type","sensor","string","","","","","type of data collected","","","","e8e4c8506052543eabe136cb1198a030" +"Vehicle.DIMO.DefinitionID","sensor","string","","","","","ID for the vehicles definition","","","","3031d4c0bd3f578286f6f0e077377c18" +"Vehicle.DIMO.VehicleID","sensor","string","","","","","unque DIMO ID for the vehicle","","","","241c912ada4054628813c9a7b9b73914"