Um die Abnutzung bzw. Verwendung der 3 Heizstäbe einer Einbauheizung möglichst auszugleichen, habe ich mir ein kleines Skript erstellt, welches das Zu- bzw. Wegschalten von Stufen/Phasen anhand des jeweiligen (Strom-)Verbrauchs regelt.
Beim Zuschalten sollte die jeweilige(n) Phase(n) mit dem niedrigsten Verbrauch zuerst zugeschaltet werden, und umgekehrt.
Das Skript scheint soweit sogar zu funktionieren. ![]()
Was denkt Ihr dazu? Irgendwelche Ideen oder Vorschläge?
<?php
/**
* Stufenschaltung für 3-Phasen Heizeinheit mit Rotation nach Verbrauch
*
* Stufe 0 = Aus (0 Phasen)
* Stufe 1 = Niedrig (1 Phase)
* Stufe 2 = Mittel (2 Phasen)
* Stufe 3 = Hoch (3 Phasen)
*/
// ===== KONFIGURATION: Object-IDs anpassen! =====
// Logging aktivieren/deaktivieren
$logging = false; // true = Logging aktiv, false = kein Logging
// Schalter für die drei Phasen (Boolean)
$idSchalterL1 = 37173;
$idSchalterL2 = 27213;
$idSchalterL3 = 35071;
// Verbrauchszähler für die drei Phasen (Float, Einheit irrelevant)
$idVerbrauchL1 = 13871;
$idVerbrauchL2 = 31998;
$idVerbrauchL3 = 49869;
// ===== HAUPTLOGIK =====
// Gewünschte Stufe aus Aktionsskript-Ereignis auslesen
$stufe = $_IPS['VALUE'];
// Wert in Variable übernehmen
SetValue($_IPS['VARIABLE'], $stufe);
// Validierung
if ($stufe < 0 || $stufe > 3) {
echo "Fehler: Stufe muss zwischen 0 und 3 liegen!\n";
exit;
}
// Aktuellen Schaltzustand auslesen
$aktuellerZustand = [
'L1' => GetValue($idSchalterL1),
'L2' => GetValue($idSchalterL2),
'L3' => GetValue($idSchalterL3)
];
// Aktuell eingeschaltete Phasen ermitteln
$phasenEin = [];
foreach ($aktuellerZustand as $phase => $zustand) {
if ($zustand) {
$phasenEin[] = $phase;
}
}
$aktuelleAnzahl = count($phasenEin);
// Debug-Logging (erscheint im System-Log, nicht als Fehlermeldung)
if ($logging) {
IPS_LogMessage("Stufenschaltung", "Gewünschte Stufe: $stufe (= $stufe Phasen)");
IPS_LogMessage("Stufenschaltung", "Aktuell eingeschaltet: " . ($aktuelleAnzahl > 0 ? implode(', ', $phasenEin) : "keine") . " ($aktuelleAnzahl Phasen)");
}
// Wenn bereits die richtige Anzahl Phasen eingeschaltet ist, nichts tun
if ($aktuelleAnzahl == $stufe) {
if ($logging) IPS_LogMessage("Stufenschaltung", "Bereits korrekt geschaltet - keine Änderung notwendig");
exit;
}
// Verbrauchswerte auslesen
$verbrauch = [
'L1' => GetValue($idVerbrauchL1),
'L2' => GetValue($idVerbrauchL2),
'L3' => GetValue($idVerbrauchL3)
];
if ($logging) IPS_LogMessage("Stufenschaltung", "Verbrauch: L1={$verbrauch['L1']} , L2={$verbrauch['L2']} , L3={$verbrauch['L3']} ");
// FALL 1: Stufe erhöhen (Phasen dazuschalten)
if ($stufe > $aktuelleAnzahl) {
$anzahlDazu = $stufe - $aktuelleAnzahl;
if ($logging) IPS_LogMessage("Stufenschaltung", "Erhöhe Stufe: $anzahlDazu Phase(n) dazuschalten");
// Noch nicht eingeschaltete Phasen finden
$phasenAus = [];
foreach (['L1', 'L2', 'L3'] as $phase) {
if (!in_array($phase, $phasenEin)) {
$phasenAus[$phase] = $verbrauch[$phase];
}
}
// Nach Verbrauch sortieren (niedrigster zuerst)
asort($phasenAus);
// Die ersten $anzahlDazu Phasen mit niedrigstem Verbrauch dazuschalten
$i = 0;
foreach ($phasenAus as $phase => $wert) {
if ($i < $anzahlDazu) {
$phasenEin[] = $phase;
if ($logging) IPS_LogMessage("Stufenschaltung", "→ Schalte $phase dazu (Verbrauch: $wert)");
$i++;
}
}
}
// FALL 2: Stufe reduzieren (Phasen ausschalten)
elseif ($stufe < $aktuelleAnzahl) {
$anzahlWeg = $aktuelleAnzahl - $stufe;
if ($logging) IPS_LogMessage("Stufenschaltung", "Reduziere Stufe: $anzahlWeg Phase(n) ausschalten");
// Von eingeschalteten Phasen die mit höchstem Verbrauch ermitteln
$phasenEinMitVerbrauch = [];
foreach ($phasenEin as $phase) {
$phasenEinMitVerbrauch[$phase] = $verbrauch[$phase];
}
// Nach Verbrauch sortieren (höchster zuerst)
arsort($phasenEinMitVerbrauch);
// Die ersten $anzahlWeg Phasen mit höchstem Verbrauch ausschalten
$i = 0;
foreach ($phasenEinMitVerbrauch as $phase => $wert) {
if ($i < $anzahlWeg) {
$phasenEin = array_diff($phasenEin, [$phase]);
if ($logging) IPS_LogMessage("Stufenschaltung", "→ Schalte $phase aus (Verbrauch: $wert)");
$i++;
}
}
}
// Schalter setzen
RequestAction($idSchalterL1, in_array('L1', $phasenEin));
RequestAction($idSchalterL2, in_array('L2', $phasenEin));
RequestAction($idSchalterL3, in_array('L3', $phasenEin));
// Debug-Ausgabe
if ($logging) IPS_LogMessage("Stufenschaltung", "Neue Schaltung: L1=" . (in_array('L1', $phasenEin) ? "EIN" : "AUS") . ", L2=" . (in_array('L2', $phasenEin) ? "EIN" : "AUS") . ", L3=" . (in_array('L3', $phasenEin) ? "EIN" : "AUS"));
?>