Page 1 of 1

dzVents 3.1.0 released

Posted: Tuesday 29 December 2020 14:19
by waaren
All current and future dzVents users,

dzVents 3.1.0 has been merged in Domoticz V2020.2 build 12771. Thanks to the initial idea and most of the coding done by @akamming, a new-, asynchronous approach to executing shell commands is introduced in this version.

dzVents now allows you to make asynchronous shell commands and handle the results. Asynchronous means that you don't block the system while waiting for the response. Earlier you had to use functions like utils.osCommand() or os.Execute() and some magic to make sure that you didn't block the system for too long after which Domoticz comes with a message that the script took more than 10 seconds.

Now there are two methods to execute a shell command asynchronously, determined by how you use the domoticz.executeShellCommand() command. The simplest form simply calls executeShellCommand on the domoticz object with only the command as the parameter (a string value):

Code: Select all

domoticz.executeShellCommand('some shell command')
Domoticz will execute the shell command in a separate thread without blocking anything.

The second way is more exiting...
Instead of passing a command you pass in a table with the command to be executed and a callback trigger (a string) and (optional) a timeout (integer)

Code: Select all

return {
    on = { ... }, -- some trigger
    execute = function(domoticz)
        domoticz.executeShellCommand({
            command = 'some shell command',
            callback = 'mycallbackstring',
            timeout = timeoutinseconds, -- defaults to 10 seconds. Set to 0 to disable timeout
        })
    end
}
In this case, Domoticz will execute the command and when done it will trigger an event. dzVents can capture that event and its attributes and will execute all scripts listening for this callback trigger (*mycallbackstring*):

Code: Select all

return {
    on = {
        shellCommandResponses = { 'mycallbackstring' }
    },
    execute = function(domoticz, response)
        if response.ok then
            if (response.isJSON) then
                domoticz.log(response.json.some.value)
            end
        else
            domoticz.log('There was an error', domoticz.LOG_ERROR)
        end
    end
}
Of course you can combine the request and response actions in one script:

Code: Select all

return {
    on = {
        timer = {'every 5 minutes'},
        shellCommandResponses = { 'trigger' }
    },
    execute = function(domoticz, item)
        if (item.isTimer) then
            domoticz.executeShellCommand({
                command = '...',
                callback = 'trigger'
                timeout = 0,
            })
        end
        if item.isShellCommandResponse then
            if item.statusCode == 0 then
                ...
            end
        end
    end
}
Check out this Wiki chapter for detailed descriptions on the request and response API for this new feature including all attributes available


have Fun !

Re: dzVents 3.1.0 released

Posted: Tuesday 29 December 2020 14:25
by heggink
VERY nice! Many thanks!

Sent from my SM-G980F using Tapatalk


Re: dzVents 3.1.0 released

Posted: Tuesday 29 December 2020 18:19
by djdevil
Fabulous! Thanks for your work!