mirror of
https://github.com/naruxde/revpipycontrol.git
synced 2025-11-08 15:43:52 +01:00
Optionfenster schlie?t bei destroy alle Unterfenster mit
MQTT Settings ingetriert
This commit is contained in:
@@ -49,7 +49,7 @@ Methods</h3>
|
||||
<table>
|
||||
<tr>
|
||||
<td><a style="color:#0000FF" href="#AclManager.__init__">AclManager</a></td>
|
||||
<td>Init RevPiOption-Class.</td>
|
||||
<td>Init AclManger-Class.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#AclManager.__get_acltext">__get_acltext</a></td>
|
||||
<td>Getter fuer Leveltexte.</td>
|
||||
@@ -107,7 +107,7 @@ Static Methods</h3>
|
||||
AclManager (Constructor)</h3>
|
||||
<b>AclManager</b>(<i>master, minlevel, maxlevel, acl_str="", readonly=False</i>)
|
||||
<p>
|
||||
Init RevPiOption-Class.
|
||||
Init AclManger-Class.
|
||||
</p><dl>
|
||||
<dt>Returns:</dt>
|
||||
<dd>
|
||||
|
||||
@@ -24,6 +24,9 @@ Modules</h3>
|
||||
<td><a style="color:#0000FF" href="aclmanager.html">aclmanager</a></td>
|
||||
<td></td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="mqttmanager.html">mqttmanager</a></td>
|
||||
<td></td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="mytools.html">mytools</a></td>
|
||||
<td>Tools-Sammlung.</td>
|
||||
</tr><tr>
|
||||
|
||||
134
doc/mqttmanager.html
Normal file
134
doc/mqttmanager.html
Normal file
@@ -0,0 +1,134 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head>
|
||||
<title>mqttmanager</title>
|
||||
<meta charset="UTF-8">
|
||||
</head>
|
||||
<body style="background-color:#FFFFFF;color:#000000"><a NAME="top" ID="top"></a>
|
||||
<h1 style="background-color:#FFFFFF;color:#0000FF">
|
||||
mqttmanager</h1>
|
||||
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
Global Attributes</h3>
|
||||
<table>
|
||||
<tr><td>_</td></tr><tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr>
|
||||
</table>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
Classes</h3>
|
||||
<table>
|
||||
<tr>
|
||||
<td><a style="color:#0000FF" href="#MqttManager">MqttManager</a></td>
|
||||
<td>Hauptfenster der MQTT-Einstellungen.</td>
|
||||
</tr>
|
||||
</table>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
Functions</h3>
|
||||
<table>
|
||||
<tr><td>None</td></tr>
|
||||
</table>
|
||||
<hr /><hr />
|
||||
<a NAME="MqttManager" ID="MqttManager"></a>
|
||||
<h2 style="background-color:#FFFFFF;color:#0000FF">MqttManager</h2>
|
||||
<p>
|
||||
Hauptfenster der MQTT-Einstellungen.
|
||||
</p>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
Derived from</h3>
|
||||
tkinter.Frame
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
Class Attributes</h3>
|
||||
<table>
|
||||
<tr><td>dict_mqttsettings</td></tr><tr><td>root</td></tr><tr><td>settings</td></tr>
|
||||
</table>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
Class Methods</h3>
|
||||
<table>
|
||||
<tr><td>None</td></tr>
|
||||
</table>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
Methods</h3>
|
||||
<table>
|
||||
<tr>
|
||||
<td><a style="color:#0000FF" href="#MqttManager.__init__">MqttManager</a></td>
|
||||
<td>Init MqttManager-Class.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#MqttManager._changesdone">_changesdone</a></td>
|
||||
<td>Prüft ob sich die Einstellungen geändert haben.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#MqttManager._checkclose">_checkclose</a></td>
|
||||
<td>Prüft ob Fenster beendet werden soll.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#MqttManager._createwidgets">_createwidgets</a></td>
|
||||
<td>Erstellt Widgets.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#MqttManager._save">_save</a></td>
|
||||
<td>Übernimt die Änderungen.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#MqttManager.get_settings">get_settings</a></td>
|
||||
<td>Gibt die MQTT Konfiguration zurück.</td>
|
||||
</tr>
|
||||
</table>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
Static Methods</h3>
|
||||
<table>
|
||||
<tr><td>None</td></tr>
|
||||
</table>
|
||||
<a NAME="MqttManager.__init__" ID="MqttManager.__init__"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
MqttManager (Constructor)</h3>
|
||||
<b>MqttManager</b>(<i>master, settings, readonly=False</i>)
|
||||
<p>
|
||||
Init MqttManager-Class.
|
||||
</p><dl>
|
||||
<dt>Returns:</dt>
|
||||
<dd>
|
||||
None
|
||||
</dd>
|
||||
</dl><a NAME="MqttManager._changesdone" ID="MqttManager._changesdone"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
MqttManager._changesdone</h3>
|
||||
<b>_changesdone</b>(<i></i>)
|
||||
<p>
|
||||
Prüft ob sich die Einstellungen geändert haben.
|
||||
</p><dl>
|
||||
<dt>Returns:</dt>
|
||||
<dd>
|
||||
True, wenn min. eine Einstellung geändert wurde
|
||||
</dd>
|
||||
</dl><a NAME="MqttManager._checkclose" ID="MqttManager._checkclose"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
MqttManager._checkclose</h3>
|
||||
<b>_checkclose</b>(<i>event=None</i>)
|
||||
<p>
|
||||
Prüft ob Fenster beendet werden soll.
|
||||
</p><dl>
|
||||
<dt><i>event</i></dt>
|
||||
<dd>
|
||||
tkinter-Event
|
||||
</dd>
|
||||
</dl><a NAME="MqttManager._createwidgets" ID="MqttManager._createwidgets"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
MqttManager._createwidgets</h3>
|
||||
<b>_createwidgets</b>(<i></i>)
|
||||
<p>
|
||||
Erstellt Widgets.
|
||||
</p><a NAME="MqttManager._save" ID="MqttManager._save"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
MqttManager._save</h3>
|
||||
<b>_save</b>(<i></i>)
|
||||
<p>
|
||||
Übernimt die Änderungen.
|
||||
</p><a NAME="MqttManager.get_settings" ID="MqttManager.get_settings"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
MqttManager.get_settings</h3>
|
||||
<b>get_settings</b>(<i></i>)
|
||||
<p>
|
||||
Gibt die MQTT Konfiguration zurück.
|
||||
</p><dl>
|
||||
<dt>Returns:</dt>
|
||||
<dd>
|
||||
Settings als <class 'dict'>
|
||||
</dd>
|
||||
</dl>
|
||||
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||
<hr />
|
||||
</body></html>
|
||||
@@ -54,6 +54,9 @@ Methods</h3>
|
||||
<td><a style="color:#0000FF" href="#RevPiOption._changesdone">_changesdone</a></td>
|
||||
<td>Prüft ob sich die Einstellungen geändert haben.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#RevPiOption._changesdone_mqtt">_changesdone_mqtt</a></td>
|
||||
<td>Prüft ob MQTT-Settings geändert wurden.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#RevPiOption._checkclose">_checkclose</a></td>
|
||||
<td>Prüft ob Fenster beendet werden soll.</td>
|
||||
</tr><tr>
|
||||
@@ -72,11 +75,17 @@ Methods</h3>
|
||||
<td><a style="color:#0000FF" href="#RevPiOption.askxmlon">askxmlon</a></td>
|
||||
<td>Fragt Nuter, ob wirklicht abgeschaltet werden soll.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#RevPiOption.btn_mqttsettings">btn_mqttsettings</a></td>
|
||||
<td>Öffnet Fenster für MQTT Einstellungen.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#RevPiOption.btn_slaveacl">btn_slaveacl</a></td>
|
||||
<td>Öffnet Fenster für ACL-Verwaltung.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#RevPiOption.btn_xmlacl">btn_xmlacl</a></td>
|
||||
<td>Öffnet Fenster für ACL-Verwaltung.</td>
|
||||
</tr><tr>
|
||||
<td><a style="color:#0000FF" href="#RevPiOption.destroy">destroy</a></td>
|
||||
<td>Beendet alle Unterfenster und sich selbst.</td>
|
||||
</tr>
|
||||
</table>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
@@ -106,6 +115,17 @@ Prüft ob sich die Einstellungen geändert haben.
|
||||
<dd>
|
||||
True, wenn min. eine Einstellung geändert wurde
|
||||
</dd>
|
||||
</dl><a NAME="RevPiOption._changesdone_mqtt" ID="RevPiOption._changesdone_mqtt"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
RevPiOption._changesdone_mqtt</h3>
|
||||
<b>_changesdone_mqtt</b>(<i></i>)
|
||||
<p>
|
||||
Prüft ob MQTT-Settings geändert wurden.
|
||||
</p><dl>
|
||||
<dt>Returns:</dt>
|
||||
<dd>
|
||||
True, wenn Änderungen existieren
|
||||
</dd>
|
||||
</dl><a NAME="RevPiOption._checkclose" ID="RevPiOption._checkclose"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
RevPiOption._checkclose</h3>
|
||||
@@ -162,6 +182,12 @@ RevPiOption.askxmlon</h3>
|
||||
<b>askxmlon</b>(<i></i>)
|
||||
<p>
|
||||
Fragt Nuter, ob wirklicht abgeschaltet werden soll.
|
||||
</p><a NAME="RevPiOption.btn_mqttsettings" ID="RevPiOption.btn_mqttsettings"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
RevPiOption.btn_mqttsettings</h3>
|
||||
<b>btn_mqttsettings</b>(<i></i>)
|
||||
<p>
|
||||
Öffnet Fenster für MQTT Einstellungen.
|
||||
</p><a NAME="RevPiOption.btn_slaveacl" ID="RevPiOption.btn_slaveacl"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
RevPiOption.btn_slaveacl</h3>
|
||||
@@ -174,6 +200,12 @@ RevPiOption.btn_xmlacl</h3>
|
||||
<b>btn_xmlacl</b>(<i></i>)
|
||||
<p>
|
||||
Öffnet Fenster für ACL-Verwaltung.
|
||||
</p><a NAME="RevPiOption.destroy" ID="RevPiOption.destroy"></a>
|
||||
<h3 style="background-color:#FFFFFF;color:#FF0000">
|
||||
RevPiOption.destroy</h3>
|
||||
<b>destroy</b>(<i></i>)
|
||||
<p>
|
||||
Beendet alle Unterfenster und sich selbst.
|
||||
</p>
|
||||
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
|
||||
<hr />
|
||||
|
||||
@@ -21,6 +21,19 @@ aclmanager._?8
|
||||
aclmanager.__author__?9
|
||||
aclmanager.__copyright__?9
|
||||
aclmanager.__license__?9
|
||||
mqttmanager.MqttManager._changesdone?5()
|
||||
mqttmanager.MqttManager._checkclose?5(event=None)
|
||||
mqttmanager.MqttManager._createwidgets?5()
|
||||
mqttmanager.MqttManager._save?5()
|
||||
mqttmanager.MqttManager.dict_mqttsettings?7
|
||||
mqttmanager.MqttManager.get_settings?4()
|
||||
mqttmanager.MqttManager.root?7
|
||||
mqttmanager.MqttManager.settings?7
|
||||
mqttmanager.MqttManager?1(master, settings, readonly=False)
|
||||
mqttmanager._?8
|
||||
mqttmanager.__author__?9
|
||||
mqttmanager.__copyright__?9
|
||||
mqttmanager.__license__?9
|
||||
mytools.__author__?9
|
||||
mytools.__copyright__?9
|
||||
mytools.__license__?9
|
||||
@@ -104,14 +117,17 @@ revpilogfile.__author__?9
|
||||
revpilogfile.__copyright__?9
|
||||
revpilogfile.__license__?9
|
||||
revpioption.RevPiOption._changesdone?5()
|
||||
revpioption.RevPiOption._changesdone_mqtt?5()
|
||||
revpioption.RevPiOption._checkclose?5(event=None)
|
||||
revpioption.RevPiOption._checkvalues?5()
|
||||
revpioption.RevPiOption._createwidgets?5()
|
||||
revpioption.RevPiOption._loadappdata?5(refresh=False)
|
||||
revpioption.RevPiOption._setappdata?5()
|
||||
revpioption.RevPiOption.askxmlon?4()
|
||||
revpioption.RevPiOption.btn_mqttsettings?4()
|
||||
revpioption.RevPiOption.btn_slaveacl?4()
|
||||
revpioption.RevPiOption.btn_xmlacl?4()
|
||||
revpioption.RevPiOption.destroy?4()
|
||||
revpioption.RevPiOption?1(master, xmlcli)
|
||||
revpioption._?8
|
||||
revpioption.__author__?9
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
AclManager ttk.Frame
|
||||
MqttManager tkinter.Frame
|
||||
RevPiCheckClient tkinter.Frame
|
||||
RevPiDevelop ttk.Frame
|
||||
RevPiInfo tkinter.Frame
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
|
||||
<!-- eric project file for project revpipycontrol -->
|
||||
<!-- Saved: 2018-08-12, 16:56:01 -->
|
||||
<!-- Saved: 2018-09-03, 16:25:26 -->
|
||||
<!-- Copyright (C) 2018 Sven Sager, akira@narux.de -->
|
||||
<Project version="5.1">
|
||||
<Language>en_US</Language>
|
||||
@@ -14,6 +14,7 @@
|
||||
<Eol index="1"/>
|
||||
<Sources>
|
||||
<Source>revpipycontrol/aclmanager.py</Source>
|
||||
<Source>revpipycontrol/mqttmanager.py</Source>
|
||||
<Source>revpipycontrol/mytools.py</Source>
|
||||
<Source>revpipycontrol/revpicheckclient.py</Source>
|
||||
<Source>revpipycontrol/revpidevelop.py</Source>
|
||||
|
||||
@@ -20,7 +20,7 @@ class AclManager(ttk.Frame):
|
||||
u"""Hauptfenster des ACL-Managers."""
|
||||
|
||||
def __init__(self, master, minlevel, maxlevel, acl_str="", readonly=False):
|
||||
u"""Init RevPiOption-Class.
|
||||
u"""Init AclManger-Class.
|
||||
@return None"""
|
||||
super().__init__(master)
|
||||
self.master.bind("<KeyPress-Escape>", self._checkclose)
|
||||
|
||||
321
revpipycontrol/mqttmanager.py
Normal file
321
revpipycontrol/mqttmanager.py
Normal file
@@ -0,0 +1,321 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
u"""Optionen für das MQTT System."""
|
||||
|
||||
__author__ = "Sven Sager"
|
||||
__copyright__ = "Copyright (C) 2018 Sven Sager"
|
||||
__license__ = "GPLv3"
|
||||
|
||||
import tkinter
|
||||
import tkinter.messagebox as tkmsg
|
||||
from mytools import gettrans
|
||||
|
||||
# Übersetzung laden
|
||||
_ = gettrans()
|
||||
|
||||
|
||||
class MqttManager(tkinter.Frame):
|
||||
|
||||
u"""Hauptfenster der MQTT-Einstellungen."""
|
||||
|
||||
def __init__(self, master, settings, readonly=False):
|
||||
u"""Init MqttManager-Class.
|
||||
@return None"""
|
||||
if not isinstance(settings, dict):
|
||||
raise ValueError("parameter settings must be <class 'dict'>")
|
||||
if not isinstance(readonly, bool):
|
||||
raise ValueError("parameter readonly must be <class 'bool'>")
|
||||
|
||||
super().__init__(master)
|
||||
self.master.bind("<KeyPress-Escape>", self._checkclose)
|
||||
self.master.protocol("WM_DELETE_WINDOW", self._checkclose)
|
||||
self.pack(expand=True, fill="both")
|
||||
|
||||
# Daten laden
|
||||
self.__ro = "disabled" if readonly else "normal"
|
||||
self.__settings = settings
|
||||
|
||||
# Fenster bauen
|
||||
self._createwidgets()
|
||||
|
||||
def _changesdone(self):
|
||||
u"""Prüft ob sich die Einstellungen geändert haben.
|
||||
@return True, wenn min. eine Einstellung geändert wurde"""
|
||||
return (
|
||||
self.var_basetopic.get() != self.__settings["mqttbasetopic"] or
|
||||
self.var_send_events.get() != self.__settings["mqttsend_events"] or
|
||||
self.var_client_id.get() != self.__settings["mqttclient_id"] or
|
||||
self.var_password.get() != self.__settings["mqttpassword"] or
|
||||
self.var_port.get() != str(self.__settings["mqttport"]) or
|
||||
self.var_tls_set.get() != self.__settings["mqtttls_set"] or
|
||||
self.var_username.get() != self.__settings["mqttusername"] or
|
||||
self.var_broker_address.get() !=
|
||||
self.__settings["mqttbroker_address"] or
|
||||
self.var_sendinterval.get() !=
|
||||
str(self.__settings["mqttsendinterval"]) or
|
||||
self.var_write_outputs.get() !=
|
||||
self.__settings["mqttwrite_outputs"]
|
||||
)
|
||||
|
||||
def _checkclose(self, event=None):
|
||||
u"""Prüft ob Fenster beendet werden soll.
|
||||
@param event tkinter-Event"""
|
||||
ask = True
|
||||
if self._changesdone():
|
||||
ask = tkmsg.askyesno(
|
||||
_("Question"),
|
||||
_("Do you really want to quit? \nUnsaved changes will "
|
||||
"be lost"),
|
||||
parent=self.master, default="no"
|
||||
)
|
||||
|
||||
if ask:
|
||||
self.master.destroy()
|
||||
|
||||
def _createwidgets(self):
|
||||
u"""Erstellt Widgets."""
|
||||
self.master.wm_title(_("MQTT Settings"))
|
||||
self.master.wm_resizable(width=False, height=False)
|
||||
|
||||
# cpade = {"padx": 4, "pady": 2, "sticky": "e"}
|
||||
cpadw = {"padx": 4, "pady": 2, "sticky": "w"}
|
||||
cpadwe = {"padx": 4, "pady": 2, "sticky": "we"}
|
||||
|
||||
# Gruppe MQTT System ######################################
|
||||
|
||||
# Basetopic
|
||||
gb = tkinter.LabelFrame(self)
|
||||
gb["text"] = _("MQTT base topic")
|
||||
gb.columnconfigure(0, weight=1)
|
||||
gb.pack(expand=True, fill="both", padx=4, pady=4)
|
||||
|
||||
self.var_basetopic = tkinter.StringVar(
|
||||
gb, self.__settings["mqttbasetopic"])
|
||||
|
||||
row = 0
|
||||
lbl = tkinter.Label(gb)
|
||||
lbl["text"] = _("Base topic") + ":"
|
||||
lbl.grid(row=row, column=0, **cpadw)
|
||||
|
||||
txt = tkinter.Entry(gb)
|
||||
txt["state"] = self.__ro
|
||||
txt["textvariable"] = self.var_basetopic
|
||||
txt["width"] = 34
|
||||
txt.grid(row=row, column=1, **cpadwe)
|
||||
|
||||
row += 1
|
||||
lbl = tkinter.Label(gb)
|
||||
lbl["justify"] = "left"
|
||||
lbl["text"] = _(
|
||||
"""The base topic is the first part of any mqtt topic, the
|
||||
Revolution Pi will publish. You can use any character
|
||||
includig '/' to identify the messages and subscribe them
|
||||
on your broker.
|
||||
|
||||
For example: revpi0000/data"""
|
||||
)
|
||||
lbl.grid(row=row, column=0, columnspan=2, **cpadw)
|
||||
|
||||
# Publish settings
|
||||
gb = tkinter.LabelFrame(self)
|
||||
gb["text"] = _("MQTT publish settings")
|
||||
gb.columnconfigure(0, weight=1)
|
||||
gb.pack(expand=True, fill="both", padx=4, pady=4)
|
||||
|
||||
self.var_send_events = tkinter.BooleanVar(
|
||||
gb, self.__settings["mqttsend_events"])
|
||||
self.var_sendinterval = tkinter.StringVar(
|
||||
gb, self.__settings["mqttsendinterval"])
|
||||
self.var_write_outputs = tkinter.BooleanVar(
|
||||
gb, self.__settings["mqttwrite_outputs"])
|
||||
|
||||
row = 0
|
||||
lbl = tkinter.Label(gb)
|
||||
lbl["text"] = _("Publish all exported values every n seconds") + ":"
|
||||
lbl.grid(row=row, column=0, **cpadw)
|
||||
sb = tkinter.Spinbox(gb)
|
||||
sb["state"] = self.__ro
|
||||
sb["textvariable"] = self.var_sendinterval
|
||||
sb["width"] = 5
|
||||
sb.grid(row=row, column=1, **cpadw)
|
||||
|
||||
row += 1
|
||||
lbl = tkinter.Label(gb)
|
||||
lbl["justify"] = "left"
|
||||
lbl["text"] = _("Topic: \t[basetopic]/io/[ioname]")
|
||||
lbl.grid(row=row, columnspan=2, **cpadw)
|
||||
|
||||
row += 1
|
||||
cb = tkinter.Checkbutton(gb)
|
||||
cb["state"] = self.__ro
|
||||
cb["text"] = _("Send exported values immediately on value change")
|
||||
cb["variable"] = self.var_send_events
|
||||
cb.grid(row=row, columnspan=2, **cpadw)
|
||||
|
||||
row += 1
|
||||
lbl = tkinter.Label(gb)
|
||||
lbl["justify"] = "left"
|
||||
lbl["text"] = _("Topic: \t[basetopic]/event/[ioname]")
|
||||
lbl.grid(row=row, columnspan=2, **cpadw)
|
||||
|
||||
# Subscribe settings
|
||||
gb = tkinter.LabelFrame(self)
|
||||
gb["text"] = _("MQTT set outputs")
|
||||
gb.columnconfigure(0, weight=1)
|
||||
gb.pack(expand=True, fill="both", padx=4, pady=4)
|
||||
|
||||
row = 0
|
||||
cb = tkinter.Checkbutton(gb)
|
||||
cb["state"] = self.__ro
|
||||
cb["text"] = _("Allow MQTT to to set outputs on Revolution Pi")
|
||||
cb["variable"] = self.var_write_outputs
|
||||
cb.grid(row=row, columnspan=2, **cpadw)
|
||||
|
||||
row += 1
|
||||
lbl = tkinter.Label(gb)
|
||||
lbl["justify"] = "left"
|
||||
lbl["text"] = _(
|
||||
"""The Revolution Pi will subscribe a topic on which your client
|
||||
can publish messages with the new value as payload.
|
||||
|
||||
Publish values with topic: \t[basetopic]/set/[outputname]"""
|
||||
)
|
||||
lbl.grid(row=row, columnspan=2, **cpadw)
|
||||
|
||||
# ############################################################
|
||||
|
||||
# Gruppe Broker ##########################################
|
||||
gb = tkinter.LabelFrame(self)
|
||||
gb["text"] = _("MQTT broker settings")
|
||||
gb.pack(expand=True, fill="both", padx=4, pady=4)
|
||||
gb.columnconfigure(2, weight=1)
|
||||
|
||||
# Variablen
|
||||
self.var_client_id = tkinter.StringVar(
|
||||
gb, self.__settings["mqttclient_id"])
|
||||
self.var_broker_address = tkinter.StringVar(
|
||||
gb, self.__settings["mqttbroker_address"])
|
||||
self.var_password = tkinter.StringVar(
|
||||
gb, self.__settings["mqttpassword"])
|
||||
self.var_port = tkinter.StringVar(
|
||||
gb, self.__settings["mqttport"])
|
||||
self.var_tls_set = tkinter.BooleanVar(
|
||||
gb, self.__settings["mqtttls_set"])
|
||||
self.var_username = tkinter.StringVar(
|
||||
gb, self.__settings["mqttusername"])
|
||||
|
||||
row = 0
|
||||
lbl = tkinter.Label(gb)
|
||||
lbl["text"] = _("Broker address") + ":"
|
||||
lbl.grid(row=row, column=0, **cpadw)
|
||||
txt = tkinter.Entry(gb)
|
||||
txt["state"] = self.__ro
|
||||
txt["textvariable"] = self.var_broker_address
|
||||
txt.grid(row=row, column=1, columnspan=2, **cpadw)
|
||||
|
||||
row += 1
|
||||
lbl = tkinter.Label(gb)
|
||||
lbl["text"] = _("Broker port") + ":"
|
||||
lbl.grid(row=row, column=0, **cpadw)
|
||||
sb = tkinter.Spinbox(gb)
|
||||
sb["state"] = self.__ro
|
||||
sb["textvariable"] = self.var_port
|
||||
sb["width"] = 6
|
||||
sb.grid(row=row, column=1, **cpadw)
|
||||
|
||||
ckb = tkinter.Checkbutton(gb)
|
||||
ckb["state"] = self.__ro
|
||||
ckb["text"] = _("Use TLS") + ":"
|
||||
ckb["variable"] = self.var_tls_set
|
||||
ckb.grid(row=row, column=2, **cpadw)
|
||||
|
||||
row += 1
|
||||
lbl = tkinter.Label(gb)
|
||||
lbl["text"] = _("Username") + ":"
|
||||
lbl.grid(row=row, column=0, **cpadw)
|
||||
txt = tkinter.Entry(gb)
|
||||
txt["state"] = self.__ro
|
||||
txt["textvariable"] = self.var_username
|
||||
txt.grid(row=row, column=1, columnspan=2, **cpadw)
|
||||
|
||||
row += 1
|
||||
lbl = tkinter.Label(gb)
|
||||
lbl["text"] = _("Password") + ":"
|
||||
lbl.grid(row=row, column=0, **cpadw)
|
||||
txt = tkinter.Entry(gb)
|
||||
txt["state"] = self.__ro
|
||||
txt["textvariable"] = self.var_password
|
||||
txt.grid(row=row, column=1, columnspan=2, **cpadw)
|
||||
|
||||
row += 1
|
||||
lbl = tkinter.Label(gb)
|
||||
lbl["text"] = _("Client ID") + ":"
|
||||
lbl.grid(row=row, column=0, **cpadw)
|
||||
txt = tkinter.Entry(gb)
|
||||
txt["state"] = self.__ro
|
||||
txt["textvariable"] = self.var_client_id
|
||||
txt["width"] = 30
|
||||
txt.grid(row=row, column=1, columnspan=2, **cpadw)
|
||||
|
||||
# ############################################################
|
||||
|
||||
frame = tkinter.Frame(self)
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
frame.pack(expand=True, fill="both", pady=4)
|
||||
|
||||
# Buttons
|
||||
btn_save = tkinter.Button(frame)
|
||||
btn_save["command"] = self._save
|
||||
btn_save["state"] = self.__ro
|
||||
btn_save["text"] = _("Save")
|
||||
btn_save.grid(column=0, row=0)
|
||||
|
||||
btn_close = tkinter.Button(frame)
|
||||
btn_close["command"] = self._checkclose
|
||||
btn_close["text"] = _("Close")
|
||||
btn_close.grid(column=1, row=0)
|
||||
|
||||
def _save(self):
|
||||
u"""Übernimt die Änderungen."""
|
||||
|
||||
# TODO: Wertprüfung
|
||||
|
||||
# Wertübernahme
|
||||
self.__settings["mqttbasetopic"] = self.var_basetopic.get()
|
||||
self.__settings["mqttsendinterval"] = int(self.var_sendinterval.get())
|
||||
self.__settings["mqttsend_events"] = int(self.var_send_events.get())
|
||||
self.__settings["mqttwrite_outputs"] = \
|
||||
int(self.var_write_outputs.get())
|
||||
self.__settings["mqttbroker_address"] = self.var_broker_address.get()
|
||||
self.__settings["mqtttls_set"] = int(self.var_tls_set.get())
|
||||
self.__settings["mqttport"] = int(self.var_port.get())
|
||||
self.__settings["mqttusername"] = self.var_username.get()
|
||||
self.__settings["mqttpassword"] = self.var_password.get()
|
||||
self.__settings["mqttclient_id"] = self.var_client_id.get()
|
||||
|
||||
self._checkclose()
|
||||
|
||||
def get_settings(self):
|
||||
u"""Gibt die MQTT Konfiguration zurück.
|
||||
@return Settings als <class 'dict'>"""
|
||||
return self.__settings
|
||||
|
||||
settings = property(get_settings)
|
||||
|
||||
|
||||
# Debugging
|
||||
if __name__ == "__main__":
|
||||
dict_mqttsettings = {
|
||||
"mqttbasetopic": "revpi01",
|
||||
"mqttclient_id": "",
|
||||
"mqttbroker_address": "127.0.0.1",
|
||||
"mqttpassword": "",
|
||||
"mqttport": 1883,
|
||||
"mqttsend_events": 0,
|
||||
"mqttsendinterval": 30,
|
||||
"mqtttls_set": 0,
|
||||
"mqttusername": "",
|
||||
"mqttwrite_outputs": 0,
|
||||
}
|
||||
root = MqttManager(tkinter.Tk(), dict_mqttsettings)
|
||||
root.mainloop()
|
||||
@@ -8,6 +8,7 @@ __license__ = "GPLv3"
|
||||
import tkinter
|
||||
import tkinter.messagebox as tkmsg
|
||||
from aclmanager import AclManager
|
||||
from mqttmanager import MqttManager
|
||||
from mytools import gettrans
|
||||
|
||||
# Übersetzung laden
|
||||
@@ -32,10 +33,27 @@ class RevPiOption(tkinter.Frame):
|
||||
self.master.protocol("WM_DELETE_WINDOW", self._checkclose)
|
||||
self.pack(expand=True, fill="both")
|
||||
|
||||
self.frm_mqttmgr = None
|
||||
self.frm_slaveacl = None
|
||||
self.frm_xmlacl = None
|
||||
|
||||
# XML-RPC Server konfigurieren
|
||||
self.xmlcli = xmlcli
|
||||
self.xmlmodus = self.xmlcli.xmlmodus()
|
||||
|
||||
self._dict_mqttsettings = {
|
||||
"mqttbasetopic": "revpi01",
|
||||
"mqttclient_id": "",
|
||||
"mqttbroker_address": "127.0.0.1",
|
||||
"mqttpassword": "",
|
||||
"mqttport": 1883,
|
||||
"mqttsend_events": 0,
|
||||
"mqttsendinterval": 30,
|
||||
"mqtttls_set": 0,
|
||||
"mqttusername": "",
|
||||
"mqttwrite_outputs": 0,
|
||||
}
|
||||
|
||||
self.mrk_xmlmodask = False
|
||||
self.dorestart = False
|
||||
|
||||
@@ -61,9 +79,19 @@ class RevPiOption(tkinter.Frame):
|
||||
self.var_slaveacl.get() != self.dc.get("plcslaveacl", "") or
|
||||
self.var_mqtton.get() != self.dc.get("mqtt", 0) or
|
||||
self.var_xmlon.get() != self.dc.get("xmlrpc", 0) or
|
||||
self.var_xmlacl.get() != self.dc.get("xmlrpcacl", "")
|
||||
self.var_xmlacl.get() != self.dc.get("xmlrpcacl", "") or
|
||||
self._changesdone_mqtt()
|
||||
)
|
||||
|
||||
def _changesdone_mqtt(self):
|
||||
u"""Prüft ob MQTT-Settings geändert wurden.
|
||||
@return True, wenn Änderungen existieren"""
|
||||
for key in self._dict_mqttsettings:
|
||||
if key in self.dc:
|
||||
if self._dict_mqttsettings[key] != self.dc[key]:
|
||||
return True
|
||||
return False
|
||||
|
||||
def _checkclose(self, event=None):
|
||||
u"""Prüft ob Fenster beendet werden soll.
|
||||
@param event tkinter-Event"""
|
||||
@@ -246,7 +274,7 @@ class RevPiOption(tkinter.Frame):
|
||||
self.var_mqtton = tkinter.BooleanVar(services)
|
||||
try:
|
||||
status = self.xmlcli.mqttrunning()
|
||||
except:
|
||||
except Exception:
|
||||
pass
|
||||
else:
|
||||
row = 2
|
||||
@@ -257,7 +285,7 @@ class RevPiOption(tkinter.Frame):
|
||||
ckb_slave.grid(column=0, **cpadw)
|
||||
|
||||
btn_slaveacl = tkinter.Button(services, justify="center")
|
||||
# TODO: btn_slaveacl["command"] = self.btn_mqttsettings
|
||||
btn_slaveacl["command"] = self.btn_mqttsettings
|
||||
btn_slaveacl["text"] = _("Settings")
|
||||
btn_slaveacl.grid(column=1, row=row, **cpadwe)
|
||||
|
||||
@@ -317,7 +345,11 @@ class RevPiOption(tkinter.Frame):
|
||||
self.var_startargs.set(self.dc.get("plcarguments", ""))
|
||||
self.var_pythonver.set(self.dc.get("pythonversion", 3))
|
||||
|
||||
# MQTT Einstellungen laden
|
||||
self.var_mqtton.set(self.dc.get("mqtt", 0))
|
||||
for key in self._dict_mqttsettings:
|
||||
if key in self.dc:
|
||||
self._dict_mqttsettings[key] = self.dc[key]
|
||||
|
||||
self.var_slave.set(self.dc.get("plcslave", 0))
|
||||
self.var_slaveacl.set(self.dc.get("plcslaveacl", ""))
|
||||
@@ -361,11 +393,34 @@ class RevPiOption(tkinter.Frame):
|
||||
self.dc["zeroonerror"] = int(self.var_zerr.get())
|
||||
self.dc["zeroonexit"] = int(self.var_zexit.get())
|
||||
|
||||
# MQTT Settings
|
||||
self.dc["mqtt"] = int(self.var_mqtton.get())
|
||||
self.dc["mqttbasetopic"] = \
|
||||
self._dict_mqttsettings["mqttbasetopic"]
|
||||
self.dc["mqttclient_id"] = \
|
||||
self._dict_mqttsettings["mqttclient_id"]
|
||||
self.dc["mqttbroker_address"] = \
|
||||
self._dict_mqttsettings["mqttbroker_address"]
|
||||
self.dc["mqttpassword"] = \
|
||||
self._dict_mqttsettings["mqttpassword"]
|
||||
self.dc["mqttusername"] = \
|
||||
self._dict_mqttsettings["mqttusername"]
|
||||
self.dc["mqttport"] = \
|
||||
int(self._dict_mqttsettings["mqttport"])
|
||||
self.dc["mqttsend_events"] = \
|
||||
int(self._dict_mqttsettings["mqttsend_events"])
|
||||
self.dc["mqttsendinterval"] = \
|
||||
int(self._dict_mqttsettings["mqttsendinterval"])
|
||||
self.dc["mqtttls_set"] = \
|
||||
int(self._dict_mqttsettings["mqtttls_set"])
|
||||
self.dc["mqttwrite_outputs"] = \
|
||||
int(self._dict_mqttsettings["mqttwrite_outputs"])
|
||||
|
||||
# PLCSlave Settings
|
||||
self.dc["plcslave"] = int(self.var_slave.get())
|
||||
self.dc["plcslaveacl"] = self.var_slaveacl.get()
|
||||
|
||||
# XML Settings
|
||||
self.dc["xmlrpc"] = int(self.var_xmlon.get())
|
||||
self.dc["xmlrpcacl"] = self.var_xmlacl.get()
|
||||
|
||||
@@ -398,34 +453,46 @@ class RevPiOption(tkinter.Frame):
|
||||
if not self.mrk_xmlmodask:
|
||||
self.var_xmlon.set(True)
|
||||
|
||||
def btn_mqttsettings(self):
|
||||
u"""Öffnet Fenster für MQTT Einstellungen."""
|
||||
win = tkinter.Toplevel(self)
|
||||
win.focus_set()
|
||||
win.grab_set()
|
||||
self.frm_mqttmgr = MqttManager(
|
||||
win, self._dict_mqttsettings,
|
||||
readonly=self.xmlmodus < 4
|
||||
)
|
||||
self.wait_window(win)
|
||||
self._dict_mqttsettings = self.frm_mqttmgr.settings
|
||||
|
||||
def btn_slaveacl(self):
|
||||
u"""Öffnet Fenster für ACL-Verwaltung."""
|
||||
win = tkinter.Toplevel(self)
|
||||
win.focus_set()
|
||||
win.grab_set()
|
||||
slaveacl = AclManager(
|
||||
self.frm_slaveacl = AclManager(
|
||||
win, 0, 1,
|
||||
self.var_slaveacl.get(),
|
||||
readonly=self.xmlmodus < 4
|
||||
)
|
||||
slaveacl.acltext = {
|
||||
self.frm_slaveacl.acltext = {
|
||||
0: _("read only"),
|
||||
1: _("read and write")
|
||||
}
|
||||
self.wait_window(win)
|
||||
self.var_slaveacl.set(slaveacl.acl)
|
||||
self.var_slaveacl.set(self.frm_slaveacl.acl)
|
||||
|
||||
def btn_xmlacl(self):
|
||||
u"""Öffnet Fenster für ACL-Verwaltung."""
|
||||
win = tkinter.Toplevel(self)
|
||||
win.focus_set()
|
||||
win.grab_set()
|
||||
slaveacl = AclManager(
|
||||
self.frm_xmlacl = AclManager(
|
||||
win, 0, 4,
|
||||
self.var_xmlacl.get(),
|
||||
readonly=self.xmlmodus < 4
|
||||
)
|
||||
slaveacl.acltext = {
|
||||
self.frm_xmlacl.acltext = {
|
||||
0: _("Start/Stop PLC program and read logs"),
|
||||
1: _("+ read IOs in watch modus"),
|
||||
2: _("+ read properties and download PLC program"),
|
||||
@@ -433,4 +500,15 @@ class RevPiOption(tkinter.Frame):
|
||||
4: _("+ set properties")
|
||||
}
|
||||
self.wait_window(win)
|
||||
self.var_xmlacl.set(slaveacl.acl)
|
||||
self.var_xmlacl.set(self.frm_xmlacl.acl)
|
||||
|
||||
def destroy(self):
|
||||
u"""Beendet alle Unterfenster und sich selbst."""
|
||||
if self.frm_mqttmgr is not None:
|
||||
self.frm_mqttmgr.master.destroy()
|
||||
if self.frm_slaveacl is not None:
|
||||
self.frm_slaveacl.master.destroy()
|
||||
if self.frm_xmlacl is not None:
|
||||
self.frm_xmlacl.master.destroy()
|
||||
|
||||
super().destroy()
|
||||
|
||||
@@ -82,6 +82,7 @@ class RevPiPyControl(tkinter.Frame):
|
||||
self.tklogs.master.destroy()
|
||||
if self.tkoptions is not None:
|
||||
self.tkoptions.destroy()
|
||||
self.tkoptions.master.destroy()
|
||||
if self.tkprogram is not None:
|
||||
self.tkprogram.destroy()
|
||||
if self.debugframe is not None:
|
||||
|
||||
Reference in New Issue
Block a user