Hat einer 11 Min Zeit der LUA kann? Teil 2

Hey zusammen,

es ist mal wieder soweit.
Will meine Küchensockelbeleuchtung automatisieren und irgendwas passt nicht in den trockenübungen.

Beim letzten mal konnte @jeep und paar andere super helfen.
Wenn da mal einer über die Feiertage Zeit findet und ein Blick drauf werfen könnte wäre super lieb.

Bleibt gesund und habt schöne Feiertage.

Soll Ablauf:
Start um 60 Min. nach Sonnenuntergang
und „Thekenlicht“ und „Deckenlicht“ aus sind
und „Sockel Helligkeit“ < 400
und eine Bewegung an „Sockel Bewegung“ erkannt wird
dann „Sockel Licht Strom“ für 3 Min. einschalten.
(Der Timer soll bei jeder Bewegung für 3 Min starten oder verlängern)
30 Min vor Sonnenaufgang ist die Szene dann wieder zu deaktivieren.

LUA-Script:
–[[
%% autostart
%% properties
%% weather
%% events
%% globals
–]]

local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("t");
local startSource = fibaro:getSourceTrigger();
if (
( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and os.date("%H:%M", os.time()-60
60) == fibaro:getValue(1, „sunsetHour“)) )
and
( tonumber(fibaro:getValue(293, „value“)) > 0 and tonumber(fibaro:getValue(98, „value“)) == 0 and tonumber(fibaro:getValue(100, „value“)) == 0 and tonumber(fibaro:getValue(295, „value“)) < 400 )
)
then
fibaro:call(299, „turnOn“);
setTimeout(function()
fibaro:call(299, „turnOff“);
end, 180000)
end

setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger[„type“] == „autostart“) then
tempFunc()
else

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
( (currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) )
and
( tonumber(fibaro:getValue(293, „value“)) > 0 and tonumber(fibaro:getValue(98, „value“)) == 0 and tonumber(fibaro:getValue(100, „value“)) == 0 and tonumber(fibaro:getValue(295, „value“)) < 400 )
or
startSource[„type“] == „other“
)
then
fibaro:call(299, „turnOn“);
setTimeout(function()
fibaro:call(299, „turnOff“);
end, 180000)
end

end

HI, ich hab kein HC2 mehr, bin seit 1 Jahr auf HC3.
Aber versuch mal dieses Script das ich aus deinem Code erstellt habe. Bei dir hat der Trigger gefehlt.
Du kannst wenn ich sie richtig gedeutet habe, die Werte im Script mit den localen Variablennamen tauschen. Liest sich angenehmer.
Wie gesagt testen kann ich nicht mehr da der LUA COde vom HC3 abweicht.

–[[
%% autostart
%% properties
295 value
%% events
–]]

local Thekenlicht = 293
local Deckenlicht = 98
local SockelLux   = 295
local SockelLicht = 299
local currentDate = os.date("t");
local sourceTrigger = fibaro:getSourceTrigger();

local function LichtSockel()
  if ( (os.date("%H:%M", os.time()-3600) == fibaro:getValue(1, "sunsetHour")) 
     and ( tonumber(fibaro:getValue(293, "value")) > 0 
     and tonumber(fibaro:getValue(98, "value")) == 0 
     and tonumber(fibaro:getValue(100, "value")) == 0 
     and tonumber(fibaro:getValue(295, "value")) < 400 ) )
     then
     fibaro:call(299, "turnOn");
     setTimeout(function()
       fibaro:call(299, "turnOff");
     end, 180000)
  end

end
 LichtSockel()

Hey Jeep,

besten Dank für Deinen ersten Lösungsansatz.

Kannst Du mir noch kurz mitteilen was diese Zeile machen soll?
and tonumber(fibaro:getValue(100, „value“)) == 0
Ich habe doch gar keine Gerät mit der ID100

Und das
end
Lichtsockel ()
soll bestimm end SockelLicht () lauten, oder?

Hi,

Das hab ich aus Deinem erstellten LUA Script. Lass es dann einfach weg.
Der Funktionsaufruf am Ende ist so richtig.

100 könnte der Bewegungsmelder sein. Da stimmt was nicht in Deinem LUA das passt nicht zur Blockszene.

Ist das scripten mit dem HC3 einfacher???

Egal wie ich es mach…
Ich bekomm immer den Fehler:
image

Habe hier jetzt nochmals die ID´s gerade gezogen:
–[[
%% autostart
%% properties
295 value
%% events
–]]

