Commit 2588efd9 authored by David Marzal's avatar David Marzal 🐧
Browse files

V1.1 arreglos + preaviso implementado

parent 9fb0da73
......@@ -11,7 +11,9 @@ A grandes rasgos lo que este proyecto hace es utilizar la capacidad de `motion`
* En función de si estamos en casa o no el programa actua de la siguiente manera:
* **Estamos en casa** (o alguno de nuestros dispositvos lo esta) -> Solo nos mandara un mensaje de aviso _silencioso_, sin fotografía. Ademas los mensajes tendran un tiempo mínimo entre ellos definido en el fichero de configuración (por defecto 30 minutos), para que no tengamos mensajes constantes si estamos moviendonos por casa.
* Los videos generados se guardan en una subcarpeta con la IP del primer dispositivo detectado y se borraran los que tengán más de 7 días.
* **No estamos** en casa/no se detectan dispositvos -> En este caso se nos enviará una foto del momento en el que motion detecta movimiento
* **No estamos** en casa/no se detectan dispositvos -> En este caso se nos enviará:
* Un primer mensaje de PREAVISO para saber que ha detectado algo. (Por si se cortara la conexión o pasara algo).
* Y despues una foto una vez que finalice el video momento en el que motion detecta movimiento. Borrandose el mensaje del PREAVISO
* Los videos se guardan en el raiz de la ruta especificada en la configuración para el almacenaje y se borraran los que tengán más de 1 mes.
* Mediante la configuración opcional de una VPN como Wireguard y la apertura del puerto correspondiente en el _router_ se puede tener acceso a la webcam en directo. Pero está configuración execede el alcance de esta documentación.
* El programa si se encarga de enviarnos un mensaje si detecta que nuestro router ha cambiado de IP pública para que sea posible acceder a la VPN sin DNS.
......@@ -47,8 +49,8 @@ Poder hacer funcionar `motion` y el bot de Telegram son requisitos de este proye
* **TOKEN** [Obligatorio] -> Token que nos ha dado @botfather.
* **IDR** [Obligatorio] -> ID del canal donde recibiremos las notifiaciones. (Si empeiza por **-100** esa parte no es necesaria).
* Para obtener el id del canal podeis escribir en el algún mensaje, y luego le dais a "Copiar el enlace del post". Os dara una URL del tipo `https://t.me/c/`**IDR**`/1123`
* **IPs2WATCH** [Opcional] -> Listado de IPs locales separadas por espacios en blanco, de las IPs que queremos que se usen para detectar nuestra .presencia en casa
* **RUTAVIDEOS** [Obligatorio] -> Ruta completa de la carpeta donde queremos que se guarden los videos de motion (se recomienda un pincho USB).
* **IPs2WATCH** [Opcional] -> Listado de IPs locales separadas por espacios en blanco, de las IPs que queremos que se usen para detectar nuestra .presencia en casa
* **TIEMPOMIN**=30 [Opcional] -> Tiempo a esperar para generar una nueva notificación si se detecta movimiento estando nostros en casa.
* **DEPURA** [Opcional] -> Si queremos que el programa muestre más información en su log.
......@@ -56,8 +58,8 @@ Ejemplo:
```ini
TOKEN=123456789:ABCDefghijkl12rfdhj233jfdkfk
IDR=0123456789
IPs2WATCH="192.168.1.15 192.168.1.14 192.168.1.12"
RUTAVIDEOS=/media/usb0/motion
IPs2WATCH="192.168.1.15 192.168.1.14 192.168.1.12"
TIEMPOMIN=30
DEPURA=false
```
......
TOKEN=
IDR=
IPs2WATCH="192.168.1.15 192.168.1.14 192.168.1.12"
RUTAVIDEOS=/media/usb0/motion
IPs2WATCH="192.168.1.15 192.168.1.14 192.168.1.12"
TIEMPOMIN=30
DEPURA=false
......
......@@ -13,13 +13,10 @@ readonly configuracion=vigilantecasero.conf
f_get_ruta () {
local ruta=$1
local fichero=$2
if [[ -s $fichero && -r $fichero ]]; then
# the helper script takes precedence in the same folder
# shellcheck source=dmc_bashelper.sh
#echo "$fichero encontrado en SCRIPTDIR"
if [[ -s $fichero && -r $fichero ]]; then
rutafichero="./$fichero"
elif [[ -s $ruta/$fichero && -r $ruta/$fichero ]]; then
#echo "$fichero encontrado en $ruta"
rutafichero="$ruta/$fichero"
else
echo "Este script necesita $fichero"
......@@ -32,7 +29,6 @@ source "$rutafichero" || ( echo "Fallo al cargar $funciones"; exit 2 )
# Modificamos la función para que lo mande por Telegram tambien
f_error_trap () {
local s=$? # error status
local line=${BASH_LINENO[0]} # LINENO
local linecallfunc=$1 # line where func was called
......@@ -55,36 +51,46 @@ v_presencia=false
# Mandatory variables from $configuracion {/usr/local/etc/}vigilantecasero.conf
# TOKEN=
# IDR=
# IPs2WATCH=""
# RUTAVIDEOS='/media/usb0/motion'
# Default value
# Default values
IPs2WATCH=""
TIEMPOMIN=60
DEPURA=false
f_get_ruta $etcdir "$configuracion"
# shellcheck source=../etc/vigilantecasero.conf
# shellcheck source=vigilantecasero.conf
f_get_config "$rutafichero"
# Constants
readonly URL="https://api.telegram.org/bot$TOKEN"
readonly ID="-100$IDR"
readonly PRESENTE='/tmp/presente.lock'
readonly PRESENTE='/tmp/vigilantecasero.lock'
readonly PREAVISO='/tmp/vigilantecasero.preaviso'
ayuda () {
f_pinta W "Comandos aceptados:"
f_pinta H "vigilantecasero.sh [avisa|foto|mensaje|chatinfo] [texto|archivo|nada]"
f_pinta H "vigilantecasero.sh install script"
f_pinta H "vigilantecasero.sh limpieza total"
}
if [[ -z ${1:-} || -z ${2:-} ]]; then
f_pinta W 'Este script requiere dos parametros'
ayuda
exit 90
fi
f_mensaje_ss () {
local texto=${1:-$v_argumento}
f_pinta H "Mandando mensaje silencioso: $texto"
curl -s -F "text=$texto" -F "chat_id=$ID" -F disable_notification=true "$URL/sendMessage" || f_pinta W "Error ($?) mandando mensaje silencioso: $v_argumento en linea $LINENO"
}
f_mensaje () {
f_pinta H "Mandando mensaje: $v_argumento"
curl -s -F "text=$v_argumento" -F "chat_id=$ID" "$URL/sendMessage" || f_pinta W "Error ($?) mandando mensaje: $v_argumento en linea $LINENO"
curl -s -F "text=$texto" -F "chat_id=$ID" -F disable_notification=true "$URL/sendMessage"
}
ayuda () {
f_pinta W "Comandos aceptados:"
f_pinta H "vigilantecasero.sh [avisa|foto|mensaje|chatinfo] [texto|archivo|nada]"
f_pinta H "vigilantecasero.sh install script"
f_t_mensaje () {
local texto=${1:-$v_argumento}
f_pinta H "Mandando mensaje: $texto"
MESSAGE_ID=$(curl -s -F "text=$texto" -F "chat_id=$ID" "$URL/sendMessage" | grep -oP '(?<=message_id":)[^,]*')
}
f_foto () {
......@@ -92,6 +98,12 @@ f_foto () {
curl -s -F "photo=@$v_argumento" -F "chat_id=$ID" "$URL/sendphoto" || f_pinta W "Error ($?) mandando la foto: $v_argumento en linea $LINENO"
}
f_t_delete () {
local message_id=$1
f_pinta H "Eliminando mensaje: $message_id"
curl -s -F "message_id=$message_id" -F "chat_id=$ID" "$URL/deleteMessage"
}
f_limpieza () {
#mkdir -p $RUTAVIDEOS/keep # para que funcione el f_limpieza
find "$RUTAVIDEOS"/*/ -type f -mtime +7 -delete
......@@ -115,19 +127,28 @@ f_estamosencasa () {
break # Con encontrar un dispositivo ya no seguimos
else
# Solo para DEBUG
[ "$DEPURA" = true ] && f_pinta W "No detecto la presencia de la fuerza. ($ip)"
[[ $DEPURA = false ]] || f_pinta W "No detecto la presencia de la fuerza. ($ip)"
fi
done
}
f_preaviso () {
local message_id=$1
f_estamosencasa
if [[ $v_presencia = "false" ]] ; then
f_t_mensaje "PREAVISO de movimiento" && echo "$MESSAGE_ID" > $PREAVISO
fi
}
f_vigila () {
f_fichero_usable $PREAVISO && f_t_delete "$(cat $PREAVISO)" && f_borraf "$PREAVISO"
f_estamosencasa
if [[ $v_presencia = "true" ]] ; then
if [[ $(find "$PRESENTE" -cmin +${TIEMPOMIN}) ]] || [[ ! -f $PRESENTE ]] ; then
touch "$PRESENTE"
f_mensaje_ss "$ip detectado en casa"
fi
[ "$DEPURA" = true ] && f_pinta W "Moviendo : ${v_argumento/jpg/mkv}"
[[ $DEPURA = false ]] || f_pinta W "Moviendo : ${v_argumento/jpg/mkv}"
mkdir -p "$RUTAVIDEOS/$ip"
mv "${v_argumento/jpg/mkv}" "$RUTAVIDEOS/$ip/"
else
......@@ -144,33 +165,33 @@ install_motion () {
chown pi:video "$RUTAVIDEOS"
mkdir -p "$RUTAVIDEOS/keep" # para que funcione el f_limpieza
f_existe_comando motion || apt-get install -y motion
local CONFMOTION='/etc/motion/motion.conf'
cp $CONFMOTION $CONFMOTION.bak
sed -i 's/^daemon off/daemon on/' $CONFMOTION
sed -i "s#^target_dir.*#target_dir $RUTAVIDEOS#" $CONFMOTION
sed -i 's#^stream_localhost on.*#stream_localhost off#' $CONFMOTION
sed -i 's#^webcontrol_localhost on.*#webcontrol_localhost off#' $CONFMOTION
sed -i 's#^stream_quality.*#stream_quality 100#' $CONFMOTION
sed -i 's/^movie_bps.*/movie_bps 900000/' $CONFMOTION || echo 'Version antigua'
sed -i 's/^ffmpeg_bps.*/ffmpeg_bps 900000/' $CONFMOTION
sed -i 's/^ffmpeg_variable_bitrate.*/ffmpeg_variable_bitrate 100/' $CONFMOTION
sed -i 's/^framerate.*/framerate 2/' $CONFMOTION
sed -i 's/^width.*/width 640/' $CONFMOTION
sed -i 's/^height.*/height 480/' $CONFMOTION
sed -i 's/^webcontrol_parms.*/webcontrol_parms 1/' $CONFMOTION
sed -i 's/^picture_output.*/picture_output best/' $CONFMOTION || echo 'Version antigua'
sed -i 's/^picture_quality.*/picture_quality 99/' $CONFMOTION || echo 'Version antigua'
sed -i 's/^threshold .*/threshold 8000/' $CONFMOTION
sed -i 's/^output_pictures.*/output_pictures best/' $CONFMOTION
sed -i 's/^quality.*/quality 99/' $CONFMOTION
sed -i 's/^picture_filename.*/picture_filename preview/' $CONFMOTION
sed -i 's/^movie_filename.*/movie_filename %Y-%m-%d_%H%M%S/' $CONFMOTION
sed -i 's/^lightswitch.*/lightswitch 10/' $CONFMOTION
sed -i "s#.*on_picture_save .*#on_picture_save $bindir/$SCRIPTNAME avisa %f >> /tmp/vigilantecasero.log 2>\&1#" $CONFMOTION
local confmotion='/etc/motion/motion.conf'
cp $confmotion $confmotion.bak
sed -i 's/^daemon off/daemon on/' $confmotion
sed -i "s#^target_dir.*#target_dir $RUTAVIDEOS#" $confmotion
sed -i 's#^stream_localhost on.*#stream_localhost off#' $confmotion
sed -i 's#^webcontrol_localhost on.*#webcontrol_localhost off#' $confmotion
sed -i 's#^stream_quality.*#stream_quality 100#' $confmotion
sed -i 's/^movie_bps.*/movie_bps 900000/' $confmotion || f_pinta W 'Version antigua'
sed -i 's/^ffmpeg_bps.*/ffmpeg_bps 900000/' $confmotion
sed -i 's/^ffmpeg_variable_bitrate.*/ffmpeg_variable_bitrate 100/' $confmotion
sed -i 's/^framerate.*/framerate 2/' $confmotion
sed -i 's/^width.*/width 640/' $confmotion
sed -i 's/^height.*/height 480/' $confmotion
sed -i 's/^webcontrol_parms.*/webcontrol_parms 1/' $confmotion
sed -i 's/^picture_output.*/picture_output best/' $confmotion || f_pinta W 'Version antigua'
sed -i 's/^picture_quality.*/picture_quality 99/' $confmotion || f_pinta W 'Version antigua'
sed -i 's/^threshold .*/threshold 8000/' $confmotion
sed -i 's/^output_pictures.*/output_pictures best/' $confmotion
sed -i 's/^quality.*/quality 99/' $confmotion
sed -i 's/^picture_filename.*/picture_filename preview/' $confmotion
sed -i 's/^movie_filename.*/movie_filename %Y-%m-%d_%H%M%S/' $confmotion
sed -i 's/^lightswitch.*/lightswitch 10/' $confmotion
sed -i "s#.*on_picture_save .*#on_picture_save $bindir/$SCRIPTNAME avisa %f >> /tmp/vigilantecasero.log 2>\&1#" $confmotion
sed -i 's/start_motion_daemon=no/start_motion_daemon=yes/' /etc/default/motion
raspi-config nonint do_camera 0
echo "Hay que reiniciar la RPi"
f_pinta W "Hay que reiniciar la RPi"
}
f_instalar () {
......@@ -187,8 +208,11 @@ case $v_comando in
avisa|a)
f_vigila
;;
preavisa|p)
f_preaviso "$v_argumento"
;;
mensaje|m)
f_mensaje
f_t_mensaje
;;
foto|f)
f_foto
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment