Meine ersten Erfahrungen mit AWTRIX NG auf der Ulanzi TC001

Hallo zusammen,

Link zur Doku von Awtrix NG: AWTRIX NG

Hallo zusammen,

ich habe meine Ulanzi TC001 heute von AWTRIX 3 auf AWTRIX NG umgestellt.

Das Flashen hat bei mir problemlos funktioniert und war mit der offiziellen Anleitung schnell erledigt. Bisher läuft alles stabil und ich bin von den neuen Möglichkeiten wirklich begeistert.

Allerdings ist mir direkt eine Sache aufgefallen:

Bei mir gibt es keinen App Store wie in einem Youtube Video zur Beta zu sehen.

Ich hatte zunächst erwartet, fertige Apps direkt installieren zu können. Stattdessen scheint der Fokus bei AWTRIX NG eher auf eigenen Berry-Skripten, Home-Assistant-Integrationen und Pushed Apps zu liegen.

Das finde ich grundsätzlich sogar spannend, allerdings habe ich bisher nur sehr wenige Beispiele oder fertige Vorlagen gefunden.

Deshalb wollte ich einfach mal in die Runde fragen:

  • Gibt es bereits eine Sammlung mit AWTRIX-NG-Apps?

  • Wo tauscht ihr eure Berry-Skripte aus?

  • Gibt es ein GitHub-Repository oder eine Community-Seite mit Beispielen?

  • Ist später eventuell sogar ein App Store geplant?

Idee

Ich könnte mir gut vorstellen, gemeinsam mit der Community eine Sammlung von Vorlagen aufzubauen.

Zum Beispiel für:

  • :high_voltage: Energie (PV, Batterie, Netzbezug, Einspeisung)

  • :sun_behind_rain_cloud: Wetter

  • :police_car_light: Warnmeldungen (NINA, DWD)

  • :package: Paketverfolgung

  • :date: Kalender

  • :automobile: Wallbox / E-Auto

  • :desktop_computer: Server-Monitoring

  • :house: Home Assistant

  • :chart_increasing: Statistiken

  • und vieles mehr…

Wichtig wäre mir dabei, dass die Vorlagen möglichst allgemein gehalten sind und sich leicht an die eigenen Home-Assistant-Sensoren oder andere Datenquellen anpassen lassen.

Ich selbst arbeite mich gerade intensiv in AWTRIX NG und Berry ein und würde meine Skripte ebenfalls gerne mit der Community teilen, sobald sie etwas ausgereifter sind.

Ich denke, wenn jeder ein oder zwei gute Vorlagen beisteuert, könnte daraus mit der Zeit eine wirklich hilfreiche Sammlung für alle entstehen.

ich habe aber auch gerade gesehen das es eine Vorlagenseite gibt:

2 „Gefällt mir“

Module vs. Skripte in AWTRIX NG

Ich bin beim Einstieg über den Unterschied zwischen Modulen und Skripten gestolpert. Vielleicht hilft diese kurze Erklärung auch anderen.

Skripte sind eigenständige Apps, die auf dem Display angezeigt werden (z. B. Wetter, PV oder Netzbezug).

Module sind keine Apps. Sie dienen dazu, gemeinsam genutzte Daten oder Funktionen bereitzustellen.

Beispiel:

# @module

var m = module("ha_config")

m.url = "http://192.168.x.x:8123"
m.token = "..."

return m

In einer App kann das Modul dann einfach eingebunden werden:

import ha_config

Anschließend stehen die Werte direkt zur Verfügung:

ha_config.url
ha_config.token

So müssen URL und Token nur einmal gepflegt werden und stehen automatisch allen Skripten zur Verfügung.

Wie nutzt ihr Module? Habt ihr weitere sinnvolle Beispiele oder Best Practices?

1 „Gefällt mir“

Beispiel Skrip für Netzbezug sensor wird über eine Shelly 3 pro em in HA zur Verfügung gestellt.

import ha_config

# @name    Netzbezug
# @desc    Zeigt den aktuellen Netzbezug aus Home Assistant
# @author  *Dein Name*
# @version 2.1
# @config  refresh number "Aktualisierung" default=5 min=2 max=60 unit=s
# @config  yellow number "Gelb ab" default=500 min=0 max=10000 unit=W
# @config  orange number "Orange ab" default=1500 min=0 max=20000 unit=W
# @config  red number "Rot ab" default=3000 min=0 max=30000 unit=W

class Netzbezug
  var url
  var opts
  var value
  var label
  var color
  var ticks
  var refresh
  var yellow
  var orange
  var red
  var in_flight

  def init()
    self.url = ha_config.url +
               "/api/states/sensor.power_netzbezug"

    self.opts = {
      "headers": {
        "Authorization": "Bearer " + ha_config.token
      },
      "find": "\"state\":",
      "keep": 64
    }

    self.refresh = store.get("refresh", 5)
    self.yellow = store.get("yellow", 500)
    self.orange = store.get("orange", 1500)
    self.red = store.get("red", 3000)

    self.value = store.get("last_value")
    self.label = self.value == nil ? "--- W" : str(self.value) + " W"
    self.color = 0x00FF00
    self.ticks = 0
    self.in_flight = false

    if self.value != nil
      if self.value >= self.red
        self.color = 0xFF0000
      elif self.value >= self.orange
        self.color = 0xFF6600
      elif self.value >= self.yellow
        self.color = 0xFFFF00
      else
        self.color = 0x00FF00
      end
    end
  end

  def on_body(body, status)
    self.in_flight = false

    if body == nil
      return
    end

    var match = re.search("\"state\":\"?([-0-9.]+)", body)
    if match == nil
      return
    end

    var power = num(match[1])
    if power == nil
      return
    end

    if power < 0
      power = 0
    end

    power = round(power)
    self.value = power
    self.label = str(power) + " W"

    if power >= self.red
      self.color = 0xFF0000
    elif power >= self.orange
      self.color = 0xFF6600
    elif power >= self.yellow
      self.color = 0xFFFF00
    else
      self.color = 0x00FF00
    end

    store.set("last_value", power)
  end

  def loop()
    if self.ticks <= 0
      self.ticks = self.refresh

      if !self.in_flight
        self.in_flight = true

        http.get(
          self.url,
          / body, status -> self.on_body(body, status),
          self.opts
        )
      end
    end

    self.ticks -= 1
  end

  def draw()
    clear()

    if !icon("55396", 0, 0)
      rect_fill(0, 0, 8, 8, 0x222222)
    end

    scroll_text(9, 6, width() - 9, self.label, self.color)
  end

  def on_button(btn)
    if btn == "select"
      self.ticks = 0
    end
  end
end

return Netzbezug()

Features

  • :high_voltage: Liest den aktuellen Netzbezug aus Home Assistant
  • :wrench: Verwendet das gemeinsame ha_config-Modul (URL und Token nur einmal hinterlegen)
  • :artist_palette: Dynamische Farbänderung je nach Leistung
    • :green_circle: unter 500 W
    • :yellow_circle: ab 500 W
    • :orange_circle: ab 1500 W
    • :red_circle: ab 3000 W
  • :framed_picture: Unterstützt animierte LaMetric-Icons (ID 55396)
  • :gear: Alle Grenzwerte und das Aktualisierungsintervall sind über die AWTRIX-GUI konfigurierbar
  • :counterclockwise_arrows_button: Manuelles Aktualisieren über die Select-Taste
  • :scroll: Automatische Laufschrift bei längeren Werten
1 „Gefällt mir“

Beispiel Script für

Netzeinspeisung

import ha_config

# @name    Netzeinspeisung
# @desc    Zeigt die aktuelle Netzeinspeisung aus Home Assistant
# @author  *Dein Name*
# @version 2.2
# @config  refresh number "Aktualisierung" default=5 min=2 max=60 unit=s
# @config  green number "Grün ab" default=200 min=0 max=10000 unit=W
# @config  bright_green number "Hellgrün ab" default=1000 min=0 max=20000 unit=W
# @config  turquoise number "Türkis ab" default=3000 min=0 max=30000 unit=W

class Netzeinspeisung
  var url
  var opts
  var value
  var label
  var color
  var ticks
  var refresh
  var green
  var bright_green
  var turquoise
  var in_flight

  def init()
    self.url = ha_config.url +
               "/api/states/sensor.power_netzeinspeisung"

    self.opts = {
      "headers": {
        "Authorization": "Bearer " + ha_config.token
      },
      "find": "\"state\":\"",
      "keep": 48
    }

    self.refresh = store.get("refresh", 5)
    self.green = store.get("green", 200)
    self.bright_green = store.get("bright_green", 1000)
    self.turquoise = store.get("turquoise", 3000)

    self.value = store.get("last_value")
    self.label = self.value == nil ? "LADEN" : str(self.value) + " W"
    self.color = 0x808080
    self.ticks = 0
    self.in_flight = false

    if self.value != nil
      if self.value >= self.turquoise
        self.color = 0x00FFFF
      elif self.value >= self.bright_green
        self.color = 0x00FF00
      elif self.value >= self.green
        self.color = 0x66FF66
      else
        self.color = 0x808080
      end
    end
  end

  def on_body(body, status)
    self.in_flight = false

    if status == 401
      self.label = "HA 401"
      self.color = 0xFF0000
      log("Netzeinspeisung: Token ungueltig, HTTP 401")
      return
    end

    if status == 404
      self.label = "HA 404"
      self.color = 0xFF0000
      log("Netzeinspeisung: Sensor nicht gefunden, HTTP 404")
      return
    end

    if status != 200
      self.label = "HA " + str(status)
      self.color = 0xFF0000
      log("Netzeinspeisung: HTTP-Fehler " + str(status))
      return
    end

    if body == nil
      self.label = "KEIN WERT"
      self.color = 0xFF6600
      log("Netzeinspeisung: state nicht gefunden oder unavailable")
      return
    end

    var match = re.search("([-0-9.]+)", body)

    if match == nil
      self.label = "UNBEKANNT"
      self.color = 0xFF6600
      log("Netzeinspeisung: Zustand ist keine Zahl")
      return
    end

    var power = num(match[1])

    if power == nil
      self.label = "UNBEKANNT"
      self.color = 0xFF6600
      return
    end

    if power < 0
      power = 0
    end

    power = round(power)

    self.value = power
    self.label = str(power) + " W"

    if power >= self.turquoise
      self.color = 0x00FFFF
    elif power >= self.bright_green
      self.color = 0x00FF00
    elif power >= self.green
      self.color = 0x66FF66
    else
      self.color = 0x808080
    end

    store.set("last_value", power)
  end

  def loop()
    if self.ticks <= 0
      self.ticks = self.refresh

      if !self.in_flight
        self.in_flight = true

        http.get(
          self.url,
          / body, status -> self.on_body(body, status),
          self.opts
        )
      end
    end

    self.ticks -= 1
  end

  def draw()
    clear()

    if !icon("55395", 0, 0)
      rect_fill(0, 0, 8, 8, 0x222222)
    end

    scroll_text(
      9,
      6,
      width() - 9,
      self.label,
      self.color,
      {
        "mode": "wrap",
        "speed": 80,
        "holdMs": 500,
        "repeat": 1
      }
    )
  end

  def on_button(btn)
    if btn == "select"
      self.ticks = 0
    end
  end
end

return Netzeinspeisung()

Features

  • :electric_plug: Liest die aktuelle Netzeinspeisung aus Home Assistant
  • :wrench: Nutzt das gemeinsame ha_config-Modul
  • :framed_picture: Animiertes LaMetric-Icon mit der ID 55395
  • :artist_palette: Dynamische Farben nach Einspeiseleistung:
    • unter 200 W: Grau
    • ab 200 W: Hellgrün
    • ab 1000 W: Grün
    • ab 3000 W: Türkis
  • :gear: Grenzwerte und Aktualisierungsintervall über die AWTRIX-GUI einstellbar
  • :scroll: Laufschrift bei längeren Texten
  • :counterclockwise_arrows_button: Manuelle Aktualisierung über die Select-Taste
  • :floppy_disk: Letzter gültiger Wert wird gespeichert
  • :warning: Fehleranzeige bei Verbindungs-, Token- oder Sensorproblemen
1 „Gefällt mir“

Beispiel für NINA Warnung:

import ha_config

# @name    NINA-Warnung
# @desc    Zeigt aktive NINA-Warnungen für Dernau
# @author  *Dein Name*
# @version 2.1
# @config  refresh number "Aktualisierung" default=60 min=10 max=600 unit=s

class NINAWarnung
  var base
  var opts
  var warning_1
  var warning_2
  var warning_3
  var active_level
  var icon_id
  var label
  var color
  var ticks
  var in_flight

  def init()
    self.base = ha_config.url + "/api/states/"

    self.opts = {
      "headers": {
        "Authorization": "Bearer " + ha_config.token
      },
      "find": "\"state\":\"",
      "keep": 192
    }

    self.warning_1 = false
    self.warning_2 = false
    self.warning_3 = false
    self.active_level = 0
    self.icon_id = "25880"
    self.label = "NINA WARNUNG"
    self.color = 0xFFFF00
    self.ticks = 0
    self.in_flight = false
  end

  def on_warning_1(body, status)
    self.warning_1 = false

    if status == 200 && body != nil
      var m = re.search("\"state\":\"(on|off)\"", body)
      if m != nil
        self.warning_1 = m[1] == "on"
      end
    end

    http.get(
      self.base +
      "binary_sensor.warning_dernau_ahrweiler_rheinland_pfalz_2",
      / b, st -> self.on_warning_2(b, st),
      self.opts
    )
  end

  def on_warning_2(body, status)
    self.warning_2 = false

    if status == 200 && body != nil
      var m = re.search("\"state\":\"(on|off)\"", body)
      if m != nil
        self.warning_2 = m[1] == "on"
      end
    end

    http.get(
      self.base +
      "binary_sensor.warning_dernau_ahrweiler_rheinland_pfalz_3",
      / b, st -> self.on_warning_3(b, st),
      self.opts
    )
  end

  def on_warning_3(body, status)
    self.warning_3 = false

    if status == 200 && body != nil
      var m = re.search("\"state\":\"(on|off)\"", body)
      if m != nil
        self.warning_3 = m[1] == "on"
      end
    end

    var headline_url = nil

    if self.warning_3
      self.active_level = 3
      self.icon_id = "53534"
      self.label = "NINA WARNUNG 3"
      self.color = 0xFF0000
      headline_url = self.base +
        "sensor.dernau_ahrweiler_rheinland_pfalz_uberschrift_3"

    elif self.warning_2
      self.active_level = 2
      self.icon_id = "25879"
      self.label = "NINA WARNUNG 2"
      self.color = 0xFF6600
      headline_url = self.base +
        "sensor.dernau_ahrweiler_rheinland_pfalz_uberschrift_2"

    elif self.warning_1
      self.active_level = 1
      self.icon_id = "25880"
      self.label = "NINA WARNUNG 1"
      self.color = 0xFFFF00
      headline_url = self.base +
        "sensor.dernau_ahrweiler_rheinland_pfalz_uberschrift_1"

    else
      self.active_level = 0
      self.label = "NINA WARNUNG"
      self.in_flight = false
      return
    end

    http.get(
      headline_url,
      / b, st -> self.on_headline(b, st),
      self.opts
    )
  end

  def on_headline(body, status)
    self.in_flight = false

    if status != 200 || body == nil
      return
    end

    var m = re.search("\"state\":\"([^\"]+)\"", body)

    if m == nil
      return
    end

    if m[1] == "unknown" ||
       m[1] == "unavailable" ||
       m[1] == ""
      return
    end

    self.label = "NINA WARNUNG " +
                 str(self.active_level) +
                 ": " +
                 m[1]
  end

  def loop()
    if self.ticks <= 0
      self.ticks = store.get("refresh", 60)

      if !self.in_flight
        self.in_flight = true

        http.get(
          self.base +
          "binary_sensor.warning_dernau_ahrweiler_rheinland_pfalz_1",
          / b, st -> self.on_warning_1(b, st),
          self.opts
        )
      end
    end

    self.ticks -= 1
  end

  def should_show()
    return self.active_level > 0
  end

  def duration()
    return 20000
  end

  def draw()
    clear()

    if !icon(self.icon_id, 0, 0)
      rect_fill(0, 0, 8, 8, self.color)
    end

    scroll_text(
      9,
      6,
      width() - 9,
      self.label,
      self.color
    )
  end
end

return NINAWarnung()
´´´

## Features

* 🚨 Überwacht **3 NINA-Warnstufen** aus Home Assistant
* ⚠️ Zeigt automatisch die **höchste aktive Warnstufe**
* 🖼️ Unterschiedliche **animierte LaMetric-Icons** je Warnstufe
* 🎨 Dynamische Farbänderung entsprechend der Warnstufe
* 📝 Zeigt die **NINA-Warnstufe** sowie die **Warnüberschrift** an
* 📜 Automatische Laufschrift für lange Warntexte
* ⏱️ 20 Sekunden Anzeigedauer
* 🚫 Wird automatisch ausgeblendet, wenn keine Warnung aktiv ist
* 🔄 Automatische Aktualisierung (über die AWTRIX-GUI konfigurierbar)
* 🔧 Nutzt das gemeinsame **`ha_config`-Modul**
1 „Gefällt mir“

Vorlage für das Module ha_config

# @module
# @desc Home Assistant Konfiguration

var m = module("ha_config")

m.url = "IP:Port"
m.token = "Langzeit Token"

return m

Features

  • :globe_with_meridians: Zentrale Home-Assistant-Konfiguration
  • :key: Gemeinsame Verwaltung von URL und Long-Lived Access Token
  • :recycling_symbol: Einmal konfigurieren – in allen Skripten wiederverwenden
  • :package: Einfache Einbindung über import ha_config
  • :wrench: Änderungen nur an einer Stelle erforderlich
  • :rocket: Ideal für mehrere AWTRIX-NG-Apps
  • :memo: Reduziert doppelten Code und erleichtert die Wartung
1 „Gefällt mir“

Hier noch eine Beispiel für Solar Forcast ML :

import ha_config

# @name    Solar-Forecast
# @desc    Zeigt zuerst Forecast Solar und danach den Tageswert
# @author  *Deine Name*
# @version 1.2

class SolarForecast
  var url
  var value
  var color
  var ticks
  var busy
  var shown

  def init()
    self.url = ha_config.url +
      "/api/states/sensor.solar_forecast_ml_hybrid_forecast"

    self.value = store.get("last_value")
    self.color = 0x808080
    self.ticks = 0
    self.busy = false
    self.shown = 0

    if self.value != nil
      if self.value >= 2.5
        self.color = 0x00FF00
      elif self.value >= 1
        self.color = 0xFFFF00
      else
        self.color = 0xFF0000
      end
    end
  end

  def on_body(body, status)
    self.busy = false

    if status != 200 || body == nil
      return
    end

    var m = re.search("([-0-9.]+)", body)
    if m == nil
      return
    end

    var v = num(m[1])
    if v == nil
      return
    end

    if v < 0
      v = 0
    end

    self.value = v

    if v >= 2.5
      self.color = 0x00FF00
    elif v >= 1
      self.color = 0xFFFF00
    else
      self.color = 0xFF0000
    end

    store.set("last_value", v)
  end

  def loop()
    if self.ticks <= 0
      self.ticks = 300

      if !self.busy
        self.busy = true

        http.get(
          self.url,
          / b, st -> self.on_body(b, st),
          {
            "headers": {
              "Authorization": "Bearer " + ha_config.token
            },
            "find": "\"state\":\"",
            "keep": 32
          }
        )
      end
    end

    self.ticks -= 1
  end

  def on_show()
    self.shown = now_ms()
  end

  def duration()
    return 10000
  end

  def draw()
    clear()

    if !icon("27464", 0, 0)
      rect_fill(0, 0, 8, 8, 0x202020)
    end

    if now_ms() - self.shown < 5000
      scroll_text(
        9,
        6,
        width() - 9,
        "FORECAST SOLAR",
        0xFFFF00
      )
    elif self.value == nil
      scroll_text(
        9,
        6,
        width() - 9,
        "--- kWh",
        0x808080
      )
    else
      scroll_text(
        9,
        6,
        width() - 9,
        str(round(self.value, 1)) + " kWh",
        self.color
      )
    end
  end
end

return SolarForecast()

Features

  • :sun: Liest den Solar Forecast direkt aus Home Assistant
  • :wrench: Nutzt das gemeinsame ha_config-Modul
  • :framed_picture: Animiertes LaMetric-Icon (ID 27464)
  • :artist_palette: Dynamische Farbänderung je nach prognostiziertem Ertrag
  • :scroll: Zeigt zuerst „FORECAST SOLAR“, anschließend den Tagesertrag in kWh
  • :gear: Aktualisierungsintervall und Farbgrenzen über die AWTRIX-GUI konfigurierbar
  • :scroll: Automatische Laufschrift bei längeren Texten
  • :counterclockwise_arrows_button: Manuelle Aktualisierung über die Select-Taste
  • :floppy_disk: Speichert den letzten gültigen Wert
  • :warning: Fehleranzeige bei Verbindungs-, Token- oder Sensorproblemen
1 „Gefällt mir“

PV Leistung

import ha_config

# @name    PV-Leistung
# @desc    Zeigt PV-Leistung mit Auslastungsbalken
# @author  *Dein Name*
# @version 1.4
# @config  refresh number "Aktualisierung" default=5 min=2 max=60 unit=s
# @config  red number "Rot ab" default=10 min=0 max=500 unit=W
# @config  yellow number "Gelb ab" default=100 min=0 max=2000 unit=W
# @config  green number "Grün ab" default=900 min=0 max=2000 unit=W

class PVLeistung
  var url, opts, label, color, power, ticks, busy
  var refresh, red, yellow, green

  def init()
    self.url = ha_config.url +
      "/api/states/sensor.pv_einspeisung_power"

    self.opts = {
      "headers": {
        "Authorization": "Bearer " + ha_config.token
      },
      "find": "\"state\":\"",
      "keep": 48
    }

    self.refresh = store.get("refresh", 5)
    self.red = store.get("red", 10)
    self.yellow = store.get("yellow", 100)
    self.green = store.get("green", 900)

    self.power = store.get("last_value", 0)
    self.label = str(self.power) + " W"
    self.color = 0x808080
    self.ticks = 0
    self.busy = false

    self.set_color()
  end

  def set_color()
    if self.power >= self.green
      self.color = 0x00FF00
    elif self.power >= self.yellow
      self.color = 0xFFFF00
    elif self.power >= self.red
      self.color = 0xFF0000
    else
      self.color = 0x808080
    end
  end

  def on_body(body, status)
    self.busy = false

    if status != 200 || body == nil
      self.label = status == 0 ? "HA 0" : "HA " + str(status)
      self.color = 0xFF0000
      return
    end

    var m = re.search("([-0-9.]+)", body)
    if m == nil return end

    var v = num(m[1])
    if v == nil return end
    if v < 0 v = 0 end

    self.power = round(v)
    self.label = str(self.power) + " W"
    self.set_color()

    store.set("last_value", self.power)
  end

  def loop()
    if self.ticks <= 0
      self.ticks = self.refresh

      if !self.busy
        self.busy = true
        http.get(
          self.url,
          / b, st -> self.on_body(b, st),
          self.opts
        )
      end
    end

    self.ticks -= 1
  end

  def draw()
    clear()

    if !icon("27464", 0, 0)
      rect_fill(0, 0, 8, 7, 0x202020)
    end

    scroll_text(
      9,
      6,
      width() - 10,
      self.label,
      self.color
    )

    var bar_x = 9
    var bar_w = width() - 10
    var pct = clamp(self.power * 100 / 2000, 0, 100)
    var fill_w = int(bar_w * pct / 100)

    rect_fill(bar_x, 7, bar_w, 1, 0x404040)

    if fill_w > 0
      rect_fill(bar_x, 7, fill_w, 1, self.color)
    end
  end

  def on_button(btn)
    if btn == "select"
      self.ticks = 0
    end
  end
end

return PVLeistung()

Features

  • :sun: Zeigt die aktuelle PV-Leistung aus Home Assistant
  • :framed_picture: Animiertes LaMetric-Icon 27464
  • :bar_chart: Auslastungsbalken von 0 bis 2000 W
  • :artist_palette: Farbiger Balken mit grauem Rest
  • :straight_ruler: Balken mit Abstand zum Icon und rechten Rand
  • :rainbow: Dynamische Farben je nach Leistung
  • :floppy_disk: Speichert den letzten gültigen Wert
  • :counterclockwise_arrows_button: Manuelle Aktualisierung über die Select-Taste
  • :puzzle_piece: Nutzt das gemeinsame ha_config-Modul
  • :feather: Kompakt und speicherschonend geschrieben
1 „Gefällt mir“

Guten Morgen, ich habe erfolgreich NG installiert. Eine Frage an die Experten kann man kein Szenen in HA machen und dann an das Display senden? Mit awtrix 3 hatte ich es so.

(Beitrag vom Verfasser gelöscht)

Hi hätte eine Frage ich nutze aktuell meine ulanzi Uhr über solaranzeige Image am pi.

Nun habe ich HA bei mir installiert und mein Wechsel richter eingebunden wäre es möglich alle wichtigen Sachen über die neue NG laufen zu lassen? Würde mir dann denn pi sparen kenne mich aber aktuell nicht so aus.

nach der Umstellung auf NG gehen meine Automationen zur Anzeige nicht mehr. Das Gerät ist korrekt eingebunden (alte IP, altes Präfix, …) wie muss ich das anpassen

Hatte das z.B. so bisher:

alias: Awtrix - Wetter
description: “”
triggers:

trigger: state
entity_id:

weather.lindenberg

trigger: homeassistant
event: start
conditions: 

actions:

action: mqtt.publish
metadata: {}
data:
payload: |-
{
“text”: “{{ states(‘sensor.gw2000a_outdoor_temperature’) }} {{ state_attr(‘sensor.gw2000a_outdoor_temperature’, ‘unit_of_measurement’) }}”,
“icon”: “2422”,
“duration”: 10
}
topic: awtrix/custom/wetter
mode: single

Das sind zwei völlig unterschiedliche firmwaren, das ist kein klassisches Update.
Ich fürchte das sich da nicht “mal eben” anpassen lässt..

Hallo Zusammen,
ich habe heute meine Ulanzi TC001 auf Awtrix NG geflasht. Hat super einfach geklappt.

An dieser Stelle ein großes Dankeschön an den Entwickler Blueforcer.

Mein Ziel ist es z.B. Temperatur Sensoren aus Home Assistant (Temperatur Pool Wasser) anzeigen zu lassen.

Nach einigem probieren (auch mit Hilfe von KI) habe ich folgenden sehr einfachen Weg gefunden dies zu realisieren. Ich habe in der Uhr meine MQTT Parameter eingegeben und das Topic-Präfix awtrix genannt.

Dann eine Automation erstellt mit folgender Yaml:

alias: "Awtrix NG: Pooltemperatur"
description: Sendet die Pooltemperatur mit dem korrekten Text-Icon-Format an AWTRIX NG
triggers:
  - minutes: /1
    trigger: time_pattern
  - entity_id: sensor.esp32_pool_wassertemperatur
    trigger: state
conditions: []
actions:
  - action: mqtt.publish
    data:
      topic: awtrix/cmd/apps/pushed/pool
      payload: |-
        {
          "text": "{{ states('sensor.esp32_pool_wassertemperatur') | float | round(1) }} °C",
          "icon": "2056"
        }
mode: restart

Meinen Sensor Namen (sensor.esp32_pool_wassertemperatur) müsst ihr anpassen. Das Icon muss auf der Uhr geladen sein (kann man bei LaMetric herunter laden oder selbst erstellen).

Danach Uhr am besten neu starten. Nun erscheint bei Apps eine neue App (in meinem Fall pool). Für weitere Sensoren einfach weitere Automationen anlegen.

Ich hoffe, dass dies ein wenig hilft.

Grüße an Alle

Andreas

Ich habe derzeit awtrix 3 auf der Uhr. Nach dem erfolgreichen flashen mit awtrix ng inkl löschen des Speicher startet die Uhr jedoch nicht mehr sondern piepst nur noch.

Awtrix 3 lässt sich ohne Probleme erneut flashen.

Hat wer eine Idee was ich hier falsch mache?

Hey das Problem hatte ich nach dem flashen auch. Dann einfach über die beiden Taste (links + rechts) gedrückt halten um die Uhr neu zu starten. Dann läuft die Uhr. Ich glaube das nach dem flashen die Uhr nicht automatisch neustartet.

Gruß

Hi,
habe das Ulanzi Display eingerichtet und kann es von Homeassistant aus steuern.
Habe das Modul wie vorgegeben mit passender IP und langlebigem Zugriffstoken von HA versehen und das Script übernommen und dort meinen Sensor hinterlegt. Das Script wird angezeigt aber ohne Wert.
Neustart AWTRIX habe ich auch schon gemacht.

Wie kann ich den Zugriff von AWTRIX zu HA testen?

Hab das Problem gefunden:

Im Modul reicht die IP nicht

m.url = “192.168.178.100:8123”

Man benötigt:

m.url = “http://192.168.178.100:8123

@ados75 ich habe mir erlaubt dein Script als Vorlage zu nehmen

Auto-Akku Prozent-Angabe

  • Icon 5721
  • rot zw. 0-30%
  • gelb zw. 30-50%
  • grün zw. 50%-100%
  • Balken unter Schrift passend gefüllt
import ha_config

# @name    Auto-Akku
# @desc    Zeigt den Ladezustand deines Autos
# @author  *Dein Name*
# @version 1.4
# @config  refresh number "Aktualisierung" default=5 unit=s
# @config  red number default=30 unit=%
# @config  yellow number default=50 unit=%
# @config  green number default=70 unit=%

class AutoAkku
  var url, opts, label, color, percentage, ticks, busy
  var refresh, red, yellow, green, myicon
  
  def init()
    self.url = ha_config.url +
      "/api/states/sensor.auto_ladezustand"

    self.opts = {
      "headers": {
        "Authorization": "Bearer " + ha_config.token
      },
      "find": "\"state\":\"",
      "keep": 48
    }

    self.myicon = "5721"
    self.refresh = store.get("refresh", 5)
    self.red = store.get("red", 30)
    self.yellow = store.get("yellow", 50)
    self.green = store.get("green", 70)

    self.percentage = store.get("last_value", 0)
    self.label = str(self.percentage) + " %"
    self.color = 0x808080
    self.ticks = 0
    self.busy = false

    self.set_color()
  end

  def set_color()
    if self.percentage >= self.green
      self.color = 0x00FF00
    elif self.percentage >= self.yellow
      self.color = 0xFFFF00
    else
      #red
      self.color = 0xFF0000
    end
  end

  def on_body(body, status)
    self.busy = false

    if status != 200 || body == nil
      self.label = status == 0 ? "HA 0" : "HA " + str(status)
      self.color = 0xFF0000
      return
    end

    var m = re.search("([-0-9.]+)", body)
    if m == nil return end

    var v = num(m[1])
    if v == nil return end
    if v < 0 v = 0 end

    self.percentage = round(v)
    self.label = str(self.percentage) + " %"
    self.set_color()

    store.set("last_value", self.percentage)
  end

  def loop()
    if self.ticks <= 0
      self.ticks = self.refresh

      if !self.busy
        self.busy = true
        http.get(
          self.url,
          / b, st -> self.on_body(b, st),
          self.opts
        )
      end
    end

    self.ticks -= 1
  end

  def draw()
    clear()

    if !icon(self.myicon, 0, 0)
      rect_fill(0, 0, 8, 7, 0x202020)
    end

    scroll_text(
      9,
      6,
      width() - 10,
      self.label,
      self.color
    )

    var bar_x = 9
    var bar_w = width() - 10

    var pct = clamp(self.percentage, 0, 100)
    var fill_w = int(bar_w * pct / 100)

    rect_fill(bar_x, 7, bar_w, 1, 0x404040)

    if fill_w > 0
      rect_fill(bar_x, 7, fill_w, 1, self.color)
    end    
  end

  def on_button(btn)
    if btn == "select"
      self.ticks = 0
    end
  end
end

return AutoAkku()

Grundsätzlich viel besser, aber wenn ich jetzt mehrere scripte hab drauf passiert es, dass der speicher Out of Memory ist
da wäre es besser es kommt alles von homeassistant und nicht umgekehrt
das ist mühsam, weil ich somit nicht mehr alles habe so wie früher unter der version 0.98 bzw Awtrix 3