local Thekenlicht = 98 --Thekenlicht
local Deckenlicht = 100 --Deckenlicht
local Sockel Helligkeit = 295 --Helligkeit
local Sockel Bewegung = 293 – Bewegungsmelder
local Sockel Licht Strom = 299 --WallPlug
local currentDate = os.date(„t“);
local sourceTrigger = fibaro:getSourceTrigger();

local function LichtSockel()
if ( (os.date("%H:%M", os.time()-3600) == fibaro:getValue(1, „sunsetHour“))
and ( tonumber(fibaro:getValue(293, „value“)) > 0
and tonumber(fibaro:getValue(98, „value“)) == 0
and tonumber(fibaro:getValue(100, „value“)) == 0
and tonumber(fibaro:getValue(295, „value“)) < 4 ) )
then
fibaro:call(299, „turnOn“);
setTimeout(function()
fibaro:call(299, „turnOff“);
end, 180000)
end

end
LichtSockel()

Hi,
beim copy/Paste werden hier im Forum meistens die Sonderzeichen, zerhauen. Hab im ersten Beispiel im Header vergessen sie zu ändern. Außerdem hab ich im Header jetzt den richtigen Wert für den Bewegungsmelder gesetzt.
Schön das du doch deine ID 100 gefunden hast.
Also nochmal testen.

--[[
%% autostart
%% properties
293 value
%% events
--]]

local Thekenlicht = 98       --Thekenlicht
local Deckenlicht = 100      --Deckenlicht
local SockelHelligkeit = 295 --Helligkeit
local SockelBewegung = 293   --Bewegungsmelder
local SockelLicht = 299      --WallPlug
local currentDate = os.date("t");
local sourceTrigger = fibaro:getSourceTrigger();

local function LichtSockel()
  if ( (os.date("%H:%M", os.time()-3600) == fibaro:getValue(1, "sunsetHour"))
    and ( tonumber(fibaro:getValue(293, "value")) > 0
    and tonumber(fibaro:getValue(98, "value")) == 0
    and tonumber(fibaro:getValue(100, "value")) == 0
    and tonumber(fibaro:getValue(295, "value")) < 4 ) )
  then
    fibaro:call(299, "turnOn");
    setTimeout(function()
      fibaro:call(299, "turnOff");
    end, 180000)
  end

end
LichtSockel()

Also… ein Debug Fehler kommt nich mehr, aber es funktioniert auch nicht. :confused:
Hab Dir ne PN geschickt

OK, könnte auch mit der Helligkeit zu tun haben. Den Wert solltest Du vergrößern ,mal mit 50 anfangen. Oder du schaust mal in der fraglichen Zeit wieviel LUX der Sensor meldet.

Was ich noch nicht ganz verstehe warum nur 1 Std. vor und nach Sonnenuntergang.
Betritt 1 Std. nach Sonnenuntergang niemand mehr den Raum???
Ohne HC2 tu ich mich schwer was auf die Schnelle hinzubekommen. Aber ich versuch mal was.
Hab ein paar print Befehle zum debugen eingebaut. Wenns mal tut kannst du die ja auskommentieren

--[[
%% autostart
%% properties
293 value
%% events
--]]

local Thekenlicht = 98       --Thekenlicht
local Deckenlicht = 100      --Deckenlicht
local SockelHelligkeit = 295 --Helligkeit
local SockelBewegung = 293   --Bewegungsmelder
local SockelLicht = 299      --WallPlug
local currentDate = os.date("t");
local sourceTrigger = fibaro:getSourceTrigger();

local SunSET = fibaro:getValue(1, "sunsetHour")
local lux = fibaro:getValue(295, "value")
print("LUX: "..lux)

local function LichtSockel()
  print("Funktion gestartet.")  
  if (  (os.date("%H:%M", os.time()-3600) <= SunSET )
    and (os.date("%H:%M", os.time()+3600) >= SunSET )
    and ( tonumber(fibaro:getValue(293, "value")) > 0
    and tonumber(fibaro:getValue(98, "value")) == 0
    and tonumber(fibaro:getValue(100, "value")) == 0
    and tonumber(fibaro:getValue(295, "value")) < 50 ) )
  then
    fibaro:call(299, "turnOn");
    setTimeout(function()
      fibaro:call(299, "turnOff");
    end, 180000)
  else
    print("Bedingungen nicht erfüllt.")
  end

end
LichtSockel()

Oh, da hast Du mich falsch verstanden…
Die Szene sollte täglich aktiv sein von
1 Std vor Sonnenuntergang
„BIS“
1 Std. nach Sonnenaufgang (am nächsten Tag).

Die Lux habe ich schon wieder auf 100 gesetzt und war beim testen auf dem Wert 67 und oftmals auch 0, je nachdem wie das Licht drauf gescheint hat.

