Enode Developers

Smart heating

Smart heating optimizes energy consumption by automatically reducing consumption during the most expensive hours. This adjustment is made based on a user-created temperature schedule. The optimization is determined by market prices or tariffs, depending on your preference. Additionally, the adjustment is flexible and recalculated according to the user's behavior. For example, if the user modifies their schedule, the smart heating schedule will be updated accordingly.

Copy linkUser interface

The following sketches provide examples of how the smart heating functionality can be communicated through your app's user interface. In this example, the user has set an ideal temperature of 22 degrees, with a sleep mode of 18 degrees from 23:00 to 07:00.

At the top of the illustrations below, users can see the current room temperature and a status indicating whether the heater is actively heating or idle. When a smart interval is activated, we recommend illustrating this to the user, helping them understand why the room temperature may temporarily be below the ideal level. The sketches below include a text explanation of the adjusted temperature and the duration during which it applies.

The toggle in the first section allows the user to enable or disable smart heating. You can provide additional information in the box explaining the motivation for enabling this functionality.

The second section enables the user to adjust their ideal temperature schedule. Additional modes such as sleep mode and away mode improve the experience, but are not required.


Copy linkTechnical Implementation

Copy linkAssociating an HVAC Unit with a Location

To activate smart heating, it is essential to associate the HVAC unit with a location. This allows Enode to retrieve the applicable electricity prices. You can initiate this process by creating a location using the Create Location EndpointAPI.

Once the location is created, associate it with the HVAC unit by inserting the locationId into the Update HVAC Unit EndpointAPI.

Copy linkCreating a Schedule

Before activating smart heating, establish a schedule through the Create Schedule EndpointAPI. The holdType has to be set to PERMANENT and the mode needs to be set to HEAT for smart heating functionality to work.

Sample of a valid schedule


  "isEnabled": true,
  "defaultTargetState": {
    "holdType": "PERMANENT",
    "mode": "HEAT",
    "heatSetpoint": 22
  "rules": [
      "hourMinute": {
        "from": "23:00",
        "to": "07:00"
      "targetState": {
        "holdType": "PERMANENT",
        "mode": "HEAT",
        "heatSetpoint": 16
  "targetId": "{HVAC_ID}",
  "targetType": "hvac"

Copy linkImplementing Smart Heating Policy

With the HVAC unit associated with a location and a schedule created, the smart feature is ready to be utilized. To acquire or modify the smart heating policy, refer to the Smart Policy EndpointAPI.

Before activation, we verify the schedule rules, ensuring holdType: PERMANENT and mode: HEAT, and confirm the HVAC unit’s supportive capabilities.

If any inconsistencies are identified during the validation, a 400 Bad Request response will be returned, accompanied by a detailed explanatory message. To function cohesively with the smart feature, the HVAC unit is required to possess the subsequent capabilities:

Copy linkModifying a Schedule

To alter the user-defined schedule while having the smart heating enabled, use the Update Schedule EndpointAPI. While smart heating is active, we validate that the rules adhere to holdType: PERMANENT and mode: HEAT.

Copy linkSmart Heating Status

To retrieve the latest smart heating status for an HVAC unit, use Get Smart Heating StatusAPI.

The endpoint displays intervals during which the user-defined temperature schedule is overridden, and the corresponding temperature that will be used instead. These smart intervals will be recalculated whenever there are changes to either the prices or the user-defined schedule. If there are no prices available (because there are no tariffs for the user, or the HVAC's locationId is associated with a region where Enode has no pricing data), intervals will always be empty.

Was this article helpful?