Garagentorbeleuchtung

Hallo,

ich habe ein bisschen mit LUA experimentiert und folgender Code ist rausgekommen. Ziel ist es, mein LED Band am Garagentor rot blinken zu lassen wenn das Tor in Bewegung ist und für 15 Sekunden grün leuchten zu lassen wenn das Tor die jeweilige Endposition erreicht hat. Zusätzlich soll das Band ab Sonnenuntergang bis Sonnenaufgang weiss leuchten.

Bevor ich das Skript live setze wollte ich fragen ob einer der Experte mal einen Blick drauf werfen kann. nicht dass ich hier was verbockt habe und mir das ganze system zerschiesse :wink:

--[[
%% autostart
%% properties
332 value
341 value
%% globals
--]]

local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
local sonnenaufgang = fibaro:getValue(1, "sunriseHour")
local sonnenuntergang = fibaro:getValue(1, "sunsetHour")
local garagentorunten = 332
local garagentoroben = 341
local LEDstripe = 321
local lichtgarage = 257

if (tonumber(fibaro:getValue(garagentorunten, "value")) > 0)  -- Tor in Bewegung bzw. nicht geschlossen und nicht offen
  and (tonumber(fibaro:getValue(garagentoroben, "value")) > 0)
  then
    fibaro:call(LEDstripe, "startProgram", "286")               --Rot blinken
    fibaro:call(lichtgarage, "turnOn")                          -- Beleuchtung in Garage für 5 Minuten anschalten
    fibaro:sleep(5*60*1000)
    fibaro:call(lichtgarage, "turnOff")
    fibaro:debug('Tor wird geöffnet')
  end
  
if (tonumber(fibaro:getValue(garagentoroben, "value")) == 0)    -- Tor offen
then fibaro:call(LEDstripe "startProgram", "287")               --Grün leuchten
    fibaro:sleep(15*1000)                                       -- 15 Sekunden warten
    elseif ((sonnenaufgang > os.date("%H:%M", os.time())) or (os.date("%H:%M", os.time()) > sonnenuntergang)) -- prüfen ob Sonne schon untergegangen bzw. noch nicht aufgegangen
    then fibaro:call(LEDstripe, "setValue", {R="255",G="255",B="255",W="255"})  -- wenn ja dann LED weiss leuchten
  else fibaro:call(LEDstripe, "turnOff")                                        -- wenn nein, dann LED ausschalten
    fibaro:debug('Tor geöffnet')
end

if (tonumber(fibaro:getValue(garagentorunten, "value")) == 0) -- Tor geschlossen
then fibaro:call(LEDstripe "startProgram", "287")
    fibaro:sleep(15*1000)
    elseif ((sonnenaufgang > os.date("%H:%M", os.time())) or (os.date("%H:%M", os.time()) > sonnenuntergang))
    then fibaro:call(LEDstripe, "setValue", {R="255",G="255",B="255",W="255"})
  else fibaro:call(LEDstripe, "turnOff")
    fibaro:debug('Tor geschlossen')
end

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

die ein oder andere Lokale variable ist bestimmt auch zuviel drin…

Vielen Dank!
Mit freundlichen Grüßen
bademeister

Hi,

hast du das Skript schonmal getestet? Die Szene läuft alleine als %autostart-Szene, egal was für Trigger du oben einsetzt. Durch den Code

if (sourceTrigger["type"] == "autostart") then
tempFunc()
end

wird das Skript immer nur alle 60 Sekunden ausgeführt. Das solltest du nochmal überarbeiten und zwischen Trigger und Zeit mit mehreren Funktionen unterscheiden.

Gruß

hi boomx,

nein hatte das script noch nicht auf der HC2. nur im zerobrane mal durchlaufen lassen.

wenn das skript mit autostart alle 60 sekunden läuft, könnte es ja sein, dass das tor sich bewegt, aber dsa skript das nicht mitbekommt, da es grade in der 60 sekunden pause ist.

wenn ich das skript nur durch die trigger value torkontakte auslöse, geht das weisse licht evtl. morgens nicht aus, wenn ich das tor nicht zufällig kurz nach sonnenaufgang öffne. oder eben nicht an wenn ich das tor abends nach sonnenuntergang nicht bewege.

du meinst ich sollte die torbewegungen mit einer funktion und den triggern “torkontakte” steuern und das leuchten nach sonnenauf- und untergang mit einer autostart funktion?

die zwei funktionen kann ich einfach untereinander in den code schreiben? müssen die funktionen immer in sich abgeschlossen sein (if (sourceTrigger["type"] == "autostart") then tempFunc() end) bevor die nächste funktion definiert wird?

danke
Mit freundlichen Grüßen
bademeister

Hi,

du hast das Prinzip verstanden :slight_smile:

Würde 2 Funktionen schreiben: 1, welche das Value prüft & 1, welche die %autostart-Funktion prüft. Du kannst dann den Trigger abfragen : sourceTrigger[„type“] == „autostart“ und anhand des Ergebnisses die unterschiedlichen Funktionen starten.

‘property’ – for triggers based on the change in device property ‘global’ – for triggers based on the change in global variable ‘other’ – other cases (direct run of the scene using Fibaro interface or by another script)

https://developer.fibaro.com/docs/fghc-luaapi

Gruß

Hi,
ok, ich werde das mal versuchen.

mit welchem code starte ich denn die funktion welche die values prüft?

hab leider keinen developer account…

Mit freundlichen Grüßen
#bademeister

anbei der nächste versuch:

--[[
%% autostart
%% properties
332 value
341 value
%% globals
--]]

local sourceTrigger = fibaro:getSourceTrigger();
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
local sonnenaufgang = fibaro:getValue(1, "sunriseHour")
local sonnenuntergang = fibaro:getValue(1, "sunsetHour")
local garagentorunten = 332
local garagentoroben = 341
local LEDstripe = 321
local lichtgarage = 257

function torbewegung()
if (tonumber(fibaro:getValue(garagentorunten, "value")) > 0)  -- Tor in Bewegung bzw. nicht geschlossen und nicht offen
  and (tonumber(fibaro:getValue(garagentoroben, "value")) > 0)
  then
    fibaro:call(LEDstripe, "startProgram", "286")               --Rot blinken
    fibaro:call(lichtgarage, "turnOn")                          -- Beleuchtung in Garage für 5 Minuten anschalten
    fibaro:sleep(5*60*1000)
    fibaro:call(lichtgarage, "turnOff")
    fibaro:debug('Tor wird geöffnet')
  end
  
if (tonumber(fibaro:getValue(garagentoroben, "value")) == 0)    -- Tor offen
then fibaro:call(LEDstripe "startProgram", "287")               --Grün leuchten
    fibaro:sleep(15*1000)                                       -- 15 Sekunden warten
    fibaro:call(LEDstripe, "turnOff")                                        -- wenn nein, dann LED ausschalten
    fibaro:debug('Tor geöffnet')
end

if (tonumber(fibaro:getValue(garagentorunten, "value")) == 0) -- Tor geschlossen
then fibaro:call(LEDstripe "startProgram", "287")
    fibaro:sleep(15*1000)
    fibaro:call(LEDstripe, "turnOff")
    fibaro:debug('Tor geschlossen')
end

end
if (sourceTrigger["type"] == "xxx") then
torbewegung()
end

function nachtbeleuchtung()
if (tonumber(fibaro:getValue(garagentoroben, "value")) == 0 )
or (tonumber(fibaro:getValue(garagentorunten, "value")) == 0 )
and ((sonnenaufgang > os.date("%H:%M", os.time())) or (os.date("%H:%M", os.time()) > sonnenuntergang))
then fibaro:sleep (15*1000)                                                                           --15 Sek warten damit es erst grün leuchtet nach öffnen
     fibaro:call(LEDstripe, "setValue", {R="255",G="255",B="255",W="255"})