So, mittlerweile funktioniert es ein wenig,
Das einschalten des WallPlug funktioniert.
Jetzt meckern die Instanzen noch rum, kann man das ignorieren?

Jetzt 10 Min. später erneute Bewegung am Bewegungsmelder, aber nichts passiert.
LUX bei 16 eingestellt <500
Deckenleuchte und Thekenleuchte aus
Zeitrahmen 10 Std. vor Sonnenuntergang
Also alles genauso wie bei den Tests vor 10 Min. aber jetzt funktioniert es nicht mehr und der Debug behauptet „bedienung nicht erfüllt“.
Das soll einer verstehen…

OK, ich ändere das noch heute. Hab das tatsächlich falsch interpretiert.

Instanzen kann man erstmal ignorieren

Ich denke es hat darum nicht funktioniert, weil die Zeit noch nicht erreicht war.
Nächster Versuch, bin neugierig ob das über die Datumsgrenze geht.
Zurück zu Deiner Frage zum HC3, LUA ist nicht einfacher aber Blockszenen eher wenn man das Prinzip verstanden hat.

--[[
%% autostart
%% properties
293 value
%% events
--]]

local Thekenlicht = 98       --Thekenlicht
local Deckenlicht = 100      --Deckenlicht
local SockelHelligkeit = 295 --Helligkeit
local SockelBewegung = 293   --Bewegungsmelder
local SockelLicht = 299      --WallPlug
local currentDate = os.date("t");
local sourceTrigger = fibaro:getSourceTrigger();

local SunSET  = fibaro:getValue(1, "sunsetHour")
local SunRISE = fibaro:getValue(1, "sunriseHour")
local lux = fibaro:getValue(295, "value")
print("LUX: "..lux)

local function LichtSockel()
  print("Funktion gestartet.")  
  if (  (os.date("%H:%M", os.time()-3600) <= SunSET )
    and (os.date("%H:%M", os.time()+3600) >= SunRISE )
    and ( tonumber(fibaro:getValue(293, "value")) > 0
    and tonumber(fibaro:getValue(98, "value")) == 0
    and tonumber(fibaro:getValue(100, "value")) == 0
    and tonumber(fibaro:getValue(295, "value")) < 50 ) )
  then
    fibaro:call(299, "turnOn");
    setTimeout(function()
      fibaro:call(299, "turnOff");
    end, 180000)
  else
    print("Bedingungen nicht erfüllt.")
  end

end
LichtSockel()

Hi @ecker und ein gutes Neues Jahr.
Habe nochmal nachgedacht und es ist mir klar geworden dass es so nicht funktionieren kann.
Sonnenaufgang und -untergang kann man nicht mit „und“ verknüpfen. Es ist entweder SA oder SU.
Also muss man diese Bedingung mit „oder“ verknüpfen.
Bin zu 99% sicher das es so funktioniert. Die Helligkeit des Sensors könnte noch ein Problem sein, da diese Sensoren sehr träge reagieren. Du kannst das mit diesem kleinen Script testen dass Dir jede Sekunde die Helligkeit zeigt.

local BM = 295
while true do
 local lux = fibaro:getValue(BM, "value")
 print("LUX: "..lux)
 fibaro:sleep(1000)
end  

