diff --git a/doc/aclmanager.html b/doc/aclmanager.html
index 8e2f07d..bd11a74 100644
--- a/doc/aclmanager.html
+++ b/doc/aclmanager.html
@@ -49,7 +49,7 @@ Methods
AclManager
-Init RevPiOption-Class.
+Init AclManger-Class.
__get_acltext
Getter fuer Leveltexte.
@@ -107,7 +107,7 @@ Static Methods
AclManager (Constructor)
AclManager (master, minlevel, maxlevel, acl_str="", readonly=False )
-Init RevPiOption-Class.
+Init AclManger-Class.
Returns:
diff --git a/doc/index.html b/doc/index.html
index 82b0367..dc4be46 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -24,6 +24,9 @@ Modules
aclmanager
+mqttmanager
+
+
mytools
Tools-Sammlung.
diff --git a/doc/mqttmanager.html b/doc/mqttmanager.html
new file mode 100644
index 0000000..0af3dfa
--- /dev/null
+++ b/doc/mqttmanager.html
@@ -0,0 +1,134 @@
+
+
+mqttmanager
+
+
+
+
+mqttmanager
+
+
+Global Attributes
+
+_ __author__ __copyright__ __license__
+
+
+Classes
+
+
+MqttManager
+Hauptfenster der MQTT-Einstellungen.
+
+
+
+Functions
+
+
+
+MqttManager
+
+Hauptfenster der MQTT-Einstellungen.
+
+
+Derived from
+tkinter.Frame
+
+Class Attributes
+
+dict_mqttsettings root settings
+
+
+Class Methods
+
+
+Methods
+
+
+Static Methods
+
+
+
+MqttManager (Constructor)
+MqttManager (master, settings, readonly=False )
+
+Init MqttManager-Class.
+
+Returns:
+
+None
+
+
+
+MqttManager._changesdone
+_changesdone ( )
+
+Prüft ob sich die Einstellungen geändert haben.
+
+Returns:
+
+True, wenn min. eine Einstellung geändert wurde
+
+
+
+MqttManager._checkclose
+_checkclose (event=None )
+
+Prüft ob Fenster beendet werden soll.
+
+event
+
+tkinter-Event
+
+
+
+MqttManager._createwidgets
+_createwidgets ( )
+
+Erstellt Widgets.
+
+
+MqttManager._save
+_save ( )
+
+Übernimt die Änderungen.
+
+
+MqttManager.get_settings
+get_settings ( )
+
+Gibt die MQTT Konfiguration zurück.
+
+Returns:
+
+Settings als
+
+
+
+
+
\ No newline at end of file
diff --git a/doc/revpioption.html b/doc/revpioption.html
index e87b5ae..0fc6641 100644
--- a/doc/revpioption.html
+++ b/doc/revpioption.html
@@ -54,6 +54,9 @@ Methods
_changesdone
Prüft ob sich die Einstellungen geändert haben.
+_changesdone_mqtt
+Prüft ob MQTT-Settings geändert wurden.
+
_checkclose
Prüft ob Fenster beendet werden soll.
@@ -72,11 +75,17 @@ Methods
askxmlon
Fragt Nuter, ob wirklicht abgeschaltet werden soll.
+btn_mqttsettings
+Öffnet Fenster für MQTT Einstellungen.
+
btn_slaveacl
Öffnet Fenster für ACL-Verwaltung.
btn_xmlacl
Öffnet Fenster für ACL-Verwaltung.
+
+destroy
+Beendet alle Unterfenster und sich selbst.
@@ -106,6 +115,17 @@ Prüft ob sich die Einstellungen geändert haben.
True, wenn min. eine Einstellung geändert wurde
+
+
+RevPiOption._changesdone_mqtt
+_changesdone_mqtt ( )
+
+Prüft ob MQTT-Settings geändert wurden.
+
+Returns:
+
+True, wenn Änderungen existieren
+
RevPiOption._checkclose
@@ -162,6 +182,12 @@ RevPiOption.askxmlon
askxmlon ( )
Fragt Nuter, ob wirklicht abgeschaltet werden soll.
+
+
+RevPiOption.btn_mqttsettings
+btn_mqttsettings ( )
+
+Öffnet Fenster für MQTT Einstellungen.
RevPiOption.btn_slaveacl
@@ -174,6 +200,12 @@ RevPiOption.btn_xmlacl
btn_xmlacl ( )
Öffnet Fenster für ACL-Verwaltung.
+
+
+RevPiOption.destroy
+destroy ( )
+
+Beendet alle Unterfenster und sich selbst.
diff --git a/eric-revpipycontrol.api b/eric-revpipycontrol.api
index d8723c2..869b6bb 100644
--- a/eric-revpipycontrol.api
+++ b/eric-revpipycontrol.api
@@ -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
diff --git a/eric-revpipycontrol.bas b/eric-revpipycontrol.bas
index b0573bb..06ea4cf 100644
--- a/eric-revpipycontrol.bas
+++ b/eric-revpipycontrol.bas
@@ -1,4 +1,5 @@
AclManager ttk.Frame
+MqttManager tkinter.Frame
RevPiCheckClient tkinter.Frame
RevPiDevelop ttk.Frame
RevPiInfo tkinter.Frame
diff --git a/revpipycontrol.e4p b/revpipycontrol.e4p
index c547970..8fd9c6f 100644
--- a/revpipycontrol.e4p
+++ b/revpipycontrol.e4p
@@ -1,7 +1,7 @@
-
+
en_US
@@ -14,6 +14,7 @@
revpipycontrol/aclmanager.py
+ revpipycontrol/mqttmanager.py
revpipycontrol/mytools.py
revpipycontrol/revpicheckclient.py
revpipycontrol/revpidevelop.py
diff --git a/revpipycontrol/aclmanager.py b/revpipycontrol/aclmanager.py
index b193753..4818ffb 100644
--- a/revpipycontrol/aclmanager.py
+++ b/revpipycontrol/aclmanager.py
@@ -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("", self._checkclose)
diff --git a/revpipycontrol/mqttmanager.py b/revpipycontrol/mqttmanager.py
new file mode 100644
index 0000000..9847489
--- /dev/null
+++ b/revpipycontrol/mqttmanager.py
@@ -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 ")
+ if not isinstance(readonly, bool):
+ raise ValueError("parameter readonly must be ")
+
+ super().__init__(master)
+ self.master.bind("", 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 """
+ 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()
diff --git a/revpipycontrol/revpioption.py b/revpipycontrol/revpioption.py
index 17938ef..899e556 100644
--- a/revpipycontrol/revpioption.py
+++ b/revpipycontrol/revpioption.py
@@ -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()
diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py
index ac37e7d..dea88e2 100755
--- a/revpipycontrol/revpipycontrol.py
+++ b/revpipycontrol/revpipycontrol.py
@@ -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: