Shelly

// Shelly Script: Nach Einschalten 10 Minuten warten,
// dann bei dauerhaft unter 100 W nach 5 Minuten ausschalten.

let CONFIG = {
  switchId: 0,

  // Wartezeit nach dem Einschalten
  startDelayMs: 10 * 60 * 1000,

  // Verbrauchsschwelle
  powerLimitW: 100,

  // Wie lange unter der Schwelle bleiben muss
  lowPowerDelayMs: 5 * 60 * 1000,

  // Prüfintervall nach Ablauf der ersten 10 Minuten
  checkIntervalMs: 10 * 1000
};

let startDelayTimer = null;
let checkTimer = null;
let lowPowerTimer = null;

function clearTimer(timerId) {
  if (timerId !== null) {
    Timer.clear(timerId);
  }
}

function resetAllTimers() {
  clearTimer(startDelayTimer);
  clearTimer(checkTimer);
  clearTimer(lowPowerTimer);

  startDelayTimer = null;
  checkTimer = null;
  lowPowerTimer = null;
}

function switchOff() {
  print("Verbrauch war lange genug unter " + CONFIG.powerLimitW + " W. Schalte aus.");

  Shelly.call("Switch.Set", {
    id: CONFIG.switchId,
    on: false
  });

  resetAllTimers();
}

function checkPower() {
  Shelly.call("Switch.GetStatus", {
    id: CONFIG.switchId
  }, function (status, error_code, error_message) {
    if (error_code !== 0) {
      print("Fehler beim Lesen des Switch-Status: " + error_message);
      return;
    }

    if (!status.output) {
      print("Steckdose ist aus. Überwachung wird beendet.");
      resetAllTimers();
      return;
    }

    let power = status.apower;

    print("Aktuelle Leistung: " + power + " W");

    if (power < CONFIG.powerLimitW) {
      if (lowPowerTimer === null) {
        print("Verbrauch unter " + CONFIG.powerLimitW + " W. Starte 5-Minuten-Timer.");

        lowPowerTimer = Timer.set(CONFIG.lowPowerDelayMs, false, function () {
          switchOff();
        });
      }
    } else {
      if (lowPowerTimer !== null) {
        print("Verbrauch wieder über " + CONFIG.powerLimitW + " W. 5-Minuten-Timer wird zurückgesetzt.");
        clearTimer(lowPowerTimer);
        lowPowerTimer = null;
      }
    }
  });
}

function startMonitoring() {
  print("10 Minuten sind vorbei. Verbrauchsüberwachung startet.");

  startDelayTimer = null;

  checkPower();

  checkTimer = Timer.set(CONFIG.checkIntervalMs, true, function () {
    checkPower();
  });
}

function handleSwitchOn() {
  print("Steckdose wurde eingeschaltet. Starte 10-Minuten-Wartezeit.");

  resetAllTimers();

  startDelayTimer = Timer.set(CONFIG.startDelayMs, false, function () {
    startMonitoring();
  });
}

function handleSwitchOff() {
  print("Steckdose wurde ausgeschaltet. Alle Timer werden beendet.");
  resetAllTimers();
}

// Statusänderungen überwachen
Shelly.addStatusHandler(function (event) {
  if (event.component !== "switch:" + CONFIG.switchId) {
    return;
  }

  if (typeof event.delta.output === "undefined") {
    return;
  }

  if (event.delta.output === true) {
    handleSwitchOn();
  } else {
    handleSwitchOff();
  }
});

// Falls Script gestartet wird, während die Steckdose bereits eingeschaltet ist
Shelly.call("Switch.GetStatus", {
  id: CONFIG.switchId
}, function (status, error_code, error_message) {
  if (error_code !== 0) {
    print("Fehler beim Initialisieren: " + error_message);
    return;
  }

  if (status.output) {
    print("Steckdose war beim Scriptstart bereits eingeschaltet.");
    handleSwitchOn();
  } else {
    print("Steckdose ist beim Scriptstart aus.");
  }
});