diff --git a/README.md b/README.md
old mode 100644
new mode 100755
index 7bb7fd7b..3c47cc7f
--- a/README.md
+++ b/README.md
@@ -7,8 +7,7 @@ Scan the devices connected to your WIFI / LAN and alert you the connection of
unknown devices. It also warns if a "always connected" devices disconnects.
![Main screen][main]
-*(Apologies for my English and my limited knowledge of Python, php and
-JavaScript)*
+
# Docker image ๐ณ
[](https://github.com/jokob-sk/Pi.Alert/actions/workflows/docker.yml)
@@ -17,7 +16,6 @@ JavaScript)*
[](https://hub.docker.com/r/jokobsk/pi.alert)
[](https://hub.docker.com/r/jokobsk/pi.alert)
-๐ฅ Pi.Alert credit goes to [pucherot/Pi.Alert](https://github.com/pucherot/Pi.Alert)
๐ณ Docker Image: [jokobsk/Pi.Alert](https://registry.hub.docker.com/r/jokobsk/pi.alert)
๐ [Dockerfile](https://github.com/jokob-sk/Pi.Alert/blob/main/Dockerfile)
๐ [Dockerfile instructions](https://github.com/jokob-sk/Pi.Alert/blob/main//dockerfiles/README.md)
@@ -47,41 +45,30 @@ Up to three scanning methods are used:
examines the DHCP leases (addresses assigned) to find active devices
that were not discovered by the other methods.
-## Components
-The system consists of two parts:
-### Back
-In charge of:
- - Scan the network searching connected devices using the scanning methods
- described
- - Store the information in the DB
- - Report the changes detected by e-mail and/or other services ([Apprise](https://hub.docker.com/r/caronc/apprise), [Pushsafer](https://www.pushsafer.com/), [NTFY](https://ntfy.sh/), Webhooks ([sample JSON](docs/webhook_json_sample.json)))
- - Optional speedtest for Device "Internet"
- - DB cleanup tasks via cron
- - a pialert-cli that helps to configure login and password
+### Notification Service Support
+ - [Apprise](https://hub.docker.com/r/caronc/apprise)
+ - [Pushsafer](https://www.pushsafer.com/)
+ - [NTFY](https://ntfy.sh/)
+ - Webhooks ([sample JSON](docs/webhook_json_sample.json))
+ - (โExperimental) Home Assistant (via [MQTT](https://www.home-assistant.io/integrations/mqtt/) (processing ~5s per device, deleting not supported, use [MQTT Explorer](https://mqtt-explorer.com/) for now))
| ![Report 1][report1] | ![Report 2][report2] |
| -------------------- | -------------------- |
-### Front
+### Security
There is a configurable login to prevent unauthorized use.
> * Set `PIALERT_WEB_PROTECTION = True` in `pialert.conf` to enable. The default password is `123456`.
> To change password run `/home/pi/pialert/back/pialert-cli`
-A web frontend that allows:
- - Manage the devices inventory and the characteristics
+## Features
- Display in a visual way all the information collected by the back
- - Sessions
- - Connected devices
- - Favorites
- - Events
- - Presence
- - Concurrent devices
+ - Sessions, Connected devices, Favorites
+ - Events, Presence, Concurrent devices
- Down alerts
- IP's
- - Manual Nmap scans
- - Optional speedtest for Device "Internet"
+ - Manual Nmap scans, Optional speedtest for Device "Internet"
- Simple Network relationship display
- Maintenance tasks and Settings like:
- Status Infos (active scans, database size, backup counter)
@@ -89,9 +76,8 @@ A web frontend that allows:
- Language Selection (english, german, spanish)
- Light/Dark-Mode Switch
- Pause arp-scan
- - DB maintenance tools
- - DB Backup and Restore
- - CSV Export / Import (Experimental)
+ - DB maintenance, Backup, Restore tools
+ - CSV Export / Import
- Help/FAQ Section
| ![Screen 1][screen1] | ![Screen 2][screen2] |
@@ -118,24 +104,6 @@ Instructions for [pucherot's original code can be found here](https://github.com
### [Versions History](docs/VERSIONS_HISTORY.md)
-### Powered by:
- | Product | Objetive |
- | ------------- | ------------------------------------------------------- |
- | Python | Programming language for the Back |
- | PHP | Programming language for the Front-end |
- | JavaScript | Programming language for the Front-end |
- | Bootstrap | Front-end framework |
- | Admin.LTE | Bootstrap template |
- | FullCalendar | Calendar component |
- | Sqlite | DB engine |
- | Lighttpd | Webserver |
- | arp-scan | Scan network using arp commands |
- | Pi.hole | DNS Server with Ad-block |
- | dnsmasq | DHCP Server |
- | nmap | Network Scanner |
- | zip | Filecompression Tool |
- | speedtest-cli | Python SpeedTest https://github.com/sivel/speedtest-cli |
-
### License
GPL 3.0
[Read more here](LICENSE.txt)
@@ -146,15 +114,12 @@ Instructions for [pucherot's original code can be found here](https://github.com
Source of the selfhosted Fonts
https://github.com/adobe-fonts/source-sans
-### Contact
- pi.alert.application@gmail.com
-
- ***Suggestions and comments are welcome***
### Special thanks ๐ฅ
This code is a collaborative body of work, with special thanks to:
+ - ๐ [pucherot/Pi.Alert](https://github.com/pucherot/Pi.Alert) is the original creator od PiAlert
- [leiweibau](https://github.com/leiweibau/Pi.Alert): Things
- [Macleykun](https://github.com/Macleykun): Help with Dockerfile clean-up
- [Final-Hawk](https://github.com/Final-Hawk): Help with NTFY, styling and other fixes
diff --git a/back/pialert.py b/back/pialert.py
index 581880e6..273fed04 100755
--- a/back/pialert.py
+++ b/back/pialert.py
@@ -141,6 +141,12 @@ try:
except NameError:
mqttPassword = ''
+try:
+ mqttQoS = MQTT_QOS
+except NameError:
+ mqttQoS = 0
+
+
#===============================================================================
# MAIN
@@ -441,8 +447,7 @@ def update_devices_MAC_vendors (pArg = ''):
update_output = subprocess.check_output (update_args)
except subprocess.CalledProcessError as e:
# An error occured, handle it
- print(e.output)
- update_output = ""
+ print(e.output)
# DEBUG
# update_args = ['./vendors_db_update.sh']
@@ -562,7 +567,7 @@ def scan_network ():
# Load current scan data
print ('\nProcessing scan results...')
print_log ('Save scanned devices')
- save_scanned_devices (arpscan_devices)
+ save_scanned_devices (arpscan_devices, cycle_interval)
# Print stats
print_log ('Print Stats')
@@ -752,7 +757,8 @@ def read_DHCP_leases ():
# print (sql.rowcount)
#-------------------------------------------------------------------------------
-def save_scanned_devices (p_arpscan_devices):
+def save_scanned_devices (p_arpscan_devices, p_cycle_interval):
+ cycle = 1 # always 1, only one cycle supported
# Delete previous scan data
sql.execute ("DELETE FROM CurrentScan WHERE cur_ScanCycle = ?",
(cycle,))
@@ -773,7 +779,7 @@ def save_scanned_devices (p_arpscan_devices):
WHERE cur_MAC = PH_MAC
AND cur_ScanCycle = ? )""",
(cycle,
- (int(startTime.strftime('%s')) - 60 * cycle),
+ (int(startTime.strftime('%s')) - 60 * p_cycle_interval),
cycle) )
# Check Internet connectivity
@@ -1843,6 +1849,7 @@ def send_apprise (html):
#-------------------------------------------------------------------------------
mqtt_connected_to_broker = 0
+mqtt_sensors = []
def publish_mqtt(client, topic, message):
status = 1
@@ -1850,7 +1857,7 @@ def publish_mqtt(client, topic, message):
result = client.publish(
topic=topic,
payload=message,
- qos=1,
+ qos=mqttQoS,
retain=True,
)
@@ -1862,17 +1869,38 @@ def publish_mqtt(client, topic, message):
return True
#-------------------------------------------------------------------------------
-def create_generic_device(client):
+def create_generic_device(client):
deviceName = 'PiAlert'
- deviceId = 'pialert'
-
- device_sensor(client, deviceId, deviceName, 'sensor', 'online', 'wifi-check')
- device_sensor(client, deviceId, deviceName, 'sensor', 'down', 'wifi-cancel')
+ deviceId = 'pialert'
+
+ device_sensor(client, deviceId, deviceName, 'sensor', 'online', 'wifi-check')
+ device_sensor(client, deviceId, deviceName, 'sensor', 'down', 'wifi-cancel')
device_sensor(client, deviceId, deviceName, 'sensor', 'all', 'wifi')
device_sensor(client, deviceId, deviceName, 'sensor', 'archived', 'wifi-lock')
device_sensor(client, deviceId, deviceName, 'sensor', 'new', 'wifi-plus')
- device_sensor(client, deviceId, deviceName, 'sensor', 'unknown', 'wifi-alert')
+ device_sensor(client, deviceId, deviceName, 'sensor', 'unknown', 'wifi-alert')
+
+
+# #-------------------------------------------------------------------------------
+# def create_sensor(client, deviceId, deviceName, sensorType, sensorName, icon):
+# global mqtt_sensors
+
+# new_sensor_config = sensor_config(deviceId, deviceName, sensorType, sensorName, icon)
+
+# if new_sensor_config in mqtt_sensors
+
+# mqtt_sensors
+
+# #-------------------------------------------------------------------------------
+# class sensor_config:
+# def __init__(self, deviceId, deviceName, sensorType, sensorName, icon):
+# self.deviceId = deviceId
+# self.deviceName = deviceName
+# self.sensorType = sensorType
+# self.sensorName = sensorName
+# self.icon = icon
+
#-------------------------------------------------------------------------------
@@ -1882,25 +1910,32 @@ class device_sensor:
self.deviceName = deviceName
self.sensorType = sensorType
self.sensorName = sensorName
- self.icon = icon
+ self.icon = icon
- message = '{ \
- "name":"'+ deviceName +' '+sensorName+'", \
- "state_topic":"system-sensors/'+sensorType+'/'+deviceId+'/state", \
- "value_template":"{{value_json.'+sensorName+'}}", \
- "unique_id":"'+deviceId+'_sensor_'+sensorName+'", \
- "device": \
- { \
- "identifiers": ["'+deviceId+'_sensor"], \
- "manufacturer": "PiAlert", \
- "name":"'+deviceName+'" \
- }, \
- "icon":"mdi:'+icon+'" \
- }'
+ global mqtt_sensors
- topic='homeassistant/'+sensorType+'/'+deviceId+'/'+sensorName+'/config'
+ if (self in mqtt_sensors) == False:
+
+ mqtt_sensors.append(self)
+
+ message = '{ \
+ "name":"'+ deviceName +' '+sensorName+'", \
+ "state_topic":"system-sensors/'+sensorType+'/'+deviceId+'/state", \
+ "value_template":"{{value_json.'+sensorName+'}}", \
+ "unique_id":"'+deviceId+'_sensor_'+sensorName+'", \
+ "device": \
+ { \
+ "identifiers": ["'+deviceId+'_sensor"], \
+ "manufacturer": "PiAlert", \
+ "name":"'+deviceName+'" \
+ }, \
+ "icon":"mdi:'+icon+'" \
+ }'
+
+ topic='homeassistant/'+sensorType+'/'+deviceId+'/'+sensorName+'/config'
+
+ publish_mqtt(client, topic, message)
- publish_mqtt(client, topic, message)
#-------------------------------------------------------------------------------
def mqtt_start():
@@ -1965,7 +2000,6 @@ def mqtt_start():
device_sensor(client, deviceId, deviceNameDisplay, 'sensor', 'mac_address', 'folder-key-network')
device_sensor(client, deviceId, deviceNameDisplay, 'sensor', 'is_new', 'bell-alert-outline')
device_sensor(client, deviceId, deviceNameDisplay, 'sensor', 'vendor', 'cog')
-
# update device sensors in home assistant
@@ -1992,8 +2026,8 @@ def mqtt_start():
# qos=1,
# retain=True,
# )
- time.sleep(10)
- client.loop()
+ # time.sleep(10)
+ # client.loop()