Servus!
Ich habe eine ähnliche Anwendung wie Du, nur mit einer variablen Zeit.
Szenen vermeide ich wo es geht, ich versuche alles mit VD zu lösen.
Ich kann Dir keine fertige Lösung liefern, aber ein paar Code-Schnippsel.
Im Grunde gibt es eine langsame Hauptschleife, z.B. alle 60 s als Iterationszeit.
Ich habe bei meiner Lösung nur eine Heizzeit im Stundentakt erlaubt, daher kann die Hauptschleife auch im Zyklus in Minuten abgearbeitet werden!
Wenn Du den Timer minutengenau haben möchtest, muss der Code angepasst werden.
Nun Triggert Du mit dem Türkontakt einen Timer der eine gewisse Zeit läuft.
Wenn nun vorher der andere Türkontakt aktiv ist, wird vor Ablauf der festgelegten Zeit zurückgesetzt.
Folgende globale Variablen werden benötigt:
HEIZDAUER -- 1 - 10 Stunden
AUFWAERMEN -- 0/1 als Hilfsschalter
HEIZZEITENDE -- xx:xx berechnete Uhrzeit (+1 bis +10h nach dem Start)
Diesen Code habe ich in einen Ein-Schalter eine VD gesetzt: Hier starte ich die ganze Aktion
local SelfId = fibaro:getSelfId()
local Zeit = os.date("%H:%M") -- aktuelle Zeit
local Heizdauer = fibaro:getGlobal("HEIZDAUER") -- Laufzeit in Stunden als globale Variable, kann auch hardcodiert sein...
local H
local M
local StopZeit -- Berechnete Stoppzeit
local SwBadID = 63 -- ID Schalter Bad
local SwWzID = 47 -- ID Schalter Wohnzimmer
local SwSzID = 72 -- ID Schalter Schlafzimmer
H = string.sub(Zeit, 1, 2) -- Stunden extrahieren
M = string.sub(Zeit, 4, 5) -- Minuten
H = tonumber(H) -- Stunden als Zahl speichern
--fibaro:debug('Heizzeitende nach der Berechnung: '..Zeit .." vorMatch: " ..tostring(string.match(tostring(Zeit), "[0-2][0-3]:[0-5][0-9]")))
if (H + Heizdauer) <= 23 then -- berechne Heizdauer ab aktueller Uhrzeit
H = (H + Heizdauer)
StopZeit = string.format("%02d:%s",H,M)
-- fibaro:call(SelfId, "setProperty", "ui.lbStatus.value", "Heizzeit ENDE: " ..StopZeit) -- Label im VD zur Anzeige
fibaro:setGlobal("HEIZZEITENDE",StopZeit)
fibaro:debug('Heizzeitende: '..StopZeit)
else -- wenn Heizzeit über 24Uhr hinaus geht, Zeit anpassen
H = Heizdauer - (24 - H)
StopZeit = string.format("%02d:%s",H,M)
--fibaro:call(SelfId, "setProperty", "ui.lbStatus.value", "Heizzeit ENDE: " ..StopZeit) -- Label im VD zur Anzeige
fibaro:setGlobal("HEIZZEITENDE",StopZeit)
fibaro:debug('Heizzeitende: '..StopZeit)
end
fibaro:debug('Heizzeitende nach der Berechnung: '..StopZeit .." Match: " ..tostring(string.match(StopZeit, "[0-2][0-3]:[0-5][0-9]")))
if (string.match(StopZeit, "[0-2][0-9]:[0-5][0-9]") ~= NIL) then --rudimentärer Test auf korrektes Uhrzeitformat
fibaro:setGlobal("AUFWAERMEN", 1) -- Aufwärmen EIN
---------------------------------------
-- HIER Heizrelais direkt starten !!!!!
---------------------------------------
fibaro:call(SwWzID,'turnOn'); -- Wohnzimmer ein
fibaro:call(SwSzID,'turnOn'); -- Schlafzimmer ein
fibaro:call(SwBadID,'turnOn'); -- Badezimmer ein
fibaro:debug('Vorwärmen ein')
else
fibaro:call(SelfId, "setProperty", "ui.lbStatus.value", "Fehler in der Heizzeit")
fibaro:setGlobal("AUFWAERMEN", 0) -- Aufwärmen AUS
fibaro:call(2, "sendEmail", "Häuschen", "Haus vorwärmen Fehler im Uhrzeitformat!")
fibaro:debug('Vorwärmen Fehler im Uhrzeitformat!')
end
Im Ausschalt Knopf der VD steht folgendes:
local SelfId = fibaro:getSelfId()
local SwBadID = 63 -- ID Schalter Bad
local SwWzID = 47 -- ID Schalter Wohnzimmer
local SwSzID = 72 -- ID Schalter Schlafzimmer
fibaro:setGlobal("AUFWAERMEN", 0) -- Aufwärmen AUS
fibaro:call(SelfId, "setProperty", "ui.lbStatus.value", "Heizen AUS")
---------------------------------------
-- HIER Heizrelais direkt stoppen !!!!!
---------------------------------------
fibaro:call(SwWzID,'turnOff'); -- Wohnzimmer aus
fibaro:call(SwSzID,'turnOff'); -- Schlafzimmer aus
fibaro:call(SwBadID,'turnOff'); -- Badezimmer aus
fibaro:debug('################################')
fibaro:debug(' Aufwärmzeit manuell gestoppt !')
fibaro:debug('################################')
In der Hauptschleife des VD wird nun die aktuelle Zeit mit dem vorausberechneten Heizzeitende verglichen:
local ZykluszeitSekunden = 30 -- Aufrufzeit der Hauptschleife 10-60 Sekunden um Ressourcen zu schonen, nicht zu lange wegen Wartezeit beim Rücksetzen!
local SelfId = fibaro:getSelfId()
local HeizDauer = fibaro:getGlobal("HEIZDAUER") -- in Stunden
local AufwaermenStart = fibaro:getGlobal("AUFWAERMEN") -- Toggle
local HeizZeitEnde = fibaro:getGlobal("HEIZZEITENDE") -- Uhrzeit für aus
local Zeit = os.date("%H:%M") -- aktuelle Zeit
local SwBadID = 63 -- ID Schalter Bad
local SwWzID = 47 -- ID Schalter Wohnzimmer
local SwSzID = 72 -- ID Schalter Schlafzimmer
fibaro:debug('Zeit: ' ..Zeit ..' Heizdauer: ' ..tostring(HeizDauer) ..'h Start: ' ..tostring(AufwaermenStart)..' Ende: ' ..tostring(HeizZeitEnde))
if (tostring(AufwaermenStart) == '1') and (Zeit == HeizZeitEnde) then -- Vorausberechnete Heizzeit erreicht
-- ### HIER NOCH DEN TÜRKONTAKT MIT VERODERN! !!! *#####
fibaro:call(SwWzID,'turnOff'); -- Wohnzimmer aus -- Abfrage auf == HeizZeitEnde O.K. da nur auf Stunden gerechnet wird!
fibaro:call(SwSzID,'turnOff'); -- Schlafzimmer aus
fibaro:call(SwBadID,'turnOff'); -- Badezimmer aus
fibaro:setGlobal("AUFWAERMEN", 0) -- Flanke, damit nur einmalig ausgeschaltet wird!
AufwaermenStart = 0
fibaro:debug('################################')
fibaro:debug('Aufwärmzeit erreicht, alles aus!')
fibaro:debug('################################')
end
fibaro:sleep(ZykluszeitSekunden*1000);