Пару лет назад купил по акции китайскую 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 (есть такие). Тогда я смогу, например, настроить автоматическое включение-выключение розеток, в которые воткнуты лампа, монитор, колонки, зарядки и т.д.
Оригинально :) даже не думал что все так относительно просто создается система слежения за квартирой.
Oleg Kalachov, главное проявлять фантазию =)
Как здорово, что я попал на этот блог! Дело в том. что у старенькая бабушка и мне нужно решить вопрос контроля, чтобы иметь возможность реагировать, если вдруг ей станет плохо. Думаю, что этот вариант — то, что надо!Спасибо!
krockoos, ну скрипт вряд-ли для этих целей пригодится, а вот сами камеры — да, заказать несколько таких в Китае и развесить по комнатам. Правда как отличить спит бабушка или ей плохо стало и она прилегла?
А можно написать скрипт, чтоб камера вырубалась когда я злой. Когда слишком много у меня движений)
Чего только люди не придумают, плюс Вам за оригинальность))) Нужно тоже поискать камеру по дешевле.
camera_ip — это ведь внут адрес вашей подсети дома. Как вы его достаете извне?
Можно пойти разными путями:
Можно поднять дома openvpn сервер и подключаться к нему. В результате будет доступ ко всем внутренним ресурсам по шифрованному каналу.
Можно «пробросить» порт.
а ви як зробили?
vpn — https://elims.org.ua/blog/openvpn-server-na-windows-kak-nastroit/
то есть дома крутится vpn сервер, а на работе у вас клиент.
Привет, а у меня на работе проблема слеующая с камерами, каждый день обестачивают здание вечером и соответственно каждое утро приходится подключаться на хост, вводить пароль администратора, выбирать нужные камеры, т.к. этот монитор с камерами необходим для клиентов. Вот я подумал раз вы так легко скрипты умеете писать, может поможете и напишите скрипт, чтоб он делал эту всю процедуру автоматически.??
Извините, нет свободного времени, весь в работе, поэтому и блог начал крайне редко обновляться.