Page 1 of 1

Notification only when security is armed  [Solved]

Posted: Sunday 14 July 2019 22:36
by johansson
This is propably too simple, but can't figure it out on my own: I've a perfectly fine working (bash) script sending a snapshot from my camera to Telegram every time when motion is detected, but how on earth I do that in dzvents only when security is armed away or armed home?

Thanks in advance.

Re: Notification only when security is armed

Posted: Monday 15 July 2019 11:18
by waaren
waaren wrote: Monday 15 July 2019 11:18
johansson wrote: Sunday 14 July 2019 22:36 This is propably too simple, but can't figure it out on my own: I've a perfectly fine working (bash) script sending a snapshot from my camera to Telegram every time when motion is detected, but how on earth I do that in dzvents only when security is armed away or armed home?
Please have a look at this.

Code: Select all

--[[ Conditional snapshot on motion

 uses: functions like the ones in telegram library from @emme as per the wiki:   https://www.domoticz.com/wiki/Telegram_lua_library
 and: some functions and Constants from dzVents: 

    values to enter in code below
    'motionSensor'
    
    <chatID> = 'your telegram Chat ID'
    <botToken> = 'your telegram bot Token'
    <cameraIDX> = your configured camera idx

]] --

return 
{ 
    on = 
    { 
        timer = {'at 3:31'}, -- housekeeping time
        devices = { 'MotionSensor' }, -- Change to name of your motion sensor
    },  

    logging = { level = domoticz.LOG_DEBUG, marker = 'conditional snaphshot'  },

    data = { snapshotCounter = { initial = 1 }},

    execute = function(dz, item)
        local chatID = ''  -- <chatID> (positive for single user negative for group) ( example: '-1001451683665')
        local cameraIDX = '' -- <camerIDX> (example: 1)
        local botToken = '' -- <botToken> (example: '709006412:AAH61H_vLsdP9stXzB2cW1wr_dLH2qD-xpU'
        
        -- 
        -- no config or other changes necessary below this line
        -- 
        local function snapShot()
            local snapshotFilename = '/tmp/' .. dz.time.rawDate .. '-' .. dz.data.snapshotCounter ..'.jpg'
            local url = dz.settings['Domoticz url']
            local domoticzAPI = '/camsnaphot.jpg?idx=' .. cameraIDX
            local wgetCommand = 'wget -O "' .. snapshotFilename .. '" ' .. ' "' .. domoticzAPI .. '" ' .. url 
            os.execute(wgetCommand)
            dz.log('wget Command: ' .. wgetCommand,dz.LOG_DEBUG)
            dz.data.snapshotCounter = dz.data.snapshotCounter + 1
            return snapshotFilename
        end

        local function sendTelegram(photo)
            local url = 'https://api.telegram.org/bot' .. botToken .. '/sendPhoto?chat_id=' .. chatID
            local curlCommand  = 'curl -s -X POST "' .. url .. '" -F photo=@"' .. photo .. '" &'
            os.execute(curlCommand)
            dz.log('curl Command: ' .. curlCommand,dz.LOG_DEBUG)
            os.execute('touch ' .. photo) -- correct for wget saving snapshot with wrong dateTime stamp
        end

        local function housekeeping()
            findAndRemoveCommand = 'bash -c " find /tmp/*jpg -mtime 1 -exec rm {} \\; " '
            os.execute(findAndRemoveCommand)
            dz.log('findAndRemoveCommand: ' .. findAndRemoveCommand,dz.LOG_DEBUG)
        end

        if item.isTimer then
            housekeeping()
            return
        end

        local securityArmed = ( dz.security == dz.SECURITY_ARMEDAWAY or dz.security == dz.SECURITY_ARMEDHOME )
        if item.active and securityArmed then 
            sendTelegram(snapShot())
        end
    end
}

Re: Notification only when security is armed

Posted: Monday 15 July 2019 11:49
by johansson
Perfect, thanks! 🙏

Adjusted a bit, came up with the following which seems to work for me:

Code: Select all

return {
	on = {
		devices = {
			'Front door PIR',
		}
	},
	execute = function(dz, device)
 local securityArmed = (dz.security == dz.SECURITY_ARMEDAWAY or dz.security == dz.SECURITY_ARMEDHOME)
        if device.active and securityArmed then 
   		os.execute('sudo /home/xxxxxxxx/domoticz/scripts/frontdoorsnapshop.sh')

end
end
}
My main problem was how to check security status, couldn't find it from the dzwiki etc. Thanks again 👍

Obviously additional to snapshots a short video clip stored somewhere would be nice as well: any creative ideas for that as well?

Re: Notification only when security is armed

Posted: Monday 15 July 2019 12:07
by waaren
johansson wrote: Monday 15 July 2019 11:49 Perfect, thanks! 🙏

Adjusted a bit, came up with the following which seems to work for me:

Code: Select all

   		os.execute('sudo /home/xxxxxxxx/domoticz/scripts/frontdoorsnapshop.sh')
A potential problem with this approach is that the curl command in the Shell script might hang the event system for the duration of the script. If the telegram url does not respond for some time no other events will be triggered (because the domoticz event system is single threaded). If you have not covered for that in your frontdoorsnapshop.sh then best to ask os.execute to run this script in background by adding a '&'

Code: Select all

   		os.execute('sudo /home/xxxxxxxx/domoticz/scripts/frontdoorsnapshop.sh &')

Re: Notification only when security is armed

Posted: Monday 15 July 2019 13:52
by johansson
waaren wrote: Monday 15 July 2019 12:07 If you have not covered for that in your frontdoorsnapshop.sh then best to ask os.execute to run this script in background by adding a '&'

Code: Select all

   		os.execute('sudo /home/xxxxxxxx/domoticz/scripts/frontdoorsnapshop.sh &')
If that's not done by default, I'm quite sure I haven't :D Thanks for the pointer. In general, is there a difference when running the script with os.execute vs the way in your example, i.e. is one way better than the other?

Re: Notification only when security is armed

Posted: Monday 15 July 2019 14:05
by waaren
johansson wrote: Monday 15 July 2019 13:52 In general, is there a difference when running the script with os.execute vs the way in your example, i.e. is one way better than the other?
It's more a matter of personal preference. I like to keep the amount of different script-types limited so if I can do it in one dzVents script, I will. Same goes for the the os.execute calls vs. dz.openURL calls. I prefer to use openURL where possible and -easy but this is not always doable.