Falls es jemanden interessiert ist hier ein Taschengeld Script:
Javascript:
// Taschengeld-Verwaltung mit wöchentlicher Gutschrift + VIS-Steuerung
// Stand: November 2025
// Anpassungen: 24h-Zeit ohne Sekunden + HTML-Log-Tabelle + nur 20 letzte Einträge
const kinder = {
Alrik: {
konto: '0_userdata.0.Taschengeld.Alrik.Konto',
einzahlung: '0_userdata.0.Taschengeld.Alrik.Einzahlung',
auszahlen: '0_userdata.0.Taschengeld.Alrik.Auszahlung',
btn_einzahlen: '0_userdata.0.Taschengeld.Alrik.Einzahlen',
btn_auszahlen: '0_userdata.0.Taschengeld.Alrik.Auszahlen',
woechentlich: '0_userdata.0.Taschengeld.Alrik.Woechentlich',
log: '0_userdata.0.Taschengeld.Alrik.Log'
},
Theda: {
konto: '0_userdata.0.Taschengeld.Theda.Konto',
einzahlung: '0_userdata.0.Taschengeld.Theda.Einzahlung',
auszahlen: '0_userdata.0.Taschengeld.Theda.Auszahlung',
btn_einzahlen: '0_userdata.0.Taschengeld.Theda.Einzahlen',
btn_auszahlen: '0_userdata.0.Taschengeld.Theda.Auszahlen',
woechentlich: '0_userdata.0.Taschengeld.Theda.Woechentlich',
log: '0_userdata.0.Taschengeld.Theda.Log'
}
};
// 🧾 Logik: Eintrag im Log speichern (HTML-Tabelle, 24h-Zeit, max. 20 Einträge)
function logEintrag(kind, betrag, art) {
const datum = new Date().toLocaleString('de-DE', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
hour12: false
});
const logPfad = kinder[kind].log;
let aktuellesLog = getState(logPfad).val || '';
// Wenn noch keine Tabelle existiert → Grundstruktur erzeugen
if (!aktuellesLog.includes('<table')) {
aktuellesLog = `
<table style="width:100%; border-collapse:collapse; font-family:Arial; font-size:12px;" border="1">
<thead style="background:#ddd;">
<tr>
<th style="padding:4px;">Datum</th>
<th style="padding:4px;">Art</th>
<th style="padding:4px;">Betrag</th>
</tr>
</thead>
<tbody></tbody>
</table>`;
}
// Neue Tabellenzeile (neueste Einträge oben)
const neueZeile = `
<tr>
<td style="padding:4px;">${datum}</td>
<td style="padding:4px;">${art}</td>
<td style="padding:4px; text-align:right;">${betrag.toFixed(2)} €</td>
</tr>`;
// Neue Zeile am Anfang des Tabellenkörpers einfügen
aktuellesLog = aktuellesLog.replace(/(<tbody>)/, `$1${neueZeile}`);
// Nur die letzten 20 Einträge behalten
const tbodyInhalt = aktuellesLog.match(/<tbody>([\s\S]*?)<\/tbody>/);
if (tbodyInhalt) {
const alleZeilen = tbodyInhalt[1].match(/<tr>[\s\S]*?<\/tr>/g) || [];
const begrenzteZeilen = alleZeilen.slice(0, 20); // Nur die ersten 20 behalten (neueste zuerst)
const neuerTbody = "<tbody>" + begrenzteZeilen.join("") + "</tbody>";
aktuellesLog = aktuellesLog.replace(/<tbody>[\s\S]*?<\/tbody>/, neuerTbody);
}
setState(logPfad, aktuellesLog);
}
// 🕗 Wöchentliche Auszahlung (Sonntag 08:00 Uhr)
schedule("0 8 * * 0", () => {
for (const kind in kinder) {
const kontoPfad = kinder[kind].konto;
const betragPfad = kinder[kind].woechentlich;
const betrag = parseFloat(getState(betragPfad).val) || 0;
const standAlt = parseFloat(getState(kontoPfad).val) || 0;
const standNeu = standAlt + betrag;
setState(kontoPfad, standNeu);
logEintrag(kind, betrag, "Wöchentliche Gutschrift");
}
});
// 💰 Einzahlung per Button
for (const kind in kinder) {
on({ id: kinder[kind].btn_einzahlen, change: 'ne' }, () => {
const betrag = parseFloat(getState(kinder[kind].einzahlung).val);
if (isNaN(betrag) || betrag <= 0) return;
const konto = kinder[kind].konto;
const stand = parseFloat(getState(konto).val) || 0;
setState(konto, stand + betrag);
logEintrag(kind, betrag, "Manuelle Einzahlung");
// Reset
setState(kinder[kind].einzahlung, 0);
setState(kinder[kind].btn_einzahlen, false);
});
}
// 💸 Auszahlung per Button
for (const kind in kinder) {
on({ id: kinder[kind].btn_auszahlen, change: 'ne' }, (obj) => {
const btnStatus = obj.state.val;
if (btnStatus !== true) return; // Nur reagieren, wenn Button gedrückt (true)
const betrag = parseFloat(getState(kinder[kind].auszahlen).val);
const konto = kinder[kind].konto;
const stand = parseFloat(getState(konto).val) || 0;
if (isNaN(betrag) || betrag <= 0 || betrag > stand) {
console.warn(`[Taschengeld] Ungültiger Auszahlungsbetrag für ${kind}: ${betrag}`);
setState(kinder[kind].btn_auszahlen, false);
return;
}
setState(konto, stand - betrag);
logEintrag(kind, betrag, "Auszahlung");
// Reset
setState(kinder[kind].auszahlen, 0);
setState(kinder[kind].btn_auszahlen, false);
});
}
Objekte unter 0_userdata 0 anlegen:
2025-11-02 21_17_02-Clipboard.png
Hier eine vis-2:
2025-11-02 21_20_28-Clipboard.png