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.
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
La caméra utilise la qualité d'image LOGICOOL Webcam HD 1,2 million de pixels C270 (Amazon) .
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)
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
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,
:
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é.
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
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 ...
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.
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é.
J'ai fait une caméra de surveillance avec mon premier Raspberry PI.
Recommended Posts