diff --git a/birdnet-pi/rootfs/custom-services.d/30-monitoring.sh b/birdnet-pi/rootfs/custom-services.d/30-monitoring.sh index 53f445ce0..0f7a01394 100755 --- a/birdnet-pi/rootfs/custom-services.d/30-monitoring.sh +++ b/birdnet-pi/rootfs/custom-services.d/30-monitoring.sh @@ -23,7 +23,7 @@ srv="birdnet_recording" srv2="birdnet_analysis" ingest_dir="$RECS_DIR/StreamData" counter=10 -no_files_counter=0 + # Ensure directories and permissions mkdir -p "$ingest_dir" chown -R pi:pi "$ingest_dir" @@ -31,9 +31,9 @@ chmod -R 755 "$ingest_dir" # Function to send notifications using Apprise apprisealert() { + local issue_message="$1" local notification="" local stopped_service="
Stopped services: " - local no_files_alert="${1:-}" # Check for stopped services services=(birdnet_analysis chart_viewer spectrogram_viewer icecast2 birdnet_recording birdnet_log birdnet_stats) @@ -44,17 +44,21 @@ apprisealert() { done # Build notification message + notification+="Issue: $issue_message" notification+="$stopped_service" - notification+="
Additional information: " + notification+="
Additional information:" notification+="
Since: ${LASTCHECK:-unknown}" notification+="
System: ${SITE_NAME:-$(hostname)}" notification+="
Available disk space: $(df -h "$HOME/BirdSongs" | awk 'NR==2 {print $4}')" [[ -n "$BIRDNETPI_URL" ]] && notification+="
Access your BirdNET-Pi" - [[ -n "$no_files_alert" ]] && notification+="
Alert: No files in folder for at least 30 seconds." # Send notification - TITLE="BirdNET-Analyzer stopped" - "$HOME/BirdNET-Pi/birdnet/bin/apprise" -vv -t "$TITLE" -b "$notification" --input-format=html --config="$HOME/BirdNET-Pi/apprise.txt" + TITLE="BirdNET-Analyzer Alert" + if [[ -f "$HOME/BirdNET-Pi/birdnet/bin/apprise" && -s "$HOME/BirdNET-Pi/apprise.txt" ]]; then + "$HOME/BirdNET-Pi/birdnet/bin/apprise" -vv -t "$TITLE" -b "$notification" --input-format=html --config="$HOME/BirdNET-Pi/apprise.txt" + else + log_red "Apprise not configured or missing!" + fi } # Main loop @@ -65,7 +69,8 @@ while true; do if ((counter <= 0)); then current_file="$(cat "$ingest_dir/analyzing_now.txt")" if [[ "$current_file" == "$analyzing_now" ]]; then - log_yellow "$(date) WARNING: no change in analyzing_now for 10 iterations, restarting services" + log_yellow "$(date) WARNING: No change in analyzing_now for 10 iterations, restarting services" + apprisealert "No change in analyzing_now for 10 iterations" "$HOME/BirdNET-Pi/scripts/restart_services.sh" fi counter=10 @@ -79,28 +84,21 @@ while true; do log_green "$(date) INFO: $wav_count wav files waiting in $ingest_dir, $srv state is $service_state, $srv2 state is $analysis_state" - # Alert if no files in the folder for at least 30 seconds - if ((wav_count == 0)); then - ((no_files_counter++)) - if ((no_files_counter >= 1)); then - log_red "$(date) WARNING: No files in folder for at least 30 seconds" - if [[ -s "$HOME/BirdNET-Pi/apprise.txt" ]]; then - apprisealert "no_files" - fi - no_files_counter=0 - fi - else - no_files_counter=0 - fi - # Pause recorder if queue is too large if ((wav_count > 50)); then log_red "$(date) WARNING: Too many files in queue, pausing $srv and restarting $srv2" + apprisealert "Too many files in queue (>50)" sudo systemctl stop "$srv" sudo systemctl restart "$srv2" sleep 30 elif ((wav_count > 30)); then log_red "$(date) WARNING: Too many files in queue, restarting $srv2" + apprisealert "Queue growing large (>30)" + sudo systemctl restart "$srv2" + sleep 30 + elif ((wav_count == 0)); then + log_red "$(date) WARNING: No files in queue, restarting $srv2" + apprisealert "No files in queue" sudo systemctl restart "$srv2" sleep 30 fi @@ -110,14 +108,10 @@ while true; do state="$(systemctl is-active "$service")" if [[ "$state" != "active" ]]; then log_yellow "$(date) INFO: Restarting $service service" + apprisealert "$service is not active, restarting" sudo systemctl restart "$service" fi done - # Send alert if needed - if ((wav_count > 30)) && [[ -s "$HOME/BirdNET-Pi/apprise.txt" ]]; then - apprisealert - fi - ((counter--)) done