PAHO MQTT API v2
This commit is contained in:
@@ -27,6 +27,7 @@ PiAlert comes with MQTT support, allowing you to show all detected devices as de
|
|||||||
- Fill in the details from above
|
- Fill in the details from above
|
||||||
- Fill in remaining settings as per description
|
- Fill in remaining settings as per description
|
||||||
|
|
||||||
|
![Configuration Example][configuration]
|
||||||
|
|
||||||
## 📷 Screenshots
|
## 📷 Screenshots
|
||||||
|
|
||||||
@@ -35,8 +36,9 @@ PiAlert comes with MQTT support, allowing you to show all detected devices as de
|
|||||||
| ![Screen 3][list] | ![Screen 4][overview] |
|
| ![Screen 3][list] | ![Screen 4][overview] |
|
||||||
|
|
||||||
|
|
||||||
[sensors]: /docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Device-as-Sensors.png "sensors"
|
[configuration]: /docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Configuration.png "configuration"
|
||||||
[history]: /docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Device-Presence-History.png "history"
|
[sensors]: /docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Device-as-Sensors.png "sensors"
|
||||||
[list]: /docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Devices-List.png "list"
|
[history]: /docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Device-Presence-History.png "history"
|
||||||
[overview]: /docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Overview-Card.png "overview"
|
[list]: /docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Devices-List.png "list"
|
||||||
|
[overview]: /docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Overview-Card.png "overview"
|
||||||
|
|
||||||
|
|||||||
BIN
docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Configuration.png
Executable file
BIN
docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Configuration.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 291 KiB |
@@ -9,7 +9,9 @@ import sys
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import time
|
import time
|
||||||
import re
|
import re
|
||||||
from paho.mqtt import client as mqtt_client
|
import paho.mqtt.client as mqtt
|
||||||
|
# from paho.mqtt import client as mqtt_client
|
||||||
|
# from paho.mqtt import CallbackAPIVersion as mqtt_CallbackAPIVersion
|
||||||
import hashlib
|
import hashlib
|
||||||
|
|
||||||
|
|
||||||
@@ -43,7 +45,7 @@ module_name = pluginName
|
|||||||
|
|
||||||
mqtt_sensors = []
|
mqtt_sensors = []
|
||||||
mqtt_connected_to_broker = False
|
mqtt_connected_to_broker = False
|
||||||
client = None # mqtt client
|
mqtt_client = None # mqtt client
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
||||||
@@ -130,7 +132,7 @@ class sensor_config:
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
|
|
||||||
def publish_mqtt(client, topic, message):
|
def publish_mqtt(mqtt_client, topic, message):
|
||||||
status = 1
|
status = 1
|
||||||
|
|
||||||
|
|
||||||
@@ -139,7 +141,7 @@ def publish_mqtt(client, topic, message):
|
|||||||
mylog('verbose', [f"[{pluginName}] Sending MQTT message: {message}"])
|
mylog('verbose', [f"[{pluginName}] Sending MQTT message: {message}"])
|
||||||
|
|
||||||
while status != 0:
|
while status != 0:
|
||||||
result = client.publish(
|
result = mqtt_client.publish(
|
||||||
topic=topic,
|
topic=topic,
|
||||||
payload=message,
|
payload=message,
|
||||||
qos=get_setting_value('MQTT_QOS'),
|
qos=get_setting_value('MQTT_QOS'),
|
||||||
@@ -154,22 +156,22 @@ def publish_mqtt(client, topic, message):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
def create_generic_device(client):
|
def create_generic_device(mqtt_client):
|
||||||
|
|
||||||
deviceName = 'PiAlert'
|
deviceName = 'PiAlert'
|
||||||
deviceId = 'pialert'
|
deviceId = 'pialert'
|
||||||
|
|
||||||
create_sensor(client, deviceId, deviceName, 'sensor', 'online', 'wifi-check')
|
create_sensor(mqtt_client, deviceId, deviceName, 'sensor', 'online', 'wifi-check')
|
||||||
create_sensor(client, deviceId, deviceName, 'sensor', 'down', 'wifi-cancel')
|
create_sensor(mqtt_client, deviceId, deviceName, 'sensor', 'down', 'wifi-cancel')
|
||||||
create_sensor(client, deviceId, deviceName, 'sensor', 'all', 'wifi')
|
create_sensor(mqtt_client, deviceId, deviceName, 'sensor', 'all', 'wifi')
|
||||||
create_sensor(client, deviceId, deviceName, 'sensor', 'archived', 'wifi-lock')
|
create_sensor(mqtt_client, deviceId, deviceName, 'sensor', 'archived', 'wifi-lock')
|
||||||
create_sensor(client, deviceId, deviceName, 'sensor', 'new', 'wifi-plus')
|
create_sensor(mqtt_client, deviceId, deviceName, 'sensor', 'new', 'wifi-plus')
|
||||||
create_sensor(client, deviceId, deviceName, 'sensor', 'unknown', 'wifi-alert')
|
create_sensor(mqtt_client, deviceId, deviceName, 'sensor', 'unknown', 'wifi-alert')
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
|
|
||||||
def create_sensor(client, deviceId, deviceName, sensorType, sensorName, icon, mac=""):
|
def create_sensor(mqtt_client, deviceId, deviceName, sensorType, sensorName, icon, mac=""):
|
||||||
|
|
||||||
global mqtt_sensors
|
global mqtt_sensors
|
||||||
|
|
||||||
@@ -178,13 +180,13 @@ def create_sensor(client, deviceId, deviceName, sensorType, sensorName, icon, ma
|
|||||||
# save if new
|
# save if new
|
||||||
if new_sensor_config.isNew:
|
if new_sensor_config.isNew:
|
||||||
mylog('minimal', [f"[{pluginName}] Publishing sensor number {len(mqtt_sensors)}"])
|
mylog('minimal', [f"[{pluginName}] Publishing sensor number {len(mqtt_sensors)}"])
|
||||||
publish_sensor(client, new_sensor_config)
|
publish_sensor(mqtt_client, new_sensor_config)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
def publish_sensor(client, sensorConfig):
|
def publish_sensor(mqtt_client, sensorConfig):
|
||||||
|
|
||||||
global mqtt_sensors
|
global mqtt_sensors
|
||||||
|
|
||||||
@@ -205,7 +207,7 @@ def publish_sensor(client, sensorConfig):
|
|||||||
topic='homeassistant/'+sensorConfig.sensorType+'/'+sensorConfig.deviceId+'/'+sensorConfig.sensorName+'/config'
|
topic='homeassistant/'+sensorConfig.sensorType+'/'+sensorConfig.deviceId+'/'+sensorConfig.sensorName+'/config'
|
||||||
|
|
||||||
# add the sensor to the global list to keep track of succesfully added sensors
|
# add the sensor to the global list to keep track of succesfully added sensors
|
||||||
if publish_mqtt(client, topic, message):
|
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
|
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)
|
# (it takes ~2s to update a sensor config on the broker)
|
||||||
@@ -213,7 +215,7 @@ def publish_sensor(client, sensorConfig):
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
def mqtt_create_client():
|
def mqtt_create_client():
|
||||||
def on_disconnect(client, userdata, rc):
|
def on_disconnect(mqtt_client, userdata, reason_code):
|
||||||
|
|
||||||
global mqtt_connected_to_broker
|
global mqtt_connected_to_broker
|
||||||
|
|
||||||
@@ -222,44 +224,44 @@ def mqtt_create_client():
|
|||||||
# not sure is below line is correct / necessary
|
# not sure is below line is correct / necessary
|
||||||
# client = mqtt_create_client()
|
# client = mqtt_create_client()
|
||||||
|
|
||||||
def on_connect(client, userdata, flags, rc):
|
def on_connect(mqtt_client, userdata, flags, reason_code):
|
||||||
|
|
||||||
global mqtt_connected_to_broker
|
global mqtt_connected_to_broker
|
||||||
|
|
||||||
if rc == 0:
|
if reason_code == 0:
|
||||||
mylog('verbose', [f"[{pluginName}] Connected to broker"])
|
mylog('verbose', [f"[{pluginName}] Connected to broker"])
|
||||||
mqtt_connected_to_broker = True # Signal connection
|
mqtt_connected_to_broker = True # Signal connection
|
||||||
else:
|
else:
|
||||||
mylog('none', [f"[{pluginName}] Connection failed"])
|
mylog('none', [f"[{pluginName}] Connection failed, reason_code: {reason_code}"])
|
||||||
mqtt_connected_to_broker = False
|
mqtt_connected_to_broker = False
|
||||||
|
|
||||||
|
|
||||||
global client
|
global mqtt_client
|
||||||
|
|
||||||
client = mqtt_client.Client('PiAlert') # Set Connecting Client ID
|
mqtt_client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
|
||||||
client.username_pw_set(get_setting_value('MQTT_USER'), get_setting_value('MQTT_PASSWORD'))
|
mqtt_client.username_pw_set(get_setting_value('MQTT_USER'), get_setting_value('MQTT_PASSWORD'))
|
||||||
client.on_connect = on_connect
|
mqtt_client.on_connect = on_connect
|
||||||
client.on_disconnect = on_disconnect
|
mqtt_client.on_disconnect = on_disconnect
|
||||||
client.connect(get_setting_value('MQTT_BROKER'), get_setting_value('MQTT_PORT'))
|
mqtt_client.connect(get_setting_value('MQTT_BROKER'), get_setting_value('MQTT_PORT'))
|
||||||
client.loop_start()
|
mqtt_client.loop_start()
|
||||||
|
|
||||||
return client
|
return mqtt_client
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
def mqtt_start(db):
|
def mqtt_start(db):
|
||||||
|
|
||||||
global client, mqtt_connected_to_broker
|
global mqtt_client, mqtt_connected_to_broker
|
||||||
|
|
||||||
if mqtt_connected_to_broker == False:
|
if mqtt_connected_to_broker == False:
|
||||||
mqtt_connected_to_broker = True
|
mqtt_connected_to_broker = True
|
||||||
client = mqtt_create_client()
|
mqtt_client = mqtt_create_client()
|
||||||
|
|
||||||
# General stats
|
# General stats
|
||||||
|
|
||||||
# Create a generic device for overal stats
|
# Create a generic device for overal stats
|
||||||
if get_setting_value('MQTT_SEND_STATS') == True:
|
if get_setting_value('MQTT_SEND_STATS') == True:
|
||||||
# Create a new device representing overall PiAlert stats
|
# Create a new device representing overall PiAlert stats
|
||||||
create_generic_device(client)
|
create_generic_device(mqtt_client)
|
||||||
|
|
||||||
# Get the data
|
# Get the data
|
||||||
row = get_device_stats(db)
|
row = get_device_stats(db)
|
||||||
@@ -273,7 +275,7 @@ def mqtt_start(db):
|
|||||||
payload += '"'+column+'": ' + str(row[column]) +','
|
payload += '"'+column+'": ' + str(row[column]) +','
|
||||||
|
|
||||||
# Publish (wrap into {} and remove last ',' from above)
|
# Publish (wrap into {} and remove last ',' from above)
|
||||||
publish_mqtt(client, "system-sensors/sensor/pialert/state",
|
publish_mqtt(mqtt_client, "system-sensors/sensor/pialert/state",
|
||||||
'{ \
|
'{ \
|
||||||
'+ payload[:-1] +'\
|
'+ payload[:-1] +'\
|
||||||
}'
|
}'
|
||||||
@@ -299,15 +301,15 @@ def mqtt_start(db):
|
|||||||
deviceId = 'mac_' + device["dev_MAC"].replace(" ", "").replace(":", "_").lower()
|
deviceId = 'mac_' + device["dev_MAC"].replace(" ", "").replace(":", "_").lower()
|
||||||
deviceNameDisplay = re.sub('[^a-zA-Z0-9-_\s]', '', device["dev_Name"])
|
deviceNameDisplay = re.sub('[^a-zA-Z0-9-_\s]', '', device["dev_Name"])
|
||||||
|
|
||||||
create_sensor(client, deviceId, deviceNameDisplay, 'sensor', 'last_ip', 'ip-network', device["dev_MAC"])
|
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'last_ip', 'ip-network', device["dev_MAC"])
|
||||||
create_sensor(client, deviceId, deviceNameDisplay, 'binary_sensor', 'is_present', 'wifi', device["dev_MAC"])
|
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'binary_sensor', 'is_present', 'wifi', device["dev_MAC"])
|
||||||
create_sensor(client, deviceId, deviceNameDisplay, 'sensor', 'mac_address', 'folder-key-network', device["dev_MAC"])
|
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'mac_address', 'folder-key-network', device["dev_MAC"])
|
||||||
create_sensor(client, deviceId, deviceNameDisplay, 'sensor', 'is_new', 'bell-alert-outline', device["dev_MAC"])
|
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'is_new', 'bell-alert-outline', device["dev_MAC"])
|
||||||
create_sensor(client, deviceId, deviceNameDisplay, 'sensor', 'vendor', 'cog', device["dev_MAC"])
|
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'vendor', 'cog', device["dev_MAC"])
|
||||||
|
|
||||||
# update device sensors in home assistant
|
# update device sensors in home assistant
|
||||||
|
|
||||||
publish_mqtt(client, 'system-sensors/sensor/'+deviceId+'/state',
|
publish_mqtt(mqtt_client, 'system-sensors/sensor/'+deviceId+'/state',
|
||||||
'{ \
|
'{ \
|
||||||
"last_ip": "' + device["dev_LastIP"] +'", \
|
"last_ip": "' + device["dev_LastIP"] +'", \
|
||||||
"is_new": "' + str(device["dev_NewDevice"]) +'", \
|
"is_new": "' + str(device["dev_NewDevice"]) +'", \
|
||||||
@@ -316,7 +318,7 @@ def mqtt_start(db):
|
|||||||
}'
|
}'
|
||||||
)
|
)
|
||||||
|
|
||||||
publish_mqtt(client, 'system-sensors/binary_sensor/'+deviceId+'/state',
|
publish_mqtt(mqtt_client, 'system-sensors/binary_sensor/'+deviceId+'/state',
|
||||||
'{ \
|
'{ \
|
||||||
"is_present": "' + to_binary_sensor(str(device["dev_PresentLastScan"])) +'"\
|
"is_present": "' + to_binary_sensor(str(device["dev_PresentLastScan"])) +'"\
|
||||||
}'
|
}'
|
||||||
|
|||||||
Reference in New Issue
Block a user