1
0
mirror of https://github.com/naruxde/revpipycontrol.git synced 2025-11-08 23:53:52 +01:00

Optionfenster schlie?t bei destroy alle Unterfenster mit

MQTT Settings ingetriert
This commit is contained in:
2018-09-24 10:18:57 +02:00
parent df4c82579d
commit fa8fc6a7ce
11 changed files with 600 additions and 13 deletions

View File

@@ -49,7 +49,7 @@ Methods</h3>
<table> <table>
<tr> <tr>
<td><a style="color:#0000FF" href="#AclManager.__init__">AclManager</a></td> <td><a style="color:#0000FF" href="#AclManager.__init__">AclManager</a></td>
<td>Init RevPiOption-Class.</td> <td>Init AclManger-Class.</td>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="#AclManager.__get_acltext">__get_acltext</a></td> <td><a style="color:#0000FF" href="#AclManager.__get_acltext">__get_acltext</a></td>
<td>Getter fuer Leveltexte.</td> <td>Getter fuer Leveltexte.</td>
@@ -107,7 +107,7 @@ Static Methods</h3>
AclManager (Constructor)</h3> AclManager (Constructor)</h3>
<b>AclManager</b>(<i>master, minlevel, maxlevel, acl_str="", readonly=False</i>) <b>AclManager</b>(<i>master, minlevel, maxlevel, acl_str="", readonly=False</i>)
<p> <p>
Init RevPiOption-Class. Init AclManger-Class.
</p><dl> </p><dl>
<dt>Returns:</dt> <dt>Returns:</dt>
<dd> <dd>

View File

@@ -24,6 +24,9 @@ Modules</h3>
<td><a style="color:#0000FF" href="aclmanager.html">aclmanager</a></td> <td><a style="color:#0000FF" href="aclmanager.html">aclmanager</a></td>
<td></td> <td></td>
</tr><tr> </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><a style="color:#0000FF" href="mytools.html">mytools</a></td>
<td>Tools-Sammlung.</td> <td>Tools-Sammlung.</td>
</tr><tr> </tr><tr>

134
doc/mqttmanager.html Normal file
View 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&#252;ft ob sich die Einstellungen ge&#228;ndert haben.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#MqttManager._checkclose">_checkclose</a></td>
<td>Pr&#252;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>&#220;bernimt die &#196;nderungen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#MqttManager.get_settings">get_settings</a></td>
<td>Gibt die MQTT Konfiguration zur&#252;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&#252;ft ob sich die Einstellungen ge&#228;ndert haben.
</p><dl>
<dt>Returns:</dt>
<dd>
True, wenn min. eine Einstellung ge&#228;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&#252;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>
&#220;bernimt die &#196;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&#252;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>

View File

@@ -54,6 +54,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#RevPiOption._changesdone">_changesdone</a></td> <td><a style="color:#0000FF" href="#RevPiOption._changesdone">_changesdone</a></td>
<td>Pr&#252;ft ob sich die Einstellungen ge&#228;ndert haben.</td> <td>Pr&#252;ft ob sich die Einstellungen ge&#228;ndert haben.</td>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._changesdone_mqtt">_changesdone_mqtt</a></td>
<td>Pr&#252;ft ob MQTT-Settings ge&#228;ndert wurden.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._checkclose">_checkclose</a></td> <td><a style="color:#0000FF" href="#RevPiOption._checkclose">_checkclose</a></td>
<td>Pr&#252;ft ob Fenster beendet werden soll.</td> <td>Pr&#252;ft ob Fenster beendet werden soll.</td>
</tr><tr> </tr><tr>
@@ -72,11 +75,17 @@ Methods</h3>
<td><a style="color:#0000FF" href="#RevPiOption.askxmlon">askxmlon</a></td> <td><a style="color:#0000FF" href="#RevPiOption.askxmlon">askxmlon</a></td>
<td>Fragt Nuter, ob wirklicht abgeschaltet werden soll.</td> <td>Fragt Nuter, ob wirklicht abgeschaltet werden soll.</td>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption.btn_mqttsettings">btn_mqttsettings</a></td>
<td>&#214;ffnet Fenster f&#252;r MQTT Einstellungen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption.btn_slaveacl">btn_slaveacl</a></td> <td><a style="color:#0000FF" href="#RevPiOption.btn_slaveacl">btn_slaveacl</a></td>
<td>&#214;ffnet Fenster f&#252;r ACL-Verwaltung.</td> <td>&#214;ffnet Fenster f&#252;r ACL-Verwaltung.</td>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption.btn_xmlacl">btn_xmlacl</a></td> <td><a style="color:#0000FF" href="#RevPiOption.btn_xmlacl">btn_xmlacl</a></td>
<td>&#214;ffnet Fenster f&#252;r ACL-Verwaltung.</td> <td>&#214;ffnet Fenster f&#252;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> </tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
@@ -106,6 +115,17 @@ Pr&#252;ft ob sich die Einstellungen ge&#228;ndert haben.
<dd> <dd>
True, wenn min. eine Einstellung ge&#228;ndert wurde True, wenn min. eine Einstellung ge&#228;ndert wurde
</dd> </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&#252;ft ob MQTT-Settings ge&#228;ndert wurden.
</p><dl>
<dt>Returns:</dt>
<dd>
True, wenn &#196;nderungen existieren
</dd>
</dl><a NAME="RevPiOption._checkclose" ID="RevPiOption._checkclose"></a> </dl><a NAME="RevPiOption._checkclose" ID="RevPiOption._checkclose"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._checkclose</h3> RevPiOption._checkclose</h3>
@@ -162,6 +182,12 @@ RevPiOption.askxmlon</h3>
<b>askxmlon</b>(<i></i>) <b>askxmlon</b>(<i></i>)
<p> <p>
Fragt Nuter, ob wirklicht abgeschaltet werden soll. 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>
&#214;ffnet Fenster f&#252;r MQTT Einstellungen.
</p><a NAME="RevPiOption.btn_slaveacl" ID="RevPiOption.btn_slaveacl"></a> </p><a NAME="RevPiOption.btn_slaveacl" ID="RevPiOption.btn_slaveacl"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption.btn_slaveacl</h3> RevPiOption.btn_slaveacl</h3>
@@ -174,6 +200,12 @@ RevPiOption.btn_xmlacl</h3>
<b>btn_xmlacl</b>(<i></i>) <b>btn_xmlacl</b>(<i></i>)
<p> <p>
&#214;ffnet Fenster f&#252;r ACL-Verwaltung. &#214;ffnet Fenster f&#252;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> </p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div> <div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /> <hr />

View File

@@ -21,6 +21,19 @@ aclmanager._?8
aclmanager.__author__?9 aclmanager.__author__?9
aclmanager.__copyright__?9 aclmanager.__copyright__?9
aclmanager.__license__?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.__author__?9
mytools.__copyright__?9 mytools.__copyright__?9
mytools.__license__?9 mytools.__license__?9
@@ -104,14 +117,17 @@ revpilogfile.__author__?9
revpilogfile.__copyright__?9 revpilogfile.__copyright__?9
revpilogfile.__license__?9 revpilogfile.__license__?9
revpioption.RevPiOption._changesdone?5() revpioption.RevPiOption._changesdone?5()
revpioption.RevPiOption._changesdone_mqtt?5()
revpioption.RevPiOption._checkclose?5(event=None) revpioption.RevPiOption._checkclose?5(event=None)
revpioption.RevPiOption._checkvalues?5() revpioption.RevPiOption._checkvalues?5()
revpioption.RevPiOption._createwidgets?5() revpioption.RevPiOption._createwidgets?5()
revpioption.RevPiOption._loadappdata?5(refresh=False) revpioption.RevPiOption._loadappdata?5(refresh=False)
revpioption.RevPiOption._setappdata?5() revpioption.RevPiOption._setappdata?5()
revpioption.RevPiOption.askxmlon?4() revpioption.RevPiOption.askxmlon?4()
revpioption.RevPiOption.btn_mqttsettings?4()
revpioption.RevPiOption.btn_slaveacl?4() revpioption.RevPiOption.btn_slaveacl?4()
revpioption.RevPiOption.btn_xmlacl?4() revpioption.RevPiOption.btn_xmlacl?4()
revpioption.RevPiOption.destroy?4()
revpioption.RevPiOption?1(master, xmlcli) revpioption.RevPiOption?1(master, xmlcli)
revpioption._?8 revpioption._?8
revpioption.__author__?9 revpioption.__author__?9

View File

@@ -1,4 +1,5 @@
AclManager ttk.Frame AclManager ttk.Frame
MqttManager tkinter.Frame
RevPiCheckClient tkinter.Frame RevPiCheckClient tkinter.Frame
RevPiDevelop ttk.Frame RevPiDevelop ttk.Frame
RevPiInfo tkinter.Frame RevPiInfo tkinter.Frame

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-5.1.dtd"> <!DOCTYPE Project SYSTEM "Project-5.1.dtd">
<!-- eric project file for project revpipycontrol --> <!-- 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 --> <!-- Copyright (C) 2018 Sven Sager, akira@narux.de -->
<Project version="5.1"> <Project version="5.1">
<Language>en_US</Language> <Language>en_US</Language>
@@ -14,6 +14,7 @@
<Eol index="1"/> <Eol index="1"/>
<Sources> <Sources>
<Source>revpipycontrol/aclmanager.py</Source> <Source>revpipycontrol/aclmanager.py</Source>
<Source>revpipycontrol/mqttmanager.py</Source>
<Source>revpipycontrol/mytools.py</Source> <Source>revpipycontrol/mytools.py</Source>
<Source>revpipycontrol/revpicheckclient.py</Source> <Source>revpipycontrol/revpicheckclient.py</Source>
<Source>revpipycontrol/revpidevelop.py</Source> <Source>revpipycontrol/revpidevelop.py</Source>

View File

@@ -20,7 +20,7 @@ class AclManager(ttk.Frame):
u"""Hauptfenster des ACL-Managers.""" u"""Hauptfenster des ACL-Managers."""
def __init__(self, master, minlevel, maxlevel, acl_str="", readonly=False): def __init__(self, master, minlevel, maxlevel, acl_str="", readonly=False):
u"""Init RevPiOption-Class. u"""Init AclManger-Class.
@return None""" @return None"""
super().__init__(master) super().__init__(master)
self.master.bind("<KeyPress-Escape>", self._checkclose) self.master.bind("<KeyPress-Escape>", self._checkclose)

View 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()

View File

@@ -8,6 +8,7 @@ __license__ = "GPLv3"
import tkinter import tkinter
import tkinter.messagebox as tkmsg import tkinter.messagebox as tkmsg
from aclmanager import AclManager from aclmanager import AclManager
from mqttmanager import MqttManager
from mytools import gettrans from mytools import gettrans
# Übersetzung laden # Übersetzung laden
@@ -32,10 +33,27 @@ class RevPiOption(tkinter.Frame):
self.master.protocol("WM_DELETE_WINDOW", self._checkclose) self.master.protocol("WM_DELETE_WINDOW", self._checkclose)
self.pack(expand=True, fill="both") self.pack(expand=True, fill="both")
self.frm_mqttmgr = None
self.frm_slaveacl = None
self.frm_xmlacl = None
# XML-RPC Server konfigurieren # XML-RPC Server konfigurieren
self.xmlcli = xmlcli self.xmlcli = xmlcli
self.xmlmodus = self.xmlcli.xmlmodus() 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.mrk_xmlmodask = False
self.dorestart = False self.dorestart = False
@@ -61,9 +79,19 @@ class RevPiOption(tkinter.Frame):
self.var_slaveacl.get() != self.dc.get("plcslaveacl", "") or self.var_slaveacl.get() != self.dc.get("plcslaveacl", "") or
self.var_mqtton.get() != self.dc.get("mqtt", 0) or self.var_mqtton.get() != self.dc.get("mqtt", 0) or
self.var_xmlon.get() != self.dc.get("xmlrpc", 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): def _checkclose(self, event=None):
u"""Prüft ob Fenster beendet werden soll. u"""Prüft ob Fenster beendet werden soll.
@param event tkinter-Event""" @param event tkinter-Event"""
@@ -246,7 +274,7 @@ class RevPiOption(tkinter.Frame):
self.var_mqtton = tkinter.BooleanVar(services) self.var_mqtton = tkinter.BooleanVar(services)
try: try:
status = self.xmlcli.mqttrunning() status = self.xmlcli.mqttrunning()
except: except Exception:
pass pass
else: else:
row = 2 row = 2
@@ -257,7 +285,7 @@ class RevPiOption(tkinter.Frame):
ckb_slave.grid(column=0, **cpadw) ckb_slave.grid(column=0, **cpadw)
btn_slaveacl = tkinter.Button(services, justify="center") 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["text"] = _("Settings")
btn_slaveacl.grid(column=1, row=row, **cpadwe) 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_startargs.set(self.dc.get("plcarguments", ""))
self.var_pythonver.set(self.dc.get("pythonversion", 3)) self.var_pythonver.set(self.dc.get("pythonversion", 3))
# MQTT Einstellungen laden
self.var_mqtton.set(self.dc.get("mqtt", 0)) 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_slave.set(self.dc.get("plcslave", 0))
self.var_slaveacl.set(self.dc.get("plcslaveacl", "")) 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["zeroonerror"] = int(self.var_zerr.get())
self.dc["zeroonexit"] = int(self.var_zexit.get()) self.dc["zeroonexit"] = int(self.var_zexit.get())
# MQTT Settings
self.dc["mqtt"] = int(self.var_mqtton.get()) 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["plcslave"] = int(self.var_slave.get())
self.dc["plcslaveacl"] = self.var_slaveacl.get() self.dc["plcslaveacl"] = self.var_slaveacl.get()
# XML Settings
self.dc["xmlrpc"] = int(self.var_xmlon.get()) self.dc["xmlrpc"] = int(self.var_xmlon.get())
self.dc["xmlrpcacl"] = self.var_xmlacl.get() self.dc["xmlrpcacl"] = self.var_xmlacl.get()
@@ -398,34 +453,46 @@ class RevPiOption(tkinter.Frame):
if not self.mrk_xmlmodask: if not self.mrk_xmlmodask:
self.var_xmlon.set(True) 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): def btn_slaveacl(self):
u"""Öffnet Fenster für ACL-Verwaltung.""" u"""Öffnet Fenster für ACL-Verwaltung."""
win = tkinter.Toplevel(self) win = tkinter.Toplevel(self)
win.focus_set() win.focus_set()
win.grab_set() win.grab_set()
slaveacl = AclManager( self.frm_slaveacl = AclManager(
win, 0, 1, win, 0, 1,
self.var_slaveacl.get(), self.var_slaveacl.get(),
readonly=self.xmlmodus < 4 readonly=self.xmlmodus < 4
) )
slaveacl.acltext = { self.frm_slaveacl.acltext = {
0: _("read only"), 0: _("read only"),
1: _("read and write") 1: _("read and write")
} }
self.wait_window(win) self.wait_window(win)
self.var_slaveacl.set(slaveacl.acl) self.var_slaveacl.set(self.frm_slaveacl.acl)
def btn_xmlacl(self): def btn_xmlacl(self):
u"""Öffnet Fenster für ACL-Verwaltung.""" u"""Öffnet Fenster für ACL-Verwaltung."""
win = tkinter.Toplevel(self) win = tkinter.Toplevel(self)
win.focus_set() win.focus_set()
win.grab_set() win.grab_set()
slaveacl = AclManager( self.frm_xmlacl = AclManager(
win, 0, 4, win, 0, 4,
self.var_xmlacl.get(), self.var_xmlacl.get(),
readonly=self.xmlmodus < 4 readonly=self.xmlmodus < 4
) )
slaveacl.acltext = { self.frm_xmlacl.acltext = {
0: _("Start/Stop PLC program and read logs"), 0: _("Start/Stop PLC program and read logs"),
1: _("+ read IOs in watch modus"), 1: _("+ read IOs in watch modus"),
2: _("+ read properties and download PLC program"), 2: _("+ read properties and download PLC program"),
@@ -433,4 +500,15 @@ class RevPiOption(tkinter.Frame):
4: _("+ set properties") 4: _("+ set properties")
} }
self.wait_window(win) 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()

View File

@@ -82,6 +82,7 @@ class RevPiPyControl(tkinter.Frame):
self.tklogs.master.destroy() self.tklogs.master.destroy()
if self.tkoptions is not None: if self.tkoptions is not None:
self.tkoptions.destroy() self.tkoptions.destroy()
self.tkoptions.master.destroy()
if self.tkprogram is not None: if self.tkprogram is not None:
self.tkprogram.destroy() self.tkprogram.destroy()
if self.debugframe is not None: if self.debugframe is not None: