Hej,
Totalt okunnig i LUA programering men lär mig sakta men säkert.
Har ett förrådsrum som har dörrsensor, rörelsesensor och en "puck" för styrning av lampa i taket.
Enhetsnumren är:
298 = Dörr sensor
282 = LAMPA
302 = Rörelse Sensor
Allt är Fibaro produkter
Det jag vill åstadkomma är följande:
1. När dörren öppnas skall lampan tändas
2. När det inte varit någon rörelse i förrådet på 5minuter (300sekunder) skall lampan släckas även om dörren är öppen.
3. Om lampan slocknar men dörren är öppen och det sker ny rörelse i rummet skall lampan tändas igen.
4. När dörren stängs skall lampan släckas.
Har i dag byggt detta med "Block Scener", men det går (i mitt fall) åt fyra stycken olika scener för att fixa detta och får mycket "felmeddelanden" om "för många samtidigt aktiva instanser av scenerna".
Skulle därför vilja bygga detta i LUA, men har för lite kunskap för att klara av.
Är det någon vänlig själ som kan hjälpa mig?
Hjälp med LUA scen - Förrådsbelysning
-
- Medlem
- Posts: 45
- Joined: 08 Nov 2015, 11:23
- 8
Hej Jompa68,
Nej ingen LUA hjälp ännu. Fick Tips på Fibaro forumet att inte använda släck regeln efter 5min (idag gjord i Block scen) utan istället sätta parameter på "pucken" hur länge det skall lysa efter "on" och sedan bara ha block regler för av/på vid dörr öppning/stängning samt vid rörelse.
Det fungerar säkert, men skulle vilja ha hela min ursprungliga funktion i LUA scen/scener om inte annat för att få chans att lära mig lite mer om LUA programmering.
Nej ingen LUA hjälp ännu. Fick Tips på Fibaro forumet att inte använda släck regeln efter 5min (idag gjord i Block scen) utan istället sätta parameter på "pucken" hur länge det skall lysa efter "on" och sedan bara ha block regler för av/på vid dörr öppning/stängning samt vid rörelse.
Det fungerar säkert, men skulle vilja ha hela min ursprungliga funktion i LUA scen/scener om inte annat för att få chans att lära mig lite mer om LUA programmering.
Det finns redan 2st färdiga LUA scener som skulle kunna hjälpa dig igång med detta, antingen Controllivings (stevenvd) eller GEA(steven)
SmartLights V1.6.7 är ett skript som Stevenvd har gjort och jag har själv kört den förut och den har fungerat bra. GEA är lite mer avancerad och den klarar typ allt, den kör jag idag men har en relativt hög ingångströskel beträffande LUA så jag tycker att SmartLights är en bra ingång.
Du lär dig LUA genom att följa koden och se vad som händer relativt enkelt. Jag kan göra klart det skriptet åt dig med dina parameterar så det är bara för dig att lägga in den och sen fråga om det är något du funderar över.
Vad tror du om det? Givetvis kan jag skapa ett helt nytt skript åt dig också med timer funktion men eftersom det redan finns bra färdiga skript så varför inte använda dom.
Hojta till hur du vill ha det.
//Jonny
SmartLights V1.6.7 är ett skript som Stevenvd har gjort och jag har själv kört den förut och den har fungerat bra. GEA är lite mer avancerad och den klarar typ allt, den kör jag idag men har en relativt hög ingångströskel beträffande LUA så jag tycker att SmartLights är en bra ingång.
Du lär dig LUA genom att följa koden och se vad som händer relativt enkelt. Jag kan göra klart det skriptet åt dig med dina parameterar så det är bara för dig att lägga in den och sen fråga om det är något du funderar över.
Vad tror du om det? Givetvis kan jag skapa ett helt nytt skript åt dig också med timer funktion men eftersom det redan finns bra färdiga skript så varför inte använda dom.
Hojta till hur du vill ha det.
//Jonny
-
- Medlem
- Posts: 45
- Joined: 08 Nov 2015, 11:23
- 8
Smartlight låter väl som den bästa varianten att ta som ett första steg för att lära sig LUA. Sen får jag väl titta på GEa som steg två då man antagligen kan göra en massa annat roligt med det.
Jag har tänk att implementera detta på totalt 5-6 ställen i huset om det fungerar bra så om man kunde ha Globala parametrar i detta vore det bra så slipper man justera på så många ställen om man t.ex vill att lyset skall var på i 3 minuter istället för 5 minuter.
Skulle vara mycket tacksam om du kunde sätta ihop ett Smartlight script så skall jag sätta mig in i hur det är uppbyggt och kommer säkert med lite frågor
Jag har tänk att implementera detta på totalt 5-6 ställen i huset om det fungerar bra så om man kunde ha Globala parametrar i detta vore det bra så slipper man justera på så många ställen om man t.ex vill att lyset skall var på i 3 minuter istället för 5 minuter.
Skulle vara mycket tacksam om du kunde sätta ihop ett Smartlight script så skall jag sätta mig in i hur det är uppbyggt och kommer säkert med lite frågor
Då ska vi se...här är nu en färdig scen (tror den ska lira direkt utan nödvändiga förändringar)
Finns några krav för scenen:
3st variabler, SleepState, TimeOfDay och PresenState. Dessa 3 ska skapas som fördefinerade variabler och innehålla dessa värden(men du kan ändra dom till vad du själv önskar med då måste koden ändras lite, rad 32-36)
sleepStateMapping = {Sleeping="Sleeping", Awake="Awake"};
timeOfDayMapping = {Morning="Morning", Day="Day", Evening="Evening", Night="Night"};
presentStateMapping = {Home="Home", Away="Away", Holiday="Holiday"};
Nåt mer du önskar få svar på så fråga på
Finns några krav för scenen:
3st variabler, SleepState, TimeOfDay och PresenState. Dessa 3 ska skapas som fördefinerade variabler och innehålla dessa värden(men du kan ändra dom till vad du själv önskar med då måste koden ändras lite, rad 32-36)
sleepStateMapping = {Sleeping="Sleeping", Awake="Awake"};
timeOfDayMapping = {Morning="Morning", Day="Day", Evening="Evening", Night="Night"};
presentStateMapping = {Home="Home", Away="Away", Holiday="Holiday"};
Nåt mer du önskar få svar på så fråga på
Code: Select all
--[[
%% properties
298 value
302 value
%% globals
TimeOfDay
PresentState
--]]
--[[ Change - XXX value - above. One for motion sensor, one for Light sensor.
TimeOfDay global variable and lux make sure that the scene
will be triggered when you are already in the room and something changes.
Set your settings below, lights and add extra functions
Feel free to suggest changes or contact when having problems.
It is not allowed to sell or distribute this software and earlier versions without the approval of Control Living
© 2014 - 2015 Smart lights by Control Living
Version 1.6.7
--]]
--------------------------------------------------------------------
-----------------------YOUR LIGHT SETTINGS--------------------------
motionSensorID = {302}; -- change id for your motion sensor.
LuxSensorID = {304}; -- change id for your light sensor.
--Enter the name of your Global variable. WITHOUT IT, THE SCENE DOES NOT WORK. Capital sensitive!
sleepState = "SleepState"; --Sleep globalstate variable.
timeOfDay = "TimeOfDay"; --Time of Day Global variable.
presentState = "PresentState"; --Present state Global variable.
--Enter the values of your global variables stated above. If not using, copy the name in front of the "YourValueName"
sleepStateMapping = {Sleeping="Sleeping", Awake="Awake"};
timeOfDayMapping = {Morning="Morning", Day="Day", Evening="Evening", Night="Night"};
presentStateMapping = {Home="Home", Away="Away", Holiday="Holiday"};
-- Set the lux value for which the lights have to be turned on.
-- If you don't want to use the MinLux then just set it to: 65535
minLuxMorning = 65535;
minLuxDay = 65535;
minLuxEvening = 65535;
minLuxNight = 65535;
--If the current lux value is above the maxlux, the lights will turn off after their set onTime.
maxLuxMorning = 300;
maxLuxDay = 300;
--[[
Now the most important part:
Here you can enter what light, for how long and at what value has to be turned on.
Leave empty brackets for no lights.
To set the light value without timer use 2 parameters: {id=LightID, setValue="VALUE"}
To set the light value with timer use 3 parameters: {id=LightID, setValue="VALUE", onTime=timeInSeconds }
To set the light value for RGBW: use the above, where setValue is: setValue={R="255",G="255",B="255",W="255"}
-- RGBW set: {id=LightID, setValue={R="255",G="255",B="255",W="255"}, onTime=timeInSeconds }
--]]
lightsSleeping = {}; --lights that are triggered when Sleepstate is sleeping.
lightsMorning = {{id=282, setValue="turnOn", onTime=300}};
lightsDay = {{id=282, setValue="turnOn", onTime=300}};
lightsEvening = {{id=282, setValue="turnOn", onTime=300}};
lightsNight = {{id=282, setValue="turnOn", onTime=300}};
--Manual Override, the time that lights will not be turned ON again after manually turning them off.
OverrideFor = 90;
dimmDownTime = 10;
--------------------------------------------------------------------
-------------------------EXTRA FEATURES-----------------------------
extraMorningFunc = function()
-- Add your extra code here. If you want some checks or maybe run a virtual device button.
--This code is always triggered if there is motion.
-- movieLights = {{180, "10"},{181, "10"} };
--if (xbmc == "playing" ) then CallLightArray(movieLights);
ExtraDebug("Extra morning function called");
end
extraDayFunc = function()
-- Add your extra code here. If you want some checks or maybe run a virtual device button.
--This code is always triggered if there is motion.
ExtraDebug("Extra day function called");
end
extraEveningFunc = function()
-- Add your extra code here. If you want some checks or maybe run a virtual device button.
--This code is always triggered if there is motion.
ExtraDebug("Extra evening function called");
end
extraNightFunc = function()
-- Add your extra code here. If you want some checks or maybe run a virtual device button.
--This code is always triggered if there is motion.
ExtraDebug("Extra night function called");
end
extraLightTriggerChecks = function()
--add extra checks here. and return the total true or false value.
--if returning false the lights will not be triggered.
-- for instance: return ( (pcTurnedOff == true ) and (xbmc ~= "Empty") );
-- return true to enable lights to turn on
return true;
end
extraOffChecks = function()
--return true to keep lights on.
return false;
end
--------------------------------------------------------------------
----------------------ADVANCES SETTINGS-----------------------------
local showStandardDebugInfo = true; -- Debug shown in white
local showExtraDebugInfo = false; -- Debug shown in orange
--------------------------------------------------------------------
--------------------------------------------------------------------
-- DO NOT CHANGE THE CODE BELOW --
--------------------------------------------------------------------
--UPDATE FROM HERE
--private variables
startSource = fibaro:getSourceTrigger();
keepLightsOn = false;
timerRunning = false;
previousLights = nil;
version = "1.6.7";
SavedState = {
homeStatus = "",
sleepState = 0,
timeOfDay = "",
lux = 0,
motion = 0,
startTime = 0
}
CurrentState = {
homeStatus = "",
sleepState = "",
timeOfDay = "",
lux = 0,
motionState = 0,
currentLightArray = {}
}
RGBWDeviceType = { "com.fibaro.RGBW", "com.fibaro.colorController", "com.fibaro.FGRGBW441M" }
BinaryDeviceType = { "com.fibaro.binarySwitch","com.fibaro.FGWP101", "turnOn" }
DimmerDeviceType = { "com.fibaro.multilevelSwitch" }
OffModes = {None, ByScene, ManualOverride }
function Debug( color, message )
fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span"));
end
--Making sure that only one instance of the scene is running.
fibaro:sleep(50); --sleep to prevent all instances being killed.
if (fibaro:countScenes() > 1) then
if (showExtraDebugInfo) then
Debug( "grey", "Abort, Scene count = " .. fibaro:countScenes());
end
fibaro:abort();
end
--------------------------EXECUTION----------------------------------
function SetCurrentStatus()
ExtraDebug("Updating current variable statuses");
CurrentState.homeStatus = GetPresentState();
CurrentState.timeOfDay = GetTimeOfDay();
CurrentState.sleepState = GetSleepState();
CurrentState.lux = GetAverageLuxValue();
CurrentState.motionState = GetCurrentMotionStatus();
end
function SaveCurrentStatus()
ExtraDebug("Saving current variable statuses");
SavedState.homeStatus = CurrentState.homeStatus;
SavedState.timeOfDay = CurrentState.timeOfDay;
SavedState.sleepState = CurrentState.sleepState;
SavedState.lux = CurrentState.lux;
SavedState.motion = CurrentState.motionState;
end
function CheckStatusChanges()
ExtraDebug("Status change check");
if (CurrentState.homeStatus ~= SavedState.homeStatus ) or (CurrentState.timeOfDay ~= SavedState.timeOfDay ) then
if (CurrentState.homeStatus ~= presentStateMapping.Home ) then
TurnOffLights();
else
SceneTriggered();
--reset time.
end;
end
SaveCurrentStatus();
-- if we still have a motion then reset timer.
if ( (CurrentState.motionState ~= 0 or extraOffChecks() ) and not IsMaxLuxExceeded() ) then
ExtraDebug( "Resetting time" );
SavedState.startTime = os.time();
else
ExtraDebug("Timer is not reset.");
end
--any other case, we are not resetting the timer.
end
function IsMaxLuxExceeded()
if (CurrentState.timeOfDay == timeOfDayMapping.Morning and CurrentState.lux > maxLuxMorning ) then
ExtraDebug( "Current lux value: " .. CurrentState.lux .. " higher then max Lux Morning: " .. maxLuxMorning .. ".");
return true;
elseif (CurrentState.timeOfDay == timeOfDayMapping.Day and CurrentState.lux > maxLuxDay ) then
ExtraDebug( "Current lux value: " .. CurrentState.lux .. " higher then max Lux Day: " .. maxLuxDay .. ".");
return true;
end
return false;
end
function LightsOff( lightArray )
local stillLightsOn = 0;
local currentTime = os.time();
for i = 1,#lightArray do
if ( lightArray[i].onTime ~= nil) then
lightItem = lightArray[i];
lightItem.OffMode = CheckManualOverrideItem( lightItem );
--local
if ( lightItem.OffMode == "ManualOverride" ) then
ExtraDebug("Manual override for light: [" .. lightItem.id .. "]" .. lightItem.name .. " active, not turning on");
goto continue;
end
--On till:
local timeL = SavedState.startTime + (lightItem.onTime);
local timeLeft = timeL - currentTime;
if (timeLeft >= 0 ) then ExtraDebug("Time left for: [" .. lightItem.id .. "]" .. lightItem.name .. ": " .. timeLeft .. " seconds" ); end
if ( timeLeft < dimmDownTime ) then
if ( lightItem.OffMode ~= "ManualOverride" ) then
lightItem.OffMode = "ByScene";
end
if ( (timeLeft <= 0) and (lightItem.currentValue ~= 0) ) then
fibaro:call(lightItem.id, "turnOff");
StandardDebug("Switch off light: [" .. lightItem.id .. "]'" .. lightItem.name .."'");
else
if ( item.lightType == "com.fibaro.multilevelSwitch" ) then
currentValueDiv = roundit(((lightItem.currentValue) / (dimmDownTime)), 0);
currentValueNew = (lightItem.currentValue - currentValueDiv);
if (currentValueNew <=0 ) then currentValueNew = 0; end
fibaro:call(lightItem.id, "setValue", tostring(currentValueNew));
end
stillLightsOn = stillLightsOn + 1;
end
elseif (CheckLightToBeTurnedOnAgain(lightItem)) then
ExtraDebug("Turn light: " .. lightItem.id .. " back on");
turnLightOn(lightItem);
lightItem.OffMode = "";
stillLightsOn = stillLightsOn + 1;
else
lightItem.OffMode = "NoOverride";
stillLightsOn = stillLightsOn + 1;
end
end
::continue::
end
return stillLightsOn;
end
function KeepLightsOnTimer()
ExtraDebug("--------------- Timer running ---------------");
ExtraDebug("starting with while loop, to keep lights on");
SavedState.startTime = os.time();
SaveCurrentStatus();
sleepTime = 1000;
while ( keepLightsOn ) do
ExtraDebug("--------------- next timer run ---------------");
fibaro:sleep(sleepTime);
start_time = os.clock();
SetCurrentStatus();
currentLightArray = GetTimeOfDayLightArray();
UpdateLightValues(currentLightArray);
CheckStatusChanges();
local stillLightsOn = 0;
stillLightsOn = LightsOff( currentLightArray );
if (stillLightsOn == 0 ) then
keepLightsOn = RunManualOverrideMode( currentLightArray );
end_time = 0; --if lights turned back on after override.
else
end_time = os.clock()
end
elapsed_time = (end_time - start_time) * 1000;
sleepTime = 1000 - elapsed_time;
end
end
function CheckManualOverrideItem( currentItem )
--ExtraDebug("Manual override check for: [" .. currentItem.id .. "]" .. currentItem.name);
if (currentItem.currentValue == 0 and currentItem.OffMode ~= "ByScene" ) then
ExtraDebug( "Manual override for light: [" .. currentItem.id .. "]" .. currentItem.name .. " active" );
return "ManualOverride";
elseif (currentItem.currentValue ~= 0 and currentItem.OffMode == "ManualOverride" ) then
ExtraDebug( "Manual override for light: [" .. currentItem.id .. "]" .. currentItem.name .. " cancelled" );
return "NoOverride";
end
return currentItem.OffMode; --returning current mode;
end
function RunManualOverrideMode( currentLightArray )
OverrideForAll = CheckIfAllInOverrideMode(currentLightArray);
if ( OverrideForAll ) then
ExtraDebug("-----------------Override Mode---------------");
OverrideTimer = os.time();
while ( OverrideForAll and (OverrideTimer + OverrideFor ) - os.time() > 0 ) do
ExtraDebug("Still in override for: " .. (OverrideTimer + OverrideFor ) - os.time() .. " seconds" );
fibaro:sleep(1000);
UpdateLightValues(currentLightArray);
OverrideForAll = CheckIfAllInOverrideMode(currentLightArray);
motion = GetCurrentMotionStatus();
if ( motion ~= 0 ) then
OverrideTimer = os.time();
end
end
else return false;
end
-- if ( (OverrideTimer + OverrideFor ) - os.time() <= 0 ) then
--time has end. So not continue to run lights loop
-- return false;
-- end
if (OverrideForAll) then
return false; --run lights
else return true;
end
end
function CheckIfAllInOverrideMode(currentLightArray)
OverrideForAll = 0;
for i = 1,#currentLightArray do
if ( CheckManualOverrideItem(currentLightArray[i]) == "ManualOverride" ) then
OverrideForAll = OverrideForAll +1;
else
return false;
end
end
if ( OverrideForAll ~= 0 and OverrideForAll == #currentLightArray ) then
return true;
end
return false;
end
function RunTimer()
if ( keepLightsOn and not timerRunning ) then
ExtraDebug("Starting timer, not yet running");
timerRunning = true;
KeepLightsOnTimer();
else
ExtraDebug("Timer already running, returning");
end
end
function TurnOffLights()
local timeOfDayArray = GetTimeOfDayLightArray();
SetLightValues(timeOfDayArray);
UpdateLightValues(timeOfDayArray);
CallLightArray(timeOfDayArray, "off" );
return;
end
----------------------Turn lights on functions------------------------
function CallLightArray( lightArray, turnOnOrOff )
if (#lightArray == 0 ) then
if (CurrentState.sleepState == sleepStateMapping.Sleeping) then
noLightsSetText = "lightsSleeping";
else
noLightsSetText = CurrentState.timeOfDay;
end
StandardDebug( "No lights set for " .. noLightsSetText );
return;
end
if not ( CheckIfTable(lightArray, "lights" .. CurrentState.timeOfDay ) ) then return end
for i = 1,#lightArray do
if not ( CheckIfTable(lightArray[i], "lights" .. CurrentState.timeOfDay ) ) then break end
lightItem = lightArray[i];
if (turnOnOrOff == "on" ) then
turnLightOn(lightItem);
if (lightItem.onTime ~= nil) then keepLightsOn = true; end
else
fibaro:call(lightItem.id, "turnOff"); --Always turn off, if HC2 light status is not actual.
if ( lightItem.currentValue ~= 0) then
keepLightsOn = false;
StandardDebug("Switch off light: [" .. lightItem.id .. "]'" .. lightItem.name .."'");
end
end
end
StandardDebug( "Lights turned: " .. turnOnOrOff .. " for " .. CurrentState.timeOfDay );
end
function turnLightOn( lightItem )
if (lightItem.lightType == "com.fibaro.multilevelSwitch" ) then
fibaro:call(lightItem.id, "setValue", tostring(lightItem.setValue));
StandardDebug( "Set: [" .. lightItem.id .. "]'" .. lightItem.name .. "' to Value: " .. lightItem.setValue );
elseif ( lightItem.lightType == "com.fibaro.RGBW" )then
StandardDebug( "Turn: [" .. lightItem.id .. "]'" .. lightItem.name .. "' On");
if ( lightItem.setValue.brg~= nil ) then
fibaro:call(lightItem.id, "setBrightness", tostring(lightItem.setValue.brg));
else
local clrvalues =lightItem.setValue;
fibaro:call(lightItem.id, "setColor", clrvalues.R, clrvalues.G, clrvalues.B, clrvalues.W)
end
elseif (lightItem.lightType == "com.fibaro.binarySwitch") then
fibaro:call(lightItem.id, "turnOn");
StandardDebug( "Turn: [" .. lightItem.id .. "]'" .. lightItem.name .. "' On");
end
end
function CheckPreviousLights( NewLightArray )
if ( previousLights ~= nil ) then
for i = 1,#previousLights do
local lightItem = previousLights[i];
for i = 1,#NewLightArray do
local lightItem1 = NewLightArray[i];
inarray = false;
if ( lightItem.id == lightItem1.id ) then
inarray= true;
break
end
end
if not ( inarray ) then fibaro:call(lightItem.id, "turnOff"); end
end
end
previousLights = NewLightArray;
end
function LightperDayPart( minLux, lightArray )
local newLuxValue = CurrentState.lux;
if ( extraLightTriggerChecks() ) then
if ( newLuxValue > minLux ) then
StandardDebug( "Sensor lux: " .. newLuxValue .. " higher then minValue: " .. minLux .. " : no action");
else
StandardDebug("Sensor lux: " .. newLuxValue .. " is lower then minValue: " .. minLux);
SetLightValues(lightArray);
CallLightArray( lightArray, "on" );
CheckPreviousLights( lightArray );
end
else
ExtraDebug("ExtraLightTriggerChecks failed, so no lights");
end
end
function SceneTriggered()
if ( CurrentState.homeStatus ~= presentStateMapping.Home ) then
ExtraDebug("Presentstate = not at home, so no lights");
elseif ( CurrentState.sleepState == sleepStateMapping.Sleeping ) then
LightperDayPart( 65535, lightsSleeping );
elseif ( CurrentState.timeOfDay == timeOfDayMapping.Morning ) then
extraMorningFunc();
LightperDayPart( minLuxMorning, lightsMorning );
elseif ( CurrentState.timeOfDay == timeOfDayMapping.Day ) then
extraDayFunc();
LightperDayPart( minLuxDay, lightsDay );
elseif ( CurrentState.timeOfDay == timeOfDayMapping.Evening ) then
extraEveningFunc();
LightperDayPart( minLuxEvening, lightsEvening );
elseif ( CurrentState.timeOfDay == timeOfDayMapping.Night ) then
extraNightFunc();
LightperDayPart( minLuxNight, lightsNight );
else
ErrorDebug( "No lights: " .. CurrentState.timeOfDay );
end
if (keepLightsOn == true) then
RunTimer();
end
end
function SceneTriggeredByLights( st )
if (st == "off") then
ExtraDebug( "light turned off, sleep 4 sec" );
fibaro:sleep(4000);
elseif (st == "on") then
ExtraDebug( "light turned on, activating timer" );
fibaro:sleep(4000);
--TODO: add light to current array.
--keepLightsOn = true;
--RunTimer();
end
end
------------------------STATUS functions------------------------------
function GetTimeOfDay()
return LookupGlobal( timeOfDay, "TimeOfDay", "Day");
end
function GetSleepState()
return LookupGlobal( sleepState, "sleepState", "Awake");
end
function GetPresentState()
return LookupGlobal( presentState, "presentState", "Home");
end
function LookupGlobal( name, stateName, default )
local ps = fibaro:getGlobalValue( name );
if ( (ps ~= "") and (ps ~= nil ) ) then
ExtraDebug("returned " .. stateName .. ": " .. ps );
return ps;
else
ErrorDebug( stateName .. " variable not found");
return default;
end
end
function lightsStatus( id )
--check if lights are already on.
allLights = {lightsSleeping, lightsMorning, lightsDay, lightsEvening, lightsNight };
for i = 1,#allLights do
for iL = 1, #allLights[i] do
local lightItem = allLights[i][iL];
if ( lightItem.id == tonumber(id) ) then
if ( lightItem.currentValue == 0 ) then
return "off";
else
return "on";
end
end
end
end
ErrorDebug("Light status unknown");
return "Unknown";
end
function GetTimeOfDayLightArray()
if ( CurrentState.sleepState == sleepStateMapping.Sleeping ) then
return lightsSleeping;
elseif ( CurrentState.timeOfDay == timeOfDayMapping.Morning ) then
return lightsMorning;
elseif ( CurrentState.timeOfDay == timeOfDayMapping.Day ) then
return lightsDay;
elseif ( CurrentState.timeOfDay == timeOfDayMapping.Evening ) then
return lightsEvening;
elseif ( CurrentState.timeOfDay == timeOfDayMapping.Night ) then
return lightsNight;
end
end
function GetCurrentMotionStatus()
local sensorbreached = 0;
if (CheckIfTable(motionSensorID, "motionSensorID") ) then
for i = 1,#motionSensorID do
if ( tonumber(fibaro:getValue(motionSensorID[i], "value")) > 0 ) then
sensorbreached = 1;
end
end
else
--if not a table, just return the value of the containing ID
sensorbreached = tonumber(fibaro:getValue(motionSensorID, "value"))
end
return sensorbreached;
end
function GetAverageLuxValue()
local luxAverage = 0;
if (CheckIfTable(LuxSensorID, "LuxSensorID") ) then
if (#LuxSensorID == 1) then
return tonumber(fibaro:getValue(LuxSensorID[1], "value"));
end
for i = 1,#LuxSensorID do
luxAverage = luxAverage + tonumber(fibaro:getValue(LuxSensorID[i], "value"));
end
luxAverage = roundit( (luxAverage / #LuxSensorID), 0 );
else
--if not a table, just return the value of the containing ID
luxAverage = tonumber(fibaro:getValue(LuxSensorID, "value"));
end
return luxAverage;
end
function UpdateLightValues( currentArray )
for i = 1,#currentArray do
item = currentArray[i];
newValue = fibaro:getValue(item.id, "value");
item.currentValue = tonumber(newValue) ~= nil and tonumber(newValue) or ( newValue == "true" and 1 or 0 );
if ( item.lightType == "com.fibaro.RGBW" )then
color = fibaro:getValue(item.id, "color");
c = {R="0", G="0", B="0", W="0", brg="0" }
c.R, c.G, c.B, c.W = color:match("([^,]+),([^,]+),([^,]+),([^,]+)");
c.brg = fibaro:getValue(item.id, "brightness");
item.currentValue = c;
end
end
end
function SetLightValues(currentArray)
for i = 1,#currentArray do
item = currentArray[i];
item.name = tostring(fibaro:getName(item.id));
item.OffMode = "NoOverride";
if (item.name == nil) then item.name = "Unknown"; end
item.lightType = GetDeviceType( item.id );
end
end
function GetDeviceType(itemId)
deviceType = fibaro:getType(item.id);
if ( idIsInList(deviceType, RGBWDeviceType) ) then
deviceType ="com.fibaro.RGBW";
elseif ( idIsInList(deviceType, BinaryDeviceType) ) then
deviceType = "com.fibaro.binarySwitch";
elseif ( idIsInList(deviceType, DimmerDeviceType ) ) then
deviceType = "com.fibaro.multilevelSwitch";
--elseif( ) then
--deviceType = "Philips.Hue";
end
return deviceType;
end
--------------------Helper functions--------------------------------
function CheckLightToBeTurnedOnAgain(lightItem)
if not (lightItem.OffMode=="ByScene") then return; end
if (lightItem.lightType == "com.fibaro.multilevelSwitch" ) then
if (lightItem.currentValue) < tonumber(lightItem.setValue) then return true; end
elseif( lightItem.lightType == "com.fibaro.RGBW" )then
c = lightItem.currentValue;
if (c.R == "0" and c.G == "0" and c.B == "0" and c.W == "0" ) then
return true;
end
elseif (lightItem.lightType == "com.fibaro.binarySwitch") then
if (lightItem.setValue == "turnOn" and lightItem.currentValue == 0 ) then return true; end
end
return false;
end
function CheckIfTable( array, arrayname )
local tableCheck = tostring( type( array ) );
if ( tableCheck ~= "table" ) then
ErrorDebug("Missing brackets for variable: '" .. arrayname .. "', please place extra brackts: { } around: " .. array .. ".");
return false;
end
return true;
end
function roundit(num, idp)
local mult = 10^(idp or 0)
return math.floor(num * mult + 0.5) / mult
end
function idIsInList( startSourceId, sensorList )
for i = 1,#sensorList do
if ( startSourceId == sensorList[i] ) then
return true;
end
end
return false;
end
--------------------Debugging Functions-----------------------------
function StandardDebug( debugMessage )
if ( showStandardDebugInfo ) then
Debug( "white", debugMessage);
end
end
function ExtraDebug( debugMessage )
if ( showExtraDebugInfo ) then
Debug( "orange", debugMessage);
end
end
function ErrorDebug( debugMessage )
Debug( "red", "Error: " .. debugMessage);
Debug( "red", "");
end
function TestDebug(debugMessage )
Debug( "blue", "Testing: " .. debugMessage );
end
----------------------START OF THE SCENE----------------------------
SetCurrentStatus();
StandardDebug("Home status: " .. CurrentState.homeStatus );
StandardDebug("Motion status: " .. ( CurrentState.motionState == 0 and "No movement" or "movement"));
if (startSource["type"] == "property") then
startSourceID = tonumber(startSource['deviceID']);
triggerDebug = "Triggered by: " .. startSourceID;
if ( idIsInList( startSourceID, motionSensorID ) ) then
StandardDebug( triggerDebug .. " Motion sensor" );
if ( CurrentState.motionState > 0 ) then
SceneTriggered();
end
elseif ( idIsInList( startSourceID, LuxSensorID ) ) then
StandardDebug( triggerDebug .. " Lux sensor" );
ExtraDebug( "Lux value changed to: " .. CurrentState.lux );
if ( CurrentState.motionState > 0 ) then
SceneTriggered();
end
else
StandardDebug( triggerDebug .. " Light switch" );
st = lightsStatus( startSourceID );
if (st == "Unknown") then
ErrorDebug( "Unknown light trigger" );
else
SceneTriggeredByLights( st );
end
-- Maybe we can change the light preset to make it more intelligent.
-- Maybe we can change the Lux preset to make it more intelligent.
end
elseif ( startSource["type"] == "global" ) then
StandardDebug( "Triggered by: " .. "global variable" );
-- If home status away, we trigger so the current array will be turned off. If motion, turn them on.
if (CurrentState.homeStatus ~= presentStateMapping.Home) then
TurnOffLights();
elseif (CurrentState.motionState > 0 ) then
SceneTriggered();
end
else
StandardDebug( "Triggered by: " .. startSource["type"] .. " , Not checking the motion state." );
--Just run the Light Code, not checking for motion. Probably triggered manually.
if ( startSource["type"] == "other" ) then
SceneTriggered();
end
end
Debug( "green", "© Smart Lights V" .. version .. " | by Control Living, Finished" );
Debug( "green", "-------------------------------------------------------" );
--fibaro:abort(); --otherwise scene will stay alive to long.
--UPDATE TILL HERE
-
- Medlem
- Posts: 45
- Joined: 08 Nov 2015, 11:23
- 8
Stort tack Jompa!
Har inte hunnit testa ännu, kommer ta ett par dagar att testa och gå igenom koden. Betydligt mer kod än vad jag förväntat mig, men går ju antagligen att göra mer med koden än den funktion jag är ute efter.
Vågar inte ens fundera på hur GEA koden ser ut
Men kan ändå passa på att fråga, vad är fördelen med GEA jämfört mot denna? Du skrev att du kört denna tidigare men nu bytt till GEA, vad var anledningen till det?
Har inte hunnit testa ännu, kommer ta ett par dagar att testa och gå igenom koden. Betydligt mer kod än vad jag förväntat mig, men går ju antagligen att göra mer med koden än den funktion jag är ute efter.
Vågar inte ens fundera på hur GEA koden ser ut
Men kan ändå passa på att fråga, vad är fördelen med GEA jämfört mot denna? Du skrev att du kört denna tidigare men nu bytt till GEA, vad var anledningen till det?
GEA, är ett färdigt script som du sen lägger in rader i.
Nu tänker jag inte skriva hela lösningen här och nu, då jag måste springa iväg...
Men det du får lägga in själv är typ..
Denna raden tänder när min PIR i köket registrerar rörelse men bara mellan 23:12 på kvällen tills efter Soluppgång
Och denna raden släcker lampan efter 10min
Med sådan kod snuttar borde man kunna lösa dina behov hyffsat enkelt. BLir la kanske 4 rader kod du behöver skapa.. O dessa kommer likna mina 2 rader.
Nu tänker jag inte skriva hela lösningen här och nu, då jag måste springa iväg...
Men det du får lägga in själv är typ..
Denna raden tänder när min PIR i köket registrerar rörelse men bara mellan 23:12 på kvällen tills efter Soluppgång
Code: Select all
GEA.add(id["PIR_KOK"], -1, "", {{"Time", "23:12", "Sunrise+10"}, {"turnOn", id["KOK_LAMPA"]})
Code: Select all
GEA.add(id["PIR_KOK"], 10*60, "", {{"Inverse"}, {"Time", "23:12", "Sunrise+40"}, {"turnOff", id["KOK_LAMPA"]})
Med sådan kod snuttar borde man kunna lösa dina behov hyffsat enkelt. BLir la kanske 4 rader kod du behöver skapa.. O dessa kommer likna mina 2 rader.
-----------------------------------------------------------------
HC2
Aeon Labs, Fibaro, Danfoss enheter (30++st)
HC2
Aeon Labs, Fibaro, Danfoss enheter (30++st)
Som Clabbe säger, GEA är ett färdigt skript och klarar typ allt men är lite mer komplext. Jag kör endast det för alla mina enheter men kräver lite mer förståelse för LUA därav min tanke att börja med lite enklare. Givetvis kan du "testa" GEA vid sidan av denna och på så vis lära dig. Sen finns ju vi på forumet, bara ställa frågor. Ingen fråga är för simpel
Regards Jonny Larsson
From my iPhone6+ med Tapatalk
Regards Jonny Larsson
From my iPhone6+ med Tapatalk
-
- Medlem
- Posts: 45
- Joined: 08 Nov 2015, 11:23
- 8
Tack för Era svar.
Så om jag förstår Er rätt är GEA ett stort färdigt script som man lägger in som en scen?
GEA scriptet laddar man ned från någon sida(?) men det gör inte något "av sig själv" utan man måste lägga till de funktioner man vill ha i rader så som Clabbe gav i sitt exempel?
Var hittar man detta färdiga GEA script?
Har inte tänkt att ge mig i kast med GEA än, men kan ju vara värt att kolla på i framtiden. nu skall jag kasta mig över Jompa's script och se om det fungerar som jag vill.
Så om jag förstår Er rätt är GEA ett stort färdigt script som man lägger in som en scen?
GEA scriptet laddar man ned från någon sida(?) men det gör inte något "av sig själv" utan man måste lägga till de funktioner man vill ha i rader så som Clabbe gav i sitt exempel?
Var hittar man detta färdiga GEA script?
Har inte tänkt att ge mig i kast med GEA än, men kan ju vara värt att kolla på i framtiden. nu skall jag kasta mig över Jompa's script och se om det fungerar som jag vill.
-
- Medlem
- Posts: 45
- Joined: 08 Nov 2015, 11:23
- 8
Jompa,
Det fungerar tyvärr inte.......
Har lagt in din kod utan modifikationer och får nedanstående i Debug fönstret när jag öppnar dörren. Lampan tänds inte.
[DEBUG] 07:05:56 Home Status : Home
[DEBUG] 07:05:56 Motion Status : No Movement
[DEBUG] 07:05:56 Triggerd by : 298 Light Switch
[DEBUG] 07:05:56 Error : Light status unknown
[DEBUG] 07:05:56
[DEBUG] 07:05:56 Error : Unknown light trigger
[DEBUG] 07:05:56
[DEBUG] 07:05:56 © Smart Lights V1.6.7 | by Control Living, Finished
[DEBUG] 07:05:56 --------------------------------------------------------------------
Går jag in i förrådet så att rörelsesensorn reagerar så får jag nedanstående i Debug fönstret, inte heller nu tänds lampan.
[DEBUG] 07:05:56 Home Status : Home
[DEBUG] 07:05:56 Motion Status : Movement
[DEBUG] 07:05:56 Triggerd by : 302 Motion Sensor
[DEBUG] 07:05:56 Sensor lux : 1 is lower then minValue: 65535
[DEBUG] 07:05:56 No light set for lightsSleeping
[DEBUG] 07:05:56 © Smart Lights V1.6.7 | by Control Living, Finished
[DEBUG] 07:05:56 --------------------------------------------------------------------
Sen märkte jag att SleepState variabeln var sparad i Sleeping så jag ändrade den till Awake och då tänds lampan när rörelsesensorn reagerar. Men det blir fortfarande samma felmeddelanden när jag öppnar dörren och lampan tänds inte när dörren öppnas
Har skapat de tre globala fördefinerade variablerna:
PresentState : med värden Home, Away, Holiday
SleepState : med värdena Awake, Sleeping
TimeOfDay : med värdena Morning, Day, Evening, Night
Det fungerar tyvärr inte.......
Har lagt in din kod utan modifikationer och får nedanstående i Debug fönstret när jag öppnar dörren. Lampan tänds inte.
[DEBUG] 07:05:56 Home Status : Home
[DEBUG] 07:05:56 Motion Status : No Movement
[DEBUG] 07:05:56 Triggerd by : 298 Light Switch
[DEBUG] 07:05:56 Error : Light status unknown
[DEBUG] 07:05:56
[DEBUG] 07:05:56 Error : Unknown light trigger
[DEBUG] 07:05:56
[DEBUG] 07:05:56 © Smart Lights V1.6.7 | by Control Living, Finished
[DEBUG] 07:05:56 --------------------------------------------------------------------
Går jag in i förrådet så att rörelsesensorn reagerar så får jag nedanstående i Debug fönstret, inte heller nu tänds lampan.
[DEBUG] 07:05:56 Home Status : Home
[DEBUG] 07:05:56 Motion Status : Movement
[DEBUG] 07:05:56 Triggerd by : 302 Motion Sensor
[DEBUG] 07:05:56 Sensor lux : 1 is lower then minValue: 65535
[DEBUG] 07:05:56 No light set for lightsSleeping
[DEBUG] 07:05:56 © Smart Lights V1.6.7 | by Control Living, Finished
[DEBUG] 07:05:56 --------------------------------------------------------------------
Sen märkte jag att SleepState variabeln var sparad i Sleeping så jag ändrade den till Awake och då tänds lampan när rörelsesensorn reagerar. Men det blir fortfarande samma felmeddelanden när jag öppnar dörren och lampan tänds inte när dörren öppnas
Har skapat de tre globala fördefinerade variablerna:
PresentState : med värden Home, Away, Holiday
SleepState : med värdena Awake, Sleeping
TimeOfDay : med värdena Morning, Day, Evening, Night
-
- Medlem
- Posts: 45
- Joined: 08 Nov 2015, 11:23
- 8
Tillbaka på ruta 1 då med andra ord
Vad kan man då hitta på istället?? Blir det till att brottas med GEA monstret?
EDIT:
Skam den som ger sig.. Laddade ned GEA koden och la upp den som en scen.
La till följande rader för att testa:
-- Detta skall släcka och tända lampa i Förrådet baserat på om dörren öppnas/stängs
GEA.add (298 - 1, "", {{ "TurnOn" 282}})
GEA.add (298 - 1, "", {{ "Inverse"}, { "turnoff" 282}})
-- Denna bör släcka lampan i Förrådet efter 4min om ingen rörelse
GEA.add (302, 4*60, "", {{"Inverse"}, {"turnOff", 282}})
Kan inte verifiera funktionen förrän ikväll, men detta borde väl fungera?
Vad kan man då hitta på istället?? Blir det till att brottas med GEA monstret?
EDIT:
Skam den som ger sig.. Laddade ned GEA koden och la upp den som en scen.
La till följande rader för att testa:
-- Detta skall släcka och tända lampa i Förrådet baserat på om dörren öppnas/stängs
GEA.add (298 - 1, "", {{ "TurnOn" 282}})
GEA.add (298 - 1, "", {{ "Inverse"}, { "turnoff" 282}})
-- Denna bör släcka lampan i Förrådet efter 4min om ingen rörelse
GEA.add (302, 4*60, "", {{"Inverse"}, {"turnOff", 282}})
Kan inte verifiera funktionen förrän ikväll, men detta borde väl fungera?
Vart hittade du GEA-koden för nerladdning?Borgstrand wrote:Tillbaka på ruta 1 då med andra ord
Vad kan man då hitta på istället?? Blir det till att brottas med GEA monstret?
EDIT:
Skam den som ger sig.. Laddade ned GEA koden och la upp den som en scen.
La till följande rader för att testa:
-- Detta skall släcka och tända lampa i Förrådet baserat på om dörren öppnas/stängs
GEA.add (298 - 1, "", {{ "TurnOn" 282}})
GEA.add (298 - 1, "", {{ "Inverse"}, { "turnoff" 282}})
-- Denna bör släcka lampan i Förrådet efter 4min om ingen rörelse
GEA.add (302, 4*60, "", {{"Inverse"}, {"turnOff", 282}})
Kan inte verifiera funktionen förrän ikväll, men detta borde väl fungera?
Skickat från min SM-G928F via Tapatalk
-
- Medlem
- Posts: 45
- Joined: 08 Nov 2015, 11:23
- 8
Den finns här: http://www.domotique-fibaro.fr/index.ph ... pport-gea/
-
- Medlem
- Posts: 45
- Joined: 08 Nov 2015, 11:23
- 8
Nepp, mitt första GEA försök misslyckades.
Den reagerade inte alls på att dörr öppnas.
La då till '298 value' i "huvudet" på scenen under propertis, verkar vara ett steg på vägen i alla fall.. Nu får jag debug meddelanden när dörren öppnas och som jag tolkar debug meddelandet så borde lampa tändas, men det händer ingenting.
Den säger t.ex:
[298 | n/a] send actions : !ACTION! TurnOn (ID: 1) [TurnOn,282]
Men inget händer, lampan förblir släckt.
Den reagerade inte alls på att dörr öppnas.
La då till '298 value' i "huvudet" på scenen under propertis, verkar vara ett steg på vägen i alla fall.. Nu får jag debug meddelanden när dörren öppnas och som jag tolkar debug meddelandet så borde lampa tändas, men det händer ingenting.
Den säger t.ex:
[298 | n/a] send actions : !ACTION! TurnOn (ID: 1) [TurnOn,282]
Men inget händer, lampan förblir släckt.
-
- Medlem
- Posts: 45
- Joined: 08 Nov 2015, 11:23
- 8
Code: Select all
--[[
%% autostart
%% properties
298 value
302 value
%% globals
--]]
-- v 5.40
-- ==================================================
-- GEA : Gestionnaire d'Evénements Automatique
-- ==================================================
-- [EN] This scene allow you to check every X second the status
-- of a module and send actions if the module is activated since too long.
-- This scene allow you a more simple annotation than LUA
-- it requires some knowledge
--
-- Auteur : Steven P. with modifications of Hansolo and Shyrka973
-- Version : 5.40
-- Special Thanks to :
-- jompa68, Fredric, Diuck, Domodial, moicphil, lolomail, byackee,
-- JossAlf, Did, sebcbien, chris6783, tibahut and all other guy from Domotique-fibaro.fr
-- ------------------------------------------------------------
-- History
-- ------------------------------------------------------------
-- The full history is available here :
-- http://www.domotique-fibaro.fr/index.php/topic/1082-gea-gestionnaire-dévénements-automatique/?p=12428
-- GEA configuration
function config()
GEA.isVersionFour = true -- On est en version 4.017 Beta ou supérieure /
GEA.language = "EN" -- Votre langue : FR (default) / Your language : EN
GEA.checkEvery = 30 -- Check every X seconds (default : 30)
GEA.portables = {504} -- Smartphones you want to be notified {70, 71}
GEA.debug = false -- Show trace in the debug window (default : false)
-- GEA.getGlobalForActivation = {"SuspendreGEA", "non"} -- Active or deactive GEA execution with a global variable
-- GEA.catchError = false
GEA.optimize = GEA.typeOptimize["IMMEDIATE_ONLY"]
-- option : GEA.typeOptimize["NONE"], GEA.typeOptimize["IMMEDIATE_ONLY"], GEA.typeOptimize["ALL"]
-- optimizes the worry of the getName and getRoom fibaro but no longer displays the name of the affected modules.
end
-- Add here events to schedule
function setEvents()
-- Dessa bör släcka och tända lampa i Förrådet baserat på dörren
GEA.add(298, -1, "", {{"TurnOn", 282}})
GEA.add(298, -1, "", {{"Inverse"}, {"turnoff", 282}})
-- Denna bör släcka lampan i Förrådet vid rörelse
GEA.add(302, -1, "", {{"turnOn", 282}})
-- Denna bör släcka lampan i Förrådet efter 4min om ingen rörelse
GEA.add(302, 4*60, "", {{"Inverse"}, {"turnOff", 282}})
end
-- ==================================================
--
-- DON'T TOUCH UNDER THIS POINT
--
-- ==================================================
--
-- GEA MAIN SCRIPT
--
-- ==================================================
Har bara tagit GEA 5.4 koden, (rensat bort lite fransk text på "utmemorerade" rader och sedan lagt till mina två enheter i huvudet på koden under propertis och sen reglerna för vad som skall hända under "functions setEvents()"
Så här blir det i loggen för mig:
Code: Select all
[DEBUG] 19:15:31: GEA Version 5.40 : Running...
[DEBUG] 19:08:34: Run : nothing to do
[b]"Här öppnas dörren"[/b]
[DEBUG] 19:15:31: [ 298 | n/a ] Add Property : task added for instant run (ID: 1) [TurnOn,282]
[DEBUG] 19:15:31: [ 298 | n/a ] Add Property : task added for instant run (ID: 2) [Inverse] [turnoff,282]
[DEBUG] 19:15:31: GEA Version 5.40 : Running...
[DEBUG] 19:15:31: [ 298 | n/a ] sendActions : doing actions (ID: 1) [TurnOn,282]
[DEBUG] 19:15:31: [ 298 | n/a ] sendActions : !ACTION! : TurnOn (ID: 1) [TurnOn,282]
[b]"Här stängs dörren"[/b]
[DEBUG] 19:15:46: [ 298 | n/a ] Add Property : task added for instant run (ID: 1) [TurnOn,282]
[DEBUG] 19:15:46: [ 298 | n/a ] Add Property : task added for instant run (ID: 2) [Inverse] [turnoff,282]
[DEBUG] 19:15:46: GEA Version 5.40 : Running...
[DEBUG] 19:15:46: [ 298 | n/a ] sendActions : doing actions (ID: 2) [Inverse] [turnoff,282]
[DEBUG] 19:15:46: [ 298 | n/a ] sendActions : !ACTION! : turnoff (ID: 2) [Inverse] [turnoff,282]
Last edited by Borgstrand on 23 Feb 2016, 20:59, edited 1 time in total.