Shelly Pro 1PM Script

Avalano

New member
Hallo ich habe da ein kleines Problem
Ich habe einen Shelly Pro 1PM für die Steuerung vom Ganglicht.

Ich will es so haben das
von 5:30 Uhr bis 16:00 Uhr Dauerlicht sein soll
und von 16:00 Uhr 5:30 soll es ein Minutenlicht von ca 2-3 Min

Mein Kollege in der IT hat mir ein Script geschrieben nur das passt so noch gar nicht

Code:
function autoOffFalse() {
  Shelly.call("Switch.Setconfig", {"id": 0, "auto_off": false});
  print("Eingeschaltet um: " + new Date().toLocaleTimeString());
}

function autoOffTrue() {
  Shelly.call("Switch.Setconfig", {"id": 0, "auto_off": true});
  print("Ausgeschaltet um: " + new Date().toLocaleTimeString());
}

function zeitsteuerung() {
  let now = new Date();
  let hour = now.getHours();
  let minute = now.getMinutes();
  print("Uhrzeit: " + new Date().toLocaleTimeString());

  if (hour > 5 && hour < 18) {
    autoOffFalse();
  }
  else {
    autoOffTrue();
  }
}

// Führe die Zeitsteuerung jede Minute aus
Timer.set(60000, true, zeitsteuerung);


Jetzt kann es sein das es am Script liegt oder muss ich noch was am Shelly umstellen?
Am Shelly sind Taster angeschlossen wurde auch am Shelly so eingestellt
Nur im Moment ist es so das wenn ich das Script laufen lasse kann nach Ablauf der Zeit das Licht per Taster nicht eingeschaltet werden.

Ich hoffe ich habe alle Verständlich erklärt
 
Zuletzt bearbeitet von einem Moderator:
von 16:00 Uhr 5:30 soll es ein Minutenlicht von ca 2-3 Min
Wie ist das genau gemeint. 1 x 3 Minuten an um 16:00? Oder wenn man in der Zeit von 16:00 bis 5:30 den Taster drückt dann ist das Licht 3 Minuten an?
Frage2: Was soll passieren wenn man in der Zeit von 5:30 Uhr bis 16:00 Uhr den Taster drückt?
 
Wie ist das genau gemeint. 1 x 3 Minuten an um 16:00? Oder wenn man in der Zeit von 16:00 bis 5:30 den Taster drückt dann ist das Licht 3 Minuten an?
Frage2: Was soll passieren wenn man in der Zeit von 5:30 Uhr bis 16:00 Uhr den Taster drückt?
Ich versuche es nochmal hoffe ich kann es gut rüberbringen
von ca. 5:30 bis 16:00 Uhr Dauerlicht
und von 16:00 bis 5:30 soll das licht wenn es per Taster eingeschaltet wird nach 2 Minuten wieder vom Shelly ausgeschalten werden
also immer dann wenn eine Person den Taster betätigt soll es nach 2 Min wieder ausgehen. Das soll Verhindern das das Ganglicht die ganze Nacht Leuchtet.
 
Ich würde es mal so lösen:
In der Zeit von 5:30 bis 16:00 ist das Licht dauernd an.
Wird in der Zeit von 5:30 bis 16:00 der Taster am Shelly gedrückt und das licht ist an, dann wird es bis zum Ablauf der Zeit ausgeschaltet.
Wird in der Zeit von 5:30 bis 16:00 der Taster am Shelly gedrückt und das licht ist aus, dann wird es bis zum Ablauf der Zeit eingeschaltet.
In der Zeit von 16:00 Uhr bis 5:30 wird das Licht durch drücken des Tasters am Shelly für 3 Minuten eingeschaltet.
Ein erneuter Tastendruck während der 3 Minuten Einschaltzeit startet die Zeit neu.

Ohne Gewähr - ich habe keinen Shelly zum testen:

Code:
local light = Shelly.getComponent("light")
# Apassen falls der Taster an einem anderen Input hängt
local switch = Shelly.getComponent("input0")
# Anpassen wenn eine andere input-Nummer verwendet wird
local pin = 0

# Konfigurierbare Zeiten (Stunden.MIN)
local startLum = {hour=5, min=30}
local endLum = {hour=16, min=0}

# Status-Variablen
local timerActive = false
local timerEnd = 0
local alwaysOn = true
# Von 5:30–16:00 ist das Licht dauerhaft an
local function nowInMinutes()
  local t = os.date("t", os.time())
  return t.hour60 + t.min
end

# Hilfsfunktionen
local function inInterval(nowMin)
  local startMin = startLum.hour60 + startLum.min
  local endMin = endLum.hour60 + endLum.min
  if startMin <= endMin then
    return nowMin >= startMin and nowMin < endMin
  else
    # Zeitbereich über Mitternacht
    return nowMin >= startMin or nowMin < endMin
  end
end

local function setLight(state)
  if state then
    Shelly.call("Light.set", {id=0, on=true})
  else
    Shelly.call("Light.set", {id=0, on=false})
  end
end

# Hauptlogik
local function updateLightState()
  local nowMin = nowInMinutes()
  local inDayRange = inInterval(nowMin)
  if inDayRange then
    # 5:30–16:00: Licht dauernd an, Tastendruck togglet bis Ablauf
    if timerActive then
      # Timer noch läuft, Licht bleibt an bis Ablauf
      setLight(true)
      return
    end
    # außerhalb Timer-Logik, Licht dauerhaft an
    setLight(true)
  else
  # 16:00–5:30: Timer-Site 3 Minuten Tastensteuerung
  if timerActive then
    if os.time() >= timerEnd then
      timerActive = false setLight(false)
    else
      setLight(true)
    end
    else
      # Kein aktiver Timer: Licht aus, bis Tastendruck
      setLight(false)
    end
  end
