diff --git a/birdnet.conf-defaults b/birdnet.conf-defaults index 239d4d8..6eb87b6 100644 --- a/birdnet.conf-defaults +++ b/birdnet.conf-defaults @@ -63,6 +63,8 @@ APPRISE_NOTIFICATION_BODY="A \$sciname \$comname was just detected with a confid APPRISE_NOTIFY_EACH_DETECTION=0 APPRISE_NOTIFY_NEW_SPECIES=0 APPRISE_WEEKLY_REPORT=1 +APPRISE_NOTIFY_NEW_SPECIES_EACH_DAY=0 +APPRISE_MINIMUM_SECONDS_BETWEEN_NOTIFICATIONS_PER_SPECIES=0 #---------------------- Flickr Images API Configuration -----------------------# ## If FLICKR_API_KEY is set, the web interface will try and display bird images diff --git a/scripts/config.php b/scripts/config.php index d55c2d0..c581528 100644 --- a/scripts/config.php +++ b/scripts/config.php @@ -26,6 +26,7 @@ if(isset($_GET["latitude"])){ $apprise_input = $_GET['apprise_input']; $apprise_notification_title = $_GET['apprise_notification_title']; $apprise_notification_body = $_GET['apprise_notification_body']; + $minimum_time_limit = $_GET['minimum_time_limit']; $flickr_api_key = $_GET['flickr_api_key']; $flickr_filter_email = $_GET["flickr_filter_email"]; $language = $_GET["language"]; @@ -110,6 +111,7 @@ if(isset($_GET["latitude"])){ $contents = preg_replace("/FLICKR_API_KEY=.*/", "FLICKR_API_KEY=$flickr_api_key", $contents); $contents = preg_replace("/DATABASE_LANG=.*/", "DATABASE_LANG=$language", $contents); $contents = preg_replace("/FLICKR_FILTER_EMAIL=.*/", "FLICKR_FILTER_EMAIL=$flickr_filter_email", $contents); + $contents = preg_replace("/APPRISE_MINIMUM_SECONDS_BETWEEN_NOTIFICATIONS_PER_SPECIES=.*/", "APPRISE_MINIMUM_SECONDS_BETWEEN_NOTIFICATIONS_PER_SPECIES=$minimum_time_limit", $contents); $contents2 = file_get_contents("./scripts/thisrun.txt"); $contents2 = preg_replace("/LATITUDE=.*/", "LATITUDE=$latitude", $contents2); @@ -124,6 +126,7 @@ if(isset($_GET["latitude"])){ $contents2 = preg_replace("/FLICKR_API_KEY=.*/", "FLICKR_API_KEY=$flickr_api_key", $contents2); $contents2 = preg_replace("/DATABASE_LANG=.*/", "DATABASE_LANG=$language", $contents2); $contents2 = preg_replace("/FLICKR_FILTER_EMAIL=.*/", "FLICKR_FILTER_EMAIL=$flickr_filter_email", $contents2); + $contents2 = preg_replace("/APPRISE_MINIMUM_SECONDS_BETWEEN_NOTIFICATIONS_PER_SPECIES=.*/", "APPRISE_MINIMUM_SECONDS_BETWEEN_NOTIFICATIONS_PER_SPECIES=$minimum_time_limit", $contents2); $fh = fopen("/etc/birdnet/birdnet.conf", "w"); @@ -353,7 +356,13 @@ https://discordapp.com/api/webhooks/{WebhookID}/{WebhookToken} >
> -

+
+ +
+ +
+ +

diff --git a/scripts/install_config.sh b/scripts/install_config.sh index db980d7..a7f7991 100755 --- a/scripts/install_config.sh +++ b/scripts/install_config.sh @@ -76,6 +76,8 @@ APPRISE_NOTIFICATION_BODY="A \$sciname \$comname was just detected with a confid APPRISE_NOTIFY_EACH_DETECTION=0 APPRISE_NOTIFY_NEW_SPECIES=0 APPRISE_WEEKLY_REPORT=1 +APPRISE_NOTIFY_NEW_SPECIES_EACH_DAY=0 +APPRISE_MINIMUM_SECONDS_BETWEEN_NOTIFICATIONS_PER_SPECIES=0 #---------------------- Flickr Images API Configuration -----------------------# ## If FLICKR_API_KEY is set, the web interface will try and display bird images diff --git a/scripts/update_birdnet_snippets.sh b/scripts/update_birdnet_snippets.sh index a2c8cea..c5e6ee8 100755 --- a/scripts/update_birdnet_snippets.sh +++ b/scripts/update_birdnet_snippets.sh @@ -47,6 +47,9 @@ fi if ! grep APPRISE_NOTIFY_NEW_SPECIES_EACH_DAY /etc/birdnet/birdnet.conf &>/dev/null;then sudo -u$USER echo "APPRISE_NOTIFY_NEW_SPECIES_EACH_DAY=0 " >> /etc/birdnet/birdnet.conf fi +if ! grep APPRISE_MINIMUM_SECONDS_BETWEEN_NOTIFICATIONS_PER_SPECIES /etc/birdnet/birdnet.conf &>/dev/null;then + sudo -u$USER echo "APPRISE_MINIMUM_SECONDS_BETWEEN_NOTIFICATIONS_PER_SPECIES=0 " >> /etc/birdnet/birdnet.conf +fi # If the config does not contain the DATABASE_LANG setting, we'll want to add it. # Defaults to not-selected, which config.php will know to render as a language option. diff --git a/scripts/utils/notifications.py b/scripts/utils/notifications.py index 8106140..1374964 100644 --- a/scripts/utils/notifications.py +++ b/scripts/utils/notifications.py @@ -4,11 +4,15 @@ import socket import sqlite3 from datetime import datetime import requests +import time as timeim userDir = os.path.expanduser('~') APPRISE_CONFIG = userDir + '/BirdNET-Pi/apprise.txt' DB_PATH = userDir + '/BirdNET-Pi/scripts/birds.db' +flickr_images = {} +species_last_notified = {} + def notify(body, title, attached=""): apobj = apprise.Apprise() @@ -37,6 +41,12 @@ def sendAppriseNotifications(species, confidence, path, date, time, week, latitu body = settings_dict.get('APPRISE_NOTIFICATION_BODY') sciName, comName = species.split("_") + APPRISE_MINIMUM_SECONDS_BETWEEN_NOTIFICATIONS_PER_SPECIES = settings_dict.get('APPRISE_MINIMUM_SECONDS_BETWEEN_NOTIFICATIONS_PER_SPECIES') + if APPRISE_MINIMUM_SECONDS_BETWEEN_NOTIFICATIONS_PER_SPECIES != "0": + if species_last_notified.get(comName) is not None: + if int(timeim.time()) - species_last_notified[comName] < int(APPRISE_MINIMUM_SECONDS_BETWEEN_NOTIFICATIONS_PER_SPECIES): + return + try: websiteurl = settings_dict.get('BIRDNETPI_URL') if len(websiteurl) == 0: @@ -46,7 +56,6 @@ def sendAppriseNotifications(species, confidence, path, date, time, week, latitu listenurl = websiteurl+"?filename="+path image_url = "" - flickr_images = {} if len(settings_dict.get('FLICKR_API_KEY')) > 0 and "$flickrimage" in body: if not comName in flickr_images: @@ -93,6 +102,7 @@ def sendAppriseNotifications(species, confidence, path, date, time, week, latitu .replace("$flickrimage", image_url if "{" in body else "")\ .replace("$overlap", overlap) notify(notify_body, notify_title, image_url) + species_last_notified[comName] = int(timeim.time()) APPRISE_NOTIFICATION_NEW_SPECIES_DAILY_COUNT_LIMIT = 1 # Notifies the first N per day. if settings_dict.get('APPRISE_NOTIFY_NEW_SPECIES_EACH_DAY') == "1": @@ -137,6 +147,7 @@ def sendAppriseNotifications(species, confidence, path, date, time, week, latitu .replace("$overlap", overlap)\ + " (first time today)" notify(notify_body, notify_title, image_url) + species_last_notified[comName] = int(timeim.time()) con.close() except sqlite3.Error as e: print(e) @@ -184,6 +195,7 @@ def sendAppriseNotifications(species, confidence, path, date, time, week, latitu .replace("$overlap", overlap)\ + " (only seen " + str(int(numberDetections)) + " times in last 7d)" notify(notify_body, notify_title, image_url) + species_last_notified[comName] = int(timeim.time()) con.close() except sqlite3.Error: print("Database busy")