Ga naar de inhoud
Home » Alle kleuren doorlopen in een RGB lamp

Alle kleuren doorlopen in een RGB lamp

Domoticz Blog Header

De meest simple is een globale functie maken in Domoticz:

------------------------------------------------------------------------
--
-- RGB kleuren doorlopen, dit wordt gedaan in 360 stappen, elke seconde een stap.
-- Dus er is 360 seconden nodig en dat is 6 minuten.
-- Roep haar dus 1 keer in de 6 minuten aan.
--
-- domoticz is de data van de omgeving
-- idx is het id van de lamp
-- brightnessay is helderheid 0 .. 100 
--
-- Return waarde is true 
--
-- Let op: de lamp wordt ook elke seconde aangezet (door setHue(). Als je
-- via de UI de lamp uitzet .... na 1 seconde gaat ze weer aan.
--
------------------------------------------------------------------------
RGBwalkthrough = function (domoticz, idx, brightness)
local min = 0
local max = 359
  for hue = min, max, 1 do
    -- setHue(hue, brightness, isWhite)
    --
    -- hue: 0 .. 359 (360 is gelijk aan 0)
    -- brightness: 0 .. 100
    -- isWhite: true voor witte lamp, false voor RGB
    --
    domoticz.devices(idx).setHue(hue, brightness, false).afterSec(hue)
  end
  return true
end,

En dan een dzVents – Timer script maken:

return {
         on = {
               timer = {
                         'every 6 minutes', 
                       }
               },
         logging = {
         level = domoticz.LOG_INFO,
         marker = 'RGBDoorlopen',
},

execute = function(domoticz, timer)
local dg = require ("Global")

-- domoticz.log('Timer event was triggered by ' .. timer.trigger, domoticz.LOG_INFO)
-- os.execute("/usr/local/bin/telegramsend RGBDoorlopen")

local boekenkast = dg.helpers.RGBwalkthrough(domoticz, 2005,60)
local opluidspreker = dg.helpers.RGBwalkthrough(domoticz, 2002,60)

end
}

In  bovenstaand voorbeeld zijn er twee lampen, 2002 en 2005

Het geheel wordt in 360 stappen doorlopen, dus 6 minuten. Wil je wat kleinere stappen dan is het ff wat meer prutsen. De lampen zullen continu van kleur veranderen. Uitzetten gaat niet, tenzij je een ouderwets schakelaartje gebruikt voor elke lamp of op een andere manier de lamp van het stroom haalt.

(Bash) Script met LUA Variabelen

In dit voorbeeld zijn er twee RGB LED lampen met Idx 1779 en 1780.

Er zijn 5 user variabelen. 3 (type integer) voor de kleur: ROOD, GROEN, BLAUW en 1 (type integer) voor de commit van de kleuren: CommitRGB en een user variable (integer) HELDERHEID om de helderheid te zetten.

Er is een scriptje op de domoticz server (in bijvoorbeeld /usr/local/bin/loopRGB):

#!/bin/bash
CURL=curl
CURLOPTS="--silent"
ADDRESS=domoticz:8080
MAX=255
SLEEPTIME=1

# Counters for the for loops
R1UP="0 1 2" 
R1DOWN="2 1 0"

R2UP="0 1 2 3 4 5 6 7 8 9"
R2DOWN="9 8 7 6 5 4 3 2 1 0"

R3UP="0 1 2 3 4 5 6 7 8 9"
R3DOWN="9 8 7 6 5 4 3 2 1 0"

function SetRGB () {
  r=$1
  g=$2
  b=$3

  #
  # eerst de kleuren zetten
  #
  ${CURL} ${CURLOPTS} \
          ${ADDRESS}/json.htm?type=command\&param=updateuservariable\&vname=ROOD\&vtype=0\&vvalue=${r} 2>/dev/null 1>/dev/null
  ${CURL} ${CURLOPTS} \
          ${ADDRESS}/json.htm?type=command\&param=updateuservariable\&vname=GROEN\&vtype=0\&vvalue=${g} 2>/dev/null 1>/dev/null
  ${CURL} ${CURLOPTS} \
          ${ADDRESS}/json.htm?type=command\&param=updateuservariable\&vname=BLAUW\&vtype=0\&vvalue=${b} 2>/dev/null 1>/dev/null

  #
  # en nu de commit
  # je hoeft geen waarde te veranderen. Een waarde erin zetten is genoeg :)
  #
  ${CURL} ${CURLOPTS} \
          ${ADDRESS}/json.htm?type=command\&param=updateuservariable\&vname=CommitRGB\&vtype=0\&vvalue=1 2>/dev/null 1>/dev/null
}

#
# Let the PA know we started
#
/home/pi/bin/telegramsend domoticz: loopRGB started

#
# We need to keep looping and looping :)
#
# The service /etc/systemd/system/loopRGB.service is watching us
#
while true
do
  # Red to Yellow 255 0+ 0
  for R1 in ${R1UP}
  do
    for R2 in ${R2UP}
    do
      for R3 in ${R3UP}
      do
        VAR100=$((${R1}*100))
        VAR10=$((${R2}*10))
        VARVALUE=$((${VAR100}+${VAR10}+${R3}))
        if [ ${VARVALUE} -le ${MAX} ] ; then
        {
          SetRGB 255 ${VARVALUE} 0
          sleep ${SLEEPTIME}
        }
        else
        {
          # we are at 256, get out
          break 3
        }
        fi
      done
    done
  done 

  # Yellow to Lime 255- 255 0
  for R1 in ${R1DOWN}
  do
    for R2 in ${R2DOWN}
    do
      for R3 in ${R3DOWN}
      do
        VAR100=$((${R1}*100))
        VAR10=$((${R2}*10))
        VARVALUE=$((${VAR100}+${VAR10}+${R3}))
        #VARVALUE=$(($R1*100+$R2*10+$R3))
        if [ ${VARVALUE} -le ${MAX} ] ; then
        {
          SetRGB ${VARVALUE} 255 0
          sleep ${SLEEPTIME}
        }
        fi
      done
    done
  done 

  # Lime to Aqua 0 255 0+
  for R1 in ${R1UP}
  do
    for R2 in ${R2UP}
    do
      for R3 in ${R3UP}
      do
        VAR100=$((${R1}*100))
        VAR10=$((${R2}*10))
        VARVALUE=$((${VAR100}+${VAR10}+${R3}))
        #VARVALUE=$(($R1*100+$R2*10+$R3))
        if [ ${VARVALUE} -le ${MAX} ] ; then
        { 
          SetRGB 0 255 ${VARVALUE}
          sleep ${SLEEPTIME}
        }
        else
        {
  	# we are at 256, get out
          break 3
        }
        fi
      done
    done
  done 

  # Aqua to Blue 0 255- 255
  for R1 in ${R1DOWN}
  do
    for R2 in ${R2DOWN}
    do
      for R3 in ${R3DOWN} 
      do
        VAR100=$((${R1}*100))
        VAR10=$((${R2}*10))
        VARVALUE=$((${VAR100}+${VAR10}+${R3}))
        #VARVALUE=$(($R1*100+$R2*10+$R3))
        if [ ${VARVALUE} -le ${MAX} ] ; then
        {
          SetRGB 0 ${VARVALUE} 255
          sleep ${SLEEPTIME}
        }
        fi
      done
    done
  done 

  # Blue to Fuchsia 0+ 0 255
  for R1 in ${R1UP}
  do
    for R2 in ${R2UP}
    do
      for R3 in ${R3UP}
      do
        VAR100=$((${R1}*100))
        VAR10=$((${R2}*10))
        VARVALUE=$((${VAR100}+${VAR10}+${R3}))
        #VARVALUE=$(($R1*100+$R2*10+$R3))
        if [ ${VARVALUE} -le ${MAX} ] ; then
        { 
          SetRGB ${VARVALUE} 0 255
          sleep ${SLEEPTIME}
        }
        else
        {
          # we are at 256, get out
          break 3
        }
        fi
      done
    done
  done 


  # Fuchsia to Red 255 0 255-
  for R1 in ${R1DOWN}
  do
    for R2 in ${R2DOWN}
    do
      for R3 in ${R3DOWN} 
      do
        VAR100=$((${R1}*100))
        VAR10=$((${R2}*10))
        VARVALUE=$((${VAR100}+${VAR10}+${R3}))
        #VARVALUE=$(($R1*100+$R2*10+$R3))
        if [ ${VARVALUE} -le ${MAX} ] ; then
        {
          SetRGB 255 0 ${VARVALUE}
          sleep ${SLEEPTIME}
        }
        fi
      done
    done
  done 
done # forever

exit 0

Dit scriptje veranderd de ROOD/GROEN/BLAUW/CommitRGB waardes, slaapt daarna even en daarna veranderd  ….

Er is een systemd service loopRGB in /etc/systemd/system/loopRGB.service

[Unit]
Description=Service to loop RGB colours for Domoticz
After=domoticz.service

[Service]
User=pi
Group=pi
Type=simple
WorkingDirectory=/tmp
ExecStart=/usr/local/bin/loopRGB
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-abort

[Install]
WantedBy=multi-user.target

 

Start deze service via:

sudo systemctl start loopRGBsudo systemctl enable loopRGBsudo systemctl status loopRGB

Maak ook een dzVents – Variable sciprt aan:

return {
	on = {
		variables = {
			'CommitRGB',
		},
	},
	logging = {
		level = domoticz.LOG_INFO,
		marker = 'CommitRGB',
	},
	execute = function(domoticz, variable)
		--domoticz.log('Variable ' .. variable.name .. ' was changed', domoticz.LOG_INFO)
		local dz = domoticz
		
		local r      = domoticz.variables('ROOD').value       -- 0..255 
        local g      = domoticz.variables('GROEN').value      -- 0..255
        local b      = domoticz.variables('BLAUW').value      -- 0..255
        local bright = domoticz.variables('HELDERHEID').value -- 0..100
        local mode   = 4   -- color mode 
                           -- 0=illegal, 
                           -- 1=white Valid fields: none, 
                           -- 2=White with color temperature. Valid fields: t, 
                           -- 3=Color. Valid fields: r, g, b, 
                           -- 4=Custom (color + white). Valid fields: r, g, b, cw, ww, depending on device capabilities
        local temp   = 0   -- temperatuur 0 (cold)..255(warm)
        local cw     = 0   -- cold white level 0..255
        local ww     = 0   -- warm white level 0..255 (also used as level for monochrome white)
        
		-- ALS de kamer verlichtings schakelaar 'On' is dan verzend de kleur code en helderheid
		-- ANDERS ze de keukenlampen uit
		if dz.devices(1668).state == 'On' then
		    dz.devices(1779).setColor(r, g, b, bright) -- Keukenlamp RGB Rechts
		    dz.devices(1780).setColor(r, g, b, bright) -- Keukenlamp RGB Links
	    else
	        dz.devices(1779).switchOff()
	        dz.devices(1780).switchOff()
		end
		-- domoticz.log('r= ' .. r .. ' g= ' .. g .. ' b= ' .. b .. ' ', domoticz.LOG_INFO)
		
	end
}

Elke keer als de CommitRGB variable veranderd, wordt dit script getriggerd.

De lampen zullen continu van kleur veranderen. Uitzetten gaat niet, tenzij je een ouderwets schakelaartje gebruikt voor elke lamp of op een andere manier de lamp van het stroom haalt.