Blutiger Anfänger sucht Hilfe

Hallo zusammen,
erstmal großes Lob an das Forum hier da man hier sehr viel findet und auch viele Erklärungen hat.
Ich bin seit kurzem Besitzer eines HC2 und möchte damit einige Sachen in meinen neuem Haus steuern (Licht, Steckdosen und vielleicht Heizung).
Ich habe lange nach einem SmartHome System gesucht und auch viel gelesen bis ich zu dem Entschluss gekommen bin mir das HC2 zu kaufen.
Bis jetzt habe ich einen Wall Plug , Button , Motion Sensor und Philips Hue Bridge mit Led Strip.
Die Komponenten in das HC2 aufzunehmen war noch leicht und auch das ich mit dem Button den Wall Plug steuern kann auch.
Jetzt bin ich an den Punkt angekommen wo LUA ins Spiel kommt was für mich nur böhmische Dörfer sind :-(.
Mein derzeitiges Problem an dem ich schon seit Tagen sitze und viel lese ist den Led Strip mit den Motion Sensor zu schalten.
Das der MS die Led Strip Bewegung anschaltet und der Strip dann wenn keine Bewegung mehr ist ausschalten soll habe ich schon hinbekommen.

Hier mit:

–[[
%% properties
20 value
%% globals
–]]
local sensors = {20}
local phillips hue = {25}
local delay = 0
local debug = true

function actionsMotion ()
fibaro:call(25, “turnOn”);
fibaro:debug(‘Führe Aktionen bei Bewegungserkennung aus’)
end

function actionsNoMotion()
fibaro:call(25, “turnOff”)
fibaro:debug(‘Führe Aktionen nach Ende Bewegung aus’)
end

local instances = tonumber(fibaro:countScenes());

function getSensorStatus()
for i,n in ipairs(sensors) do
if (tonumber(fibaro:getValue(n, “value”)) > 0) then
return 1;
end
end
return 0;
end

function getLastBreach()
local breach = 0;
for i,n in ipairs(sensors) do
local nBreach = tonumber(fibaro:getValue(n, “lastBreached”));
if(nBreach > breach) then
breach = nBreach;
end
end
return breach;
end

function checkMotion()
lastBreached = getLastBreach();
time = os.time();
if (debug) then fibaro:debug(“Zuletzt ausgelöst: Vor “…(time-lastBreached)…” Sekunden”); end
if (getSensorStatus() == 1) then
return true;
end

if ((time-lastBreached)>=delay) then
return false;
end
return true;
end

local lastBreached = getLastBreach()

if (fibaro:getSourceTriggerType() == ‘property’ and getSensorStatus() == 1) then
if (instances > 1) then fibaro:abort(); end
fibaro:debug(‘Bewegung im Raum erkannt - Starte Timer’)
actionsMotion()
while (checkMotion()) do
fibaro:sleep(5000);
end
if (debug) then fibaro:debug(“Keine Bewegung mehr erkannt.”); end
actionsNoMotion()
end

Jetzt möchte ich einfach nur noch das dieses nur zu bestimmten Zeiten passiert und da sind wir schon bei dem eigentlichen Problem wo ich nur Bahnhof verstehe.
Ich habe auch schon Variablen angelegt TimeOfDay usw.

Ich habe auch schon eine Szene angelegt die die Tageszeit abfragt. ( glaub ich zumindest )

–[[
%% properties
20 value
%% globals
–]]


local day = {9, 00};
local night = {23, 59};

local SunSet = fibaro:getValue(1, “sunsetHour”)
fibaro:debug('Sonne geht unter: ’ …SunSet);
local Sunrise = fibaro:getValue(1, “sunriseHour”)
fibaro:debug('Sonne geht auf: ’ …Sunrise);

if fibaro:countScenes() > 1 then
fibaro:debug(“stop scene”);
fibaro:abort();
end

local day = os.date("%H:%M", -3600+ day[1]6060 + day[2]*60);
local night = os.date("%H:%M", -3600+ night[1]6060 + night[2]*60);
local ostime = os.date("%H:%M", os.time());

if (night > fibaro:getValue(1, “sunriseHour”) and (ostime >= night or ostime < fibaro:getValue(1, “sunriseHour”)))
or (night < fibaro:getValue(1, “sunriseHour”) and ostime >= night and ostime < fibaro:getValue(1, “sunriseHour”)) then
fibaro:debug(“Nacht”);
fibaro:setGlobal(“TimeOfDay”, “Night”);
–fibaro:abort();
end

if ((ostime >= fibaro:getValue(1, “sunsetHour”) or ostime < night) and night < fibaro:getValue(1, “sunriseHour”))
or (ostime >= fibaro:getValue(1, “sunsetHour”) and ostime < night) then
fibaro:debug(“Abend”);
fibaro:setGlobal(“TimeOfDay”, “Evening”);
–fibaro:abort();
end

if ostime >= day and ostime < fibaro:getValue(1, “sunsetHour”) then
fibaro:debug(“Tag”);
fibaro:setGlobal(“TimeOfDay”, “Day”);
–fibaro:abort();
end

if ostime >= fibaro:getValue(1, “sunriseHour”) and ostime < day then
fibaro:debug(“Sonnenaufgang”);
fibaro:setGlobal(“TimeOfDay”, “Morning”);
–fibaro:abort();
end

Es wäre Super wenn ihr mir vielleicht helfen könntet und ich vielleicht dann so einige Dinge verstehe.

Hi,

Willst Du eine Zeitspanne zwischen zwei fixen Uhrzeiten oder während einer bestimmten TimeOfDay nutzen?

Viele Grüße Hoggle

Ich hätte es gern so das z.B. der MS die Hue nur in der Zeit von 20:00 - 6:00 Uhr schaltet und den Rest des Tagen nicht.

392 ist mein MS

Hinter THEN kannst Du Deine AKtion setzen

 --[[
%% properties
392 value
%% globals
--]]

--Wenn der Bewegungsmelder im SchalZi Mo-Fre zw 5:50-6:20 UHr Bewegung registriert,
--wird das Radio im Bad gestartet 

local currentTime = os.date("%H:%M");
local startSource = fibaro:getSourceTrigger();
local currentDate = os.date("*t");

 if ( currentTime >= "05:45"  and currentTime < "06:20" and
    ( (currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6) ) and
      -- nur Mo bis Freitag
    ( tonumber(fibaro:getValue(392, "value")) > 0 ) and
  	  tonumber(fibaro:getGlobalValue("Feiertag_heute")) == tonumber("0") )
  
then
  fibaro:setGlobal("SONOS_RADIO", "radiohamburg.hoerradar.de/radiohamburg-live-mp3-192?");
  fibaro:call(254, "setSlider", "6", "6");
  --letzter Wert setzt Lautstärke
  fibaro:call(254, "pressButton", "1");

else
  --fibaro:debug("es ist NICHT zwischen der relevantzen Zeit - no action");
end

Hallo Alex,

hiermit sollte es klappen.
Du musst nur deine IDs (Trigger, Motion und ID) in den entsprechenden Zeilen anpassen:

--[[
%% properties
XX value
%% globals
--]]

--- ### Variablen ### ---
local id = YY;
local motion = XX;

---------------------- ### Code ### ----------------------
currentDate = os.date("*t");

if tonumber(fibaro:getValue(motion, "value")) > 0 then
fibaro:debug(' ' .. currentDate.hour..':'.. currentDate.min.. ' Uhr') 

	if ((string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) < "20:00") and
  	(string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) > "06:00")) then
       fibaro:debug("Motion ausgelöst – aber es ist NICHT zwischen 20 und 6 Uhr");
	else
	fibaro:debug ((os.date("Es ist %H:%M Uhr - Licht wird eingeschaltet")));
	fibaro:call(id, "turnOn");
	end
else
	if ((string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) < "20:00") and
  	(string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) > "06:00")) then
fibaro:debug("Motion sicher – aber es ist NICHT zwischen 20 und 6 Uhr");
	else
	fibaro:debug ((os.date("Es ist %H:%M Uhr - Licht wird ausgeschaltet")));
	fibaro:call(id, "turnOff");
	end

end

Vielen Dank, klappt super!!!
Ist einfach nur Klasse hier da man gleich hilfe bekommt!
PS: ich denke mal das ich in der nächsten Zeit noch ein paar mal die Hilfe von euch in Anspruch nehmen muss…

LG. Alex

Gleich mal noch schnell eine Frage.
Ich habe ja die Philips Hue über das Plugin installiert.
Warum wird es im HC2 nicht als Lampe angezeigt so das man sieht das in einen bestimmten Raum das Licht an ist?

Funktioniert mit der aktuellen Firmware-Version nicht. Möglicherweise kommt das noch…

Gruß

Nabend :slight_smile:

wie müsste denn das Ganze bei den Variablen “TimeofDay” eingerichtet werden?

Momentan sieht mein Script so aus (glaube ist sogar von Hoggle =) )

--[[
%% properties
67 value
%% events
%% globals
--]]

local sensors = {67}

local delay = 80
local debug = false
local hueID = 98

function actionsMotion()
fibaro:debug('Führe Aktionen bei Bewegungserkennung aus')
 
	fibaro:call(hueID, "changeBrightness", 255)
	fibaro:call(hueID, "changeHue", 9231)
	fibaro:call(hueID, "changeSaturation", 150)
	fibaro:call(hueID, "turnOn")
end

function actionsNoMotion()
 fibaro:debug('Führe Aktionen nach Ende Bewegung aus')
  
  fibaro:call(hueID, "turnOff")

end

local instances = tonumber(fibaro:countScenes());

function getSensorStatus()
for i,n in ipairs(sensors) do
 if (tonumber(fibaro:getValue(n, "value")) > 0) then
  return 1;
 end
end
 return 0;
end

function getLastBreach()
local breach = 0;
for i,n in ipairs(sensors) do
 local nBreach = tonumber(fibaro:getValue(n, "lastBreached"));
 if(nBreach > breach) then
  breach = nBreach;
 end
end
 return breach;
end

function checkMotion()
lastBreached = getLastBreach();
time = os.time();
if (debug) then fibaro:debug("Zuletzt ausgelöst: Vor "..(time-lastBreached).." Sekunden"); end
if (getSensorStatus() == 1) then
 return true;
end

if ((time-lastBreached)>=delay) then
 return false;
end
 return true;
end

local lastBreached = getLastBreach()

if (fibaro:getSourceTriggerType() == 'property' and getSensorStatus() == 1) then
 if (instances > 1) then fibaro:abort(); end
  fibaro:debug('Bewegung im Raum erkannt - Starte Timer')
  actionsMotion()
 while (checkMotion()) do
  fibaro:sleep(5000);
 end
if (debug) then fibaro:debug("Keine Bewegung mehr erkannt."); end
 actionsNoMotion()
end

Habe 3 Variablen wo das Licht bei Bewegung angehen soll.

