Compare commits

...

2 Commits

Author SHA1 Message Date
Nigreon 9f477a61de Report on air DHT22 errors 2025-12-30 22:33:22 +01:00
Nigreon 9a715056f1 MQTT Systray menu disposition and + in MQTT 2025-12-30 22:32:40 +01:00
2 changed files with 53 additions and 29 deletions

View File

@ -1,8 +1,11 @@
#!/usr/bin/python
import gi
import tempfile
import time
import os
import signal
import re
import paho.mqtt.client as mqtt
@ -19,6 +22,7 @@ oldtmpfile = ''
oldalertcount = 0
menu = Gtk.Menu()
#fp = open("/home/agc/local/bin/mqtt-systray.yaml")
fp = open("mqtt-systray.yaml")
conf = yaml.safe_load(fp)
fp.close()
@ -65,18 +69,18 @@ def get_alert_text_warning(devicea, sensora):
alert_text = ''
if 'value' in conf['devices'][devicea]['values'][sensora]:
if 'max_warning' in conf['devices'][devicea]['values'][sensora] and conf['devices'][devicea]['values'][sensora]['value'] > conf['devices'][devicea]['values'][sensora]['max_warning']:
alert_text = '!!high!! '
alert_text = '!!high!!'
elif 'min_warning' in conf['devices'][devicea]['values'][sensora] and conf['devices'][devicea]['values'][sensora]['value'] < conf['devices'][devicea]['values'][sensora]['min_warning']:
alert_text = '!!low!! '
alert_text = '!!low!!'
return alert_text
def get_alert_text_critical(devicea, sensora):
alert_text = ''
if 'value' in conf['devices'][devicea]['values'][sensora]:
if 'max_critical' in conf['devices'][devicea]['values'][sensora] and conf['devices'][devicea]['values'][sensora]['value'] > conf['devices'][devicea]['values'][sensora]['max_critical']:
alert_text = '!!HIGH!! '
alert_text = '!!HIGH!!'
elif 'min_critical' in conf['devices'][devicea]['values'][sensora] and conf['devices'][devicea]['values'][sensora]['value'] < conf['devices'][devicea]['values'][sensora]['min_critical']:
alert_text = '!!LOW!! '
alert_text = '!!LOW!!'
return alert_text
def get_alert_text(devicea, sensora):
@ -141,13 +145,16 @@ def build_menu():
menu = Gtk.Menu()
for device1 in conf['devices']:
devname = conf['devices'][device1]['name']
conf['devices'][device1]['menuitem'] = Gtk.MenuItem(label=devname)
submenu = Gtk.Menu()
#conf['devices'][device1]['menuitem'] = Gtk.MenuItem(label=devname)
#submenu = Gtk.Menu()
#for sensor in conf['devices'][device1]['values'].keys():
# conf['devices'][device1]['values'][sensor]['menuitem'] = Gtk.MenuItem(label=conf['devices'][device1]['values'][sensor]['name'])
# submenu.append(conf['devices'][device1]['values'][sensor]['menuitem'])
#conf['devices'][device1]['menuitem'].set_submenu(submenu)
#menu.append(conf['devices'][device1]['menuitem'])
for sensor in conf['devices'][device1]['values'].keys():
conf['devices'][device1]['values'][sensor]['menuitem'] = Gtk.MenuItem(label=conf['devices'][device1]['values'][sensor]['name'])
submenu.append(conf['devices'][device1]['values'][sensor]['menuitem'])
conf['devices'][device1]['menuitem'].set_submenu(submenu)
menu.append(conf['devices'][device1]['menuitem'])
conf['devices'][device1]['values'][sensor]['menuitem'] = Gtk.MenuItem(label=devname+' - '+conf['devices'][device1]['values'][sensor]['name'])
menu.append(conf['devices'][device1]['values'][sensor]['menuitem'])
item_dashboard = Gtk.MenuItem(label='Open Dashboard')
item_dashboard.connect('activate', gtkdashboard)
@ -197,19 +204,29 @@ def build_menu():
def update_menu():
appindicator.set_menu(build_menu())
def search_topic(devices):
for device in conf['devices'].keys():
if device.find('+') > 0:
re_topic = device.replace('+', '.+')
if(len(re.findall(re_topic, devices)) > 0):
return device
return None
def set_value(topic, value):
global oldalertcount
topicds = topic.rsplit("/", 1)
devices=topicds[0]
devices = devices.removeprefix(mqttprefix+'/')
conf['devices'][devices]['values'][topicds[1]]['value'] = float(value)
ctopic = topicds[1]
if search_topic(devices): devices=search_topic(devices)
conf['devices'][devices]['values'][ctopic]['value'] = float(value)
#update_menu()
alert_text = get_alert_text(devices, topicds[1])
text='{}{}: {} {}'.format(alert_text, conf['devices'][devices]['values'][topicds[1]]['name'], conf['devices'][devices]['values'][topicds[1]]['value'], conf['devices'][devices]['values'][topicds[1]]['unit'])
conf['devices'][devices]['values'][topicds[1]]['menuitem'].set_label(text)
#conf['devices'][devices]['values'][topicds[1]]['menuitem'].set_label("{}".format(conf['devices'][devices]['values'][topicds[1]]['value']))
devname = conf['devices'][devices]['name']
alert_text = get_alert_text(devices, ctopic)
text='{} - {}: {} {} {}'.format(conf['devices'][devices]['name'], conf['devices'][devices]['values'][topicds[1]]['name'], round(conf['devices'][devices]['values'][topicds[1]]['value'], 2), conf['devices'][devices]['values'][topicds[1]]['unit'], alert_text)
conf['devices'][devices]['values'][ctopic]['menuitem'].set_label(text)
#conf['devices'][devices]['values'][ctopic]['menuitem'].set_label("{}".format(conf['devices'][devices]['values'][topicds[1]]['value']))
#devname = conf['devices'][devices]['name']
#print(get_alert(devices))
#if get_alert(devices): devname = "! " + devname
#if get_alert(devices): devname = "!!ALERT!! " + devname
@ -218,7 +235,7 @@ def set_value(topic, value):
if oldalertcount != (alert_count()):
oldalertcount = alert_count()
appindicator.set_icon_full(get_icon(), "mqtt-icon")
os.system("notify-send '{}' '{}'".format(conf['devices'][devices]['name'], text))
# os.system("notify-send '{}' '{}'".format(conf['devices'][devices]['name'], text))
def subscribe_mqtt(mqttc):
for device in conf['devices']:
@ -231,10 +248,11 @@ def subscribe_mqtt(mqttc):
def on_connect(mqttc, obj, flags, rc):
print("rc: " + str(rc))
subscribe_mqtt(mqttc)
#def on_subscribe(mqttc, obj, mid, granted_qos):
# print("Subscribed: " + str(mid) + " " + str(granted_qos))
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
#print(msg.topic+" "+str(msg.payload))
set_value(msg.topic, msg.payload)
@ -245,7 +263,7 @@ appindicator.set_title('MQTT Alert')
appindicator.set_status(AppIndicator.IndicatorStatus.ACTIVE)
appindicator.set_menu(build_menu())
set_value("model1/1/1/temperature1C", "25.1")
#set_value("model1/1/1/temperature1C", "25.1")
#set_value("model2/2/2/humidity2", "75")
#print(conf)
@ -264,6 +282,4 @@ while connected == False:
connected=True
mqttc.loop_start()
subscribe_mqtt(mqttc)
Gtk.main()

View File

@ -77,14 +77,19 @@ JsonDocument analyzeTH_type1(JsonArray payloadrh) {
JsonDocument analyzeTH_type2(JsonArray payloadrh) {
JsonDocument doc;
int16_t payloadtemp = payloadrh[2].as<unsigned char>();
payloadtemp += payloadrh[1].as<unsigned char>() << 8;
doc["temperature_C"] = payloadtemp / 100.0;
uint8_t payloadhumidity = payloadrh[3].as<unsigned char>();
doc["humidity"] = payloadhumidity;
uint8_t errcode = payloadrh[1].as<unsigned char>();
doc["errcode"] = errcode;
if(errcode == 0) {
int16_t payloadtemp = payloadrh[3].as<unsigned char>();
payloadtemp += payloadrh[2].as<unsigned char>() << 8;
doc["temperature_C"] = payloadtemp / 100.0;
uint8_t payloadhumidity = payloadrh[4].as<unsigned char>();
doc["humidity"] = payloadhumidity;
}
return doc;
}
void logJson(JsonDocument jsondata) {
if(jsondata["model"].is<String>())
{
@ -107,11 +112,14 @@ void logJson(JsonDocument jsondata) {
jsondata["battery_V"] = adoc["battery_V"];
jsondata["battery_percent"] = adoc["battery_percent"];
jsondata["temperature_C"] = adoc["temperature_C"];
} else if(jsondata["len"].as<int>() == 4 && ((payloadrh[0].as<unsigned char>() & 0b00100000 ) > 0)) {
} else if(jsondata["len"].as<int>() == 5 && ((payloadrh[0].as<unsigned char>() & 0b00100000 ) > 0)) {
treatrh = true;
JsonDocument adoc = analyzeTH_type2(payloadrh);
jsondata["temperature_C"] = adoc["temperature_C"];
jsondata["humidity"] = adoc["humidity"];
jsondata["errcode"] = adoc["errcode"];
if(jsondata["errcode"] == 0) {
jsondata["temperature_C"] = adoc["temperature_C"];
jsondata["humidity"] = adoc["humidity"];
}
}
if(treatrh == true) {
jsondata.remove("from");