Controladores domóticos por Hardware => Fibaro => Mensaje iniciado por: linkey en Febrero 07, 2015, 00:41:16 am

Título: Programación LUA
Publicado por: linkey en Febrero 07, 2015, 00:41:16 am
He abierto este hilo con la intención de iniciar un sitio donde consultar y compartir dudas sobre programación de escenas y dispositivos virtuales en LUA, y sobre todo, que podamos hablar en nuestro idioma a ver si así me entero al mejor.
Sería interesante conocer que ideas tenemos para dar solución a las diferentes situaciones del mundo de la automatización y como implementarlas.
Para empezar voy compartiendo un problema y como creo que se puede solucionar programando un dispositivo.
¿No os has ocurrido nunca situaciones como estas?:
Citar
Papa déjame la luz de la mesilla dada un ratito hasta que me duerma, con mi sistema domótico no tengo problema, desde mi cama la apago con el móvil. Pasados unos minutos... click apago.
 !PAPA se ha apagado¡. es pronto…
Espera que la enciendo, pasados otros minutos te quedas dormido y la luz no se apaga en toda la noche.
Podría haber programado una escena, pero justo en ese momento que me hacía falta y por la noche.
Cariño deja encendido el humidificador que está la habitación muy seca, cuando te vayas a la cama lo apagas, es que me iba ya. Pero con mi interruptor Wall Plug lo podría apagar.
Necesitaría un temporizador que me permita apagar cualquier dispositivo de una habitación pasado un periodo de tiempo determinado, rápido de  programar y si tuviera uno en cada habitación mejor, pero eso es una pasta, no se podría programar.
Os dejo mi temporizador, espero que os guste y sobre todo que lo mejoremos entre todos.
Título: Re:Programación LUA
Publicado por: linkey en Febrero 07, 2015, 19:00:53 pm
Dejo un par de iconos para el temporizador.
Título: Re:Programación LUA
Publicado por: phroc en Febrero 09, 2015, 10:49:05 am
Yo LUA, de lejos... jeje

Alguna cosa hice cuando estaba en Vera Lite, pero poco.

A ver si alguien entendido en la materia nos puede ayudar. Antonio, redactor de Domótica Doméstica, le da bastante a LUA tengo entendido.

¡Muy chulo el temporizador!
Título: Re:Programación LUA
Publicado por: maestrea en Febrero 09, 2015, 21:52:11 pm
Jajajaja

La verdad es que yo no puedo entender la domótica sin LUA. Creo que no tengo una sola escena o dispositivo virtual sin LUA. Será que me gusta complicarme.

En cuanto al temporizador la verdad es que una cosa que nunca me había planteado. Me parece que está bastante bien la idea. No he entrado a valorar el código porque no he tenido un minuto para ponerme a ello. Es más, Philippe, te debo un artículo sobre BT4 que te confirmo que funciona muy bien.

A lo que iba, que si queremos incorporar este tipo de temporizadores en escenas os recomiendo GEA.

¿Qué es GEA? Es una navaja suiza, que hace de todo. Lo mejor es que busquéis GEA Fibaro LUA en Google y leáis la explicación que da su creador (Steven).
Título: Re:Programación LUA
Publicado por: restaun en Febrero 10, 2015, 08:17:05 am
A mi me haría falta un cursillo de LUA.
Título: Re:Programación LUA
Publicado por: linkey en Febrero 10, 2015, 22:47:25 pm
¿Qué es GEA? Es una navaja suiza, que hace de todo. Lo mejor es que busquéis GEA Fibaro LUA en Google y leáis la explicación que da su creador (Steven).
He mirado por encima que es GEA y me parece una pasada Bueno yo estoy empezando, tengo un par de escenas para controlar todas las situaciones sin tener que repetir escenas y algún dispositivo todo con LUA pero nada que ver con esto.
Me gustaría hacer desarrollos en este sentido y documentados es Español.
No he entrado a valorar el código porque no he tenido un minuto para ponerme a ello
Gracias por tu comentario, el código no creo que sea nada especial y supongo que bastante mejorable, si algún día lo puedes mirar te agradeceré tus comentarios.

Saludos
 
Título: Re:Programación LUA
Publicado por: linkey en Febrero 10, 2015, 22:48:04 pm
Yo LUA, de lejos... jeje

Alguna cosa hice cuando estaba en Vera Lite, pero poco.

A ver si alguien entendido en la materia nos puede ayudar. Antonio, redactor de Domótica Doméstica, le da bastante a LUA tengo entendido.

¡Muy chulo el temporizador!
Gracias.
Título: Re:Programación LUA
Publicado por: linkey en Marzo 03, 2015, 13:58:00 pm
Hola, un saludo a toda@s,  a ver si me podéis ayudar (V4.033 Net.Http)

Tengo un dispositivo virtual para poder desde el móvil forzar la programación del panel de calefacción cambiando el valor del modo vacaciones 'vacationTemperature' y desde que he actualizado el HC2 a v4.033 me ha dejado de funcionar.

Sabe alguien si ha cambiado la manera de modificar los valores de los paneles?:

HC2 = Net.FHttp("IP",80)
HC2:setBasicAuthentication("USER", "PASSWORD")
-- Obtener valor de temperatura vacaciones
response ,status, errorCode = HC2:GET("/api/panels/heating?id=2")
jsonTable = json.decode(response)
-- cambiar tabla en Lua
jsonTable.properties.vacationTemperature = nuevaTemp;
-- enviar valor de temperatura
json = json.encode(jsonTable);
HC2:PUT("/api/panels/heating?id=2", json)

Título: Re:Programación LUA
Publicado por: linkey en Marzo 18, 2015, 21:15:45 pm
Hola, un saludo a toda@s,  a ver si me podéis ayudar (V4.033 Net.Http)

Tengo un dispositivo virtual para poder desde el móvil forzar la programación del panel de calefacción cambiando el valor del modo vacaciones 'vacationTemperature' y desde que he actualizado el HC2 a v4.033 me ha dejado de funcionar.

Sabe alguien si ha cambiado la manera de modificar los valores de los paneles?:

HC2 = Net.FHttp("IP",80)
HC2:setBasicAuthentication("USER", "PASSWORD")
-- Obtener valor de temperatura vacaciones
response ,status, errorCode = HC2:GET("/api/panels/heating?id=2")
jsonTable = json.decode(response)
-- cambiar tabla en Lua
jsonTable.properties.vacationTemperature = nuevaTemp;
-- enviar valor de temperatura
json = json.encode(jsonTable);
HC2:PUT("/api/panels/heating?id=2", json)

Me auto respondo por si le sirve a alguien más.
en la version 4 hay que cambiar el código donde se usaba "?id=nn" hay que usar /nn.
Ejemplo:
v3.xx
HC2:PUT("/api/panels/heating?id=2", json)
v4.xx
HC2:PUT("/api/panels/heating/2", json)
Título: Re:Programación LUA
Publicado por: linkey en Marzo 18, 2015, 21:20:39 pm
He visto que en las v4.xx de HC2 no funcionan del todo bien los mensajes de log del dispositivo virtual Temporizador que colgué, así que añado el parche.
Hay que cambiar el código del main loop por este.
Saludos
Título: Re:Programación LUA
Publicado por: Jfco en Marzo 19, 2015, 14:29:27 pm
Pues vaya!!
Creo que lo de Lúa que quería aprender lo voy a dejar para cuando saquen una versión estable que no cambie a cada actualización.



Enviado desde mi iPhone utilizando Tapatalk
Título: Re:Programación LUA
Publicado por: linkey en Marzo 22, 2015, 23:01:41 pm
Por si le interesa a alguien.
Las funciones json.decode y json.encode que solo se podían usar en dispositivos virtuales, ahora también funcionan en las escenas, al menos en la versión v4.037 que es la que tengo instalada.
Título: Re:Programación LUA
Publicado por: linkey en Abril 21, 2015, 13:59:15 pm
Para lo de los extractores (creo que hay que usar 'power', pruébalo) y para cualquier otro caso parecido en el que:
Si se activa un dispositivo y se cumple una condición, pasado (o no) un tiempo si se sigue cumpliendo la condición, se activa ortro dispositivo que finalmente pasado otro tiempo se apaga, puedes usar una escena como esta:

Código: [Seleccionar]
--[[
%% properties
xx value
--]]

local dispActuador = xx --pon aquí el número id del dispositivo que inicia la acción
local dispActuado = yy --pon aquí el número id del dispositivo destino de la accion
local tiempoEncendido = t --pon aquí el tiempo(seg)de espera hasta comprobar encendido
local tiempoApagado = t --pon aquí el tiempo(seg) para apagar a partir del encendido
local propiedad = 'power'
local valor = vvv -- pon el valor que ha de superar para complir la condición.
--[[ Por ejemplo si en propiedad es 'value' y en valor 0 significa que el
dispositivo está encendido, si la propiedad es 'power' y el valor es 190, significa
que ha superado un consumo de 190Wats (por defecto la placa pude tener un consumo
de energía reactiva ]]--

local startSource = fibaro:getSourceTrigger()

-- funciona para indicar si una condición se cumple
function _condicion()
  if tonumber(fibaro:getValue(dispActuador, propiedad)) > valor then return true end
  return false
end

-- solo se actua si se cumple la condición principal
-- o se pulsa a mano
if (_condicion()) or
   (startSource["type"] == "other") then
  fibaro:sleep(tiempoEncendido*1000)
  -- si se inicia otra escena igual esta se suicida
  if fibaro:countScenes() > 1 then
    fibaro:abort()
  end
  if _condicion() then
    fibaro:call(dispActuado, "turnOn")
    fibaro:sleep(tiempoApagado*1000)
    fibaro:call(dispActuado, "turnOff")
  end
end
Título: Re:Programación LUA
Publicado por: joaquin.castilla en Abril 21, 2015, 22:19:15 pm
Hola, linkey:
Mejor en este hilo.
Yo sigo leyendo sobre Lua.
He probado lo de la placa de inducción y no funciona pero no parece un problema de programación. El problema es que el dispositivo cuando la placa se enciende no reporta cambio alguno en power. Aunque si cambio en energy. El problema es que energy es el consumo acumulado en Kw/h por lo que un simple cambio de 0.1 requiere de bastante tiempo la placa funcionando. El por qué no reporta el cambio de power no lo sé. Podría ser un problema de compatibilidad entre el Aeon y Fibaro.
Me gustaría intentarlo con energy pero además de lo que te comentaba del cambio lento de este valor es que necesito conocer el valor de inicio. Por eso te pregunto si se puede hacer con Lua el que una variable coja el valor de energy al principio y luego compare con ese valor+ 0.1, por ejemplo.


Sent from my iPad using Tapatalk
Título: Re:Programación LUA
Publicado por: Jokin en Abril 23, 2015, 12:51:34 pm
Más sobre Lua.

Yo sigo intentando hacer mis pinitos en Lua.
A la escena que me escribió linkey relacionada con que se encendiera una luz con la presencia pero que se apagara si se encendían otras luces, le he querido añadir el factor tiempo y que esta escena sólo esté active por la noche. Y he añadido:

local LuzMovCocina = fibaro:getGlobal('LuzMovCocina')

-- ver si la escena tiene que estar activa o no

if LuzMovCocina == "Desactivada" then
     fibaro:debug('Escena desactivada')
  fibaro:abort()
  else
-- aquí me dice cómo está la variable LuzMovCocina
       fibaro:debug(fibaro:getGlobal('LuzMovCocina'))
end

Parece que funciona. Pero quería saber si esta es la forma correcta de hacerlo.
LuzMovCocina es una variable que dice "Activa" o "Desactivada" dependiendo el horario pero requiere de hacer otra escena para definir la variable.

Habría alguna forma de hacerlo sin crear una variable y una escena que definiera la variable?
En otras palabras, hay alguna forma de crear en Lua algo así como:

If "son más de las 7:00am y menos de 08:00pm" then fibaro:abort () else todo continua...

Esto simplificaría mucho pensando en aplicar este método a cada escena que no comparte las mismas variables.
Gracias.
Título: Re:Programación LUA
Publicado por: linkey en Abril 23, 2015, 13:52:30 pm
--[[
_esNoche(timeStamp)
  función para averiguar si en un momento dado es de noche
--------------------------------------------------------------------------------]]
function _esNoche(instante)
  local miInstante = os.date("*t", instante)
  -- amanecer
  local amanecer = fibaro:getValue(1, 'sunriseHour')
  miInstante.min = tonumber(string.format("%1d", amanecer:sub(4,5)))
  miInstante.hour = tonumber(string.format("%1d", amanecer:sub(1,2)))
  local sunriseTime = os.time(miInstante)
  -- anochecer
  local anochecer = fibaro:getValue(1, 'sunsetHour')
  miInstante.min = tonumber(string.format("%1d", anochecer:sub(4,5)))
  miInstante.hour = tonumber(string.format("%1d", anochecer:sub(1,2)))
  local sunsetTime = os.time(miInstante)
  --
  if (instante >= sunsetTime) then return true
  elseif (instante >= sunriseTime) then return false
  else return true end
end

if condicion=_esNoche(os.time()) then
  -- acciones
end
Título: Re:Programación LUA
Publicado por: linkey en Abril 23, 2015, 14:03:15 pm
Sio en lugar de la hora de anochecer y amanecer del sistema quieres usar unas horas tuyas sustituye
Código: [Seleccionar]
  local amanecer = fibaro:getValue(1, 'sunriseHour')
  miInstante.min = tonumber(string.format("%1d", amanecer:sub(4,5)))
  miInstante.hour = tonumber(string.format("%1d", amanecer:sub(1,2)))
 local sunriseTime = os.time(miInstante)
Por
Código: [Seleccionar]
miInstante.min = '08'
miInstante.hour ='00'
local sunriseTime = os.time(miInstante)
y de forma análoga para el anochecer
Título: Re:Programación LUA
Publicado por: Jokin en Abril 23, 2015, 14:42:35 pm
He añadido tu programación a la anterior poniendo la anterior después de "acción" y colocando el "end" al final. Así:

--[[
%% properties
86 value
90 value
412 value
--]]

local id_luz1 = 86
local id_luz2 = 90
local id_presencia = 412
local id_led1= 87
local id_led2= 89
local id_led3= 92
local tiempoApagado = 90
--[[
_esNoche(timeStamp)
  función para averiguar si en un momento dado es de noche
--------------------------------------------------------------------------------]]
function _esNoche(instante)
  local miInstante = os.date("*t", instante)
  -- amanecer
  local amanecer = fibaro:getValue(1, 'sunriseHour')
  miInstante.min = tonumber(string.format("%1d", amanecer:sub(4,5)))
  miInstante.hour = tonumber(string.format("%1d", amanecer:sub(1,2)))
  local sunriseTime = os.time(miInstante)
  -- anochecer
  local anochecer = fibaro:getValue(1, 'sunsetHour')
  miInstante.min = tonumber(string.format("%1d", anochecer:sub(4,5)))
  miInstante.hour = tonumber(string.format("%1d", anochecer:sub(1,2)))
  local sunsetTime = os.time(miInstante)
  --
  if (instante >= sunsetTime) then return true
  elseif (instante >= sunriseTime) then return false
  else return true end
end

if condicion=_esNoche(os.time()) then

-- funciona para saber si un dispositivo está activo
function _esActivo(id)
  if (fibaro:getValue(id, "value") ~= nill and
  tonumber(fibaro:getValue(id, "value")) > 0) then
    return true
  end
  return false
end

-- obtener el origen del inicio de la escena
local startSource = fibaro:getSourceTrigger()
-- si se lánzo por un dispositivo ...
if (startSource["type"] == "property") then

  -- obtener el dispositivo que lanzó la escena
  local sourceDevice = startSource['deviceID']

  -- Si se detecta presencia, no hay luzces encendidas
  -- y la tira de les está apagada
  if (sourceDevice == id_presencia) and
     not _esActivo(id_luz1) and
     not _esActivo(id_luz2) and
     not _esActivo(id_led1)and
     not _esActivo(id_led2)and
     not _esActivo(id_led3) then
    -- encender la tira de led
    fibaro:debug('encender tira de leds')
    fibaro:call(id_led1, "turnOn")
        fibaro:call(id_led2, "turnOn")
        fibaro:call(id_led3, "turnOn")
    -- esperar
   fibaro:sleep(1000*tiempoApagado)
    -- si sigue encendido apagar
    if _esActivo(id_led1) or     _esActivo(id_led2) or     _esActivo(id_led3) then
     fibaro:debug('apagar tira de leds')
     fibaro:call(id_led1, "turnOff")
           fibaro:call(id_led2, "turnOff")
           fibaro:call(id_led3, "turnOff")
    end
  end

  -- si se enciende alguna luz y la tira de led está encendida
  if (sourceDevice == id_luz1 or sourceDevice == id_luz2) and _esActivo(id_led1) and _esActivo(id_led2) and _esActivo(id_led3) then
   -- apagar la tira de led
   fibaro:debug('apagar tira de leds')
   fibaro:call(id_led1, "turnOff")
       fibaro:call(id_led2, "turnOff")
       fibaro:call(id_led3, "turnOff")
  end
 
else -- si no lo lanza un dispositivo se entiende que es a mano
 fibaro:debug('Lanzado a mano, nada que hacer')
end
  end

Pero esto me da error en la línea:
if condicion=_esNoche(os.time()) then

Lo de "condicion" a qué se refiere?

Aún me cuesta enternder algunos pasos aunque claramente entiendo mucho más que antes. Es cuestión de tiempo que deje de darte la lata con estas pequeñeces.

Jokin
Título: Re:Programación LUA
Publicado por: Jokin en Abril 23, 2015, 14:51:51 pm
Linkey,

Hay algunas cosas de base que no las comprendo y creo que son clave para poder avanzar en Programación Lua.
La línea   local amanecer = fibaro:getValue(1, 'sunriseHour') contiene un parámetro "sunriseHour" que parece pertenecer al sistema. Es decir, que el sofware reconoce que "sunriseHour" es una hora concreta. Pero, pero, pero, cómo me informo de que existe ese parámetro en el sistema. He tratado de buscar esto en los manuales que me mandaste pero no encuentro ni este parámetro ni un listado de parámetros que entendería el software. Si bien encuentro un listado de funciones, me falta conocer los parámetros que sé que me va a entender el sofware HC2.
Al menos, la sistemática ya la pillo pero sin conocer qué parámetros puedo utilizar me cuesta avanzar más rápido.

En relación al anterior mensaje. La palabra "condicion" parece ser una variable pero no la tengo definida. Quizás ahí esté el problema?
Título: Re:Programación LUA
Publicado por: linkey en Abril 23, 2015, 20:32:08 pm
He añadido tu programación a la anterior poniendo la anterior después de "acción" y colocando el "end" al final. Así:

--[[
%% properties
86 value
90 value
412 value
--]]

local id_luz1 = 86
local id_luz2 = 90
local id_presencia = 412
local id_led1= 87
local id_led2= 89
local id_led3= 92
local tiempoApagado = 90
--[[
_esNoche(timeStamp)
  función para averiguar si en un momento dado es de noche
--------------------------------------------------------------------------------]]
function _esNoche(instante)
  local miInstante = os.date("*t", instante)
  -- amanecer
  local amanecer = fibaro:getValue(1, 'sunriseHour')
  miInstante.min = tonumber(string.format("%1d", amanecer:sub(4,5)))
  miInstante.hour = tonumber(string.format("%1d", amanecer:sub(1,2)))
  local sunriseTime = os.time(miInstante)
  -- anochecer
  local anochecer = fibaro:getValue(1, 'sunsetHour')
  miInstante.min = tonumber(string.format("%1d", anochecer:sub(4,5)))
  miInstante.hour = tonumber(string.format("%1d", anochecer:sub(1,2)))
  local sunsetTime = os.time(miInstante)
  --
  if (instante >= sunsetTime) then return true
  elseif (instante >= sunriseTime) then return false
  else return true end
end

if condicion=_esNoche(os.time()) then

-- funciona para saber si un dispositivo está activo
function _esActivo(id)
  if (fibaro:getValue(id, "value") ~= nill and
  tonumber(fibaro:getValue(id, "value")) > 0) then
    return true
  end
  return false
end

-- obtener el origen del inicio de la escena
local startSource = fibaro:getSourceTrigger()
-- si se lánzo por un dispositivo ...
if (startSource["type"] == "property") then

  -- obtener el dispositivo que lanzó la escena
  local sourceDevice = startSource['deviceID']

  -- Si se detecta presencia, no hay luzces encendidas
  -- y la tira de les está apagada
  if (sourceDevice == id_presencia) and
     not _esActivo(id_luz1) and
     not _esActivo(id_luz2) and
     not _esActivo(id_led1)and
     not _esActivo(id_led2)and
     not _esActivo(id_led3) then
    -- encender la tira de led
    fibaro:debug('encender tira de leds')
    fibaro:call(id_led1, "turnOn")
        fibaro:call(id_led2, "turnOn")
        fibaro:call(id_led3, "turnOn")
    -- esperar
   fibaro:sleep(1000*tiempoApagado)
    -- si sigue encendido apagar
    if _esActivo(id_led1) or     _esActivo(id_led2) or     _esActivo(id_led3) then
     fibaro:debug('apagar tira de leds')
     fibaro:call(id_led1, "turnOff")
           fibaro:call(id_led2, "turnOff")
           fibaro:call(id_led3, "turnOff")
    end
  end

  -- si se enciende alguna luz y la tira de led está encendida
  if (sourceDevice == id_luz1 or sourceDevice == id_luz2) and _esActivo(id_led1) and _esActivo(id_led2) and _esActivo(id_led3) then
   -- apagar la tira de led
   fibaro:debug('apagar tira de leds')
   fibaro:call(id_led1, "turnOff")
       fibaro:call(id_led2, "turnOff")
       fibaro:call(id_led3, "turnOff")
  end
 
else -- si no lo lanza un dispositivo se entiende que es a mano
 fibaro:debug('Lanzado a mano, nada que hacer')
end
  end

Pero esto me da error en la línea:
if condicion=_esNoche(os.time()) then

Lo de "condicion" a qué se refiere?

Aún me cuesta enternder algunos pasos aunque claramente entiendo mucho más que antes. Es cuestión de tiempo que deje de darte la lata con estas pequeñeces.

Jokin
Lo de 'condicion' es un error por mi parte, te lo puse como ejemplo y no me he dado cuenta.
condicion = _esNoche(), almacenaría en una variable llamada 'condicion' lo que devuelva la '_esNoche', en este caso verdadero o falso (true, false) 
así que en tu caso deberías quitas la palabra 'condición'
if _esNoche(os.time()) then, significa, si en este preciso instante es de noche entonces...
Título: Re:Programación LUA
Publicado por: linkey en Abril 23, 2015, 20:42:28 pm
Linkey,

Hay algunas cosas de base que no las comprendo y creo que son clave para poder avanzar en Programación Lua.
La línea   local amanecer = fibaro:getValue(1, 'sunriseHour') contiene un parámetro "sunriseHour" que parece pertenecer al sistema. Es decir, que el sofware reconoce que "sunriseHour" es una hora concreta. Pero, pero, pero, cómo me informo de que existe ese parámetro en el sistema. He tratado de buscar esto en los manuales que me mandaste pero no encuentro ni este parámetro ni un listado de parámetros que entendería el software. Si bien encuentro un listado de funciones, me falta conocer los parámetros que sé que me va a entender el sofware HC2.
Al menos, la sistemática ya la pillo pero sin conocer qué parámetros puedo utilizar me cuesta avanzar más rápido.

En relación al anterior mensaje. La palabra "condicion" parece ser una variable pero no la tengo definida. Quizás ahí esté el problema?
La verdad es que no hay mucha documentación o no sabemos donde, yo investigando en foros me he enterado de estas cosas.
Si recuerdas cuando consultamos las propiedades de al interruptor Aeon de tu placa de inducción hiciste una consulta invocando una URL desde el navegador, algo así:
http://IP/api/devices/1
1 es el id 1 del dispositivo, representa el propio HC y tiene, entre otras, la propiedad 'sunriseHour'
dependiendo de la versión del sistema quizás necesites usar la sintaxis clásica
http://IP/api/devices?id=1
Otro dispositivo interesante el el número 3 que indica las condiciones meteorológicas obtenidas por el HC desde YahoWeather.
en http://IP/api/globalVariables/, tienes las variables globales
en http://IP//api/scenes, escenas
...
Título: Re:Programación LUA
Publicado por: Jokin en Abril 23, 2015, 21:04:29 pm
Pues a investigar se ha dicho!
Ahora va muy bien la escena. Me tenía que haber dado cuenta.
Gracias,
Jokin
Título: Re:Programación LUA
Publicado por: linkey en Abril 23, 2015, 21:44:56 pm
Me alegro que te funcione!
Título: Re:Programación LUA
Publicado por: Jokin en Abril 24, 2015, 09:10:25 am
Linkey,
Yo sigo con mis dudas de Lua pero progresando.
¿Cuándo en Lua haces una llamada o te refieres a un sensor de movimiento "Ojo de halcón", por ejemplo, parece que por defecto, se considera que el "breach" es cuando se pone en ON (se activa). Así me lo has planteado cuando me has escrito las programaciones anteriores donde este sensor permitía que se encendiera una tira LED.
Pero cómo se hace para que el "ON", es decir, la acción sea ejecutada cuando el ojo de halcón esté en modo "Safe" durante 20 min, por ejemplo?
Quisiera hacer una escena que apagara dos luces de un baño cuando el ojo de halcón lleve 20 min en estado "Safe". Y que no haga nada si el modo "Safe" lleva menos de 20 min.
Gracias.
Título: Re:Programación LUA
Publicado por: linkey en Abril 24, 2015, 11:58:30 am
Linkey,
Yo sigo con mis dudas de Lua pero progresando.
¿Cuándo en Lua haces una llamada o te refieres a un sensor de movimiento "Ojo de halcón", por ejemplo, parece que por defecto, se considera que el "breach" es cuando se pone en ON (se activa). Así me lo has planteado cuando me has escrito las programaciones anteriores donde este sensor permitía que se encendiera una tira LED.
Pero cómo se hace para que el "ON", es decir, la acción sea ejecutada cuando el ojo de halcón esté en modo "Safe" durante 20 min, por ejemplo?
Quisiera hacer una escena que apagara dos luces de un baño cuando el ojo de halcón lleve 20 min en estado "Safe". Y que no haga nada si el modo "Safe" lleva menos de 20 min.
Gracias.
Este tipo de eventos, para mi son “programados”, como pudiera ser que a una determinada hora se cierren las persianas, pero con la diferencia de que el momento en el que queremos que se produzca la acción depende del el tiempo que lleve otro dispositivo inactivo.
Este tipo de eventos los resuelvo todos con una escena que se mantenga en ejecución de forma indeterminada comprobando cada cierto tiempo si hay algo que hacer.

Para comprobar si ha pasado un tiempo determinado desde que se cambió el estado de una propiedad de un objeto se utiliza valor, tiempo = fibaro:get(id, 'value')
Efectivamente el sensor de actividad esta activo (breach)  cuando la propiedad 'value' es 1 e inactivo a 0 (safe).

De manera mas sencilla, también puedes plantear una escena que salte cuando cambie la propiedad, comprobar que se ha puesto a valor 0, esperar 20min y comprobar que el estado no ha cambiado desde hace 20min o más.

Ejemplo:

Código: [Seleccionar]
--[[
%% properties
414 value
--]]

local id_sensor = 414
local id_luz = 16
local tiempoInactividad = 1 -- minutos
 
-- si el sensor se ha apagado
if tonumber(fibaro:getValue(id_sensor, 'value')) == 0 then
  -- esperar el tiempo indicado
  fibaro:debug('esperando')
  fibaro:sleep(tiempoInactividad*60*1000)
  -- calcular el tiempo que lleva el dispositivo sin cambiar de estado
  local valor, instante = fibaro:get(id_sensor, 'value')
  local diferenciaTiempo = os.time() - instante
  fibaro:debug(diferenciaTiempo)
  -- si el tiempo sin cambiar es mayor o igual al tiempo indicado
  if tonumber(valor) == 0 and  diferenciaTiempo >= (tiempoInactividad*60) then
    -- apagar el dispositivo
    fibaro:debug('Apagar')
    fibaro:call(id_luz, 'turnOff')
  end
end

para que funcione si enciendes y apagas varias veces entre el periodo de tiempo de inactividad, no tienes que matar la escena si se lanza otra igual, lo que hace que en un momento dado tengas varias instancias de la misma escena en ejecución.
Título: Re:Programación LUA
Publicado por: Jokin en Abril 24, 2015, 12:52:11 pm
Me parece muy razonable!
Linkey, al final te voy a tener que invitar a unas cervezas. Por otro hilo he visto que vives en Madrid. Yo vivo en Bilbao pero voy bastante a Madrid. Si sigues instruyéndome te llevaré una buena botella de vino que soy de Laguardia, una zona excelente para esos caldos.
Y ahora me aprovecho y pregunto.

El poner if tonumber(fibaro:getValue(id_sensor, 'value')) == 0 en vez de  if (fibaro:getValue(id_sensor, 'value')) == 0, por qué es. Entiendo que el valor de 'value' es siempre un número, no?

La línea: local valor, instante = fibaro:get(id_sensor, 'value') no la entiendo por la ",".  Es como si hubieras creado dos variables con el mismo valor al mismo tiempo. Entonces la línea: local valor, instante = fibaro:get(id_sensor, 'value') sería igual que poner:

local valor = fibaro:get(id_sensor, 'value')
local instante = fibaro:get(id_sensor, 'value')
? O me lo he inventado?

Lo dicho, te estás ganando esa botella de vino...
Título: Re:Programación LUA
Publicado por: linkey en Abril 24, 2015, 13:46:01 pm
El poner if tonumber(fibaro:getValue(id_sensor, 'value')) == 0 en vez de  if (fibaro:getValue(id_sensor, 'value')) == 0, por qué es. Entiendo que el valor de 'value' es siempre un número, no?
Según la documentación de la API de fibaro fibaro:getValue devuelve "A string containing the current value of the property". Esto es, devuelve una cadena no un número, por lo tanto si no usas la función tonumber() para convertir la cadena en un número,  tendrías que poner el 0 entre comillas
if (fibaro:getValue(id_sensor, 'value')) == "0"
O te daría un error al intentar comparar un número con una cadena.
Título: Re:Programación LUA
Publicado por: linkey en Abril 24, 2015, 14:04:43 pm
La línea: local valor, instante = fibaro:get(id_sensor, 'value') no la entiendo por la ",".  Es como si hubieras creado dos variables con el mismo valor al mismo tiempo. Entonces la línea: local valor, instante = fibaro:get(id_sensor, 'value') sería igual que poner:

local valor = fibaro:get(id_sensor, 'value')
local instante = fibaro:get(id_sensor, 'value')
? O me lo he inventado?
La documentación de la API de fibaro, fibaro:get()...
Returned Values
This function returns two values:

A string containing the current value of the property, and
A timestamp of when the property was last modified
Please note that these return values are of type string.  When comparing them with a variable of type number, use tonumber to convert them first.
fibaro:get(id_sensor, 'value') devuelve dos valores, por esto se ponen dos variables, para recibir los dos valores
Título: Re:Programación LUA
Publicado por: Jokin en Abril 24, 2015, 14:08:37 pm
Está clarísimo ahora.
Estoy deseando llegar a casa para probarlo.
Te cuento.

Jokin
Título: Re:Programación LUA
Publicado por: Jokin en Abril 25, 2015, 11:06:03 am
Acabo de hacer una escena en Lua para hacer que se baje una persiana sólo si la puerta de la terraza está cerrada. Es de las que se abre hacia fuera y si está abierta, la persiana da con la puerta y se puede estropear el motor. Por eso quiero que sólo se baje cuando la puerta está cerrada:

--[[
%% properties
442 puerta
170 persiana
%% globals
--]]

local puerta = 442
local persiana = 170

fibaro:debug  (fibaro:getValue(puerta, "value") )

  if tonumber(fibaro:getValue(puerta, "value")) < 1 then
fibaro:call(persiana,"turnON")
  else
  fibaro:abort()
end


No me funciona y yo creo que es porque para bajar una persiana no hay que "turnON". Y no sé qué función es.
He tratado de mirar con:

http://10.0.1.18/api/devices/170

Pero tampoco veo la función de llamada que debería utilizar.

Habréis observado que he tenido que poner "< 1" en vez de "= 0". Esto es porque si pongo "= 0" me da un error. Y como el valor es 0 para cerrada la puerta y 1 para abierta la puerta, no se me ha ocurrido otra forma de solucionarlo. Al menos no me da error y me lee "fibaro:debug  (fibaro:getValue(puerta, "value") )" dándome el valor de 0 o 1 dependiendo el estado de la puerta.

Gracias.
Título: Re:Programación LUA
Publicado por: linkey en Abril 25, 2015, 14:09:45 pm

--[[
%% properties
442 puerta
170 persiana
%% globals
--]]
442 puerta
170 persiana
Esto está mal, hay que poner id propiedad ej.
--[[
%% properties
170 value
%% globals
--]]
Además te sobraría una de las dos líneas, no se muy bien lo que quieres, parece que cuando se intendente abrir la persiana se compruebe que la ventana está cerrada y detenga la acción?.
Si es así solo pones que la escena se active cuando hay un cambio de estado en la persiana, en ese momento compruebe que la ventana está cerrada y si no es así pare la persiana.

if tonumber(fibaro:getValue(442, 'value')) <> 0 then
  fibaro:call(170, "stop")
end

Habréis observado que he tenido que poner "< 1" en vez de "= 0". Esto es porque si pongo "= 0" me da un error. Y como el valor es 0 para cerrada la puerta y 1 para abierta la puerta, no se me ha ocurrido otra forma de solucionarlo. Al menos no me da error y me lee "fibaro:debug  (fibaro:getValue(puerta, "value") )" dándome el valor de 0 o 1 dependiendo el estado de la puerta.
Puedes consultar las funciones de los dispositivos, durante la programación de la escena en el propio interfaz web, mientras editas la escena, en la columna de la izquierda te aparece toda la casa con sus dispositivos y sus opciones que puedes añadir a la escena
Título: Re:Programación LUA
Publicado por: joaquin.castilla en Abril 27, 2015, 09:53:53 am
Me podrías poner un pantallazo que mostrara dónde está esa información sobre las opciones que puedo añadir a una escena? No lo encuentro.


Enviado desde mi iPhone utilizando Tapatalk
Título: Re:Programación LUA
Publicado por: joaquin.castilla en Abril 27, 2015, 09:57:07 am
Aún me queda mucho por aprender en Lua. Hay algo que no debo hacer bien con la escena de la persiana. Lo único que quiero es poder abrir y cerrar una persiana teniendo en cuenta que tengo un controlador de apertura de la puerta que contiene la persiana. Lo que no sé es cómo activar el módulo de persiana para que éste se cierre o se abra.


Enviado desde mi iPhone utilizando Tapatalk
Título: Re:Programación LUA
Publicado por: linkey en Abril 27, 2015, 10:09:40 am
Me podrías poner un pantallazo que mostrara dónde está esa información sobre las opciones que puedo añadir a una escena? No lo encuentro.


Enviado desde mi iPhone utilizando Tapatalk
Título: Re:Programación LUA
Publicado por: linkey en Abril 27, 2015, 10:12:00 am
Me podrías poner un pantallazo que mostrara dónde está esa información sobre las opciones que puedo añadir a una escena? No lo encuentro.


Enviado desde mi iPhone utilizando Tapatalk
Cuando está editando una escena en la pantalla 'Avanzado', a la izquierda aparece una lista de los dispositivos agrupados por habitaciones, si pasas el puntero del ratón se despliegan las opciones
Título: Re:Programación LUA
Publicado por: linkey en Abril 27, 2015, 10:17:48 am
Aún me queda mucho por aprender en Lua. Hay algo que no debo hacer bien con la escena de la persiana. Lo único que quiero es poder abrir y cerrar una persiana teniendo en cuenta que tengo un controlador de apertura de la puerta que contiene la persiana. Lo que no sé es cómo activar el módulo de persiana para que éste se cierre o se abra.


Enviado desde mi iPhone utilizando Tapatalk
Cuando queres abrir/cerrar la persiana?, quieres hacer una escena que al pulsar el botón ejecutar se abra la persiana?.
Lo que yo te planteé anteriormente era una escena que impidiera que se bajara la persiana si la ventana estaba abierta, suponía que la persiana se abriría o cerraría por diferentes motivos, incluso accionando el pulsador manual.
Que controlador de persianas usas, yo tengo un FGRM222 de fibaro y las funciones son:
subir open()
baja close()
parar stop()
Título: Re:Programación LUA
Publicado por: joaquin.castilla en Abril 27, 2015, 10:30:53 am
Gracias  de nuevo, en concreto lo que quisiera es que todas las persianas de la casa, que son siete, se cerrarán al ocaso. Así lo tengo para seis de ellas sin programación en Lua porque aún no lo sé hacer. Pero lo que me gustaría es incluir también la puerta que se puede abrir hacia fuera dentro de esa escena general para que se cerrara al ocaso. Lo que ocurre es que me da miedo que alguien se haya dejado la puerta abierta y se estropee el motor de la persiana. Por eso lo que me gustaría es que el cierre de la persiana de la puerta esté condicionado al estado de apertura o no de la puerta.
Gracias por el pantallazo y por la información de la función. La verdad es que toiene mucho sentido lo de Open y  Close. Cómo me iba a funcionar si yo ponía TurnOn y TurnOff.


Enviado desde mi iPhone utilizando Tapatalk
Título: Re:Programación LUA
Publicado por: javifrechi en Abril 27, 2015, 13:49:20 pm
Mira a ver si te vale este artículo de Antonio http://www.domoticadomestica.com/dispositivo-virtual-control-global-de-persianas/ (http://www.domoticadomestica.com/dispositivo-virtual-control-global-de-persianas/)
Título: Re:Programación LUA
Publicado por: Jokin en Abril 27, 2015, 14:08:28 pm
Así da gusto!
Gracias javifrechi.

A ti Linkey, pero si hasta te informa del ID del dispositivo con un simple pasar por encima. Sorprendente la de acciones que se muestran para hacer. Yo, antes, cada vez que quería conocer el ID, me tenía que volver desde la escena, buscar el dispositivo y ver el ID que tenía. Ahora todo es infinitamente más fácil. Lo que retrasa la ignorancia...
Gracias!
Título: Re:Programación LUA
Publicado por: Jokin en Mayo 02, 2015, 14:27:54 pm
Linkey,

Cómo se podría poner para hacer que el "anochecer" lo considerara, 30 min antes sobre la programación que mandaste? En particular quiero que la escena actúe al 30 min antes del anochecer.
También me pusiste para poner una hora concreta y funciona bien pero lo que me interesa es que la hora vaya cambiando con el anochecer pero que el evento ocurra un poco antes (30 min).

 -- anochecer
  local anochecer = fibaro:getValue(1, 'sunsetHour')
  miInstante.min = tonumber(string.format("%1d", anochecer:sub(4,5)))
  miInstante.hour = tonumber(string.format("%1d", anochecer:sub(1,2)))
  local sunsetTime = os.time(miInstante)

Gracias,
Jokin
Título: Re:Programación LUA
Publicado por: linkey en Mayo 03, 2015, 23:25:18 pm
Jokin
No entiendo muy bien la pregunta, lo que te pasé era una función que devuelve si un instante determinado es de noche o no.
Si lo que quieres saber es si dentro de un determinado tiempo será de noche pasa a la función el instante actual mas el tiempo en segundos que quieres añadir.

ej. para 30min.:
Código: [Seleccionar]
if _esNoche(os.time()+(30*60)) then
  código
end

os.time() es una función lúa que devuelve un número determinado de segundos que han transcurrido desde un instante determinado por el sistema, lo que representa el instante actual.
Título: Re:Programación LUA
Publicado por: Jokin en Mayo 04, 2015, 07:03:25 am
Gracias Linkey,

Es justo lo que quería. Ya lo he cambiado. Ahora sólo esperar a que esta noche todo se active 30 min antes.
Título: Re:Programación LUA
Publicado por: Jokin en Mayo 04, 2015, 11:18:09 am
Linkey,
No quiero abusar de tu bondad y Lua's sabiduría pero podrías explicar cómo hacer que una acción afecte a un grupo de dispositivos y que este grupo sea variable para poder cambiar los dispositivos ad hoc. Me explico. Yo quiero que un montón de luces de mi casa se apaguen a los 15 min de haberse encendido. Pero quiero decidir qué luces entrarían dentro de la escena a medida que voy instalando o dependiendo de otras razones varias. Lo que quiero evitar es hacer una escena por cada luz. Tengo más 25 luces diferentes controladas por dispositivos FIBARO.
Lo que yo había pensado es hacer una escena para que pasara lo que pasara el grupo de luces X1, X2, X3, X4 se apagara a los 15 min de haberse encendido y que este grupo de luces X1, X2, X3 yo lo fuera cambiando bien quitando luces del grupo o añadiendo luces al mismo.
A mí lo que me complica es que al querer que se apaguen a los 15 min de estar encendidas, en el grupo de luces seleccionadas habrá luces que están apagadas y otras luces que se habrán encendido a distintos tiempos por lo que el tiempo de apagado de cada luz (a los 15 min desde su encendido) es diferente para cada una de las luces del grupo.
Muchas gracias.
Título: Re:Programación LUA
Publicado por: linkey en Mayo 04, 2015, 18:07:24 pm
Lo más sencillo sería decirle a cada interruptor en el parámetro correspondiente que se apague de forma automática a los 15min y no hacer ninguna escena.
Pero si quieres hacer una única escena , lo primero que hay que tener claro son tres cosas
 evento que dispara la escena
  acciones
   dispositivos afectados

La acción sería apagar “fibaro:call(id, "turnOff”)”
Los dispositivos x1,x2,x3
El evento 15 minutos después de que se enciendan el dispositivo.

Lo primero, en la cabecera de la escena tienes que declarar todos los posibles dispositivos que pueden disparar la escena, y es en la cabecera donde tendrás que añadir o quitar los dispositivos implicados en cada momento, de tal forma que no hará falta que toques el resto de la escena, solo cambia los dispositivos en la cabecera.
Código: [Seleccionar]
--[[
%% properties
x1 value
x2 value
x3 value
--]]

Cuando cambie el valor de cualquiera de los dispositivos implicados se iniciará una instancia de la escena, con esto quiero decir que se puede ejecutar varias veces la escena y puede que en un momento dado se estén ejecutando varias instancias.

Necesitarás saber que dispositivo a cambiado en cada momento, esto lo consigues con fibaro:getSourceTrigger(), te devuelve una tabla que, dependiendo de como se ha iniciado la escena contiene diferentes valores, si la escena se disparó por cambio de alguna propiedad de los dispositivos indicados en la cabecera (que es tu caso), la tabla contiene ‘deviceID’ y ‘propertyName’, justamente lo que necesitas para saber sobre que dispositivo actual.

Así, cuando se activa uno de los dispositivos por encendido solo queda esperar el tiempo estipulado y justo antes de intentar apagar comprobar que el tiempo desde su último cambio sigue siendo mayor, de esta forma puedes encender y apagar y solo se apagará cuando pase el tiempo definido desde la última vez que se encendió.
Código: [Seleccionar]
local valor, instante = fibaro:get(deviceID, 'value')
Todo junto:
Código: [Seleccionar]
--[[
%% properties
x1 value
x2 value
x3 value
--]]

local elapTime = 15 -- minutos
local startSource = fibaro:getSourceTrigger()

if startSource['type'] == 'property' then
  local deviceID = startSource['deviceID']
  local propertyName = startSource['propertyName']
  local value = fibaro:getValue(deviceID, 'value')
  --fibaro:debug('accionado id '..deviceID..' '..propertyName..' '..value)
  if propertyName == 'value' and tonumber(value) > 0 then
    --fibaro:debug('esperando...')
    fibaro:sleep(elapTime*60*1000)
    -- calcular el tiempo que lleva el dispositivo sin cambiar de estado
    local valor, instante = fibaro:get(deviceID, 'value')
    local diferenciaTiempo = os.time() - instante
    --fibaro:debug('ha pasado '..diferenciaTiempo..'seg')
    -- si el tiempo sin cambiar es mayor o igual al tiempo indicado
    if tonumber(valor) > 0 and  diferenciaTiempo >= (elapTime*60) then
      -- apagar el dispositivo
      --fibaro:debug('Apagar '..deviceID)
      fibaro:call(deviceID, 'turnOff')
    end
  end
end
Título: Re:Programación LUA
Publicado por: Jokin en Mayo 05, 2015, 07:26:31 am
Wow!
Linkey, estoy impresionado.
Esto sí que es está siendo un curso de Lua a fascículos... ;)
Muchas gracias.
Título: Re:Programación LUA
Publicado por: Jokin en Mayo 05, 2015, 13:18:35 pm
Ya me empieza a dar un poco verguenza pero necesito de nuevo tu ayuda.
Resulta que tengo todos los electrodomésticos domesticados (además de domotizados, claro). Me avisan cuando se ponen en marcha y cuando se paran. Esto me ayuda a que no me deje la ropa en la lavadora o en la secadora más de la cuenta, etc. El caso es que hay uno que no se ha dejado domesticar.
Las escenas son muy simples como te puedes imaginar. Cuando el enchufe informa de que el consumo es mayor de 50 W, por ejmplo, me manda un email que dice que el electrodoméstico se ha puesto en marcha y, EN PRINCIPIO, cuando el consumo es de 0W me dice que ya ha terminado. Pero, pero, estos electrodomésticos modernos no tienen un consumo de 0W pues tienen muchas lucecitas (y paneles LCD) y el consumo oscila entre 3W y 5W con fluctuaciones entre estos extremos.
Con la secadora y el lavavajillas lo he solucionado porque he puesto que me notifiquen que han acabado cuando lleguen a 4 W y todo va bien pero la pedor... de la lavadora en la mitad de sus ciclos se para (me imagino que para descansar o para fastidiarme) y baja su consumo a niveles de como si estuviera parada. Esto hace que me informe varias veces de que está parada y de que se ha puesto en marcha (tantas veces como ciclos tiene de parada).
La solucioón que he encontrado es hacer una escena que avise SÓLO si la lavadora está al menos 15 min con un consumo menor de 6W, situación que sólo ocurre cuando está completamente parada. Y, claro, aunque mi profe particular Linkey me está enseñando un montón de Lua, aún no se me ocurre cómo hacer esta escena.
Gracias,
Jokin
Título: Re:Programación LUA
Publicado por: linkey en Mayo 05, 2015, 19:32:47 pm
Creo que sería una escena parecida a la anterior, con la diferencia de que cambia propiedad del dispositivo que lanza la acción, la función a aplicar y sobre que dispositivo ya que no serán el mismo que lanza la acción como en el caso anterior.
Me explico, la acción la lanza el enchufe de la lavadora, pero el mensaje lo envía el dispositivo móvil.
Título: Re:Programación LUA
Publicado por: linkey en Mayo 06, 2015, 12:21:46 pm
La propiedad creo que será "power" depende de tu dispositivo (ya hemos hablado de ello) y la función si quieres que lance un mensaje "sendPush", tendrás que averiguar el id de tu dispositivo móvil...
 http://IP_DE_TU_HC2/api/devices
buscas el nombre de tu dispositivo móvil y miras el id, ej:
 {"id":406,"name":"LiNPhone","roomID":...
Basada en la escena anterior, he escrito esta sobre la marcha así que no la he depurado y puede que tenga algún error (tendrás que depurarlo). Tocando un poquito las variable y la función "function _condicion(valor)", podrás adaptarla a distintas condiciones (xx el id del enchufe de la lavadora, yy id del dispositivo móvil):
Código: [Seleccionar]
--[[
%% properties
xx power
--]]

local elapTime = 15 -- minutos
local funcion = 'sendPush'
local funcionId = yy -- id del dispositivo móvil
local argumento = 'La lavadora ha terminado'
local startSource = fibaro:getSourceTrigger()

function _condicion(valor)
  if tonumber(valor) < 6 -- menor de 6W
   return true
  end
  return false
end

if startSource['type'] == 'property' then
  local deviceID = startSource['deviceID']
  local propertyName = startSource['propertyName']
  local value = fibaro:getValue(deviceID, propertyName)
  --fibaro:debug('accionado id '..deviceID..' '..propertyName..' '..value)
  if _condicion(value) then
    --fibaro:debug('esperando...')
    fibaro:sleep(elapTime*60*1000)
    -- calcular el tiempo que lleva el dispositivo sin cambiar de estado
    local valor, instante = fibaro:get(deviceID, 'value')
    local diferenciaTiempo = os.time() - instante
    --fibaro:debug('ha pasado '..diferenciaTiempo..'seg')
    -- si el tiempo sin cambiar es mayor o igual al tiempo indicado
    if _condicion() and  diferenciaTiempo >= (elapTime*60) then
      -- apagar el dispositivo
      --fibaro:debug('Apagar '..deviceID)
      fibaro:call(deviceID, funcion, argumento)
    end
  end
end
Título: Re:Programación LUA
Publicado por: Jokin en Mayo 06, 2015, 19:39:12 pm
Gracias Linkey,

Lo he probado después de corregir algunas cosas pero me da error y no sé si estoy haciendo algo mal.
Te cuento lo que he corregido porque he pensado que estaba mal. De todas formas, no estoy seguro de que todos los cambios hayan sido corrector.

-Donde pone "funcionId" he puesto "deviceID" pues "funcionId" no se menciona luego.

-Donde pone "valor" he puesto "value". De esto no estoy seguro que sea correcto el cambio.

-En el primer "if tonumber..." he añadido un "then" antes de "return true".

-No estoy seguro de que el "end" después del "return true" no deba ser un "else". No lo he cambiado.

El caso es que finalmente no me funciona.
Podrías echar un vistazo para ver qué puede ser, por favor?

Gracias.
Título: Re:Programación LUA
Publicado por: linkey en Mayo 06, 2015, 21:11:59 pm
-Donde pone "funcionId" he puesto "deviceID" pues "funcionId" no se menciona luego.
En lugar de quitar "funcionId", tienes que poner en la línea 35
 fibaro:call(funcionId, funcion, argumento)
Cita de: Jokin
-Donde pone "valor" he puesto "value". De esto no estoy seguro que sea correcto el cambio.
No, no quites valor, vamos a usar valor en lugar de value, para almacenar el valor de la propiedad que en este caso es el valor de "power" y no de value, daría lo mismo pero así no nos liamos.
Cita de: Jokin
-En el primer "if tonumber..." he añadido un "then" antes de "return true".
OK
Cita de: Jokin
-No estoy seguro de que el "end" después del "return true" no deba ser un "else". No lo he cambiado.
No, está bien así, si valor < 6 entonces retorna verdadero y ya no sigue la función, por lo tanto no es necesario un else , ya que si no se cumple la condición sigue y sale devolviendo falso.

Queda así:
Código: [Seleccionar]
--[[
%% properties
xx power
--]]

local elapTime = 1 -- minutos
local funcion = 'sendPush'
local funcionId = yy -- id del dispositivo móvil
local argumento = 'La lavadora ha terminado'
local startSource = fibaro:getSourceTrigger()

function _condicion(valor)
  if tonumber(valor) < 6 then-- menor de 6W
   return true
  end
  return false
end

if startSource['type'] == 'property' then
  local deviceID = startSource['deviceID']
  local propertyName = startSource['propertyName']
  local valor = fibaro:getValue(deviceID, propertyName)
  fibaro:debug('accionado id '..deviceID..' '..propertyName..' '..valor)
  if _condicion(valor) then
    fibaro:debug('esperando...')
    fibaro:sleep(elapTime*60*1000)
    -- calcular el tiempo que lleva el dispositivo sin cambiar de estado
    valor, instante = fibaro:get(deviceID, propertyName)
    local diferenciaTiempo = os.time() - instante
    fibaro:debug('ha pasado '..diferenciaTiempo..'seg')
    -- si el tiempo sin cambiar es mayor o igual al tiempo indicado
    if _condicion(valor) and  diferenciaTiempo >= (elapTime*60) then
      -- apagar el dispositivo
      fibaro:debug(funcion..' '..funcionId..' '..argumento)
      fibaro:call(funcionId, funcion, argumento)
    end
  end
end
Título: Re:Programación LUA
Publicado por: Jokin en Mayo 10, 2015, 17:12:30 pm
Gracias como siempre Linkey.

He estado todo el fin de semana con este tema. He corregido mis errores con tus sugerencias y en principio funciona. El problema es que no para de mandar mensajes. Es como si nadie le dijera que una vez que avise de que el Lavavajillas (por ejemplo) acaba de terminar ya no tiene que avisar más hasta que no se vuelva a encender.
Entiendo que lo que pasa es que el lavavajillas, al acabar empieza a cumplir cada minuto con la premisa de la Escena de Lua (está con un consumo constante de 3,5 W).

--[[
%% properties
4 power
--]]

local elapTime = 1 -- minutos
local funcion1 = 'sendPush'
local funcion2 = 'sendEmail'
local funcionId1 = 72 -- id del dispositivo móvil de Joaquínb
local funcionId2 = 54 -- id del email de Joaquín
local argumento = 'El lavavajillas acaba de terminar (Lua)'
local subject = 'El lavavajillas se acaba de terminar'
local message = 'El lavavajillas se acaba de terminar.'
local startSource = fibaro:getSourceTrigger()

function _condicion(valor)
  if tonumber(valor) < 6 and tonumber(valor) > 2  then -- menor de 6W y mayor de 2W
   return true
  end
  return false
end

if startSource['type'] == 'property' then
  local deviceID = startSource['deviceID']
  local propertyName = startSource['propertyName']
  local valor = fibaro:getValue(deviceID, propertyName)
  fibaro:debug('accionado id '..deviceID..' '..propertyName..' '..valor)
  if _condicion(valor) then
    fibaro:debug('esperando...')
    fibaro:sleep(elapTime*60*1000)
    -- calcular el tiempo que lleva el dispositivo sin cambiar de estado
    valor, instante = fibaro:get(deviceID, propertyName)
    local diferenciaTiempo = os.time() - instante
    fibaro:debug('ha pasado '..diferenciaTiempo..'seg')
    -- si el tiempo sin cambiar es mayor o igual al tiempo indicado
    if _condicion(valor) and  diferenciaTiempo >= (elapTime*60) then
      -- apagar el dispositivo
      fibaro:debug(funcion1..' '..funcionId1..' '..argumento)
      fibaro:debug(funcion2..' '..funcionId2..' '..subject)
      fibaro:call(funcionId1, funcion1, argumento)
      fibaro:call(funcionId2, funcion2, subject, message)
    end
  end
end

Cómo se podría hacer para que sólo mandara un mensaje?
Yo sólito he incluido lo de que envíe un mensaje de email también.
Gracias.
Título: Re:Programación LUA
Publicado por: linkey en Mayo 10, 2015, 20:45:39 pm
Hola,
en principio la escena solo se lanza cuando hay algún cambio en el estado de la propiedad "power"en el dispositivo 4, así que no debería lanzares si no cambia el valor. Supongo que será por que tenga varios cambio fluctuando entre 2 y 6 W.

Título: Re:Programación LUA
Publicado por: linkey en Mayo 10, 2015, 20:52:47 pm
Se me ocurre usar una variable global para almacenar el estado del lavavajillas (encendido/apagado)
usar dos condiciones en la escena
1 si es mayor de 6W es que se ha encendido y se graba en la variable "ON"
2 si es menor de 6W y la variable es "ON" se envía el mensaje y se graba "OFF" en la variable
Título: Re:Programación LUA
Publicado por: Jokin en Mayo 10, 2015, 21:08:24 pm
Me parece una idea estupenda. Cuál sería el comando en Lua para hacer que una variable se fuerce a llamar "ON" en unas condiciones determinadas, por ejemplo. Con eso creo que sabría hacer lo que comentas. Me imagino que sería algo así como "fibaro:setGlobal"?
Título: Re:Programación LUA
Publicado por: linkey en Mayo 10, 2015, 21:50:47 pm
Primero tienes que crear una variable global en paneles -> panel de variables y luego con
fibaro:setGlobal()
fibaro:getGlobal()
asignas u obtienes el valor a/de la variable.
http://www.fibarouk.co.uk/support/lua/library/fibarosetglobal/
Título: Re:Programación LUA
Publicado por: joaquin.castilla en Mayo 12, 2015, 14:22:14 pm
Me ha surgido una duda existencial o quizás sea una idiotez. Cómo funciona una escena en Lua? Me explico. Empieza leyendo desde arriba y cuando llega abajo, empieza de nuevo? La pregunta lo hago porque qué pasa si pongo solo:
Fibaro:call(46)
Entiendo que se encenderá la luz del dispositivo id 46. Pero y si la apago manualmente? Vuelve a encenderse? Es decir, la escena se ejecuta continuamente hasta que la paras?
Pero como paras una escena en Lua sin utilizar una condición que no se cumpla?
A mi no me funciona:
fibaro:abort() y me imagino que es porque la escena "se aborta" en ese punto pero vuelve a empezar. O algo estoy haciendo mal?
Lo único que quiero es hacer en Lua es una escena que se ejecute una vez y nada más. Y quisiera evitar el utilizar condiciones o contadores con variables para conseguirlo.


Enviado desde mi iPhone utilizando Tapatalk
Título: Re:Programación LUA
Publicado por: linkey en Mayo 12, 2015, 20:50:00 pm
Las escenas en HC2 no se ejecutan solas, pueden ejecutarse por tres motivos:
 por cambio de una propiedad de un dispositivo
 por cambio del valor de una variable global
 por cualquier otro motivo, puede ser llamada por otra escena o dispositivo virtual, o que la lances manualmente  pulsando el botón ejecutar desde el interfaz web o alguna aplicación para dispositivo móvil. En la cabecera de la escena defines el disparador de la escena "%% properties", "%% globals"
Código: [Seleccionar]
--[[
%% properties
13 value
15 value
 
%% globals
nobre_variable_global
–]]
Adicionalmente, hay escenas que se ejecutan solas nada más ser grabadas o cuando se inicia el HC2, en LUA esto se declara también en la cabecera
Código: [Seleccionar]
--[[
%% autostart
--]]
puedes consultar el motivo que lanzo la escena con:
fibaro:getSourceTrigger()
y decidir en consecuencia que hace el código de la escena a continuación...
la escena ejecuta el código de arriba a abajo, a excepción de las llamadas a funciones, cuando las llamas se ejecutan y retornan al punto de llamada (hay una excepción de la función setTimeout() que ejecuta otras funciones de forma asíncrona, pero mejor no te complico) y, aunque puedes programar bucles en los que la función quede indefinidamente, normalmente terminan.
Tienes que entender el concepto de instancia, que quiere decir que la escena es "carga" en memoria para su ejecución, una escena puede ejecutarse varias veces y puede que en un periodo de tiempo la misma escena se esté ejecutando varias veces (hay varias instancias de la misma escena en memoria), hay veces que quieres que esto suceda, por ejemplo si una misma escena actúa para varios dispositivos, (si se enciende la luz o si se abre la puerta), pero otras veces no quieres que se ejecute la escena si ya se está ejecutando otra instancia de la misma, para eso se suele usar abort(). la función abort() no es necesaria para terminar la escena.

Que lío no se si te he aclarado algo! 
Título: Re:Programación LUA
Publicado por: Jokin en Mayo 13, 2015, 07:40:44 am
Me lo has aclarado!
Tengo que decir que conocer todos los entresijos de Lua me está costando. Soy persistente y no desespero. Tu ayuda está siendo crucial en mi intento.
Gracias.
Título: Re:Programación LUA
Publicado por: Jokin en Mayo 16, 2015, 23:38:36 pm
Escribo mi comentario en este hilo porque mi duda creo que sólo se va a poder resolver en Lua.
Resulta que tengo un enchufe Fibaro que tengo debajo del lavabo del aseo donde he enchufado una tira de LEDs que alumbra la parte inferior del lavabo. Muy bonito. Lo que quiero es poder encenderlo sin tener que utilizar un smartphone o similar. Quisiera poderlos encender con un interruptor físico. Como todos los interruptores están destinados a otras luces (todas ellas domotizadas), se me había ocurrido que fuera una secuencia en el manejo del interruptor la que la encienda.
Por ejemplo, se podría hacer que únicamente si el interruptor de la luz principal del aseo se enciende y se apaga 2 veces seguidas en menos de 2 s (ON/OFF/ON/OFF), se encienda el enchufe? Esto permitiría encender la luz fácilmente y sin tener que utilizar un dispositivo externo. Para nota ya sería apagarlo si el interruptor central se pone OFF/ON/OFF/ON/OFF/ON en menos de X segundos.
Sí, necesito cosas un poco raras... ;)
Gracias.
Título: Re:Programación LUA
Publicado por: javifrechi en Mayo 17, 2015, 01:14:02 am
Lo que quiero es poder encenderlo sin tener que utilizar un smartphone o similar. Quisiera poderlos encender con un interruptor físico. Como todos los interruptores están destinados a otras luces (todas ellas domotizadas), se me había ocurrido que fuera una secuencia en el manejo del interruptor la que la encienda.

Y si a esa tira LED le pones un RGBW de Fibaro y haces una asociación directa o una escena, para que cuando enciendas una de las luces domotizadas, se te encienda la tira LED? Más facil no?
Título: Re:Programación LUA
Publicado por: joaquin.castilla en Mayo 17, 2015, 09:23:35 am
Eso es otra posibilidad. De hecho así podría hacerlo ahora pues están conectadas a un enchufe FIBARO pero entiendo que eso dejaría la luz domotizada que he utilizado para encender la tira de LEDs también encendida. Y como esas luces domotizadas también se desean encender solas, esta idea de la asociación directa siempre tendría la tira de LEDs encendida junto a otra luz. Resumiendo que la escena que busco es que active la tira de LED después de ejecutar manualmente un patrón de cualquier tipo, por ejemplo, si enciendo y apago varias veces un interruptor. Puede que no se pueda...


Enviado desde mi iPhone utilizando Tapatalk
Título: Re:Programación LUA
Publicado por: Jokin en Julio 08, 2015, 12:40:43 pm
Yo sigo erre que erre con Lua...
Y dando la tabarra a nuestro experto (que seguro que se da por aludido. No me falles Linkey!).

¿Cuál es la forma más sencilla de hacer que una escena SE ACTIVE/INICIE sólo entre una hora inicial y una hora final?
Esto parece fácil.

Pero la segunda pregunta es más complicada.

¿Cuál es la forma más sencilla de hacer que una escena OCURRA sólo entre una hora inicial y una hora final, es decir, a diferencia de la otra, se PARE en cuanto se pase de la hora final?

Por ejemplo. Yo quiero que un evento que dura 10 min ocurra entre las 22:00 y 22:30 PERO este evento de 10 min ocurre a veces a las 22:05, pero otras veces a las 22:25. Con la primera opción/pregunta, dado que el evento ocurre o a las 22:05 o a las 22:25, éste se activará por completo, 10 min.
Pero la segunda opción, la más complicada, el evento durará 10 min (el habitual) cuando se active a las 22:05 pero sólo durará 5 min cuando el evento se active a las 22:25 pues a las 22:30, la escena debe terminar completamente.

Por cierto, tengo el AppleWatch y estoy deseando que Fibaro implemente la aplicación para que cierre las persianas a lo James Bond (dios, qué freaky me doy cuenta que soy...).
Título: Re:Programación LUA
Publicado por: linkey en Julio 10, 2015, 19:19:51 pm
Yo sigo erre que erre con Lua...
Y dando la tabarra a nuestro experto (que seguro que se da por aludido. No me falles Linkey!).

¿Cuál es la forma más sencilla de hacer que una escena SE ACTIVE/INICIE sólo entre una hora inicial y una hora final?
Esto parece fácil.

Pero la segunda pregunta es más complicada.

¿Cuál es la forma más sencilla de hacer que una escena OCURRA sólo entre una hora inicial y una hora final, es decir, a diferencia de la otra, se PARE en cuanto se pase de la hora final?

Por ejemplo. Yo quiero que un evento que dura 10 min ocurra entre las 22:00 y 22:30 PERO este evento de 10 min ocurre a veces a las 22:05, pero otras veces a las 22:25. Con la primera opción/pregunta, dado que el evento ocurre o a las 22:05 o a las 22:25, éste se activará por completo, 10 min.
Pero la segunda opción, la más complicada, el evento durará 10 min (el habitual) cuando se active a las 22:05 pero sólo durará 5 min cuando el evento se active a las 22:25 pues a las 22:30, la escena debe terminar completamente.

Por cierto, tengo el AppleWatch y estoy deseando que Fibaro implemente la aplicación para que cierre las persianas a lo James Bond (dios, qué freaky me doy cuenta que soy...).
Hola,
esta semana he estado liado con el trabajo y no he leído el forro hasta hoy.
En una primera lectura, no me entero muy bien lo que quieres hacer, no entiendo lo de que un evento dura 10min., un evento se produce en un instante dado que, puede o no desencadenar una serie de acciones. Otra cosa es que un evento dispare una escena que la tengas ocupada 10min.
Si me explicas un poco más el caso concreto...
Título: Re:Programación LUA
Publicado por: Jokin en Julio 13, 2015, 14:30:28 pm
La verdad es que no me he explicado muy bien.
Lo mejor es que te cuente que es lo que quiero y a ver si se te ocurre alguna idea para implementarlo.
Lo que yo quiero es que se me encienda una luz concreta si entre las 22:00 y las 23:00 y sólo si desde que se abra la puerta (detector de apertura) pasa más de media hora hasta que se vuelve a abrir. Sí, muy raro. Pero, de verdad, muy útil para mi vida diaria.
Las situaciones que podrían ocurrir son (siempre de 22:00 a 23:00 porque fuera de este horario no debería activarse nada):
Situación 1: No se abre la puerta NUNCA de 22:00 a 23:00 > no se activa nada ese día.
Situación 2: Se abre la puerta a las 22:05 y la segunda vez que se abre la puerta es a las 22:25 (antes de media hora) > no se activa nada ese día.
Situación 3: Se abre la puerta a las 22:05 y la puerta no se abre una segunda vez antes de las 23:00 > se enciende una luz después de 30 min respecto a la primera hora de apertura, es decir a las 22:35. Si se hubiera abierto la primera vez a las 22:10, se encendería la luz a las 22:40.
Situación 4: Se abre la puerta a las 22:35 y como para que den las 23:00 falta menos de 30 min > no se activa nada ese día.
Muchas gracias.
Título: Re:Programación LUA
Publicado por: linkey en Julio 13, 2015, 20:23:26 pm
La verdad es que no me he explicado muy bien.
Lo mejor es que te cuente que es lo que quiero y a ver si se te ocurre alguna idea para implementarlo.
Lo que yo quiero es que se me encienda una luz concreta si entre las 22:00 y las 23:00 y sólo si desde que se abra la puerta (detector de apertura) pasa más de media hora hasta que se vuelve a abrir. Sí, muy raro. Pero, de verdad, muy útil para mi vida diaria.
Las situaciones que podrían ocurrir son (siempre de 22:00 a 23:00 porque fuera de este horario no debería activarse nada):
Situación 1: No se abre la puerta NUNCA de 22:00 a 23:00 > no se activa nada ese día.
Situación 2: Se abre la puerta a las 22:05 y la segunda vez que se abre la puerta es a las 22:25 (antes de media hora) > no se activa nada ese día.
Situación 3: Se abre la puerta a las 22:05 y la puerta no se abre una segunda vez antes de las 23:00 > se enciende una luz después de 30 min respecto a la primera hora de apertura, es decir a las 22:35. Si se hubiera abierto la primera vez a las 22:10, se encendería la luz a las 22:40.
Situación 4: Se abre la puerta a las 22:35 y como para que den las 23:00 falta menos de 30 min > no se activa nada ese día.
Muchas gracias.
Lo primero es abstraer el problema y luego implementar la solución
A ver que te parece...
Código: [Seleccionar]
T1 =  la hora inicial (en tu caso las 22:00)
INT = el intervalo (en tu caso 30min)
AMB = el ámbito de actuación (en tu caso 1h 22 a 23)
Si entre T1 y (T1 + INT) se abre una puerta, comienza una cuenta de tiempo hasta INT
Si se vuelve a abrir la puerta entre T1 y (T1 + INT) se re-inicia la cuenta.
Si la cuenta termina y son menos de las T1 + AMB se realiza una acción.
En cualquier caso se termina el proceso. (mandar un mensaje informando?)

Implementa una escena que se ejecuta cuando se abre la puerta
Si entre T1 y (T1 + INT) déjala esperando por INT, si se ejecuta de nuevo abortas la escena actual.
cuando termine compruebas si son menos de las 23:00 y actúas o no.
Un poco de código como pista:
-
Código: [Seleccionar]
-[[
%% properties
id value

--]]

local intervalo = 30*60
-- tomar instante actual initialTime
local initialTime = os.time()
 while os.time() <= initialTime+ intervalo do
-- si se inicia otra escena esta se suicida
  if fibaro:countScenes() > 1 then
    fibaro:abort()
  end
end
if ...

para operar con el tiempo en lúa, mira esto (http://www.lua.org/pil/22.1.html)
Título: Re:Programación LUA
Publicado por: Jokin en Julio 29, 2015, 23:54:26 pm
Gracias Linkey, aún sigo de vacaciones y no he tenido tiempo de implementar lo que propones. En cuanto vuelva trataré de seguir los pasos que comentas y te cuento cómo me ha ido.

Acabo de volver de FIBAROlandia y como era de esperar, ni rastro de domótica en ese país...

Tonto de mí, realicé una escena en Lua cuando estaba viajando fuera para que me avisara si saltaba el ICT (automático para los amigos) y para eso (repito, tonto de mí) controlé la energía recibida de la pinza amperimétrica para que si era menor o igual a 10 W (siempre hay un consumo basal superior a 150W en mi casa), que me mandara un email para que pudiera avisar a mi vecina y lo volviera a reestablecer. Menuda, tontería. Salta el ICT, pierde corriente la pinza amperimétrica y aunque mi router y mi HCL2 estén funcionando bajo mi SAI, la pinza está muerta y no le manda información de que está pasando 0 de W. Total que tengo que poner que cuando se pierde la señal o la conexión con la pinza que me diga que algo gordo ha ocurrido. O quizás, pero esto me acabo de dar cuenta mientras estoy escribiendo esto. Basta con poner pilas a la pinza. Ahora está conectada al cuadro general.

Linkey, cuál sería el comando para Lua que informara sobre la perdida de conexión con el controlador o cómo lo harías tú para que si hay pérdida total de corriente en la casa, te avise?

La otra opción que me han dado. Aviso a electricitas del foro! Que quite el ICT que no sirve para nada y que el paso excesivo de W lo debe controlar Hiberdrola. Y que ponga un diferencial re-armable que controle la cocina (todos los electrodomésticos) y que se encenderá de nuevo en caso de que salte por tormentas o similar. Algún consejo?
Título: Re:Programación LUA
Publicado por: Jokin en Julio 30, 2015, 09:03:36 am
En mi anterior mensaje quise decir ICP por ICT (perdón para los que trabajan en estos temas) y quise decir Iberdrola por Hiberdrola (uff, que malas son las vacaciones...).
Título: Re:Programación LUA
Publicado por: linkey en Julio 30, 2015, 09:42:41 am
Yo no tengo ICP y tengo un diferencial re-armable para frigo y congelador.
Lo de la pinza lo tengo exactamente igual que tu (no había caído en poner pilas).
Para la pedida total de energía, lo manejo desde el SAI, tengo un virtual device para el SAI y controlo entre otras cosas si está OL (Online).
Título: Re:Programación LUA
Publicado por: linkey en Julio 30, 2015, 09:50:05 am
Para hacer el VD que controla el SAI, me basé en el artículo del blog de Antonio Maestre Cómo integrar tu NAS y SAI en tu red domótica con el Home Center 2 de Fibaro. (http://www.domoticadomestica.com/como-integrar-tu-nas-y-tu-sai-en-tu-red-domotica-con-el-home-center-2-de-fibaro/).
Jokin, tienes un NAS?.
Título: Re:Programación LUA
Publicado por: Jokin en Julio 30, 2015, 10:46:44 am
Sí, tengo un Synology DS415PLAY.
Título: Re:Programación LUA
Publicado por: Jokin en Julio 30, 2015, 10:53:56 am
Yo no tengo ICP y tengo un diferencial re-armable para frigo y congelador.
Lo de la pinza lo tengo exactamente igual que tu (no había caído en poner pilas).
Para la pedida total de energía, lo manejo desde el SAI, tengo un virtual device para el SAI y controlo entre otras cosas si está OL (Online).

Joder, Linkey, es que no puede ser mejor lo que propones. La verdad es que tengo el artículo de Antonio Maestre en mi lista "To Do" pero tengo que decir que voy a necesitar tiempo para implementarlo.
Lo de que el SAI sea el que controla si ha habido pérdida de corriente es genial. Yo tengo un SAI que controla el HC2, router y el NAS pero estoy a la espera de tener una tarde entera para aplicar el artículo de Antonio Maestre e incorporarlo. Con tu comentario aún estoy más animado pues veo que además puedo utilizar el SAI para que el HC2 se entere de la pérdida de la corriente.
Todo esto lo voy a implementar en septiembre después del verano por lo que volveré a la carga dado que seguro que me surgen muchas dudas.

La verdad es que estoy disfrutando como un enano con todo esto. Yo ya sabía que la domótica me iba a gustar pero no sabía que tanto. Y tengo que decir que este foro es la pera! Por no decir la h... (como soy vasco, es difícil no decir tacos...;))
Título: Re:Programación LUA
Publicado por: Jokin en Julio 30, 2015, 11:05:14 am
Preguntas cortas pero que no encuentro por ningún lado las respuestas:

Qué diferencias hay entre?:

fibaro:log ()
fibaro:debug ()

¿Por qué a veces se pone comillas (") y otras veces (')? Es lo mismo?

Por ejemplo:

fibaro:debug ("Hola") vs. fibaro:debug ('Hola')
Título: Re:Programación LUA
Publicado por: linkey en Julio 30, 2015, 12:49:34 pm
Preguntas cortas pero que no encuentro por ningún lado las respuestas:

Qué diferencias hay entre?:

fibaro:log ()
fibaro:debug ()

¿Por qué a veces se pone comillas (") y otras veces (')? Es lo mismo?

Por ejemplo:

fibaro:debug ("Hola") vs. fibaro:debug ('Hola')

fibaro:debug, solo funciona en las escenas y genera un mensaje que puedes ver cuando depuras
fibaro:log, solo funciona en los dispositivos virtuales y genera un mensaje que puedes ver en la parte de abajo del propio dispositivo virtual.
lo de las comillas simples o dobles, en principio es igual.
Título: Re:Programación LUA
Publicado por: linkey en Julio 30, 2015, 12:52:33 pm
Sí, tengo un Synology DS415PLAY.
yo tengo un Synology DS411slim, que SAI tienes?, porque lo mismo te valen mis dispositivos virtuales y mi scrip, yo tengo un APC Back-UPSCS650.
Título: Re:Programación LUA
Publicado por: Jokin en Julio 30, 2015, 13:05:33 pm
Tengo un Nilox UPS VALUE LCD 1120VA-560W.
Aunque no sea igual me ayuda infinito ver cómo has hecho los VDs para los tuyos porque es más fácil hacer pequeños cambios. Si podrías enviarlos, sería genial.
Gracias.
Título: Re:Programación LUA
Publicado por: linkey en Julio 30, 2015, 13:21:44 pm
Tengo un Nilox UPS VALUE LCD 1120VA-560W.
Aunque no sea igual me ayuda infinito ver cómo has hecho los VDs para los tuyos porque es más fácil hacer pequeños cambios. Si podrías enviarlos, sería genial.
Gracias.
Lo primero lee el artículo de Antonio, para que entiendas el funcionamiento, resumiendo:
El NAS ejecuta un script cada cierto tiempo que solicita información tanto al SAI como al propio NAS y escribe estos valores en variables globales del HC2. Necesitarás que el SAI soporte SNMP y obtener documentación al respecto para poder interrogar sobre su estado desde el NAS.
Luego los dispositivos virtuales leen esta variables y presentan los datos o actúan según su valor.
Adjunto el script que ejecuta mi NAS.
Título: Re:Programación LUA
Publicado por: Jokin en Septiembre 02, 2015, 23:39:05 pm
Alguien sabe cómo enviar con Lua y en HC2 un mensaje a un email que contenga:
1. Una frase y luego el contenido de una variable.
y si esto no se puede:
2. El contenido de una variable.

Mandar una frase es fácil:

   fibaro:call(54, "sendDefinedEmailNotification", "199");

Siendo "54" el recipiente de email y "199" la frase creada en el panel de notificaciones. Pero lo que no sé hacer es que me mande un email que tenga el valor de una variable global cuyo valor se ha generado durante la escena.
Lo mismo aplicaría para una notificación Push.
Gracias.
Título: Re:Programación LUA
Publicado por: linkey en Septiembre 06, 2015, 22:19:10 pm
Alguien sabe cómo enviar con Lua y en HC2 un mensaje a un email que contenga:
1. Una frase y luego el contenido de una variable.
y si esto no se puede:
2. El contenido de una variable.

Mandar una frase es fácil:

   fibaro:call(54, "sendDefinedEmailNotification", "199");

Siendo "54" el recipiente de email y "199" la frase creada en el panel de notificaciones. Pero lo que no sé hacer es que me mande un email que tenga el valor de una variable global cuyo valor se ha generado durante la escena.
Lo mismo aplicaría para una notificación Push.
Gracias.
Código: [Seleccionar]
--[[
%% properties
%% globals
--]]
local emailUser = 2
local message = 'Hola Jokin para enviar email utiliza esto'
local emailSubject = 'enviar mail desde Hc2'
fibaro:call(emailUser, "sendEmail", emailSubject, message)
Título: Re:Programación LUA
Publicado por: Jokin en Septiembre 07, 2015, 06:37:52 am
Gracias Linkey,
Pero lo que yo necesito es enviar el contenido de una variable.
Por ejemplo:
local message = getValue(54,"power") o similar (esto es un ejemplo).
donde 54 es mi lavadora

Se puede?
Quisiera recibir un mensaje que dijera: "Su lavadora ha terminado y ha consumido 'X' vatios", siendo 'X' una variable global.
He intentado mandar por email una variable global pero no he sabido.
Utilicé tu recomendación para calcular el consumo de un proceso, generando una variable global de inicio, una de término y la variable de consumo final que sería la resta de la de término menos la de inicio. Y funciona. Me calcula cuánto consume en un determinado tiempo un electrodoméstico pero no sé cómo enviarme esta información por email, es decier, no sé cómo enviarme el valor de la variable global de consumo final.
Gracias.
Título: Re:Programación LUA
Publicado por: linkey en Septiembre 07, 2015, 12:25:18 pm
Gracias Linkey,
Pero lo que yo necesito es enviar el contenido de una variable.
Por ejemplo:
local message = getValue(54,"power") o similar (esto es un ejemplo).
donde 54 es mi lavadora

Se puede?
Quisiera recibir un mensaje que dijera: "Su lavadora ha terminado y ha consumido 'X' vatios", siendo 'X' una variable global.
He intentado mandar por email una variable global pero no he sabido.
Utilicé tu recomendación para calcular el consumo de un proceso, generando una variable global de inicio, una de término y la variable de consumo final que sería la resta de la de término menos la de inicio. Y funciona. Me calcula cuánto consume en un determinado tiempo un electrodoméstico pero no sé cómo enviarme esta información por email, es decier, no sé cómo enviarme el valor de la variable global de consumo final.
Gracias.
obtén el valor de la variable global con fibaro:getGlobalValue (http://fibaro:getGlobalValue) y ponlo en el mensaje
ejemplo
Código: [Seleccionar]
local consumo = fibaro:getGlobalValue('consumo')
local message = "Su lavadora ha terminado y ha consumido "..consumo.." vatios"
local emailUser = 2
local emailSubject = 'Lavadora'
fibaro:call(emailUser, "sendEmail", emailSubject, message)
Título: Re:Programación LUA
Publicado por: Jokin en Septiembre 07, 2015, 21:45:39 pm
Gracias Linkey,
Como estoy siendo un buen alumno tuyo, todo eso lo estaba haciendo bien pero lo que no sabía es que para enlazar un texto a una variable había que poner "texto"..XXXX.."texto", siendo XXXX, la variable. Lo de los dos puntitos es definitivo. Todo perfecto ahora. La verdad es que sin tu ayuda, no sé qué habría hecho. Porque lo de los puntitos no lo he leído en ningún lugar.
Título: Re:Programación LUA
Publicado por: Jokin en Septiembre 08, 2015, 07:52:02 am
Linkey, sabes si se pueden introducir "retornos de carro" en los mensajes que se envían por email? Ya sé que esto ya es un poco fino, pero así se podrían enviar mensajes super completos del estado de los consumos generales, etc, por ejemplo.
Gracias.
Título: Re:Programación LUA
Publicado por: linkey en Septiembre 08, 2015, 11:38:18 am
Linkey, sabes si se pueden introducir "retornos de carro" en los mensajes que se envían por email? Ya sé que esto ya es un poco fino, pero así se podrían enviar mensajes super completos del estado de los consumos generales, etc, por ejemplo.
Gracias.
Código: [Seleccionar]
local message = "Su lavadora ha terminado y ha consumido "..consumo..
" vatios\r\rUn saludo\r\rManuel"

Manual de referencia Lua (http://www.lua.org/manual/5.1/es/manual.html)
"Los strings literales pueden ser delimitados por comillas simples (apóstrofes) o dobles, y pueden contener las siguientes secuencias de escape de C: '\a' (pitido, bell) '\b' (retroceso, backspace), '\f' (salto de página, form feed), '\n' (nueva línea, newline), '\r' (retorno de carro, carriage return), '\t' (tabulador horizontal, horizontal tab), '\v' (tabulador vertical, vertical tab), '\\' (barra inversa, backslash), '\"' (comilla doble, quotation mark o double quote) y '\'' (apóstrofe, apostrophe o single quote). Además, una '\newline' (esto es, una barra inversa seguida por un salto de línea real) produce un salto de línea en el string."
Título: Re:Programación LUA
Publicado por: Jokin en Septiembre 08, 2015, 15:31:48 pm
Me quito el sombrero!
Voy a leerme el manual de referencia para ver si encuentro nuevas ideas en la programación Lua.
Gracias.
Título: Re:Programación LUA
Publicado por: rls46 en Diciembre 09, 2015, 10:46:15 am
Hola, un saludo a toda@s,  a ver si me podéis ayudar (V4.033 Net.Http)

Tengo un dispositivo virtual para poder desde el móvil forzar la programación del panel de calefacción cambiando el valor del modo vacaciones 'vacationTemperature' y desde que he actualizado el HC2 a v4.033 me ha dejado de funcionar.

Sabe alguien si ha cambiado la manera de modificar los valores de los paneles?:

HC2 = Net.FHttp("IP",80)
HC2:setBasicAuthentication("USER", "PASSWORD")
-- Obtener valor de temperatura vacaciones
response ,status, errorCode = HC2:GET("/api/panels/heating?id=2")
jsonTable = json.decode(response)
-- cambiar tabla en Lua
jsonTable.properties.vacationTemperature = nuevaTemp;
-- enviar valor de temperatura
json = json.encode(jsonTable);
HC2:PUT("/api/panels/heating?id=2", json)


una pequeña aportación, modificación para hacerlo en varias zonas.
en idzonas, los ids de tantas zonas como se tengan.
para anular el modo vacaciones cambiar esta linea
jsonTable.properties.vacationTemperature = 12;
por esta
jsonTable.properties.vacationTemperature = 0;
las 3 ultimas lineas modificar según el id el móvil y los nombres de las etiquetas y variables o quitar/comentar si no se va a utilizar.

idzonas = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
for i=1, #idzonas do
-- llama a la zona
HC2 = Net.FHttp("127.0.0.1",11111);
urlapiheat = "/api/panels/heating/".. idzonas
fibaro:debug(urlapiheat)
response ,status, errorCode = HC2:GET(urlapiheat);
jsonTable = json.decode(response);
-- cambia el valor
jsonTable.properties.vacationTemperature = 12;
-- graba nuevo valor en el panel
jsonstr = json.encode(jsonTable);
response2, status2, errorCode2 = HC2:PUT(urlapiheat,jsonstr)
end
-- extras
-- envia popup a movil
fibaro:call(999, "sendPush", "Calefacción en modo AUSENTE.");
-- cambia la etiqueta del VD
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label2.value", "AUSENTE");
-- cambia la variable global
fibaro:setGlobal("Modo_calefaccion", "Ausente");
Título: Re:Programación LUA
Publicado por: linkey en Diciembre 09, 2015, 14:27:41 pm
HC2 sin memoria libre
Con el uso,  mi controlador HC2 va consumiendo memoria que en un principio debería recuperar pero por algún motivo (quizás por mis propias escenas o dispositivos virtuales), la memoria libre llega a reducirse por debajo del 2% 0 3% y el dispositivo llega a colgarse. En ocasiones incluso es imposible realizar un soft-reset con lo que esto conlleva (desconectar el caliente).
Mas de un susto me he llevado al realizar una desconexión en caliente y ver que el dispositivo tarda en volver a arrancar del todo.
He creado un dispositivo virtual para reiniciar el sistema antes de que se colapse por si alguien tiene el mismo problema dejo aquí (https://github.com/linkey21/HC2LUA-Reboot/archive/v1.1.0.zip) el proyecto completo porque pesa demasiado para ponerlo en adjuntos, el manual está en en la carpeta /bin
Título: Re:Programación LUA
Publicado por: RToz99 en Marzo 04, 2016, 22:44:27 pm
HC2 sin memoria libre
Con el uso,  mi controlador HC2 va consumiendo memoria que en un principio debería recuperar pero por algún motivo (quizás por mis propias escenas o dispositivos virtuales), la memoria libre llega a reducirse por debajo del 2% 0 3% y el dispositivo llega a colgarse. En ocasiones incluso es imposible realizar un soft-reset con lo que esto conlleva (desconectar el caliente).
Mas de un susto me he llevado al realizar una desconexión en caliente y ver que el dispositivo tarda en volver a arrancar del todo.
He creado un dispositivo virtual para reiniciar el sistema antes de que se colapse por si alguien tiene el mismo problema dejo aquí (https://github.com/linkey21/HC2LUA-Reboot/archive/v1.1.0.zip) el proyecto completo porque pesa demasiado para ponerlo en adjuntos, el manual está en en la carpeta /bin

increíble aporte y super UTIL! Es una lástima que queden ocultos en hilos más genéricos. Creo que se debería abrir un hilo único cada vez para estas joyas! en realidad con la versión 4.0.80 no me muestra valores de mem% ni puedo variar el porcentaje, pero si funciona el botón de reinicio. He seguido las instrucciones y la única cosa que he visto diferente ha sido que cuando importaba tu el VD, mi archivo descargado se llamaba Reiniciar_HC2.vfib.json (pero no se si es una extensión añadida por github?). En cualquier caso no me funciona bien...

Gracias por compartirlo igualmente!!Tienes más cositas así? De verdad que es super últil. Una vez leí algo tuyo de temporizador, pero me cuesta mucho encontrarlo en el foro y es por eso porque queda eclipsado entre miles de mensajes menos importantes.

¿Os parece buena idea hacer un repositorio de todas estas joyas? Tal vez un hilo con últimas versiones?
Título: Re:Programación LUA
Publicado por: linkey en Marzo 04, 2016, 23:43:26 pm
Para importar quita la extensión .json del nombre del fichero, yo lo tengo instalado con la version 4.080 y me funciona bien.
La verdad es que lo tenía instalado antes de actualizar a la versión.

Si no te funcionan los botones para cambiar el %, puedes ir al a las propiedades del VD, pestaña avanzado y bajas hasta el botón  '◀  downButton', pulsas el botón 'depurar' y a continuación 'comenzar', luego pruebas a pulsar el botón '◀' y en la consola te debería aparece algo como esto:
"[DEBUG] 23:42:13: 13% / 03%".
Si te devuelve algún error, dime cual es a ver si puedo depurarlo.

Un Saludo.
Título: Re:Programación LUA
Publicado por: RToz99 en Marzo 05, 2016, 12:06:10 pm
Para importar quita la extensión .json del nombre del fichero, yo lo tengo instalado con la version 4.080 y me funciona bien.
La verdad es que lo tenía instalado antes de actualizar a la versión.

Si no te funcionan los botones para cambiar el %, puedes ir al a las propiedades del VD, pestaña avanzado y bajas hasta el botón  '◀  downButton', pulsas el botón 'depurar' y a continuación 'comenzar', luego pruebas a pulsar el botón '◀' y en la consola te debería aparece algo como esto:
"[DEBUG] 23:42:13: 13% / 03%".
Si te devuelve algún error, dime cual es a ver si puedo depurarlo.

Un Saludo.

gracias, probado debug y pone esto
[ERROR] 12:03:52: line 10: attempt to compare number with nil

Parece claro que no puede encontrar el valor de memoria... Perdón si me he despistado con algo pero creo que no había que configurar nada. Lo he instalado después de tener la 4.0.80 operativa, por si esto ayuda.

Gracias
Título: Re:Programación LUA
Publicado por: RToz99 en Marzo 05, 2016, 12:17:02 pm
ampliando lo de antes de "[ERROR] 12:03:52: line 10: attempt to compare number with nil"

tampoco me notifica los mensajes (por si acaso tenía viejos, desde configuración / accesos, he eliminado todos los dispositivos del sistema por si había alguno "huérfano") y si bien el botón reinicia el HC2, no notifica al dispositivo "seleccionado".

Pienso que debe ser algo de la 4.0.80?

Gracias

Título: Re:Programación LUA
Publicado por: linkey en Marzo 05, 2016, 22:04:35 pm
ampliando lo de antes de "[ERROR] 12:03:52: line 10: attempt to compare number with nil"

tampoco me notifica los mensajes (por si acaso tenía viejos, desde configuración / accesos, he eliminado todos los dispositivos del sistema por si había alguno "huérfano") y si bien el botón reinicia el HC2, no notifica al dispositivo "seleccionado".

Pienso que debe ser algo de la 4.0.80?

Gracias
Hola, creo que estas joyas como tu dices no las usa mucha gente, nadie me había reportado el problema.
Cuando instalas por primera vez el VD no tiene inicializada la etiqueta de memoria mínima y por eso no funciona, esto está solucionado en el código fuente pero el VD que subí al directorio /bin no lo tenía.
Por otra parte, al reiniciar pulsando el botón no avisa (se supone que ya estás enterado), solo avisa cuando reincida de forma automática, así que es por esto que no has podido ver esa funcionalidad.
He subido el VD correcto a github y lo dejo también por aquí, borra el dispositivo que tienes ahora e instala este.

Un saludo
Título: Re:Programación LUA
Publicado por: linkey en Marzo 05, 2016, 22:07:20 pm
Estoy viendo que sí que estas solucionado y subido pero en otra versión, es esta:
https://github.com/linkey21/HC2LUA-Reboot/archive/v1.1.1.zip
Título: Re:Programación LUA
Publicado por: RToz99 en Marzo 06, 2016, 17:56:38 pm
ampliando lo de antes de "[ERROR] 12:03:52: line 10: attempt to compare number with nil"

tampoco me notifica los mensajes (por si acaso tenía viejos, desde configuración / accesos, he eliminado todos los dispositivos del sistema por si había alguno "huérfano") y si bien el botón reinicia el HC2, no notifica al dispositivo "seleccionado".

Pienso que debe ser algo de la 4.0.80?

Gracias
Hola, creo que estas joyas como tu dices no las usa mucha gente, nadie me había reportado el problema.
Cuando instalas por primera vez el VD no tiene inicializada la etiqueta de memoria mínima y por eso no funciona, esto está solucionado en el código fuente pero el VD que subí al directorio /bin no lo tenía.
Por otra parte, al reiniciar pulsando el botón no avisa (se supone que ya estás enterado), solo avisa cuando reincida de forma automática, así que es por esto que no has podido ver esa funcionalidad.
He subido el VD correcto a github y lo dejo también por aquí, borra el dispositivo que tienes ahora e instala este.

Un saludo

gracias!!! ahora sí funciona!!! voy a trastearlo para tunearlo a mi gusto. Tú como lo tienes? cual es tu min?

Por cierto el ZIP no me va (https://github.com/linkey21/HC2LUA-Reboot/archive/v1.1.1.zip) El que has publicado suelto sí.

Por otro lado, lo que dices que nadie se mira las cosas, creo que somos muy pocos con Fibaro HC2. Yo en mi caso estoy encantado porque, al menos en mi caso con varias decenas de dispositivos "fibaro", funciona muy muy estable.

Ahora en serio, me voy a mirar tu github :)

Gracias
Título: Re:Programación LUA
Publicado por: Zuxa en Abril 19, 2016, 19:26:13 pm
Buenas!

Llevo 2 días con el tema de NAS el UPS y el HC2 y no consigo dar con la clave de porque no va...
Me he dado cuenta de que el archivo monitorHC2.sh que ha puesto jokin no es igual al que yo me baje del tutorial, entiendo que para que este funcione no me valen las variables globales que he creado segun el tuto no?
No obstante, no doy con la clave de porque no me funciona con el archivo que baje del tuto.
Os doy algunos datos de lo que estoy usando:

Synology DS216Play
APC Back-UPS 950VA
Fibaro HC2

Seguí todo el tutorial, y me di cuenta de que mi synology si que es capaz de ejecutar el script cada minuto sin usar cron, o al menos, eso entiendo yo en mi humilde ignorancia, adjunto captura.
En el dispositivo virtual que baje no pongo ni ip ni puerto, también he probado a ponerlos ya por desesperación xD.
Adjunto también como tengo las variables y el dispositivo.

PD: Jokin, te importaría pasarme tu VD para probar?

Gracias!
Saludos.  :)
Título: Re:Programación LUA
Publicado por: linkey en Abril 19, 2016, 19:43:26 pm
Yo retoqué los dispositivos virtuales UPS y NAS y el script que ejecuta el NAS y me funciona bien.
Tengo un en un Synology DS411slim y un APC BAckUp-UPS CS 650
Adjunto mi scripts y VD por si sirve de ayuda.
en la cabecera del script hay que configurar las credenciales, los nombres de las variables globales y la dirección IP del HC2.
Título: Re:Programación LUA
Publicado por: linkey en Abril 19, 2016, 19:44:37 pm
Los iconos
Título: Re:Programación LUA
Publicado por: Zuxa en Abril 19, 2016, 19:51:13 pm
Gracias! Voy a probarlo enseguida!
Tengo que generar variables distintas no?
En 2 grupos como las tienes tu?

Saludos!
Título: Re:Programación LUA
Publicado por: linkey en Abril 19, 2016, 20:06:21 pm
Gracias! Voy a probarlo enseguida!
Tengo que generar variables distintas no?
En 2 grupos como las tienes tu?

Saludos!
yo uso dos variables globales
valoresUPS
valoresNAS
Título: Re:Programación LUA
Publicado por: Zuxa en Abril 19, 2016, 20:24:23 pm
Vale, he creado las variables globales por separado, como tu has puesto, primero las he creado en español (Batería, Carga..) he probado y no funciona, he probado después a crearlas con los valores en ingles (upsInfoLoadValue, upsBatteryChargeValue) y tampoco... El nombre de la variable global lo he copiado tal como sale en el script (valoresNAS y valoresUPS) cada vez que he hecho el cambio le he dado a ejecutar el script manualmente.
Estoy hecho un lio... No se que leches estoy haciendo mal, en el script simplemente pongo la ip del HC2, el user y el pass.

Adjunto imagen de las variables.
Gracias, saludos   ::)
Título: Re:Programación LUA
Publicado por: linkey en Abril 19, 2016, 21:39:21 pm
Vale, he creado las variables globales por separado, como tu has puesto, primero las he creado en español (Batería, Carga..) he probado y no funciona, he probado después a crearlas con los valores en ingles (upsInfoLoadValue, upsBatteryChargeValue) y tampoco... El nombre de la variable global lo he copiado tal como sale en el script (valoresNAS y valoresUPS) cada vez que he hecho el cambio le he dado a ejecutar el script manualmente.
Estoy hecho un lio... No se que leches estoy haciendo mal, en el script simplemente pongo la ip del HC2, el user y el pass.

Adjunto imagen de las variables.
Gracias, saludos   ::)
Solo necesitas 2 variables
Título: Re:Programación LUA
Publicado por: linkey en Abril 19, 2016, 22:14:36 pm
El script que yo uso, solo hace falta que se ejecute al inicio del sistema, el propio script queda enviando la información cada 10 segundos
Título: Re:Programación LUA
Publicado por: Zuxa en Abril 20, 2016, 09:38:42 am
Buenas, sigo sin conseguirlo...
He quedado esta noche con un coleguita que es programador, a ver si el me puede dar un poco de luz, tengo esa sensación de que está bien pero me estoy equivocando en cualquier tontería...
En fin, muchas gracias linkey por tu ayuda!! No quiero seguir dando mucho la lata, así que a ver que sacamos esta noche, y con lo que sea os cuento.

Gracias!
Título: Re:Programación LUA
Publicado por: Zuxa en Abril 20, 2016, 18:02:42 pm
Buenas! se me a ocurrido acceder a la dirección donde el script hace referencia a la ubicación de la variable del HC2 y me encuentro con esto:

[{"name":"valoresNAS","value":"{\"temperature\":55,\"systemFanStatus\":1,\"cpuFanStatus\":1,\"modelName\":\"DS216play\",\"disk1Model\":\"SATA\",\"disk1Type\":\"32\",\"disk1Status\":,\"disk1Temp\":,\"disk2Model\":\"SATA\",\"disk2Type\":\"29\",\"disk2Status\":,\"disk2Temp\":,\"disk3Model\":\"\",\"disk3Type\":\"\",\"disk3Status\":1,,\"disk3Temp\":0,\"disk4Model\":\"\",\"disk4Type\":\"\",\"disk4Status\":1,,\"disk4Temp\":0}","readOnly":false,"isEnum":true,"enumValues":["{VAR_NAS}"]},{"name":"valoresUPS","value":"{","readOnly":false,"isEnum":true,"enumValues":["{VAR_UPS}"]}]

O yo veo cosas donde no las hay... o en ese codigo me da la sensación de que realmente si que están almacenandose los datos correctamente...
Estoy en lo cierto?
Si es así, porque puede ser que el VD no esta cogiendo esa información?

Iba a esperarme a esta noche, pero tenia un rato y me he vuelto a poner a trastear jajaja.

Gracias, saludos  ;)
Título: Re:Programación LUA
Publicado por: linkey en Abril 20, 2016, 19:05:20 pm
Si te refieres a
http://${HOMECENTER_IP}/api/globalVariables
efectivamente, son los valores almacenados en las variable y deberían ser leídos por los VD.
Que VD estás usando?, si usas mi script debes usar los VD que te puse yo en la entrada anterior.

Por lo que se ve en los valores que pones, la variable valoresNAS la está tomando pero no coge bien todos los valores, ten en cuenta que mi scripts esta adaptado por mi para obtener el máximo numero de datos de mi modelo de NAS y UPS y con los tuyos habría que ver como adaptarlo, mira a ver si tu amigo te echa una mano mirando el código del script y si no ya veremos como podemos lo hacer.
Título: Re:Programación LUA
Publicado por: Zuxa en Abril 21, 2016, 18:48:16 pm
Si te refieres a
http://${HOMECENTER_IP}/api/globalVariables
efectivamente, son los valores almacenados en las variable y deberían ser leídos por los VD.
Que VD estás usando?, si usas mi script debes usar los VD que te puse yo en la entrada anterior.

Por lo que se ve en los valores que pones, la variable valoresNAS la está tomando pero no coge bien todos los valores, ten en cuenta que mi scripts esta adaptado por mi para obtener el máximo numero de datos de mi modelo de NAS y UPS y con los tuyos habría que ver como adaptarlo, mira a ver si tu amigo te echa una mano mirando el código del script y si no ya veremos como podemos lo hacer.

Si, estoy usando los VD que colgaste, aun no hemos podido verlo.
Efectivamente, mi NAS es distinto al tuyo, ya que el mio es solo de 2 receptáculos entre otras cosas. Me imagino que si el VD cuando coge los datos de la variable no los tiene todos, pondrá los que tenga ¿no? es decir, si tiene la temperatura del NAS como es el caso, pero nada relativo al disco 3 y 4 puesto que no los hay.. esos campos deberían aparecer vacios o con algo que indique error ¿no?
Siento mi ignorancia al respecto, intento aprender como funciona el tema.

Gracias por las respuestas :)
Saludos.
Título: Re:Programación LUA
Publicado por: Zuxa en Abril 24, 2016, 12:49:38 pm
Buenas!

Ayer estuvimos dandole caña al tema, y mi colega pudo llegar a un resultado...
Hemos conseguido coger los valores que ves en la imagen que adjunto, aun asi, hemos tenido que cambiar algunas cosas, por ejemplo, el valor que en tu script te da el (diskstatus) en el mio da la temperatura xD, y otros valores aparecian en blanco, así que los hemos quitado por el momento, me he bajado el manual MIB de la pagina de synology y he estado mirando los OID ya que a mi corto entender, intuyo que van por ahi los tiros...
Del que no consigo nada es del UPS, el synology lo reconoce bien, y desde su panel me da todo ok, (marca, %de bateria cargada y demás) pero a la variable no llega nada, o al menos eso entiendo yo. Lo cuelgo: {"name":"valoresUPS","value":"0","readOnly":false,"isEnum":false,"created":1461169001,"modified":1461169001}
Y el HC2 da el error en la linea 22 del codigo: fibaro:setGlobal(upsStatus, valoresUPS.upsInfo1Status)
Así que cuando tengamos otro rato lo empezaremos a mirar.

Gracias linkey por tu ayuda, ahora le voy a poner la cabeza como un bombo a mi compi a ver si da con la clave del ups y se gana unas cervezas y de paso aprendo un poco más como funciona el tema.

Saludos  :D
 
Título: Re:Programación LUA
Publicado por: sduarte en Julio 13, 2016, 02:08:44 am
Buen dia

Muy buen foro, aproveche para descargar el temporizador virtual que es muy util, no tengo mucha experiencia con domotica por lo que no entendi la parte de la obtencion de dispositivos, por lo que planteo la busqueda un poco mas manual de dispositivos tipo switch, me ha funcionado, sin embargo es un esqueleto que quiero compartir para aportar a este foro. Aclaro que este dispositivo fue guiado y basado en el compartido en este foro.


agradezco la atencion y quedo atento a cualquier comentario.
Título: Re:Programación LUA
Publicado por: linkey en Julio 13, 2016, 08:17:13 am
Buen dia

Muy buen foro, aproveche para descargar el temporizador virtual que es muy util, no tengo mucha experiencia con domotica por lo que no entendi la parte de la obtencion de dispositivos, por lo que planteo la busqueda un poco mas manual de dispositivos tipo switch, me ha funcionado, sin embargo es un esqueleto que quiero compartir para aportar a este foro. Aclaro que este dispositivo fue guiado y basado en el compartido en este foro.


agradezco la atencion y quedo atento a cualquier comentario.

Creo que te has basado en la primera versión del temporizador, en este hilo (http://www.domoticadomestica.com/foro/index.php?topic=1216.0) tienes la 2.0
Título: Re:Programación LUA
Publicado por: adrian en Mayo 11, 2017, 17:59:46 pm
Hola buenas!

Hay alguna funcion en lua para que por ejemplo al llegar a la linea 15 del scrip vuelva a leer desde la diez?
Título: Re:Programación LUA
Publicado por: linkey en Mayo 11, 2017, 22:26:26 pm
Hola buenas!

Hay alguna funcion en lua para que por ejemplo al llegar a la linea 15 del scrip vuelva a leer desde la diez?
Mete las líneas en un bucle con una condición de salida.

con while
Código: [Seleccionar]
local condition = true
while condition do
  linea 1
  linea 2
  linea 3
  ...
  linea 10
 conditio = false
end
con for
Código: [Seleccionar]
for i=1,2 do
  linea 1
  linea 2
  linea 3
  ...
  linea 10
end

Título: Re:Programación LUA
Publicado por: smarthouse en Diciembre 13, 2017, 13:38:51 pm
Buenos días Estimados, quiero arrancar con la programación lua y no encuentro la forma de hacerlo, sobre todo para solucionar estos 2 problemas, que parecen sencillos pero no logro encontrar la solución:
1- Probé con escenas en bloque para encender 2 Luces exteriores 15 minutos antes de la puesta del sol y se apaguen 5 minutos después del amanecer. Para esto cree 2 escenas 1 para encender las luces y otras para apagarlas. La escena de apagado funciona correctamente y  lo deje con el modo en bloque. El problema lo tengo en el encendido de las luces a la noche, la única forma que se prenda es si desactivo la escena y la vuelvo activar (NO SE PORQUE MOTIVO PORQUE LO TENGO COMO AUTOMÄTICO).
Adjunto la escena del apagado es la misma que la de encendido, salvo que en la de encendido puse que si es de noche y las luces están apagadas entonces que se prendan

2- La otra escena es con los Door Windows para que prendan las luces cuando se abren, el problema es que cuando permanece abierta la puerta no se apaga las luces. Para eso cree otra escena que cuando detecta que la puerta está abierta más de 5 minutos que apague la Luz, el problema que tuve es que si no se cierra se vuelve a encender y apagar cada 5 minutos.

Muchas gracias!
Saludos cordiales!!!
Título: Re:Programación LUA
Publicado por: linkey en Diciembre 13, 2017, 20:16:20 pm
Hace mucho que no hacía nada en LUAm de hecho hacía mucho que no entraba por aquí.
Este es el código para encender al amanecer y apagar a anochecer, faltaría ponerle lo de 15minutos antes y 5 minutos después, repasa el código e intenta añadir tu esta funcionalidad.
Para ponerlo en marcha tienes que completar la listas de los id de los dispositivos que quieres encender/apagar en la variable "devices" dentro de las llaves separados por coma ",". Suerte!
local devices = {}

Código:
Código: [Seleccionar]
--[[
%% autostart
--]]

--[[ escena
sunSetONsunRiseOff.lua
por Manuel Pascual dic 2017
------------------------------------------------------------------------------]]

--[[variables de USUARIO ]]
-- lista de id de dispositivos separados por coma "," ej. {12,15,280}
local devices = {}


--[[enciende o apaga]]
function onOff(devices, action)
  for key, id in pairs(devices) do
    fibaro:debug(action..' id:'..id)
    fibaro:call(id, action);
  end
end

---[[calcula elos segundos hata el proximo horaMinuto hh:mm]]
function delay(horaMinuto)
  local year = tonumber(os.date("*t").year)
  local month = tonumber(os.date("*t").month)
  local day = tonumber(os.date("*t").day)
  local hour = tonumber(string.format("%1d", horaMinuto:sub(1,2)))
  local min = tonumber(string.format("%1d", horaMinuto:sub(4,5)))
  local delay =
    os.time{year=year, month=month, day=day, hour=hour, min=min} - os.time()
  if delay < 0 then delay = 86400 + delay end
  return delay
end

--[[Comienza la ejecución]]
local action = '';

--[[ ordenar acción en proximo anochecer ]]
local anochecer = fibaro:getValue(1, 'sunsetHour')
action='turnOn'
setTimeout(function() onOff(devices, action) end, toSunSet*1000)

--[[ ordenar acción en proximo amanecer ]]
local amanecer = fibaro:getValue(1, 'sunriseHour')
action='turnOff'
setTimeout(function() onOff(devices, action) end, delay*1000)
Título: Re:Programación LUA
Publicado por: linkey en Diciembre 13, 2017, 22:58:20 pm
Perdón el final de código estaba mal
Código: [Seleccionar]
--[[
%% autostart
--]]

--[[ escena
sunSetONsunRiseOff.lua
por Manuel Pascual dic 2017
------------------------------------------------------------------------------]]

--[[variables de USUARIO ]]
-- lista de id de dispositivos separados por coma "," ej. {12,15,280}
local devices = {}


--[[enciende o apaga]]
function onOff(devices, action)
  for key, id in pairs(devices) do
    fibaro:debug(action..' id:'..id)
    fibaro:call(id, action);
  end
end

---[[calcula elos segundos hata el proximo horaMinuto hh:mm]]
function delay(horaMinuto)
  local year = tonumber(os.date("*t").year)
  local month = tonumber(os.date("*t").month)
  local day = tonumber(os.date("*t").day)
  local hour = tonumber(string.format("%1d", horaMinuto:sub(1,2)))
  local min = tonumber(string.format("%1d", horaMinuto:sub(4,5)))
  local delay =
    os.time{year=year, month=month, day=day, hour=hour, min=min} - os.time()
  if delay < 0 then delay = 86400 + delay end
  return delay
end

--[[Comienza la ejecución]]
local action = '';

--[[ ordenar acción en proximo anochecer ]]
local anochecer = fibaro:getValue(1, 'sunsetHour')
action='turnOn'
setTimeout(function() onOff(devices, action) end, delay(anochecer)*1000)

--[[ ordenar acción en proximo amanecer ]]
local amanecer = fibaro:getValue(1, 'sunriseHour')
action='turnOff'
setTimeout(function() onOff(devices, action) end, delay(amanecer)*1000)
Título: Re:Programación LUA
Publicado por: smarthouse en Diciembre 14, 2017, 13:46:51 pm
Perdón el final de código estaba mal
Código: [Seleccionar]
--[[
%% autostart
--]]

--[[ escena
sunSetONsunRiseOff.lua
por Manuel Pascual dic 2017
------------------------------------------------------------------------------]]

--[[variables de USUARIO ]]
-- lista de id de dispositivos separados por coma "," ej. {12,15,280}
local devices = {}


--[[enciende o apaga]]
function onOff(devices, action)
  for key, id in pairs(devices) do
    fibaro:debug(action..' id:'..id)
    fibaro:call(id, action);
  end
end

---[[calcula elos segundos hata el proximo horaMinuto hh:mm]]
function delay(horaMinuto)
  local year = tonumber(os.date("*t").year)
  local month = tonumber(os.date("*t").month)
  local day = tonumber(os.date("*t").day)
  local hour = tonumber(string.format("%1d", horaMinuto:sub(1,2)))
  local min = tonumber(string.format("%1d", horaMinuto:sub(4,5)))
  local delay =
    os.time{year=year, month=month, day=day, hour=hour, min=min} - os.time()
  if delay < 0 then delay = 86400 + delay end
  return delay
end

--[[Comienza la ejecución]]
local action = '';

--[[ ordenar acción en proximo anochecer ]]
local anochecer = fibaro:getValue(1, 'sunsetHour')
action='turnOn'
setTimeout(function() onOff(devices, action) end, delay(anochecer)*1000)

--[[ ordenar acción en proximo amanecer ]]
local amanecer = fibaro:getValue(1, 'sunriseHour')
action='turnOff'
setTimeout(function() onOff(devices, action) end, delay(amanecer)*1000)
Muchas gracias Linkey!
Título: Re:Programación LUA
Publicado por: smarthouse en Febrero 16, 2018, 18:39:06 pm
@Linkey buenos días, quisiera crear la siguiente escena con LUA, pero no se como realizarla:
1- Tengo un Motion Sensor y un relay para prender las luces, el motion lo puse para detectar los autos en medio del garage, la tecla está alejada del Motion, cuando el motion detecta movimiento a la noche prende la luz 3 minutos, el problema surge cuando quiero prender la luz desde la tecla, es decir, prendo la luz desde la tecla, voy hacía el deposito y paso por el motion, y despúes de 3 minutos se me apaga y quedo a oscura en el garage hasta que pase nuevamente por el motion. Mi pregunta es, se puede generar una escena que al prender la luz desde la tecla me desactive la escena del motion?

2- Tengo un Door Windows que me activa una luz en el patio 5 minutos, el problema es cuando quiero estar más de 5 minutos en el patio tengo que volver abrir la puerta, y si quiero dejar la puerta abierta y la prendo de la app se me apaga a los 5 minutos tambien.
Título: Re:Programación LUA
Publicado por: linkey en Febrero 19, 2018, 14:10:11 pm
1- Tengo un Motion Sensor y un relay para prender las luces, el motion lo puse para detectar los autos en medio del garage, la tecla está alejada del Motion, cuando el motion detecta movimiento a la noche prende la luz 3 minutos, el problema surge cuando quiero prender la luz desde la tecla, es decir, prendo la luz desde la tecla, voy hacía el deposito y paso por el motion, y despúes de 3 minutos se me apaga y quedo a oscura en el garage hasta que pase nuevamente por el motion. Mi pregunta es, se puede generar una escena que al prender la luz desde la tecla me desactive la escena del motion?
Tienes ya algo hecho en LUA?.
tienes que hacer una escena que encienda La Luz durante X min solo si previamente no está encendida, de esta forma si la has encendido desde el interruptor la escena no se lanza y ni enciende (que ya estaría encendido) ni apaga a los X min.
Título: Re:Programación LUA
Publicado por: linkey en Febrero 19, 2018, 14:17:19 pm
2- Tengo un Door Windows que me activa una luz en el patio 5 minutos, el problema es cuando quiero estar más de 5 minutos en el patio tengo que volver abrir la puerta, y si quiero dejar la puerta abierta y la prendo de la app se me apaga a los 5 minutos tambien.
La escena debe dispararse cada vez que detecta presencia, esperar un segundo y quedarse en un bucle donde comprobará dos cosas, primero si se ha disparado otra instancia de la misma escena, en cuyo caso "se suicida" y segundo si ha pasado ya el tiempo establecido en cuyo caso sale del bucle y apaga La Luz.

De esta forma siempre queda activa la instancia de la escena que se haya disparado más tarde y la luz solo se apagará después de el tiempo indicado tras la última activación.

Creo que ya he subido algún código que hace estas cosas en algún hilo, usa la herramienta de búsqueda.
Título: Re:Programación LUA
Publicado por: smarthouse en Febrero 19, 2018, 14:30:15 pm
Buen dia Linkey, hice uno muy sencillo para chequear y apagar las luces si estan prendidas durante el día. Esa escena lo hice con Bloque, pero tengo el problema que te comente. Lo he hecho en las condiciones en bloque pero cuando la enciende manual y pasa por el motion empieza a correr la escena. Acá lo pasé a lua

--[[
%% autostart
%% properties
81 value
182 value
%% weather
%% events
%% globals
--]]

local startSource = fibaro:getSourceTrigger();
if (
 ( tonumber(fibaro:getValue(81, "value")) == 0  and  fibaro:getGlobalValue("DiaNoche") == "Noche"  and  tonumber(fibaro:getValue(182, "value")) > 0 )
or
startSource["type"] == "other"
)
then
   fibaro:call(81, "turnOn");
   setTimeout(function()
      fibaro:call(81, "turnOff");
   end, 180000)
end
Título: Re:Programación LUA
Publicado por: smarthouse en Febrero 19, 2018, 14:38:09 pm
2- Tengo un Door Windows que me activa una luz en el patio 5 minutos, el problema es cuando quiero estar más de 5 minutos en el patio tengo que volver abrir la puerta, y si quiero dejar la puerta abierta y la prendo de la app se me apaga a los 5 minutos tambien.
La escena debe dispararse cada vez que detecta presencia, esperar un segundo y quedarse en un bucle donde comprobará dos cosas, primero si se ha disparado otra instancia de la misma escena, en cuyo caso "se suicida" y segundo si ha pasado ya el tiempo establecido en cuyo caso sale del bucle y apaga La Luz.

De esta forma siempre queda activa la instancia de la escena que se haya disparado más tarde y la luz solo se apagará después de el tiempo indicado tras la última activación.

Creo que ya he subido algún código que hace estas cosas en algún hilo, usa la herramienta de búsqueda.

Oka, reviso los post, claro pero debo también tener un motion sensor para esto no?
Título: Re:Programación LUA
Publicado por: linkey en Febrero 19, 2018, 16:43:09 pm
2- Tengo un Door Windows que me activa una luz en el patio 5 minutos, el problema es cuando quiero estar más de 5 minutos en el patio tengo que volver abrir la puerta, y si quiero dejar la puerta abierta y la prendo de la app se me apaga a los 5 minutos tambien.
La escena debe dispararse cada vez que detecta presencia, esperar un segundo y quedarse en un bucle donde comprobará dos cosas, primero si se ha disparado otra instancia de la misma escena, en cuyo caso "se suicida" y segundo si ha pasado ya el tiempo establecido en cuyo caso sale del bucle y apaga La Luz.

De esta forma siempre queda activa la instancia de la escena que se haya disparado más tarde y la luz solo se apagará después de el tiempo indicado tras la última activación.

Creo que ya he subido algún código que hace estas cosas en algún hilo, usa la herramienta de búsqueda.

Oka, reviso los post, claro pero debo también tener un motion sensor para esto no?
Perdona, es verdad!, esta escena se activa con un detector de apertura.
Sin un detector de presencia...
La escena se desencadena por apertura de puerta, espera un segundo y entra en un bucle donde comprobará si se ha disparado otra instancia de la misma escena, en cuyo caso "se suicida", luego comprueba si (ha pasado el tiempo y la puerta está cerrada) si se cumplen las dos, sale del bucle y apaga la luz.
De esta forma si alguien cierra y abre de nuevo empieza el tiempo a contar y si dejas la puerta abierta no se apaga aunque pase el tiempo a no ser que cierres la puerta.

Yo pondría alguna condición mas que controlara un límite de tiempo máximo en cuyo caso salga del bucle para que no se quede la puerta abierta y la luz encendida para siempre.
 
Título: predicción meteorológica AEMET
Publicado por: linkey en Marzo 20, 2018, 19:47:51 pm
Adjunto un nuevo proyecto de escenas para obtener la información de predicción meteorológica publicada por la Agencia Estatal de meteorología.
Espero que os sirva!
Título: Re:Programación LUA
Publicado por: otravex en Junio 21, 2018, 22:39:52 pm
Hola
Estoy intentando realizar una función con lúa pero no lo consigo
Al leer un valor , si es verdadero mándame un mensaje (5555) y si es falso mándame otro mensaje(66666)
Está bien así ?



value = grp.getvalue(0/2/1)
if value==true then
  telegram('555555555555555555555555')
elseif value==false then
    telegram('6666666666666666666666666')
end
Título: Re:Programación LUA
Publicado por: linkey en Junio 22, 2018, 09:21:55 am
Hola
Estoy intentando realizar una función con lúa pero no lo consigo
Al leer un valor , si es verdadero mándame un mensaje (5555) y si es falso mándame otro mensaje(66666)
Está bien así ?



value = grp.getvalue(0/2/1)
if value==true then
  telegram('555555555555555555555555')
elseif value==false then
    telegram('6666666666666666666666666')
end

Código: [Seleccionar]
function message(value)
  if value then return '5555' end
  return '6666'
end

telegram(message(grp.getvalue(0/2/1)));
Título: Re:Programación LUA
Publicado por: otravex en Junio 22, 2018, 19:31:05 pm
Muchas gracias
Esta noche lo pruebo
Título: Re:Programación LUA
Publicado por: otravex en Junio 23, 2018, 11:54:00 am
probado y funcionando
mi funcion tambien funciona el problema que tenia era a quien le pedia el valor no es al grupo sino al evento

value = event.getvalue(0/2/1)
if value==true then
  telegram('open')
elseif value==false then
  telegram('closed')
end


ahora necesito que un interruptor active o desactive esta funcion , voy a ver que es lo que consigo!!!!!
un saludo!!
Título: Re:Programación LUA
Publicado por: smarthouse en Agosto 09, 2018, 15:03:09 pm
Buenos días @linkey, se puede hacer la siguiente escena mediante lua:
Datos:
1 fgs223
1 door windos 2
1 motion sensor

Tengo el fgs223 conectado a 2 teclas tipo pulsadores.
Tengo una escena que al abrir la puerta exterior me prende la luz exterior por 3 minutos, y otra que si me detecta el motion sensor interior se encienda la luz interior por 5 minutos.
Problema: si quiero permanecer adentro del garage por más de 5 minutos y no me detecta se me apaga la luz.
Por lo tanto quisiera que al hacer un click en el pulsador se me desactive la escena, y al hacer 2 click me la active nuevamente.

Se podrá hacer?
Título: Re:Programación LUA
Publicado por: linkey en Agosto 10, 2018, 10:55:39 am
Tendría que ver la escena que dices que te enciende el garaje por 5 min, supongo que lo que hace es dispararse al detectarse, esperar 5 min y apagarse, por eso se apaga si o si a los 5min aunque te detecte de nuevo y se dispare otra instancia de la escena, me parece raro que no te detecte en 5min, seguro que cuando se apaga si te mueves se vuelve a encender.
Creo que ya hemos tratado este tema, habría que hacer una escena que lo primero comprobara si existen otras instancias en ejecución de la misma escena para eliminarlas y que quedase la última en ejecución por 5min más.
Título: Re:Programación LUA
Publicado por: linkey en Agosto 10, 2018, 10:59:44 am
Buenos días @linkey, se puede hacer la siguiente escena mediante lua:
Datos:
1 fgs223
1 door windos 2
1 motion sensor

Tengo el fgs223 conectado a 2 teclas tipo pulsadores.
Tengo una escena que al abrir la puerta exterior me prende la luz exterior por 3 minutos, y otra que si me detecta el motion sensor interior se encienda la luz interior por 5 minutos.
Problema: si quiero permanecer adentro del garage por más de 5 minutos y no me detecta se me apaga la luz.
Por lo tanto quisiera que al hacer un click en el pulsador se me desactive la escena, y al hacer 2 click me la active nuevamente.

Se podrá hacer?
Échale un vistazo a este hilo (http://www.domoticadomestica.com/foro/index.php?topic=1582.msg15671#msg15671)
Título: Re:Programación LUA
Publicado por: smarthouse en Agosto 10, 2018, 14:17:25 pm
Buenos días @linkey, se puede hacer la siguiente escena mediante lua:
Datos:
1 fgs223
1 door windos 2
1 motion sensor

Tengo el fgs223 conectado a 2 teclas tipo pulsadores.
Tengo una escena que al abrir la puerta exterior me prende la luz exterior por 3 minutos, y otra que si me detecta el motion sensor interior se encienda la luz interior por 5 minutos.
Problema: si quiero permanecer adentro del garage por más de 5 minutos y no me detecta se me apaga la luz.
Por lo tanto quisiera que al hacer un click en el pulsador se me desactive la escena, y al hacer 2 click me la active nuevamente.

Se podrá hacer?
Échale un vistazo a este hilo (http://www.domoticadomestica.com/foro/index.php?topic=1582.msg15671#msg15671)

Eso lo he probado, pero no dio resultado, porque el motion está lejos del sector donde me hubico, y así tendría que pasar antes de los 5 minutos para que no se me apague y corra devuelta la escena. Lo que busco es que al abrir la puerta presione la tecla y ya automaticamente me desactive la escena, en algún lado he visto el CentralSceneEvent, lo he probado pero no funciona
Título: Re:Programación LUA
Publicado por: ruizcubo en Agosto 19, 2018, 23:57:39 pm
Hola a todos,
Yo tenía un problema similar y lo que he hecho es coger una escena LUA que encontré por internet que controla luces en base al movimento y lo que he hecho es ampliarla un poco para:
1. En la config de cada luz le indico si quiero que se Apague sola pasado el tiempo independientemente de como se encendió, que se apague sola únicamente si fue encendida por la escena y no a mano, que no se apague sola en ningún caso.
2. Tengo una variable global donde guardo desde la escena el id de la luz cada vez que una luz se enciende de forma automática (así luego puedo sólo apagar desde la escena aquellas que fueron encendidas desde la escena)

Así puedo configurar en casa las luces de forma distinta. Por ejemplo, zonas de paso como pasillos y escaleras, le pongo siempre AutoOFF aunque la haya encendido a mano. Estancias como un baño, le pongo AutoOFF sólo si la encendió la escena, así si quiero entrar al baño por largo tiempo enciendo a mano y la escena no me la apaga. (la mampara de ducha evita el detector de movimiento :) y no mola ducharse a oscuras)

Por si os sirve de ayuda...
Si alguien quiere el código lo puedo compartir aunque no esté muy fino, funciona! ;)
Un saludo
Título: Re:Programación LUA
Publicado por: smarthouse en Agosto 21, 2018, 13:03:18 pm
Hola a todos,
Yo tenía un problema similar y lo que he hecho es coger una escena LUA que encontré por internet que controla luces en base al movimento y lo que he hecho es ampliarla un poco para:
1. En la config de cada luz le indico si quiero que se Apague sola pasado el tiempo independientemente de como se encendió, que se apague sola únicamente si fue encendida por la escena y no a mano, que no se apague sola en ningún caso.
2. Tengo una variable global donde guardo desde la escena el id de la luz cada vez que una luz se enciende de forma automática (así luego puedo sólo apagar desde la escena aquellas que fueron encendidas desde la escena)

Así puedo configurar en casa las luces de forma distinta. Por ejemplo, zonas de paso como pasillos y escaleras, le pongo siempre AutoOFF aunque la haya encendido a mano. Estancias como un baño, le pongo AutoOFF sólo si la encendió la escena, así si quiero entrar al baño por largo tiempo enciendo a mano y la escena no me la apaga. (la mampara de ducha evita el detector de movimiento :) y no mola ducharse a oscuras)

Por si os sirve de ayuda...
Si alguien quiere el código lo puedo compartir aunque no esté muy fino, funciona! ;)
Un saludo
Hola @ruizcubo genial, dale bárbaro, te agradecería si podrías compartirlo !!
Título: Re:Programación LUA
Publicado por: ruizcubo en Agosto 22, 2018, 19:55:24 pm
Hola,
sin problema, aquí lo comparto y explico un poco.
He de decir que la mayor parte del código es de un tal Remi, como aparece en los comentarios y que por supuesto he dejado como autor del mismo.
Instrucciones:
1. Crear una escena con el código LUA adjunto.
2. Cambiar en el código:
  2.1. Las lineas iniciales 3,4,5, poner los IDs de los sensores de movimiento que deben disparar la escena. Tantos como queramos controlar.
  2.2. Cambiar las lineas 77,78,79 y poner la configuración para cada sensor de movimiento que luz se quiere controlar. Ver los comentarios. Yo he añadido el último parámetro, AutoOFF, que controla si la luz se debe Apagar a mano (0), Si se apaga "sola" si se encendió "sola" (1) o si queremos que se apague sola en cualquier caso (2).
Tipicamente usaremos (1) en las zonas de estancia y (2) en las zonas de paso como pasillos y escaleras.

3. Crear variables globales:
 3.1 AutoLights. Da igual el valor inicial que se ponga, el código lo reseteará y pondrá una tabla con los Ids de las luces que ha encendido, para saber si las debe apagar AutoOFF=1. Sería conveniente que si tenéis otras escenas que controlan luces (por ejemplo, "Apaga Todas las Luces"), que limpiara esta variable también. No es importante pero podría ocurrir que el AutoOFF no funcione bien en el siguiente uso porque quedan configuraciones previas. Sería sólo una vez.
3.2 isNight. Estoy seguro que todos tenéis una escena que se encarga de gestionar una variable como esta que tiene un 1 si es de Noche y un 0 si es de dia. Si alguien necesita una escena para esto que lo diga. Cambiar el código con el nombre que ya tengáis para dicha variable.

3.3 ghostMode. Valor por defecto 0. Esta variable es para activar un modo invisible. La he puesto hoy ya que anoche tenía que hacer de "Ratón Pérez" y es muy inconveniente ser descubierto por tu propia domótica  ;). Esta variable no es necesaria, si no se quiere esta función. Si no existe el código funciona igual. Si su valor es 1 la escena no hace nada. Tengo otro código para poner a 1 que uso desde un botón de un dispositivo virtual que la pone a 1 durante unos minutos para poder moverme "a oscuras" por la casa.

Espero que os sirva!
Si tenéis preguntas no dudéis en lanzarlas!

Y aprovecho para agradecer a Linkey por su código para control de la calefacción con dispositivos virtuales, es brutal. Lo he adaptado en mi sistema por suelo radiante y funciona genial. Gracias! (por cierto, no lo he encontrado ya por el foro, merecería una chincheta)

Un saludo
Juan Carlos
Título: Re:Programación LUA
Publicado por: linkey en Septiembre 06, 2018, 09:17:51 am
...
Y aprovecho para agradecer a Linkey por su código para control de la calefacción con dispositivos virtuales, es brutal. Lo he adaptado en mi sistema por suelo radiante y funciona genial. Gracias! (por cierto, no lo he encontrado ya por el foro, merecería una chincheta)

Un saludo
Juan Carlos

De nada.
Título: Re:Programación LUA
Publicado por: smarthouse en Noviembre 07, 2018, 13:31:33 pm
Hola, creé esta escena, donde me gustaría que fuera NOCHE o que no haya movimiento durante 10 minutos, apague el aire. Pero no puedo hacer que funcione, no sé dónde está el error. Los dispositivos que tengo son un fgs223 conectado al aire, un remotec zxt-120 y un capitán de movimiento Fibaro.

El mismo elegido fue producido cuando la variable está en calor y eso y movimiento, luego enciende el aire.
Prender:
--[[
%% autostart
%% properties
71 value
%% weather
%% events
%% globals
--]]

if fibaro:countScenes() > 1  then
  fibaro:abort()
end

local startSource = fibaro:getSourceTrigger();
if (
 ( fibaro:getGlobalValue("DiaNoche") == "Dia"  and  fibaro:getGlobalValue("FrioCalor") == "Calor"  and  tonumber(fibaro:getValue(71, "value")) > 0 ))
then
   fibaro:call(85, "turnOn");
   fibaro:call(56, "setMode", "2");
   fibaro:call(54, "setThermostatSetpoint", "1", "24");
end


Apagar:
--[[
%% autostart
%% properties
85 value
%% weather
%% events
%% globals
DiaNoche
--]]

local startSource = fibaro:getSourceTrigger();
if (
 ( fibaro:getGlobalValue("DiaNoche") == "Noche"  and  tonumber(fibaro:getValue(85, "value")) > 0 ))

  if (
      ( tonumber(fibaro:getValue(71, "value")) == 0 )) then
setTimeout(function()
local delayedCheck0 = false;
local tempDeviceState0, deviceLastModification0 = fibaro:get(71, "value");
if (( tonumber(fibaro:getValue(71, "value")) == 0 ) and (os.time() - deviceLastModification0) >= 600) then
    delayedCheck0 = true;
end
  then
    fibaro:call(85, "turnOff");
    fibaro:call(56, "setMode","0");
     
end