AWTRIX NG (next generation firmware)

AWTRIX NG firmware support is here :tada:

Hi everyone!

Since Blueforcer released the new AWTRIX NG firmware, I have updated both my Home Assistant integration and the blueprint to fully support it.

What’s new

  • :white_check_mark: Home Assistant integration updated for AWTRIX NG
  • :white_check_mark: Blueprint updated to work with the new firmware
  • :white_check_mark: New blueprint examples added
  • :white_check_mark: Fully configurable through the Home Assistant UI
  • :white_check_mark: No manual MQTT payload creation required

Installation

The integration can now be installed directly through HACS as a Custom Repository.

Integration

Add it as a Custom Repository in HACS, install it, restart Home Assistant, and then add the integration from Devices & Services.

Blueprint

Blueprint examples

The examples show how to display sensors, weather, text, icons, and other Home Assistant entities on your AWTRIX NG device with only a few clicks.


If you’re migrating from the previous firmware, the updated integration and blueprint should make the transition much easier.

As always, feedback, bug reports, and feature requests are very welcome.

Huge thanks to Blueforcer for continuing to improve AWTRIX! :rocket:

Bonus: If you don’t want to install my custom integration, you can use this blueprint with the native AWTRIX Home Assistant integration.

awtrix-ng-hass-integration/awtrix-ng-simple-mqtt.yaml at 41b149144dfb10723d78d3850000c4edf1c76809 · 10der/awtrix-ng-hass-integration · GitHub

5 Likes

Hi 10der,

I can’t seem to get the quotation marks right. Could it be that NG now always expects them for icons? I’ve already consulted AI, but I’m stumped. Hard-coding it in the blueprint works fine, but how do I handle it when the icon is dynamic—like with your weather example? Does it work for you?

You can see it in the trace. With AWTRIX 3 it’s working fine. With NG the icons are missing without quotation marks.

  1. MQTT blueprint already fixed with numeric icon names.
    awtrix-ng-hass-integration/awtrix-ng-simple-mqtt.yaml at 9f0898ba788586399a543ec2fd67f09cc9b55039 · 10der/awtrix-ng-hass-integration · GitHub

  2. awtrix-ng-hass-integration/awtrix-ng-simple.yaml at 9f0898ba788586399a543ec2fd67f09cc9b55039 · 10der/awtrix-ng-hass-integration · GitHub
    still has an issue - you right.

so “version”: “0.1.2”
fixed

1 Like

@ Snoopy12345
thank you!

1 Like

Thank you 10der. Maybe I am too stupid, but it’s still not working like in AWTRIX 3.

installed your fix, yet the icon problem exists no matter which blueprint

all icons now “str”
let me check

alias: Snoopy12345 Test
description: ""
use_blueprint:
  path: 10der/awtrix-ng-simple.yaml
  input:
    app_icon: a630
    entity: binary_sensor.m_dnipro_ta_dniprovska_teritorialna_gromada_air
    awtrix_device:
      - a122ccc41511711f0d64087a8e04f359
    user_options:
      durationMs: 5000
      icon: 33655

awtrix-20260811112631

so, numric icon 33655 is OK

can you share automation source?

alias: AWTRIX NG - OUTDOORS TEMPERATURE
description: ""
use_blueprint:
  path: 10der/awtrix-ng-simple.yaml
  input:
    entity: weather.forecast_home
    awtrix_device:
      - a122ccc41511711f0d64087a8e04f359
    app_icon: "2355"
    user_options:
      durationMs: 5000
      text: ""
      icon: "{{icons[states(entity_id)]}}"
      draw: |
        {%- macro draw_forecast_lines() %}
          {%- set hours = 24 %}
          {%- for hour in range(hours) %}
            ["pixel", {{8 + hour}}, 7, "{{colors[(colors.items() | map(attribute='0') |
         map('int') | sort | select('>=', forcast_temp[hour]) | first) | string]}}"]
            {%- if hour+1 != hours %},{%endif%}
          {%- endfor %}
        {%- endmacro %} [
          {{draw_forecast_lines()}},
          ["text", {{13-2 if value_template > 9 else 15-2}}, 1, "{{'+' if value_template > 0}}{{value_template}}", "{{color}}"],
          {{moon_data}}
        ]
    additional_options:
      icons:
        clear-night: a12181
        cloudy: a2283
        exceptional: a2364
        fog: 17056
        hail: a2441
        lightning: a630
        lightning-rainy: a49299
        partlycloudy: 2286
        pouring: a49300
        rainy: a2284
        snowy: a2289
        snowy-rainy: a49301
        sunny: 53386
        windy: a15618
        windy-variant: a15618
        full_moon: 2314
        waning_gibbous: 2315
        last_quarter: 2316
        waning_crescent: 2317
        new_moon: 2318
        waxing_crescent: 2320
        first_quarter: 2320
        waxing_gibbous: 36234
        home: "96"
        sunrise: "485"
        sunset: "486"
        unavailable: "52176"
      colors:
        "0": "#00ff7f"
        "5": "#00ff2a"
        "10": "#2aff00"
        "15": "#7fff00"
        "20": "#d4ff00"
        "25": "#ffd400"
        "30": "#ff7f00"
        "35": "#ff5000"
        "40": "#ff2000"
        "-15": "#007fff"
        "-10": "#00d4ff"
        "-5": "#00ffd4"
      moon_phase: "{{states('sensor.moon_phase')}}"
      moon_data: |
        {%- macro draw_moon(phase, x=22, y=0) %}
          {%- if phase == 'first_quarter' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,3355443,3355443,14079702,14079702,0,0,0,3355443,3355443,3355443,15790320,14079702,14079702,0,3355443,3355443,3355443,3355443,13355979,13355979,14079702,14079702,3355443,3355443,1644825,3355443,13355979,15790320,15790320,14079702,3355443,3355443,1644825,3355443,15790320,15790320,15790320,14079702,3355443,3355443,3355443,3355443,15790320,13355979,14079702,14079702,0,3355443,3355443,3355443,15790320,14079702,14079702,0,0,0,3355443,3355443,14079702,14079702,0,0]]
          {%- elif phase == 'full_moon' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,14079702,14079702,14079702,14079702,0,0,0,14079702,14079702,15790320,15790320,14079702,14079702,0,14079702,14079702,15790320,15790320,11974326,11974326,14079702,14079702,14079702,15790320,11974326,15790320,11974326,15790320,15790320,14079702,14079702,15790320,11974326,15790320,15790320,15790320,15790320,14079702,14079702,14079702,15790320,15790320,15790320,11974326,14079702,14079702,0,14079702,14079702,11974326,15790320,14079702,14079702,0,0,0,14079702,14079702,14079702,14079702,0,0]]
          {%- elif phase == 'last_quarter' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,14079702,14079702,3487029,3487029,0,0,0,14079702,14079702,15790320,3487029,3487029,3487029,0,14079702,14079702,15790320,15790320,1907997,1907997,3487029,3487029,14079702,15790320,13553358,15790320,1907997,3487029,3487029,3487029,14079702,15790320,13553358,15790320,3487029,3487029,3487029,3487029,14079702,14079702,15790320,15790320,3487029,1907997,3487029,3487029,0,14079702,14079702,13553358,3487029,3487029,3487029,0,0,0,14079702,14079702,3487029,3487029,0,0]]
          {%- elif phase == 'new_moon' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,2763306,2763306,2763306,2763306,0,0,0,2763306,2763306,2763306,2763306,2763306,2763306,0,2763306,2763306,2763306,2763306,1842204,1842204,2763306,2763306,2763306,2763306,1842204,2763306,1842204,2763306,2763306,2763306,2763306,2763306,1842204,2763306,2763306,2763306,2763306,2763306,2763306,2763306,2763306,2763306,2763306,1842204,2763306,2763306,0,2763306,2763306,1842204,2763306,2763306,2763306,0,0,0,2763306,2763306,2763306,2763306,0,0]]
          {%- elif phase == 'waning_crescent' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,14079702,14079702,2763306,2763306,0,0,0,14079702,14079702,2763306,2763306,2763306,2763306,0,14079702,14079702,2763306,2763306,1842204,1842204,2763306,2763306,14079702,15790320,1842204,2763306,1842204,2763306,2763306,2763306,14079702,15790320,1842204,2763306,2763306,2763306,2763306,2763306,14079702,14079702,2763306,2763306,2763306,1842204,2763306,2763306,0,14079702,14079702,1842204,2763306,2763306,2763306,0,0,0,14079702,14079702,2763306,2763306,0,0]]
          {%- elif phase == 'waning_gibbous' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,14079702,14079702,3552822,3552822,0,0,0,14079702,14079702,15790320,15790320,3552822,3552822,0,14079702,14079702,15790320,15790320,13421772,13421772,3552822,3552822,14079702,15790320,13421772,15790320,13421772,15790320,3552822,3552822,14079702,15790320,13421772,15790320,15790320,15790320,3552822,3552822,14079702,14079702,15790320,15790320,15790320,13421772,3552822,3552822,0,14079702,14079702,13421772,15790320,3552822,3552822,0,0,0,14079702,14079702,3552822,3552822,0,0]]
          {%- elif phase == 'waxing_crescent' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,3355443,3355443,14079702,14079702,0,0,0,3355443,3355443,3355443,3355443,14079702,14079702,0,3355443,3355443,3355443,3355443,1644825,1644825,14079702,14079702,3355443,3355443,1644825,3355443,1644825,3355443,15790320,14079702,3355443,3355443,1644825,3355443,3355443,3355443,15790320,14079702,3355443,3355443,3355443,3355443,3355443,1644825,14079702,14079702,0,3355443,3355443,3355443,3355443,14079702,14079702,0,0,0,3355443,3355443,14079702,14079702,0,0]]
          {%- elif phase == 'waxing_gibbous' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,3355443,3355443,14079702,14079702,0,0,0,3355443,3355443,14079702,15790320,14079702,14079702,0,3355443,3355443,15790320,15790320,12763842,12763842,14079702,14079702,3355443,3355443,12763842,15790320,12763842,15790320,15790320,14079702,3355443,3355443,12763842,15790320,15790320,15790320,15790320,14079702,3355443,3355443,15790320,15790320,15790320,12763842,14079702,14079702,0,3355443,3355443,12763842,15790320,14079702,14079702,0,0,0,3355443,3355443,14079702,14079702,0,0]]
          {%- endif %}
        {%- endmacro %}

        {{ draw_moon(moon_phase, 24, 0) }}
      value_template: "{{state_attr(entity_id, 'temperature') | round}}"
      color: |-
        {{colors[(colors.items() | map(attribute='0') |
         map('int') | sort | select('>=', value_template) | first) | string]}}
      forcast_temp: |-
        {{(forecast[forecast.keys() | first]).forecast | 
          map(attribute="temperature") | 
          map('round') |
          list}}
    pre_actions:
      - target:
          entity_id: "{{entity_id}}"
        data:
          type: hourly
        response_variable: forecast
        action: weather.get_forecasts
    prefix_text: "{{ '+' if value_template > 0 }}"
    app_name: awtrix_app_forcast
    extra_triggers:
      - trigger: time_pattern
        minutes: /5

