Nachdem mein Blockly zum Steuern meines Hyper 2000 seit Monaten perfekt läuft habe ich mich mal dem Problem mit meinem Elektroherd angenommen.
Wen der Herd eingeschaltet ist und die Vorwärmphase beendet ist fängt er an zu pulsen.
Das heist er schaltet alle ca. 30 Sekunden die Last ab und dann wieder nach ca, 30 Skunden die Last aus.
Das ist für meinen Hyper suboptimal da der dann wenn die Sonne scheint dauernd zwischen Laden und Einspeisen hin und her schaltet. Auch Abends ohne Sonne schaltet er ständig das Einspeisen ein und aus.
Dafür habe ich jetzt mal ein JS erstellt. Wärend dem Pulsen des Herdes hört der Hyper auf zu Laden oder Einzuspeißen.
/************************************************************
Elektroherd - Pulserkennung über Hausverbrauch
ioBroker JavaScript
************************************************************/
// ============================================================
// EINSTELLUNGEN
// ============================================================
const HERD_LEISTUNG_W = 2000;
const SCHWELLWERT_W = 1000;
// Zeit nach dem letzten Puls bis zum Ende des Pulsens
const ZEIT_NACHLAUF_SEKUNDEN = 15;
// Anzahl notwendiger Wechsel
const MIN_PULSE_WECHSEL = 4;
// Zeit ohne Wechsel -> vollständiger Reset
const ZEIT_OHNE_WECHSEL_SEKUNDEN = 60;
// ============================================================
// OBJEKTE
// ============================================================
const HAUSVERBRAUCH =
'0_userdata.0.Hausverbrauch';
const AKKU =
'0_userdata.0.Laden_Schalter';
const EINSPEISEN =
'0_userdata.0.Einspeisen_Schalter';
// ============================================================
// VARIABLEN
// ============================================================
let letzterStatus = 'start';
let pulseWechsel = 0;
// Pulserkennung aktuell aktiv?
let herdPulst = false;
// Timer für das Ende des Pulsens
let nachlaufTimer = null;
// Timer für 60-Sekunden-Reset
let wechselResetTimer = null;
// Ursprüngliche Schalterzustände
let urspruenglicherAkkuZustand = null;
let urspruenglicherEinspeisenZustand = null;
// ============================================================
// AUSGANGSSTELLUNG WIEDERHERSTELLEN
// ============================================================
function ausgangsstellungWiederherstellen() {
// Nur wenn vorher tatsächlich ein Pulsbetrieb
// aktiviert wurde
if (!herdPulst) {
return;
}
// --------------------------------------------------------
// AKKU
// --------------------------------------------------------
if (urspruenglicherAkkuZustand !== null) {
setState(
AKKU,
urspruenglicherAkkuZustand
);
}
// --------------------------------------------------------
// EINSPEISEN
// --------------------------------------------------------
if (urspruenglicherEinspeisenZustand !== null) {
setState(
EINSPEISEN,
urspruenglicherEinspeisenZustand
);
}
log(
'Ausgangsstellung wiederhergestellt: ' +
'Laden=' +
urspruenglicherAkkuZustand +
', Einspeisen=' +
urspruenglicherEinspeisenZustand,
'warn'
);
// Pulserkennung AUS
herdPulst = false;
// Gespeicherte Zustände löschen
urspruenglicherAkkuZustand = null;
urspruenglicherEinspeisenZustand = null;
}
// ============================================================
// VOLLSTÄNDIGER RESET
// ============================================================
function vollstaendigerReset() {
log(
'60 Sekunden kein neuer Wechsel -> ' +
'vollständiger Reset',
'warn'
);
// --------------------------------------------------------
// TIMER LÖSCHEN
// --------------------------------------------------------
if (nachlaufTimer !== null) {
clearTimeout(nachlaufTimer);
nachlaufTimer = null;
}
// --------------------------------------------------------
// AUSGANGSSTELLUNG WIEDERHERSTELLEN
// --------------------------------------------------------
if (herdPulst) {
ausgangsstellungWiederherstellen();
}
// --------------------------------------------------------
// PULSZÄHLER ZURÜCKSETZEN
// --------------------------------------------------------
pulseWechsel = 0;
// --------------------------------------------------------
// STATUS ZURÜCKSETZEN
// --------------------------------------------------------
letzterStatus = 'start';
log(
'Pulserkennung AUS / Wechselzähler = 0',
'warn'
);
}
// ============================================================
// PULSEN STARTEN
// ============================================================
function pulsenStarten() {
if (herdPulst) {
return;
}
// --------------------------------------------------------
// AUSGANGSSTELLUNG SPEICHERN
// --------------------------------------------------------
urspruenglicherAkkuZustand =
getState(AKKU).val;
urspruenglicherEinspeisenZustand =
getState(EINSPEISEN).val;
log(
'Pulsen erkannt -> Ausgangsstellung gespeichert: ' +
'Laden=' +
urspruenglicherAkkuZustand +
', Einspeisen=' +
urspruenglicherEinspeisenZustand,
'warn'
);
// --------------------------------------------------------
// PULSERKENNUNG EIN
// --------------------------------------------------------
herdPulst = true;
// Während des Pulsens beide AUS
setState(AKKU, false);
setState(EINSPEISEN, false);
log(
'HERD PULST -> Laden_Schalter AUS / Einspeisen AUS',
'warn'
);
}
// ============================================================
// PULSEN NORMAL BEENDEN
// ============================================================
function pulsenBeenden() {
if (!herdPulst) {
return;
}
log(
'Herdpulsen beendet',
'warn'
);
// Ausgangsstellung wiederherstellen
ausgangsstellungWiederherstellen();
// Zähler zurücksetzen
pulseWechsel = 0;
letzterStatus = 'start';
// Reset-Timer löschen
if (wechselResetTimer !== null) {
clearTimeout(wechselResetTimer);
wechselResetTimer = null;
}
}
// ============================================================
// 60-SEKUNDEN-RESET-TIMER
// ============================================================
function wechselResetTimerStarten() {
// Alten Timer löschen
if (wechselResetTimer !== null) {
clearTimeout(wechselResetTimer);
}
// Neuen Timer starten
wechselResetTimer = setTimeout(function () {
wechselResetTimer = null;
// Nur wenn tatsächlich Wechsel gezählt wurden
if (pulseWechsel > 0) {
vollstaendigerReset();
}
}, ZEIT_OHNE_WECHSEL_SEKUNDEN * 1000);
}
// ============================================================
// NACHLAUF-TIMER
// ============================================================
function nachlaufTimerStarten() {
if (nachlaufTimer !== null) {
clearTimeout(nachlaufTimer);
}
nachlaufTimer = setTimeout(function () {
nachlaufTimer = null;
const aktuell =
Number(
getState(HAUSVERBRAUCH).val
);
if (aktuell <= SCHWELLWERT_W) {
pulsenBeenden();
}
}, ZEIT_NACHLAUF_SEKUNDEN * 1000);
}
// ============================================================
// HAUSVERBRAUCH ÜBERWACHEN
// ============================================================
on(
{
id: HAUSVERBRAUCH,
change: 'ne'
},
function (obj) {
const leistung =
Number(obj.state.val);
if (isNaN(leistung)) {
log(
'Ungültiger Hausverbrauch: ' +
obj.state.val,
'warn'
);
return;
}
// ====================================================
// HOHER VERBRAUCH
// ====================================================
if (leistung >= HERD_LEISTUNG_W) {
// Wechsel NIEDRIG -> HOCH
if (letzterStatus === 'niedrig') {
pulseWechsel++;
log(
'Puls HOCH: ' +
leistung.toFixed(0) +
' W | Wechsel=' +
pulseWechsel,
'warn'
);
// 60-Sekunden-Timer neu starten
wechselResetTimerStarten();
}
letzterStatus = 'hoch';
// Nachlauf abbrechen
if (nachlaufTimer !== null) {
clearTimeout(nachlaufTimer);
nachlaufTimer = null;
}
// =================================================
// 4 WECHSEL ERREICHT
// =================================================
if (
pulseWechsel >= MIN_PULSE_WECHSEL &&
!herdPulst
) {
pulsenStarten();
}
return;
}
// ====================================================
// NIEDRIGER VERBRAUCH
// ====================================================
if (leistung <= SCHWELLWERT_W) {
// Wechsel HOCH -> NIEDRIG
if (letzterStatus === 'hoch') {
pulseWechsel++;
log(
'Puls NIEDRIG: ' +
leistung.toFixed(0) +
' W | Wechsel=' +
pulseWechsel,
'warn'
);
// 60-Sekunden-Timer neu starten
wechselResetTimerStarten();
}
letzterStatus = 'niedrig';
// Wenn Herd bereits pulst,
// Nachlauf starten
if (herdPulst) {
nachlaufTimerStarten();
}
return;
}
}
);
// ============================================================
// STARTMELDUNG
// ============================================================
log(
'============================================',
'warn'
);
log(
'Elektroherd-Pulserkennung gestartet',
'warn'
);
log(
'Herdleistung: ' +
HERD_LEISTUNG_W +
' W',
'warn'
);
log(
'Schwellwert: ' +
SCHWELLWERT_W +
' W',
'warn'
);
log(
'Nachlauf: ' +
ZEIT_NACHLAUF_SEKUNDEN +
' Sekunden',
'warn'
);
log(
'Benötigte Wechsel: ' +
MIN_PULSE_WECHSEL,
'warn'
);
log(
'Reset nach ' +
ZEIT_OHNE_WECHSEL_SEKUNDEN +
' Sekunden ohne Wechsel',
'warn'
);
log(
'============================================',
'warn'
);