use of special characters  [Solved]

Easy to use, 100% Lua-based event scripting framework.

Moderator: leecollings

Post Reply
pvklink
Posts: 822
Joined: Wednesday 12 November 2014 15:01
Target OS: Raspberry Pi / ODroid
Domoticz version: latest b
Contact:

use of special characters

Post by pvklink »

Hi,

I rewrote my denon script with my last experiences :-)
I have a lot of valuelist(4) that i have to decode to make denon commands of it.
I have the script error free , but i know this is not going to work because of a not correct value of a variable.

For example

--elseif denon_mixer.state == 'video game' then SourceToSet3 = 'VIDEO+GAME';

is now adressed by checking a range

local mixer_states = {
movie = 'MOVIE',
stereo = 'STEREO',
mch_stereo = 'MCH_STEREO',
dolby_digital = 'DOLBY_DIGITAL',
music = 'MUSIC',
game = 'GAME',
pure_direct = 'PURE_DIRECT',
direct = 'DIRECT',
standaard = 'STANDARD',
simulation = 'SIMULATION',
auto = 'AUTO',
left='LEFT',
video_game = 'VIDEO_GAME',
rock_arena = 'ROCK_ARENA'
}

Problem 1. Dzvents does not accept a special character '+' like variable = 'VIDEO+GAME'. My denon needs this sign in the command.
So i change it temporary to solve the error.
Problem 2 My selection list also had video game as a value, but i think the space will be a problem.
This one can be solved by changing my selecting device item from video game to video_game. But just curious if this is easy to solve too (no main issue, i can add _ sign for spaces)

Code: Select all


return {
	on = {devices = {'denon*' }},
    
    execute = function(dz, item,info)
    _G.logLevel = dz.helpers.get_logtype(dz)    -- dz.log('debug test',dz.LOG_DEBUG) this will only make it to the log when LOG_DEBUG is set  AND dz.log('blabla',dz.LOG_FORCE) -- this will allways make it tp the log
    _G.logMarker = _G.moduleLabel -- marker wordt scriptnaam, _G.logMarker = info.scriptName is idem
    local messageTable = {}       -- log alles, 0 = niets, 1 dom, 2 global, 3 alles... evt per regel ook in te regelen
    -- HIER START DE EXECUTIE

    local denon_volume  = dz.devices('denon_volume')
    local denon_source  = dz.devices('denon_source')
    local denon_radio   = dz.devices('denon_radio')
    local denon_mixer   = dz.devices('denon_mixer')
    local ipdenon       = '192.168.20.26'

    local volume        = -50
    local SourceToSet1  = 'TUNER'
    local SourceToSet2  = '009540'
    local SourceToSet3  = 'STEREO'
    
    local denon_cmd_1   = 'curl http://' .. ipdenon .. '/MainZone/index.put.asp?cmd0='   -- basiscommando
    local denon_cmd_2   = 'curl http://' .. ipdenon .. '/Tuner/TUNER/index.put.asp?cmd0='   -- basiscommando

    local volume_states =   { fluister = -20, zacht = -10, medium = volume, hard = 10, extra = 20,}
    local source_states =   { Radio = 'TUNER', Tv = 'SAT/CBL', Sonos = 'CD', Kodi = 'MPLAY', Pc = 'GAME', Cast = 'BD'}
    local radio_states =    {Skyradio = '010440',Qmusic = '009540', Veronica = '009490', radio538 = '010500',West = '008890' } -- LET OP OORSPRONKELIJKE WAARDE WAS 538 nu radio538 !! dus nog aanpassen in de treklijst
    local mixer_states =    {   
                            movie = 'MOVIE',
                            stereo = 'STEREO',
                            mch_stereo = 'MCH_STEREO',              
                            dolby_digital = 'DOLBY_DIGITAL',        
                            music = 'MUSIC',
                            game = 'GAME',
                            pure_direct = 'PURE_DIRECT',            
                            direct = 'DIRECT',
                            standaard = 'STANDARD',
                            simulation = 'SIMULATION', 
                            auto = 'AUTO',
                            left='LEFT', 
                            video_game = 'VIDEO_GAME',                
                            rock_arena = 'ROCK_ARENA'     
                            }
--  LET OP: alle vars met spaties vervangen door _ en de + in MCH+STEREO ook vervangen door een _. Nu geen foutmeldingen, maar mn stereo gaat dit niet accepteren!
--  LET OP: alle vars met spaties vervangen door _ en de + in DOLBY+DIGITAL ook vervangen door een _. Nu geen foutmeldingen, maar mn stereo gaat dit niet accepteren!
--  LET OP: alle vars met spaties vervangen door _ en de + in PURE+DIRECT ook vervangen door een _. Nu geen foutmeldingen, maar mn stereo gaat dit niet accepteren!
--  LET OP: alle vars met spaties vervangen door _ en de + in VIDEO+GAME ook vervangen door een _ nu geen foutmeldingen, maar mn stereo gaat dit niet accepteren!
--  LET OP: alle vars met spaties vervangen door _ en de + in ROCK+ARENA door een _.  Nu geen foutmeldingen, maar mn stereo gaat dit niet accepteren!


    local function get_waarde(dev_state, waardebereik, defvalue )  -- haal waarde op voor een dev_state, doorzoek een waardebereik en geef bij geen hit defvalue terug
            for i_state, i_waarde in pairs(waardebereik) do 
                if i_state == dev_state then return i_waarde end
            end
            return defvalue
    end
 
    if  item.name == 'denon_volume' and  string.upper(denon_volume.state) == 'UIT'    then  
        os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FOFF' );                                                      -- zet denon uit
        dz.helpers.globalMessage2(dz,item,info,messageTable,'add',' DENON UIT, denon is uitgezet',30)
    elseif item.name == 'denon_volume' and string.upper(denon_volume.state) ~= 'UIT' then
        os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FON' );                                                      -- zet denon aan
        dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON AAN, denon is aangezet',30)                                                   -- overtollig, dus op 0 gezet
    elseif item.name ~= 'denon_volume' and string.upper(denon_volume.state) == 'UIT' then
        denon_volume.switchSelector(20)                            
        os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FON' );                                                      -- zet denon aan
        dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON AAN, denon is aangezet',30)
    elseif item.name ~= 'denon_volume' and string.upper(denon_volume.state) ~= 'UIT' then
        dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON AAN, denon stond al aan',30)                                                  -- overtollig, dus op 0 gezet
    else
        dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON ERROR: onbekend situatie, item_name= ' .. item.name .. ' ,settings: ' .. denon_volume.state .. '/' .. denon_source.state .. '/' .. denon_radio.state .. '/' .. denon_mixer.state .. '/',10)
    end
 
    if string.upper(denon_volume.state) ~= 'UIT'    then                                                                      -- alleen maar settings toepassen als device ook aan staat

        --if      denon_volume.state  == 'fluister'   then  volume = volume -20
        --elseif  denon_volume.state  == 'zacht'      then  volume = volume -10
        --elseif  denon_volume.state  == 'medium'     then  volume = volume
        --elseif  denon_volume.state  == 'hard'       then  volume = volume + 10
        --elseif  denon_volume.state  == 'extra'      then  volume = volume + 20
        --end
        --os.execute (denon_cmd_1 .. 'PutMasterVolumeSet/' .. volume);                                           --set volume
        os.execute (denon_cmd_1 .. 'PutMasterVolumeSet/' .. get_waarde(denon_volume.state,volume_states , volume));    --set volume NOG TESTEN !!!!!!!
        
        --if denon_source.state       == 'Radio'  then    SourceToSet1 = 'TUNER';                                          -- zet source
        --elseif denon_source.state   == 'Tv'     then    SourceToSet1 = 'SAT/CBL';
        --elseif denon_source.state   == 'Sonos'  then    SourceToSet1 = 'CD';
        --elseif denon_source.state   == 'Kodi'   then    SourceToSet1 = 'MPLAY';
        --elseif denon_source.state   == 'Pc'     then    SourceToSet1 = 'GAME';
        --elseif denon_source.state   == 'Cast'   then    SourceToSet1 = 'BD';
        --end
        --os.execute (denon_cmd_1 .. 'PutZone_InputFunction%2F' .. (SourceToSet1) );   -- Denon wordt op source gezet
        os.execute (denon_cmd_1 .. 'PutZone_InputFunction%2F' .. get_waarde(denon_source.state,source_states , SourceToSet1) );   -- Denon wordt op source gezet

        --if denon_radio.state        == 'Skyradio'   then    SourceToSet2 = '010440';                                             -- zet radio zender
        --elseif denon_radio.state    == 'Qmusic'     then    SourceToSet2 = '009540';
        --elseif denon_radio.state    == 'Veronica'   then    SourceToSet2 = '009490';
        --elseif denon_radio.state    == '538'        then    SourceToSet2 = '010500';
        --elseif denon_radio.state    == 'West'       then    SourceToSet2 = '008890';
        --end
        --os.execute (denon_cmd_2 .. 'PutTunerFrequency%2F' .. (SourceToSet2) .. '&cmd1=aspMainZone_WebUpdateStatus%2F' ); --zet radio zender
        os.execute (denon_cmd_1 .. 'PutZone_InputFunction%2F' .. get_waarde(denon_radio.state,mixer_states , SourceToSet3) );   -- Denon wordt op source gezet

        --if      denon_mixer.state == 'stereo'            then    SourceToSet3 = 'STEREO';
        --elseif  denon_mixer.state == 'mch stereo'        then    SourceToSet3 = 'MCH+STEREO';
        --elseif  denon_mixer.state == 'dolby digital'     then    SourceToSet3 = 'DOLBY+DIGITAL';
        --elseif  denon_mixer.state == 'movie'             then    SourceToSet3 = 'MOVIE';
        --elseif  denon_mixer.state == 'music'             then    SourceToSet3 = 'MUSIC';
        --elseif  denon_mixer.state == 'game'              then    SourceToSet3 = 'GAME';
        --elseif  denon_mixer.state == 'pure direct'       then    SourceToSet3 = 'PURE+DIRECT';
        --elseif  denon_mixer.state == 'direct'            then    SourceToSet3 = 'DIRECT';
        --elseif  denon_mixer.state == 'standaard'         then    SourceToSet3 = 'STANDARD';
        --elseif  denon_mixer.state == 'simulation'        then    SourceToSet3 = 'SIMULATION';
        --elseif  denon_mixer.state == 'auto'              then    SourceToSet3 = 'AUTO';
        --elseif  denon_mixer.state == 'left'              then    SourceToSet3 = 'LEFT';
        --elseif  denon_mixer.state == 'video game'        then    SourceToSet3 = 'VIDEO+GAME';
        --elseif  denon_mixer.state == 'rock arena'        then    SourceToSet3 = 'ROCK+ARENA';
        --end
        --os.execute (denon_cmd_1 .. 'PutSurroundMode%2F' .. (SourceToSet3) .. '&cmd1=aspMainZone_WebUpdateStatus%2F' ); -- mixer
        os.execute (denon_cmd_1 .. 'PutZone_InputFunction%2F' .. get_waarde(denon_mixer.state,radio_states , SourceToSet2) );   -- Denon wordt op source gezet

        dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON ' .. string.upper(denon_volume.state) .. ' ,settings: ' .. denon_volume.state .. '/' .. SourceToSet1 .. '/' .. SourceToSet2 .. '/' .. SourceToSet3 .. '/' .. tostring(volume),30)
    end
    dz.helpers.globalMessage2(dz,item,info,messageTable,'chg') -- dump

end
}
Raspberry (raspbian on rpi 3) , Domoticz Beta, dzVents , RFXtrx433e, P1, Hue, Yeelight, Zwave+, X10, ESP(easy), MQTT,Weather Underground, System Alive Checker, Domoticz Remote Server to RPI with Google Assistant,
Jablotron connection, Ikea
User avatar
waaren
Posts: 6028
Joined: Tuesday 03 January 2017 14:18
Target OS: Linux
Domoticz version: Beta
Location: Netherlands
Contact:

Re: use of special characters

Post by waaren »

pvklink wrote: Tuesday 02 March 2021 22:23 Problem 1. Dzvents does not accept a special character '+' like variable = 'VIDEO+GAME'. My denon needs this sign in the command.
So i change it temporary to solve the error.
What line is producing an error? and please show the error as there is no rule in dzVents (Lua) that should cause a string with a + in it to error.
Problem 2 My selection list also had video game as a value, but i think the space will be a problem.
This one can be solved by changing my selecting device item from video game to video_game. But just curious if this is easy to solve too (no main issue, i can add _ sign for spaces)
same question..

Maybe you mean this?

wrong

Code: Select all

a = 
{
	video game = 'bla',
        video+game = 'blo',
}
ok

Code: Select all

a = 
{
	['video game'] = 'bla',
        ['video+game'] = 'blo',
}

print(a['video game'])
print(a['video+game'])

Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
pvklink
Posts: 822
Joined: Wednesday 12 November 2014 15:01
Target OS: Raspberry Pi / ODroid
Domoticz version: latest b
Contact:

Re: use of special characters

Post by pvklink »

video game = 'video+game'

my denon expect VIDEO+GAME as a string
the left is the value of the selector, so a nice name
Raspberry (raspbian on rpi 3) , Domoticz Beta, dzVents , RFXtrx433e, P1, Hue, Yeelight, Zwave+, X10, ESP(easy), MQTT,Weather Underground, System Alive Checker, Domoticz Remote Server to RPI with Google Assistant,
Jablotron connection, Ikea
pvklink
Posts: 822
Joined: Wednesday 12 November 2014 15:01
Target OS: Raspberry Pi / ODroid
Domoticz version: latest b
Contact:

Re: use of special characters

Post by pvklink »

yes, you helped me with your examples!
the selector item with a space should be enclosed with ['xxx xxx']
and the plus sign works when you put it in a separe var, for example sign!

Going to sleep now, i think 99% works now, test it tomorrow!

sign = '+
local mixer_states = {
movie = 'MOVIE',
stereo = 'STEREO',
['mch stereo'] = 'MCH' .. sign ..'STEREO',
dolby_digital = 'DOLBY' .. sign ..'DIGITAL',
music = 'MUSIC',
game = 'GAME',
pure_direct = 'PURE' .. sign ..'DIRECT',
direct = 'DIRECT',
standaard = 'STANDARD',
simulation = 'SIMULATION',
auto = 'AUTO',
left='LEFT',
video_game = 'VIDEO' .. sign ..'GAME',
rock_arena = 'ROCK' .. sign ..'ARENA'
}
Raspberry (raspbian on rpi 3) , Domoticz Beta, dzVents , RFXtrx433e, P1, Hue, Yeelight, Zwave+, X10, ESP(easy), MQTT,Weather Underground, System Alive Checker, Domoticz Remote Server to RPI with Google Assistant,
Jablotron connection, Ikea
pvklink
Posts: 822
Joined: Wednesday 12 November 2014 15:01
Target OS: Raspberry Pi / ODroid
Domoticz version: latest b
Contact:

Re: use of special characters

Post by pvklink »

thanks and have a good night...

This script seems to work!
So i can delete a lot of lines that are marked with -- (=old version)

last part is these lines: 4 times
waarde= get_waarde(denon_mixer.state,mixer_states , SourceToSet3)
os.execute (denon_cmd_1 .. 'PutZone_InputFunction%2F' .. waarde ); -- zet mixer

i think these lines can be adressed as one line, try it tomorrow

Code: Select all


return {
	on = {devices = {'denon*' }},
    
    execute = function(dz, item,info)
    _G.logLevel = dz.helpers.get_logtype(dz)    -- dz.log('debug test',dz.LOG_DEBUG) this will only make it to the log when LOG_DEBUG is set  AND dz.log('blabla',dz.LOG_FORCE) -- this will allways make it tp the log
    _G.logMarker = _G.moduleLabel -- marker wordt scriptnaam, _G.logMarker = info.scriptName is idem
    local messageTable = {}       -- log alles, 0 = niets, 1 dom, 2 global, 3 alles... evt per regel ook in te regelen
    -- HIER START DE EXECUTIE

    local denon_volume  = dz.devices('denon_volume')
    local denon_source  = dz.devices('denon_source')
    local denon_radio   = dz.devices('denon_radio')
    local denon_mixer   = dz.devices('denon_mixer')
    local ipdenon       = '192.168.20.26'

    local volume        = -50
    local SourceToSet1  = 'TUNER'
    local SourceToSet2  = '009540'
    local SourceToSet3  = 'STEREO'
    
    local denon_cmd_1   = 'curl http://' .. ipdenon .. '/MainZone/index.put.asp?cmd0='      -- basiscommando
    local denon_cmd_2   = 'curl http://' .. ipdenon .. '/Tuner/TUNER/index.put.asp?cmd0='   -- basiscommando

    local sign          = '+'
    local volume_states =   { fluister = volume-20, zacht = volume-10, medium = volume, hard = volume+10, extra = volume+20,}
    local source_states =   { Radio = 'TUNER', Tv = 'SAT/CBL', Sonos = 'CD', Kodi = 'MPLAY', Pc = 'GAME', Cast = 'BD'}
    local radio_states  =    {Skyradio = '010440',Qmusic = '009540', Veronica = '009490', Radio538 = '010500',West = '008890' } -- LET OP OORSPRONKELIJKE WAARDE WAS 538 nu Radio538 !! dus nog aanpassen in de treklijst
    local mixer_states  =    {   
                            movie = 'MOVIE',
                            stereo = 'STEREO',
                            ['mch stereo'] = 'MCH' .. sign  ..'STEREO',              
                            ['dolby digital'] = 'DOLBY' .. sign ..'DIGITAL',        
                            music = 'MUSIC',
                            game = 'GAME',
                            ['pure direct'] = 'PURE' .. sign ..'DIRECT',            
                            direct = 'DIRECT',
                            standaard = 'STANDARD',
                            simulation = 'SIMULATION', 
                            auto = 'AUTO',
                            left='LEFT', 
                            ['video game'] = 'VIDEO' .. sign ..'GAME',                
                            ['rock arena'] = 'ROCK' .. sign ..'ARENA'     
                            }

    local function get_waarde(dev_state, waardebereik, defvalue )  -- haal waarde op voor een dev_state, doorzoek een waardebereik en geef bij geen hit defvalue terug
        for i_state, i_waarde in pairs(waardebereik) do 
            if i_state == dev_state then return i_waarde end
        end
        return defvalue
    end
 
    if  item.name == 'denon_volume' and  string.upper(denon_volume.state) == 'UIT'    then  
        os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FOFF' );                                                      -- zet denon uit
        dz.helpers.globalMessage2(dz,item,info,messageTable,'add',' DENON UIT, denon is uitgezet',30)
    elseif item.name == 'denon_volume' and string.upper(denon_volume.state) ~= 'UIT' then
        os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FON' );                                                      -- zet denon aan
        dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON AAN, denon is aangezet',30)                                                   -- overtollig, dus op 0 gezet
    elseif item.name ~= 'denon_volume' and string.upper(denon_volume.state) == 'UIT' then
        denon_volume.switchSelector(20)                            
        os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FON' );                                                      -- zet denon aan
        dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON AAN, denon is aangezet',30)
    elseif item.name ~= 'denon_volume' and string.upper(denon_volume.state) ~= 'UIT' then
        dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON AAN, denon stond al aan',30)                                                  -- overtollig, dus op 0 gezet
    else
        dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON ERROR: onbekend situatie, item_name= ' .. item.name .. ' ,settings: ' .. denon_volume.state .. '/' .. denon_source.state .. '/' .. denon_radio.state .. '/' .. denon_mixer.state .. '/',10)
    end
 
    if string.upper(denon_volume.state) ~= 'UIT'    then                                                                      -- alleen maar settings toepassen als device ook aan staat

        --if      denon_volume.state  == 'fluister'   then  volume = volume -20
        --elseif  denon_volume.state  == 'zacht'      then  volume = volume -10
        --elseif  denon_volume.state  == 'medium'     then  volume = volume
        --elseif  denon_volume.state  == 'hard'       then  volume = volume + 10
        --elseif  denon_volume.state  == 'extra'      then  volume = volume + 20
        --end
        --os.execute (denon_cmd_1 .. 'PutMasterVolumeSet/' .. volume);                                           --set volume
        waarde = get_waarde(denon_volume.state,volume_states , volume)
        os.execute (denon_cmd_1 .. 'PutMasterVolumeSet/' .. waarde);    --set volume NOG TESTEN !!!!!!!
        
        --if denon_source.state       == 'Radio'  then    SourceToSet1 = 'TUNER';                                          -- zet source
        --elseif denon_source.state   == 'Tv'     then    SourceToSet1 = 'SAT/CBL';
        --elseif denon_source.state   == 'Sonos'  then    SourceToSet1 = 'CD';
        --elseif denon_source.state   == 'Kodi'   then    SourceToSet1 = 'MPLAY';
        --elseif denon_source.state   == 'Pc'     then    SourceToSet1 = 'GAME';
        --elseif denon_source.state   == 'Cast'   then    SourceToSet1 = 'BD';
        --end
        --os.execute (denon_cmd_1 .. 'PutZone_InputFunction%2F' .. (SourceToSet1) );   -- Denon wordt op source gezet
        waarde = get_waarde(denon_source.state,source_states , SourceToSet1)
        os.execute (denon_cmd_1 .. 'PutZone_InputFunction%2F' .. waarde );   -- Denon wordt op source gezet

        --if denon_radio.state        == 'Skyradio'   then    SourceToSet2 = '010440';                                             -- zet radio zender
        --elseif denon_radio.state    == 'Qmusic'     then    SourceToSet2 = '009540';
        --elseif denon_radio.state    == 'Veronica'   then    SourceToSet2 = '009490';
        --elseif denon_radio.state    == '538'        then    SourceToSet2 = '010500';
        --elseif denon_radio.state    == 'West'       then    SourceToSet2 = '008890';
        --end
        --os.execute (denon_cmd_2 .. 'PutTunerFrequency%2F' .. (SourceToSet2) .. '&cmd1=aspMainZone_WebUpdateStatus%2F' ); --zet radio zender
        waarde = get_waarde(denon_radio.state,radio_states , SourceToSet2)
        os.execute (denon_cmd_1 .. 'PutZone_InputFunction%2F' .. waarde );   -- zet radio zender

        --if      denon_mixer.state == 'stereo'            then    SourceToSet3 = 'STEREO';
        --elseif  denon_mixer.state == 'mch stereo'        then    SourceToSet3 = 'MCH+STEREO';
        --elseif  denon_mixer.state == 'dolby digital'     then    SourceToSet3 = 'DOLBY+DIGITAL';
        --elseif  denon_mixer.state == 'movie'             then    SourceToSet3 = 'MOVIE';
        --elseif  denon_mixer.state == 'music'             then    SourceToSet3 = 'MUSIC';
        --elseif  denon_mixer.state == 'game'              then    SourceToSet3 = 'GAME';
        --elseif  denon_mixer.state == 'pure direct'       then    SourceToSet3 = 'PURE+DIRECT';
        --elseif  denon_mixer.state == 'direct'            then    SourceToSet3 = 'DIRECT';
        --elseif  denon_mixer.state == 'standaard'         then    SourceToSet3 = 'STANDARD';
        --elseif  denon_mixer.state == 'simulation'        then    SourceToSet3 = 'SIMULATION';
        --elseif  denon_mixer.state == 'auto'              then    SourceToSet3 = 'AUTO';
        --elseif  denon_mixer.state == 'left'              then    SourceToSet3 = 'LEFT';
        --elseif  denon_mixer.state == 'video game'        then    SourceToSet3 = 'VIDEO+GAME';
        --elseif  denon_mixer.state == 'rock arena'        then    SourceToSet3 = 'ROCK+ARENA';
        --end
        --os.execute (denon_cmd_1 .. 'PutSurroundMode%2F' .. (SourceToSet3) .. '&cmd1=aspMainZone_WebUpdateStatus%2F' ); -- mixer
        waarde= get_waarde(denon_mixer.state,mixer_states , SourceToSet3)
        os.execute (denon_cmd_1 .. 'PutZone_InputFunction%2F' .. waarde );   -- zet mixer

        --dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENONTEST ' .. tostring(waarde),10)

        dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON ' .. string.upper(denon_volume.state) .. ' ,settings: ' .. denon_volume.state .. '/' .. SourceToSet1 .. '/' .. SourceToSet2 .. '/' .. SourceToSet3 .. '/' .. tostring(volume),30)
    end
    dz.helpers.globalMessage2(dz,item,info,messageTable,'chg') -- dump

end
}
Raspberry (raspbian on rpi 3) , Domoticz Beta, dzVents , RFXtrx433e, P1, Hue, Yeelight, Zwave+, X10, ESP(easy), MQTT,Weather Underground, System Alive Checker, Domoticz Remote Server to RPI with Google Assistant,
Jablotron connection, Ikea
User avatar
waaren
Posts: 6028
Joined: Tuesday 03 January 2017 14:18
Target OS: Linux
Domoticz version: Beta
Location: Netherlands
Contact:

Re: use of special characters

Post by waaren »

pvklink wrote: Tuesday 02 March 2021 23:39 and the plus sign works when you put it in a separate var, for example sign!
That should not be needed.

Code: Select all

sign = '+'
local mixer_states = {
movie = 'MOVIE',
stereo = 'STEREO',
['mch stereo'] = 'MCH' .. sign ..'STEREO',
dolby_digital = 'DOLBY' .. sign ..'DIGITAL',
music = 'MUSIC',
game = 'GAME',
pure_direct = 'PURE' .. sign ..'DIRECT',
direct = 'DIRECT',
standaard = 'STANDARD',
simulation = 'SIMULATION',
auto = 'AUTO',
left='LEFT',
video_game = 'VIDEO' .. sign ..'GAME',
rock_arena = 'ROCK+ARENA'
}


print (mixer_states.video_game)  -->> VIDEO+GAME
print (mixer_states.rock_arena)  -->> ROCK+ARENA
Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
pvklink
Posts: 822
Joined: Wednesday 12 November 2014 15:01
Target OS: Raspberry Pi / ODroid
Domoticz version: latest b
Contact:

Re: use of special characters

Post by pvklink »

you are right!

It works ok now, and i have a last question to make it perfect

I try to use .lastLevel to check if a selector goes from off/uit to a value or from a on value to another on value. In the last case the device has not to be turned on and the devicesettings can be pushed directly
See lines 67-74, my part dont work...

Code: Select all

local scriptVar = 'DenonCustomEvents'
return {
	on =    {
            devices = {'denon*' },
            customEvents = {scriptVar},
            },
    execute = function(dz, item,info)
    _G.logLevel = dz.helpers.get_logtype(dz)    -- dz.log('debug test',dz.LOG_DEBUG) this will only make it to the log when LOG_DEBUG is set  AND dz.log('blabla',dz.LOG_FORCE) -- this will allways make it tp the log
    _G.logMarker = _G.moduleLabel -- marker wordt scriptnaam, _G.logMarker = info.scriptName is idem
    local messageTable = {}       -- log alles, 0 = niets, 1 dom, 2 global, 3 alles... evt per regel ook in te regelen
    -- HIER START DE EXECUTIE

    local denon_volume  = dz.devices('denon_volume')
    local denon_source  = dz.devices('denon_source')
    local denon_radio   = dz.devices('denon_radio')
    local denon_mixer   = dz.devices('denon_mixer')
    local ipdenon       = '192.168.20.26'

    local volume        = -50       -- zie ook LET OP!
    local SourceToSet1  = 'TUNER'
    local SourceToSet2  = '009540'
    local SourceToSet3  = 'STEREO'
    
    local denon_cmd_1   = 'curl http://' .. ipdenon .. '/MainZone/index.put.asp?cmd0='      -- basiscommando
    local denon_cmd_2   = 'curl http://' .. ipdenon .. '/Tuner/TUNER/index.put.asp?cmd0='   -- basiscommando

    --local sign          = '+'   -- als je geen + in een var kan opnemen --' .. sign  ..'
    local volume_states =   { uit=volume, fluister = volume-20, zacht = volume-10, medium = volume, hard = volume+10, extra = volume+20,}
    local source_states =   { Radio = 'TUNER', Tv = 'SAT/CBL', Sonos = 'CD', Kodi = 'MPLAY', Pc = 'GAME', Cast = 'BD'}
    local radio_states  =   {Skyradio = '010440',Qmusic = '009540', Veronica = '009490', ['538'] = '010500',West = '008890' }
    local mixer_states  =   { movie = 'MOVIE', stereo = 'STEREO', ['mch stereo'] = 'MCH+STEREO', ['dolby digital'] = 'DOLBY+DIGITAL', music = 'MUSIC', game = 'GAME', ['pure direct'] = 'PURE+DIRECT', 
                            direct = 'DIRECT', standaard = 'STANDARD', simulation = 'SIMULATION', auto = 'AUTO', left='LEFT', ['video game'] = 'VIDEO+GAME',['rock arena'] = 'ROCK+ARENA' }

    local function get_waarde(dev_state, waardebereik, defvalue )  -- haal waarde op voor een dev_state, doorzoek een waardebereik en geef bij geen hit defvalue terug
        for i_state, i_waarde in pairs(waardebereik) do 
            if i_state == dev_state then 
                dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON setting aangepast met ingestelde waarde: ' .. tostring(i_waarde),10)
                return i_waarde 
            end
        end
        dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON setting bestaat niet ! Aangepast met defaultwaarde: ' .. tostring(defvalue),10)
        return defvalue
    end
    
    local function activeer_setting()  -- settings zetten
        waarde = get_waarde(denon_volume.state,volume_states , volume)
        os.execute (denon_cmd_1 .. 'PutMasterVolumeSet/' .. waarde);    --Denon volume

        waarde = get_waarde(denon_source.state,source_states , SourceToSet1)
        os.execute (denon_cmd_1 .. 'PutZone_InputFunction%2F' .. waarde );   -- Denon wordt op source gezet

        waarde = get_waarde(denon_radio.state,radio_states , SourceToSet2)
        os.execute (denon_cmd_2 .. 'PutTunerFrequency%2F' .. waarde );   -- Denon radio zender wordt gezet

        waarde= get_waarde(denon_mixer.state,mixer_states , SourceToSet3)
        os.execute (denon_cmd_1 .. 'PutSurroundMode%2F' .. waarde );   -- Denon mixer wordt gezet

        dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON(AAN) en ingesteld met volume(' .. string.upper(denon_volume.state) .. '), Source(' .. string.upper(denon_source.state) .. '), Zender(' .. string.upper(denon_radio.state) .. '), Mixer(' .. string.upper(denon_mixer.state) .. ')' ,10)
    end

    if item.isDevice then
        if  item.name == 'denon_volume' then 
            if string.upper(denon_volume.state) == 'UIT'    then  
                os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FOFF' );                                                      -- zet denon uit
                dz.helpers.globalMessage2(dz,item,info,messageTable,'add',' DENON(UIT), denon is uitgezet',10)
            else    
                -- dit deel werkt niet, pakt toch de huidige levelwaarde! 
                -- if dz.devices('denon_volume').lastLevel == 0 then 
                   --os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FON' );                                                      -- zet denon aan, check de previous waarde als die uit was dan aanzetten anders niet, dan alleen setings doorvoeren !
                   --dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON(AAN), denon is voor ze zekerheid aangezet',30)
                   --dz.emitEvent(scriptVar).afterSec(5)               
                -- else 
                    dz.emitEvent(scriptVar)
                -- end                                                    
            end 
        else
            if dz.devices('denon_volume').state == 'uit' then 
                denon_volume.switchSelector('medium').silent()              -- LET OP! als de denon uit staat, heeft volume de waarde uit, dus zal bij waarde ophalen waarde bij uit worden gepakt. De selector moet dan ook op bijpassende waarde worden gezet en dat is medium
                os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FON' );          -- zet denon aan
                dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON(AAN), denon is aangezet door een ander denon onderdeel',30)
                dz.emitEvent(scriptVar).afterSec(5)               
            else
                dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON(AAN), denon stond al aan',30)                                                  -- overtollig, dus op 0 gezet
                dz.emitEvent(scriptVar)                                     -- mag gelijk worden uitgevoerd, staat al aan               
            end
        end
    elseif item.isCustomEvent then
        activeer_setting() 
    end

    dz.helpers.globalMessage2(dz,item,info,messageTable,'chg') -- dump

end
}
Raspberry (raspbian on rpi 3) , Domoticz Beta, dzVents , RFXtrx433e, P1, Hue, Yeelight, Zwave+, X10, ESP(easy), MQTT,Weather Underground, System Alive Checker, Domoticz Remote Server to RPI with Google Assistant,
Jablotron connection, Ikea
User avatar
waaren
Posts: 6028
Joined: Tuesday 03 January 2017 14:18
Target OS: Linux
Domoticz version: Beta
Location: Netherlands
Contact:

Re: use of special characters  [Solved]

Post by waaren »

pvklink wrote: Wednesday 03 March 2021 13:15 It works ok now, and i have a last question to make it perfect

I try to use .lastLevel to check if a selector goes from off/uit to a value or from a on value to another on value. In the last case the device has not to be turned on and the devicesettings can be pushed directly
The only way I know to overcome this is to use dzVents persistent data.

Something like

Code: Select all

local scriptVar = 'DenonCustomEvents'
return
{
    on =
    {
        devices =
        {
            'denon*',
        },
        customEvents =
        {
            scriptVar,
        },
    },

    data =
    {
        lastVolumeState =
        {
            initial = '',
        },
    },

    execute = function(dz, item,info)

        _G.logLevel = dz.helpers.get_logtype(dz)

        _G.logMarker = _G.moduleLabel -- marker wordt scriptnaam, _G.logMarker = info.scriptName is idem
        local messageTable = {}       -- log alles, 0 = niets, 1 dom, 2 global, 3 alles... evt per regel ook in te regelen

        -- HIER START DE EXECUTIE

        local denon_volume  = dz.devices('denon_volume')
        local denon_source  = dz.devices('denon_source')
        local denon_radio   = dz.devices('denon_radio')
        local denon_mixer   = dz.devices('denon_mixer')
        local ipdenon       = '192.168.20.26'

        local volume        = -50       -- zie ook LET OP!
        local SourceToSet1  = 'TUNER'
        local SourceToSet2  = '009540'
        local SourceToSet3  = 'STEREO'

        local denon_cmd_1   = 'curl http://' .. ipdenon .. '/MainZone/index.put.asp?cmd0='      -- basiscommando
        local denon_cmd_2   = 'curl http://' .. ipdenon .. '/Tuner/TUNER/index.put.asp?cmd0='   -- basiscommando

        local volume_states =   { uit=volume, fluister = volume-20, zacht = volume-10, medium = volume, hard = volume+10, extra = volume+20,}
        local source_states =   { Radio = 'TUNER', Tv = 'SAT/CBL', Sonos = 'CD', Kodi = 'MPLAY', Pc = 'GAME', Cast = 'BD'}
        local radio_states  =   {Skyradio = '010440',Qmusic = '009540', Veronica = '009490', ['538'] = '010500',West = '008890' }
        local mixer_states  =   { movie = 'MOVIE', stereo = 'STEREO', ['mch stereo'] = 'MCH+STEREO', ['dolby digital'] = 'DOLBY+DIGITAL', music = 'MUSIC', game = 'GAME', ['pure direct'] = 'PURE+DIRECT',
                                direct = 'DIRECT', standaard = 'STANDARD', simulation = 'SIMULATION', auto = 'AUTO', left='LEFT', ['video game'] = 'VIDEO+GAME',['rock arena'] = 'ROCK+ARENA' }

        local function get_waarde(dev_state, waardebereik, defvalue )  -- haal waarde op voor een dev_state, doorzoek een waardebereik en geef bij geen hit defvalue terug
            for i_state, i_waarde in pairs(waardebereik) do
                if i_state == dev_state then
                    dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON setting aangepast met ingestelde waarde: ' .. tostring(i_waarde),10)
                    return i_waarde
                end
            end
            dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON setting bestaat niet ! Aangepast met defaultwaarde: ' .. tostring(defvalue),10)
            return defvalue
        end

        local function activeer_setting()  -- settings zetten
            waarde = get_waarde(denon_volume.state,volume_states , volume)
            os.execute (denon_cmd_1 .. 'PutMasterVolumeSet/' .. waarde);    --Denon volume

            waarde = get_waarde(denon_source.state,source_states , SourceToSet1)
            os.execute (denon_cmd_1 .. 'PutZone_InputFunction%2F' .. waarde );   -- Denon wordt op source gezet

            waarde = get_waarde(denon_radio.state,radio_states , SourceToSet2)
            os.execute (denon_cmd_2 .. 'PutTunerFrequency%2F' .. waarde );   -- Denon radio zender wordt gezet

            waarde= get_waarde(denon_mixer.state,mixer_states , SourceToSet3)
            os.execute (denon_cmd_1 .. 'PutSurroundMode%2F' .. waarde );   -- Denon mixer wordt gezet

            dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON(AAN) en ingesteld met volume(' .. string.upper(denon_volume.state) .. '), Source(' .. string.upper(denon_source.state) .. '), Zender(' .. string.upper(denon_radio.state) .. '), Mixer(' .. string.upper(denon_mixer.state) .. ')' ,10)
        end

        if item.isDevice then
            if  item.name == 'denon_volume' then
                if item.nValue == 0 then
                    dz.data.lastVolumeState = 'Off'
                    os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FOFF' );                                                      -- zet denon uit
                    dz.helpers.globalMessage2(dz,item,info,messageTable,'add',' DENON(UIT), denon is uitgezet',10)
                else
                    if dz.data.lastVolumeState == 'Off' then
                        dz.data.lastVolumeState = item.levelName
                       os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FON' ) -- zet denon aan, check de previous waarde als die uit was dan aanzetten anders niet, dan alleen setings doorvoeren !
                       dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON(AAN), denon is voor ze zekerheid aangezet',30)
                       dz.emitEvent(scriptVar).afterSec(5)
                    else
                        dz.emitEvent(scriptVar)
                    end
                end
            else
                if dz.devices('denon_volume').state == 'uit' then
                    denon_volume.switchSelector('medium').silent()              -- LET OP! als de denon uit staat, heeft volume de waarde uit, dus zal bij waarde ophalen waarde bij uit worden gepakt. De selector moet dan ook op bijpassende waarde worden gezet en dat is medium
                    os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FON' );          -- zet denon aan
                    dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON(AAN), denon is aangezet door een ander denon onderdeel',30)
                    dz.emitEvent(scriptVar).afterSec(5)
                else
                    dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON(AAN), denon stond al aan',30)                                                  -- overtollig, dus op 0 gezet
                    dz.emitEvent(scriptVar)                                     -- mag gelijk worden uitgevoerd, staat al aan
                end
            end
        elseif item.isCustomEvent then
            activeer_setting()
        end

        dz.helpers.globalMessage2(dz,item,info,messageTable,'chg') -- dump

    end
}
Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
pvklink
Posts: 822
Joined: Wednesday 12 November 2014 15:01
Target OS: Raspberry Pi / ODroid
Domoticz version: latest b
Contact:

Re: use of special characters

Post by pvklink »

ok, thanks!

Pitty that the selector device does not support this...
I recently had another issue with a selector switch.
I tooks like when you do an action on a seloctor switch (activating an item), an existing event(after, before etc.) on the same switch is cleared/reset.
I dont have the code anymore, i did a workaround....

I will use the persistant data for my denon script. I think it looks much much better that the old version!
Thanks for that!
By looking at your solutions (the simple) ones made me use more function in this script instead of 20 if then else lnes....
Making slow steps !
And even the custom event solution is one of my favorites, thanks!

:D
Raspberry (raspbian on rpi 3) , Domoticz Beta, dzVents , RFXtrx433e, P1, Hue, Yeelight, Zwave+, X10, ESP(easy), MQTT,Weather Underground, System Alive Checker, Domoticz Remote Server to RPI with Google Assistant,
Jablotron connection, Ikea
pvklink
Posts: 822
Joined: Wednesday 12 November 2014 15:01
Target OS: Raspberry Pi / ODroid
Domoticz version: latest b
Contact:

Re: use of special characters

Post by pvklink »

For those who need a denon script, this version is cleaned up..
Thanks to waaren to make it work

Code: Select all

local scriptVar = 'DenonCustomEvents'
return {
	on =    {
            devices = {'denon*' },
            customEvents = {scriptVar},
            },
            data = {lastVolumeState = {initial = '',},},

    execute = function(dz, item,info)
    _G.logLevel = dz.helpers.get_logtype(dz)    -- dz.log('debug test',dz.LOG_DEBUG) this will only make it to the log when LOG_DEBUG is set  AND dz.log('blabla',dz.LOG_FORCE) -- this will allways make it tp the log
    _G.logMarker = _G.moduleLabel               -- marker wordt scriptnaam, _G.logMarker = info.scriptName is idem
    local messageTable = {}                     -- log alles, 0 = niets, 1 dom, 2 global, 3 alles... evt per regel ook in te regelen
    -- HIER START DE EXECUTIE

    local denon_volume  = dz.devices('denon_volume')
    local denon_source  = dz.devices('denon_source')
    local denon_radio   = dz.devices('denon_radio')
    local denon_mixer   = dz.devices('denon_mixer')
    local ipdenon       = '192.168.20.26'

    local volume        = -50       -- zie ook LET OP!
    local SourceToSet1  = 'TUNER'
    local SourceToSet2  = '009540'
    local SourceToSet3  = 'STEREO'
    
    local denon_cmd_1   = 'curl http://' .. ipdenon .. '/MainZone/index.put.asp?cmd0='      -- basiscommando
    local denon_cmd_2   = 'curl http://' .. ipdenon .. '/Tuner/TUNER/index.put.asp?cmd0='   -- basiscommando

    local volume_states =   { uit=volume, fluister = volume-20, zacht = volume-10, medium = volume, hard = volume+10, extra = volume+20,}
    local source_states =   { Radio = 'TUNER', Tv = 'SAT/CBL', Sonos = 'CD', Kodi = 'MPLAY', Pc = 'GAME', Cast = 'BD'}
    local radio_states  =   { Skyradio = '010440',Qmusic = '009540', Veronica = '009490', ['538'] = '010500',West = '008890' }
    local mixer_states  =   { movie = 'MOVIE', stereo = 'STEREO', ['mch stereo'] = 'MCH+STEREO', ['dolby digital'] = 'DOLBY+DIGITAL', music = 'MUSIC', game = 'GAME', ['pure direct'] = 'PURE+DIRECT', 
                            direct = 'DIRECT', standaard = 'STANDARD', simulation = 'SIMULATION', auto = 'AUTO', left='LEFT', ['video game'] = 'VIDEO+GAME',['rock arena'] = 'ROCK+ARENA' }

    local function get_waarde(dev_state, waardebereik, defvalue )  -- haal waarde op voor een dev_state, doorzoek een waardebereik en geef bij geen hit defvalue terug
        for i_state, i_waarde in pairs(waardebereik) do 
            if i_state == dev_state then 
                return i_waarde 
            end
        end
        return defvalue
    end
    
    local function activeer_setting()  -- settings zetten
        os.execute (denon_cmd_1 .. 'PutMasterVolumeSet/' .. get_waarde(denon_volume.state,volume_states , volume));             -- Denon volume
        os.execute (denon_cmd_1 .. 'PutZone_InputFunction%2F' .. get_waarde(denon_source.state,source_states , SourceToSet1));  -- Denon wordt op source gezet
        os.execute (denon_cmd_2 .. 'PutTunerFrequency%2F' .. get_waarde(denon_radio.state,radio_states , SourceToSet2));        -- Denon radio zender wordt gezet
        os.execute (denon_cmd_1 .. 'PutSurroundMode%2F' .. get_waarde(denon_mixer.state,mixer_states , SourceToSet3) );         -- Denon mixer wordt gezet

    end

    if item.isDevice then
        if  item.name == 'denon_volume' then 
            if item.nValue == 0 then                                        -- numerieke waarde van de state van denon_volume (0=off, 1 = on)
                dz.data.lastVolumeState = 'Off'
                os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FOFF' );         -- zet denon uit
                dz.helpers.globalMessage2(dz,item,info,messageTable,'add',' DENON(UIT), denon is uitgezet',10)
            else                                                            -- denon_volume staat aan
                if dz.data.lastVolumeState == 'Off' then                    -- als vorige waarde off was
                    dz.data.lastVolumeState = item.levelName                -- vorige_state wordt op aan gezet!
                    os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FON' )       -- zet denon aan, check de previous waarde als die uit was dan aanzetten anders niet, dan alleen setings doorvoeren !
                    dz.helpers.globalMessage2(dz,item,info,messageTable,'add',  ' DENON(AAN), denon is voor ze zekerheid aangezet',30)
                    dz.emitEvent(scriptVar).afterSec(5)
                else                                                        -- vorige waarde was een volume waarde, dus stond al aan!
                    dz.emitEvent(scriptVar)
                end
            end
        else
            if dz.devices('denon_volume').state == 'uit' then 
                denon_volume.switchSelector('medium').silent()              -- LET OP! als de denon uit staat, heeft volume de waarde uit, dus zal bij waarde ophalen waarde bij uit worden gepakt. De selector moet dan ook op bijpassende waarde worden gezet en dat is medium
                os.execute (denon_cmd_1 .. 'PutZone_OnOff%2FON' );          -- zet denon aan
                dz.emitEvent(scriptVar).afterSec(5)               
            else
                dz.emitEvent(scriptVar)                                     -- mag gelijk worden uitgevoerd, staat al aan               
            end
        end
    elseif item.isCustomEvent then
        activeer_setting() 
    end
end
}
Raspberry (raspbian on rpi 3) , Domoticz Beta, dzVents , RFXtrx433e, P1, Hue, Yeelight, Zwave+, X10, ESP(easy), MQTT,Weather Underground, System Alive Checker, Domoticz Remote Server to RPI with Google Assistant,
Jablotron connection, Ikea
Post Reply

Who is online

Users browsing this forum: Bing [Bot] and 1 guest