PowerShell – Trigga system med bilder från webbkameror

Har nu skrivit ett script för att trigga bland annat Vera och Telldus Znet med hjälp av webbkamerors rörelseavkänning.

Hemautomations script
Script för att göra kameror smartare!

Tidigare har jag skrivit att billiga webbkameror som exempelvis D-link DCS-930L kan ge ett stort mervärde för hemautomation. Scriptet gör indirekt kameror till rörelsesensor. Allt som behövs är att kameran konfigureras att ladda upp en bild till en mapp på något sätt, i mitt fall blev det via FTP (Filezilla). Kameror triggar i och med detta i REALTID händelser, detta går sedan att skicka vidare till Vera och Telldus.

Eftersom det även fungerar med FTP är det möjligt att placera kameran i en sommarstuga eller på samma nätverk, vid händelser skickas informationen direkt in till Vera och Telldus Znet i REALTID. Oavsett om detta sker över internet eller på samma nätverk (Fantasin sätter gränsen för vad man kan göra!)

 

Hur fungerar det

Varje gång en fil skrivs i mappstrukturen som scriptet övervakar körs en scriptsnurra igång, i mitt fall aktiverar det Vera och Telldus.  För att se hur ofta detta sker finns en global räknare som adderar varje bild som loggats under dagen, räknaren nollställs 00:00 varje dag.  För att undvika att trigga händelser för ofta har jag lagt in en delay på 5 minuter, dvs max var 5:e minut triggas Vera och Telldus Live om kameran mot förmodan detekterar rörelser för ofta.

Bilderna placeras lokalt, dvs man behöver inte oroa sig för att bilderna lagras externt om man inte vill.

Scriptet ligger längst ner på sidan och på Github.

  • Vera: En räknare uppdateras i Vera:n vid rörelse, dock med ett max intervall  på var 5:e minut.
  • Telldus Znet: Med ett max intervall på max var 5:e minut skickas ett 433Mhz kommando (via Telldus Live och Telldus Znet) till en dörrklocka (som blinkar och inte låter i mitt fall). Vilket gör att man får en visuell feedback när en kamera har detekterat rörelse.

 

Tekniskt

För att lättast se vad som händer körs scriptet igång i en Powershell ISE. Scriptet skapar en ”IO.FileSystemWatcher” vilket agerar i realtid på filskrivningar och den ”trådar”.  I mitt exempel har jag skapat en mappstruktur ”D:\Larmmapp\FTP”, i mappen ligger två mappar Kamera1 och Kamera2 som ett exempel. Dessa skulle motsvara två olika webbkamerors destinationsmapp på FTP:N. Grunden för att övervaka filsystemet så pass fort hittade jag på följande technet sida, detta har jag sedan byggt mitt script runt om.

Uppsättning

Jag började med att konfigurera Dlink kameran att ladda upp bilder till mappen /dlink*****  (se bilden nedan). För att ladda till en mapp med namnet Kamera1 skulle det ha stått: ”/Kamera1”.

Konfigurera FTP i dlink kameran.
Konfigurera FTP i Dlink kameran.

 

Följande filstruktur finns sedan skapat på FTP:n. Mapparnas namn nyttjar jag i scriptet som kamerans namn för att enkelt kunna skicka vidare informationen till andra system.

Filsystem
Exempelstruktur

 

När en fil sparas med filändelsen .JPG har jag valt att scriptet ska trigga.

FilsystemMedBild
En Dlink kamera har nu laddat upp en bild på FTP:n

POWERSHELL

När en fil sparas och scriptet är aktivt visas följande resultat i realtid:

Exempel
Exempel på hur det ser ut när några bilder skapas i olika strukturer där scriptet körs.

Jag har själv valt att nyttja detta för att se hur många bilder / dag som genereras. Detta gör det enkelt att i efterhand se vilka dagar som extra många bilder skapats. Genom att kontrollera innehållet i bilderna just dom dagarna är det enkelt att konfigurera om kameran om det visar sig att ett område i bilden rör sig extremt mycket.

Grafen nedan orsakades av att rörelseavkänningen på testkameran medvetet konfigurerades med för låg känslighet i rörelseavkänningen. Grafen kommer från DataMine i min Vera.

DataMine graf över hur mycket bilder som sparats totalt av alla kameror
Just nu är känsligheten ställd VÄLDIGT låg på kameran för att kontrollera att scriptet trådar ut och att ingen rörelse missas. Vilket än så länge ser riktigt bra ut! Grafen kommer från DataMine i Vera:n

Genom att ändra raden nedan till $true och ange id på en Nexa ringklocka i Telldus Live är det möjligt att få den att blinka varje gång en rörelse registreras. Tror detta fungerar oavsett om man har en Telldus Znet eller Telldus NET. Detta kräver dock att du tidigare har laddat hem hemautomations modulen vi skrivit.

# Telldus Live  
[bool]$script:SendTelldusNotifiering = $false 
[int] $script:TelldusBell = '1234567'

 

Med fördröjningen undviker scriptet att aktiveras hela tiden om det rör sig framför en kamera. Varje gång den triggar på riktigt och har gått minst 5 min skrivs texten ut i rött.  Jag har valt att logga varje rörelse oavsett till min http loggserver för att få en tydlig bild av vad som händer mellan alla system.

powershell filsystemsövervakare
Exempel på hur det ser ut när scriptet har gått en stund och registrerat 1456 bilder :/

 

Jag har konfigurerat alla system hemma att skicka information till loggservern för att få en god bild över vad som händer och när.  Detta gör att jag kan se vad som kan förbättras och vad som fungerar mindre bra.

Loggservern
Loggservern vi delar med oss av på bloggen.

Nedan är hela scriptet i sin helhet, är det nått som är oklart skriv kommentar så försöker jag förklara så gått det går 🙂

Gilla och dela gärna så vi ser att det är värt att fortsätta dela med oss av saker vi själva byggt.

<#
    Skriven av Ispep
    www.automatiserar.se

    Jag nyttjar scriptet för att läsa av en filstruktur dit webbkameror sparar bilder när rörelse detekteras. 
    När en fil skrivs i mappstrukturen som anges under $folder triggas en händelse.
    Jag nyttjar nu detta för att få en 433MHz ringklocka att blinka när en rörelse på en webbkamera registreras max var 5:e minut. Ändrar jag läge på ringklockan så plingar det med (Vilket inte uppskattades)  

    Om scriptet startas och du behöver göra ändringar glöm då inte att köra raden: Unregister-Event FileCreated 

    Krav
        * Powershell 4.0 eller senare
        * Hemautomations modulen vi har på github ( https://github.com/Ispep/Hemautomation/blob/master/Powershell/Automatiserar.psm1 )
              Behoven mot modulen är följande rader: 
                            Connect-TelldusLive -Credential (Get-TDCredential)    # Detta behövs bara om du har Telldus live!
                            Set-TDDevice -DeviceID 123456 -Action bell            # Detta behövs bara om du har Telldus live!
    

    Funktionen som läser filsystemet bygger på (Register-ObjectEvent) som kommer från :
        https://gallery.technet.microsoft.com/scriptcenter/Powershell-FileSystemWatche-dfd7084b
                      

#>
$VerbosePreference = "silentlycontinue"

# Grundläggande funktion
[string]$folder       = 'D:\LARMMAPP\FTP'           # Mappen som ska övervakas. 
[string]$filter       = '*.jpg'                     # Filtypen som ska övervakas. 

[int]$script:Triggtid = 1                           # Anger hur många minuter det ska vara mellan varje "triggnign (Send-MJ-Notifiering)"


# VERA
[bool]$script:SendVeraNotifiering    = $false 
[string]$veraIP       = 'VeraIP'                      # Ange namn eller IP till vera om du har en.
[int]$veraDevideID    = '220'                         # Ange enhets id i Vera som scriptet ska rapportera antal till ( se luvans Guide på hur du lägger till enheten - https://automatiserar.se/hamta-data-fran-webbsidor/)

# Telldus Live  
[bool]$script:SendTelldusNotifiering = $false 
[int] $script:TelldusBell = '1234567'

# Loggservern
[bool]$Script:SendHTTPNotifiering = $false            # Anger om du vill nyttja loggning till http servern som anges ovan, sätts till false annars
[string]$script:IpTillLoggserver = "10.20.30.40:90"  # Anger ip till loggserver dit alla händeler sedan skickas:  (kör det själv till: https://automatiserar.se/loggning-med-http/ ) 



 # Ändra ej dessa så vida du inte vet vad du gör! 
[int]$script:FileCreated = 0                       # Används för att se hur många bilder som skapats sedan start.
$script:StartDate = (Get-Date).ToShortDateString() # Hämtar datum för att nolla räknaren varje dag.
$script:lasttripped = get-date                     # Används för att inte utföra nått för ofta.
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'} 




# Funktion för att kunna få in en delay mellan händer och bestämma hur ofta det får ske.
function Send-MJ-Notifiering{
    param(
    $info 
    )
    Write-Verbose "Tid som diffas: $(Get-Date) -ge $($lasttripped.AddMinutes($Triggtid))"

    if ((Get-Date) -ge ($lasttripped.AddMinutes($Triggtid)))
    {
        $script:lasttripped = Get-Date
        Write-host "En händelse registrerades! - från: $info" -ForegroundColor Red
        
        return $true
    } 
    else 
    {
        Write-Verbose "Har redan triggat de senaste $triggtid minuterna"
        return $false
    } 

}
 
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { 
$name = $Event.SourceEventArgs.Name 
$changeType = $Event.SourceEventArgs.ChangeType 
$timeStamp = $Event.TimeGenerated 

    Write-Host "Filen '$name' skapades klockan $timeStamp - nr $FileCreated" -fore green 
    $tmp = $name.Split("\")
    $FileCreated++

    if (!(((Get-Date).ToShortDateString()) -le $StartDate))
    {
        $StartDate   = (Get-Date).ToShortDateString() 
        $FileCreated = 0
        Write-Verbose "Satte ny tid $StartDate och nollade räknaren"
    } 
    else
    {
        Write-Verbose "Samma dag - $StartDate"
    }
    
    if ($SendHTTPNotifiering){
        Invoke-WebRequest "http://$($IpTillLoggserver)/?Kamera/$($tmp[0])/$($tmp[1])/AllToday/$($FileCreated)"
    }
    
    # skickar in en fråga för att se om en notifiering skickats inom tidsramen som sattes. Dvs, var det mer än 5 minuter sedan det senast skickades så skickar den igen.
    if (Send-MJ-Notifiering -info $tmp[0])
    {
        if ($SendHTTPNotifiering)
        {
            Invoke-WebRequest "http://$($IpTillLoggserver)/?Telldus/bell/$($tmp[0])/$($FileCreated)"
           
        } 
        if ($SendVeraNotifiering){

              Invoke-WebRequest "http://$($veraIP):3480/data_request?id=variableset&DeviceNum=$($veraDevideID)&serviceId=urn:micasaverde-com:serviceId:LightSensor1&Variable=CurrentLevel&Value=$($FileCreated)"
        }

        if ($SendTelldusNotifiering){

            Connect-TelldusLive -Credential (Get-TDCredential)         # Detta fungerar bra om du har Telldus live och hemautomations modulen: https://github.com/Ispep/Hemautomation/blob/master/Powershell/Automatiserar.psm1
            Set-TDDevice -DeviceID $TelldusBell -Action bell           # Detta fungerar bra om du har Telldus live och hemautomations modulen: https://github.com/Ispep/Hemautomation/blob/master/Powershell/Automatiserar.psm1
        }

    }
} 
Clear-Host
write-host "Scriptet startade: $lasttripped"

#Unregister-Event FileCreated  # detta avregistrerar lyssnaren 

// Ispep

3 reaktioner på ”PowerShell – Trigga system med bilder från webbkameror”

  1. Pingback: Allt om Vera och VeraSecure |

  2. Hej,
    Jag är inne och kollar på Automatisera.PSM1 men hittar ingen GetTDCredential. Ska jag bara börja med att lägga in det scriptet och sen lägga in scriptet från denna sida?

    Behöver jag inte logga in på min telldus live och hämta något annat?

  3. Pingback: Flows & Apps i Homey 2.0 | Lösningar för smarta hem

Lämna en kommentar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *