This commit is contained in:
alexbelgium
2025-05-28 09:21:12 +02:00
parent a2fa814087
commit 7d2fe5d113

View File

@@ -11,7 +11,7 @@ import logging
import paho.mqtt.client as mqtt import paho.mqtt.client as mqtt
import requests import requests
sys.path.append('/home/pi/BirdNET-Pi/scripts/utils') sys.path.append("/home/pi/BirdNET-Pi/scripts/utils")
from helpers import get_settings from helpers import get_settings
# Setup basic configuration for logging # Setup basic configuration for logging
@@ -28,68 +28,90 @@ mqtt_server = "%%mqtt_server%%"
mqtt_user = "%%mqtt_user%%" mqtt_user = "%%mqtt_user%%"
mqtt_pass = "%%mqtt_pass%%" mqtt_pass = "%%mqtt_pass%%"
mqtt_port = "%%mqtt_port%%" mqtt_port = "%%mqtt_port%%"
mqtt_topic = 'birdnet' mqtt_topic = "birdnet"
bird_lookup_url_base = 'http://en.wikipedia.org/wiki/' bird_lookup_url_base = "http://en.wikipedia.org/wiki/"
def on_connect(client, userdata, flags, rc ): #, properties=None):
""" Callback for when the client receives a CONNACK response from the server. """ def on_connect(client, userdata, flags, rc): # , properties=None):
"""Callback for when the client receives a CONNACK response from the server."""
if rc == 0: if rc == 0:
log.info("Connected to MQTT Broker!") log.info("Connected to MQTT Broker!")
else: else:
log.error(f"Failed to connect, return code {rc}\n") log.error(f"Failed to connect, return code {rc}\n")
def get_bird_code(scientific_name): def get_bird_code(scientific_name):
with open('/home/pi/BirdNET-Pi/scripts/ebird.php', 'r') as file: with open("/home/pi/BirdNET-Pi/scripts/ebird.php", "r") as file:
data = file.read() data = file.read()
array_str = re.search(r'\$ebirds = \[(.*?)\];', data, re.DOTALL).group(1) array_str = re.search(r"\$ebirds = \[(.*?)\];", data, re.DOTALL).group(1)
bird_dict = {re.search(r'"(.*?)"', line).group(1): re.search(r'=> "(.*?)"', line).group(1) bird_dict = {
for line in array_str.split('\n') if '=>' in line} re.search(r'"(.*?)"', line).group(1): re.search(r'=> "(.*?)"', line).group(1)
for line in array_str.split("\n")
if "=>" in line
}
return bird_dict.get(scientific_name) return bird_dict.get(scientific_name)
def automatic_mqtt_publish(file, detection, path): def automatic_mqtt_publish(file, detection, path):
bird = {} bird = {}
bird['Date'] = detection.date bird["Date"] = detection.date
bird['Time'] = detection.time bird["Time"] = detection.time
bird['ScientificName'] = detection.scientific_name.replace('_', ' ') bird["ScientificName"] = detection.scientific_name.replace("_", " ")
bird['CommonName'] = detection.common_name bird["CommonName"] = detection.common_name
bird['Confidence'] = detection.confidence bird["Confidence"] = detection.confidence
bird['SpeciesCode'] = get_bird_code(detection.scientific_name) bird["SpeciesCode"] = get_bird_code(detection.scientific_name)
bird['ClipName'] = path bird["ClipName"] = path
bird['url'] = bird_lookup_url_base + detection.scientific_name.replace(' ', '_') bird["url"] = bird_lookup_url_base + detection.scientific_name.replace(" ", "_")
# Flickimage # Flickimage
image_url = "" image_url = ""
common_name = detection.common_name common_name = detection.common_name
if len(settings_dict.get('FLICKR_API_KEY')) > 0: if len(settings_dict.get("FLICKR_API_KEY")) > 0:
if common_name not in flickr_images: if common_name not in flickr_images:
try: try:
headers = {'User-Agent': 'Python_Flickr/1.0'} headers = {"User-Agent": "Python_Flickr/1.0"}
url = ('https://www.flickr.com/services/rest/?method=flickr.photos.search&api_key=' + str(settings_dict.get('FLICKR_API_KEY')) + url = (
'&text=' + str(common_name) + ' bird&sort=relevance&per_page=5&media=photos&format=json&license=2%2C3%2C4%2C5%2C6%2C9&nojsoncallback=1') "https://www.flickr.com/services/rest/?method=flickr.photos.search&api_key="
+ str(settings_dict.get("FLICKR_API_KEY"))
+ "&text="
+ str(common_name)
+ " bird&sort=relevance&per_page=5&media=photos&format=json&license=2%2C3%2C4%2C5%2C6%2C9&nojsoncallback=1"
)
resp = requests.get(url=url, headers=headers, timeout=10) resp = requests.get(url=url, headers=headers, timeout=10)
resp.encoding = "utf-8" resp.encoding = "utf-8"
data = resp.json()["photos"]["photo"][0] data = resp.json()["photos"]["photo"][0]
image_url = 'https://farm'+str(data["farm"])+'.static.flickr.com/'+str(data["server"])+'/'+str(data["id"])+'_'+str(data["secret"])+'_n.jpg' image_url = (
"https://farm"
+ str(data["farm"])
+ ".static.flickr.com/"
+ str(data["server"])
+ "/"
+ str(data["id"])
+ "_"
+ str(data["secret"])
+ "_n.jpg"
)
flickr_images[common_name] = image_url flickr_images[common_name] = image_url
except Exception as e: except Exception as e:
print("FLICKR API ERROR: "+str(e)) print("FLICKR API ERROR: " + str(e))
image_url = "" image_url = ""
else: else:
image_url = flickr_images[common_name] image_url = flickr_images[common_name]
bird['FlickrImage'] = image_url bird["FlickrImage"] = image_url
json_bird = json.dumps(bird) json_bird = json.dumps(bird)
mqttc.reconnect() mqttc.reconnect()
mqttc.publish(mqtt_topic, json_bird, 1) mqttc.publish(mqtt_topic, json_bird, 1)
log.info("Posted to MQTT: ok") log.info("Posted to MQTT: ok")
mqttc = mqtt.Client('birdnet_mqtt')
mqttc = mqtt.Client("birdnet_mqtt")
mqttc.username_pw_set(mqtt_user, mqtt_pass) mqttc.username_pw_set(mqtt_user, mqtt_pass)
mqttc.on_connect = on_connect mqttc.on_connect = on_connect