Remap a value between ranges: remap

The remap template function maps a value from one numeric range to another. Give it a value and its original range, plus the target range, and it returns the proportionally mapped result. For example, a value of 50 in the range 0-100 maps to 127.5 in the range 0-255.

This is useful whenever you need to convert a sensorSensors return information about a thing, for instance the level of water in a tank. [Learn more] reading from one scale to another. For example, you might remap a 0-100% brightness value to the 0-255 range a light expects, convert a temperature from one unit range to another, or map a 0-1023 analog sensor reading to a meaningful percentage. The optional steps and edges parameters give you fine-grained control over quantization and out-of-bounds behavior.

Usage

Here’s how to use this template function. Copy any example and adjust it to your setup.

TemplateA template is an automation definition that can include variables for the action or data from the trigger values. This allows automations to generate dynamic actions. [Learn more]
{{ remap(50, 0, 100, 0, 255) }}
Result (floatA number that can have decimal places, like 21.5 or 3.14. Used for temperatures, percentages, and other measurements that need precision.)
127.5

Function signature

The signature is a technical summary of this template function. It shows the name of the function, the values (called parameters) it accepts, and what type of data each parameter expects (for example, a piece of text or a number).

Function parameters that have a = with a value after them are optional. If you leave them out, the default value shown is used automatically. Function parameters without a default are required.

remap(
    value: Any,
    in_min: Any,
    in_max: Any,
    out_min: Any,
    out_max: Any,
    *,
    steps: int = 0,
    edges: str = "none",
) -> float

Function parameters

The following parameters can be provided to this function.

value float Required

The value to remap. Must be numeric.

in_min float Required

The minimum of the input range. Must be numeric.

in_max float Required

The maximum of the input range. Must be numeric.

out_min float Required

The minimum of the output range. Must be numeric.

out_max float Required

The maximum of the output range. Must be numeric.

steps integer (Optional)

If greater than 0, quantizes the output into the specified number of discrete steps. For example, steps=4 divides the output range into 4 equal intervals. Defaults to 0 (continuous output).

edges string (Optional)

Controls how input values outside the input range are handled. Accepts one of four options: none (default) performs no special handling, allowing out-of-range values to be extrapolated linearly into the output range. clamp constrains out-of-range input values to the nearest boundary before mapping. wrap wraps out-of-range input values cyclically within the input range. mirror reflects out-of-range input values back into the input range.

Edge handling options

The edges parameter determines what happens when the input value falls outside the input range.

  • none (default): Values outside the input range are extrapolated linearly. A value of 120 in a 0-100 input range maps proportionally beyond the output range.
  • clamp: Values are constrained to the input range boundaries before mapping. A value of 120 in a 0-100 input range is treated as 100.
  • wrap: Values wrap cyclically. A value of 120 in a 0-100 input range wraps to 20 before mapping.
  • mirror: Values reflect back into the range. A value of 120 in a 0-100 input range mirrors to 80 before mapping.
TemplateA template is an automation definition that can include variables for the action or data from the trigger values. This allows automations to generate dynamic actions. [Learn more]
{{ remap(120, 0, 100, 0, 255, edges="clamp") }}
Result (floatA number that can have decimal places, like 21.5 or 3.14. Used for temperatures, percentages, and other measurements that need precision.)
255.0

Using steps for quantized output

The steps parameter divides the output into discrete intervals. This is useful when you need the result to snap to specific levels rather than being a continuous value.

TemplateA template is an automation definition that can include variables for the action or data from the trigger values. This allows automations to generate dynamic actions. [Learn more]
{{ remap(33, 0, 100, 0, 255, steps=4) }}
Result (floatA number that can have decimal places, like 21.5 or 3.14. Used for temperatures, percentages, and other measurements that need precision.)
63.75

Good to know

  • By default, out-of-range inputs are extrapolated beyond the output range. Pass edges="clamp" to limit the result to the output range.
  • The output ranges can go in reverse, which produces an inverted mapping.
  • With steps, the output is quantized to discrete intervals, which is useful for dimmer steps or discrete sensor levels.

Try it yourself

Ready to test this? Open Developer tools > Template, paste the example into the Template editor, and watch the result update on the right. Edit the values to see how the function adapts to your own entitiesAn entity represents a sensor, actor, or function in Home Assistant. Entities are used to monitor physical properties or to control other entities. An entity is usually part of a device or a service. [Learn more].

More examples

Real scenarios where this function comes up in automations and templates. Copy any example and adapt it to your setup.

Remapping a sensor percentage to brightness

Convert a 0-100% sensor value to the 0-255 brightness range a light expects.

TemplateA template is an automation definition that can include variables for the action or data from the trigger values. This allows automations to generate dynamic actions. [Learn more]
{{
  remap(
    states("sensor.ambient_light_pct") | float,
    0, 100, 0, 255
  )
}}
Result (floatA number that can have decimal places, like 21.5 or 3.14. Used for temperatures, percentages, and other measurements that need precision.)
127.5

Remapping with wrap edge handling

Wrap out-of-range values cyclically. This keeps the output cycling smoothly.

TemplateA template is an automation definition that can include variables for the action or data from the trigger values. This allows automations to generate dynamic actions. [Learn more]
{{ remap(450, 0, 360, 0, 100, edges="wrap") }}
Result (floatA number that can have decimal places, like 21.5 or 3.14. Used for temperatures, percentages, and other measurements that need precision.)
25.0

Remapping with mirror edge handling

Mirror out-of-range values back into the range for a ping-pong effect.

TemplateA template is an automation definition that can include variables for the action or data from the trigger values. This allows automations to generate dynamic actions. [Learn more]
{{ remap(120, 0, 100, 0, 255, edges="mirror") }}
Result (floatA number that can have decimal places, like 21.5 or 3.14. Used for temperatures, percentages, and other measurements that need precision.)
204.0

Still stuck?

The Home Assistant community is quick to help: join Discord for real-time chat, post on the community forum with your template and expected result, or share on our subreddit /r/homeassistant.

Tip

AI assistants like ChatGPT or Claude can also explain or fix templates when you describe what you want in plain language.

Related template functions

These functions work well alongside this one: