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"
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.