From d94297e0932c4bb2bfff737c77832a8640293249 Mon Sep 17 00:00:00 2001 From: jokob-sk Date: Wed, 12 Jun 2024 18:35:14 +1000 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8Nicer=20logo,=20=F0=9F=93=9ANotific?= =?UTF-8?q?ation=20&=20debug=20docs,=20=F0=9F=93=A6MQTT=20device=5Ftracker?= =?UTF-8?q?=20feature=20request=20#702?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/WEB_UI_PORT_DEBUG.md | 4 +- front/img/NetAlertX_logo.png | Bin 5725 -> 8261 bytes front/img/NetAlertX_logo_notification.png | Bin 6098 -> 9438 bytes front/img/NetAlertX_logo_notification_old.png | Bin 0 -> 6098 bytes front/img/NetAlertX_logo_old.png | Bin 0 -> 5725 bytes front/img/svg/netalertx_red_1_backup.svg | 365 ++++++++++++++++++ front/php/templates/language/de_de.json | 0 front/php/templates/language/it_it.json | 0 front/php/templates/language/ru_ru.json | 0 front/plugins/_publisher_mqtt/config.json | 20 - front/plugins/_publisher_mqtt/mqtt.py | 183 ++++++--- .../plugins/notification_processing/README.md | 13 +- server/helper.py | 2 +- server/networkscan.py | 1 + 14 files changed, 505 insertions(+), 83 deletions(-) create mode 100755 front/img/NetAlertX_logo_notification_old.png create mode 100755 front/img/NetAlertX_logo_old.png create mode 100755 front/img/svg/netalertx_red_1_backup.svg mode change 100644 => 100755 front/php/templates/language/de_de.json mode change 100644 => 100755 front/php/templates/language/it_it.json mode change 100644 => 100755 front/php/templates/language/ru_ru.json diff --git a/docs/WEB_UI_PORT_DEBUG.md b/docs/WEB_UI_PORT_DEBUG.md index bb93c508..342c03fd 100755 --- a/docs/WEB_UI_PORT_DEBUG.md +++ b/docs/WEB_UI_PORT_DEBUG.md @@ -1,12 +1,14 @@ # Debugging inaccessible UI -When opening an issue please : +When opening an issue please: 1. Include a screenshot of what you see when accessing `HTTP:///20211` (or your custom port) 1. [Follow steps 1, 2, 3, 4 on this page](https://github.com/jokob-sk/NetAlertX/blob/main/docs/DEBUG_TIPS.md) 1. Execute the following in the container to see the processes and their ports and submit a screenshot of the result: 1. `sudo apt-get install lsof` 1. `sudo lsof -i` +1. Try running the `nginx` command in the container + 1. if you get `nginx: [emerg] bind() to 0.0.0.0:20211 failed (98: Address in use)` try using a different port number ![lsof ports](/docs/img/WEB_UI_PORT_DEBUG/container_port.png) \ No newline at end of file diff --git a/front/img/NetAlertX_logo.png b/front/img/NetAlertX_logo.png index a3bfaec79d3731e14ebdee2f0e8e914c3c645fe6..0ccc86fb94b1a20e06b5ae412cd2bdfd3812f4a2 100755 GIT binary patch literal 8261 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 literal 5725 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 iCd;M`HaYl;5~u!cUG)V$GtAmOnlK literal 6098 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 P00000NkvXXu0mjf + + + + + + + + + + + + + + A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/front/php/templates/language/de_de.json b/front/php/templates/language/de_de.json old mode 100644 new mode 100755 diff --git a/front/php/templates/language/it_it.json b/front/php/templates/language/it_it.json old mode 100644 new mode 100755 diff --git a/front/php/templates/language/ru_ru.json b/front/php/templates/language/ru_ru.json old mode 100644 new mode 100755 diff --git a/front/plugins/_publisher_mqtt/config.json b/front/plugins/_publisher_mqtt/config.json index 64cbb1df..3fe65744 100755 --- a/front/plugins/_publisher_mqtt/config.json +++ b/front/plugins/_publisher_mqtt/config.json @@ -587,26 +587,6 @@ } ] }, - { - "function": "PRESENCE_SENSOR_TYPE", - "events": [], - "type": "text.select", - "default_value": "binary_sensor", - "options": ["binary_sensor", "device_tracker"], - "localized": ["name", "description"], - "name": [ - { - "language_code": "en_us", - "string": "Presence Sensor Type" - } - ], - "description": [ - { - "language_code": "en_us", - "string": "The type of the sensor that should be generated for the is_present sensor. Inserted into the homeassistant/{MQTT_PRESENCE_SENSOR_TYPE}/mac_44_ef_44_ef_44_ef/is_present/ topic. See the Plugin readme for details." - } - ] - }, { "function": "QOS", "type": "integer.select", diff --git a/front/plugins/_publisher_mqtt/mqtt.py b/front/plugins/_publisher_mqtt/mqtt.py index 3d42041a..19710373 100755 --- a/front/plugins/_publisher_mqtt/mqtt.py +++ b/front/plugins/_publisher_mqtt/mqtt.py @@ -79,6 +79,7 @@ def check_config(): #------------------------------------------------------------------------------- +# Sensor configs are tracking which sensors in NetAlertX exist and if a config has changed class sensor_config: def __init__(self, deviceId, deviceName, sensorType, sensorName, icon, mac): self.deviceId = deviceId @@ -189,45 +190,91 @@ def create_sensor(mqtt_client, deviceId, deviceName, sensorType, sensorName, ico global mqtt_sensors - new_sensor_config = sensor_config(deviceId, deviceName, sensorType, sensorName, icon, mac) - - # save if new - if new_sensor_config.isNew: - mylog('verbose', [f"[{pluginName}] Publishing sensor number {len(mqtt_sensors)}"]) - publish_sensor(mqtt_client, new_sensor_config) + # check previous configs + sensorConfig = sensor_config(deviceId, deviceName, sensorType, sensorName, icon, mac) + + mylog('verbose', [f"[{pluginName}] Publishing sensor number {len(mqtt_sensors)}"]) + + state_topic = '' + topic = '' + + # binary sensor only sensor + if sensorConfig.sensorType == 'binary_sensor' or sensorConfig.sensorType == 'sensor': + + topic = f'homeassistant/{sensorConfig.sensorType}/{sensorConfig.deviceId}/{sensorConfig.sensorName}/config' + state_topic = f'system-sensors/{sensorConfig.sensorType}/{sensorConfig.deviceId}/state' + + + message = { + "name" : sensorConfig.sensorName, + "state_topic" : state_topic, + "value_template" : "{{value_json."+sensorConfig.sensorName+"}}", + "unique_id" : sensorConfig.deviceId+'_sensor_'+sensorConfig.sensorName, + "device": + { + "identifiers" : [sensorConfig.deviceId+"_sensor"], + "manufacturer" : "NetAlertX", + "name" : sensorConfig.deviceName + }, + "icon": f'mdi:{sensorConfig.icon}' + } + + + + elif sensorConfig.sensorType == 'device_tracker': + + + topic = f'homeassistant/device_tracker/{sensorConfig.deviceId}/config' + state_topic = f'system-sensors/device_tracker/{sensorConfig.deviceId}/state' + unique_id = f'{sensorConfig.deviceId}_{sensorConfig.sensorType}_{sensorConfig.sensorName}' + + message = { + "state_topic": state_topic, + "name": sensorConfig.sensorName, + "payload_home": "home", + "payload_not_home": "away", + "unique_id" : unique_id, + "icon": f'mdi:{sensorConfig.icon}', + "device": + { + "identifiers" : [sensorConfig.deviceId+"_sensor", unique_id], + "manufacturer" : "NetAlertX", + "name" : sensorConfig.deviceName + }, + } + + + + # mosquitto_pub -h 127.0.0.1 -t homeassistant/device_tracker/a4567d663eaf/config -m '{"state_topic": "a4567d663eaf/state", "name": "My Tracker", "payload_home": "home", "payload_not_home": "not_home"}' + # mosquitto_pub -h 127.0.0.1 -t homeassistant/device_tracker/a4567d663eaf/config -m '{"json_attributes_topic": "a4567d663eaf/attributes", "name": "My Tracker"}' + # mosquitto_pub -h 127.0.0.1 -t a4567d663eaf/state -m 'home' -#------------------------------------------------------------------------------- -def publish_sensor(mqtt_client, sensorConfig): - global mqtt_sensors + # # create device tracker attributes + # publish_mqtt(mqtt_client, f'homeassistant/device_tracker/a4567d663eaf/config', + # { + # "json_attributes_topic": f"{deviceId}/attributes", + # "name": deviceNameDisplay + # } + # ) - icon = "mdi:" + sensorConfig.icon - - message = { - "name" : sensorConfig.sensorName, - "state_topic" : "system-sensors/"+sensorConfig.sensorType+'/'+sensorConfig.deviceId+"/state", - "value_template" : "{{value_json."+sensorConfig.sensorName+"}}", - "unique_id" : sensorConfig.deviceId+'_sensor_'+sensorConfig.sensorName, - "device": - { - "identifiers" : [sensorConfig.deviceId+"_sensor"], - "manufacturer" : "NetAlertX", - "name" : sensorConfig.deviceName - }, - "icon": icon - } - - topic='homeassistant/'+sensorConfig.sensorType+'/'+sensorConfig.deviceId+'/'+sensorConfig.sensorName+'/config' + # send if new TODO uncomment + # if sensorConfig.isNew: # add the sensor to the global list to keep track of succesfully added sensors if publish_mqtt(mqtt_client, topic, message): - # hack - delay adding to the queue in case the process is + # hack - delay adding to the queue in case the process is time.sleep(get_setting_value('MQTT_DELAY_SEC')) # restarted and previous publish processes aborted - # (it takes ~2s to update a sensor config on the broker) - mqtt_sensors.append(sensorConfig) + # (it takes ~2s to update a sensor config on the broker) + mqtt_sensors.append(sensorConfig) + + return state_topic + + + #------------------------------------------------------------------------------- def mqtt_create_client(): @@ -279,8 +326,7 @@ def mqtt_start(db): deviceName = get_setting_value('MQTT_DEVICE_NAME') - deviceId = get_setting_value('MQTT_DEVICE_ID') - presenceSenType = get_setting_value('MQTT_PRESENCE_SENSOR_TYPE') + deviceId = get_setting_value('MQTT_DEVICE_ID') # General stats @@ -316,40 +362,57 @@ def mqtt_start(db): mylog('verbose', [f"[{pluginName}] Estimated delay: ", (sec_delay), 's ', '(', round(sec_delay/60,1) , 'min)' ]) - # debug_index = 0 + debug_index = 0 for device in devices: - - # Create devices in Home Assistant - send config messages - deviceId = 'mac_' + device["dev_MAC"].replace(" ", "").replace(":", "_").lower() - deviceNameDisplay = re.sub('[^a-zA-Z0-9-_\s]', '', device["dev_Name"]) - create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'last_ip', 'ip-network', device["dev_MAC"]) - create_sensor(mqtt_client, deviceId, deviceNameDisplay, presenceSenType, 'is_present', 'wifi', device["dev_MAC"]) - create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'mac_address', 'folder-key-network', device["dev_MAC"]) - create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'is_new', 'bell-alert-outline', device["dev_MAC"]) - create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'vendor', 'cog', device["dev_MAC"]) - create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'first_connection', 'calendar-start', device["dev_MAC"]) - create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'last_connection', 'calendar-end', device["dev_MAC"]) - - # update device sensors in home assistant + # TODO remove + if 'Moto' in device["dev_Name"]: + + + # Create devices in Home Assistant - send config messages + deviceId = 'mac_' + device["dev_MAC"].replace(" ", "").replace(":", "_").lower() + deviceNameDisplay = re.sub('[^a-zA-Z0-9-_\s]', '', device["dev_Name"]) - publish_mqtt(mqtt_client, 'system-sensors/sensor/'+deviceId+'/state', - { - "last_ip": device["dev_LastIP"], - "is_new": str(device["dev_NewDevice"]), - "vendor": sanitize_string(device["dev_Vendor"]), - "mac_address": str(device["dev_MAC"]), - "last_connection": str(device["dev_LastConnection"]), - "first_connection": str(device["dev_FirstConnection"]) - } - ) + state_topic = create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'last_ip', 'ip-network', device["dev_MAC"]) + state_topic = create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'mac_address', 'folder-key-network', device["dev_MAC"]) + state_topic = create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'is_new', 'bell-alert-outline', device["dev_MAC"]) + state_topic = create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'vendor', 'cog', device["dev_MAC"]) + state_topic = create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'first_connection', 'calendar-start', device["dev_MAC"]) + state_topic = create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'last_connection', 'calendar-end', device["dev_MAC"]) + + # bulk update device sensors in home assistant + + publish_mqtt(mqtt_client, state_topic, + { + "last_ip": device["dev_LastIP"], + "is_new": str(device["dev_NewDevice"]), + "vendor": sanitize_string(device["dev_Vendor"]), + "mac_address": str(device["dev_MAC"]), + "last_connection": str(device["dev_LastConnection"]), + "first_connection": str(device["dev_FirstConnection"]) + } + ) + + # create and update is_present sensor + state_topic = create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'binary_sensor', 'is_present', 'wifi', device["dev_MAC"]) + publish_mqtt(mqtt_client, state_topic, + { + "is_present": to_binary_sensor(str(device["dev_PresentLastScan"])) + } + ) + + # handle device_tracker + state_topic = create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'device_tracker', 'is_home', 'home', device["dev_MAC"]) + + # are only valid states + state = 'away' + if to_binary_sensor(str(device["dev_PresentLastScan"])) == "ON": + state = 'home' + + publish_mqtt(mqtt_client, state_topic, state) + - publish_mqtt(mqtt_client, f'system-sensors/{presenceSenType}/{deviceId}/state', - { - "is_present": to_binary_sensor(str(device["dev_PresentLastScan"])) - } - ) # delete device / topic # homeassistant/sensor/mac_44_ef_bf_c4_b1_af/is_present/config diff --git a/front/plugins/notification_processing/README.md b/front/plugins/notification_processing/README.md index 1dbdc6d1..44f40398 100755 --- a/front/plugins/notification_processing/README.md +++ b/front/plugins/notification_processing/README.md @@ -1,6 +1,17 @@ ## Overview -Plugin supplying settings for Notification Processing. +Plugin supplying settings for Notification Processing. + +### Notify on: `NTFPRCS_INCLUDED_SECTIONS`: + +- `new_devices` - if a new device is detected +- `down_devices` - if a device with **Alert down** enabled (on a specific Device) disconnects +- `down_reconnected` - if a device, previously marked down and notified on, reconnects +- `events` - if an event for a device that has **Alert All Events** enabled, is triggered +- `plugins` - if an event for a plugin, is triggered + + +Check the [Notifications guide](/docs/NOTIFICATIONS.md) for more details. ### Usage diff --git a/server/helper.py b/server/helper.py index bf1960b7..06efa775 100755 --- a/server/helper.py +++ b/server/helper.py @@ -700,7 +700,7 @@ def sanitize_string(input): if isinstance(input, bytes): input = input.decode('utf-8') input = bytes_to_string(re.sub(r'[^a-zA-Z0-9-_\s]', '', str(input))) - return value + return input #------------------------------------------------------------------------------- diff --git a/server/networkscan.py b/server/networkscan.py index 9a746871..69e9ecbb 100755 --- a/server/networkscan.py +++ b/server/networkscan.py @@ -61,6 +61,7 @@ def process_scan (db): skip_repeated_notifications (db) # Clear current scan as processed + # TODO comment below for CurrentScan debugging db.sql.execute ("DELETE FROM CurrentScan") # Commit changes