From 147467ed86db52f6c0f2d69e4521ab9d0918f7ec Mon Sep 17 00:00:00 2001 From: Orhun Ucak <72708168+Giaccomole@users.noreply.github.com> Date: Wed, 22 Jan 2025 08:53:20 +0100 Subject: [PATCH] D3-Statistics (#801) * Changes to intro page - embedded from observable Signed-off-by: Orhun Ucak * Prettier website and enabled iframe in config Signed-off-by: Orhun Ucak * New line + Signed-off-by test Signed-off-by: Orhun Ucak * Second Signoff test Signed-off-by: Orhun Ucak * Third Signoff test Signed-off-by: Orhun Ucak * Image was changed Signed-off-by: Orhun Ucak * Image paths corrected Signed-off-by: Orhun Ucak * Observable abandoned for 3 plots Signed-off-by: Orhun Ucak * Added newlines to html Signed-off-by: Orhun Ucak * Added newlines to html Signed-off-by: Orhun Ucak * Added newlines at the ends of the data files Signed-off-by: Orhun Ucak * Ran pre-commit Signed-off-by: Orhun Ucak --------- Signed-off-by: Orhun Ucak --- docs-gen/config.toml | 5 + docs-gen/content/introduction/_index.md | 23 +- docs-gen/layouts/shortcodes/donut_chart.html | 168 + docs-gen/layouts/shortcodes/parallelsets.html | 181 + .../layouts/shortcodes/radialcluster.html | 192 + .../modified_vss_compact_metadata copy.csv | 619 ++ docs-gen/static/data/outputplus.json | 5868 +++++++++++++++++ docs-gen/static/data/piechartnotexpanded.csv | 5 + docs-gen/static/images/Versions_stacked.png | Bin 0 -> 29211 bytes docs-gen/static/images/datatypes_2.png | Bin 0 -> 35577 bytes docs-gen/static/images/types_6.png | Bin 0 -> 23367 bytes docs-gen/static/images/types_donut_chart.png | Bin 0 -> 75545 bytes 12 files changed, 7060 insertions(+), 1 deletion(-) create mode 100644 docs-gen/layouts/shortcodes/donut_chart.html create mode 100644 docs-gen/layouts/shortcodes/parallelsets.html create mode 100644 docs-gen/layouts/shortcodes/radialcluster.html create mode 100644 docs-gen/static/data/modified_vss_compact_metadata copy.csv create mode 100644 docs-gen/static/data/outputplus.json create mode 100644 docs-gen/static/data/piechartnotexpanded.csv create mode 100644 docs-gen/static/images/Versions_stacked.png create mode 100644 docs-gen/static/images/datatypes_2.png create mode 100644 docs-gen/static/images/types_6.png create mode 100644 docs-gen/static/images/types_donut_chart.png diff --git a/docs-gen/config.toml b/docs-gen/config.toml index 8de348d7d..615a06855 100644 --- a/docs-gen/config.toml +++ b/docs-gen/config.toml @@ -25,3 +25,8 @@ weight = 12 # Generation of JSON index to allow search [outputs] home = ['html', 'rss', 'search', 'searchpage'] + +# So that raw HTML content is enabled in Hugo project + +[markup.goldmark.renderer] +unsafe = true diff --git a/docs-gen/content/introduction/_index.md b/docs-gen/content/introduction/_index.md index 0bfe1d156..15b5f1d77 100644 --- a/docs-gen/content/introduction/_index.md +++ b/docs-gen/content/introduction/_index.md @@ -4,4 +4,25 @@ weight: 10 chapter: false --- -Discover what the Vehicle Signal Specification is all about. + +## VSS Tree Model + +The diagram below shows a generated tree of the VSS. Here you can see a mapping for the current catalog of signals related to vehicles. Click a Branch Node to expand or collapse the tree. (Slower animation while pressing the altKey ("option" key for Mac OS-X).) + + +{{< radialcluster >}} + +--- +## Current Population of the model - in respect to VSS Types and Datatypes + + +Click on the nodes to highlight the links, or hover over the links to see their exact population. + +{{< parallelsets >}} + +--- +## Releases and types + +How the model changed in major releases. + +{{< donut_chart >}} diff --git a/docs-gen/layouts/shortcodes/donut_chart.html b/docs-gen/layouts/shortcodes/donut_chart.html new file mode 100644 index 000000000..ad2bfe212 --- /dev/null +++ b/docs-gen/layouts/shortcodes/donut_chart.html @@ -0,0 +1,168 @@ +
+
+
+
+ diff --git a/docs-gen/layouts/shortcodes/parallelsets.html b/docs-gen/layouts/shortcodes/parallelsets.html new file mode 100644 index 000000000..d5d6d362a --- /dev/null +++ b/docs-gen/layouts/shortcodes/parallelsets.html @@ -0,0 +1,181 @@ +
+ diff --git a/docs-gen/layouts/shortcodes/radialcluster.html b/docs-gen/layouts/shortcodes/radialcluster.html new file mode 100644 index 000000000..6d2e9606b --- /dev/null +++ b/docs-gen/layouts/shortcodes/radialcluster.html @@ -0,0 +1,192 @@ +
+ diff --git a/docs-gen/static/data/modified_vss_compact_metadata copy.csv b/docs-gen/static/data/modified_vss_compact_metadata copy.csv new file mode 100644 index 000000000..a0355b2f5 --- /dev/null +++ b/docs-gen/static/data/modified_vss_compact_metadata copy.csv @@ -0,0 +1,619 @@ +property,type,datatype,dummy +static,attribute,float,0 +static,attribute,string,0 +static,attribute,uint16,0 +static,attribute,float,0 +static,attribute,string,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,string,0 +static,attribute,float,0 +static,attribute,float,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,string,0 +dynamic,sensor,string,0 +dynamic,sensor,int32,0 +dynamic,sensor,boolean,0 +dynamic,sensor,uint16,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +static,attribute,float,0 +dynamic,sensor,string,0 +dynamic,sensor,int32,0 +dynamic,sensor,float,0 +static,attribute,float,0 +dynamic,sensor,float,0 +dynamic,sensor,string,0 +dynamic,sensor,int32,0 +dynamic,sensor,uint16,0 +dynamic,sensor,uint16,0 +dynamic,sensor,uint8,0 +dynamic,sensor,uint16,0 +dynamic,sensor,uint16,0 +dynamic,sensor,int16,0 +static,attribute,float,0 +dynamic,sensor,uint8,0 +dynamic,sensor,uint32,0 +dynamic,sensor,boolean,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +static,attribute,string,0 +static,attribute,int8,0 +static,attribute,string,0 +dynamic,sensor,float,0 +dynamic,sensor,int8,0 +dynamic,actuator,int8,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,sensor,float,0 +dynamic,actuator,float,0 +dynamic,sensor,uint8,0 +dynamic,actuator,float,0 +dynamic,actuator,float,0 +dynamic,actuator,float,0 +static,attribute,string,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +dynamic,sensor,int32,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +static,attribute,float,0 +dynamic,sensor,float,0 +dynamic,sensor,string,0 +dynamic,sensor,int32,0 +dynamic,sensor,int16,0 +dynamic,sensor,int16,0 +static,attribute,string,0 +static,attribute,string,0 +dynamic,sensor,string,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,uint16,0 +dynamic,sensor,float,0 +dynamic,sensor,uint16,0 +dynamic,sensor,float,0 +static,attribute,uint16,0 +dynamic,sensor,uint16,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,uint32,0 +dynamic,sensor,uint32,0 +static,attribute,string,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,uint8,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,actuator,string,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +dynamic,actuator,string,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,string,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,string,0 +dynamic,sensor,double,0 +dynamic,sensor,double,0 +dynamic,sensor,double,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,uint32,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,actuator,float,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,float,0 +dynamic,sensor,float,0 +dynamic,sensor,uint8,0 +dynamic,sensor,uint32,0 +dynamic,sensor,uint32,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +static,attribute,string,0 +dynamic,actuator,boolean,0 +dynamic,sensor,float,0 +dynamic,sensor,uint32,0 +dynamic,sensor,uint32,0 +static,attribute,string,0 +dynamic,actuator,uint8,0 +dynamic,actuator,boolean,0 +static,attribute,string,0 +static,attribute,string,0 +dynamic,actuator,boolean,0 +dynamic,actuator,uint8,0 +dynamic,actuator,string,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,uint8,0 +dynamic,actuator,string,0 +dynamic,actuator,boolean,0 +dynamic,sensor,uint8,0 +dynamic,actuator,string,0 +dynamic,actuator,uint8,0 +dynamic,actuator,string,0 +dynamic,actuator,uint8,0 +dynamic,actuator,float,0 +dynamic,actuator,float,0 +dynamic,sensor,float,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,uint8,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,uint8,0 +dynamic,actuator,string,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,string,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,int8,0 +dynamic,actuator,int8,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,float,0 +dynamic,actuator,uint8,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,uint8,0 +dynamic,actuator,string,0 +dynamic,actuator,uint8,0 +dynamic,actuator,float,0 +dynamic,actuator,string,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,float,0 +dynamic,actuator,uint8,0 +dynamic,actuator,boolean,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,sensor,string,0 +dynamic,sensor,string,0 +dynamic,sensor,string,0 +dynamic,sensor,string,0 +dynamic,actuator,float,0 +dynamic,sensor,string,0 +dynamic,actuator,string,0 +dynamic,actuator,uint8,0 +dynamic,actuator,double,0 +dynamic,actuator,double,0 +dynamic,actuator,string,0 +dynamic,actuator,uint8,0 +dynamic,actuator,string,0 +dynamic,actuator,boolean,0 +dynamic,sensor,string,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,actuator,float,0 +dynamic,actuator,string,0 +dynamic,actuator,boolean,0 +dynamic,sensor,string,0 +dynamic,actuator,uint16,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +static,attribute,string,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,actuator,uint8,0 +dynamic,actuator,boolean,0 +dynamic,sensor,int8,0 +dynamic,actuator,string,0 +dynamic,actuator,boolean,0 +dynamic,actuator,uint8,0 +dynamic,actuator,string,0 +dynamic,actuator,uint8,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,uint8,0 +dynamic,actuator,boolean,0 +dynamic,actuator,uint8,0 +dynamic,actuator,string,0 +dynamic,actuator,boolean,0 +dynamic,actuator,uint8,0 +dynamic,actuator,string,0 +dynamic,actuator,string,0 +dynamic,actuator,boolean,0 +dynamic,actuator,uint8,0 +dynamic,actuator,string,0 +dynamic,actuator,boolean,0 +dynamic,actuator,uint8,0 +dynamic,actuator,string,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,uint8,0 +dynamic,actuator,string,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,uint8,0 +dynamic,actuator,string,0 +static,attribute,uint8,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,string,0 +dynamic,sensor,string,0 +dynamic,sensor,boolean,0 +dynamic,actuator,uint16,0 +dynamic,actuator,int8,0 +dynamic,actuator,uint8,0 +dynamic,actuator,uint16,0 +dynamic,actuator,uint16,0 +dynamic,actuator,float,0 +dynamic,actuator,float,0 +dynamic,actuator,float,0 +dynamic,actuator,uint8,0 +dynamic,actuator,float,0 +dynamic,actuator,uint16,0 +dynamic,actuator,uint8,0 +dynamic,actuator,float,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,int8,0 +static,attribute,string,0 +static,attribute,uint8,0 +static,attribute,uint8,0 +dynamic,sensor,string,0 +dynamic,actuator,uint8,0 +dynamic,actuator,boolean,0 +dynamic,sensor,string,0 +static,attribute,string,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,actuator,float,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,actuator,uint8,0 +dynamic,actuator,boolean,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,uint8,0 +static,attribute,float,0 +static,attribute,float,0 +dynamic,sensor,float,0 +static,attribute,float,0 +static,attribute,uint16,0 +static,attribute,uint8,0 +dynamic,sensor,uint8,0 +dynamic,sensor,boolean,0 +dynamic,sensor,uint8,0 +dynamic,sensor,boolean,0 +dynamic,sensor,uint16,0 +dynamic,sensor,boolean,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +static,attribute,uint8,0 +dynamic,actuator,boolean,0 +dynamic,actuator,boolean,0 +dynamic,sensor,int16,0 +dynamic,actuator,uint8,0 +dynamic,actuator,uint8,0 +dynamic,actuator,int8,0 +dynamic,sensor,uint8,0 +dynamic,sensor,uint8,0 +dynamic,sensor,boolean,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +dynamic,sensor,boolean,0 +dynamic,sensor,uint8,0 +static,attribute,string,0 +dynamic,sensor,string,0 +dynamic,sensor,string,0 +dynamic,sensor,string,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,string,0 +dynamic,sensor,uint8,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +static,attribute,uint8,0 +dynamic,sensor,uint8,0 +dynamic,sensor,boolean,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,uint8,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,boolean,0 +dynamic,sensor,uint8,0 +dynamic,sensor,string,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +static,attribute,uint8,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,string,0 +dynamic,sensor,string,0 +dynamic,sensor,float,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,uint16,0 +dynamic,sensor,string,0 +dynamic,sensor,string,0 +dynamic,sensor,int16,0 +dynamic,sensor,int16,0 +dynamic,sensor,int16,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,boolean,0 +dynamic,sensor,float,0 +dynamic,sensor,int32,0 +dynamic,sensor,boolean,0 +static,attribute,uint32,0 +static,attribute,uint32,0 +static,attribute,uint32,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,uint16,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,uint16,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +static,attribute,string,0 +dynamic,sensor,string,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +static,attribute,string,0 +dynamic,sensor,float,0 +dynamic,actuator,float,0 +dynamic,sensor,boolean,0 +dynamic,sensor,boolean,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +dynamic,sensor,float,0 +static,attribute,int16,0 +static,attribute,float,0 +static,attribute,int16,0 +dynamic,sensor,uint16,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +static,attribute,uint16,0 +dynamic,sensor,boolean,0 +dynamic,sensor,string,0 +dynamic,sensor,double,0 +dynamic,sensor,double,0 +dynamic,sensor,double,0 +dynamic,sensor,double,0 +dynamic,sensor,double,0 +dynamic,sensor,double,0 +dynamic,sensor,string,0 +static,attribute,int16,0 +static,attribute,int16,0 +static,attribute,int16,0 +dynamic,actuator,uint8,0 +dynamic,actuator,boolean,0 +dynamic,sensor,uint8,0 +dynamic,sensor,string,0 diff --git a/docs-gen/static/data/outputplus.json b/docs-gen/static/data/outputplus.json new file mode 100644 index 000000000..dc848634e --- /dev/null +++ b/docs-gen/static/data/outputplus.json @@ -0,0 +1,5868 @@ +{ + "name": "Vehicle", + "type": "Vehicle", + "children": [ + { + "name": "ADAS", + "children": [ + { + "name": "ABS", + "children": [ + { + "name": "IsEnabled", + "datatype": "boolean", + "description": "Indicates if ABS is enabled. True = Enabled. False = Disabled.", + "type": "actuator" + }, + { + "name": "IsEngaged", + "datatype": "boolean", + "description": "Indicates if ABS is currently regulating brake pressure. True = Engaged. False = Not Engaged.", + "type": "sensor" + }, + { + "name": "IsError", + "datatype": "boolean", + "description": "Indicates if ABS incurred an error condition. True = Error. False = No Error.", + "type": "sensor" + } + ] + }, + { + "name": "CruiseControl", + "children": [ + { + "name": "IsActive", + "datatype": "boolean", + "description": "Indicates if cruise control system is active (i.e. actively controls speed). True = Active. False = Inactive.", + "type": "actuator" + }, + { + "name": "IsEnabled", + "datatype": "boolean", + "description": "Indicates if cruise control system is enabled (e.g. ready to receive configurations and settings) True = Enabled. False = Disabled.", + "type": "actuator" + }, + { + "name": "SpeedSet", + "datatype": "float", + "description": "Set cruise control speed in kilometers per hour.", + "type": "actuator", + "unit": "km/h" + }, + { + "name": "IsError", + "datatype": "boolean", + "description": "Indicates if cruise control system incurred an error condition. True = Error. False = No Error.", + "type": "sensor" + } + ] + }, + { + "name": "DMS", + "children": [ + { + "name": "IsEnabled", + "datatype": "boolean", + "description": "Indicates if DMS is enabled. True = Enabled. False = Disabled.", + "type": "actuator" + }, + { + "name": "IsError", + "datatype": "boolean", + "description": "Indicates if DMS incurred an error condition. True = Error. False = No Error.", + "type": "sensor" + }, + { + "name": "IsWarning", + "datatype": "boolean", + "description": "Indicates if DMS has registered a driver alert condition.", + "type": "sensor" + } + ] + }, + { + "name": "EBA", + "children": [ + { + "name": "IsEnabled", + "datatype": "boolean", + "description": "Indicates if EBA is enabled. True = Enabled. False = Disabled.", + "type": "actuator" + }, + { + "name": "IsEngaged", + "datatype": "boolean", + "description": "Indicates if EBA is currently regulating brake pressure. True = Engaged. False = Not Engaged.", + "type": "sensor" + }, + { + "name": "IsError", + "datatype": "boolean", + "description": "Indicates if EBA incurred an error condition. True = Error. False = No Error.", + "type": "sensor" + } + ] + }, + { + "name": "EBD", + "children": [ + { + "name": "IsEnabled", + "datatype": "boolean", + "description": "Indicates if EBD is enabled. True = Enabled. False = Disabled.", + "type": "actuator" + }, + { + "name": "IsEngaged", + "datatype": "boolean", + "description": "Indicates if EBD is currently regulating vehicle brakeforce distribution. True = Engaged. False = Not Engaged.", + "type": "sensor" + }, + { + "name": "IsError", + "datatype": "boolean", + "description": "Indicates if EBD incurred an error condition. True = Error. False = No Error.", + "type": "sensor" + } + ] + }, + { + "name": "ESC", + "children": [ + { + "name": "RoadFriction", + "children": [ + { + "name": "LowerBound", + "datatype": "float", + "description": "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.", + "max": 100, + "min": 0, + "type": "sensor", + "unit": "percent" + }, + { + "name": "MostProbable", + "datatype": "float", + "description": "Most probable road friction, as calculated by the ESC system. Exact meaning of most probable is implementation specific. 0 = no friction, 100 = maximum friction.", + "max": 100, + "min": 0, + "type": "sensor", + "unit": "percent" + }, + { + "name": "UpperBound", + "datatype": "float", + "description": "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.", + "max": 100, + "min": 0, + "type": "sensor", + "unit": "percent" + } + ] + }, + { + "name": "IsEnabled", + "datatype": "boolean", + "description": "Indicates if ESC is enabled. True = Enabled. False = Disabled.", + "type": "actuator" + }, + { + "name": "IsEngaged", + "datatype": "boolean", + "description": "Indicates if ESC is currently regulating vehicle stability. True = Engaged. False = Not Engaged.", + "type": "sensor" + }, + { + "name": "IsError", + "datatype": "boolean", + "description": "Indicates if ESC incurred an error condition. True = Error. False = No Error.", + "type": "sensor" + }, + { + "name": "IsStrongCrossWindDetected", + "datatype": "boolean", + "description": "Indicates if the ESC system is detecting strong cross winds. True = Strong cross winds detected. False = No strong cross winds detected.", + "type": "sensor" + } + ] + }, + { + "name": "LaneDepartureDetection", + "children": [ + { + "name": "IsEnabled", + "datatype": "boolean", + "description": "Indicates if lane departure detection system is enabled. True = Enabled. False = Disabled.", + "type": "actuator" + }, + { + "name": "IsError", + "datatype": "boolean", + "description": "Indicates if lane departure system incurred an error condition. True = Error. False = No Error.", + "type": "sensor" + }, + { + "name": "IsWarning", + "datatype": "boolean", + "description": "Indicates if lane departure detection registered a lane departure.", + "type": "sensor" + } + ] + }, + { + "name": "ObstacleDetection", + "children": [ + { + "name": "IsEnabled", + "datatype": "boolean", + "description": "Indicates if obstacle sensor system is enabled (i.e. monitoring for obstacles). True = Enabled. False = Disabled.", + "type": "actuator" + }, + { + "name": "IsError", + "datatype": "boolean", + "description": "Indicates if obstacle sensor system incurred an error condition. True = Error. False = No Error.", + "type": "sensor" + }, + { + "name": "IsWarning", + "datatype": "boolean", + "description": "Indicates if obstacle sensor system registered an obstacle.", + "type": "sensor" + } + ] + }, + { + "name": "TCS", + "children": [ + { + "name": "IsEnabled", + "datatype": "boolean", + "description": "Indicates if TCS is enabled. True = Enabled. False = Disabled.", + "type": "actuator" + }, + { + "name": "IsEngaged", + "datatype": "boolean", + "description": "Indicates if TCS is currently regulating traction. True = Engaged. False = Not Engaged.", + "type": "sensor" + }, + { + "name": "IsError", + "datatype": "boolean", + "description": "Indicates if TCS incurred an error condition. True = Error. False = No Error.", + "type": "sensor" + } + ] + }, + { + "name": "IsAutoPowerOptimize", + "datatype": "boolean", + "description": "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.", + "type": "actuator" + }, + { + "name": "PowerOptimizeLevel", + "datatype": "uint8", + "description": "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.", + "max": 10, + "min": 0, + "type": "actuator" + }, + { + "name": "SupportedAutonomyLevel", + "allowed": [ + "SAE_0", + "SAE_1", + "SAE_2", + "SAE_3", + "SAE_4", + "SAE_5" + ], + "datatype": "string", + "description": "Indicates the highest level of driving automation according to the SAE J3016 taxonomy the vehicle is capable of.", + "type": "attribute" + }, + { + "name": "ActiveAutonomyLevel", + "allowed": [ + "SAE_0", + "SAE_1", + "SAE_2_DISENGAGING", + "SAE_2", + "SAE_3_DISENGAGING", + "SAE_3", + "SAE_4_DISENGAGING", + "SAE_4", + "SAE_5_DISENGAGING", + "SAE_5" + ], + "comment": "Complies with https://www.sae.org/standards/content/j3016_202104/ and https://www.sae.org/blog/sae-j3016-update. Level 5 and 4 ADS (Automated driving system) disengage, if appropriate, only after it achieves a minimal risk condition or a driver is performing the DDT. Level 3 ADS disengages either an appropriate time after issuing a request to intervene or immediately upon user request. Level 2 DAS (Driving automation system) disengages immediately upon driver request. However, since many Level 2 DAS, often termed \"Level 2.5\", warn the driver shortly before reaching their operational limits, the VSS also supports the DISENGAGING state for SAE_2. Nevertheless, it should be noted that the SAE J3016 states that it is incorrect to describe driving automation features using fractional levels.", + "datatype": "string", + "description": "Indicates the currently active level of driving automation according to the SAE J3016 (Taxonomy and Definitions for Terms Related to Driving Automation Systems for On-Road Motor Vehicles).", + "type": "sensor" + } + ] + }, + { + "name": "Acceleration", + "children": [ + { + "name": "Lateral", + "datatype": "float", + "description": "Vehicle acceleration in Y (lateral acceleration).", + "type": "sensor", + "unit": "m/s^2" + }, + { + "name": "Longitudinal", + "datatype": "float", + "description": "Vehicle acceleration in X (longitudinal acceleration).", + "type": "sensor", + "unit": "m/s^2" + }, + { + "name": "Vertical", + "datatype": "float", + "description": "Vehicle acceleration in Z (vertical acceleration).", + "type": "sensor", + "unit": "m/s^2" + } + ] + }, + { + "name": "AngularVelocity", + "children": [ + { + "name": "Pitch", + "datatype": "float", + "description": "Vehicle rotation rate along Y (lateral).", + "type": "sensor", + "unit": "degrees/s" + }, + { + "name": "Roll", + "datatype": "float", + "description": "Vehicle rotation rate along X (longitudinal).", + "type": "sensor", + "unit": "degrees/s" + }, + { + "name": "Yaw", + "datatype": "float", + "description": "Vehicle rotation rate along Z (vertical).", + "type": "sensor", + "unit": "degrees/s" + } + ] + }, + { + "name": "Body", + "children": [ + { + "name": "Hood", + "children": [ + { + "name": "IsOpen", + "datatype": "boolean", + "description": "Is item open or closed? True = Fully or partially open. False = Fully closed.", + "type": "actuator" + }, + { + "name": "Position", + "comment": "Relationship between Open/Close and Start/End position is item dependent.", + "datatype": "uint8", + "description": "Item position. 0 = Start position 100 = End position.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "Switch", + "allowed": [ + "INACTIVE", + "CLOSE", + "OPEN", + "ONE_SHOT_CLOSE", + "ONE_SHOT_OPEN" + ], + "datatype": "string", + "description": "Switch controlling sliding action such as window, sunroof, or blind.", + "type": "actuator" + } + ] + }, + { + "name": "Horn", + "children": [ + { + "name": "IsActive", + "datatype": "boolean", + "description": "Horn active or inactive. True = Active. False = Inactive.", + "type": "actuator" + } + ] + }, + { + "name": "Lights", + "children": [ + { + "name": "Backup", + "children": [ + { + "name": "IsOn", + "datatype": "boolean", + "description": "Indicates if light is on or off. True = On. False = Off.", + "type": "actuator" + }, + { + "name": "IsDefect", + "datatype": "boolean", + "description": "Indicates if light is defect. True = Light is defect. False = Light has no defect.", + "type": "sensor" + } + ] + }, + { + "name": "Beam", + "children": [ + { + "name": "IsOn", + "datatype": "boolean", + "description": "Indicates if light is on or off. True = On. False = Off.", + "type": "actuator" + }, + { + "name": "IsDefect", + "datatype": "boolean", + "description": "Indicates if light is defect. True = Light is defect. False = Light has no defect.", + "type": "sensor" + } + ] + }, + { + "name": "Brake", + "children": [ + { + "name": "IsActive", + "allowed": [ + "INACTIVE", + "ACTIVE", + "ADAPTIVE" + ], + "datatype": "string", + "description": "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.", + "type": "actuator" + }, + { + "name": "IsDefect", + "datatype": "boolean", + "description": "Indicates if light is defect. True = Light is defect. False = Light has no defect.", + "type": "sensor" + } + ] + }, + { + "name": "DirectionIndicator", + "children": [ + { + "name": "IsSignaling", + "datatype": "boolean", + "description": "Indicates if light is signaling or off. True = signaling. False = Off.", + "type": "actuator" + }, + { + "name": "IsDefect", + "datatype": "boolean", + "description": "Indicates if light is defect. True = Light is defect. False = Light has no defect.", + "type": "sensor" + } + ] + }, + { + "name": "Fog", + "children": [ + { + "name": "IsOn", + "datatype": "boolean", + "description": "Indicates if light is on or off. True = On. False = Off.", + "type": "actuator" + }, + { + "name": "IsDefect", + "datatype": "boolean", + "description": "Indicates if light is defect. True = Light is defect. False = Light has no defect.", + "type": "sensor" + } + ] + }, + { + "name": "Hazard", + "children": [ + { + "name": "IsSignaling", + "datatype": "boolean", + "description": "Indicates if light is signaling or off. True = signaling. False = Off.", + "type": "actuator" + }, + { + "name": "IsDefect", + "datatype": "boolean", + "description": "Indicates if light is defect. True = Light is defect. False = Light has no defect.", + "type": "sensor" + } + ] + }, + { + "name": "LicensePlate", + "children": [ + { + "name": "IsOn", + "datatype": "boolean", + "description": "Indicates if light is on or off. True = On. False = Off.", + "type": "actuator" + }, + { + "name": "IsDefect", + "datatype": "boolean", + "description": "Indicates if light is defect. True = Light is defect. False = Light has no defect.", + "type": "sensor" + } + ] + }, + { + "name": "Parking", + "children": [ + { + "name": "IsOn", + "datatype": "boolean", + "description": "Indicates if light is on or off. True = On. False = Off.", + "type": "actuator" + }, + { + "name": "IsDefect", + "datatype": "boolean", + "description": "Indicates if light is defect. True = Light is defect. False = Light has no defect.", + "type": "sensor" + } + ] + }, + { + "name": "Running", + "children": [ + { + "name": "IsOn", + "datatype": "boolean", + "description": "Indicates if light is on or off. True = On. False = Off.", + "type": "actuator" + }, + { + "name": "IsDefect", + "datatype": "boolean", + "description": "Indicates if light is defect. True = Light is defect. False = Light has no defect.", + "type": "sensor" + } + ] + }, + { + "name": "IsHighBeamSwitchOn", + "comment": "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.", + "datatype": "boolean", + "description": "Status of the high beam switch. True = high beam enabled. False = high beam not enabled.", + "type": "actuator" + }, + { + "name": "LightSwitch", + "allowed": [ + "OFF", + "POSITION", + "DAYTIME_RUNNING_LIGHTS", + "AUTO", + "BEAM" + ], + "comment": "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.", + "datatype": "string", + "description": "Status of the vehicle main light switch.", + "type": "actuator" + } + ] + }, + { + "name": "Mirrors", + "children": [ + { + "name": "IsFolded", + "datatype": "boolean", + "description": "Is mirror folded? True = Fully or partially folded. False = Fully unfolded.", + "type": "actuator" + }, + { + "name": "IsHeatingOn", + "datatype": "boolean", + "description": "Mirror Heater on or off. True = Heater On. False = Heater Off.", + "type": "actuator" + }, + { + "name": "IsLocked", + "datatype": "boolean", + "description": "Is mirror movement locked? True = Locked, mirror will not react to Tilt/Pan change. False = Unlocked.", + "type": "actuator" + }, + { + "name": "Pan", + "datatype": "int8", + "description": "Mirror pan as a percent. 0 = Center Position. 100 = Fully Left Position. -100 = Fully Right Position.", + "max": 100, + "min": -100, + "type": "actuator", + "unit": "percent" + }, + { + "name": "Tilt", + "datatype": "int8", + "description": "Mirror tilt as a percent. 0 = Center Position. 100 = Fully Upward Position. -100 = Fully Downward Position.", + "max": 100, + "min": -100, + "type": "actuator", + "unit": "percent" + } + ] + }, + { + "name": "Raindetection", + "children": [ + { + "name": "Intensity", + "datatype": "uint8", + "description": "Rain intensity. 0 = Dry, No Rain. 100 = Covered.", + "max": 100, + "type": "sensor", + "unit": "percent" + } + ] + }, + { + "name": "Trunk", + "children": [ + { + "name": "IsLightOn", + "comment": "V4.0 Moved from Vehicle.Cabin.Lights.IsTrunkOn because Trunk is not defined as part of the Cabin.", + "datatype": "boolean", + "description": "Is trunk light on", + "type": "actuator" + }, + { + "name": "IsLocked", + "datatype": "boolean", + "description": "Is item locked or unlocked. True = Locked. False = Unlocked.", + "type": "actuator" + }, + { + "name": "IsOpen", + "datatype": "boolean", + "description": "Is item open or closed? True = Fully or partially open. False = Fully closed.", + "type": "actuator" + }, + { + "name": "Position", + "comment": "Relationship between Open/Close and Start/End position is item dependent.", + "datatype": "uint8", + "description": "Item position. 0 = Start position 100 = End position.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "Switch", + "allowed": [ + "INACTIVE", + "CLOSE", + "OPEN", + "ONE_SHOT_CLOSE", + "ONE_SHOT_OPEN" + ], + "datatype": "string", + "description": "Switch controlling sliding action such as window, sunroof, or blind.", + "type": "actuator" + } + ] + }, + { + "name": "Windshield", + "children": [ + { + "name": "WasherFluid", + "children": [ + { + "name": "IsLevelLow", + "datatype": "boolean", + "description": "Low level indication for washer fluid. True = Level Low. False = Level OK.", + "type": "sensor" + }, + { + "name": "Level", + "datatype": "uint8", + "description": "Washer fluid level as a percent. 0 = Empty. 100 = Full.", + "max": 100, + "type": "sensor", + "unit": "percent" + } + ] + }, + { + "name": "Wiping", + "children": [ + { + "name": "System", + "children": [ + { + "name": "ActualPosition", + "comment": "Default parking position might be used as reference position.", + "datatype": "float", + "description": "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.", + "type": "actuator", + "unit": "degrees" + }, + { + "name": "Frequency", + "comment": "Examples - 0 = Wipers stopped, 80 = Wipers doing 80 cycles per minute (in WIPE mode).", + "datatype": "uint8", + "description": "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.", + "type": "actuator", + "unit": "cpm" + }, + { + "name": "Mode", + "allowed": [ + "STOP_HOLD", + "WIPE", + "PLANT_MODE", + "EMERGENCY_STOP" + ], + "datatype": "string", + "description": "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.", + "type": "actuator" + }, + { + "name": "TargetPosition", + "comment": "Default parking position might be used as reference position.", + "datatype": "float", + "description": "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.", + "type": "actuator", + "unit": "degrees" + }, + { + "name": "DriveCurrent", + "comment": "May be negative in special situations.", + "datatype": "float", + "description": "Actual current used by wiper drive.", + "type": "sensor", + "unit": "A" + }, + { + "name": "IsBlocked", + "datatype": "boolean", + "description": "Indicates if wiper movement is blocked. True = Movement blocked. False = Movement not blocked.", + "type": "sensor" + }, + { + "name": "IsEndingWipeCycle", + "comment": "In continuous wiping between A and B this sensor can be used a trigger to update TargetPosition.", + "datatype": "boolean", + "description": "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.", + "type": "sensor" + }, + { + "name": "IsOverheated", + "datatype": "boolean", + "description": "Indicates if wiper system is overheated. True = Wiper system overheated. False = Wiper system not overheated.", + "type": "sensor" + }, + { + "name": "IsPositionReached", + "datatype": "boolean", + "description": "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.", + "type": "sensor" + }, + { + "name": "IsWiperError", + "datatype": "boolean", + "description": "Indicates system failure. True if wiping is disabled due to system failure.", + "type": "sensor" + }, + { + "name": "IsWiping", + "datatype": "boolean", + "description": "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.", + "type": "sensor" + } + ] + }, + { + "name": "Intensity", + "datatype": "uint8", + "description": "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.", + "type": "actuator" + }, + { + "name": "Mode", + "allowed": [ + "OFF", + "SLOW", + "MEDIUM", + "FAST", + "INTERVAL", + "RAIN_SENSOR" + ], + "datatype": "string", + "description": "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.", + "type": "actuator" + }, + { + "name": "IsWipersWorn", + "datatype": "boolean", + "description": "Wiper wear status. True = Worn, Replacement recommended or required. False = Not Worn.", + "type": "sensor" + }, + { + "name": "WiperWear", + "datatype": "uint8", + "description": "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.", + "max": 100, + "type": "sensor", + "unit": "percent" + } + ] + }, + { + "name": "IsHeatingOn", + "datatype": "boolean", + "description": "Windshield heater status. False - off, True - on.", + "type": "actuator" + } + ] + }, + { + "name": "IsAutoPowerOptimize", + "datatype": "boolean", + "description": "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.", + "type": "actuator" + }, + { + "name": "PowerOptimizeLevel", + "datatype": "uint8", + "description": "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.", + "max": 10, + "min": 0, + "type": "actuator" + }, + { + "name": "RearMainSpoilerPosition", + "datatype": "float", + "description": "Rear spoiler position, 0% = Spoiler fully stowed. 100% = Spoiler fully exposed.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "BodyType", + "datatype": "string", + "description": "Body type code as defined by ISO 3779.", + "type": "attribute" + } + ] + }, + { + "name": "Cabin", + "children": [ + { + "name": "Convertible", + "children": [ + { + "name": "Status", + "allowed": [ + "UNDEFINED", + "CLOSED", + "OPEN", + "CLOSING", + "OPENING", + "STALLED" + ], + "datatype": "string", + "description": "Roof status on convertible vehicles.", + "type": "sensor" + } + ] + }, + { + "name": "Door", + "children": [ + { + "name": "Shade", + "children": [ + { + "name": "IsOpen", + "datatype": "boolean", + "description": "Is item open or closed? True = Fully or partially open. False = Fully closed.", + "type": "actuator" + }, + { + "name": "Position", + "comment": "Relationship between Open/Close and Start/End position is item dependent.", + "datatype": "uint8", + "description": "Item position. 0 = Start position 100 = End position.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "Switch", + "allowed": [ + "INACTIVE", + "CLOSE", + "OPEN", + "ONE_SHOT_CLOSE", + "ONE_SHOT_OPEN" + ], + "datatype": "string", + "description": "Switch controlling sliding action such as window, sunroof, or blind.", + "type": "actuator" + } + ] + }, + { + "name": "Window", + "children": [ + { + "name": "IsOpen", + "datatype": "boolean", + "description": "Is item open or closed? True = Fully or partially open. False = Fully closed.", + "type": "actuator" + }, + { + "name": "Position", + "comment": "Relationship between Open/Close and Start/End position is item dependent.", + "datatype": "uint8", + "description": "Item position. 0 = Start position 100 = End position.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "Switch", + "allowed": [ + "INACTIVE", + "CLOSE", + "OPEN", + "ONE_SHOT_CLOSE", + "ONE_SHOT_OPEN" + ], + "datatype": "string", + "description": "Switch controlling sliding action such as window, sunroof, or blind.", + "type": "actuator" + } + ] + }, + { + "name": "IsLocked", + "datatype": "boolean", + "description": "Is item locked or unlocked. True = Locked. False = Unlocked.", + "type": "actuator" + }, + { + "name": "IsOpen", + "datatype": "boolean", + "description": "Is item open or closed? True = Fully or partially open. False = Fully closed.", + "type": "actuator" + }, + { + "name": "Position", + "comment": "Relationship between Open/Close and Start/End position is item dependent.", + "datatype": "uint8", + "description": "Item position. 0 = Start position 100 = End position.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "Switch", + "allowed": [ + "INACTIVE", + "CLOSE", + "OPEN", + "ONE_SHOT_CLOSE", + "ONE_SHOT_OPEN" + ], + "datatype": "string", + "description": "Switch controlling sliding action such as window, sunroof, or blind.", + "type": "actuator" + }, + { + "name": "IsChildLockActive", + "datatype": "boolean", + "description": "Is door child lock active. True = Door cannot be opened from inside. False = Door can be opened from inside.", + "type": "sensor" + } + ] + }, + { + "name": "HVAC", + "children": [ + { + "name": "Station", + "children": [ + { + "name": "AirDistribution", + "allowed": [ + "UP", + "MIDDLE", + "DOWN" + ], + "datatype": "string", + "description": "Direction of airstream", + "type": "actuator" + }, + { + "name": "FanSpeed", + "datatype": "uint8", + "description": "Fan Speed, 0 = off. 100 = max", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "Temperature", + "datatype": "float", + "description": "Temperature", + "type": "actuator", + "unit": "celsius" + } + ] + }, + { + "name": "IsAirConditioningActive", + "datatype": "boolean", + "description": "Is Air conditioning active.", + "type": "actuator" + }, + { + "name": "IsAutoPowerOptimize", + "datatype": "boolean", + "description": "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.", + "type": "actuator" + }, + { + "name": "IsFrontDefrosterActive", + "datatype": "boolean", + "description": "Is front defroster active.", + "type": "actuator" + }, + { + "name": "IsRearDefrosterActive", + "datatype": "boolean", + "description": "Is rear defroster active.", + "type": "actuator" + }, + { + "name": "IsRecirculationActive", + "datatype": "boolean", + "description": "Is recirculation active.", + "type": "actuator" + }, + { + "name": "PowerOptimizeLevel", + "datatype": "uint8", + "description": "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.", + "max": 10, + "min": 0, + "type": "actuator" + }, + { + "name": "AmbientAirTemperature", + "datatype": "float", + "description": "Ambient air temperature inside the vehicle.", + "type": "sensor", + "unit": "celsius" + } + ] + }, + { + "name": "Infotainment", + "children": [ + { + "name": "HMI", + "children": [ + { + "name": "Brightness", + "comment": "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.", + "datatype": "float", + "description": "Brightness of the HMI, relative to supported range. 0 = Lowest brightness possible. 100 = Maximum Brightness possible.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "DateFormat", + "allowed": [ + "YYYY_MM_DD", + "DD_MM_YYYY", + "MM_DD_YYYY", + "YY_MM_DD", + "DD_MM_YY", + "MM_DD_YY" + ], + "datatype": "string", + "description": "Date format used in the current HMI", + "type": "actuator" + }, + { + "name": "DayNightMode", + "allowed": [ + "DAY", + "NIGHT" + ], + "datatype": "string", + "description": "Current display theme", + "type": "actuator" + }, + { + "name": "DisplayOffDuration", + "comment": "Display shall be turned off at HMI.LastActionTime + HMI.DisplayOffDuration, unless HMI.IsScreenAlwaysOn==True.", + "datatype": "uint16", + "description": "Duration in seconds before the display is turned off. Value shall be 0 if screen never shall turn off.", + "type": "actuator", + "unit": "s" + }, + { + "name": "DistanceUnit", + "allowed": [ + "MILES", + "KILOMETERS" + ], + "datatype": "string", + "description": "Distance unit used in the current HMI", + "type": "actuator" + }, + { + "name": "EVEconomyUnits", + "allowed": [ + "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" + ], + "datatype": "string", + "description": "EV fuel economy unit used in the current HMI", + "type": "actuator" + }, + { + "name": "EVEnergyUnits", + "allowed": [ + "WATT_HOURS", + "AMPERE_HOURS", + "KILOWATT_HOURS" + ], + "comment": "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.", + "datatype": "string", + "description": "EV energy unit used in the current HMI", + "type": "actuator" + }, + { + "name": "FontSize", + "allowed": [ + "STANDARD", + "LARGE", + "EXTRA_LARGE" + ], + "datatype": "string", + "description": "Font size used in the current HMI", + "type": "actuator" + }, + { + "name": "FuelEconomyUnits", + "allowed": [ + "MPG_UK", + "MPG_US", + "MILES_PER_LITER", + "KILOMETERS_PER_LITER", + "LITERS_PER_100_KILOMETERS" + ], + "datatype": "string", + "description": "Fuel economy unit used in the current HMI", + "type": "actuator" + }, + { + "name": "FuelVolumeUnit", + "allowed": [ + "LITER", + "GALLON_US", + "GALLON_UK" + ], + "datatype": "string", + "description": "Fuel volume unit used in the current HMI", + "type": "actuator" + }, + { + "name": "IsScreenAlwaysOn", + "datatype": "boolean", + "description": "Used to prevent the screen going black if no action placed.", + "type": "actuator" + }, + { + "name": "SpeedUnit", + "allowed": [ + "METERS_PER_SECOND", + "MILES_PER_HOUR", + "KILOMETERS_PER_HOUR" + ], + "datatype": "string", + "description": "Speed unit used in the current HMI", + "type": "actuator" + }, + { + "name": "TemperatureUnit", + "allowed": [ + "C", + "F" + ], + "datatype": "string", + "description": "Temperature unit used in the current HMI", + "type": "actuator" + }, + { + "name": "TimeFormat", + "allowed": [ + "HR_12", + "HR_24" + ], + "datatype": "string", + "description": "Time format used in the current HMI", + "type": "actuator" + }, + { + "name": "TirePressureUnit", + "allowed": [ + "PSI", + "KPA", + "BAR" + ], + "datatype": "string", + "description": "Tire pressure unit used in the current HMI", + "type": "actuator" + }, + { + "name": "CurrentLanguage", + "datatype": "string", + "description": "ISO 639-1 standard language code for the current HMI", + "type": "sensor" + }, + { + "name": "LastActionTime", + "datatype": "string", + "description": "Time for last hmi action, formatted according to ISO 8601 with UTC time zone.", + "type": "sensor", + "unit": "iso8601" + } + ] + }, + { + "name": "Media", + "children": [ + { + "name": "Played", + "children": [ + { + "name": "PlaybackRate", + "comment": "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.", + "datatype": "float", + "description": "Current playback rate of media being played.", + "type": "actuator" + }, + { + "name": "Source", + "allowed": [ + "UNKNOWN", + "SIRIUS_XM", + "AM", + "FM", + "DAB", + "TV", + "CD", + "DVD", + "AUX", + "USB", + "DISK", + "BLUETOOTH", + "INTERNET", + "VOICE", + "BEEP" + ], + "datatype": "string", + "description": "Media selected for playback", + "type": "actuator" + }, + { + "name": "Album", + "datatype": "string", + "description": "Name of album being played", + "type": "sensor" + }, + { + "name": "Artist", + "datatype": "string", + "description": "Name of artist being played", + "type": "sensor" + }, + { + "name": "Genre", + "datatype": "string", + "description": "Name of genre being played", + "type": "sensor" + }, + { + "name": "Track", + "datatype": "string", + "description": "Name of track being played", + "type": "sensor" + }, + { + "name": "URI", + "datatype": "string", + "description": "User Resource associated with the media", + "type": "sensor" + } + ] + }, + { + "name": "Action", + "allowed": [ + "UNKNOWN", + "STOP", + "PLAY", + "FAST_FORWARD", + "FAST_BACKWARD", + "SKIP_FORWARD", + "SKIP_BACKWARD" + ], + "datatype": "string", + "description": "Tells if the media was", + "type": "actuator" + }, + { + "name": "SelectedURI", + "datatype": "string", + "description": "URI of suggested media that was selected", + "type": "actuator" + }, + { + "name": "Volume", + "datatype": "uint8", + "description": "Current Media Volume", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "DeclinedURI", + "datatype": "string", + "description": "URI of suggested media that was declined", + "type": "sensor" + } + ] + }, + { + "name": "Navigation", + "children": [ + { + "name": "DestinationSet", + "children": [ + { + "name": "Latitude", + "datatype": "double", + "description": "Latitude of destination in WGS 84 geodetic coordinates.", + "max": 90, + "min": -90, + "type": "actuator", + "unit": "degrees" + }, + { + "name": "Longitude", + "datatype": "double", + "description": "Longitude of destination in WGS 84 geodetic coordinates.", + "max": 180, + "min": -180, + "type": "actuator", + "unit": "degrees" + } + ] + }, + { + "name": "Map", + "children": [ + { + "name": "IsAutoScaleModeUsed", + "comment": "If true, then auto-scaling mode is used. If false, then manual-scaling mode is used.", + "datatype": "boolean", + "description": "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", + "type": "actuator" + } + ] + }, + { + "name": "GuidanceVoice", + "allowed": [ + "STANDARD_MALE", + "STANDARD_FEMALE", + "ETC" + ], + "comment": "ETC indicates a voice alternative not covered by the explicitly listed alternatives.", + "datatype": "string", + "description": "Navigation guidance state that was selected.", + "type": "actuator" + }, + { + "name": "Mute", + "allowed": [ + "MUTED", + "ALERT_ONLY", + "UNMUTED" + ], + "datatype": "string", + "description": "Navigation mute state that was selected.", + "type": "actuator" + }, + { + "name": "Volume", + "datatype": "uint8", + "description": "Current navigation volume", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + } + ] + }, + { + "name": "SmartphoneProjection", + "children": [ + { + "name": "Active", + "allowed": [ + "NONE", + "ACTIVE", + "INACTIVE" + ], + "comment": "NONE indicates that projection is not supported.", + "datatype": "string", + "description": "Projection activation info.", + "type": "actuator" + }, + { + "name": "Source", + "allowed": [ + "USB", + "BLUETOOTH", + "WIFI" + ], + "comment": "Smartphone projection exposes or controls specific applications on the Smartphone on the vehicle infotainment system.", + "datatype": "string", + "description": "Connectivity source selected for projection.", + "type": "actuator" + }, + { + "name": "SupportedMode", + "allowed": [ + "ANDROID_AUTO", + "APPLE_CARPLAY", + "MIRROR_LINK", + "OTHER" + ], + "datatype": "string[]", + "description": "Supportable list for projection.", + "type": "attribute" + } + ] + }, + { + "name": "SmartphoneScreenMirroring", + "children": [ + { + "name": "Active", + "allowed": [ + "NONE", + "ACTIVE", + "INACTIVE" + ], + "comment": "NONE indicates that mirroring is not supported.", + "datatype": "string", + "description": "Mirroring activation info.", + "type": "actuator" + }, + { + "name": "Source", + "allowed": [ + "USB", + "BLUETOOTH", + "WIFI" + ], + "datatype": "string", + "description": "Connectivity source selected for mirroring.", + "type": "actuator" + } + ] + }, + { + "name": "IsAutoPowerOptimize", + "datatype": "boolean", + "description": "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.", + "type": "actuator" + }, + { + "name": "PowerOptimizeLevel", + "datatype": "uint8", + "description": "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.", + "max": 10, + "min": 0, + "type": "actuator" + } + ] + }, + { + "name": "Light", + "children": [ + { + "name": "AmbientLight", + "children": [ + { + "name": "Color", + "comment": "For example; \"#C0C0C0\" = Silver, \"#FFD700\" = Gold, \"#000000\" = Black, \"#FFFFFF\" = White, etc.", + "datatype": "string", + "description": "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\".", + "type": "actuator" + }, + { + "name": "Intensity", + "comment": "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.", + "datatype": "uint8", + "description": "How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).", + "max": 100, + "min": 1, + "type": "actuator", + "unit": "percent" + }, + { + "name": "IsLightOn", + "datatype": "boolean", + "description": "Indicates whether the light is turned on. True = On, False = Off.", + "type": "actuator" + } + ] + }, + { + "name": "InteractiveLightBar", + "children": [ + { + "name": "Color", + "comment": "For example; \"#C0C0C0\" = Silver, \"#FFD700\" = Gold, \"#000000\" = Black, \"#FFFFFF\" = White, etc.", + "datatype": "string", + "description": "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\".", + "type": "actuator" + }, + { + "name": "Effect", + "comment": "Default and allowed values are OEM-specific and should be defined accordingly (e.g. with the use of overlays).", + "datatype": "string", + "description": "Light effect selection from a predefined set of allowed values.", + "type": "actuator" + }, + { + "name": "Intensity", + "comment": "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.", + "datatype": "uint8", + "description": "How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).", + "max": 100, + "min": 1, + "type": "actuator", + "unit": "percent" + }, + { + "name": "IsLightOn", + "datatype": "boolean", + "description": "Indicates whether the light is turned on. True = On, False = Off.", + "type": "actuator" + } + ] + }, + { + "name": "Spotlight", + "children": [ + { + "name": "Color", + "comment": "For example; \"#C0C0C0\" = Silver, \"#FFD700\" = Gold, \"#000000\" = Black, \"#FFFFFF\" = White, etc.", + "datatype": "string", + "description": "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\".", + "type": "actuator" + }, + { + "name": "Intensity", + "comment": "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.", + "datatype": "uint8", + "description": "How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness).", + "max": 100, + "min": 1, + "type": "actuator", + "unit": "percent" + }, + { + "name": "IsLightOn", + "datatype": "boolean", + "description": "Indicates whether the light is turned on. True = On, False = Off.", + "type": "actuator" + } + ] + }, + { + "name": "IsDomeOn", + "datatype": "boolean", + "description": "Is central dome light on", + "type": "actuator" + }, + { + "name": "IsGloveBoxOn", + "datatype": "boolean", + "description": "Is glove box light on", + "type": "actuator" + }, + { + "name": "PerceivedAmbientLight", + "comment": "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.", + "datatype": "uint8", + "description": "The percentage of ambient light that is measured (e.g., by a sensor) inside the cabin. 0 = No ambient light. 100 = Full brightness.", + "max": 100, + "min": 0, + "type": "sensor", + "unit": "percent" + } + ] + }, + { + "name": "RearShade", + "children": [ + { + "name": "IsOpen", + "datatype": "boolean", + "description": "Is item open or closed? True = Fully or partially open. False = Fully closed.", + "type": "actuator" + }, + { + "name": "Position", + "comment": "Relationship between Open/Close and Start/End position is item dependent.", + "datatype": "uint8", + "description": "Item position. 0 = Start position 100 = End position.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "Switch", + "allowed": [ + "INACTIVE", + "CLOSE", + "OPEN", + "ONE_SHOT_CLOSE", + "ONE_SHOT_OPEN" + ], + "datatype": "string", + "description": "Switch controlling sliding action such as window, sunroof, or blind.", + "type": "actuator" + } + ] + }, + { + "name": "RearviewMirror", + "children": [ + { + "name": "DimmingLevel", + "datatype": "uint8", + "description": "Dimming level of rear-view mirror. 0 = Undimmed. 100 = Fully dimmed.", + "max": 100, + "type": "actuator", + "unit": "percent" + } + ] + }, + { + "name": "Seat", + "children": [ + { + "name": "Airbag", + "children": [ + { + "name": "IsDeployed", + "datatype": "boolean", + "description": "Airbag deployment status. True = Airbag deployed. False = Airbag not deployed.", + "type": "sensor" + } + ] + }, + { + "name": "Backrest", + "children": [ + { + "name": "Lumbar", + "children": [ + { + "name": "Height", + "datatype": "uint8", + "description": "Height of lumbar support. Position is relative within available movable range of the lumbar support. 0 = Lowermost position supported.", + "min": 0, + "type": "actuator", + "unit": "mm" + }, + { + "name": "Support", + "datatype": "float", + "description": "Lumbar support (in/out position). 0 = Innermost position. 100 = Outermost position.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + } + ] + }, + { + "name": "SideBolster", + "children": [ + { + "name": "Support", + "datatype": "float", + "description": "Side bolster support. 0 = Minimum support (widest side bolster setting). 100 = Maximum support.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + } + ] + }, + { + "name": "Recline", + "comment": "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.", + "datatype": "float", + "description": "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.", + "type": "actuator", + "unit": "degrees" + } + ] + }, + { + "name": "Headrest", + "children": [ + { + "name": "Angle", + "datatype": "float", + "description": "Headrest angle, relative to backrest, 0 degrees if parallel to backrest, Positive degrees = tilted forward.", + "type": "actuator", + "unit": "degrees" + }, + { + "name": "Height", + "datatype": "uint8", + "description": "Position of headrest relative to movable range of the head rest. 0 = Bottommost position supported.", + "min": 0, + "type": "actuator", + "unit": "mm" + } + ] + }, + { + "name": "Occupant", + "children": [ + { + "name": "Identifier", + "children": [ + { + "name": "Issuer", + "datatype": "string", + "deprecation": "v5.0 - use data from Vehicle.Occupant.*.*.Identifier.", + "description": "Unique Issuer for the authentication of the occupant e.g. https://accounts.funcorp.com.", + "type": "sensor" + }, + { + "name": "Subject", + "datatype": "string", + "deprecation": "v5.0 - use data from Vehicle.Occupant.*.*.Identifier.", + "description": "Subject for the authentication of the occupant e.g. UserID 7331677.", + "type": "sensor" + } + ] + } + ] + }, + { + "name": "Seating", + "children": [ + { + "name": "Length", + "datatype": "uint16", + "description": "Length adjustment of seating. 0 = Adjustable part of seating in rearmost position (Shortest length of seating).", + "min": 0, + "type": "actuator", + "unit": "mm" + } + ] + }, + { + "name": "Switch", + "children": [ + { + "name": "Backrest", + "children": [ + { + "name": "Lumbar", + "children": [ + { + "name": "IsDownEngaged", + "datatype": "boolean", + "description": "Lumbar down switch engaged (SingleSeat.Backrest.Lumbar.Support).", + "type": "actuator" + }, + { + "name": "IsLessSupportEngaged", + "datatype": "boolean", + "description": "Is switch for less lumbar support engaged (SingleSeat.Backrest.Lumbar.Support).", + "type": "actuator" + }, + { + "name": "IsMoreSupportEngaged", + "datatype": "boolean", + "description": "Is switch for more lumbar support engaged (SingleSeat.Backrest.Lumbar.Support).", + "type": "actuator" + }, + { + "name": "IsUpEngaged", + "datatype": "boolean", + "description": "Lumbar up switch engaged (SingleSeat.Backrest.Lumbar.Support).", + "type": "actuator" + } + ] + }, + { + "name": "SideBolster", + "children": [ + { + "name": "IsLessSupportEngaged", + "datatype": "boolean", + "description": "Is switch for less side bolster support engaged (SingleSeat.Backrest.SideBolster.Support).", + "type": "actuator" + }, + { + "name": "IsMoreSupportEngaged", + "datatype": "boolean", + "description": "Is switch for more side bolster support engaged (SingleSeat.Backrest.SideBolster.Support).", + "type": "actuator" + } + ] + }, + { + "name": "IsReclineBackwardEngaged", + "datatype": "boolean", + "description": "Backrest recline backward switch engaged (SingleSeat.Backrest.Recline).", + "type": "actuator" + }, + { + "name": "IsReclineForwardEngaged", + "datatype": "boolean", + "description": "Backrest recline forward switch engaged (SingleSeat.Backrest.Recline).", + "type": "actuator" + } + ] + }, + { + "name": "Headrest", + "children": [ + { + "name": "IsBackwardEngaged", + "datatype": "boolean", + "description": "Head rest backward switch engaged (SingleSeat.Headrest.Angle).", + "type": "actuator" + }, + { + "name": "IsDownEngaged", + "datatype": "boolean", + "description": "Head rest down switch engaged (SingleSeat.Headrest.Height).", + "type": "actuator" + }, + { + "name": "IsForwardEngaged", + "datatype": "boolean", + "description": "Head rest forward switch engaged (SingleSeat.Headrest.Angle).", + "type": "actuator" + }, + { + "name": "IsUpEngaged", + "datatype": "boolean", + "description": "Head rest up switch engaged (SingleSeat.Headrest.Height).", + "type": "actuator" + } + ] + }, + { + "name": "Massage", + "children": [ + { + "name": "IsDecreaseEngaged", + "datatype": "boolean", + "description": "Decrease massage level switch engaged (SingleSeat.Massage).", + "type": "actuator" + }, + { + "name": "IsIncreaseEngaged", + "datatype": "boolean", + "description": "Increase massage level switch engaged (SingleSeat.Massage).", + "type": "actuator" + } + ] + }, + { + "name": "Seating", + "children": [ + { + "name": "IsBackwardEngaged", + "datatype": "boolean", + "description": "Is switch to decrease seating length engaged (SingleSeat.Seating.Length).", + "type": "actuator" + }, + { + "name": "IsForwardEngaged", + "datatype": "boolean", + "description": "Is switch to increase seating length engaged (SingleSeat.Seating.Length).", + "type": "actuator" + } + ] + }, + { + "name": "IsBackwardEngaged", + "datatype": "boolean", + "description": "Seat backward switch engaged (SingleSeat.Position).", + "type": "actuator" + }, + { + "name": "IsCoolerEngaged", + "datatype": "boolean", + "description": "Cooler switch for Seat heater (SingleSeat.Heating).", + "type": "actuator" + }, + { + "name": "IsDownEngaged", + "datatype": "boolean", + "description": "Seat down switch engaged (SingleSeat.Height).", + "type": "actuator" + }, + { + "name": "IsForwardEngaged", + "datatype": "boolean", + "description": "Seat forward switch engaged (SingleSeat.Position).", + "type": "actuator" + }, + { + "name": "IsTiltBackwardEngaged", + "datatype": "boolean", + "description": "Tilt backward switch engaged (SingleSeat.Tilt).", + "type": "actuator" + }, + { + "name": "IsTiltForwardEngaged", + "datatype": "boolean", + "description": "Tilt forward switch engaged (SingleSeat.Tilt).", + "type": "actuator" + }, + { + "name": "IsUpEngaged", + "datatype": "boolean", + "description": "Seat up switch engaged (SingleSeat.Height).", + "type": "actuator" + }, + { + "name": "IsWarmerEngaged", + "datatype": "boolean", + "description": "Warmer switch for Seat heater (SingleSeat.Heating).", + "type": "actuator" + } + ] + }, + { + "name": "HeatingCooling", + "datatype": "int8", + "description": "Heating or Cooling requsted for the Item. -100 = Maximum cooling, 0 = Heating/cooling deactivated, 100 = Maximum heating.", + "max": 100, + "min": -100, + "type": "actuator", + "unit": "percent" + }, + { + "name": "Height", + "datatype": "uint16", + "description": "Seat position on vehicle z-axis. Position is relative within available movable range of the seating. 0 = Lowermost position supported.", + "min": 0, + "type": "actuator", + "unit": "mm" + }, + { + "name": "Massage", + "datatype": "uint8", + "description": "Seat massage level. 0 = off. 100 = max massage.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "Position", + "datatype": "uint16", + "description": "Seat position on vehicle x-axis. Position is relative to the frontmost position supported by the seat. 0 = Frontmost position supported.", + "min": 0, + "type": "actuator", + "unit": "mm" + }, + { + "name": "SeatBeltHeight", + "datatype": "uint16", + "description": "Seat belt position on vehicle z-axis. Position is relative within available movable range of the seat belt. 0 = Lowermost position supported.", + "type": "actuator", + "unit": "mm" + }, + { + "name": "Tilt", + "comment": "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.", + "datatype": "float", + "description": "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.", + "type": "actuator", + "unit": "degrees" + }, + { + "name": "IsBelted", + "datatype": "boolean", + "description": "Is the belt engaged.", + "type": "sensor" + }, + { + "name": "IsOccupied", + "datatype": "boolean", + "description": "Does the seat have a passenger in it.", + "type": "sensor" + } + ] + }, + { + "name": "Sunroof", + "children": [ + { + "name": "Shade", + "children": [ + { + "name": "IsOpen", + "datatype": "boolean", + "description": "Is item open or closed? True = Fully or partially open. False = Fully closed.", + "type": "actuator" + }, + { + "name": "Position", + "comment": "Relationship between Open/Close and Start/End position is item dependent.", + "datatype": "uint8", + "description": "Item position. 0 = Start position 100 = End position.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "Switch", + "allowed": [ + "INACTIVE", + "CLOSE", + "OPEN", + "ONE_SHOT_CLOSE", + "ONE_SHOT_OPEN" + ], + "datatype": "string", + "description": "Switch controlling sliding action such as window, sunroof, or blind.", + "type": "actuator" + } + ] + }, + { + "name": "Switch", + "allowed": [ + "INACTIVE", + "CLOSE", + "OPEN", + "ONE_SHOT_CLOSE", + "ONE_SHOT_OPEN", + "TILT_UP", + "TILT_DOWN" + ], + "datatype": "string", + "description": "Switch controlling sliding action such as window, sunroof, or shade.", + "type": "actuator" + }, + { + "name": "Position", + "datatype": "int8", + "description": "Sunroof position. 0 = Fully closed 100 = Fully opened. -100 = Fully tilted.", + "max": 100, + "min": -100, + "type": "sensor", + "unit": "percent" + } + ] + }, + { + "name": "IsAutoPowerOptimize", + "datatype": "boolean", + "description": "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.", + "type": "actuator" + }, + { + "name": "IsWindowChildLockEngaged", + "comment": "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.", + "datatype": "boolean", + "description": "Is window child lock engaged. True = Engaged. False = Disengaged.", + "type": "actuator" + }, + { + "name": "PowerOptimizeLevel", + "datatype": "uint8", + "description": "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.", + "max": 10, + "min": 0, + "type": "actuator" + }, + { + "name": "DoorCount", + "datatype": "uint8", + "default": 4, + "description": "Number of doors in vehicle.", + "type": "attribute" + }, + { + "name": "DriverPosition", + "allowed": [ + "LEFT", + "MIDDLE", + "RIGHT" + ], + "comment": "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.", + "datatype": "string", + "description": "The position of the driver seat in row 1.", + "type": "attribute" + }, + { + "name": "SeatPosCount", + "comment": "Default value corresponds to two seats in front row and 3 seats in second row.", + "datatype": "uint8[]", + "default": [ + 2, + 3 + ], + "description": "Number of seats across each row from the front to the rear.", + "type": "attribute" + }, + { + "name": "SeatRowCount", + "comment": "Default value corresponds to two rows of seats.", + "datatype": "uint8", + "default": 2, + "description": "Number of seat rows in vehicle.", + "type": "attribute" + } + ] + }, + { + "name": "Chassis", + "children": [ + { + "name": "Accelerator", + "children": [ + { + "name": "PedalPosition", + "datatype": "uint8", + "description": "Accelerator pedal position as percent. 0 = Not depressed. 100 = Fully depressed.", + "max": 100, + "min": 0, + "type": "sensor", + "unit": "percent" + } + ] + }, + { + "name": "Axle", + "children": [ + { + "name": "Wheel", + "children": [ + { + "name": "Brake", + "children": [ + { + "name": "FluidLevel", + "datatype": "uint8", + "description": "Brake fluid level as percent. 0 = Empty. 100 = Full.", + "max": 100, + "type": "sensor", + "unit": "percent" + }, + { + "name": "IsBrakesWorn", + "datatype": "boolean", + "description": "Brake pad wear status. True = Worn. False = Not Worn.", + "type": "sensor" + }, + { + "name": "IsFluidLevelLow", + "datatype": "boolean", + "description": "Brake fluid level status. True = Brake fluid level low. False = Brake fluid level OK.", + "type": "sensor" + }, + { + "name": "PadWear", + "datatype": "uint8", + "description": "Brake pad wear as percent. 0 = No Wear. 100 = Worn.", + "max": 100, + "type": "sensor", + "unit": "percent" + } + ] + }, + { + "name": "Tire", + "children": [ + { + "name": "IsPressureLow", + "datatype": "boolean", + "description": "Tire Pressure Status. True = Low tire pressure. False = Good tire pressure.", + "type": "sensor" + }, + { + "name": "Pressure", + "datatype": "uint16", + "description": "Tire pressure in kilo-Pascal.", + "type": "sensor", + "unit": "kPa" + }, + { + "name": "Temperature", + "datatype": "float", + "description": "Tire temperature in Celsius.", + "type": "sensor", + "unit": "celsius" + } + ] + }, + { + "name": "AngularSpeed", + "comment": "Positive if wheel is trying to drive vehicle forward. Negative if wheel is trying to drive vehicle backward.", + "datatype": "float", + "description": "Angular (Rotational) speed of a vehicle's wheel.", + "type": "sensor", + "unit": "degrees/s" + }, + { + "name": "Speed", + "datatype": "float", + "description": "Linear speed of a vehicle's wheel.", + "type": "sensor", + "unit": "km/h" + } + ] + }, + { + "name": "AxleWidth", + "comment": "Corresponds to SAE J1100-2009 W113.", + "datatype": "uint16", + "description": "The lateral distance between the wheel mounting faces, measured along the spindle axis.", + "type": "attribute", + "unit": "mm" + }, + { + "name": "TireAspectRatio", + "datatype": "uint8", + "description": "Aspect ratio between tire section height and tire section width, as per ETRTO / TRA standard.", + "type": "attribute", + "unit": "percent" + }, + { + "name": "TireDiameter", + "datatype": "float", + "description": "Outer diameter of tires, in inches, as per ETRTO / TRA standard.", + "type": "attribute", + "unit": "inch" + }, + { + "name": "TireWidth", + "datatype": "uint16", + "description": "Nominal section width of tires, in mm, as per ETRTO / TRA standard.", + "type": "attribute", + "unit": "mm" + }, + { + "name": "TrackWidth", + "comment": "Corresponds to SAE J1100-2009 W102.", + "datatype": "uint16", + "description": "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.", + "type": "attribute", + "unit": "mm" + }, + { + "name": "TreadWidth", + "comment": "Corresponds to SAE J1100-2009 W101.", + "datatype": "uint16", + "description": "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.", + "type": "attribute", + "unit": "mm" + }, + { + "name": "WheelCount", + "datatype": "uint8", + "description": "Number of wheels on the axle", + "type": "attribute" + }, + { + "name": "WheelDiameter", + "datatype": "float", + "description": "Diameter of wheels (rims without tires), in inches, as per ETRTO / TRA standard.", + "type": "attribute", + "unit": "inch" + }, + { + "name": "WheelWidth", + "datatype": "float", + "description": "Width of wheels (rims without tires), in inches, as per ETRTO / TRA standard.", + "type": "attribute", + "unit": "inch" + }, + { + "name": "SteeringAngle", + "comment": "Single track two-axle model steering angle refers to the angle that a centrally mounted wheel would have.", + "datatype": "float", + "description": "Single track two-axle model steering angle. Angle according to ISO 8855. Positive = degrees to the left. Negative = degrees to the right.", + "type": "sensor", + "unit": "degrees" + } + ] + }, + { + "name": "Brake", + "children": [ + { + "name": "IsDriverEmergencyBrakingDetected", + "comment": "Detection of emergency braking can trigger Emergency Brake Assist (EBA) to engage.", + "datatype": "boolean", + "description": "Indicates if emergency braking initiated by driver is detected. True = Emergency braking detected. False = Emergency braking not detected.", + "type": "sensor" + }, + { + "name": "PedalPosition", + "datatype": "uint8", + "description": "Brake pedal position as percent. 0 = Not depressed. 100 = Fully depressed.", + "max": 100, + "min": 0, + "type": "sensor", + "unit": "percent" + } + ] + }, + { + "name": "ParkingBrake", + "children": [ + { + "name": "IsAutoApplyEnabled", + "datatype": "boolean", + "description": "Indicates if parking brake will be automatically engaged when the vehicle engine is turned off.", + "type": "actuator" + }, + { + "name": "IsEngaged", + "datatype": "boolean", + "description": "Parking brake status. True = Parking Brake is Engaged. False = Parking Brake is not Engaged.", + "type": "actuator" + } + ] + }, + { + "name": "SteeringWheel", + "children": [ + { + "name": "Extension", + "datatype": "uint8", + "description": "Steering wheel column extension from dashboard. 0 = Closest to dashboard. 100 = Furthest from dashboard.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "HeatingCooling", + "datatype": "int8", + "description": "Heating or Cooling requsted for the Item. -100 = Maximum cooling, 0 = Heating/cooling deactivated, 100 = Maximum heating.", + "max": 100, + "min": -100, + "type": "actuator", + "unit": "percent" + }, + { + "name": "Tilt", + "datatype": "uint8", + "description": "Steering wheel column tilt. 0 = Lowest position. 100 = Highest position.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "Angle", + "datatype": "int16", + "description": "Steering wheel angle. Positive = degrees to the left. Negative = degrees to the right.", + "type": "sensor", + "unit": "degrees" + } + ] + }, + { + "name": "AxleCount", + "datatype": "uint8", + "default": 2, + "description": "Number of axles on the vehicle", + "type": "attribute" + }, + { + "name": "Wheelbase", + "datatype": "uint16", + "default": 0, + "description": "Overall wheelbase, in mm.", + "type": "attribute", + "unit": "mm" + } + ] + }, + { + "name": "Connectivity", + "children": [ + { + "name": "IsConnectivityAvailable", + "comment": "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.", + "datatype": "boolean", + "description": "Indicates if connectivity between vehicle and cloud is available. True = Connectivity is available. False = Connectivity is not available.", + "type": "sensor" + } + ] + }, + { + "name": "CurrentLocation", + "children": [ + { + "name": "GNSSReceiver", + "children": [ + { + "name": "MountingPosition", + "children": [ + { + "name": "X", + "datatype": "int16", + "description": "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.", + "type": "attribute", + "unit": "mm" + }, + { + "name": "Y", + "datatype": "int16", + "description": "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.", + "type": "attribute", + "unit": "mm" + }, + { + "name": "Z", + "datatype": "int16", + "description": "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.", + "type": "attribute", + "unit": "mm" + } + ] + }, + { + "name": "FixType", + "allowed": [ + "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" + ], + "datatype": "string", + "description": "Fix status of GNSS receiver.", + "type": "sensor" + } + ] + }, + { + "name": "Altitude", + "datatype": "double", + "description": "Current altitude relative to WGS 84 reference ellipsoid, as measured at the position of GNSS receiver antenna.", + "type": "sensor", + "unit": "m" + }, + { + "name": "Heading", + "datatype": "double", + "description": "Current heading relative to geographic north. 0 = North, 90 = East, 180 = South, 270 = West.", + "max": 360, + "min": 0, + "type": "sensor", + "unit": "degrees" + }, + { + "name": "HorizontalAccuracy", + "datatype": "double", + "description": "Accuracy of the latitude and longitude coordinates.", + "type": "sensor", + "unit": "m" + }, + { + "name": "Latitude", + "datatype": "double", + "description": "Current latitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna.", + "max": 90, + "min": -90, + "type": "sensor", + "unit": "degrees" + }, + { + "name": "Longitude", + "datatype": "double", + "description": "Current longitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna.", + "max": 180, + "min": -180, + "type": "sensor", + "unit": "degrees" + }, + { + "name": "Timestamp", + "datatype": "string", + "description": "Timestamp from GNSS system for current location, formatted according to ISO 8601 with UTC time zone.", + "type": "sensor", + "unit": "iso8601" + }, + { + "name": "VerticalAccuracy", + "datatype": "double", + "description": "Accuracy of altitude.", + "type": "sensor", + "unit": "m" + } + ] + }, + { + "name": "Diagnostics", + "children": [ + { + "name": "DTCCount", + "datatype": "uint8", + "description": "Number of Diagnostic Trouble Codes (DTC)", + "type": "sensor" + }, + { + "name": "DTCList", + "datatype": "string[]", + "description": "List of currently active DTCs formatted according OBD II (SAE-J2012DA_201812) standard ([P|C|B|U]XXXXX )", + "type": "sensor" + } + ] + }, + { + "name": "Driver", + "children": [ + { + "name": "Identifier", + "children": [ + { + "name": "Issuer", + "datatype": "string", + "deprecation": "v5.0 - use data from Vehicle.Occupant.*.*.Identifier.", + "description": "Unique Issuer for the authentication of the occupant e.g. https://accounts.funcorp.com.", + "type": "sensor" + }, + { + "name": "Subject", + "datatype": "string", + "deprecation": "v5.0 - use data from Vehicle.Occupant.*.*.Identifier.", + "description": "Subject for the authentication of the occupant e.g. UserID 7331677.", + "type": "sensor" + } + ] + }, + { + "name": "AttentiveProbability", + "datatype": "float", + "description": "Probability of attentiveness of the driver.", + "max": 100, + "min": 0, + "type": "sensor", + "unit": "percent" + }, + { + "name": "DistractionLevel", + "datatype": "float", + "description": "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.", + "max": 100, + "min": 0, + "type": "sensor", + "unit": "percent" + }, + { + "name": "FatigueLevel", + "datatype": "float", + "description": "Fatigue level of the driver, which can be evaluated by multiple factors e.g. trip time, behaviour of steering, eye status.", + "max": 100, + "min": 0, + "type": "sensor", + "unit": "percent" + }, + { + "name": "HeartRate", + "datatype": "uint16", + "description": "Heart rate of the driver.", + "type": "sensor", + "unit": "bpm" + }, + { + "name": "IsEyesOnRoad", + "datatype": "boolean", + "description": "Has driver the eyes on road or not?", + "type": "sensor" + }, + { + "name": "IsHandsOnWheel", + "datatype": "boolean", + "description": "Are the driver's hands on the steering wheel or not?", + "type": "sensor" + } + ] + }, + { + "name": "Exterior", + "children": [ + { + "name": "AirTemperature", + "datatype": "float", + "description": "Air temperature outside the vehicle.", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "Humidity", + "datatype": "float", + "description": "Relative humidity outside the vehicle. 0 = Dry, 100 = Air fully saturated.", + "max": 100, + "min": 0, + "type": "sensor", + "unit": "percent" + }, + { + "name": "LightIntensity", + "comment": "Mapping to physical units and calculation method is sensor specific.", + "datatype": "float", + "description": "Light intensity outside the vehicle. 0 = No light detected, 100 = Fully lit.", + "max": 100, + "min": 0, + "type": "sensor", + "unit": "percent" + } + ] + }, + { + "name": "LowVoltageBattery", + "children": [ + { + "name": "NominalCapacity", + "datatype": "uint16", + "description": "Nominal capacity of the low voltage battery.", + "type": "attribute", + "unit": "Ah" + }, + { + "name": "NominalVoltage", + "comment": "Nominal voltage typically refers to voltage of fully charged battery when delivering rated capacity.", + "datatype": "uint16", + "description": "Nominal Voltage of the battery.", + "type": "attribute", + "unit": "V" + }, + { + "name": "CurrentCurrent", + "datatype": "float", + "description": "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.", + "type": "sensor", + "unit": "A" + }, + { + "name": "CurrentVoltage", + "datatype": "float", + "description": "Current Voltage of the low voltage battery.", + "type": "sensor", + "unit": "V" + } + ] + }, + { + "name": "MotionManagement", + "children": [ + { + "name": "Brake", + "children": [ + { + "name": "Axle", + "children": [ + { + "name": "Wheel", + "children": [ + { + "name": "OmegaLower", + "datatype": "uint16", + "description": "Lower wheel speed limit request controlled by friction brake. ISO 8855 wheel-spin velocity.", + "type": "actuator", + "unit": "rad/s" + }, + { + "name": "OmegaUpper", + "datatype": "uint16", + "description": "Upper wheel speed limit request controlled by friction brake. ISO 8855 wheel-spin velocity.", + "type": "actuator", + "unit": "rad/s" + }, + { + "name": "TorqueFrictionMaximum", + "datatype": "int16", + "description": "Maximum wheel torque request for friction brake. Brake Torque < 0Nm.", + "max": 0, + "type": "actuator", + "unit": "Nm" + }, + { + "name": "TorqueFrictionMinimum", + "datatype": "int16", + "description": "Minimum wheel torque request for friction brake. Brake Torque < 0Nm.", + "max": 0, + "type": "actuator", + "unit": "Nm" + }, + { + "name": "Torque", + "datatype": "int16", + "description": "Estimated friction brake torque. Brake Torque < 0Nm.", + "max": 0, + "type": "sensor", + "unit": "Nm" + }, + { + "name": "TorqueArbitrated", + "datatype": "int16", + "description": "Brake system internally calculated friction brake torque target. Brake Torque < 0Nm.", + "max": 0, + "type": "sensor", + "unit": "Nm" + } + ] + }, + { + "name": "TorqueDistributionFrictionRightMaximum", + "datatype": "uint16", + "description": "Maximum distribution range of the friction brake request on the axle to the right wheel. 0% = Complete friction torque shall be shifted to the left wheel. 50% = At most 50% friction torque may be shifted to the right wheel. 100% = Complete friction torque may be shifted to the right wheel.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "TorqueDistributionFrictionRightMinimum", + "datatype": "uint16", + "description": "Minimum distribution range of the friction brake request on the axle to the right wheel. 0% = Complete friction torque may be shifted to the left wheel. 50% = At least 50% friction torque shall be shifted to the right wheel. 100% = Complete friction torque shall be shifted to the right wheel.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "TorqueElectricMinimum", + "datatype": "int16", + "description": "Limit for regenerative brake torque at given axle. Brake Torque < 0Nm.", + "max": 0.0, + "type": "actuator", + "unit": "Nm" + }, + { + "name": "TorqueFrictionDifferenceMaximum", + "datatype": "uint16", + "description": "Maximum absolute wheel torque difference between left and right wheel for friction brake.", + "type": "actuator", + "unit": "Nm" + } + ] + }, + { + "name": "VehicleForceDistributionFrontMaximum", + "datatype": "uint16", + "description": "Maximum distribution range request of FxWhlSum to front axle. 0% = Complete longitudinal brake force shall be shifted to rear axle. 50% = At most 50% shall be shifted to front axle. 100% = Complete longitudinal brake force may be shifted to front axle.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "VehicleForceDistributionFrontMinimum", + "datatype": "uint16", + "description": "Minimum distribution range request of FxWhlSum to front axle. 0% = Complete longitudinal brake force may be shifted to rear axle. 50% = At least 50% shall be shifted to front axle. 100% = Complete longitudinal brake force shall be shifted to front axle.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "VehicleForceElectric", + "datatype": "int16", + "description": "Regenerative brake force request (FxWhlSum). Sum of all tyre longitudinal forces. Brake Force < 0N.", + "max": 0, + "type": "actuator", + "unit": "N" + }, + { + "name": "VehicleForceMaximum", + "datatype": "int16", + "description": "Maximum longitudinal brake force request (FxWhlSum). Sum of all tyre longitudinal forces. Brake Force < 0N.", + "max": 0, + "type": "actuator", + "unit": "N" + }, + { + "name": "VehicleForceElectricMinimumArbitrated", + "datatype": "int16", + "description": "Brake system internally calculated regenerative force limit at vehicle level for eAxle actuation. Brake Force < 0N.", + "max": 0, + "type": "sensor", + "unit": "N" + } + ] + }, + { + "name": "ElectricAxle", + "children": [ + { + "name": "RotationalSpeedMaximumLimit", + "datatype": "int16", + "description": "Maximum allowed axle rotational speed in torque control mode, positive sign for rotation in forward direction, negative sign for rotation in backward direction.", + "type": "actuator", + "unit": "rpm" + }, + { + "name": "RotationalSpeedMinimumLimit", + "datatype": "int16", + "description": "Minimum allowed axle rotational speed in torque control mode, positive sign for rotation in forward direction, negative sign for rotation in backward direction.", + "type": "actuator", + "unit": "rpm" + }, + { + "name": "RotationalSpeedTarget", + "datatype": "int16", + "description": "Target axle rotational speed in rotation speed control mode, positive sign for rotation in forward direction, negative sign for rotation in backward direction.", + "type": "actuator", + "unit": "rpm" + }, + { + "name": "TorqueMaximumLimit", + "datatype": "int16", + "description": "Maximum allowed eAxle torque in rotation speed control mode, positive sign for torque in forward direction, negative sign unused.", + "type": "actuator", + "unit": "Nm" + }, + { + "name": "TorqueMinimumLimit", + "datatype": "int16", + "description": "Minimum allowed axle torque in rotation speed control mode, positive sign unused, negative sign for torque in backward direction (ISO8855).", + "type": "actuator", + "unit": "Nm" + }, + { + "name": "TorqueTarget", + "datatype": "int16", + "description": "Target axle torque in torque control mode, positive sign for torque in forward direction, negative sign for torque in backward direction (ISO8855).", + "type": "actuator", + "unit": "Nm" + }, + { + "name": "RotationalSpeed", + "datatype": "int16", + "description": "Rotational speed for the specified axle, positive sign for rotation in forward direction, negative sign for rotation in backward direction.", + "type": "sensor", + "unit": "rpm" + }, + { + "name": "Torque", + "datatype": "int16", + "description": "Axle torque, positive sign for torque in forward direction, negative sign for torque in backward direction.", + "type": "sensor", + "unit": "Nm" + }, + { + "name": "TorqueLongTermMaximum", + "datatype": "int16", + "description": "Maximum long-term available eAxle torque, default time horizon = 10 sec, positive sign for torque in forward direction, negative sign for torque in backward direction.", + "type": "sensor", + "unit": "Nm" + }, + { + "name": "TorqueLongTermMinimum", + "datatype": "int16", + "description": "Minimum long-term available eAxle torque, default time horizon = 10 sec, positive sign for torque in forward direction, negative sign for torque in backward direction.", + "type": "sensor", + "unit": "Nm" + }, + { + "name": "TorqueMaximum", + "datatype": "int16", + "description": "Maximum momentarily available eAxle torque, positive sign for torque in forward direction, negative sign for torque in backward direction.", + "type": "sensor", + "unit": "Nm" + }, + { + "name": "TorqueMinimum", + "datatype": "int16", + "description": "Minimum momentarily available eAxle torque, positive sign for torque in forward direction, negative sign for torque in backward direction.", + "type": "sensor", + "unit": "Nm" + }, + { + "name": "TorqueShortTermMaximum", + "datatype": "int16", + "description": "Maximum short-term available eAxle torque, default time horizon = 1 sec, positive sign for torque in forward direction, negative sign for torque in backward direction.", + "type": "sensor", + "unit": "Nm" + }, + { + "name": "TorqueShortTermMinimum", + "datatype": "int16", + "description": "Minimum short-term available eAxle torque, default time horizon = 1 sec, positive sign for torque in forward direction, negative sign for torque in backward direction.", + "type": "sensor", + "unit": "Nm" + } + ] + }, + { + "name": "Steering", + "children": [ + { + "name": "Axle", + "children": [ + { + "name": "RackPositionOffsetTarget", + "datatype": "int16", + "description": "Rack position offset request to the axle steering actuator (for steer-by-wire), added to the actuator internal calculated set-point. Positive values without internal calculated set point change lead to a left movement of the vehicle (based on ISO8855).", + "type": "actuator", + "unit": "mm" + }, + { + "name": "RackPositionOffsetTargetMode", + "datatype": "uint8", + "description": "Mode used for controlling rack position offset interface of axle steering actuator. 0 indicates interface disabled. Other values activate vehicle specific modes.", + "type": "actuator" + }, + { + "name": "RackPositionTarget", + "datatype": "int16", + "description": "Rack position request to the axle steering actuator (external set-point). Positive values lead to a left turn of the vehicle (based on ISO8855).", + "type": "actuator", + "unit": "mm" + }, + { + "name": "RackPositionTargetMode", + "datatype": "uint8", + "description": "Mode used for controlling rack position interface of axle steering actuator. 0 indicates interface disabled. Other values activate vehicle specific modes.", + "type": "actuator" + }, + { + "name": "RackPosition", + "datatype": "int16", + "description": "Represents the current position of the steering rack on axle steering actuator. Positive values leads to a left turn of the vehicle (based on ISO8855).", + "type": "sensor", + "unit": "mm" + } + ] + }, + { + "name": "SteeringWheel", + "children": [ + { + "name": "AngleTarget", + "datatype": "int16", + "description": "Steering-wheel angle request to the steering actuator (external set-point for steer-by-wire). Positive sign for angle in counterclockwise direction (based on ISO8855).", + "type": "actuator", + "unit": "degrees" + }, + { + "name": "AngleTargetMode", + "datatype": "uint8", + "description": "Mode used for controlling Steering-wheel angle interface. 0 indicates interface disabled. Other values activate vehicle specific modes.", + "type": "actuator" + }, + { + "name": "TorqueOffsetTarget", + "datatype": "int16", + "description": "Steering-wheel torque offset request to the steering actuator, added to the actuator internal calculated target value. Positive sign for torque in counterclockwise direction (based on ISO8855).", + "type": "actuator", + "unit": "Nm" + }, + { + "name": "TorqueOffsetTargetMode", + "datatype": "uint8", + "description": "Mode used for controlling steering-wheel torque offset interface. 0 indicates interface disabled. Other values activate vehicle specific modes.", + "type": "actuator" + }, + { + "name": "TorqueTarget", + "datatype": "int16", + "description": "Steering-wheel torque request to the steering actuator (external set-point for steer-by-wire). Positive sign for torque in counterclockwise direction (based on ISO8855).", + "type": "actuator", + "unit": "Nm" + }, + { + "name": "TorqueTargetMode", + "datatype": "uint8", + "description": "Mode used for controlling Steering-wheel torque interface. 0 indicates interface disabled. Other values activate vehicle specific modes.", + "type": "actuator" + }, + { + "name": "Angle", + "datatype": "int16", + "description": "Represents the current input angle of the steering system, typically corresponds to angle applied by driver on the steering-wheel. Positive for angle in counterclockwise direction (based on ISO8855).", + "type": "sensor", + "unit": "degrees" + }, + { + "name": "Torque", + "datatype": "int16", + "description": "Represents the current input torque for steering system, typically corresponds to torque applied by driver on the steering wheel. Positive for torque in counterclockwise direction (based on ISO8855).", + "type": "sensor", + "unit": "Nm" + } + ] + } + ] + } + ] + }, + { + "name": "OBD", + "children": [ + { + "name": "Catalyst", + "children": [ + { + "name": "Bank1", + "children": [ + { + "name": "Temperature1", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 3C - Catalyst temperature from bank 1, sensor 1", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "Temperature2", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 3E - Catalyst temperature from bank 1, sensor 2", + "type": "sensor", + "unit": "celsius" + } + ] + }, + { + "name": "Bank2", + "children": [ + { + "name": "Temperature1", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 3D - Catalyst temperature from bank 2, sensor 1", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "Temperature2", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 3F - Catalyst temperature from bank 2, sensor 2", + "type": "sensor", + "unit": "celsius" + } + ] + } + ] + }, + { + "name": "DriveCycleStatus", + "children": [ + { + "name": "DTCCount", + "datatype": "uint8", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "Number of sensor Trouble Codes (DTC)", + "type": "sensor" + }, + { + "name": "IgnitionType", + "allowed": [ + "SPARK", + "COMPRESSION" + ], + "datatype": "string", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "Type of the ignition for ICE - spark = spark plug ignition, compression = self-igniting (Diesel engines)", + "type": "sensor" + }, + { + "name": "IsMILOn", + "datatype": "boolean", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "Malfunction Indicator Light (MIL) - False = Off, True = On", + "type": "sensor" + } + ] + }, + { + "name": "O2", + "children": [ + { + "name": "ShortTermFuelTrim", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 1x (byte B) - Short term fuel trim", + "type": "sensor", + "unit": "percent" + }, + { + "name": "Voltage", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 1x (byte A) - Sensor voltage", + "type": "sensor", + "unit": "V" + } + ] + }, + { + "name": "O2WR", + "children": [ + { + "name": "Current", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 3x (byte CD) - Current for wide range/band oxygen sensor", + "type": "sensor", + "unit": "A" + }, + { + "name": "Lambda", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 2x (byte AB) and PID 3x (byte AB) - Lambda for wide range/band oxygen sensor", + "type": "sensor" + }, + { + "name": "Voltage", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 2x (byte CD) - Voltage for wide range/band oxygen sensor", + "type": "sensor", + "unit": "V" + } + ] + }, + { + "name": "Status", + "children": [ + { + "name": "IgnitionType", + "allowed": [ + "SPARK", + "COMPRESSION" + ], + "datatype": "string", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "Type of the ignition for ICE - spark = spark plug ignition, compression = self-igniting (Diesel engines)", + "type": "attribute" + }, + { + "name": "DTCCount", + "datatype": "uint8", + "deprecation": "v5.0 replaced with Vehicle.Diagnostics.DTCCount", + "description": "Number of Diagnostic Trouble Codes (DTC)", + "type": "sensor" + }, + { + "name": "IsMILOn", + "datatype": "boolean", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "Malfunction Indicator Light (MIL) False = Off, True = On", + "type": "sensor" + } + ] + }, + { + "name": "FuelType", + "datatype": "uint8", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 51 - Fuel type", + "max": 23, + "min": 0, + "type": "attribute" + }, + { + "name": "OBDStandards", + "datatype": "uint8", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 1C - OBD standards this vehicle conforms to", + "type": "attribute" + }, + { + "name": "PidsA", + "allowed": [ + "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" + ], + "datatype": "string[]", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 00 - Array of the supported PIDs 01 to 20 in Hexadecimal.", + "type": "attribute" + }, + { + "name": "PidsB", + "allowed": [ + "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" + ], + "datatype": "string[]", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 20 - Array of the supported PIDs 21 to 40 in Hexadecimal.", + "type": "attribute" + }, + { + "name": "PidsC", + "allowed": [ + "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" + ], + "datatype": "string[]", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 40 - Array of the supported PIDs 41 to 60 in Hexadecimal.", + "type": "attribute" + }, + { + "name": "AbsoluteLoad", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 43 - Absolute load value", + "type": "sensor", + "unit": "percent" + }, + { + "name": "AcceleratorPositionD", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 49 - Accelerator pedal position D", + "type": "sensor", + "unit": "percent" + }, + { + "name": "AcceleratorPositionE", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 4A - Accelerator pedal position E", + "type": "sensor", + "unit": "percent" + }, + { + "name": "AcceleratorPositionF", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 4B - Accelerator pedal position F", + "type": "sensor", + "unit": "percent" + }, + { + "name": "AirStatus", + "datatype": "string", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 12 - Secondary air status", + "type": "sensor" + }, + { + "name": "AmbientAirTemperature", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 46 - Ambient air temperature", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "BarometricPressure", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 33 - Barometric pressure", + "type": "sensor", + "unit": "kPa" + }, + { + "name": "CommandedEGR", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 2C - Commanded exhaust gas recirculation (EGR)", + "type": "sensor", + "unit": "percent" + }, + { + "name": "CommandedEVAP", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 2E - Commanded evaporative purge (EVAP) valve", + "type": "sensor", + "unit": "percent" + }, + { + "name": "CommandedEquivalenceRatio", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 44 - Commanded equivalence ratio", + "type": "sensor", + "unit": "ratio" + }, + { + "name": "ControlModuleVoltage", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 42 - Control module voltage", + "type": "sensor", + "unit": "V" + }, + { + "name": "CoolantTemperature", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 05 - Coolant temperature", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "DTCList", + "datatype": "string[]", + "deprecation": "v5.0 replaced with Vehicle.Diagnostics.DTCList", + "description": "List of currently active DTCs formatted according OBD II (SAE-J2012DA_201812) standard ([P|C|B|U]XXXXX )", + "type": "sensor" + }, + { + "name": "DistanceSinceDTCClear", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 31 - Distance traveled since codes cleared", + "type": "sensor", + "unit": "km" + }, + { + "name": "DistanceWithMIL", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 21 - Distance traveled with MIL on", + "type": "sensor", + "unit": "km" + }, + { + "name": "EGRError", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 2D - Exhaust gas recirculation (EGR) error", + "type": "sensor", + "unit": "percent" + }, + { + "name": "EVAPVaporPressure", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 32 - Evaporative purge (EVAP) system pressure", + "type": "sensor", + "unit": "Pa" + }, + { + "name": "EVAPVaporPressureAbsolute", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 53 - Absolute evaporative purge (EVAP) system pressure", + "type": "sensor", + "unit": "kPa" + }, + { + "name": "EVAPVaporPressureAlternate", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 54 - Alternate evaporative purge (EVAP) system pressure", + "type": "sensor", + "unit": "Pa" + }, + { + "name": "EngineLoad", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 04 - Engine load in percent - 0 = no load, 100 = full load", + "type": "sensor", + "unit": "percent" + }, + { + "name": "EngineSpeed", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 0C - Engine speed measured as rotations per minute", + "type": "sensor", + "unit": "rpm" + }, + { + "name": "EthanolPercent", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 52 - Percentage of ethanol in the fuel", + "type": "sensor", + "unit": "percent" + }, + { + "name": "FreezeDTC", + "datatype": "string", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 02 - DTC that triggered the freeze frame", + "type": "sensor" + }, + { + "name": "FuelInjectionTiming", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 5D - Fuel injection timing", + "type": "sensor", + "unit": "degrees" + }, + { + "name": "FuelLevel", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 2F - Fuel level in the fuel tank", + "type": "sensor", + "unit": "percent" + }, + { + "name": "FuelPressure", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 0A - Fuel pressure", + "type": "sensor", + "unit": "kPa" + }, + { + "name": "FuelRailPressureAbsolute", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 59 - Absolute fuel rail pressure", + "type": "sensor", + "unit": "kPa" + }, + { + "name": "FuelRailPressureDirect", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 23 - Fuel rail pressure direct inject", + "type": "sensor", + "unit": "kPa" + }, + { + "name": "FuelRailPressureVac", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 22 - Fuel rail pressure relative to vacuum", + "type": "sensor", + "unit": "kPa" + }, + { + "name": "FuelRate", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 5E - Engine fuel rate", + "type": "sensor", + "unit": "l/h" + }, + { + "name": "FuelStatus", + "datatype": "string", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 03 - Fuel status", + "type": "sensor" + }, + { + "name": "HybridBatteryRemaining", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 5B - Remaining life of hybrid battery", + "type": "sensor", + "unit": "percent" + }, + { + "name": "IntakeTemp", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 0F - Intake temperature", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "IsPTOActive", + "datatype": "boolean", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 1E - Auxiliary input status (power take off)", + "type": "sensor" + }, + { + "name": "LongTermFuelTrim1", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 07 - Long Term (learned) Fuel Trim - Bank 1 - negative percent leaner, positive percent richer", + "type": "sensor", + "unit": "percent" + }, + { + "name": "LongTermFuelTrim2", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 09 - Long Term (learned) Fuel Trim - Bank 2 - negative percent leaner, positive percent richer", + "type": "sensor", + "unit": "percent" + }, + { + "name": "LongTermO2Trim1", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 56 (byte A) - Long term secondary O2 trim - Bank 1", + "type": "sensor", + "unit": "percent" + }, + { + "name": "LongTermO2Trim2", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 58 (byte A) - Long term secondary O2 trim - Bank 2", + "type": "sensor", + "unit": "percent" + }, + { + "name": "LongTermO2Trim3", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 56 (byte B) - Long term secondary O2 trim - Bank 3", + "type": "sensor", + "unit": "percent" + }, + { + "name": "LongTermO2Trim4", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 58 (byte B) - Long term secondary O2 trim - Bank 4", + "type": "sensor", + "unit": "percent" + }, + { + "name": "MAF", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 10 - Grams of air drawn into engine per second", + "type": "sensor", + "unit": "g/s" + }, + { + "name": "MAP", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 0B - Intake manifold pressure", + "type": "sensor", + "unit": "kPa" + }, + { + "name": "MaxMAF", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 50 - Maximum flow for mass air flow sensor", + "type": "sensor", + "unit": "g/s" + }, + { + "name": "OilTemperature", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 5C - Engine oil temperature", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "OxygenSensorsIn2Banks", + "datatype": "uint8", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 13 - Presence of oxygen sensors in 2 banks. [A0..A3] == Bank 1, Sensors 1-4. [A4..A7] == Bank 2, Sensors 1-4", + "type": "sensor" + }, + { + "name": "OxygenSensorsIn4Banks", + "datatype": "uint8", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 1D - Presence of oxygen sensors in 4 banks. Similar to PID 13, but [A0..A7] == [B1S1, B1S2, B2S1, B2S2, B3S1, B3S2, B4S1, B4S2]", + "type": "sensor" + }, + { + "name": "RelativeAcceleratorPosition", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 5A - Relative accelerator pedal position", + "type": "sensor", + "unit": "percent" + }, + { + "name": "RelativeThrottlePosition", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 45 - Relative throttle position", + "type": "sensor", + "unit": "percent" + }, + { + "name": "RunTime", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 1F - Engine run time", + "type": "sensor", + "unit": "s" + }, + { + "name": "RunTimeMIL", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 4D - Run time with MIL on", + "type": "sensor", + "unit": "min" + }, + { + "name": "ShortTermFuelTrim1", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 06 - Short Term (immediate) Fuel Trim - Bank 1 - negative percent leaner, positive percent richer", + "type": "sensor", + "unit": "percent" + }, + { + "name": "ShortTermFuelTrim2", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 08 - Short Term (immediate) Fuel Trim - Bank 2 - negative percent leaner, positive percent richer", + "type": "sensor", + "unit": "percent" + }, + { + "name": "ShortTermO2Trim1", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 55 (byte A) - Short term secondary O2 trim - Bank 1", + "type": "sensor", + "unit": "percent" + }, + { + "name": "ShortTermO2Trim2", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 57 (byte A) - Short term secondary O2 trim - Bank 2", + "type": "sensor", + "unit": "percent" + }, + { + "name": "ShortTermO2Trim3", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 55 (byte B) - Short term secondary O2 trim - Bank 3", + "type": "sensor", + "unit": "percent" + }, + { + "name": "ShortTermO2Trim4", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 57 (byte B) - Short term secondary O2 trim - Bank 4", + "type": "sensor", + "unit": "percent" + }, + { + "name": "Speed", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 0D - Vehicle speed", + "type": "sensor", + "unit": "km/h" + }, + { + "name": "ThrottleActuator", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 4C - Commanded throttle actuator", + "type": "sensor", + "unit": "percent" + }, + { + "name": "ThrottlePosition", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 11 - Throttle position - 0 = closed throttle, 100 = open throttle", + "type": "sensor", + "unit": "percent" + }, + { + "name": "ThrottlePositionB", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 47 - Absolute throttle position B", + "type": "sensor", + "unit": "percent" + }, + { + "name": "ThrottlePositionC", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 48 - Absolute throttle position C", + "type": "sensor", + "unit": "percent" + }, + { + "name": "TimeSinceDTCCleared", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 4E - Time since trouble codes cleared", + "type": "sensor", + "unit": "min" + }, + { + "name": "TimingAdvance", + "datatype": "float", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 0E - Time advance", + "type": "sensor", + "unit": "degrees" + }, + { + "name": "WarmupsSinceDTCClear", + "datatype": "uint8", + "deprecation": "v5.0 OBD-branch is deprecated.", + "description": "PID 30 - Number of warm-ups since codes cleared", + "type": "sensor" + } + ] + }, + { + "name": "Occupant", + "children": [ + { + "name": "HeadPosition", + "children": [ + { + "name": "Pitch", + "datatype": "float", + "description": "Head pitch angle, measured as angle from vehicle sprung mass XY-plane as defined by ISO 23150:2023 to the head X-axis. 0 = Head in normal position. Positive values = Head leaning up. Negative values = Head leaning down.", + "max": 90, + "min": -90, + "type": "sensor", + "unit": "degrees" + }, + { + "name": "Roll", + "datatype": "float", + "description": "Head roll angle about the head X-axis (right-hand rule). 0 = Head in normal position. Positive values = Head leaning to the right. Negative values = Head leaning to the left.", + "max": 180, + "min": -180, + "type": "sensor", + "unit": "degrees" + }, + { + "name": "X", + "datatype": "int16", + "description": "Longitudinal position of head center measured as mid eye position on X-axis of the vehicle rear-axle coordinate system as defined by ISO 23150:2023 section 3.7.12 Mid eye position refers to the center of a line drawn between the center of the drivers eyes. Positive values = forward of (first) rear-axle. Negative values = backward of (first) rear-axle.", + "type": "sensor", + "unit": "mm" + }, + { + "name": "Y", + "datatype": "int16", + "description": "Lateral position of head center measured as mid eye position on X-axis of the vehicle rear-axle coordinate system as defined by ISO 23150:2023 section 3.7.12 Mid eye position refers to the center of a line drawn between the center of the drivers eyes. Positive values = left of rear-axle center. Negative values = right of rear-axle center.", + "type": "sensor", + "unit": "mm" + }, + { + "name": "Yaw", + "datatype": "float", + "description": "Head yaw angle, measured from the vehicle sprung mass X-axis as defined by ISO 23150:2023 to the head X-axis, around the vehicle Z-axis (right-hand rule). 0 = Head in normal position. Positive values = Head turned left. Negative values = Head turned right.", + "max": 180, + "min": -180, + "type": "sensor", + "unit": "degrees" + }, + { + "name": "Z", + "datatype": "int16", + "description": "Height position of head center measured as mid eye position on X-axis of the vehicle rear-axle coordinate system as defined by ISO 23150:2023 section 3.7.12 Mid eye position refers to the center of a line drawn between the center of the drivers eyes. Positive values = above center of rear-axle reference point. Negative values = below center of rear-axle reference point.", + "type": "sensor", + "unit": "mm" + } + ] + }, + { + "name": "Identifier", + "children": [ + { + "name": "Issuer", + "datatype": "string", + "description": "Unique Issuer for the authentication of the occupant e.g. https://accounts.funcorp.com.", + "type": "sensor" + }, + { + "name": "Subject", + "datatype": "string", + "description": "Subject for the authentication of the occupant e.g. UserID 7331677.", + "type": "sensor" + } + ] + }, + { + "name": "MidEyeGaze", + "children": [ + { + "name": "Azimuth", + "datatype": "float", + "description": "Mid eye azimuth gaze (right-hand rule) on vehicle sprung mass Z-axis as defined by ISO 23150:2023 0 = Driver looking forward. Positive values = Driver looking at something on the left side of driver. Negative values = Driver looking at something on the right side of driver.", + "max": 180, + "min": -180, + "type": "sensor", + "unit": "degrees" + }, + { + "name": "Elevation", + "datatype": "float", + "description": "Elevation to observed object measured as angle between vehicle sprung mass XY-plane as defined by ISO 23150:2023 at driver mid eye position and object. 0 = Driver looking at something at same height as mid eye position. Positive values = Driver looking at something above mid eye position. Negative values = Driver looking at something below mid eye position.", + "max": 90, + "min": -90, + "type": "sensor", + "unit": "degrees" + } + ] + } + ] + }, + { + "name": "Powertrain", + "children": [ + { + "name": "CombustionEngine", + "children": [ + { + "name": "DieselExhaustFluid", + "children": [ + { + "name": "Capacity", + "datatype": "float", + "description": "Capacity in liters of the Diesel Exhaust Fluid Tank.", + "type": "attribute", + "unit": "l" + }, + { + "name": "IsLevelLow", + "datatype": "boolean", + "description": "Indicates if the Diesel Exhaust Fluid level is low. True if level is low. Definition of low is vehicle dependent.", + "type": "sensor" + }, + { + "name": "Level", + "datatype": "uint8", + "description": "Level of the Diesel Exhaust Fluid tank as percent of capacity. 0 = empty. 100 = full.", + "max": 100, + "min": 0, + "type": "sensor", + "unit": "percent" + }, + { + "name": "Range", + "datatype": "uint32", + "description": "Remaining range in meters of the Diesel Exhaust Fluid present in the vehicle.", + "type": "sensor", + "unit": "m" + } + ] + }, + { + "name": "DieselParticulateFilter", + "children": [ + { + "name": "DeltaPressure", + "datatype": "float", + "description": "Delta Pressure of Diesel Particulate Filter.", + "type": "sensor", + "unit": "Pa" + }, + { + "name": "InletTemperature", + "datatype": "float", + "description": "Inlet temperature of Diesel Particulate Filter.", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "OutletTemperature", + "datatype": "float", + "description": "Outlet temperature of Diesel Particulate Filter.", + "type": "sensor", + "unit": "celsius" + } + ] + }, + { + "name": "EngineCoolant", + "children": [ + { + "name": "Capacity", + "datatype": "float", + "description": "Engine coolant capacity in liters.", + "type": "attribute", + "unit": "l" + }, + { + "name": "Level", + "allowed": [ + "CRITICALLY_LOW", + "LOW", + "NORMAL" + ], + "datatype": "string", + "description": "Engine coolant level.", + "type": "sensor" + }, + { + "name": "LifeRemaining", + "comment": "In addition to this a signal a vehicle can report remaining time to service (including e.g. coolant change) by Vehicle.Service.TimeToService.", + "datatype": "int32", + "description": "Remaining engine coolant life in seconds. Negative values can be used to indicate that lifetime has been exceeded.", + "type": "sensor", + "unit": "s" + }, + { + "name": "Temperature", + "datatype": "float", + "description": "Engine coolant temperature.", + "type": "sensor", + "unit": "celsius" + } + ] + }, + { + "name": "EngineOil", + "children": [ + { + "name": "Capacity", + "datatype": "float", + "description": "Engine oil capacity in liters.", + "type": "attribute", + "unit": "l" + }, + { + "name": "Level", + "allowed": [ + "CRITICALLY_LOW", + "LOW", + "NORMAL", + "HIGH", + "CRITICALLY_HIGH" + ], + "datatype": "string", + "description": "Engine oil level.", + "type": "sensor" + }, + { + "name": "LifeRemaining", + "comment": "In addition to this a signal a vehicle can report remaining time to service (including e.g. oil change) by Vehicle.Service.TimeToService.", + "datatype": "int32", + "description": "Remaining engine oil life in seconds. Negative values can be used to indicate that lifetime has been exceeded.", + "type": "sensor", + "unit": "s" + }, + { + "name": "Temperature", + "datatype": "float", + "description": "EOT, Engine oil temperature.", + "type": "sensor", + "unit": "celsius" + } + ] + }, + { + "name": "AspirationType", + "allowed": [ + "UNKNOWN", + "NATURAL", + "SUPERCHARGER", + "TURBOCHARGER" + ], + "datatype": "string", + "default": "UNKNOWN", + "description": "Type of aspiration (natural, turbocharger, supercharger etc).", + "type": "attribute" + }, + { + "name": "Bore", + "datatype": "float", + "description": "Bore in millimetres.", + "type": "attribute", + "unit": "mm" + }, + { + "name": "CompressionRatio", + "datatype": "string", + "description": "Engine compression ratio, specified in the format 'X:1', e.g. '9.2:1'.", + "type": "attribute" + }, + { + "name": "Configuration", + "allowed": [ + "UNKNOWN", + "STRAIGHT", + "V", + "BOXER", + "W", + "ROTARY", + "RADIAL", + "SQUARE", + "H", + "U", + "OPPOSED", + "X" + ], + "datatype": "string", + "default": "UNKNOWN", + "description": "Engine configuration.", + "type": "attribute" + }, + { + "name": "Displacement", + "datatype": "uint16", + "description": "Displacement in cubic centimetres.", + "type": "attribute", + "unit": "cm^3" + }, + { + "name": "EngineCode", + "comment": "For hybrid vehicles the engine code may refer to the combination of combustion and electric engine.", + "datatype": "string", + "description": "Engine code designation, as specified by vehicle manufacturer.", + "type": "attribute" + }, + { + "name": "EngineCoolantCapacity", + "datatype": "float", + "deprecation": "v5.0 moved to EngineCoolant.Capacity", + "description": "Engine coolant capacity in liters.", + "type": "attribute", + "unit": "l" + }, + { + "name": "EngineOilCapacity", + "datatype": "float", + "deprecation": "v5.0 moved to EngineOil.Capacity", + "description": "Engine oil capacity in liters.", + "type": "attribute", + "unit": "l" + }, + { + "name": "MaxPower", + "datatype": "uint16", + "default": 0, + "description": "Peak power, in kilowatts, that engine can generate.", + "type": "attribute", + "unit": "kW" + }, + { + "name": "MaxTorque", + "datatype": "uint16", + "default": 0, + "description": "Peak torque, in newton meter, that the engine can generate.", + "type": "attribute", + "unit": "Nm" + }, + { + "name": "NumberOfCylinders", + "datatype": "uint16", + "description": "Number of cylinders.", + "type": "attribute" + }, + { + "name": "NumberOfValvesPerCylinder", + "datatype": "uint16", + "description": "Number of valves per cylinder.", + "type": "attribute" + }, + { + "name": "StrokeLength", + "datatype": "float", + "description": "Stroke length in millimetres.", + "type": "attribute", + "unit": "mm" + }, + { + "name": "ECT", + "datatype": "float", + "deprecation": "v5.0 moved to EngineCoolant.Temperature", + "description": "Engine coolant temperature.", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "EOP", + "datatype": "uint16", + "description": "Engine oil pressure.", + "type": "sensor", + "unit": "kPa" + }, + { + "name": "EOT", + "datatype": "float", + "deprecation": "v5.0 moved to EngineOil.Temperature", + "description": "Engine oil temperature.", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "EngineHours", + "datatype": "float", + "description": "Accumulated time during engine lifetime with 'engine speed (rpm) > 0'.", + "type": "sensor", + "unit": "h" + }, + { + "name": "EngineOilLevel", + "allowed": [ + "CRITICALLY_LOW", + "LOW", + "NORMAL", + "HIGH", + "CRITICALLY_HIGH" + ], + "datatype": "string", + "deprecation": "v5.0 moved to EngineOil.Level", + "description": "Engine oil level.", + "type": "sensor" + }, + { + "name": "IdleHours", + "comment": "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.", + "datatype": "float", + "description": "Accumulated idling time during engine lifetime. Definition of idling is not standardized.", + "type": "sensor", + "unit": "h" + }, + { + "name": "IsRunning", + "datatype": "boolean", + "description": "Engine Running. True if engine is rotating (Speed > 0).", + "type": "sensor" + }, + { + "name": "MAF", + "datatype": "uint16", + "description": "Grams of air drawn into engine per second.", + "type": "sensor", + "unit": "g/s" + }, + { + "name": "MAP", + "datatype": "uint16", + "description": "Manifold absolute pressure possibly boosted using forced induction.", + "type": "sensor", + "unit": "kPa" + }, + { + "name": "OilLifeRemaining", + "comment": "In addition to this a signal a vehicle can report remaining time to service (including e.g. oil change) by Vehicle.Service.TimeToService.", + "datatype": "int32", + "deprecation": "v5.0 moved to EngineOil.LifeRemaining", + "description": "Remaining engine oil life in seconds. Negative values can be used to indicate that lifetime has been exceeded.", + "type": "sensor", + "unit": "s" + }, + { + "name": "Power", + "datatype": "uint16", + "description": "Current engine power output. Shall be reported as 0 during engine breaking.", + "type": "sensor", + "unit": "kW" + }, + { + "name": "Speed", + "datatype": "uint16", + "description": "Engine speed measured as rotations per minute.", + "type": "sensor", + "unit": "rpm" + }, + { + "name": "TPS", + "datatype": "uint8", + "description": "Current throttle position.", + "max": 100, + "type": "sensor", + "unit": "percent" + }, + { + "name": "Torque", + "comment": "During engine breaking the engine delivers a negative torque to the transmission.", + "datatype": "int16", + "description": "Current engine torque. Shall be reported as a negative number during engine breaking.", + "type": "sensor", + "unit": "Nm" + } + ] + }, + { + "name": "ElectricMotor", + "children": [ + { + "name": "EngineCoolant", + "children": [ + { + "name": "Capacity", + "datatype": "float", + "description": "Engine coolant capacity in liters.", + "type": "attribute", + "unit": "l" + }, + { + "name": "Level", + "allowed": [ + "CRITICALLY_LOW", + "LOW", + "NORMAL" + ], + "datatype": "string", + "description": "Engine coolant level.", + "type": "sensor" + }, + { + "name": "LifeRemaining", + "comment": "In addition to this a signal a vehicle can report remaining time to service (including e.g. coolant change) by Vehicle.Service.TimeToService.", + "datatype": "int32", + "description": "Remaining engine coolant life in seconds. Negative values can be used to indicate that lifetime has been exceeded.", + "type": "sensor", + "unit": "s" + }, + { + "name": "Temperature", + "datatype": "float", + "description": "Engine coolant temperature.", + "type": "sensor", + "unit": "celsius" + } + ] + }, + { + "name": "EngineCode", + "datatype": "string", + "description": "Engine code designation, as specified by vehicle manufacturer.", + "type": "attribute" + }, + { + "name": "MaxPower", + "datatype": "uint16", + "default": 0, + "description": "Peak power, in kilowatts, that motor(s) can generate.", + "type": "attribute", + "unit": "kW" + }, + { + "name": "MaxRegenPower", + "datatype": "uint16", + "default": 0, + "description": "Peak regen/brake power, in kilowatts, that motor(s) can generate.", + "type": "attribute", + "unit": "kW" + }, + { + "name": "MaxRegenTorque", + "datatype": "uint16", + "default": 0, + "description": "Peak regen/brake torque, in newton meter, that the motor(s) can generate.", + "type": "attribute", + "unit": "Nm" + }, + { + "name": "MaxTorque", + "datatype": "uint16", + "default": 0, + "description": "Peak power, in newton meter, that the motor(s) can generate.", + "type": "attribute", + "unit": "Nm" + }, + { + "name": "CoolantTemperature", + "datatype": "float", + "deprecation": "v5.0 moved to EngineCoolant.Temperature", + "description": "Motor coolant temperature (if applicable).", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "Power", + "datatype": "int16", + "description": "Current motor power output. Negative values indicate regen mode.", + "type": "sensor", + "unit": "kW" + }, + { + "name": "Speed", + "datatype": "int32", + "description": "Motor rotational speed measured as rotations per minute. Negative values indicate reverse driving mode.", + "type": "sensor", + "unit": "rpm" + }, + { + "name": "Temperature", + "datatype": "float", + "description": "Motor temperature.", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "TimeInUse", + "comment": "Vehicles may define their READY state.", + "datatype": "float", + "description": "Accumulated time during engine lifetime when the vehicule state's is 'READY'.", + "type": "sensor", + "unit": "h" + }, + { + "name": "Torque", + "datatype": "int16", + "description": "Current motor torque. Negative values indicate regen mode.", + "type": "sensor", + "unit": "Nm" + } + ] + }, + { + "name": "FuelSystem", + "children": [ + { + "name": "IsFuelPortFlapOpen", + "datatype": "boolean", + "description": "Status of the fuel port flap(s). True if at least one is open.", + "type": "actuator" + }, + { + "name": "HybridType", + "allowed": [ + "UNKNOWN", + "NOT_APPLICABLE", + "STOP_START", + "BELT_ISG", + "CIMG", + "PHEV" + ], + "datatype": "string", + "default": "UNKNOWN", + "description": "Defines the hybrid type of the vehicle.", + "type": "attribute" + }, + { + "name": "RefuelPortPosition", + "allowed": [ + "FRONT_LEFT", + "FRONT_MIDDLE", + "FRONT_RIGHT", + "REAR_LEFT", + "REAR_MIDDLE", + "REAR_RIGHT", + "LEFT_FRONT", + "LEFT_MIDDLE", + "LEFT_REAR", + "RIGHT_FRONT", + "RIGHT_MIDDLE", + "RIGHT_REAR" + ], + "datatype": "string[]", + "description": "Position of refuel port(s). First part indicates side of vehicle, second part relative position on that side.", + "type": "attribute" + }, + { + "name": "SupportedFuel", + "allowed": [ + "E5_95", + "E5_98", + "E10_95", + "E10_98", + "E85", + "B7", + "B10", + "B20", + "B30", + "B100", + "XTL", + "LPG", + "CNG", + "LNG", + "H2", + "OTHER" + ], + "comment": "RON 95 is sometimes referred to as Super, RON 98 as Super Plus.", + "datatype": "string[]", + "description": "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.", + "type": "attribute" + }, + { + "name": "SupportedFuelTypes", + "allowed": [ + "GASOLINE", + "DIESEL", + "E85", + "LPG", + "CNG", + "LNG", + "H2", + "OTHER" + ], + "comment": "If a vehicle also has an electric drivetrain (e.g. hybrid) that will be obvious from the PowerTrain.Type signal.", + "datatype": "string[]", + "description": "High level information of fuel types supported", + "type": "attribute" + }, + { + "name": "TankCapacity", + "datatype": "float", + "description": "Capacity of the fuel tank in liters.", + "type": "attribute", + "unit": "l" + }, + { + "name": "AbsoluteLevel", + "datatype": "float", + "description": "Current available fuel in the fuel tank expressed in liters.", + "type": "sensor", + "unit": "l" + }, + { + "name": "AverageConsumption", + "datatype": "float", + "description": "Average consumption in liters per 100 km.", + "min": 0, + "type": "sensor", + "unit": "l/100km" + }, + { + "name": "ConsumptionSinceLastRefuel", + "comment": "Amount of fuel consumed since last refueling.", + "datatype": "float", + "description": "Fuel consumption since last refueling.", + "type": "sensor", + "unit": "l" + }, + { + "name": "ConsumptionSinceStart", + "comment": "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.", + "datatype": "float", + "description": "Fuel amount in liters consumed since start of current trip.", + "type": "sensor", + "unit": "l" + }, + { + "name": "InstantConsumption", + "datatype": "float", + "description": "Current consumption in liters per 100 km.", + "min": 0, + "type": "sensor", + "unit": "l/100km" + }, + { + "name": "IsEngineStopStartEnabled", + "datatype": "boolean", + "description": "Indicates whether eco start stop is currently enabled.", + "type": "sensor" + }, + { + "name": "IsFuelLevelLow", + "datatype": "boolean", + "description": "Indicates that the fuel level is low (e.g. <50km range).", + "type": "sensor" + }, + { + "name": "Range", + "datatype": "uint32", + "description": "Remaining range in meters using only liquid fuel.", + "type": "sensor", + "unit": "m" + }, + { + "name": "RelativeLevel", + "datatype": "uint8", + "description": "Level in fuel tank as percent of capacity. 0 = empty. 100 = full.", + "max": 100, + "min": 0, + "type": "sensor", + "unit": "percent" + }, + { + "name": "TimeRemaining", + "datatype": "uint32", + "description": "Time remaining in seconds before the fuel tank is empty.", + "type": "sensor", + "unit": "s" + } + ] + }, + { + "name": "TractionBattery", + "children": [ + { + "name": "BatteryConditioning", + "children": [ + { + "name": "RequestedMode", + "allowed": [ + "INACTIVE", + "FAST_CHARGING_PREPARATION", + "DRIVING_PREPARATION" + ], + "comment": "The Mode and TargetTime can be used to calculate TargetTemperature and StartTime", + "datatype": "string", + "description": "Defines requested mode for battery conditioning. INACTIVE - Battery conditioning inactive. FAST_CHARGING_PREPARATION - Battery conditioning for fast charging. DRIVING_PREPARATION - Battery conditioning for driving.", + "type": "actuator" + }, + { + "name": "StartTime", + "comment": "If the vehicle is asleep, this is the time the vehicle and the battery conditioning system must wake up and start monitoring the battery and if necessary start heating/cooling of the battery.", + "datatype": "string", + "description": "Start time for battery conditioning, formatted according to ISO 8601 with UTC time zone.", + "type": "actuator", + "unit": "iso8601" + }, + { + "name": "TargetTemperature", + "comment": "Target temperature possibly differs between different modes as well as other factors. Allowed deviation from target temperature is implementation dependent.", + "datatype": "float", + "description": "Target temperature for battery conditioning.", + "type": "actuator", + "unit": "celsius" + }, + { + "name": "TargetTime", + "comment": "For FAST_CHARGING mode this is typically the time when charging is supposed to start. For DRIVING mode this is typically the expected departure time. Battery conditioning will be deactivated when this time has passed.", + "datatype": "string", + "description": "Target time when conditioning shall be finished, formatted according to ISO 8601 with UTC time zone.", + "type": "actuator", + "unit": "iso8601" + }, + { + "name": "IsActive", + "comment": "This signal is typically true when mode is not INACTIVE and time is within defined start/end times.", + "datatype": "boolean", + "description": "Indicates if battery conditioning is active (i.e. actively monitors battery temperature). True = Active. False = Inactive.", + "type": "sensor" + }, + { + "name": "IsOngoing", + "comment": "When battery conditioning is active, but temperature is already within acceptable range so that no cooling or heating is needed then IsOngoing shall report False.", + "datatype": "boolean", + "description": "Indicating if battery conditioning is currently ongoing. Battery conditioning is considered ongoing when the battery conditioning system is actively heating or cooling the battery, or requesting heating or cooling.", + "type": "sensor" + } + ] + }, + { + "name": "CellVoltage", + "children": [ + { + "name": "CellVoltages", + "comment": "Cells are identified by relative position in array.", + "datatype": "float[]", + "description": "Array of cell voltages. Length or array shall correspond to number of cells in vehicle.", + "type": "sensor" + }, + { + "name": "IdMax", + "comment": "Identifier is supposed to be relative index of the cell, starting with 0 the first cell.", + "datatype": "uint16", + "description": "Identifier of the battery cell with highest voltage.", + "type": "sensor" + }, + { + "name": "IdMin", + "comment": "Identifier is supposed to be relative index of the cell, starting with 0 the first cell.", + "datatype": "uint16", + "description": "Identifier of the battery cell with lowest voltage.", + "type": "sensor" + }, + { + "name": "Max", + "datatype": "float", + "description": "Current voltage of the battery cell with highest voltage.", + "type": "sensor", + "unit": "V" + }, + { + "name": "Min", + "datatype": "float", + "description": "Current voltage of the battery cell with lowest voltage.", + "type": "sensor", + "unit": "V" + } + ] + }, + { + "name": "Charging", + "children": [ + { + "name": "ChargeCurrent", + "children": [ + { + "name": "DC", + "datatype": "float", + "description": "Current DC charging current at inlet. Negative if returning energy to grid.", + "type": "sensor", + "unit": "A" + }, + { + "name": "Phase1", + "datatype": "float", + "description": "Current AC charging current (rms) at inlet for Phase 1. Negative if returning energy to grid.", + "type": "sensor", + "unit": "A" + }, + { + "name": "Phase2", + "datatype": "float", + "description": "Current AC charging current (rms) at inlet for Phase 2. Negative if returning energy to grid.", + "type": "sensor", + "unit": "A" + }, + { + "name": "Phase3", + "datatype": "float", + "description": "Current AC charging current (rms) at inlet for Phase 3. Negative if returning energy to grid.", + "type": "sensor", + "unit": "A" + } + ] + }, + { + "name": "ChargeVoltage", + "children": [ + { + "name": "DC", + "datatype": "float", + "description": "Current DC charging voltage at charging inlet.", + "type": "sensor", + "unit": "V" + }, + { + "name": "Phase1", + "datatype": "float", + "description": "Current AC charging voltage (rms) at inlet for Phase 1.", + "type": "sensor", + "unit": "V" + }, + { + "name": "Phase2", + "datatype": "float", + "description": "Current AC charging voltage (rms) at inlet for Phase 2.", + "type": "sensor", + "unit": "V" + }, + { + "name": "Phase3", + "datatype": "float", + "description": "Current AC charging voltage (rms) at inlet for Phase 3.", + "type": "sensor", + "unit": "V" + } + ] + }, + { + "name": "ChargingPort", + "children": [ + { + "name": "IsChargingCableLocked", + "comment": "Locking of charging cable can be used to prevent unintentional removing during charging.", + "datatype": "boolean", + "description": "Is charging cable locked to prevent removal.", + "type": "actuator" + }, + { + "name": "IsFlapOpen", + "comment": "True = at least one flap of this port is open, False = All flaps of this port are closed.", + "datatype": "boolean", + "description": "Status of the charging port flap(s).", + "type": "actuator" + }, + { + "name": "SupportedInletTypes", + "allowed": [ + "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" + ], + "comment": "A vehicle may have multiple charging ports. 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.", + "datatype": "string[]", + "description": "A list of the supported (i.e., available) charging inlets in a particular charging port. IEC types refer to IEC 62196, GBT refers to GB/T 20234.", + "type": "attribute" + }, + { + "name": "IsChargingCableConnected", + "datatype": "boolean", + "description": "Indicates whether a charging cable is physically connected to a particular charging port or not.", + "type": "sensor" + } + ] + }, + { + "name": "Location", + "children": [ + { + "name": "Altitude", + "datatype": "double", + "description": "Altitude relative to WGS 84 reference ellipsoid of last or current charging event.", + "type": "sensor", + "unit": "m" + }, + { + "name": "Latitude", + "datatype": "double", + "description": "Latitude of last or current charging event in WGS 84 geodetic coordinates.", + "max": 90, + "min": -90, + "type": "sensor", + "unit": "degrees" + }, + { + "name": "Longitude", + "datatype": "double", + "description": "Longitude of last or current charging event in WGS 84 geodetic coordinates.", + "max": 180, + "min": -180, + "type": "sensor", + "unit": "degrees" + } + ] + }, + { + "name": "MaximumChargingCurrent", + "children": [ + { + "name": "DC", + "datatype": "float", + "description": "Maximum DC charging current at inlet that can be accepted by the system.", + "type": "sensor", + "unit": "A" + }, + { + "name": "Phase1", + "datatype": "float", + "description": "Maximum AC charging current (rms) at inlet for Phase 1 that can be accepted by the system.", + "type": "sensor", + "unit": "A" + }, + { + "name": "Phase2", + "datatype": "float", + "description": "Maximum AC charging current (rms) at inlet for Phase 2 that can be accepted by the system.", + "type": "sensor", + "unit": "A" + }, + { + "name": "Phase3", + "datatype": "float", + "description": "Maximum AC charging current (rms) at inlet for Phase 3 that can be accepted by the system.", + "type": "sensor", + "unit": "A" + } + ] + }, + { + "name": "Timer", + "children": [ + { + "name": "Mode", + "allowed": [ + "INACTIVE", + "START_TIME", + "END_TIME" + ], + "datatype": "string", + "description": "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.", + "type": "actuator" + }, + { + "name": "Time", + "datatype": "string", + "description": "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'.", + "type": "actuator", + "unit": "iso8601" + } + ] + }, + { + "name": "ChargeLimit", + "datatype": "uint8", + "default": 100, + "description": "Target charge limit (state of charge) for battery.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "StartStopCharging", + "allowed": [ + "START", + "STOP" + ], + "datatype": "string", + "description": "Start or stop the charging process.", + "type": "actuator" + }, + { + "name": "AveragePower", + "datatype": "float", + "description": "Average charging power of last or current charging event.", + "type": "sensor", + "unit": "kW" + }, + { + "name": "ChargeRate", + "datatype": "float", + "description": "Current charging rate, as in kilometers of range added per hour.", + "type": "sensor", + "unit": "km/h" + }, + { + "name": "EvseId", + "comment": "Length of id between 7 and 37 characters. ZZ00000 to be used if SECC cannot provide id", + "datatype": "string", + "description": "EVSE charging point ID (without separators) of last or current charging event according to ISO 15118-2 Annex H.", + "type": "sensor" + }, + { + "name": "IsCharging", + "datatype": "boolean", + "description": "True if charging is ongoing. Charging is considered to be ongoing if energy is flowing from charger to vehicle.", + "type": "sensor" + }, + { + "name": "IsDischarging", + "datatype": "boolean", + "description": "True if discharging (vehicle to grid) is ongoing. Discharging is considered to be ongoing if energy is flowing from vehicle to charger/grid.", + "type": "sensor" + }, + { + "name": "MaxPower", + "datatype": "float", + "description": "Maximum charging power of last or current charging event.", + "type": "sensor", + "unit": "kW" + }, + { + "name": "PowerLoss", + "datatype": "float", + "description": "Electrical energy lost by power dissipation to heat inside the AC/DC converter.", + "type": "sensor", + "unit": "W" + }, + { + "name": "Temperature", + "datatype": "float", + "description": "Current temperature of AC/DC converter converting grid voltage to battery voltage.", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "TimeToComplete", + "comment": "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.", + "datatype": "uint32", + "description": "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.", + "type": "sensor", + "unit": "s" + } + ] + }, + { + "name": "DCDC", + "children": [ + { + "name": "PowerLoss", + "datatype": "float", + "description": "Electrical energy lost by power dissipation to heat inside DC/DC converter.", + "type": "sensor", + "unit": "W" + }, + { + "name": "Temperature", + "datatype": "float", + "description": "Current temperature of DC/DC converter converting battery high voltage to vehicle low voltage (typically 12 Volts).", + "type": "sensor", + "unit": "celsius" + } + ] + }, + { + "name": "StateOfCharge", + "children": [ + { + "name": "Current", + "datatype": "float", + "description": "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.", + "max": 100.0, + "min": 0, + "type": "sensor", + "unit": "percent" + }, + { + "name": "CurrentEnergy", + "comment": "Current energy could be calculated as .StateOfCharge.Current * .NetCapacity.", + "datatype": "float", + "description": "Physical state of charge of high voltage battery expressed in kWh.", + "type": "sensor", + "unit": "kWh" + }, + { + "name": "Displayed", + "datatype": "float", + "description": "State of charge displayed to the customer.", + "max": 100.0, + "min": 0, + "type": "sensor", + "unit": "percent" + } + ] + }, + { + "name": "Temperature", + "children": [ + { + "name": "Average", + "datatype": "float", + "description": "Current average temperature of the battery cells.", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "CellTemperature", + "comment": "Cells are identified by relative position in array.", + "datatype": "float[]", + "description": "Array of cell temperatures. Length or array shall correspond to number of cells in vehicle.", + "type": "sensor" + }, + { + "name": "Max", + "datatype": "float", + "description": "Current maximum temperature of the battery cells, i.e. temperature of the hottest cell.", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "Min", + "datatype": "float", + "description": "Current minimum temperature of the battery cells, i.e. temperature of the coldest cell.", + "type": "sensor", + "unit": "celsius" + } + ] + }, + { + "name": "GrossCapacity", + "datatype": "uint16", + "description": "Gross capacity of the battery.", + "type": "attribute", + "unit": "kWh" + }, + { + "name": "Id", + "comment": "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.", + "datatype": "string", + "description": "Battery Identification Number as assigned by OEM.", + "type": "attribute" + }, + { + "name": "MaxVoltage", + "datatype": "uint16", + "description": "Max allowed voltage of the battery, e.g. during charging.", + "type": "attribute", + "unit": "V" + }, + { + "name": "NominalVoltage", + "comment": "Nominal voltage typically refers to voltage of fully charged battery when delivering rated capacity.", + "datatype": "uint16", + "description": "Nominal Voltage of the battery.", + "type": "attribute", + "unit": "V" + }, + { + "name": "ProductionDate", + "datatype": "string", + "description": "Production date of battery in ISO8601 format, e.g. YYYY-MM-DD.", + "type": "attribute", + "unit": "iso8601" + }, + { + "name": "AccumulatedChargedEnergy", + "datatype": "float", + "description": "The accumulated energy delivered to the battery during charging over lifetime of the battery.", + "type": "sensor", + "unit": "kWh" + }, + { + "name": "AccumulatedChargedThroughput", + "datatype": "float", + "description": "The accumulated charge throughput delivered to the battery during charging over lifetime of the battery.", + "type": "sensor", + "unit": "Ah" + }, + { + "name": "AccumulatedConsumedEnergy", + "datatype": "float", + "description": "The accumulated energy leaving HV battery for propulsion and auxiliary loads over lifetime of the battery.", + "type": "sensor", + "unit": "kWh" + }, + { + "name": "AccumulatedConsumedThroughput", + "datatype": "float", + "description": "The accumulated charge throughput leaving HV battery for propulsion and auxiliary loads over lifetime of the battery.", + "type": "sensor", + "unit": "Ah" + }, + { + "name": "CurrentCurrent", + "datatype": "float", + "description": "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.", + "type": "sensor", + "unit": "A" + }, + { + "name": "CurrentPower", + "datatype": "float", + "description": "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.", + "type": "sensor", + "unit": "W" + }, + { + "name": "CurrentVoltage", + "datatype": "float", + "description": "Current Voltage of the battery.", + "type": "sensor", + "unit": "V" + }, + { + "name": "ErrorCodes", + "comment": "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.", + "datatype": "string[]", + "description": "Current error codes related to the battery, if any.", + "type": "sensor" + }, + { + "name": "IsGroundConnected", + "comment": "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.", + "datatype": "boolean", + "description": "Indicating if the ground (negative terminator) of the traction battery is connected to the powertrain.", + "type": "sensor" + }, + { + "name": "IsPowerConnected", + "comment": "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.", + "datatype": "boolean", + "description": "Indicating if the power (positive terminator) of the traction battery is connected to the powertrain.", + "type": "sensor" + }, + { + "name": "NetCapacity", + "datatype": "uint16", + "description": "Total net capacity of the battery considering aging.", + "type": "sensor", + "unit": "kWh" + }, + { + "name": "PowerLoss", + "datatype": "float", + "description": "Electrical energy lost by power dissipation to heat inside the battery.", + "type": "sensor", + "unit": "W" + }, + { + "name": "Range", + "datatype": "uint32", + "description": "Remaining range in meters using only battery.", + "type": "sensor", + "unit": "m" + }, + { + "name": "StateOfHealth", + "comment": "Exact formula is implementation dependent. Could be e.g. current capacity at 20 degrees Celsius divided with original capacity at the same temperature.", + "datatype": "float", + "description": "Calculated battery state of health at standard conditions.", + "max": 100, + "min": 0, + "type": "sensor", + "unit": "percent" + }, + { + "name": "TimeRemaining", + "datatype": "uint32", + "description": "Time remaining in seconds before the battery is empty.", + "type": "sensor", + "unit": "s" + } + ] + }, + { + "name": "Transmission", + "children": [ + { + "name": "ClutchEngagement", + "datatype": "float", + "description": "Clutch engagement. 0% = Clutch fully disengaged. 100% = Clutch fully engaged.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "DiffLockFrontEngagement", + "datatype": "float", + "description": "Front Diff Lock engagement. 0% = Diff lock fully disengaged. 100% = Diff lock fully engaged.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "DiffLockRearEngagement", + "datatype": "float", + "description": "Rear Diff Lock engagement. 0% = Diff lock fully disengaged. 100% = Diff lock fully engaged.", + "max": 100, + "min": 0, + "type": "actuator", + "unit": "percent" + }, + { + "name": "GearChangeMode", + "allowed": [ + "MANUAL", + "AUTOMATIC" + ], + "datatype": "string", + "description": "Is the gearbox in automatic or manual (paddle) mode.", + "type": "actuator" + }, + { + "name": "IsElectricalPowertrainEngaged", + "comment": "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.", + "datatype": "boolean", + "description": "Is electrical powertrain mechanically connected/engaged to the drivetrain or not. False = Disconnected/Disengaged. True = Connected/Engaged.", + "type": "actuator" + }, + { + "name": "IsLowRangeEngaged", + "comment": "The possibility to switch between low and high gear range is typically only available in heavy vehicles and off-road vehicles.", + "datatype": "boolean", + "description": "Is gearbox in low range mode or not. False = Normal/High range engaged. True = Low range engaged.", + "type": "actuator" + }, + { + "name": "IsParkLockEngaged", + "datatype": "boolean", + "description": "Is the transmission park lock engaged or not. False = Disengaged. True = Engaged.", + "type": "actuator" + }, + { + "name": "PerformanceMode", + "allowed": [ + "NORMAL", + "SPORT", + "ECONOMY", + "SNOW", + "RAIN" + ], + "datatype": "string", + "description": "Current gearbox performance mode.", + "type": "actuator" + }, + { + "name": "SelectedGear", + "datatype": "int8", + "description": "The selected gear. 0=Neutral, 1/2/..=Forward, -1/-2/..=Reverse, 126=Park, 127=Drive.", + "type": "actuator" + }, + { + "name": "TorqueDistribution", + "datatype": "float", + "description": "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.", + "max": 100, + "min": -100, + "type": "actuator", + "unit": "percent" + }, + { + "name": "DriveType", + "allowed": [ + "UNKNOWN", + "FORWARD_WHEEL_DRIVE", + "REAR_WHEEL_DRIVE", + "ALL_WHEEL_DRIVE" + ], + "datatype": "string", + "default": "UNKNOWN", + "description": "Drive type.", + "type": "attribute" + }, + { + "name": "GearCount", + "datatype": "int8", + "default": 0, + "description": "Number of forward gears in the transmission. -1 = CVT.", + "type": "attribute" + }, + { + "name": "Type", + "allowed": [ + "UNKNOWN", + "SEQUENTIAL", + "H", + "AUTOMATIC", + "DSG", + "CVT" + ], + "datatype": "string", + "default": "UNKNOWN", + "description": "Transmission type.", + "type": "attribute" + }, + { + "name": "ClutchWear", + "datatype": "uint8", + "description": "Clutch wear as a percent. 0 = no wear. 100 = worn.", + "max": 100, + "type": "sensor", + "unit": "percent" + }, + { + "name": "CurrentGear", + "datatype": "int8", + "description": "The current gear. 0=Neutral, 1/2/..=Forward, -1/-2/..=Reverse.", + "type": "sensor" + }, + { + "name": "Temperature", + "datatype": "float", + "description": "The current gearbox temperature.", + "type": "sensor", + "unit": "celsius" + }, + { + "name": "TravelledDistance", + "datatype": "float", + "description": "Odometer reading, total distance travelled during the lifetime of the transmission.", + "type": "sensor", + "unit": "km" + } + ] + }, + { + "name": "IsAutoPowerOptimize", + "datatype": "boolean", + "description": "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.", + "type": "actuator" + }, + { + "name": "PowerOptimizeLevel", + "datatype": "uint8", + "description": "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.", + "max": 10, + "min": 0, + "type": "actuator" + }, + { + "name": "Type", + "allowed": [ + "COMBUSTION", + "HYBRID", + "ELECTRIC" + ], + "comment": "For vehicles with a combustion engine (including hybrids) more detailed information on fuels supported can be found in FuelSystem.SupportedFuelTypes and FuelSystem.SupportedFuels.", + "datatype": "string", + "description": "Defines the powertrain type of the vehicle.", + "type": "attribute" + }, + { + "name": "AccumulatedBrakingEnergy", + "datatype": "float", + "description": "The accumulated energy from regenerative braking over lifetime.", + "type": "sensor", + "unit": "kWh" + }, + { + "name": "Range", + "datatype": "uint32", + "description": "Remaining range in meters using all energy sources available in the vehicle.", + "type": "sensor", + "unit": "m" + }, + { + "name": "TimeRemaining", + "datatype": "uint32", + "description": "Time remaining in seconds before all energy sources available in the vehicle are empty.", + "type": "sensor", + "unit": "s" + } + ] + }, + { + "name": "Service", + "children": [ + { + "name": "DistanceToService", + "datatype": "float", + "description": "Remaining distance to service (of any kind). Negative values indicate service overdue.", + "type": "sensor", + "unit": "km" + }, + { + "name": "IsServiceDue", + "datatype": "boolean", + "description": "Indicates if vehicle needs service (of any kind). True = Service needed now or in the near future. False = No known need for service.", + "type": "sensor" + }, + { + "name": "TimeToService", + "datatype": "int32", + "description": "Remaining time to service (of any kind). Negative values indicate service overdue.", + "type": "sensor", + "unit": "s" + } + ] + }, + { + "name": "Trailer", + "children": [ + { + "name": "IsConnected", + "datatype": "boolean", + "description": "Signal indicating if trailer is connected or not.", + "type": "sensor" + } + ] + }, + { + "name": "VehicleIdentification", + "children": [ + { + "name": "AcrissCode", + "datatype": "string", + "description": "The ACRISS Car Classification Code is a code used by many car rental companies.", + "type": "attribute" + }, + { + "name": "BodyType", + "datatype": "string", + "description": "Indicates the design and body style of the vehicle (e.g. station wagon, hatchback, etc.).", + "type": "attribute" + }, + { + "name": "Brand", + "datatype": "string", + "description": "Vehicle brand or manufacturer.", + "type": "attribute" + }, + { + "name": "DateVehicleFirstRegistered", + "datatype": "string", + "description": "The date in ISO 8601 format of the first registration of the vehicle with the respective public authorities.", + "type": "attribute", + "unit": "iso8601" + }, + { + "name": "KnownVehicleDamages", + "datatype": "string", + "description": "A textual description of known damages, both repaired and unrepaired.", + "type": "attribute" + }, + { + "name": "LicensePlate", + "comment": "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.", + "datatype": "string", + "description": "The license plate of the vehicle.", + "type": "attribute" + }, + { + "name": "MeetsEmissionStandard", + "datatype": "string", + "description": "Indicates that the vehicle meets the respective emission standard.", + "type": "attribute" + }, + { + "name": "Model", + "datatype": "string", + "description": "Vehicle model.", + "type": "attribute" + }, + { + "name": "OptionalExtras", + "comment": "Allowed values are not standardized, each OEM can specify detail descriptions of array elements.", + "datatype": "string[]", + "description": "Optional extras refers to all car equipment options that are not installed as standard by the manufacturer.", + "type": "attribute" + }, + { + "name": "ProductionDate", + "datatype": "string", + "description": "The date in ISO 8601 format of production of the item, e.g. vehicle.", + "type": "attribute", + "unit": "iso8601" + }, + { + "name": "PurchaseDate", + "datatype": "string", + "description": "The date in ISO 8601 format of the item e.g. vehicle was purchased by the current owner.", + "type": "attribute", + "unit": "iso8601" + }, + { + "name": "VIN", + "datatype": "string", + "description": "17-character Vehicle Identification Number (VIN) as defined by ISO 3779.", + "pattern": "^([0-9A-HJ-NPR-Z]{3})([0-9A-HJ-NPR-Z]{6})([0-9A-HJ-NPR-Z]{4}[0-9]{4})$", + "type": "attribute" + }, + { + "name": "VehicleConfiguration", + "datatype": "string", + "description": "A short text indicating the configuration of the vehicle, e.g. '5dr hatchback ST 2.5 MT 225 hp' or 'limited edition'.", + "type": "attribute" + }, + { + "name": "VehicleExteriorColor", + "datatype": "string", + "description": "The main color of the exterior within the basic color palette (eg. red, blue, black, white, ...).", + "type": "attribute" + }, + { + "name": "VehicleInteriorColor", + "datatype": "string", + "description": "The color or color combination of the interior of the vehicle.", + "type": "attribute" + }, + { + "name": "VehicleInteriorType", + "datatype": "string", + "description": "The type or material of the interior of the vehicle (e.g. synthetic fabric, leather, wood, etc.).", + "type": "attribute" + }, + { + "name": "VehicleModelDate", + "datatype": "string", + "description": "The release date in ISO 8601 format of a vehicle model (often used to differentiate versions of the same make and model).", + "type": "attribute", + "unit": "iso8601" + }, + { + "name": "VehicleSeatingCapacity", + "datatype": "uint16", + "description": "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.", + "type": "attribute" + }, + { + "name": "VehicleSpecialUsage", + "datatype": "string", + "description": "Indicates whether the vehicle has been used for special purposes, like commercial rental, driving school.", + "type": "attribute" + }, + { + "name": "WMI", + "datatype": "string", + "description": "3-character World Manufacturer Identification (WMI) as defined by ISO 3780.", + "type": "attribute" + }, + { + "name": "Year", + "datatype": "uint16", + "description": "Model year of the vehicle.", + "type": "attribute" + } + ] + }, + { + "name": "VersionVSS", + "children": [ + { + "name": "Label", + "comment": "COVESA VSS project typically use dev for latest master, and empty string for released versions.", + "datatype": "string", + "default": "dev", + "description": "Label to further describe the version.", + "type": "attribute" + }, + { + "name": "Major", + "datatype": "uint32", + "default": 6, + "description": "Supported Version of VSS - Major version.", + "type": "attribute" + }, + { + "name": "Minor", + "datatype": "uint32", + "default": 0, + "description": "Supported Version of VSS - Minor version.", + "type": "attribute" + }, + { + "name": "Patch", + "datatype": "uint32", + "default": 0, + "description": "Supported Version of VSS - Patch version.", + "type": "attribute" + } + ] + }, + { + "name": "IsAutoPowerOptimize", + "datatype": "boolean", + "description": "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.", + "type": "actuator" + }, + { + "name": "PowerOptimizeLevel", + "datatype": "uint8", + "description": "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.", + "max": 10, + "min": 0, + "type": "actuator" + }, + { + "name": "TripMeterReading", + "comment": "The trip meter is an odometer that can be manually reset by the driver", + "datatype": "float", + "description": "Trip meter reading.", + "type": "actuator", + "unit": "km" + }, + { + "name": "CargoVolume", + "datatype": "float", + "description": "The available volume for cargo or luggage. For automobiles, this is usually the trunk volume.", + "min": 0, + "type": "attribute", + "unit": "l" + }, + { + "name": "CurbWeight", + "datatype": "uint16", + "default": 0, + "description": "Vehicle curb weight, including all liquids and full tank of fuel, but no cargo or passengers.", + "type": "attribute", + "unit": "kg" + }, + { + "name": "EmissionsCO2", + "datatype": "int16", + "description": "The CO2 emissions.", + "type": "attribute", + "unit": "g/km" + }, + { + "name": "GrossWeight", + "datatype": "uint16", + "default": 0, + "description": "Curb weight of vehicle, including all liquids and full tank of fuel and full load of cargo and passengers.", + "type": "attribute", + "unit": "kg" + }, + { + "name": "Height", + "datatype": "uint16", + "default": 0, + "description": "Overall vehicle height.", + "type": "attribute", + "unit": "mm" + }, + { + "name": "Length", + "datatype": "uint16", + "default": 0, + "description": "Overall vehicle length.", + "type": "attribute", + "unit": "mm" + }, + { + "name": "MaxTowBallWeight", + "datatype": "uint16", + "default": 0, + "description": "Maximum vertical weight on the tow ball of a trailer.", + "type": "attribute", + "unit": "kg" + }, + { + "name": "MaxTowWeight", + "datatype": "uint16", + "default": 0, + "description": "Maximum weight of trailer.", + "type": "attribute", + "unit": "kg" + }, + { + "name": "RoofLoad", + "datatype": "int16", + "description": "The permitted total weight of cargo and installations (e.g. a roof rack) on top of the vehicle.", + "type": "attribute", + "unit": "kg" + }, + { + "name": "StartTime", + "comment": "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.", + "datatype": "string", + "default": "0000-01-01T00:00Z", + "description": "Start time of current or latest trip, formatted according to ISO 8601 with UTC time zone.", + "type": "attribute", + "unit": "iso8601" + }, + { + "name": "TurningDiameter", + "datatype": "uint16", + "description": "Minimum turning diameter, Wall-to-Wall, as defined by SAE J1100-2009 D102.", + "type": "attribute", + "unit": "mm" + }, + { + "name": "WidthExcludingMirrors", + "datatype": "uint16", + "default": 0, + "description": "Overall vehicle width excluding mirrors, as defined by SAE J1100-2009 W103.", + "type": "attribute", + "unit": "mm" + }, + { + "name": "WidthFoldedMirrors", + "datatype": "uint16", + "description": "Overall vehicle width with mirrors folded, as defined by SAE J1100-2009 W145.", + "type": "attribute", + "unit": "mm" + }, + { + "name": "WidthIncludingMirrors", + "datatype": "uint16", + "description": "Overall vehicle width including mirrors, as defined by SAE J1100-2009 W144.", + "type": "attribute", + "unit": "mm" + }, + { + "name": "AverageSpeed", + "comment": "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.", + "datatype": "float", + "description": "Average speed for the current trip.", + "type": "sensor", + "unit": "km/h" + }, + { + "name": "CurrentOverallWeight", + "datatype": "uint16", + "description": "Current overall Vehicle weight. Including passengers, cargo and other load inside the car.", + "type": "sensor", + "unit": "kg" + }, + { + "name": "IsBrokenDown", + "comment": "Actual criteria and method used to decide if a vehicle is broken down is implementation specific.", + "datatype": "boolean", + "description": "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.", + "type": "sensor" + }, + { + "name": "IsMoving", + "datatype": "boolean", + "description": "Indicates whether the vehicle is stationary or moving.", + "type": "sensor" + }, + { + "name": "LowVoltageSystemState", + "allowed": [ + "UNDEFINED", + "LOCK", + "OFF", + "ACC", + "ON", + "START" + ], + "datatype": "string", + "description": "State of the supply voltage of the control units (usually 12V).", + "type": "sensor" + }, + { + "name": "Speed", + "datatype": "float", + "description": "Vehicle speed.", + "type": "sensor", + "unit": "km/h" + }, + { + "name": "TraveledDistance", + "datatype": "float", + "description": "Odometer reading, total distance traveled during the lifetime of the vehicle.", + "type": "sensor", + "unit": "km" + }, + { + "name": "TraveledDistanceSinceStart", + "comment": "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.", + "datatype": "float", + "description": "Distance traveled since start of current trip.", + "type": "sensor", + "unit": "km" + }, + { + "name": "TripDuration", + "comment": "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.", + "datatype": "float", + "description": "Duration of latest trip.", + "type": "sensor", + "unit": "s" + } + ] +} diff --git a/docs-gen/static/data/piechartnotexpanded.csv b/docs-gen/static/data/piechartnotexpanded.csv new file mode 100644 index 000000000..d711b6056 --- /dev/null +++ b/docs-gen/static/data/piechartnotexpanded.csv @@ -0,0 +1,5 @@ +Type,V2,V3,V4,V5 +Attribute,78,86,97,110 +Branches,117,117,147,131 +Sensors,203,263,286,195 +Actuators,101,128,179,313 diff --git a/docs-gen/static/images/Versions_stacked.png b/docs-gen/static/images/Versions_stacked.png new file mode 100644 index 0000000000000000000000000000000000000000..71a17e58c4f244d2938acdcfb97d737b30bd19a6 GIT binary patch literal 29211 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 literal 0 HcmV?d00001 diff --git a/docs-gen/static/images/datatypes_2.png b/docs-gen/static/images/datatypes_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d301f832787b0736b55b3702ac1f9958bd548ac2 GIT binary patch literal 35577 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�XnLocFd0m{6o&9W%FE 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 literal 0 HcmV?d00001 diff --git a/docs-gen/static/images/types_6.png b/docs-gen/static/images/types_6.png new file mode 100644 index 0000000000000000000000000000000000000000..af6553d939c180263023e5c97b7b533ae9ed1a9b GIT binary patch literal 23367 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 bpV8Miuvqln-nGD!u^BvF{an^LB{Ts5D`M1O literal 0 HcmV?d00001 diff --git a/docs-gen/static/images/types_donut_chart.png b/docs-gen/static/images/types_donut_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..d964ccba17b9178a769342f77c491b5e2ca22a12 GIT binary patch literal 75545 zcmeFZX*kqv_&+>Ew%by|U9wandy6GxOWDejeaVu29kTC~y+Toxeb2r#7(1oNz6^#z z$~I<%tYi3JU+&-k#d93b+vj=na~#!}xxUwRUgv&(&U1>^R9B*Ccv_@9DuvNO2$vbbt|y8UpY>`{`?|5ewYXPK`5x90yVqtJRJZ_?;7 z^k=@430|yMs&&%{0WS?A9`H`D-TTk_I8C{9?}kOyFD5%)_=g6)-mt{}KX$pQ^pNU5 zg8yI5RqPYl{r72UrF|*lj_a7_p6}la@1=kGRQTr2Ki-{#=dLM!d$hT=HM6ymp)W80 z0(p42WW$;?)oo~KxcRDR$!5ta1LYa?wSOSd`EWJQo$TZ|cjTcuABvpL%FM}KestqD}h@nxkrc3hc30Nv@O z&(o54zx;Uf*-O^Fv%N3dT{W&4-@N=7hV%Zyq%X4Pd7KNsJBgD%+FQUc4C(Ah*9qKU zyJPdl|2Rd8tG0WYxI2p)Ez~|kw~Dox#mdSq&~M>9QBMzF5K9cJ?@Nle7A@Hw8&`cl zR7v0##Y&K#+?Gp{6i@ant0+9SovfPsJc)P3?ib;yS`IOi<0;4T@XLu)yT;27OD-gZ zrFJy>6($_P4EL;iE{K1Nv!Pr&ZpdnBxn!9zw_~H^o_g(6S^<>xj8S8JWUL3JMzyN* z%sqeW#u6U5A57kVOoQnBp5IOsYPW(@#f)oQfvGo zHAziU6yweopO3bx$1Ty@U1M@HuAiAEsYpu+$L>VP*Snzl1tEbV?9dRY z_OSE+L{^X7eUGl{qq%eY_62)py$Go{&TC7CcQ4^pe33Iqd?P|szFspdv;EtPRPYkK_SEz1kE%pHnSxiuNPg9`M#PXz=Jg)0U$ z#)7};IhWBX<=rL@t3_O{+q$)F@9g zTubA2z@F>FRiODecf{|9{qpxml4lW+|fcjDE-Njn2#bo^W@pyOJI;s8WgM!-5 z-kmR}ag;$qFg(nXRm~{Gmc&xquvYm7NyD+&OKT?n=(coL8rSmHBR}$MPl@w8k}Ih4 z45@9GBwd$T?oM3aD|1t&pd(ks3tf5sJ zWP5zqAwd>t4zMFFA zKc$GG!;}3k=cQ7-!8Vl@;8HMlqrIwo1$Y@Rg?_pFW;736kT@~%f9Q2@vh`=_BuoUh zEW}DB-xFnDl@Rxol$?mUBiKa0<7q__P~ox`w%JH=Dq$ipOM{BQ@hlHJ3PLk;rV+h| zd&QjC#}#9m2MV+e&IbtIXYd;%Xg$XB4j&XNu2cl~NHApSl!r+^WOL&2t9Wtml)g)f z4^>F3Id6Y7eMa-I^H}XIGs~B0RVV-LslKJTE6S=TmP}^8KB&*wel1_r7((C z=RH@wd1s4x$2W6vlbSx(PNo*Ihj%4wVrIOHk0}$INzN$?Mw;+^0FFAIkImhgLXC(i$ zfC&AfTC^OgUkU@gSE$a`Tqyln=@q&YN?x24SqbkTB0{bRG$X)aFT6l-cj6WA#s ziZ2hP(&LOv^9-c8rWIGNh7teJ{QP{Brr70L6n-I27C-*gV34gR|HJ8(>`XmeJ4*-b z9L%aJljG$&hcxqFr{ttt{rGr`S{z++dm=ee?*4>a=X~?bzK=>-2q13Br_u-oGH9+`VzCfx)QfwtVQy)jX zAIVoMKK#V&Mo@4`xf<8S`d{Krd6{k6)i6-;rqe6rt@enwUKz0K{>D3c{+dAN$# zW!YA2b5-6LtT-AscA;Il<;;gPJ8DCV6*cWIrg+WWfX`EoCI|}-*D0x6fBF;x{tUat5#rF8PF8qC;u7*X^zpmY?73kEpTNQ87Vi|8f zba$?*lCBi~XZEg?^-uctHWtQo^qy#$xwzeAobHUI*LQbNrSQ-W)4FEiBExxeCyDYX z6WL()XtA=J{q=<7X_Vv~s=c5Yt{eI|{a(X&?H^)=&a6keOit1&6}r6h7EACKR`pVC z3RLy1Na3u<0^P%1)sQ>yXg5`=TYHW`WefV>$tyw&``eP)9wBxIxR(ZO>Ac|Tz0t* zRVs~oN7r2Xn$Ub1Ta}u;&!8w)QX&wpedCIQWqU#M zt!Mlnk6dYd7z;bm?2l-+o%d(oM=LIypv)vrsp1qNn=bhBawb0_&&!17EO7+Yem1P~ zJZxO_9eXVLA3e@mww)&OtvmM%)uUNF!!bt=j43U3;`i<|MWZg9Y$2CznV>RiG4FL# zdP28z%>1QZ%2m4EQICqXqeyp4IU0fjRs0#>r!R43bk}|2Y>ylg{P7LlGc~tId3Wu+ zgHLsyi_q=E^lp}G(S2UzPlearQ`3@<`D%ZYLZ`@Pi`@MBlE5x zL4@zOH(i;(K2P}v=Ucx$ZcKj4$q9K1@m1^Xf7EDw1#i^yqVnNhcH5UK>xQz(N4$=* z)Dxk?B8yU_z795C#`+_LMy!sNi!PQ!8i@%BR%pyqmZd!?c zARpGt8c7Yl&fw@WcPiYjGkmI=<>n5mPUr7_bci#@ieBw|IYhuCg$s_XXe2V!?SKSwF+n?VROReeVo7iH%WAixFjNa>-8e{BI2luzoGz?v?65HvXY6@*JXCGQt zP33!8`ZkV{8q+kS+>Um>(i*5ypv%0_9p^IqpeY=kbkX}-5lOLqkQdl)tu%US&_)p8vSNx+(vnRZZw{=~vuu)tx;wd5jJ z)`-{SEA5Z#2%qZ}d@Vcj$D9psIQACFJE(ISXS&GOOS5~;Xb#8@-jw|a-z!@47c8iQ z&6@htN`KvHI&k!USy;GHoiU$>IyJ8leQ?kdF+Yn=&;$AP zf*)zGzZX4<_K*!O;8?|tTa|~(otblOTKSprO`I8nb{tGh%Q*J!>+knEbLd)e6OsS} z3`QwM3K!|&yK+@m`+RXN?Ynd%mp5wWk>?MMHT}EUyq6KJL}vqqJ>{?iFS8V*ixw}Q z*QayPRCY31p}wRm36K6c6{OF(l*idm-WBOrnBUP0m8E$aI`iYE&W=x{y>~g=$uYB7XF|#;H&3^ivFz1}2+|^t5Y}i^_<|aj{u($`D4)TEl5z}57 z_X8Q*9Soebq?ugNJF1qb!bFOE<~WKx2I>g=L0_zb@^z5 zj`i;3%Vm_QzZwYq+MqDM{|sR(%G|eo*Wh0#m)jHjC7^Kh-^J^4O*noHidBnKy0*7X zu~%)==a!Ua%r&_`*)U0s`kHxq0Oe&8@#LeYNuXYl{~LeIot!lk!Eo90#VSt<())x2ZLA;j->EA1D);K8Q6bCid$^~EOS;?pRVX);@+GKv8t(5+ zSCSH@sVU?<%{oC~cg;}|7_50az-xb*;EtkBsO!}=W z>#g_D{)6sfKyy#GZmXWD(L$r=Wk+evOFof=gmUCAZ(yZEwNZ_--s@jhwfFq&GsF*` zyTucHReKX1(2{+IrLkoqwcqV@iCcUeXln=RRyUkVsTjRTTva z%F3Fpw;s3TtEa8PZ(c0fSm@T)05o=VzFdw!qqWk0=|ydI4~;|Q1b!pO%tg`q_iy|w zZkl=^6Wmm8u{+@(+uG;Ccj8PBWOf5nhpWP&dzW+0Mc53aY)q1K`6i7jjQ#DJ~6f#E; z6#fYHZ=`=>8?DtghD6vG6T*roLu9DgNAi#ERIlKY6XwCyNY0u1-!~1)LW<$P+5hp= zOBudX-RyVwnfG?@4jcwgDmBi7#23W{Dxjrup6Fcu@+JVtbIKdIn*2J1KXKyk_Fg$| z64-0J)0JLT<>ovS*k-c5GFZ1g)J8B^c1~(WdX2VWOeos`5e&D%E(q88`wxei^q}Y@5 zANEnC-ydg2aATO9E`ZT~6sdH~AaJ(xJ2T$1f`GCGReD0lT8FceaGIx8WXNKTe{ecd z#;h)D>N)zC+u+cgzg;W*(opN?YQOrxIk1iLW3Y{Y)(E=P7%|S~JuNQ^K*7p5 zt{G)O!9%f3Op^7X`S+Ztz@RLH~5_hyS4Pg_sf)VO^{I#&_iKO>3=6eGc62ALD6 zJd1Dosr0Cj@Ojurg?%Lv+}3aW?NEZpm|e;m`(g?n|LJ=KRFh|MLTx3xqHO7IvG5vp zX9p!1ncd8|G~RC|lpMeGnH^>JIp*@5sS#8mhvZ*5S^Z`#_OdB2n-Pwtj;4wnHhrLjtoPb>Fvke0qJl^#7XyQH19B~9Nv`}j{ZU*gS~s-?4E%%-FJO4 zJfb!ImY~D4CWEU#f~*Blq{#{~C&X+e%ko8?N#Y_EELq{%lW3cu%C9CiK6>qy$J(f#`EIF9jbP?G8 zJgh796}A0hb}imv@~YuN+FSpQp$epujX!WzT_A@8ylVAeI2zm`kI^(7y7}z7}RH^L$KPy<{-T@)-2)YP7gh-}p*5y=w>l z9DHJ?R9gyS!|f9`AO(KxXgC^wqlHD)OPIkuP@%#>J|0CW)S&&!fIPXrQ{~jT~BMg1q-zlGk@3FW>dgIO?~e4=;yiMthH$ech^XomoHTka74 z{o&`B(LCE2xBKfafI8UGL6_n@pc9g0b~*#Q_nq%?{tts+LNxV)%Pk($H}dlT3_J!T zNFOc&VzYDX;>urgp{Q!(oETx8K|l80LXk%sU!BB%wfrh!d_R^`4Q_uG1VUi4dYB}o zP-k1+_tZejRo?g!GqbcT9?W4EZDXM@*zDa2^E=9awN+Bbzf>cIaV7qY*IIo9B&hQT z4H!m3R= z1|c3&xEm)z`FKd%{Sx=;HVKSDh+hoviW*tJOw&jh8Uey3m4iflDRDPXcvPld8Qga` zHub5rq;-CJ(C!_;52p?lNqc1uaM4kKxq-iNZTHM70)1*hILPnFKHvPeoz&aJXG&Ro zO~(80O=#UoJ35wE>L*QY>8o7V*FZe*k)<+M)Wka?KlYIk7Y_|kKjCTq8pWh{el|P1J~V6 zq@TYjYcYQ#iQoaC7w40c0e{0ml9+bhK${rOSjFm|0+&=^|6aQ{flP7oIp95^S+z7uWh7*SkBs}D+hSp`F9LR#6zzloA+--*=1 zoF{>W{7IJa4o8;VU9$4d_Wu=<4mPWdgLq}2Up33(v=kr!E@Y@}BT!T#SQ(8El9mJ% zbOGEFxE;fOr50Btmp)Jf$)28GQQy_e;>&e!(H;07bj~2eSeyjY%H_GMW&>XBXTfQU z?~=?4ls^9`NnNh{ke+xI>@9V|tn1+^fsE(|8tAD`px?xm{T21W<_W3>jS*4CZiw+` zPtKHI$;y#NbEq&`LzLQrc-Xl69kD&%^r7+h=5tBn9^`ELUPCuntaC{eo)*IJgHs4H z#&sAIlu1A`ykSki6FUmhuuNY_!v~+z1+HKxWtxDWZu3u1k<{l9eu|5jMm@d^Js1eN ztq16LY%S5aGa2CSKIk3k25_eLbSA-uXIaJ*;%vzBiMkr~JW4h9Zv=~JIZ|t^j*!VLw0eGJd$X|rG^7e12IjtW*0B%dy zdFoxxvF~5nKBF4F+2bjnn9GCOK)fCh7s3?!yN6AAriCPK02g`iI0JdVnx%YfH}x(0 zC7${FcR+kQq|}@jBK1}L^9e#g<483Pbh0DOj^b>DH_2y~V%b3~VYrOp1FQZOD{Nk1 zvR^np2jXE!rhq9@7eU-0pCSB0PrXY3ydU&<49Q1lywceOJ>CGkAVYSNj6tU1>+yyW zNIuuVJ9i}UOX$A~bZ_ooi0+~(LKaXKkO{)%O1@zlG-Qdr{6vmE+*iI-(7l7I($0HhnzRpU|zXp!au$CMv< zeD@Qq>^aZ#s|Eja1UdxLZ?42_>6S9w^ghHNib$H*f03VOi&Gcz=;j2l4H#+w+f*Lk zF{?LmlLOmqEH)3cluUE?^-6~6Pn$|@RZ@Up- zfnC*L#EM~nt~_2$<}rj1o$qT8rCWFicl^F^T5oIyC^Hx@X@BqZ+#)sp^6 z@PnD^gC*k(aEuRRKvA-Jk$I&9%2H;YGKHWplDkS6*&5lNjcY2BCeVYJ?V~^e_G!6n zxX+-C9uK?be-UPgh;*dCgCnkMDj%K8%@$Rz!uIy(X z%tt{$4mlvFjnG4#>zt6scAUu912zgdkpBBK@?g^Js5DK2f*kPs$rDo8pSr`^;eK8% z`8seE!^gsm;KH#K?^TxB7UiWk>_FH}uc+XlDEs~6?SFS?2#Z0xdtf;-P&wK*pmr~Z zvJxK+!>k&duYGr~*26+*rzXg}f)3|;r|OnMKwWr=PZb1&cwiCx$vPD(U_EXhP&qEkSuC<3FRP3K&Wgdf=QYG>6BiH>V3qUH;x^bF+1A_{0zmlX1hRl7 zFi24&RHaN4H&MU`!YY4<`ttMpH)u$~Lx9qfLmtIK0e|0qJ#F@t5M@xS< zBSG+y6M!P5NUOAVo}h+m-r;xPhU7~4g?Puxk2mVreY}#PR0-1aMQyzs&Vhgar$CO6Th6bd;CvuY@*gQg;0V9eoG22!5 zn~T&JS@EZS^{O@q%U(KDWn3)2?j|dgy?Mpywp7hfxl2pURArh(L*wx$`}=!N6LtCs z$twsoH?!OD_do<>5NoW~{EVlz(xL2WrBusvv!cbJ=sC|nMTb60{qn@WSxL1XGh$af zN=LLrH%8Bm#ZIPBQMPu5KWto>*RORnONX~Or2@Schg5wY;e2~u3*bgXJy$mHiUd1u)^{d!DiIO4%&=RJG8*wI7DDiffr&j92HJmP^-cS1tKC@814K@kezwDJ9B+4@bVzCDW= znDBu)Miqz2SlV%;A6UHtgWZSR5T%KHor@dtjs0a1q@DnLZ=E>baJJmCmMi$^ySPVB zMbKC*2XMkhdHKuA&!b_&RYLpg$L)xHu3%7oQ8GckP6Q+iV#f-=`kI_9zndN5JOlR- z8M;#G@89Rj%t+ar#HgLSGdxlhXliO&){$*_W$zn_v}mr2`1bO&DbP#9+HzfxYh{

EU?4F7s}OH=1mlY7Rv6Q)#w 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