end
setTimeout(nachtbeleuchtung, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
  nachtbeleuchtung()
end

wie gesagt, mir fehlt noch das pendant zu “autostart” für die funktion “torbewegung” zu starten…

kann ich in der function nachtbeleuchtung die “if” abfrage so machen? er soll die prüfung hinter dem “and” natürlich auch hinter dem “if” machen und nicht nur hinter dem “or”…
oder muss ich die prüfung hinterm “and” auch in die “if” abfrage einbauen? so…

if (tonumber(fibaro:getValue(garagentoroben, "value")) == 0 ) and ((sonnenaufgang > os.date("%H:%M", os.time())) or (os.date("%H:%M", os.time()) > sonnenuntergang))
or (tonumber(fibaro:getValue(garagentorunten, "value")) == 0 )
and ((sonnenaufgang > os.date("%H:%M", os.time())) or (os.date("%H:%M", os.time()) > sonnenuntergang)) 

danke
Mit freundlichen Grüßen
bademeister

Hi,

konnte hier schonmal jemand drüberschauen?
wie starte ich die abfrage nach der Funktion für die Values der Torsensoren?

danke
Mit freundlichen Grüßen
bademeister

schade dass wohl niemand die antwort kennt…

Hi,

ich verstehe auch nicht genau, was Du mit
“wie starte ich die abfrage nach der Funktion für die Values der Torsensoren” meinst.

VG Hoggle

Hi,

meine funktion “nachtbeleuchtung” wird mit “sourcetrigger” “autostart” alle 60 sek. gestart

if (sourceTrigger["type"] == "autostart") then
  nachtbeleuchtung()

welchen der drei codes hier

‘property’ – for triggers based on the change in device property
‘global’ – for triggers based on the change in global variable
‘other’ – other cases (direct run of the scene using Fibaro interface or by another script)

nutze ich dann um meine funktion “torbewegung” zu starten?

if (sourceTrigger["type"] == "xxx") then
torbewegung()
end

diese funktion soll durch eine änderung des zustands eines der beiden Torsensoren gestartet werden.

danke

hab grade den einsteiger guide teil 3 auf der homepage gesehen und gelesen.

ich versuche es mal mit “property”.

Mit freundlichen Grüßen
bademeister

funktioniert nicht wie gewünscht…

das ist mein code

--[[
%% autostart
%% properties
332 value
341 value
%% globals
--]]

local sourceTrigger = fibaro:getSourceTrigger();
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
local sonnenaufgang = fibaro:getValue(1, "sunriseHour")
local sonnenuntergang = fibaro:getValue(1, "sunsetHour")
local garagentorunten = 332
local garagentoroben = 341
local LEDstripe = 321
local lichtgarage = 257

function torbewegung()
if (tonumber(fibaro:getValue(garagentorunten, "value")) > 0)  -- Tor in Bewegung bzw. nicht geschlossen und nicht offen
  and (tonumber(fibaro:getValue(garagentoroben, "value")) > 0)
  then
    fibaro:call(LEDstripe, "startProgram", "286")               --Rot blinken
    fibaro:call(lichtgarage, "turnOn")
    fibaro:debug('Tor wird geöffnet')
    fibaro:sleep(5*60*1000)
    fibaro:call(lichtgarage, "turnOff")
    fibaro:debug('Licht aus')
  end
  
if (tonumber(fibaro:getValue(garagentoroben, "value")) == 0)    -- Tor offen
then fibaro:call(LEDstripe, "startProgram", "287")               --Grün leuchten
    fibaro:sleep(15*1000)                                       -- 15 Sekunden warten
    fibaro:call(LEDstripe, "turnOff")                                        -- wenn nein, dann LED ausschalten
    fibaro:debug('Tor geöffnet')
end

if (tonumber(fibaro:getValue(garagentorunten, "value")) == 0) -- Tor geschlossen
then fibaro:call(LEDstripe, "startProgram", "287")
    fibaro:sleep(15*1000)
    fibaro:call(LEDstripe, "turnOff")
    fibaro:debug('Tor geschlossen')
end

end
if (sourceTrigger["type"] == "property") then
torbewegung()
end

function nachtbeleuchtung()
if (tonumber(fibaro:getValue(garagentoroben, "value")) == 0 ) and ((sonnenaufgang > os.date("%H:%M", os.time())) or (os.date("%H:%M", os.time()) > sonnenuntergang))
or (tonumber(fibaro:getValue(garagentorunten, "value")) == 0 ) and ((sonnenaufgang > os.date("%H:%M", os.time())) or (os.date("%H:%M", os.time()) > sonnenuntergang))
then fibaro:sleep (15*1000)                                                                           --15 Sek warten damit es erst grün leuchtet nach öffnen
     fibaro:call(LEDstripe, "setValue", {R="255",G="255",B="255",W="255"})
end
setTimeout(nachtbeleuchtung, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
  nachtbeleuchtung()
end

die autostart funktion läuft nicht. sprich der LED stripe leuchtet nicht weiss…

wenn das tor in bewegung ist und wenn es geschlossen ist, leuchtet der stripe grün…

der teil hier wird anscheinend nicht ausgeführt…


function torbewegung()
if (tonumber(fibaro:getValue(garagentorunten, "value")) > 0)  -- Tor in Bewegung bzw. nicht geschlossen und nicht offen
  and (tonumber(fibaro:getValue(garagentoroben, "value")) > 0)
  then
    fibaro:call(LEDstripe, "startProgram", "286")               --Rot blinken
    fibaro:call(lichtgarage, "turnOn")
    fibaro:debug('Tor wird geöffnet')
    fibaro:sleep(5*60*1000)
    fibaro:call(lichtgarage, "turnOff")
    fibaro:debug('Licht aus')
  end

und der hier auch nicht


function nachtbeleuchtung()
if (tonumber(fibaro:getValue(garagentoroben, "value")) == 0 ) and ((sonnenaufgang > os.date("%H:%M", os.time())) or (os.date("%H:%M", os.time()) > sonnenuntergang))
or (tonumber(fibaro:getValue(garagentorunten, "value")) == 0 ) and ((sonnenaufgang > os.date("%H:%M", os.time())) or (os.date("%H:%M", os.time()) > sonnenuntergang))
then fibaro:sleep (15*1000)                                                                           --15 Sek warten damit es erst grün leuchtet nach öffnen
     fibaro:call(LEDstripe, "setValue", {R="255",G="255",B="255",W="255"})
end
setTimeout(nachtbeleuchtung, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
  nachtbeleuchtung()
end

Die Values im Header sind Fenstersensoren?
Einer oben, einer unten?

ja.

Ich hätte die Funktion und das if dafür mal rausgenommenen, also auskommentieren von Zeile:
19, 45-48

hi hoggle,

hab ich gemacht.
der debug schreibt dann folgendes

[DEBUG] 13:00:07: Tor geöffnet
[DEBUG] 13:00:22: Tor geschlossen

ohne dass es Bewegung gegeben hätte…
es leuchtet noch immer nur grün.

es sieht so aus, als ob ich an der ersten “if” abfrage noch ein problem hätte…

und es gibt ne meldung “to many instances”

Hast du an dem Motor für das Tor ein Z-Wave-Relais? Und steuerst das Tor damit?

Ist 0 der Zustand für Kontakt geschlossen? Oben wie unten?