end

local function onTasterPress()
  local nowMin = nowInMinutes()
  local inDayRange = inInterval(nowMin)
  if inDayRange then
    # 5:30–16:00: Toggle bis Ablauf der Zeit (setzt Ablauf wenn Licht gerade an/aus)
    local state = Shelly.getComponent("light").state or false local nextState = not state
    setLight(nextState)
    # Ablaufzeit festlegen: solange der Taster gehalten wird oder bis Ende der festgelegten Zeit?
    # Interpretierte Umsetzung: Wenn gedrückt während Tag, schaltet bis zum Ablauf der festgelegten Zeit (definierte Uhrzeit)
    # Hier realisieren wir: Abschlusszeit ˜ heute 16:00 oder Ende der "Ablaufzeit"?
    # Einfach: keine zusätzliche Timer, da Licht wird bis zum Tagesende weiterlaufen (5:30–16:00)
    # Daher hier kein weiterer Timer erforderlich.
  else
    # 16:00–5:30: 3-Minuten-Timer starten oder neu starten
    local duration = 3 * 60
    # 3 Minuten
    timerEnd = os.time() + duration timerActive
  end
end
 
Ich würde es mal so lösen:
In der Zeit von 5:30 bis 16:00 ist das Licht dauernd an.
Wird in der Zeit von 5:30 bis 16:00 der Taster am Shelly gedrückt und das licht ist an, dann wird es bis zum Ablauf der Zeit ausgeschaltet.
Wird in der Zeit von 5:30 bis 16:00 der Taster am Shelly gedrückt und das licht ist aus, dann wird es bis zum Ablauf der Zeit eingeschaltet.
In der Zeit von 16:00 Uhr bis 5:30 wird das Licht durch drücken des Tasters am Shelly für 3 Minuten eingeschaltet.
Ein erneuter Tastendruck während der 3 Minuten Einschaltzeit startet die Zeit neu.

Ohne Gewähr - ich habe keinen Shelly zum testen:

Code:
local light = Shelly.getComponent("light")
# Apassen falls der Taster an einem anderen Input hängt
local switch = Shelly.getComponent("input0")
# Anpassen wenn eine andere input-Nummer verwendet wird
local pin = 0

# Konfigurierbare Zeiten (Stunden.MIN)
local startLum = {hour=5, min=30}
local endLum = {hour=16, min=0}

# Status-Variablen
local timerActive = false
local timerEnd = 0
local alwaysOn = true
# Von 5:30–16:00 ist das Licht dauerhaft an
local function nowInMinutes()
  local t = os.date("t", os.time())
  return t.hour60 + t.min
end

# Hilfsfunktionen
local function inInterval(nowMin)
  local startMin = startLum.hour60 + startLum.min
  local endMin = endLum.hour60 + endLum.min
  if startMin <= endMin then
    return nowMin >= startMin and nowMin < endMin
  else
    # Zeitbereich über Mitternacht
    return nowMin >= startMin or nowMin < endMin
  end
end

local function setLight(state)
  if state then
    Shelly.call("Light.set", {id=0, on=true})
  else
    Shelly.call("Light.set", {id=0, on=false})
  end
end

# Hauptlogik
local function updateLightState()
  local nowMin = nowInMinutes()
  local inDayRange = inInterval(nowMin)
  if inDayRange then
    # 5:30–16:00: Licht dauernd an, Tastendruck togglet bis Ablauf
    if timerActive then
      # Timer noch läuft, Licht bleibt an bis Ablauf
      setLight(true)
      return
    end
    # außerhalb Timer-Logik, Licht dauerhaft an
    setLight(true)
  else
  # 16:00–5:30: Timer-Site 3 Minuten Tastensteuerung
  if timerActive then
    if os.time() >= timerEnd then
      timerActive = false setLight(false)
    else
      setLight(true)
    end
    else
      # Kein aktiver Timer: Licht aus, bis Tastendruck
      setLight(false)
    end
  end
end

local function onTasterPress()
  local nowMin = nowInMinutes()
  local inDayRange = inInterval(nowMin)
  if inDayRange then
    # 5:30–16:00: Toggle bis Ablauf der Zeit (setzt Ablauf wenn Licht gerade an/aus)
    local state = Shelly.getComponent("light").state or false local nextState = not state
    setLight(nextState)
    # Ablaufzeit festlegen: solange der Taster gehalten wird oder bis Ende der festgelegten Zeit?
    # Interpretierte Umsetzung: Wenn gedrückt während Tag, schaltet bis zum Ablauf der festgelegten Zeit (definierte Uhrzeit)
    # Hier realisieren wir: Abschlusszeit ˜ heute 16:00 oder Ende der "Ablaufzeit"?
    # Einfach: keine zusätzliche Timer, da Licht wird bis zum Tagesende weiterlaufen (5:30–16:00)
    # Daher hier kein weiterer Timer erforderlich.
  else
    # 16:00–5:30: 3-Minuten-Timer starten oder neu starten
    local duration = 3 * 60
    # 3 Minuten
    timerEnd = os.time() + duration timerActive
  end
end
Danke ich werde das mal testen und gebe dir bescheid
 
Ich hoffe die Funktion ist so in Ordnung. Das sollte eigentlich alle benötigten Fälle abdecken.
Ja gib mal Bescheid.
 

Zurzeit aktive Besucher

Keine Mitglieder online.

Neueste Beiträge

Letzte Anleitungen

Statistik des Forums

Themen
7.031
Beiträge
68.448
Mitglieder
7.411
Neuestes Mitglied
Flo_36
Zurück
Oben