Får inte till det.. Motionsensor scene

Här kan du som nybörjare ställa dina frågor utan att skämmas
Post Reply
Adde80
Medlem
Posts: 71
Joined: 18 Nov 2016, 01:06
8

Nu jag jag i farten igen.. Börjar visserligen greppa basic grejerna i LUA skriptandet och lyckats skapa några fungerande (enkla) scener.
Men har samtidigt sjukt långt kvar inser jag. :)
Vad gör commando "for i = 1" i nedan kod t.ex?

Jag försöker få till en "nattljus scen" och tänkte att jag moddar Jompas toalettljus scen lite grann.
Men får som sagt inte till det.
I orginalscenen så tänds alltid ljus vid rörelse. Vid Natt till 5% och vid dag eller om xx ID lampor är på till 100%.
Det jag försöker få till är att scenen skall trigga och dimma xxID till en låg % under natten. Men om variabel "TimeOfDay" är Day så skall den inte trigga alls. Likaså om "ToD" är Night men xxID är på.
Jag har fått till så att scenen inte triggas när jag inte vill att den skall trigga, eller rättare sagt, inga lampor sätts på. Däremot går timern igång och efter utsatt timer tid så släcks lamporna.

Huvudtanken med scenen är att om nån av ungarna går upp på natten så sitter en PIR utanför deras rum som triggas. Då sätts lite ledljus på i xx sekunder innan de släcks igen.
Under dagen eller om vi andra är vakna skall den inte trigga alls.

Detta är koden i sitt orginalutförande (alla mina försök till modifiering kommer troligtvis krångla till det.) :D
EnhetsID:na är de jag vill ha samt scene scenario är uppdaterat.

Code: Select all

--[[
%% properties
188 value
%% globals
--]]

-- SCENE SCENARIO
-- Kids wake up and need to go up to bathroom or come downstairs 
-- during the night.
-- PIR sensor is triggered in hallway upstairs, lights will only dim to 10% 
-- and turnOff after "endTimer"
-- If sensor is triggered again during the "endTimer" period, 
-- the "endTimer" period will start over
-- Exception, "TimeOfDay" variable is set to Night but some are still 
-- awake and up.
-- Then you don’t want to trigger the designated lights to change state. So if 
-- any of the "lights2Check" is on, it will ignore to trigger the scene.
-- During the day scene will not trigger at all.


-------------------- USER SETTINGS -----------------------
lights2Check = {67};   -- If any of those lights is ON then scene will not trigger
lights = {47,53,100,114};            -- LightId of lights to dim to 10% when scene triggered
sensor = 188            -- SensorId
nightdimValue = "10"        -- Dimmer value to set during night
endTimer = 60             -- How long to keep lights on, in seconds
varName = "TimeOfDay"       -- Variable name
varNightvalue = "Night"     -- varName predefined value
debug = true            -- set debug to true or false
-----------------------------------------------------------

------------- DO NOT CHANGE LINES BELOW -------------------
startSource = fibaro:getSourceTrigger();
version = "0.0.3"

-- Give debug a fancy color
Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span")); 
end

-- Kill new instance of this scene
if (fibaro:countScenes() > 1) then
  Debug( "red", "Abort, count scene = "..fibaro:countScenes());
  fibaro:abort();
end


-- Scene was triggered, function
SceneTriggered = function()
checkLights();
turnLightOn();
startTimer();
end

-- Timer, function
startTimer = function ()
if debug then
   Debug( "green", "Timer started"); 
end
local counter = endTimer
   while(counter > 0)
    do
        counter = counter - 1
        fibaro:sleep(1000)
       if
           tonumber(fibaro:getValue(sensor, "value")) > 0 then 
            counter = endTimer;
        end
    end
     if debug then
         Debug( "green", "Timer stopped"); 
   end
     for i = 1,#lights do
      lightItems = lights[i];
       fibaro:call(lightItems, "turnOff");
    end
end

-- TurnOn lights, functions
turnLightOn = function()
   for i = 1,#lights do
      lightItems = lights[i];
      if fibaro:getGlobal(varName) == varNightvalue and lightsOff then
           Debug( "grey", "Night time, dim to 10%");
            fibaro:call(lightItems, "setValue", nightdimValue)
      else
          fibaro:call(lightItems, "setValue", "100")
           Debug( "grey", "Not night or other lights is ON");
          --end
         end
    end
end

checkLights = function()
Debug( "grey", "Check if lights is ON");
   for i = 1,#lights2Check do
   lightItems = lights2Check[i];
   status = fibaro:getValue(lightItems, "value")
      if status ~= "0" then lightsOff = false break 
       else lightsOff = true end
   end
end

------------------ START OF SCENE ----------------------
if ( startSource["type"] == "other" ) then
    SceneTriggered();
elseif ( startSource["type"] == "property" ) then
     SceneTriggered();
end


Debug( "orange", "Lights & Motion Scene - LUA Scripting by Jonny Larsson 2015" );
Debug( "orange", "Version: "..version);

johey
Ny medlem
Posts: 6
Joined: 31 Oct 2016, 20:55
8

Jag har aldrig kodat LUA så mitt svar är kanske inte så användbart, men en sak tror jag mig kunna besvara hur som helst. Vad gör for i=1,#lights? Medelst kvalificerad gissning säger jag att detta definierar en loop där variabeln i börjar att ha värdet 1, sen nästa varv får i värdet 2 och så vidare. Loopen avslutas när den har snurrat så många gånger som #lights representerar.

Vad betyder det i klarspråk? Jo, det som är inskjutet under for-satsen kommer att köras en gång för varje lampa. Och där har du alltså en if-sats som kollar om det är natt eller inte. Om det är natt sätts varje lampa till dimmat läge. Annars sätts de till värde 100.
Adde80
Medlem
Posts: 71
Joined: 18 Nov 2016, 01:06
8

Aaah.. Make sense! :) Ska fortsätta modda koden.
Adde80
Medlem
Posts: 71
Joined: 18 Nov 2016, 01:06
8

Nä jag börjar ge upp :?
Får ju till det så att lamporna inte tänds om "Lights2Check" eller Global TimeOfDay är Day. Dock spelar det ingen roll med vad jag försöker med, timern går alltid igång och släcker lamporna när tiden är slut oavsett om det är "Day" eller Lights2Check" är på.
Adde80
Medlem
Posts: 71
Joined: 18 Nov 2016, 01:06
8

Ingen som har nån tanke? Kanske inte är så enkelt som att modifiera denna kod utan att man måste börja om från scratch?
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Om jag förstått dig rätt så skulle det kunna se ut så här. Det är en enkel blockscen som sedan konverterats till LUA
Ingen extra redigering av blockscenen behövs.

Blockscen
Om sensorn är överträdd
Och TimeOfDay är lika med Natt
Och dimmern inte är lika med På
Därefter sätt dimmerns värde till 5%
Och stäng sedan av dimmern efter 120 sek

Konverterad till LUA

Code: Select all

--[[
%% autostart
%% properties
740 value
869 value
%% globals
TimeOfDay
--]]

local startSource = fibaro:getSourceTrigger();
if (
 ( tonumber(fibaro:getValue(740, "value")) > 0 )
and
 ( fibaro:getGlobalValue("TimeOfDay") == "Natt" )
and
 ( tonumber(fibaro:getValue(869, "value")) ~= 1 )
or
startSource["type"] == "other"
)
then
	fibaro:call(869, "setValue", "5");
	setTimeout(function()
		fibaro:call(869, "turnOff");
	end, 120000)
end
Min gamla ombyggda HC2 har fått ett nytt liv och min HC3 är nu nedkopplad.
HC2 med Home Assistant har blivit en riktig Game Changer och nu har jag hemautomatik på riktigt.
https://www.zwaveforum.se/viewtopic.php?t=7087
Adde80
Medlem
Posts: 71
Joined: 18 Nov 2016, 01:06
8

Jo men precis! Så långt hade jag inte tänkt.. :)
Göra block först och sen konvertera till LUA.

Men funkar det med timer då? Tänker att om rörelse upptäcks innan 120 sek gått, börjar den om då även i denna scen?

Testar när jag kommer hem!
Post Reply