Hallo
in meinem Pufferspeicher sind 3 Heizstäbe A, B und C mit je 3000W verbaut. Geschaltet werden diese per HomeMatic Schaltaktoren.
Ich habe im Home Assistant über Node Red ein gut funktionierendes Programm erstellt, welches sinngemäß folgendes realisiert:
Liefert die PV-Anlage > 3000 W → dann schalte Heizstab A ein, liefert die PV-Anlage danach weiterhin > 3000 W → dann schalte zusätzlich noch Heizstab B ein, liefert die PV-Anlage weiterhin > 3000 W (z.B. mittags) → dann schalte zusätzlich auch Heizstab C ein. Analog werden die 3 Heizstäbe bei nachlassender PV-Leistung wieder schrittweise ausgeschaltet.
Mein Programm funktioniert recht gut, hat aber zur Folge, dass auf Dauer Heizstab A die meisten Betriebsstunden (somit auch den höchsten Verschleiß) und Heizstab C die wenigsten Betriebsstunden hat.
Ich suche nach einer Möglichkeit, den Heizstab mit den wenigsten Betriebsstunden (z.B. Heizstab C) zuerst an zuschalten und den Heizstab mit den meisten Betriebsstunden zuletzt, damit sich die Betriebsstunden angleichen.
Hat jemand eine Idee, wie man das realisieren könnte? Vielleicht indem man die Schalter-Entitäten über Variablen anspricht? Geht das überhaupt?
Also, ich erkläre mal kurz in groben Zügen, wie mein Konzept funktioniert. Vielleicht kann man das ja auch irgendwie noch effektiver und einfachen machen, aber so wie hier daregstellt, läuft es bei mir seit Mai:
in der configuration.yaml werden für jeden Heizstab 1-3 die Betriebsstunden der letzten 30 Tage erfasst:
# Betriebsstunden Heizstab
- platform: history_stats
name: Betriebsstunden Heizstab 1
entity_id: switch.sa_13_ip_keller_9714_sa_13_ip_keller_heizstab_kn_1
state: "on"
type: time
start: "{{ now().replace(hour=0, minute=0, second=0) - timedelta(days=30) }}" # setzt Startzeit auf heute - 30 Tage
end: "{{ now() }}"
in den current_state-Knoten werden diese Betriebszeiten in NodeRed ausgelesen
in change_nodes wird diese Payload in msg.bzhs1-3 gesetzt:
der join-Node erstellt aus den 3 Payload ein Array
der 1. Function-Node erstellt ein Array mit 3 Spalten und sortiert dieses:
// Lese die Betriebszeiten der Heizstäbe aus den current state nodes
var heizstab1Betriebszeit = parseFloat(msg.payload[0]);
var heizstab2Betriebszeit = parseFloat(msg.payload[1]);
var heizstab3Betriebszeit = parseFloat(msg.payload[2]);
// Erstelle ein Array mit den Heizstäben und ihren Betriebszeiten
var myArray = [
{ name: 'HS 1', entityId: 'switch.sa_13_ip_keller_9714_sa_13_ip_keller_heizstab_kn_1', duration: heizstab1Betriebszeit },
{ name: 'HS 2', entityId: 'switch.sa_13_ip_keller_9714_sa_13_ip_keller_heizstab_kn_2', duration: heizstab2Betriebszeit },
{ name: 'HS 3', entityId: 'switch.sa_13_ip_keller_9714_sa_13_ip_keller_heizstab_kn_3', duration: heizstab3Betriebszeit },
];
// Sortiere die Heizstäbe nach Betriebszeit
myArray.sort((a, b) => a.duration - b.duration);
// Gib das Array aus
msg.payload = myArray;
return msg;
Nachtrag:
der 2. Function-Node liest das sortierte Aryy des vorherigen ein und fügt dem Heizstab mit der kleinsten Betriebszeit die zusätzliche Eigenschaft “Heizstab_A”, dem Heizstab mit der mittleren Betriebszeit die zusätzliche Eigenschaft “Heizstab_B” und dem Heizstab mit der größten Betriebszeit die zusätzliche Eigenschaft “Heizstab_C” zu:
// Lese das Array aus dem vorherigen Schritt ein
var myArray = msg.payload;
// Füge dem Heizstab mit der kleinsten Betriebszeit die zusätzliche Eigenschaft "Heizstab_A" hinzu
myArray[0].label = "Heizstab_A";
// Füge dem Heizstab mit der mittleren Betriebszeit die zusätzliche Eigenschaft "Heizstab_B" hinzu
myArray[1].label = "Heizstab_B";
// Füge dem Heizstab mit der größten Betriebszeit die zusätzliche Eigenschaft "Heizstab_C" hinzu
myArray[2].label = "Heizstab_C";
// Gib das modifizierte Array aus
msg.payload = myArray;
return msg;
der Split-Node zerteilt das Array in einzelne Nachrichten:
der Switch-Node wählt jeweils Heizstab A,B oder C aus und ordnet sie einzelnen Kanälen zu:
die 3 Change-Nodes geben dann die jeweilige Entität weiter, welche sich hinter Heizstab_A, _B od. _C verbirgt:
der letzte Function-Node schreibt dann diese Entität in die globale Variable “HS_A”, so dass diese erzeugte Variable “HS_A” (analog mit B und C) in anderen Flows verwendet werden kann, um die entsprechenden Heizstäbe an- oder auszuschalten: