Powershell: охрана с помощью вебкамеры

Wanscam камера

Пару лет назад купил по акции китайскую wanscam вебкамеру с wifi, инфракрасной подсветкой (ночное видение), микрофоном, динамиком, поворотным механизмом и веб-интерфейсом. Камера по акции стоила чуть более 30$, именно это и было первопричинной ее покупки.

Она уже не раз мне пригодилась: например заметил отсутствие своего мобильного телефона, вопрос "украли, потерял или забыл дома?", заходим на камеру, звоним на телефон и слушаем играет ли в комнате звонок =)  Или надо чтоб кто-то из родных что-то сделал по дому, но не хочется обзванивать и расспрашивать когда и кто будет дома, достаточно переключить камеру в режим "тревога при движении", то есть если что движется - сразу оповестить снимками, осталось лишь дождаться оповещения и позвонить попросить сделать то, что было нужно.

Решил попробовать из этой камеры сделать что-то вроде примитивной домашней охраны. Идея: пингуем мобильники или ноутбуки родных, если пингуются - значит кто-то есть дома, если не пингуются - значит дома никого нет. Когда дома никого нет - камера поворачивается в сторону двери и включается в режим "motion alarm", то есть оповещает если что-либо в кадре начинает двигаться. Если же дома кто-то есть - отключаем "motion alarm" и поворачиваем камеру в стенку, чтоб не смущал этот наблюдающий глаз =)

В скрипт добавил еще одно условие: если время сна, то камера также включается на слежение.

Ниже powershell-скрипт с помощью которого я это реализовал:

$file_temp = "C:\Temp\Camera\camera2.txt"
$camera_user_pass = "user=CameraUser&pwd=CameraPassword"
$camera_ip = "192.168.2.30"
$camera_ip_port = "http://"+$camera_ip+":8888/"
$mail_username = "mail_from"
$mail_from = $mail_username+"@gmail.com"
$mail_to = "mail_to@gmail.com"
$mail_pass = "mail_password"
$wifi_ip = "192.168.2.31" #Мой телефон
$wifi_ip2 = "192.168.2.32" #Телефон жены
$hour = (Get-Date).Hour #сколько сейчас часов
$date = Get-Date -format yyyy-MM-dd
$file_log = "C:\Temp\Camera\Camera_log-" + $date + ".txt"
$ping = new-object System.Net.NetworkInformation.Ping

$i = 0;$time = 'timeout'
While (($i -lt 3) -and ($time -eq 'timeout')) { #если камера недоступна, шлем письмо об этом
 $i++
 $reply = $ping.send($camera_ip) #Камера 
 $time = $reply.RoundtripTime 
 if (($reply.status -ne "Success") -and ($i -eq 3)){ 
  write-host "send mail" 
  #данные сообщения: 
  $SMTPServer = "smtp.gmail.com"
  $SMTPPort = "587" 
  $subject = "Camera Timeout"
  $body = "Camera Timeout"
  #формируем в формате html:
  $message = New-Object System.Net.Mail.MailMessage $mail_from, $mail_to
  $message.Subject = $subject
  $message.IsBodyHTML = $true
  $message.Body = $body
  #отправляем:
  $smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort)
  $smtp.EnableSSL = $true
  $smtp.Credentials = New-Object System.Net.NetworkCredential($mail_username, $mail_pass)
  $smtp.Send($message) 
 }
}
$time = 'timeout';$i = 0;
Write-host "Start Ping"
While (($i -lt 3) -and ($time -eq 'timeout')) {#три раза пытаемся пинговать хосты, пока кто-то не отзовется
 $logtime = "{0:yyyy-MM-dd HH:mm:ss}" -f (get-date) 
 $i++
 $reply = $ping.send($wifi_ip) 
 if ($reply.status -eq "Success"){#Если хост пингуется 
  $time = $reply.RoundtripTime 
  $string = "$logtime $wifi_ip $time" 
  $string | Out-File -Append $file_log -Encoding UTF8 #Записываем время пинга
 }else{
  $reply2 = $ping.send($wifi_ip2)
  if ($reply2.status -eq "Success"){
   $time = $reply2.RoundtripTime 
   $string = "$logtime $wifi_ip2 $time" 
   $string | Out-File -Append $file_log -Encoding UTF8 #Записываем время пинга
  }
 }
 Write-host "Ping $i : $time"
}
#Получаем статус камеры
$webclient = New-Object System.Net.WebClient 
$url = $camera_ip_port+"get_params.cgi?"+$camera_user_pass
$webclient.DownloadFile($url,$file_temp)
#$Error[0].Exception.InnerException.ToString() - детальный вывод ошибки

#читаем содержимое файла в масив построчно и берем из 149-й строки статус
$file = Get-Content $file_temp 
$motion_status = $file[149]

#если слежение установлено и при этом хост доступен и не время сна, то отключаем слежение и поворачиваем камеру в стену
if (($motion_status -eq "var alarm_motion_armed=1;")-and(($time -ne "timeout")-and($hour -gt 7))) {
 write-host "отключаем слежение"
 $url = $camera_ip_port+"set_alarm.cgi?motion_armed=0&"+$camera_user_pass #отключаем слежение
 $webclient.DownloadFile($url,$file_temp)
 $motion_status = "var alarm_motion_armed=0;" 
 $url = $camera_ip_port+"decoder_control.cgi?command=37&"+$camera_user_pass #поворачиваем в стену
 $webclient.DownloadFile($url,$file_temp)
}

#если слежение не установлено и при этом хост не доступен или время сна, то включаем слежение и поворачиваем от стены
if (($motion_status -eq "var alarm_motion_armed=0;")-and(($time -eq "timeout")-or($hour -le 7))) { 
 write-host "включаем слежение"
 $url = $camera_ip_port+"set_alarm.cgi?motion_armed=1&"+$camera_user_pass #включаем слежение
 $webclient.DownloadFile($url,$file_temp)
 $motion_status = "var alarm_motion_armed=1;" 
 $url = $camera_ip_port+"decoder_control.cgi?command=31&"+$camera_user_pass #поворачиваем от стены
 $webclient.DownloadFile($url,$file_temp) 
}

#Записываем в логфайл время и статус слежения
$string = "$logtime $motion_status" 
$string | Out-File -Append $file_log -Encoding UTF8

Скрипт очень прост.  В данном примере я пингую только свой телефон и телефон жены, но можно добавить в условия и другие ip-адреса. Url-команды я взял из документации - goo.gl/DP2sfY . Осталось лишь создать задачу (на постоянно включенном ноутбуке) в планировщике заданий, которая бы запускала этот скрипт с какой-то периодичностью.

Следующая желаемая покупка - сетевой фильтр управляемый по wifi (есть такие). Тогда я смогу, например, настроить автоматическое включение-выключение розеток, в которые воткнуты лампа, монитор, колонки, зарядки и т.д.

Понравилось? =) Поделись с друзьями:

Обсуждение записи “Powershell: охрана с помощью вебкамеры”

  1. Oleg Kalachov (www.kalachov.com/blog/category/ekstrim) says:

    Оригинально :) даже не думал что все так относительно просто создается система слежения за квартирой.

  2. Владимир Демянович (elims.org.ua) says:

    Oleg Kalachov, главное проявлять фантазию =)

  3. krockoos (ghs.in.ua) says:

    Как здорово, что я попал на этот блог! Дело в том. что у старенькая бабушка и мне нужно решить вопрос контроля, чтобы иметь возможность реагировать, если вдруг ей станет плохо. Думаю, что этот вариант — то, что надо!Спасибо!

  4. Владимир Демянович (elims.org.ua) says:

    krockoos, ну скрипт вряд-ли для этих целей пригодится, а вот сами камеры — да, заказать несколько таких в Китае и развесить по комнатам. Правда как отличить спит бабушка или ей плохо стало и она прилегла?

  5. Евгений (rebate-gu.ru) says:

    А можно написать скрипт, чтоб камера вырубалась когда я злой. Когда слишком много у меня движений)

  6. Владимир (eurotur.net) says:

    Чего только люди не придумают, плюс Вам за оригинальность))) Нужно тоже поискать камеру по дешевле.

  7. Евгений says:

    camera_ip — это ведь внут адрес вашей подсети дома. Как вы его достаете извне?

  8. Владимир Демянович (elims.org.ua) says:

    Можно пойти разными путями:

    Можно поднять дома openvpn сервер и подключаться к нему. В результате будет доступ ко всем внутренним ресурсам по шифрованному каналу.

    Можно «пробросить» порт.

  9. Евгений says:

    а ви як зробили?

  10. Владимир Демянович (elims.org.ua) says:

    vpn — https://elims.org.ua/blog/openvpn-server-na-windows-kak-nastroit/

  11. Евгений says:

    то есть дома крутится vpn сервер, а на работе у вас клиент.

  12. Oleg says:

    Привет, а у меня на работе проблема слеующая с камерами, каждый день обестачивают здание вечером и соответственно каждое утро приходится подключаться на хост, вводить пароль администратора, выбирать нужные камеры, т.к. этот монитор с камерами необходим для клиентов. Вот я подумал раз вы так легко скрипты умеете писать, может поможете и напишите скрипт, чтоб он делал эту всю процедуру автоматически.??

  13. Владимир Демянович (elims.org.ua) says:

    Извините, нет свободного времени, весь в работе, поэтому и блог начал крайне редко обновляться.

Обсудить