[PYTHON] Notification téléphonique lorsque le mouvement de la caméra de surveillance est détecté sur Raspberry Pi

Il est standard d'exécuter le Raspberry Pi en tant que caméra de surveillance Il n'y avait pas de notification téléphonique au numéro spécifié lorsqu'un mouvement était détecté, alors j'en ai fait une.

spécification

En tant qu'application ...

Un appel est reçu en détectant le mouvement de l'enfant rentrant chez lui. ↓ "Oh? J'ai reçu un appel." Vérifiez l'apparence de l'enfant avec Slack ↓ Même si vous postez un appel entrant OFF sur Slack et détectez un mouvement, il ne sera pas reçu

environnement

La caméra utilise la qualité d'image LOGICOOL Webcam HD 1,2 million de pixels C270 (Amazon) .

procédure

Paramètres astérisque

Reportez-vous aux informations suivantes pour les paramètres Asterisk Création d'un système de téléphonie IP avec Raspberry Pi et Asterisk (partie 1) Construire un système de téléphonie IP avec Raspberry Pi et Asterisk (partie 2)

paramètres de mouvement

installer le mouvement

Terminal


apt-get install -y motion

Modifier motion.conf

Terminal


vi /etc/motion/motion.conf

motion.conf


# Threshold for number of changed pixels in an image that
# triggers motion detection (default: 1500)
#threshold 1500
threshold 8000   #Augmentez le seuil qui déclenche la prise de vue

:

# Target base directory for pictures and films
# Recommended to use absolute path. (Default: current working directory)
target_dir /tmp/motion #Définir la destination d'enregistrement de l'image capturée

:

#Mouvement au moment de la prise de vue.Exécutez le fichier py. Des paramètres%f est le PATH du fichier capturé
on_picture_save python /home/hasuo/motion/motion.py %f

Il réussit si le mouvement est exécuté et que la caméra détecte le mouvement et qu'un fichier image est généré dans / home / tmp /.

Terminal


motion -c /etc/motion/motion.conf

Paramètres Slack

Créez un compte avec Slack .

Vérifiez le jeton et l'ID de canal pour la publication à l'aide de l'API de Slack. https://api.slack.com/methods/channels.list/test

Avec la connexion, appuyez sur [Mode test] pour obtenir le jeton et l'ID de canal.

URL


https://slack.com/api/channels.list?token=<jeton>&pretty=1 

channels.résultat de l'exécution de la liste


{
    "ok": true,
    "channels": [
        {
            "id": "<Identifiant de la chaine>",
            "name": "general",
            "is_channel": true,
              :

Télécharger l'image

Les images sont automatiquement publiées sur Slack lorsqu'un mouvement est détecté à l'aide de l'API de Slack. Commencez par créer un espace pour publier sur Slack.

motion.py


TOKEN      = '<jeton>'
CHANNEL    = '<Identifiant de la chaine>'

# slack API : files.upload
#Référence: https://api.slack.com/methods/files.upload
####
def upload_file(file_path, channel):
    
    with open(file_path,'rb') as f:
        param = {'token':TOKEN, 'channels':CHANNEL,}
        r = requests.post("https://slack.com/api/files.upload", params=param,files={'file':f})
    

if __name__ == "__main__":
    
    arg     = sys.argv
    file_path = arg[1]
    
    upload_file(file_path, CHANNEL)
    

Donnez l'autorisation d'exécution au fichier source et vérifiez si vous pouvez publier une image avec un fichier image approprié.

Terminal


chmod 755 motion.py
python motion.py <Fichier image PATH>

Lorsque je l'ai vérifié sur Slack, l'image a été publiée en toute sécurité.

無題.png

Notification par téléphone

Assurez-vous de créer un fichier pour l'appel automatique afin qu'Asterisk procède automatiquement à l'appel.

motion.py


TOKEN                 = '<jeton>'
CHANNEL               = '<Identifiant de la chaine>'
CALLFILE_DIR          = '<Répertoire de fichiers d'appel automatique>'
CALLFILE_NAME         = 'auto_call.call'    #Nom du fichier d'appel automatique
OUTGOING_DIR          = '/var/spool/asterisk/outgoing/'

#Génération automatique de fichiers sortants-> outgoing
####
def outgoing_call():
    
    file_str = '''#
Channel: SIP/<Numéro de téléphone que vous souhaitez notifier>@<Nom de la section à envoyer à la ligne extérieure>
MaxRetries: 0               #Le nombre d'appels est de 1
RetryTime: 60               #Temps d'attente pour rappeler(Secondes)
WaitTime: 30                #Appelez pendant 30 secondes
Context: <extensions.Paramètres de contexte avec conf>
Extension: <extensions.Paramètres supplémentaires avec conf>
Priority: 1'''
    
    file = open(CALLFILE_DIR +CALLFILE_NAME, "w")
    file.writelines(file_str);
    file.close()
    
    os.chmod(CALLFILE_DIR + CALLFILE_NAME, 0755)
    shutil.move(CALLFILE_DIR + CALLFILE_NAME, OUTGOING_DIR)

if __name__ == "__main__":
    
    outgoing_call()

Donnez l'autorisation d'exécution au fichier source et l'autorisation d'écriture sur / var / spool / asterisk / outgoing / et vérifiez si l'appel est reçu en exécutant le fichier.

Terminal


chmod 755 motion.py
python motion.py

Notification téléphonique ON / OFF

Utilisez get_channel_info de Slack pour obtenir les derniers messages lorsqu'un mouvement est détecté.

L'état ON / OFF de la notification téléphonique est conservé en créant un fichier de paramètres avec ConfigParser.

Je pense qu'il existe un moyen plus intelligent, mais je ne pouvais pas y penser, donc cette fois.

motion.py


# coding:utf-8

import sys
import os
import shutil
import pprint
import urllib
import urllib2
import json
import ConfigParser

TOKEN                 = '<jeton>'
CHANNEL               = '<Identifiant de la chaine>'
CALL_NOTIFY_START_STR = 'call';       #Notification téléphonique ON chaîne de caractères de jugement
CALL_NOTIFY_END_STR   = 'nocall';     #Notification téléphonique OFF chaîne de caractères de jugement
INIFILE_PATH          = 'config.ini'  #fichier de configuration
SECTION               = 'motion notify'

# slack API : channels.info
#Référence: https://api.slack.com/methods/channels.info
####
def get_channel_info():

    url = "https://slack.com/api/channels.info"

    params = {'token'  : TOKEN,
              'channel': CHANNEL,
    }

    params = urllib.urlencode(params)

    req    = urllib2.Request(url)
    req.add_header('Content-Type', 'application/x-www-form-urlencoded')

    req.add_data(params)
    res     = urllib2.urlopen(req)
    body    = res.read()
    result  = json.loads(body)

    return result

#Notification téléphonique activée/Réglage OFF
# slack_last_text :La partie texte du dernier message reçu de slack
####
def set_call_notify(slack_last_text):

    config = ConfigParser.SafeConfigParser()

    if not config.has_section(SECTION):
        config.add_section(SECTION)

    #Obtenez le contenu du fichier de paramètres
    try :
        config.read(INIFILE_PATH)
        ini_set = config.get(SECTION,'enable')
    except Exception as e:
        ini_set = 'FALSE'

    if slack_last_text == CALL_NOTIFY_START_STR:
        config.set(SECTION, 'enable', 'TRUE')
        ini_set = 'TRUE'

    elif slack_last_text == CALL_NOTIFY_END_STR:
        config.set(SECTION, 'enable', 'FALSE')
        ini_set = 'FALSE'
    else:
        config.set(SECTION, 'enable', ini_set)

    config.write(open(INIFILE_PATH, 'w'))

    return ini_set

if __name__ == "__main__":

    channnels_info = get_channel_info()

    is_call = set_call_notify(channnels_info['channel']['latest']['text'])

    print is_call

Après avoir publié «appel activé» et «appel désactivé» dans Slack, l'opération réussit si le fichier de paramètres suivant est généré lors de la prise de vue.

config.ini


[motion notify]
enable = FALSE

Créez un fichier source basé sur ceux-ci.

Quand je le fais fonctionner ...

無題2.png

Déplacez-vous juste devant la caméra et elle sera affichée et vous recevrez un appel retentissant. Plus ennuyeux (rires)

Lorsque j'ai publié "aucun appel", la photo a été publiée sur Slack et la notification par téléphone a été interrompue. C'est donc terminé

Voir ci-dessous pour plus d'informations sur le mouvement et Slack J'ai fait une caméra de surveillance avec mon premier Raspberry PI.

Impressions

Il serait intéressant d'utiliser le moteur de synthèse vocale Open JTalk pour parler de quelque chose lorsqu'un mouvement est détecté.

référence

J'ai fait une caméra de surveillance avec mon premier Raspberry PI.

Recommended Posts

Notification téléphonique lorsque le mouvement de la caméra de surveillance est détecté sur Raspberry Pi
Un mémorandum lors de la réalisation d'une caméra de surveillance avec Raspeye
Raspberry Pi "Lampe de notification Honwaka" Partie 2
Raspberry Pi "Lampe de notification Honwaka" Partie 1
Raspberry Pi "Lampe de notification Honwaka" Partie 3
Pourquoi detectMultiScale () est lent sur Raspberry Pi B +
Qu'est-ce que Raspberry Pi?
pigpio sur Raspberry pi
Caméra vidéo Raspberry Pi
Cython sur Raspberry Pi
Créez une caméra de surveillance WEB avec Raspberry Pi et OpenCV
J'ai fait une caméra de surveillance avec Raspberry PI pour la première fois.
Introduction de pyenv sur Raspberry Pi
Utilisez NeoPixel avec la tarte aux framboises
Installez OpenCV4 sur Raspberry Pi 3
Installez TensorFlow 1.15.0 sur Raspberry Pi
Résolution d'une erreur lors de la mise en place de pygame dans python3 sur raspberry pi
Test de la communication UART avec Raspberry Pi
MQTT sur Raspberry Pi et Mac
Installez ghoto2 sur Raspberry Pi (Remarque)
Essayez d'utiliser ArUco avec Raspberry Pi
Procédure d'installation d'OpenCV sur Raspberry Pi
Allumer / éteindre le Raspberry pi avec Arduino
Détecter l'état du commutateur avec Raspberry Pi 3
Installez OpenMedia Vault 5 sur Raspberry Pi 4
L Chika avec Raspberry Pi C #
Construisez wxPython sur Ubuntu 20.04 sur Raspberry Pi 4
Lorsque ssh de Raspeye 4 est très lent, il est bon de désactiver IPv6
Paramètres initiaux pour l'utilisation du kit de démarrage et de la caméra Grove Pi + avec Raspberry Pi