Scena per accensione e spegnimento programmati in LUA
  • 30 voti - 3.07 media
#1
Ciao,
Avrei bisogno di una scena cche a un orario fisso tutti i giorni mi accenda un dispositivo è tutti i giorni a un altro orario me lo spenga, co i blocchi devo creare due scene, e se lè trasformò in lua e prova ad unirle non mi funzionano, qualcuno mi può  aiutare ? Grazie
#2
beh visto che è proprio un automatismo secco potresti farlo con un Virtual Device.
Se mi dai un minuto ti posto due righe di codice...

Crea un VD.

nel main loop in basso ci scrivi questo codice (che viene eseguito ogni secondo)

local currentTime = os.date("%H:%M");

if currentTime == "orario di start" then

Accendi quello che ti pare

end
if currentTime == "orario di stop" then

Spegni quello che ti pare

end


Gli orari li metti secondo il formato HH:MM (07:45) tanto per intenderci.

Nel caso in cui volessi necessariamente delle scene per avere la possibilità di eseguirle o stopparle manualmente, al posto di accendere o spegnere quello che ti pare, ci scrivi

fibaroConfusedtartScene(IDScena) [Per farla partire]
oppure
fibaro:killScenes(IDScena) [Per fermarla]


Se c'è qualcosa di poco chiaro (sono una pippa a spiegarmi a volte) chiedi pure!
Questo messaggio è stato modificato l'ultima volta il: 12-01-2016, 10:09 PM da darpet.
#3
La scena sottostante fa partire una scena solo alle 06.45:


Questo codice è solo per gli utenti registrati

@"darpet" quando inserisci codici c'è l'opzione nell'editor di testo del forum (l'icona con <>)  Wink
#4
Pant Puff... ci proverò...
#5
Grazie ad entrambi per le risposte, stasera proverò, mi rimane però il dubbio su come funziona la funzione trigger  e come dovrei modificare
le scene create dalla macchina per unirle , mi spiego meglio con l'esempio sotto:

--[[
%% autostart
%% properties
%% 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 string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "08:10") )
)
then
fibaro:call(51, "turnOn");
end

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

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other"
)
then
fibaro:call(51, "turnOn");
end

end


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 string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "20:00") )
)
then
fibaro:call(51, "turnOff");
end

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

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other"
)
then
fibaro:call(51, "turnOff");
end

end

cosi non funziona, come dovrei modificarla per farla funzionare ?
Grazie in anticipo
#6
Ma questo codice ti salta fuori quando trasformi le scene da blocchi a Lua??
Non sono un super esperto ma non tornato parecchie cose...
Tanto per cominciare vengono create piu variabile con lo stesso valore della sorgente del trigger.
Segui quanto scritto da @"darpet" e semplifica il tutto.
La cosa migliore sarebbe usare GEA...
#7
Ciao Roberto,

oltre a quello scritto da Kead, non vedo nel tuo codice (nelle prime righe in alto, quelle che cominciano per %%) nessuna variabile o nessun dispositivo che dovrebbe triggare la scena...
in questo modo con il codice che hai scritto, la tua scena verrà triggata e quindi eseguita solo se "qualcos'altro" nel sistema imposta la variabile sourceTrigger["type"] a other oppure ad autostart.

Prova a seguire il mio consiglio precedente e crea un VD con il codice che ti ho suggerito, guardane il funzionamento. Se ti soddisfa OK, altrimenti parliamone e aggiustiamo il tiro. Smile

Good Luck.
D.
#8
(13-01-2016, 10:26 AM)darpet Ha scritto: Ciao Roberto,

oltre a quello scritto da Kead, non vedo nel tuo codice (nelle prime righe in alto, quelle che cominciano per %%) nessuna variabile o nessun dispositivo che dovrebbe triggare la scena...
in questo modo con il codice che hai scritto, la tua scena verrà triggata e quindi eseguita solo se "qualcos'altro" nel sistema imposta la variabile sourceTrigger["type"] a other oppure ad autostart.

Prova a seguire il mio consiglio precedente e crea un VD con il codice che ti ho suggerito, guardane il funzionamento. Se ti soddisfa OK, altrimenti parliamone e aggiustiamo il tiro. Smile

Good Luck.
D.

Grazie 
 proverò come consigliato , oltre che per creare una unica scena per gestire lo spegnimento e accensione di un'acquario era anche un esercizio per capire qualcosa di più su LUA , e avevo per questo creato prima le scene a blocchi e poi convertite in lua e unite in una unica scena ma cosi non funziona e mi domandavo perchè

(13-01-2016, 09:01 AM)kead Ha scritto: Ma questo codice ti salta fuori quando trasformi le scene da blocchi a Lua??
Non sono un super esperto ma non tornato parecchie cose...
Tanto per cominciare vengono create piu variabile con lo stesso valore della sorgente del trigger.
Segui quanto scritto da @"darpet" e semplifica il tutto.
La cosa migliore sarebbe usare GEA...

grazie mille per l'aiuto,
 come scritto più sotto a "darpet" le scene la avevo create in blocchi e convertita in LUA  e unite in una unica scena , non solo per l'uso che mi serviva ma anche per comprendere qualcosa in più di LUA
Questo messaggio è stato modificato l'ultima volta il: 13-01-2016, 07:24 PM da Roberto.
#9
Quello che hai fatto è il modo ottimale per capire la logica del linguaggio Lua (te lo dice uno che un anno fa non sapeva nulla in merito.. e non ho mai fatto programmazione).
Quindi ti assicuro che basta un po di curiosità e voglia di capire per arrivare ai risultati.
Ti consiglio ancora una volta di guardare a GEA (ho aperto un apposito Tread a riguardo e presto metterò delle guide in Italiano). Con Gea risolvi la gran parte delle tue esigenze di programmazione in modo semplicissimo...
#10
Ho finalmente trovato la soluzione, stanco di dover impostare più scene a blocchi  una per accendere e una per spegnere,
ora posso accendere e spegnere a orari diversi con una unica scena vari dispositivi o inviare comandi a determinati orari,
ecco il codice:

--[[
%% autostart
%% properties
%% globals
--]]

-- check script instance count in memory
if (fibaro:countScenes() > 1) then
fibaro:debug("Script already running.");
fibaro:abort();
end

fibaro:debug(os.date() .. " - Script start");

function tempFunc()

local currentDate = os.date("*t");

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 (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "09:30") )then

fibaro:call(201, "turnOn");
fibaro:debug("ON");

-- qui posso inserire altre if con tempi diversi e dispositivi diversi....

end
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 (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "21:30") )then

fibaro:call(201, "turnOff");
fibaro:debug("OFF");

-- qui posso inserire altre if con tempi diversi e dispositivi diversi....

end
setTimeout(tempFunc, 60*1000);

end

se l'ora e il giorno della settimana sono quelli indicati nei cicli IF mi esegue l'azione in questo accende alle 9.30 (prima if) o spegne alle 21,30 (seconda if) tutti i giorni il dispositivo con ID 201
da qui si può partire per tantissimi altri usi.
sperando possa essere utile vi saluto


Utente(i) che stanno guardando questa discussione:
1 Ospite(i)