Betriebszeiten Heizstäbe angleichen / Node Red: Entitäten mit Variablen aufrufen

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?

Vielen Dank und viele Grüße send SK

Mir fällt grad nichts ein das zu wechseln aber ich würde das glaube ich so schalten:

  • 3000W: A
  • 6000W: B und C, A wird abgeschaltet

LG
totow

Hallo zusammen.

Ich bin der neue und hab so meine start schwirigkeiten mit Node Red☺️

Könntest du deinen Flow mal einstellen.
Würd mich interresieren wie du es schaltest.

Zu deinen Problem. Du könntest ja beim abschalten anders Schalten das Heizstab 1 als erstes abgeschaltet wird zb. :thinking:

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:

  1. 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() }}"
  1. in den current_state-Knoten werden diese Betriebszeiten in NodeRed ausgelesen
  2. in change_nodes wird diese Payload in msg.bzhs1-3 gesetzt:
    grafik
  3. der join-Node erstellt aus den 3 Payload ein Array
  4. 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:

  1. 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;
  1. der Split-Node zerteilt das Array in einzelne Nachrichten:
    grafik

  2. der Switch-Node wählt jeweils Heizstab A,B oder C aus und ordnet sie einzelnen Kanälen zu:
    grafik

  3. die 3 Change-Nodes geben dann die jeweilige Entität weiter, welche sich hinter Heizstab_A, _B od. _C verbirgt:
    grafik

  4. 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:

var HS_A = global.get('HS_A') || 0;
HS_A = msg.payload
global.set('HS_A', HS_A);
msg.payload = HS_A;
return msg;

Ich hoffe, das war einigermaßen verständlich. Ich bin auch HomeAssitant- und NodeRed-Anfänger.

Viele Grüße sendet SK

:crayon:by HarryP:
Codezeilen in Code-TAG’s eingebaut und Doppelpost zusammengefasst.
Bitte schau mal in Deine PN’s!