0 votos

Activar la automatización o notificación contando otras notificaciones

Tengo uno de esos sistemas de eliminación de óxido que se alimenta de un tanque de solución cuando funciona mi sistema de riego.

Al contar el número de veces que mi sistema de riego me ha notificado que funcionó, puedo saber cuándo es el momento de añadir más solución para eliminar el óxido.

¿Hay alguna manera de activar una notificación o automatización después de recibir un cierto número de otras notificaciones?

2voto

chr Puntos 136

MacOS guarda las notificaciones en una base de datos SQLite. Puedes consultar esta base de datos en busca de notificaciones que coincidan con los textos provenientes de tu sistema de riego.

Supongamos que la notificación de tu sistema de riego contiene la frase "Riego encendido"

ejemplo de notificación

Podrías configurar un script para consultar la base de datos en busca de esa cadena y devolver el recuento de mensajes en la base de datos que contienen ese texto. Y, cuando el recuento supere tu umbral establecido, ejecutar un segundo script de alerta, etc.

Aquí tienes un ejemplo básico para zsh (código también en mi GitHub). Guarda esto como por ejemplo sprinkler.sh y haz que se ejecute cada 5 minutos con un LaunchAgent. Utiliza LaunchControl si no sabes cómo crear tu propio LaunchAgent desde cero.

#!/bin/zsh

#número de veces después de las cuales se requiere un relleno
REFILL_AFTER=25

#texto (regex sensible a mayúsculas y minúsculas) que debería hacer que el contador se incremente
TRIGGER_STR='Riego encendido'

#script que se ejecutará cuando se active la alerta (enviar correo electrónico, SMS, etc...)
ALERT_SCRIPT=/ruta/a/tu/script

#directorio para almacenar los datos
DATA_DIR=$HOME/.sprinkler

######## NO CAMBIES NADA POR DEBAJO DE ESTE PUNTO ########

mkdir -p $DATA_DIR
touch $DATA_DIR/cnt $DATA_DIR/seen
read -r LAST_COUNT <$DATA_DIR/cnt
[[ -n LAST_COUNT ]] || LAST_COUNT=0

DARWIN_USER_DIR=$(/usr/bin/getconf DARWIN_USER_DIR)
cd "${DARWIN_USER_DIR}com.apple.notificationcenter/db2" 2>/dev/null || exit 1
[[ -e db ]] || exit 1
sqlite3 db "PRAGMA wal_checkpoint(TRUNCATE)" &>/dev/null

sqlite3 db "SELECT hex(uuid), hex(data) FROM record" >$DATA_DIR/msgs
while IFS='|' read UUID MSG _ ; do
    if grep -q $UUID $DATA_DIR/seen; then
        continue
    fi
    echo "$UUID" >>$DATA_DIR/seen
    echo "analizando nuevo mensaje: $UUID"
    #los mensajes se almacenan en formato plist binario
    DECODED=$(
        xxd -r -p <<<"$MSG" |
        plutil -convert xml1 -o - -- - |
        xmllint --xpath "//key[.='body']/following-sibling::string[1]/text()" -
    )
    if [[ $DECODED =~ $TRIGGER_STR ]]; then
        (( LAST_COUNT++ ))
        echo "¡coincidencia! el recuento es ahora: $LAST_COUNT/$REFILL_AFTER"
        echo $LAST_COUNT >$DATA_DIR/cnt
    fi
done <$DATA_DIR/msgs

if (( LAST_COUNT >= REFILL_AFTER )); then
    rm $DATA_DIR/cnt
    echo "¡es hora de rellenar el tanque!!!"
    $ALERT_SCRIPT
fi

Puedes esperar a que lleguen las notificaciones, o probarlo previamente con terminal-notifier si lo tienes en tu sistema:

terminal-notifier -title 'Sistema de riego' -message "Riego encendido $(date)"

Ajusta las variables en la parte superior del script para controlar cuántos ciclos obtienes por tanque (REFILL_AFTER), el texto a buscar (TRIGGER_STR), dónde se almacenan los datos temporales (DATA_DIR), y la ruta del script que se ejecutará cuando se active la alerta (ALERT_SCRIPT).

editar: después de publicar esto, me di cuenta de que podrías estar buscando una solución puramente para iOS. Lo anterior requeriría un Mac con sincronización de mensajes de iCloud habilitada.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X