• hiking_silhouette.jpg
  • dashcam.jpg
  • compass-1130x200.elsinga.net.jpg
  • route.jpg
  • robert_scouting.jpg
  • homey.jpg

Omdat de Ulanzi TC002 een hogere resolutie heeft dan de TC001 kunnen we nu informatie op 2 regels laten zien.

energieprijzen

Omdat de TC002 met Awtrix NG firmware versie 1.2.2 bij standaard aanroepen de berichten schaalt naar 16 pixels hoog gebruiken we een Berry script om lokaal de tekstregels te genereren.

Homey flow energieprijzen

In deze flow wordt een Homeyscript uitgevoerd dat de payload voor het Berry script op de TC002 oplevert:

// Awtrix Energie Prijs (Data Generator voor 2 regels)

const logicVars = await Homey.logic.getVariables();
let todayStr = "";

// Haal de prijzen van vandaag op
for (let id in logicVars) {
let name = logicVars[id].name.toLowerCase();
if (name === "grafiek_pbth_vandaag") todayStr = logicVars[id].value;
}

if (!todayStr || todayStr === "") return JSON.stringify({"prijsData": null});

// Vertaal de string naar een array met getallen
function parsePrices(str) {
return str.replace(/[\[\]\s]/g, '').split(',').map(p => parseFloat(p)).filter(p => !isNaN(p));
}

let todayPrices = parsePrices(todayStr);
if (todayPrices.length === 0) return JSON.stringify({"prijsData": null});

// Bepaal het huidige kwartier
const nowUtc = new Date();
const now = new Date(nowUtc.toLocaleString("en-US", {timeZone: "Europe/Amsterdam"}));
const currentQuarterHourIndex = (now.getHours() * 4) + Math.floor(now.getMinutes() / 15);

// Bepaal de huidige, laagste en hoogste prijs
let currentPrice = todayPrices[currentQuarterHourIndex] || todayPrices[todayPrices.length - 1];
let minPrice = Math.min(...todayPrices);
let maxPrice = Math.max(...todayPrices);

// --- KLEUREN EN ICONEN BEREKENEN ---

// 1. Absolute kleuren voor Min en Max
function getAbsColor(price) {
if (price > 0.45) return 0xFF0000; // Rood
if (price > 0.35) return 0xFFAA00; // Oranje
if (price >= 0.25) return 0xFFFF00; // Geel
if (price >= 0.132) return 0x00FF00; // Groen
if (price < 0) return 0x9900FF; // Paars
return 0x00FF00;
}

// 2. Relatieve kleur en icoon voor de Huidige prijs (Kwartielen)
let spread = maxPrice - minPrice;
let q1 = minPrice + (spread * 0.25); // Laagste kwart
let q3 = minPrice + (spread * 0.75); // Hoogste kwart

let curColor = 0xFFFF00; // Geel
let curIcon = "51628"; // Geel Icoon

if (currentPrice <= q1) {
curColor = 0x00FF00; // Groen
curIcon = "51627"; // Groen Icoon
} else if (currentPrice >= q3) {
curColor = 0xFF0000; // Rood
curIcon = "51629"; // Rood Icoon
}

// --- PAYLOAD BOUWEN ---
const payload = {
"prijsData": {
"cur": currentPrice.toFixed(3),
"cur_c": curColor,
"cur_ic": curIcon,
"min": minPrice.toFixed(3),
"min_c": getAbsColor(minPrice),
"max": maxPrice.toFixed(3),
"max_c": getAbsColor(maxPrice)
}
};

// Return de data direct als string voor de Awtrix Flow kaart
return JSON.stringify(payload);

Het bijbehorende Berry script heet "energieprijs":

# Hulpfunctie om 1-op-1 het Awtrix bliksemicoon te tekenen op basis van het raster
def drawBolt(bx, by, col)
# Bepaal de schaduwkleur (oranje/donker voor de onderste/rechter rand)
var sh = 0x555555
if col == 0x00FF00 sh = 0x007700 end # Groen -> Donkergroen
if col == 0xFFFF00 sh = 0xFF6600 end # Geel -> Oranje
if col == 0xFF0000 sh = 0x880000 end # Rood -> Donkerrood
if col == 0xFFAA00 sh = 0x883300 end # Oranje -> Donkeroranje
if col == 0x9900FF sh = 0x550088 end # Paars -> Donkerpaars

# Row 0 (x: 4, 5, 6)
pixel(bx + 4, by + 0, col)
pixel(bx + 5, by + 0, col)
pixel(bx + 6, by + 0, col)

# Row 1 (x: 3, 4, 5)
pixel(bx + 3, by + 1, col)
pixel(bx + 4, by + 1, col)
pixel(bx + 5, by + 1, col)

# Row 2 (x: 2, 3, 4)
pixel(bx + 2, by + 2, col)
pixel(bx + 3, by + 2, col)
pixel(bx + 4, by + 2, col)

# Row 3 (x: 1, 2, 3)
pixel(bx + 1, by + 3, col)
pixel(bx + 2, by + 3, col)
pixel(bx + 3, by + 3, col)

# Row 4 (x: 3, 4 + 5 schaduw)
pixel(bx + 3, by + 4, col)
pixel(bx + 4, by + 4, col)
pixel(bx + 5, by + 4, sh)

# Row 5 (x: 3 + 4 schaduw)
pixel(bx + 3, by + 5, col)
pixel(bx + 4, by + 5, sh)

# Row 6 (x: 2 + 3 schaduw)
pixel(bx + 2, by + 6, col)
pixel(bx + 3, by + 6, sh)

# Row 7 (x: 2 schaduw)
pixel(bx + 2, by + 7, sh)
end

class EnergiePrijs
def draw()
var data = store.get("prijsData")

if data == nil return end
if type(data) != "map" && type(data) != "instance" return end

var cur = str(data["cur"])
var cur_c = int(data["cur_c"])

var min = str(data["min"])
var min_c = int(data["min_c"])
var max = str(data["max"])
var max_c = int(data["max_c"])

# --- BOVENSTE REGEL ---
var cur_w = (size(cur) * 4) - 2
var top_w = 9 + cur_w

var top_x = (52 - top_w) / 2
if top_x < 0 top_x = 0 end

drawBolt(top_x, 0, cur_c)
text(top_x + 9, 7, cur, cur_c)

# --- ONDERSTE REGEL ---
var min_w = (size(min) * 4) - 2
var max_w = (size(max) * 4) - 2

var bot_w = 3 + min_w + 4 + max_w + 3
var bot_x = (52 - bot_w) / 2
if bot_x < 0 bot_x = 0 end

text(bot_x, 15, "(", 0xFFFFFF)
text(bot_x + 3, 15, min, min_c)
text(bot_x + 3 + min_w, 15, "-", 0xFFFFFF)
text(bot_x + 3 + min_w + 4, 15, max, max_c)
text(bot_x + 3 + min_w + 4 + max_w, 15, ")", 0xFFFFFF)
end
end
return EnergiePrijs()