Zoned HVAC Control

"QtAA Zoned HVAC Control Example Screenshot"

Building and deploying the example

See specific steps relating to building and deploying Qt for Android Automotive examples.


This example uses the zones capability of the Qt IF Generator Extensions for Android Automotive. For a detailed description see the HVAC Control documentation.

This page covers only the usage of zones.

Preparing Configuration Files with Zoning Enabled

First, in the .qface file, the zoned attribute of config for the component must be set to true:

@config: { zoned: true, id: "io.qt.qtif.android.ClimateControl/1.0", ... }

Second, to be able to access a specific VHAL property in different zones, it must be assigned to those zones. In the following example the targetTemperatureSet attribute of the QIfClimateControl will be present both in the Driver and Passenger zones.

            - DRIVER_ZONE_ID
            - PASSENGER_ZONE_ID
        mightNeedConversion: true

The DRIVER_ZONE_ID and PASSENGER_ZONE_ID are zone aliases to (Android Automotive Area Types).

    - DRIVER_ZONE_ID = VehicleAreaSeat.SEAT_ROW_1_LEFT | VehicleAreaSeat.SEAT_ROW_2_LEFT
        | VehicleAreaSeat.SEAT_ROW_2_CENTER
        | VehicleAreaSeat.SEAT_ROW_2_RIGHT

The names of the zones, that will be used in QML (Driver and Passenger, etc.), are defined in zoneMappings section:

    "": SEAT_ALL
    Driver: DRIVER_ZONE_ID
    Passenger: PASSENGER_ZONE_ID
    RearWindshield: REAR_WINDSHIELD
    FrontWindshield: FRONT_WINDSHIELD

Running the Example

To run the example from Qt Creator, open the Welcome mode and select the example from Examples. For more information, visit Building and Running an Example.

Using Zones in QML

As in the HVAC Control example, the connection to the back end is defined in a distinct QML file: ClimateControlFacade.qml.

Accessing a particular zone's property in QML is straightforward. The generated ClimateControl component provides the zoneAt property, which subsequently provides an additional property, named after the zone (Driver, Passenger, etc.). This property is an instance of the ClimateControl component. However, the only active properties are the ones that have been assigned to a particular zone. So, you could assign a value for Driver's defroster, but it would not give any effect.

As the zone is a separate object we have to make the connections separately for each zone.

    Connections {
        target: climateControl.zoneAt.Driver
        ignoreUnknownSignals: true
        function onTargetTemperatureSetChanged(targetTemperatureSet) {
            facade.targetTemperatureSetDriver = targetTemperatureSet

    Connections {
        target: climateControl.zoneAt.Passenger
        ignoreUnknownSignals: true
        function onTargetTemperatureSetChanged(targetTemperatureSet) {
            facade.targetTemperatureSetPassenger = targetTemperatureSet

To pass the values of the zoned properties to the back end, we must do it with respect to the zone containing those properties.

    Connections {
        id: ui2vhal
        target: facade

        // Defrosters
        function onDefrostFrontOnChanged() {
            climateControl.zoneAt.FrontWindshield.defroster = facade.defrostFrontOn
        function onDefrostRearOnChanged() {
            climateControl.zoneAt.RearWindshield.defroster = facade.defrostRearOn
        // Temperatures
        function onTargetTemperatureSetDriverChanged() {
            climateControl.zoneAt.Driver.targetTemperatureSet = facade.targetTemperatureSetDriver

        function onTargetTemperatureSetPassengerChanged() {
            climateControl.zoneAt.Passenger.targetTemperatureSet =

See also Qt for Android, Qt Interface Framework, and Qt IF Generator Extensions.

Available under certain Qt licenses.
Find out more.