awtrix-20260811114157

Hi 10der,

now this is interesting. I took exactly your code example and still have no icon. I’m at a loss. Fixed icon is no problem. Only using the dynamic ones.

The only difference I see in the trace is the payload:
Fixed
icon: ‘53386‘

dynamic
icon: 53386

show me your code

I can, but it’s exactly your code from above. Please have a look at my comment above regarding the payload.

alias: AWTRIX NG - OUTDOORS TEMPERATURE TEST
description: ''
use_blueprint:
  path: 10der/awtrix-ng-simple-mqtt.yaml
  input:
    entity: weather.forecast_home
    awtrix_device:
      - awtrixng-957554
    app_icon: '2355'
    user_options:
      durationMs: 5000
      text: ''
      icon: '53386'
      draw: |
        {%- macro draw_forecast_lines() %}
          {%- set hours = 24 %}
          {%- for hour in range(hours) %}
            ["pixel", {{8 + hour}}, 7, "{{colors[(colors.items() | map(attribute='0') |
         map('int') | sort | select('>=', forcast_temp[hour]) | first) | string]}}"]
            {%- if hour+1 != hours %},{%endif%}
          {%- endfor %}
        {%- endmacro %} [
          {{draw_forecast_lines()}},
          ["text", {{13-2 if value_template > 9 else 15-2}}, 1, "{{'+' if value_template > 0}}{{value_template}}", "{{color}}"],
          {{moon_data}}
        ]
    additional_options:
      icons:
        clear-night: a12181
        cloudy: a2283
        exceptional: a2364
        fog: 17056
        hail: a2441
        lightning: a630
        lightning-rainy: a49299
        partlycloudy: 2286
        pouring: a49300
        rainy: a2284
        snowy: a2289
        snowy-rainy: a49301
        sunny: 53386
        windy: a15618
        windy-variant: a15618
        full_moon: 2314
        waning_gibbous: 2315
        last_quarter: 2316
        waning_crescent: 2317
        new_moon: 2318
        waxing_crescent: 2320
        first_quarter: 2320
        waxing_gibbous: 36234
        home: '96'
        sunrise: '485'
        sunset: '486'
        unavailable: '52176'
      colors:
        '0': '#00ff7f'
        '5': '#00ff2a'
        '10': '#2aff00'
        '15': '#7fff00'
        '20': '#d4ff00'
        '25': '#ffd400'
        '30': '#ff7f00'
        '35': '#ff5000'
        '40': '#ff2000'
        '-15': '#007fff'
        '-10': '#00d4ff'
        '-5': '#00ffd4'
      moon_phase: '{{states(''sensor.moon_phase'')}}'
      moon_data: |
        {%- macro draw_moon(phase, x=22, y=0) %}
          {%- if phase == 'first_quarter' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,3355443,3355443,14079702,14079702,0,0,0,3355443,3355443,3355443,15790320,14079702,14079702,0,3355443,3355443,3355443,3355443,13355979,13355979,14079702,14079702,3355443,3355443,1644825,3355443,13355979,15790320,15790320,14079702,3355443,3355443,1644825,3355443,15790320,15790320,15790320,14079702,3355443,3355443,3355443,3355443,15790320,13355979,14079702,14079702,0,3355443,3355443,3355443,15790320,14079702,14079702,0,0,0,3355443,3355443,14079702,14079702,0,0]]
          {%- elif phase == 'full_moon' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,14079702,14079702,14079702,14079702,0,0,0,14079702,14079702,15790320,15790320,14079702,14079702,0,14079702,14079702,15790320,15790320,11974326,11974326,14079702,14079702,14079702,15790320,11974326,15790320,11974326,15790320,15790320,14079702,14079702,15790320,11974326,15790320,15790320,15790320,15790320,14079702,14079702,14079702,15790320,15790320,15790320,11974326,14079702,14079702,0,14079702,14079702,11974326,15790320,14079702,14079702,0,0,0,14079702,14079702,14079702,14079702,0,0]]
          {%- elif phase == 'last_quarter' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,14079702,14079702,3487029,3487029,0,0,0,14079702,14079702,15790320,3487029,3487029,3487029,0,14079702,14079702,15790320,15790320,1907997,1907997,3487029,3487029,14079702,15790320,13553358,15790320,1907997,3487029,3487029,3487029,14079702,15790320,13553358,15790320,3487029,3487029,3487029,3487029,14079702,14079702,15790320,15790320,3487029,1907997,3487029,3487029,0,14079702,14079702,13553358,3487029,3487029,3487029,0,0,0,14079702,14079702,3487029,3487029,0,0]]
          {%- elif phase == 'new_moon' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,2763306,2763306,2763306,2763306,0,0,0,2763306,2763306,2763306,2763306,2763306,2763306,0,2763306,2763306,2763306,2763306,1842204,1842204,2763306,2763306,2763306,2763306,1842204,2763306,1842204,2763306,2763306,2763306,2763306,2763306,1842204,2763306,2763306,2763306,2763306,2763306,2763306,2763306,2763306,2763306,2763306,1842204,2763306,2763306,0,2763306,2763306,1842204,2763306,2763306,2763306,0,0,0,2763306,2763306,2763306,2763306,0,0]]
          {%- elif phase == 'waning_crescent' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,14079702,14079702,2763306,2763306,0,0,0,14079702,14079702,2763306,2763306,2763306,2763306,0,14079702,14079702,2763306,2763306,1842204,1842204,2763306,2763306,14079702,15790320,1842204,2763306,1842204,2763306,2763306,2763306,14079702,15790320,1842204,2763306,2763306,2763306,2763306,2763306,14079702,14079702,2763306,2763306,2763306,1842204,2763306,2763306,0,14079702,14079702,1842204,2763306,2763306,2763306,0,0,0,14079702,14079702,2763306,2763306,0,0]]
          {%- elif phase == 'waning_gibbous' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,14079702,14079702,3552822,3552822,0,0,0,14079702,14079702,15790320,15790320,3552822,3552822,0,14079702,14079702,15790320,15790320,13421772,13421772,3552822,3552822,14079702,15790320,13421772,15790320,13421772,15790320,3552822,3552822,14079702,15790320,13421772,15790320,15790320,15790320,3552822,3552822,14079702,14079702,15790320,15790320,15790320,13421772,3552822,3552822,0,14079702,14079702,13421772,15790320,3552822,3552822,0,0,0,14079702,14079702,3552822,3552822,0,0]]
          {%- elif phase == 'waxing_crescent' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,3355443,3355443,14079702,14079702,0,0,0,3355443,3355443,3355443,3355443,14079702,14079702,0,3355443,3355443,3355443,3355443,1644825,1644825,14079702,14079702,3355443,3355443,1644825,3355443,1644825,3355443,15790320,14079702,3355443,3355443,1644825,3355443,3355443,3355443,15790320,14079702,3355443,3355443,3355443,3355443,3355443,1644825,14079702,14079702,0,3355443,3355443,3355443,3355443,14079702,14079702,0,0,0,3355443,3355443,14079702,14079702,0,0]]
          {%- elif phase == 'waxing_gibbous' %}
            ["bitmap",{{x}},{{y}},8,8,[0,0,3355443,3355443,14079702,14079702,0,0,0,3355443,3355443,14079702,15790320,14079702,14079702,0,3355443,3355443,15790320,15790320,12763842,12763842,14079702,14079702,3355443,3355443,12763842,15790320,12763842,15790320,15790320,14079702,3355443,3355443,12763842,15790320,15790320,15790320,15790320,14079702,3355443,3355443,15790320,15790320,15790320,12763842,14079702,14079702,0,3355443,3355443,12763842,15790320,14079702,14079702,0,0,0,3355443,3355443,14079702,14079702,0,0]]
          {%- endif %}
        {%- endmacro %}

        {{ draw_moon(moon_phase, 24, 0) }}
      value_template: '{{state_attr(entity_id, ''temperature'') | round}}'
      color: |-
        {{colors[(colors.items() | map(attribute='0') |
         map('int') | sort | select('>=', value_template) | first) | string]}}
      forcast_temp: |-
        {{(forecast[forecast.keys() | first]).forecast | 
          map(attribute="temperature") | 
          map('round') |
          list}}
    pre_actions:
      - target:
          entity_id: '{{entity_id}}'
        data:
          type: hourly
        response_variable: forecast
        action: weather.get_forecasts
    prefix_text: '{{ ''+'' if value_template > 0 }}'
    app_name: awtrix_app_forcast
    extra_triggers:
      - trigger: time_pattern
        minutes: /5

for dynamic I use your line

icon: "{{icons[states(entity_id)] | string}}"

First thank you so much that you trying to help me :clap:t2:

Tested with your string addition: same result

Trying the fixed icon the only difference I see is the payload and its working fine:

OMG!!!

you are using MQTT template!!!
you DO NOT use my component.

got it.

I have also your component from HACS. Was same result, but can test it again.

The rest version is doing its job, great :+1:t2: then I use this.

Thank you so much for your help

1 Like

MQTT blueprint also fixed

please test

I don’t really understand what’s happening in the activity log. What do the Uptime entries mean?

I was looking for something that could be used as a trigger when the pixel display rebooted, but got stuck on this behavior. So my bonus question is: What can be used as a trigger for pixel display starting?

you proposition?