if (
 ( fibaro:getGlobalValue("TimeOfDay") == "Evening" )
or
 ( fibaro:getGlobalValue("TimeOfDay") == "Morning Selina" )
or
 ( fibaro:getGlobalValue("TimeOfDay") == "Morning Chris" )

Nur bei der Variable “Day” soll es ausbleiben bei Bewegung.

Das Script für das Setzen der globalen Var ToD nutzt du?

Deine Bedingung kannst du zB nach Zeile 14 beginnen und das end kommt nach jetziger Zeile 20.

Moin Hoggle, vielen Dank für die Antworten, habe die jetzt gerade erst gesehen.

Ich habe eine Variable mit 5 Vordefinierten Werten (Morning, Day, etc.) , welche durch einzelne Szenen geschaltet werden.

Habe gestern Abend noch schnell versucht das so zu lösen (denke gleicht dem was du geschrieben hast):

--[[
%% properties
67 value
%% events
%% globals
--]]

local sensors = {67}

local delay = 120
local debug = false
local hueID = 98

function actionsMotion()
if (
 ( fibaro:getGlobalValue("TimeOfDay") == "Evening" )
or
 ( fibaro:getGlobalValue("TimeOfDay") == "Morning Selina" )
or
 ( fibaro:getGlobalValue("TimeOfDay") == "Morning Chris" )
and
 ( tonumber(fibaro:getValue(67, "value")) > 0 )  
fibaro:debug('Führe Aktionen bei Bewegungserkennung aus')
 
	fibaro:call(hueID, "changeBrightness", 255)
	fibaro:call(hueID, "changeHue", 9231)
	fibaro:call(hueID, "changeSaturation", 150)
	fibaro:call(hueID, "turnOn")
end

function actionsNoMotion()
 fibaro:debug('Führe Aktionen nach Ende Bewegung aus')
  
  fibaro:call(hueID, "turnOff")

end

local instances = tonumber(fibaro:countScenes());

function getSensorStatus()
for i,n in ipairs(sensors) do
 if (tonumber(fibaro:getValue(n, "value")) > 0) then
  return 1;
 end
end
 return 0;
end

function getLastBreach()
local breach = 0;
for i,n in ipairs(sensors) do
 local nBreach = tonumber(fibaro:getValue(n, "lastBreached"));
 if(nBreach > breach) then
  breach = nBreach;
 end
end
 return breach;
end

function checkMotion()
lastBreached = getLastBreach();
time = os.time();
if (debug) then fibaro:debug("Zuletzt ausgelöst: Vor "..(time-lastBreached).." Sekunden"); end
if (getSensorStatus() == 1) then
 return true;
end

if ((time-lastBreached)>=delay) then
 return false;
end
 return true;
end

local lastBreached = getLastBreach()

if (fibaro:getSourceTriggerType() == 'property' and getSensorStatus() == 1) then
 if (instances > 1) then fibaro:abort(); end
  fibaro:debug('Bewegung im Raum erkannt - Starte Timer')
  actionsMotion()
 while (checkMotion()) do
  fibaro:sleep(5000);
 end
if (debug) then fibaro:debug("Keine Bewegung mehr erkannt."); end
 actionsNoMotion()
end

nur dann passiert gar nichts mehr…

VG Chris

Bau mal nach Zeile 14 einen Debug für TimeOfDay ein.

In Zeile 30 fehlt das end zu deiner If-Schleife.

Hallo Chris,

In der Funktion fehlt m.E. ein thenund ein end.

Schau mal ob es so klappt:

function actionsMotion()
if  fibaro:getGlobalValue("TimeOfDay") == "Evening" or fibaro:getGlobalValue("TimeOfDay") == "Morning Selina" or fibaro:getGlobalValue("TimeOfDay") == "Morning Chris" and  tonumber(fibaro:getValue(67, "value")) > 0 then
	fibaro:call(hueID, "changeBrightness", 255);
	fibaro:call(hueID, "changeHue", 9231);
	fibaro:call(hueID, "changeSaturation", 150);
	fibaro:call(hueID, "turnOn");
	end
end

Hallo nevv,

natürlich, das then muss ja noch rein… eigentlich logisch, aber wieder mal verpeilt.
das zweite end bezieht sich dann auf die variablen oder?

Läuft auf jeden Fall so , Merci :slight_smile:

Nein, auf das IF

Ah ok. also jede Angabe (if, then usw.) muss dann mit einem end am Schluss beendet werden?

https://www.lua.org/pil/4.3.1.html