Das Verhalten könnte man mit den Parametern 40 und 42 ändern, aber die Batterie wird vermutlich nur halb so lang halten wenn man die Zeit für den Report zu kurz wählt.
Deshalb denke ich dass Du es erstmal ohne den Luxsensor testest (hab ihn unten auskommentiert.

Hoffe dass ich keine neuen Bugs eingebaut habe, aber so ist es wenn man nicht testen kann.

--[[
%% autostart
%% properties
293 value
%% events
--]]

-- Wegen "To many instances" 
if (fibaro:countScenes()>1) then 
  fibaro:abort(); 
end

local Thekenlicht = 98       --Thekenlicht
local Deckenlicht = 100      --Deckenlicht
local SockelHelligkeit = 295 --Helligkeit
local SockelBewegung = 293   --Bewegungsmelder
local SockelLicht = 299      --WallPlug
local currentDate = os.date("t");
local sourceTrigger = fibaro:getSourceTrigger();

local SunSET  = fibaro:getValue(1, "sunsetHour")
local SunRISE = fibaro:getValue(1, "sunriseHour")
local lux = fibaro:getValue(295, "value")
print("LUX: "..lux)

local function LichtSockel()
  print("Funktion gestartet.")  
  if ((os.date("%H:%M", os.time()-3600) <= SunRISE) 
    or(os.date("%H:%M", os.time()+3600) >= SunSET) 
    and ( tonumber(fibaro:getValue(293, "value")) > 0
    and tonumber(fibaro:getValue(98, "value")) == 0
    and tonumber(fibaro:getValue(100, "value")) == 0
    --and tonumber(fibaro:getValue(295, "value")) < 50 
	))
  then
    fibaro:call(299, "turnOn");
    setTimeout(function()
      fibaro:call(299, "turnOff");
    end, 180000)
  else
    print("Bedingungen nicht erfüllt.")
  end

end
LichtSockel()

Viel Erfolg.

Hey @Jeep,

Dir und Deiner Familie ebenso ein gesundes und erfolgreiches neues Jahr.

Du Meister, das tut jetzt. :blush:

Ich hatte mich gar nicht mehr getraut das hier reinzuschreiben und hab dann eine nicht so schöne Lösung mit der grafischen Oberfläche gefunden, aber eben ohne Sunrise und Sunset.
Ich freu mich riesig das es jetzt mit Deiner schönen Lösung funktioniert.
Mein Angebot steht noch wenn Du mir Deine Mailadresse per PN schickst.
Danke für Deine Zeit.

Was mir gerade noch auffällt ist, das auch hier nun diese Meldung kommt:

Hi @ecker ,

Finde ich sehr nett aber lass mal gut sein. Mir hat man auch schon oft geholfen. Bin froh wenn es so funktioniert wie Du es dir vorgestellt hast.
Habe oben im Script 4 Zeilen hinzugefügt ab Zeile 6, die einfach noch hinzufügen. Die Instanzen in den Einstellungen für das Script kannst du default auf 2 lassen.
Und bei Problemen, einfach schreiben.
cu

Ups, da stimmt noch ne Kleinigkeit nicht.
Die Bodenbeleuchtung (299) geht auch an wenn das Thekenlicht (98) oder das Deckenlicht (100) an ist.

Ich hab ja keine Ahnung, aber da ist bestimmt bloß ne Klammer falsch, oder?

Hm, auf die Schnelle betrachtet ist alles OK. Kann es sein dass noch ein anderes Script läuft, Blockszene?

Negativ, da läuft auf den 4 Aktoren kein anderes Script, daher scheidet der Verdacht einer Blockszene aus. Die Meldung zu viele Instanzen kommt auch noch, aber frag mich net warum. :face_with_hand_over_mouth:

Bei meinem (aber leider ohne Sunrise und Sunset) funktioniert es korrekt, aber eben ohne die Zeiten.

--[[
%% properties
293 value
%% weather
%% events
%% globals
--]]

local startSource = fibaro:getSourceTrigger();
if (
 ( tonumber(fibaro:getValue(293, "value")) > 0 )
and
 ( tonumber(fibaro:getValue(98, "value")) == 0  and  tonumber(fibaro:getValue(100, "value")) == 0  and  tonumber(fibaro:getValue(295, "value")) <= 10 )
or
startSource["type"] == "other"
)
then
	fibaro:call(299, "turnOn");
	setTimeout(function()
		fibaro:call(299, "turnOff");
	end, 180000)
end

Das sind im Prinzip die gleichen Klammern. Also wenn kein anderes LUA Script läuft und keine Assoziationen gesetzt sind versteh ich das nicht.
Hier ist das gleiche Script zum simulieren, habe es auf dem HC3 getestet. Hat funktioniert. Ist an HC2 angepasst.

local SunSET  = fibaro:getValue(1, "sunsetHour")
local SunRISE = fibaro:getValue(1, "sunriseHour")

local Thekenlicht = 0       -- 1 = Licht an
local Deckenlicht = 1       -- 0 = Licht aus
local SockelLicht = 299      --WallPlug
local currentDate = os.date("t");
local Bewegung = 1 -- 1 = Bewegung erkannt 


--local SunSET  = "16:00" 
--local SunRISE = "08:50"


local function LichtSockel()
  print("Funktion gestartet.")  
  if ((os.date("%H:%M", os.time()-3600) <= SunRISE) 
    or (os.date("%H:%M", os.time()+3600) >= SunSET) 
    and (Bewegung > 0
    and Thekenlicht == 0
    and Deckenlicht == 0    
      ))
    then
      print("Sockellicht an")
      
    else
       print("Bedingungen nicht erfüllt.")
       
  end

end
LichtSockel()

Du kannst die Variablen Thekenlicht, Deckenlicht Bewegung, SunSet und SunRISE manipulieren.
Wenn Thekenlicht oder Deckenlicht auf 1 steht ist die Bedingung nicht erfüllt.

EDIT: Hast Du „Max. running instances“ auf 2 gesetzt?