PLG: mqtt

Signed-off-by: jokob-sk <jokob.sk@gmail.com>
This commit is contained in:
jokob-sk
2025-12-09 08:40:45 +11:00
parent 23aa48eabf
commit ad2949f143
2 changed files with 85 additions and 1 deletions

View File

@@ -731,6 +731,34 @@
}
]
},
{
"function": "SEND_NOTIFICATIONS",
"type": {
"dataType": "boolean",
"elements": [
{
"elementType": "input",
"elementOptions": [{ "type": "checkbox" }],
"transformers": []
}
]
},
"default_value": true,
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Send notifications"
}
],
"description": [
{
"language_code": "en_us",
"string": "Check to send notifications to the broker with json containing events, new_devices, down_devices and more."
}
]
},
{
"function": "topic_root",
"type": {

View File

@@ -26,7 +26,8 @@ from logger import mylog, Logger # noqa: E402 [flake8 lint suppression]
from helper import get_setting_value, bytes_to_string, \
sanitize_string, normalize_string # noqa: E402 [flake8 lint suppression]
from database import DB, get_device_stats # noqa: E402 [flake8 lint suppression]
from utils.datetime_utils import timeNowDB # noqa: E402 [flake8 lint suppression]
from models.notification_instance import NotificationInstance # noqa: E402 [flake8 lint suppression]
# Make sure the TIMEZONE for logging is correct
conf.tz = timezone(get_setting_value('TIMEZONE'))
@@ -459,6 +460,10 @@ def mqtt_start(db):
}
)
# Notifications
if get_setting_value('MQTT_SEND_NOTIFICATIONS'):
publish_notifications(db, mqtt_client)
# Generate device-specific MQTT messages if enabled
if get_setting_value('MQTT_SEND_DEVICES'):
@@ -536,6 +541,57 @@ def mqtt_start(db):
publish_mqtt(mqtt_client, sensorConfig.json_attr_topic, devJson)
# ---------------------------------------------------------------------
# Publish webhook-style notifications via MQTT
# ---------------------------------------------------------------------
def publish_notifications(db, mqtt_client):
"""
Gather pending notifications and publish a single JSON payload via MQTT
that mirrors the webhook structure.
Only runs if MQTT_SEND_NOTIFICATIONS is enabled.
"""
# Ensure MQTT client is connected
if not mqtt_connected_to_broker:
mylog('minimal', [f"[{pluginName}] ⚠ ERROR: Not connected to broker, aborting notification publish."])
return False
notifications = NotificationInstance(db).getNew() or []
if not notifications:
mylog('debug', [f"[{pluginName}] No new notifications to publish via MQTT."])
return False
for notification in notifications:
# Use pre-built JSON payload if available
if notification.get("Payload"):
payload = notification["Payload"]
else:
# fallback generic payload (like webhook does)
payload = {
"username": "NetAlertX",
"text": "There are new notifications",
"attachments": [{
"title": "NetAlertX Notifications",
"title_link": get_setting_value('REPORT_DASHBOARD_URL'),
"text": notification.get("Text") or notification.get("HTML") or ""
}]
}
# Optional: attach meta info
payload["_meta"] = {
"published_at": timeNowDB(),
"source": "NetAlertX",
"notification_GUID": notification.get("GUID")
}
# Publish to a single MQTT topic
topic = f"{topic_root}/notifications/all"
mylog('debug', [f"[{pluginName}] Publishing notification GUID {notification.get('GUID')} to MQTT topic {topic}"])
publish_mqtt(mqtt_client, topic, payload)
return True
# =============================================================================
# Home Assistant UTILs
# =============================================================================