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

36 Commits

Author SHA1 Message Date
7939f193da Next release 2020-06-25 13:38:30 +02:00
d7d1aa2194 Code cleanup 2020-06-25 13:36:56 +02:00
5dde6e2705 Removed cx_Freeze from setup.py - we use pyinstaller 2020-06-25 13:03:09 +02:00
8a6d1ebca8 Fixed message on missing piCtory config, add button to open piCtory in browser 2020-06-23 10:35:35 +02:00
e828c1f55a Switched VCS and IDE
Switched from Mercurial to GIT
Switched from eric6 to pyCharm
2019-10-20 17:27:11 +02:00
84f52cb17a Etikett 0.8.0 zum ?nderungssatz 51975a0718e3 hinzugef?gt 2019-09-16 21:19:31 +02:00
93e02df73e Style in Devices bei Watch-Mode verbessert
?bersetzungen
linux und mac haben selbe setup.py Einstellungen
2019-09-16 21:17:19 +02:00
63f60f9e36 Mit procimgserver zusammenf?hren 2019-09-16 10:47:48 +02:00
34f133ea6e Konfiguration plcworkdir_set_uid in Optionen integriert
Konfiguraiton replace_ios in Optionen integriert
Dropdownliste f?r forkonfigurierten Pfad von replace_ios eingebaut
2019-09-16 10:45:39 +02:00
472605bb38 Watchmode wertet nun auch byteorder und signed aus 2019-09-15 22:17:06 +02:00
79ea020903 Etikett 0.7.2 zum ?nderungssatz be20c934030f hinzugef?gt 2019-07-01 11:15:49 +02:00
7b61dee1c6 Fehler bei leerem Programmverzeichnis auf dem RevPi 2019-07-01 11:13:51 +02:00
f1163f2e3f added LICENSE.txt 2019-06-10 16:01:21 +02:00
5812dba69d Etikett 0.7.1 zum ?nderungssatz 278fcf116237 hinzugef?gt 2018-10-07 12:13:42 +02:00
7e9afd0944 Etikett 0.7.1 gel?scht 2018-10-07 12:13:34 +02:00
79c737ea2f Im Entwirckler einen "Nur hochladen" Button eingebaut
?bersetzung
2018-10-07 12:13:17 +02:00
55c1349edf Etikett 0.7.1 zum ?nderungssatz d6da987846e1 hinzugef?gt 2018-10-07 12:11:56 +02:00
df308600c2 Mit mqtt zusammenf?hren 2018-10-07 12:01:46 +02:00
fb88271364 setting mqttsend_events zu mqttsend_on_event ge?ndert
?bersetzung
2018-10-07 12:01:23 +02:00
fa8fc6a7ce Optionfenster schlie?t bei destroy alle Unterfenster mit
MQTT Settings ingetriert
2018-09-24 10:18:57 +02:00
df4c82579d Mit default zusammenf?hren 2018-09-03 12:25:08 +02:00
220de03774 Programme auf RevPi sortiert anzeigen 2018-09-03 12:20:18 +02:00
f2dd6416ea Watch-Mode IO-Name und IO-Value Seiten getauscht
?bersetzung
Mit develop zusammenf?hren
2018-08-14 09:22:21 +02:00
7d3957a9d1 Fehlerabfang f?r Watch-Mode verbessert 2018-08-14 08:53:56 +02:00
ef912fa907 ?bersetzungen 2018-08-12 17:07:32 +02:00
0fc9af633c Dateiliste sortiert ausgeben
New code style
2018-08-12 16:57:08 +02:00
1d9c28d48b ?bersetzungen 2018-08-02 14:55:01 +02:00
554f19d090 Developer als Frame zu Hauptfenster gelegt
Sockettimeout auf 6 Sekunden ver?ndert
2018-08-02 14:17:07 +02:00
e42cc1a6d2 Wenn Ordner ?bertragen werden soll, wird dieser auch auf RevPi angelegt
Developer-Dialog begonnen
2018-07-31 18:36:12 +02:00
6c2578f84c Etikett 0.6.2 zum ?nderungssatz 995b947a4cc0 hinzugef?gt 2018-06-27 12:45:30 +02:00
37e6dd6a75 Voreinstellungen vom Programmfenster werden wieder ?bernommen 2018-06-27 08:55:49 +02:00
348ef65716 Diensteinstellungen f?r MQTT Publisher in Optionen eingebaut 2018-05-25 08:23:43 +02:00
6ac9466850 Etikett 0.6.1 zum ?nderungssatz 6d55e403b528 hinzugef?gt 2018-04-07 15:18:31 +02:00
56cf5a7b09 Fehlermeldung angepasst, wenn ACL f?r Verbindungs-IP nicht gesetzt ist 2018-04-07 14:57:04 +02:00
3c05f9f024 Umbau f?r make_py Script
msg-Fenster hatte falschen parent
2018-04-07 14:34:49 +02:00
2751a2bd35 Mit revpislave zusammenf?hren 2018-04-07 14:04:35 +02:00
63 changed files with 2362 additions and 3526 deletions

118
.gitignore vendored Normal file
View File

@@ -0,0 +1,118 @@
# ---> Python
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
/test/
/make.conf

View File

@@ -1,9 +0,0 @@
syntax: glob
*.pyc
deb_dist/*
dist/*
revpipycontrol.egg-info/*
deb/*
.eric6project/*
*.directory
*.mo

17
.idea/$CACHE_FILE$ generated Normal file
View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectInspectionProfilesVisibleTreeState">
<entry key="Project Default">
<profile-state>
<expanded-state>
<State />
</expanded-state>
<selected-state>
<State>
<id>Angular</id>
</State>
</selected-state>
</profile-state>
</entry>
</component>
</project>

2
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,2 @@
# Default ignored files
/workspace.xml

7
.idea/dictionaries/akira.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<component name="ProjectDictionaryState">
<dictionary name="akira">
<words>
<w>revpipycontrol</w>
</words>
</dictionary>
</component>

View File

@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

7
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/revpipycontrol.iml" filepath="$PROJECT_DIR$/.idea/revpipycontrol.iml" />
</modules>
</component>
</project>

12
.idea/revpipycontrol.iml generated Normal file
View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/revpipycontrol" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/dist" />
<excludeFolder url="file://$MODULE_DIR$/downloads" />
</content>
<orderEntry type="jdk" jdkName="Python 3.6" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

165
LICENSE.txt Normal file
View File

@@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

View File

@@ -3,3 +3,4 @@ include stdeb.cfg
recursive-include data *
recursive-include revpipycontrol *
global-exclude *.pyc
include LICENSE.txt

View File

@@ -1,256 +0,0 @@
<!DOCTYPE html>
<html><head>
<title>aclmanager</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">
aclmanager</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>_</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#AclManager">AclManager</a></td>
<td>Hauptfenster des ACL-Managers.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="AclManager" ID="AclManager"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">AclManager</h2>
<p>
Hauptfenster des ACL-Managers.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
ttk.Frame
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>acl</td></tr><tr><td>acltext</td></tr><tr><td>root</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="#AclManager.__init__">AclManager</a></td>
<td>Init RevPiOption-Class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#AclManager.__get_acltext">__get_acltext</a></td>
<td>Getter fuer Leveltexte.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#AclManager.__set_acltext">__set_acltext</a></td>
<td>Setter fuer Leveltexte.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#AclManager._ask_delete">_ask_delete</a></td>
<td>L&#246;scht ein Eintrag der Liste.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#AclManager._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="#AclManager._checkback">_checkback</a></td>
<td>Springt bei Backspace in vorheriges Feld.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#AclManager._checkclose">_checkclose</a></td>
<td>Pr&#252;ft ob Fenster beendet werden soll.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#AclManager._checkdot">_checkdot</a></td>
<td>Pr&#252;ft auf .</td>
</tr><tr>
<td><a style="color:#0000FF" href="#AclManager._clearfields">_clearfields</a></td>
<td>Leert die Eingabefelder.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#AclManager._createwidgets">_createwidgets</a></td>
<td>Erstellt Widgets.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#AclManager._loadfields">_loadfields</a></td>
<td>&#220;bernimmt Listeneintrag in Editfelder.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#AclManager._refreshacls">_refreshacls</a></td>
<td>Leert die ACL Liste und f&#252;llt sie neu.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#AclManager._save">_save</a></td>
<td>&#220;bernimt die &#196;nderungen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#AclManager._savefields">_savefields</a></td>
<td>&#220;bernimmt neuen ACL Eintrag.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#AclManager._status_editremove">_status_editremove</a></td>
<td>Setzt state der Buttons.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#AclManager.get_acl">get_acl</a></td>
<td>Gibt die Konfigurierten ACL 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="AclManager.__init__" ID="AclManager.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager (Constructor)</h3>
<b>AclManager</b>(<i>master, minlevel, maxlevel, acl_str="", readonly=False</i>)
<p>
Init RevPiOption-Class.
</p><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="AclManager.__get_acltext" ID="AclManager.__get_acltext"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager.__get_acltext</h3>
<b>__get_acltext</b>(<i></i>)
<p>
Getter fuer Leveltexte.
</p><dl>
<dt>Returns:</dt>
<dd>
Leveltexte als <class 'dict'>
</dd>
</dl><a NAME="AclManager.__set_acltext" ID="AclManager.__set_acltext"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager.__set_acltext</h3>
<b>__set_acltext</b>(<i>value</i>)
<p>
Setter fuer Leveltexte.
</p><dl>
<dt><i>value</i></dt>
<dd>
Leveltexte als <class 'dict'>
</dd>
</dl><a NAME="AclManager._ask_delete" ID="AclManager._ask_delete"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager._ask_delete</h3>
<b>_ask_delete</b>(<i></i>)
<p>
L&#246;scht ein Eintrag der Liste.
</p><a NAME="AclManager._changesdone" ID="AclManager._changesdone"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager._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="AclManager._checkback" ID="AclManager._checkback"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager._checkback</h3>
<b>_checkback</b>(<i>event, tkvar, pretxt</i>)
<p>
Springt bei Backspace in vorheriges Feld.
</p><dl>
<dt><i>event</i></dt>
<dd>
TK Event
</dd><dt><i>tkvar</i></dt>
<dd>
TK Variable zum pr&#252;fen
</dd><dt><i>nexttxt</i></dt>
<dd>
Vorheriges IP Feld f&#252;r Fokus
</dd>
</dl><a NAME="AclManager._checkclose" ID="AclManager._checkclose"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager._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="AclManager._checkdot" ID="AclManager._checkdot"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager._checkdot</h3>
<b>_checkdot</b>(<i>event, tkvar, nexttxt</i>)
<p>
Pr&#252;ft auf . und geht weiter.
</p><dl>
<dt><i>event</i></dt>
<dd>
TK Event
</dd><dt><i>tkvar</i></dt>
<dd>
TK Variable zum pr&#252;fen
</dd><dt><i>nexttxt</i></dt>
<dd>
N&#228;chstes IP Feld f&#252;r Fokus
</dd>
</dl><a NAME="AclManager._clearfields" ID="AclManager._clearfields"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager._clearfields</h3>
<b>_clearfields</b>(<i></i>)
<p>
Leert die Eingabefelder.
</p><a NAME="AclManager._createwidgets" ID="AclManager._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<p>
Erstellt Widgets.
</p><a NAME="AclManager._loadfields" ID="AclManager._loadfields"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager._loadfields</h3>
<b>_loadfields</b>(<i></i>)
<p>
&#220;bernimmt Listeneintrag in Editfelder.
</p><a NAME="AclManager._refreshacls" ID="AclManager._refreshacls"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager._refreshacls</h3>
<b>_refreshacls</b>(<i></i>)
<p>
Leert die ACL Liste und f&#252;llt sie neu.
</p><a NAME="AclManager._save" ID="AclManager._save"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager._save</h3>
<b>_save</b>(<i></i>)
<p>
&#220;bernimt die &#196;nderungen.
</p><a NAME="AclManager._savefields" ID="AclManager._savefields"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager._savefields</h3>
<b>_savefields</b>(<i></i>)
<p>
&#220;bernimmt neuen ACL Eintrag.
</p><a NAME="AclManager._status_editremove" ID="AclManager._status_editremove"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager._status_editremove</h3>
<b>_status_editremove</b>(<i>tkevt</i>)
<p>
Setzt state der Buttons.
</p><a NAME="AclManager.get_acl" ID="AclManager.get_acl"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
AclManager.get_acl</h3>
<b>get_acl</b>(<i></i>)
<p>
Gibt die Konfigurierten ACL zur&#252;ck.
</p><dl>
<dt>Returns:</dt>
<dd>
ACL als <class 'str'>
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -1,20 +0,0 @@
<!DOCTYPE html>
<html><head>
<title>revpipycontrol.shared</title>
<meta charset="UTF-8">
</head>
<body style="background-color:#FFFFFF;color:#000000">
<h1 style="background-color:#FFFFFF;color:#0000FF">
revpipycontrol.shared</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Modules</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="revpipycontrol.shared.ipaclmanager.html">ipaclmanager</a></td>
<td>Verwaltet IP Adressen und deren ACLs.</td>
</tr>
</table>
</body></html>

View File

@@ -1,55 +0,0 @@
<!DOCTYPE html>
<html><head>
<title>Table of contents</title>
<meta charset="UTF-8">
</head>
<body style="background-color:#FFFFFF;color:#000000">
<h1 style="background-color:#FFFFFF;color:#0000FF">
Table of contents</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Packages</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="index-revpipycontrol.shared.html">shared</a></td>
<td></td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Modules</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="aclmanager.html">aclmanager</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="mytools.html">mytools</a></td>
<td>Tools-Sammlung.</td>
</tr><tr>
<td><a style="color:#0000FF" href="revpicheckclient.html">revpicheckclient</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="revpiinfo.html">revpiinfo</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="revpilegacy.html">revpilegacy</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="revpilogfile.html">revpilogfile</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="revpioption.html">revpioption</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="revpiplclist.html">revpiplclist</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="revpiprogram.html">revpiprogram</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="revpipycontrol.html">revpipycontrol</a></td>
<td></td>
</tr>
</table>
</body></html>

View File

@@ -1,73 +0,0 @@
<!DOCTYPE html>
<html><head>
<title>mytools</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">
mytools</h1>
<p>
Tools-Sammlung.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>savefile_connections</td></tr><tr><td>savefile_programpath</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#addroot">addroot</a></td>
<td>H&#228;ngt root-dir der Anwendung vor Dateinamen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#gettrans">gettrans</a></td>
<td>Wertet die Sprache des OS aus und gibt &#220;bersetzung zur&#252;ck.</td>
</tr>
</table>
<hr /><hr />
<a NAME="addroot" ID="addroot"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">addroot</h2>
<b>addroot</b>(<i>filename</i>)
<p>
H&#228;ngt root-dir der Anwendung vor Dateinamen.
</p><p>
Je nach Ausf&#252;hrungsart der Anwendung muss das root-dir &#252;ber
andere Arten abgerufen werden.
</p><dl>
<dt><i>filename</i></dt>
<dd>
Datei oder Ordnername
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
root dir
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="gettrans" ID="gettrans"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">gettrans</h2>
<b>gettrans</b>(<i>proglang=None</i>)
<p>
Wertet die Sprache des OS aus und gibt &#220;bersetzung zur&#252;ck.
</p><dl>
<dt><i>proglang</i></dt>
<dd>
Bestimmte Sprache laden
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
gettext &#220;bersetzung f&#252;r Zuweisung an '_'
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -1,315 +0,0 @@
<!DOCTYPE html>
<html><head>
<title>revpicheckclient</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">
revpicheckclient</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>_</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient">RevPiCheckClient</a></td>
<td>Baut Fenstererweiterung f&#252;r 'watch modus'.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="RevPiCheckClient" ID="RevPiCheckClient"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiCheckClient</h2>
<p>
Baut Fenstererweiterung f&#252;r 'watch modus'.
</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>None</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="#RevPiCheckClient.__init__">RevPiCheckClient</a></td>
<td>Instantiiert MyApp-Klasse.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.__chval">__chval</a></td>
<td>Schreibt neuen Output Wert auf den RevPi.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.__hidewin">__hidewin</a></td>
<td>Verbergt &#252;bergebenes Fenster.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.__saveoldvalue">__saveoldvalue</a></td>
<td>Speichert bei Keypress aktuellen Wert f&#252;r wiederherstellung.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.__showwin">__showwin</a></td>
<td>Zeigt oder verbergt &#252;bergebenes Fenster.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.__spinboxkey">__spinboxkey</a></td>
<td>Pr&#252;ft die Eingabe auf plausibilit&#228;t.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient._createiogroup">_createiogroup</a></td>
<td>Erstellt IO-Gruppen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient._createwidgets">_createwidgets</a></td>
<td>Erstellt den Fensterinhalt.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient._onfrmconf">_onfrmconf</a></td>
<td>Erstellt Fenster in einem Canvas.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient._warnwrite">_warnwrite</a></td>
<td>Warnung f&#252;r Benutzer &#252;ber Schreibfunktion einmal fragen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient._workvalues">_workvalues</a></td>
<td>Alle Werte der Inputs und Outputs abrufen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.hideallwindows">hideallwindows</a></td>
<td>Versteckt alle Fenster.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.maxint">maxint</a></td>
<td>Errechnet maximalen int() Wert f&#252;r Bytes max 22.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.readvalues">readvalues</a></td>
<td>Ruft nur Input Werte von RevPi ab und aktualisiert Fenster.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.refreshvalues">refreshvalues</a></td>
<td>Ruft alle IO Werte von RevPi ab und aktualisiert Fenster.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.tmr_workvalues">tmr_workvalues</a></td>
<td>Timer f&#252;r zyklische Abfrage.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.toggleauto">toggleauto</a></td>
<td>Schaltet zwischen Autorefresh um und aktualisiert Widgets.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.togglewrite">togglewrite</a></td>
<td>Schaltet zwischen DoWrite um und aktiviert Schreibfunktion.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.validatereturn">validatereturn</a></td>
<td>&#220;berpr&#252;ft die R&#252;ckgaben der setvalue Funktion.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.writevalues">writevalues</a></td>
<td>Schreibt ge&#228;nderte Outputs auf den RevPi.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiCheckClient.__init__" ID="RevPiCheckClient.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient (Constructor)</h3>
<b>RevPiCheckClient</b>(<i>master, xmlcli, xmlmode=0</i>)
<p>
Instantiiert MyApp-Klasse.
</p><a NAME="RevPiCheckClient.__chval" ID="RevPiCheckClient.__chval"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.__chval</h3>
<b>__chval</b>(<i>device, io, event=None</i>)
<p>
Schreibt neuen Output Wert auf den RevPi.
</p><a NAME="RevPiCheckClient.__hidewin" ID="RevPiCheckClient.__hidewin"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.__hidewin</h3>
<b>__hidewin</b>(<i>win, event=None</i>)
<p>
Verbergt &#252;bergebenes Fenster.
</p><dl>
<dt><i>win</i></dt>
<dd>
Fenster zum verbergen
</dd><dt><i>event</i></dt>
<dd>
Tkinter Event
</dd>
</dl><a NAME="RevPiCheckClient.__saveoldvalue" ID="RevPiCheckClient.__saveoldvalue"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.__saveoldvalue</h3>
<b>__saveoldvalue</b>(<i>event, tkvar</i>)
<p>
Speichert bei Keypress aktuellen Wert f&#252;r wiederherstellung.
</p><a NAME="RevPiCheckClient.__showwin" ID="RevPiCheckClient.__showwin"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.__showwin</h3>
<b>__showwin</b>(<i>win</i>)
<p>
Zeigt oder verbergt &#252;bergebenes Fenster.
</p><dl>
<dt><i>win</i></dt>
<dd>
Fenster zum anzeigen/verbergen
</dd>
</dl><a NAME="RevPiCheckClient.__spinboxkey" ID="RevPiCheckClient.__spinboxkey"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.__spinboxkey</h3>
<b>__spinboxkey</b>(<i>device, io, event=None</i>)
<p>
Pr&#252;ft die Eingabe auf plausibilit&#228;t.
</p><dl>
<dt><i>event</i></dt>
<dd>
tkinter Event
</dd><dt><i>io</i></dt>
<dd>
IO Liste mit tkinter Variable
</dd>
</dl><a NAME="RevPiCheckClient._createiogroup" ID="RevPiCheckClient._createiogroup"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient._createiogroup</h3>
<b>_createiogroup</b>(<i>device, frame, iotype</i>)
<p>
Erstellt IO-Gruppen.
</p><dl>
<dt><i>device</i></dt>
<dd>
Deviceposition
</dd><dt><i>frame</i></dt>
<dd>
tkinter Frame
</dd><dt><i>iotype</i></dt>
<dd>
'inp' oder 'out' als str()
</dd>
</dl><a NAME="RevPiCheckClient._createwidgets" ID="RevPiCheckClient._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<p>
Erstellt den Fensterinhalt.
</p><a NAME="RevPiCheckClient._onfrmconf" ID="RevPiCheckClient._onfrmconf"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient._onfrmconf</h3>
<b>_onfrmconf</b>(<i>canvas</i>)
<p>
Erstellt Fenster in einem Canvas.
</p><dl>
<dt><i>canvas</i></dt>
<dd>
Canvas in dem Objekte erstellt werden sollen
</dd>
</dl><a NAME="RevPiCheckClient._warnwrite" ID="RevPiCheckClient._warnwrite"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient._warnwrite</h3>
<b>_warnwrite</b>(<i></i>)
<p>
Warnung f&#252;r Benutzer &#252;ber Schreibfunktion einmal fragen.
</p><dl>
<dt>Returns:</dt>
<dd>
True, wenn Warnung einmal mit OK best&#228;tigt wurde
</dd>
</dl><a NAME="RevPiCheckClient._workvalues" ID="RevPiCheckClient._workvalues"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient._workvalues</h3>
<b>_workvalues</b>(<i>io_dicts=None, writeout=False</i>)
<p>
Alle Werte der Inputs und Outputs abrufen.
</p><dl>
<dt><i>io_dicts</i></dt>
<dd>
Arbeit nur f&#252;r dieses Dict()
</dd><dt><i>writeout</i></dt>
<dd>
&#196;nderungen auf RevPi schreiben
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="RevPiCheckClient.hideallwindows" ID="RevPiCheckClient.hideallwindows"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.hideallwindows</h3>
<b>hideallwindows</b>(<i></i>)
<p>
Versteckt alle Fenster.
</p><a NAME="RevPiCheckClient.maxint" ID="RevPiCheckClient.maxint"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.maxint</h3>
<b>maxint</b>(<i>bytelen</i>)
<p>
Errechnet maximalen int() Wert f&#252;r Bytes max 22.
</p><dl>
<dt><i>bytelen</i></dt>
<dd>
Anzahl Bytes
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
int() max oder 0 bei &#220;berschreitung
</dd>
</dl><a NAME="RevPiCheckClient.readvalues" ID="RevPiCheckClient.readvalues"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.readvalues</h3>
<b>readvalues</b>(<i></i>)
<p>
Ruft nur Input Werte von RevPi ab und aktualisiert Fenster.
</p><a NAME="RevPiCheckClient.refreshvalues" ID="RevPiCheckClient.refreshvalues"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.refreshvalues</h3>
<b>refreshvalues</b>(<i></i>)
<p>
Ruft alle IO Werte von RevPi ab und aktualisiert Fenster.
</p><a NAME="RevPiCheckClient.tmr_workvalues" ID="RevPiCheckClient.tmr_workvalues"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.tmr_workvalues</h3>
<b>tmr_workvalues</b>(<i></i>)
<p>
Timer f&#252;r zyklische Abfrage.
</p><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="RevPiCheckClient.toggleauto" ID="RevPiCheckClient.toggleauto"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.toggleauto</h3>
<b>toggleauto</b>(<i></i>)
<p>
Schaltet zwischen Autorefresh um und aktualisiert Widgets.
</p><a NAME="RevPiCheckClient.togglewrite" ID="RevPiCheckClient.togglewrite"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.togglewrite</h3>
<b>togglewrite</b>(<i></i>)
<p>
Schaltet zwischen DoWrite um und aktiviert Schreibfunktion.
</p><a NAME="RevPiCheckClient.validatereturn" ID="RevPiCheckClient.validatereturn"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.validatereturn</h3>
<b>validatereturn</b>(<i>returnlist</i>)
<p>
&#220;berpr&#252;ft die R&#252;ckgaben der setvalue Funktion.
</p><dl>
<dt><i>returnlist</i></dt>
<dd>
list() der xml R&#252;ckgabe
</dd>
</dl><a NAME="RevPiCheckClient.writevalues" ID="RevPiCheckClient.writevalues"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.writevalues</h3>
<b>writevalues</b>(<i></i>)
<p>
Schreibt ge&#228;nderte Outputs auf den RevPi.
</p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -1,101 +0,0 @@
<!DOCTYPE html>
<html><head>
<title>revpiinfo</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">
revpiinfo</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>_</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiInfo">RevPiInfo</a></td>
<td>Baut Frame f&#252;r Programminformationen.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="RevPiInfo" ID="RevPiInfo"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiInfo</h2>
<p>
Baut Frame f&#252;r Programminformationen.
</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>None</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="#RevPiInfo.__init__">RevPiInfo</a></td>
<td>Init RevPiLogfile-Class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiInfo._checkclose">_checkclose</a></td>
<td>Pr&#252;ft ob Fenster beendet werden soll.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiInfo._createwidgets">_createwidgets</a></td>
<td>Erstellt alle Widgets.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiInfo.visitwebsite">visitwebsite</a></td>
<td>&#214;ffnet auf dem System einen Webbrowser zur Projektseite.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiInfo.__init__" ID="RevPiInfo.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiInfo (Constructor)</h3>
<b>RevPiInfo</b>(<i>master, xmlcli, version</i>)
<p>
Init RevPiLogfile-Class.
</p><a NAME="RevPiInfo._checkclose" ID="RevPiInfo._checkclose"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiInfo._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="RevPiInfo._createwidgets" ID="RevPiInfo._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiInfo._createwidgets</h3>
<b>_createwidgets</b>(<i>extended=False</i>)
<p>
Erstellt alle Widgets.
</p><a NAME="RevPiInfo.visitwebsite" ID="RevPiInfo.visitwebsite"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiInfo.visitwebsite</h3>
<b>visitwebsite</b>(<i>event=None</i>)
<p>
&#214;ffnet auf dem System einen Webbrowser zur Projektseite.
</p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -1,166 +0,0 @@
<!DOCTYPE html>
<html><head>
<title>revpilegacy</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">
revpilegacy</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>_</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiOption">RevPiOption</a></td>
<td>Optionen f&#252;r RevPiPyload vor 0.6.0.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="RevPiOption" ID="RevPiOption"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiOption</h2>
<p>
Optionen f&#252;r RevPiPyload vor 0.6.0.
</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>None</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="#RevPiOption.__init__">RevPiOption</a></td>
<td>Init RevPiOption-Class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._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="#RevPiOption._checkclose">_checkclose</a></td>
<td>Pr&#252;ft ob Fenster beendet werden soll.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._createwidgets">_createwidgets</a></td>
<td>Erstellt Widgets.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._loadappdata">_loadappdata</a></td>
<td>L&#228;d aktuelle Einstellungen vom RevPi.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._setappdata">_setappdata</a></td>
<td>Speichert ge&#228;nderte Einstellungen auf RevPi.</td>
</tr><tr>
<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.xmlmod2_tail">xmlmod2_tail</a></td>
<td>Passt XML-Optionszugriff an.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption.xmlmod_tail">xmlmod_tail</a></td>
<td>Passt XML-Optionszugriff an.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiOption.__init__" ID="RevPiOption.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption (Constructor)</h3>
<b>RevPiOption</b>(<i>master, xmlcli</i>)
<p>
Init RevPiOption-Class.
</p><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="RevPiOption._changesdone" ID="RevPiOption._changesdone"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._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="RevPiOption._checkclose" ID="RevPiOption._checkclose"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._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="RevPiOption._createwidgets" ID="RevPiOption._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<p>
Erstellt Widgets.
</p><a NAME="RevPiOption._loadappdata" ID="RevPiOption._loadappdata"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._loadappdata</h3>
<b>_loadappdata</b>(<i>refresh=False</i>)
<p>
L&#228;d aktuelle Einstellungen vom RevPi.
</p><dl>
<dt><i>refresh</i></dt>
<dd>
Wenn True, werden Einstellungen heruntergeladen.
</dd>
</dl><a NAME="RevPiOption._setappdata" ID="RevPiOption._setappdata"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._setappdata</h3>
<b>_setappdata</b>(<i></i>)
<p>
Speichert ge&#228;nderte Einstellungen auf RevPi.
</p><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="RevPiOption.askxmlon" ID="RevPiOption.askxmlon"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption.askxmlon</h3>
<b>askxmlon</b>(<i></i>)
<p>
Fragt Nuter, ob wirklicht abgeschaltet werden soll.
</p><a NAME="RevPiOption.xmlmod2_tail" ID="RevPiOption.xmlmod2_tail"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption.xmlmod2_tail</h3>
<b>xmlmod2_tail</b>(<i></i>)
<p>
Passt XML-Optionszugriff an.
</p><a NAME="RevPiOption.xmlmod_tail" ID="RevPiOption.xmlmod_tail"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption.xmlmod_tail</h3>
<b>xmlmod_tail</b>(<i></i>)
<p>
Passt XML-Optionszugriff an.
</p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -1,166 +0,0 @@
<!DOCTYPE html>
<html><head>
<title>revpilogfile</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">
revpilogfile</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>_</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiLogfile">RevPiLogfile</a></td>
<td>Baut Fenster f&#252;r Logfiles.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="RevPiLogfile" ID="RevPiLogfile"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiLogfile</h2>
<p>
Baut Fenster f&#252;r Logfiles.
</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>None</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="#RevPiLogfile.__init__">RevPiLogfile</a></td>
<td>Init RevPiLogfile-Class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiLogfile._checkclose">_checkclose</a></td>
<td>Pr&#252;ft ob Fenster beendet werden soll.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiLogfile._createwidgets">_createwidgets</a></td>
<td>Erstellt alle Widgets.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiLogfile._load_log">_load_log</a></td>
<td>L&#228;d die angegebenen Logfiles herunter.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiLogfile.btn_clearapp">btn_clearapp</a></td>
<td>Leert die Logliste der App.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiLogfile.btn_clearplc">btn_clearplc</a></td>
<td>Leert die Logliste des PLC.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiLogfile.get_applog">get_applog</a></td>
<td>Ruft App Logbuch ab.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiLogfile.get_plclog">get_plclog</a></td>
<td>Ruft PLC Logbuch ab.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiLogfile.__init__" ID="RevPiLogfile.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile (Constructor)</h3>
<b>RevPiLogfile</b>(<i>master, xmlcli</i>)
<p>
Init RevPiLogfile-Class.
</p><a NAME="RevPiLogfile._checkclose" ID="RevPiLogfile._checkclose"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile._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="RevPiLogfile._createwidgets" ID="RevPiLogfile._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<p>
Erstellt alle Widgets.
</p><a NAME="RevPiLogfile._load_log" ID="RevPiLogfile._load_log"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile._load_log</h3>
<b>_load_log</b>(<i>textwidget, xmlcall, startposition, full</i>)
<p>
L&#228;d die angegebenen Logfiles herunter.
</p><dl>
<dt><i>textwidget</i></dt>
<dd>
Widget in das Logs eingef&#252;gt werden sollen
</dd><dt><i>xmlcall</i></dt>
<dd>
xmlrpc Funktion zum Abrufen der Logdaten
</dd><dt><i>startposition</i></dt>
<dd>
Startposition ab der Logdaten kommen sollen
</dd><dt><i>full</i></dt>
<dd>
Komplettes Logbuch laden
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
Ende der Datei (neue Startposition)
</dd>
</dl><a NAME="RevPiLogfile.btn_clearapp" ID="RevPiLogfile.btn_clearapp"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile.btn_clearapp</h3>
<b>btn_clearapp</b>(<i></i>)
<p>
Leert die Logliste der App.
</p><a NAME="RevPiLogfile.btn_clearplc" ID="RevPiLogfile.btn_clearplc"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile.btn_clearplc</h3>
<b>btn_clearplc</b>(<i></i>)
<p>
Leert die Logliste des PLC.
</p><a NAME="RevPiLogfile.get_applog" ID="RevPiLogfile.get_applog"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile.get_applog</h3>
<b>get_applog</b>(<i>full=False</i>)
<p>
Ruft App Logbuch ab.
</p><dl>
<dt><i>full</i></dt>
<dd>
Ganzes Logbuch laden
</dd>
</dl><a NAME="RevPiLogfile.get_plclog" ID="RevPiLogfile.get_plclog"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiLogfile.get_plclog</h3>
<b>get_plclog</b>(<i>full=False</i>)
<p>
Ruft PLC Logbuch ab.
</p><dl>
<dt><i>full</i></dt>
<dd>
Ganzes Logbuch laden
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -1,180 +0,0 @@
<!DOCTYPE html>
<html><head>
<title>revpioption</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">
revpioption</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>_</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiOption">RevPiOption</a></td>
<td>Zeigt Optionen von RevPiPyLoad an.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="RevPiOption" ID="RevPiOption"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiOption</h2>
<p>
Zeigt Optionen von RevPiPyLoad an.
</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>None</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="#RevPiOption.__init__">RevPiOption</a></td>
<td>Init RevPiOption-Class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._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="#RevPiOption._checkclose">_checkclose</a></td>
<td>Pr&#252;ft ob Fenster beendet werden soll.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._checkvalues">_checkvalues</a></td>
<td>Pr&#252;ft alle Werte auf G&#252;ltigkeit.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._createwidgets">_createwidgets</a></td>
<td>Erstellt Widgets.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._loadappdata">_loadappdata</a></td>
<td>L&#228;d aktuelle Einstellungen vom RevPi.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._setappdata">_setappdata</a></td>
<td>Speichert ge&#228;nderte Einstellungen auf RevPi.</td>
</tr><tr>
<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_slaveacl">btn_slaveacl</a></td>
<td>&#214;ffnet Fenster f&#252;r ACL-Verwaltung.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption.btn_xmlacl">btn_xmlacl</a></td>
<td>&#214;ffnet Fenster f&#252;r ACL-Verwaltung.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiOption.__init__" ID="RevPiOption.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption (Constructor)</h3>
<b>RevPiOption</b>(<i>master, xmlcli</i>)
<p>
Init RevPiOption-Class.
</p><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="RevPiOption._changesdone" ID="RevPiOption._changesdone"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._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="RevPiOption._checkclose" ID="RevPiOption._checkclose"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._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="RevPiOption._checkvalues" ID="RevPiOption._checkvalues"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._checkvalues</h3>
<b>_checkvalues</b>(<i></i>)
<p>
Pr&#252;ft alle Werte auf G&#252;ltigkeit.
</p><dl>
<dt>Returns:</dt>
<dd>
True, wenn alle Werte g&#252;ltig sind
</dd>
</dl><a NAME="RevPiOption._createwidgets" ID="RevPiOption._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<p>
Erstellt Widgets.
</p><a NAME="RevPiOption._loadappdata" ID="RevPiOption._loadappdata"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._loadappdata</h3>
<b>_loadappdata</b>(<i>refresh=False</i>)
<p>
L&#228;d aktuelle Einstellungen vom RevPi.
</p><dl>
<dt><i>refresh</i></dt>
<dd>
Wenn True, werden Einstellungen heruntergeladen.
</dd>
</dl><a NAME="RevPiOption._setappdata" ID="RevPiOption._setappdata"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._setappdata</h3>
<b>_setappdata</b>(<i></i>)
<p>
Speichert ge&#228;nderte Einstellungen auf RevPi.
</p><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="RevPiOption.askxmlon" ID="RevPiOption.askxmlon"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption.askxmlon</h3>
<b>askxmlon</b>(<i></i>)
<p>
Fragt Nuter, ob wirklicht abgeschaltet werden soll.
</p><a NAME="RevPiOption.btn_slaveacl" ID="RevPiOption.btn_slaveacl"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption.btn_slaveacl</h3>
<b>btn_slaveacl</b>(<i></i>)
<p>
&#214;ffnet Fenster f&#252;r ACL-Verwaltung.
</p><a NAME="RevPiOption.btn_xmlacl" ID="RevPiOption.btn_xmlacl"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption.btn_xmlacl</h3>
<b>btn_xmlacl</b>(<i></i>)
<p>
&#214;ffnet Fenster f&#252;r ACL-Verwaltung.
</p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -1,164 +0,0 @@
<!DOCTYPE html>
<html><head>
<title>revpioptionlegacy</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">
revpioptionlegacy</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>_</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiOption">RevPiOption</a></td>
<td></td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="RevPiOption" ID="RevPiOption"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiOption</h2>
<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>None</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="#RevPiOption.__init__">RevPiOption</a></td>
<td>Init RevPiOption-Class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._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="#RevPiOption._checkclose">_checkclose</a></td>
<td>Pr&#252;ft ob Fenster beendet werden soll.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._createwidgets">_createwidgets</a></td>
<td>Erstellt Widgets.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._loadappdata">_loadappdata</a></td>
<td>L&#228;d aktuelle Einstellungen vom RevPi.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption._setappdata">_setappdata</a></td>
<td>Speichert ge&#228;nderte Einstellungen auf RevPi.</td>
</tr><tr>
<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.xmlmod2_tail">xmlmod2_tail</a></td>
<td>Passt XML-Optionszugriff an.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption.xmlmod_tail">xmlmod_tail</a></td>
<td>Passt XML-Optionszugriff an.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiOption.__init__" ID="RevPiOption.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption (Constructor)</h3>
<b>RevPiOption</b>(<i>master, xmlcli</i>)
<p>
Init RevPiOption-Class.
</p><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="RevPiOption._changesdone" ID="RevPiOption._changesdone"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._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="RevPiOption._checkclose" ID="RevPiOption._checkclose"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._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="RevPiOption._createwidgets" ID="RevPiOption._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<p>
Erstellt Widgets.
</p><a NAME="RevPiOption._loadappdata" ID="RevPiOption._loadappdata"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._loadappdata</h3>
<b>_loadappdata</b>(<i>refresh=False</i>)
<p>
L&#228;d aktuelle Einstellungen vom RevPi.
</p><dl>
<dt><i>refresh</i></dt>
<dd>
Wenn True, werden Einstellungen heruntergeladen.
</dd>
</dl><a NAME="RevPiOption._setappdata" ID="RevPiOption._setappdata"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._setappdata</h3>
<b>_setappdata</b>(<i></i>)
<p>
Speichert ge&#228;nderte Einstellungen auf RevPi.
</p><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="RevPiOption.askxmlon" ID="RevPiOption.askxmlon"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption.askxmlon</h3>
<b>askxmlon</b>(<i></i>)
<p>
Fragt Nuter, ob wirklicht abgeschaltet werden soll.
</p><a NAME="RevPiOption.xmlmod2_tail" ID="RevPiOption.xmlmod2_tail"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption.xmlmod2_tail</h3>
<b>xmlmod2_tail</b>(<i></i>)
<p>
Passt XML-Optionszugriff an.
</p><a NAME="RevPiOption.xmlmod_tail" ID="RevPiOption.xmlmod_tail"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption.xmlmod_tail</h3>
<b>xmlmod_tail</b>(<i></i>)
<p>
Passt XML-Optionszugriff an.
</p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -1,190 +0,0 @@
<!DOCTYPE html>
<html><head>
<title>revpiplclist</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">
revpiplclist</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>_</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiPlcList">RevPiPlcList</a></td>
<td>TK Fenster.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#get_connections">get_connections</a></td>
<td>Verbindungen aus Datei laden.</td>
</tr>
</table>
<hr /><hr />
<a NAME="RevPiPlcList" ID="RevPiPlcList"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiPlcList</h2>
<p>
TK Fenster.
</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>myapp</td></tr><tr><td>root</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="#RevPiPlcList.__init__">RevPiPlcList</a></td>
<td>Init RevPiPlcList-class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList._checkclose">_checkclose</a></td>
<td>Pr&#252;ft ob Fenster beendet werden soll.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList._createwidgets">_createwidgets</a></td>
<td>Erstellt alle Widgets.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList._saveappdata">_saveappdata</a></td>
<td>Speichert Verbindungen im home Dir.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.build_listconn">build_listconn</a></td>
<td>F&#252;llt Verbindungsliste.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.evt_btnadd">evt_btnadd</a></td>
<td>Verbindungseinstellungen &#252;bernehmen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.evt_btnnew">evt_btnnew</a></td>
<td>Neue Verbindung erstellen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.evt_btnremove">evt_btnremove</a></td>
<td>Verbindung l&#246;schen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.evt_btnsave">evt_btnsave</a></td>
<td>Alle Verbindungen speichern.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.evt_keypress">evt_keypress</a></td>
<td>Passt bei Tastendruck den Status der Buttons an.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPlcList.evt_listconn">evt_listconn</a></td>
<td>&#220;bernimmt Einstellungen in Eingabefelder.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiPlcList.__init__" ID="RevPiPlcList.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList (Constructor)</h3>
<b>RevPiPlcList</b>(<i>master</i>)
<p>
Init RevPiPlcList-class.
</p><dl>
<dt><i>master</i></dt>
<dd>
tkinter master
</dd>
</dl><a NAME="RevPiPlcList._checkclose" ID="RevPiPlcList._checkclose"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList._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="RevPiPlcList._createwidgets" ID="RevPiPlcList._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<p>
Erstellt alle Widgets.
</p><a NAME="RevPiPlcList._saveappdata" ID="RevPiPlcList._saveappdata"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList._saveappdata</h3>
<b>_saveappdata</b>(<i></i>)
<p>
Speichert Verbindungen im home Dir.
</p><dl>
<dt>Returns:</dt>
<dd>
True, bei erfolgreicher Verarbeitung
</dd>
</dl><a NAME="RevPiPlcList.build_listconn" ID="RevPiPlcList.build_listconn"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.build_listconn</h3>
<b>build_listconn</b>(<i></i>)
<p>
F&#252;llt Verbindungsliste.
</p><a NAME="RevPiPlcList.evt_btnadd" ID="RevPiPlcList.evt_btnadd"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.evt_btnadd</h3>
<b>evt_btnadd</b>(<i></i>)
<p>
Verbindungseinstellungen &#252;bernehmen.
</p><a NAME="RevPiPlcList.evt_btnnew" ID="RevPiPlcList.evt_btnnew"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.evt_btnnew</h3>
<b>evt_btnnew</b>(<i></i>)
<p>
Neue Verbindung erstellen.
</p><a NAME="RevPiPlcList.evt_btnremove" ID="RevPiPlcList.evt_btnremove"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.evt_btnremove</h3>
<b>evt_btnremove</b>(<i></i>)
<p>
Verbindung l&#246;schen.
</p><a NAME="RevPiPlcList.evt_btnsave" ID="RevPiPlcList.evt_btnsave"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.evt_btnsave</h3>
<b>evt_btnsave</b>(<i></i>)
<p>
Alle Verbindungen speichern.
</p><a NAME="RevPiPlcList.evt_keypress" ID="RevPiPlcList.evt_keypress"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.evt_keypress</h3>
<b>evt_keypress</b>(<i>evt=None</i>)
<p>
Passt bei Tastendruck den Status der Buttons an.
</p><a NAME="RevPiPlcList.evt_listconn" ID="RevPiPlcList.evt_listconn"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPlcList.evt_listconn</h3>
<b>evt_listconn</b>(<i>evt=None</i>)
<p>
&#220;bernimmt Einstellungen in Eingabefelder.
</p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="get_connections" ID="get_connections"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">get_connections</h2>
<b>get_connections</b>(<i></i>)
<p>
Verbindungen aus Datei laden.
</p><dl>
<dt>Returns:</dt>
<dd>
dict() mit Verbindungen
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -1,260 +0,0 @@
<!DOCTYPE html>
<html><head>
<title>revpiprogram</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">
revpiprogram</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>_</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiProgram">RevPiProgram</a></td>
<td>Zeigt Programmfenster an.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#_loaddefaults">_loaddefaults</a></td>
<td>&#220;bernimmt f&#252;r den Pi die letzen Pfade.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#_savedefaults">_savedefaults</a></td>
<td>Schreibt fuer den Pi die letzen Pfade.</td>
</tr>
</table>
<hr /><hr />
<a NAME="RevPiProgram" ID="RevPiProgram"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiProgram</h2>
<p>
Zeigt Programmfenster an.
</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>None</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="#RevPiProgram.__init__">RevPiProgram</a></td>
<td>Init RevPiProgram-Class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram._checkclose">_checkclose</a></td>
<td>Pr&#252;ft ob Fenster beendet werden soll.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram._createwidgets">_createwidgets</a></td>
<td>Erstellt alle Widgets.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram._evt_optdown">_evt_optdown</a></td>
<td>Passt je nach gew&#228;hlter Option den Status der Widgets an.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram._evt_optup">_evt_optup</a></td>
<td>Passt je nach gew&#228;hlter Option den Status der Widgets an.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.check_replacedir">check_replacedir</a></td>
<td>Gibt das rootdir von einem entpackten Verzeichnis zurueck.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.create_filelist">create_filelist</a></td>
<td>Erstellt eine Dateiliste von einem Verzeichnis.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.getpictoryrsc">getpictoryrsc</a></td>
<td>L&#228;d die piCtory Konfiguration herunter.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.getprocimg">getprocimg</a></td>
<td>L&#228;d das aktuelle Prozessabbild herunter.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.picontrolreset">picontrolreset</a></td>
<td>F&#252;rt ein Reset der piBridge durch.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.plcdownload">plcdownload</a></td>
<td>L&#228;d das aktuelle Projekt herunter.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.plcupload">plcupload</a></td>
<td>L&#228;dt das angegebene Projekt auf den RevPi.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.setpictoryrsc">setpictoryrsc</a></td>
<td>&#220;bertr&#228;gt die angegebene piCtory-Konfiguration.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiProgram.__init__" ID="RevPiProgram.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram (Constructor)</h3>
<b>RevPiProgram</b>(<i>master, xmlcli, xmlmode, revpi</i>)
<p>
Init RevPiProgram-Class.
</p><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="RevPiProgram._checkclose" ID="RevPiProgram._checkclose"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram._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="RevPiProgram._createwidgets" ID="RevPiProgram._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<p>
Erstellt alle Widgets.
</p><a NAME="RevPiProgram._evt_optdown" ID="RevPiProgram._evt_optdown"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram._evt_optdown</h3>
<b>_evt_optdown</b>(<i>text=""</i>)
<p>
Passt je nach gew&#228;hlter Option den Status der Widgets an.
</p><a NAME="RevPiProgram._evt_optup" ID="RevPiProgram._evt_optup"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram._evt_optup</h3>
<b>_evt_optup</b>(<i>text=""</i>)
<p>
Passt je nach gew&#228;hlter Option den Status der Widgets an.
</p><a NAME="RevPiProgram.check_replacedir" ID="RevPiProgram.check_replacedir"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.check_replacedir</h3>
<b>check_replacedir</b>(<i>rootdir</i>)
<p>
Gibt das rootdir von einem entpackten Verzeichnis zurueck.
</p><p>
Dabei wird geprueft, ob es sich um einen einzelnen Ordner handelt
und ob es eine piCtory Konfiguration im rootdir gibt.
</p><dl>
<dt><i>rootdir</i></dt>
<dd>
Verzeichnis fuer Pruefung
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
Abgeaendertes rootdir
</dd>
</dl><a NAME="RevPiProgram.create_filelist" ID="RevPiProgram.create_filelist"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.create_filelist</h3>
<b>create_filelist</b>(<i>rootdir</i>)
<p>
Erstellt eine Dateiliste von einem Verzeichnis.
</p><dl>
<dt><i>rootdir</i></dt>
<dd>
Verzeichnis fuer das eine Liste erstellt werden soll
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
Dateiliste
</dd>
</dl><a NAME="RevPiProgram.getpictoryrsc" ID="RevPiProgram.getpictoryrsc"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.getpictoryrsc</h3>
<b>getpictoryrsc</b>(<i></i>)
<p>
L&#228;d die piCtory Konfiguration herunter.
</p><a NAME="RevPiProgram.getprocimg" ID="RevPiProgram.getprocimg"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.getprocimg</h3>
<b>getprocimg</b>(<i></i>)
<p>
L&#228;d das aktuelle Prozessabbild herunter.
</p><a NAME="RevPiProgram.picontrolreset" ID="RevPiProgram.picontrolreset"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.picontrolreset</h3>
<b>picontrolreset</b>(<i></i>)
<p>
F&#252;rt ein Reset der piBridge durch.
</p><a NAME="RevPiProgram.plcdownload" ID="RevPiProgram.plcdownload"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.plcdownload</h3>
<b>plcdownload</b>(<i></i>)
<p>
L&#228;d das aktuelle Projekt herunter.
</p><a NAME="RevPiProgram.plcupload" ID="RevPiProgram.plcupload"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.plcupload</h3>
<b>plcupload</b>(<i></i>)
<p>
L&#228;dt das angegebene Projekt auf den RevPi.
</p><dl>
<dt>Returns:</dt>
<dd>
True, bei erfolgreicher Verarbeitung
</dd>
</dl><a NAME="RevPiProgram.setpictoryrsc" ID="RevPiProgram.setpictoryrsc"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.setpictoryrsc</h3>
<b>setpictoryrsc</b>(<i>filename=None</i>)
<p>
&#220;bertr&#228;gt die angegebene piCtory-Konfiguration.
</p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="_loaddefaults" ID="_loaddefaults"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">_loaddefaults</h2>
<b>_loaddefaults</b>(<i>revpiname=None</i>)
<p>
&#220;bernimmt f&#252;r den Pi die letzen Pfade.
</p><dl>
<dt><i>revpiname</i></dt>
<dd>
Einstellungen nur f&#252;r RevPi laden
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
<class 'dict'> mit Einstellungen
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="_savedefaults" ID="_savedefaults"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">_savedefaults</h2>
<b>_savedefaults</b>(<i>revpiname, settings</i>)
<p>
Schreibt fuer den Pi die letzen Pfade.
</p><dl>
<dt><i>revpiname</i></dt>
<dd>
Einstellungen sind f&#252;r diesen RevPi
</dd><dt><i>settings</i></dt>
<dd>
<class 'dict'> mit Einstellungen
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
True, bei erfolgreicher Verarbeitung
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -1,277 +0,0 @@
<!DOCTYPE html>
<html><head>
<title>revpipycontrol</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">
revpipycontrol</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>_</td></tr><tr><td>pycontrolversion</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiPyControl">RevPiPyControl</a></td>
<td>Baut Hauptprogramm auf.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr><td>None</td></tr>
</table>
<hr /><hr />
<a NAME="RevPiPyControl" ID="RevPiPyControl"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiPyControl</h2>
<p>
Baut Hauptprogramm auf.
</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>myapp</td></tr><tr><td>root</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="#RevPiPyControl.__init__">RevPiPyControl</a></td>
<td>Init RevPiPyControl-Class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl._btnstate">_btnstate</a></td>
<td>Setzt den state der Buttons.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl._closeall">_closeall</a></td>
<td>Schlie&#223;t alle Fenster.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl._closeapp">_closeapp</a></td>
<td>R&#228;umt auf und beendet Programm.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl._createwidgets">_createwidgets</a></td>
<td>Erstellt den Fensterinhalt.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl._fillconnbar">_fillconnbar</a></td>
<td>Generiert Men&#252;eintr&#228;ge f&#252;r Verbindungen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl._fillmbar">_fillmbar</a></td>
<td>Generiert Men&#252;eintr&#228;ge.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl._opt_conn">_opt_conn</a></td>
<td>Stellt eine neue Verbindung zu RevPiPyLoad her.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.infowindow">infowindow</a></td>
<td>&#214;ffnet das Fenster f&#252;r die Info.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcdebug">plcdebug</a></td>
<td>Baut den Debugframe und packt ihn.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plclist">plclist</a></td>
<td>&#214;ffnet das Fenster f&#252;r die Verbindungen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plclogs">plclogs</a></td>
<td>&#214;ffnet das Fenster f&#252;r Logdateien.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcoptions">plcoptions</a></td>
<td>Startet das Optionsfenster.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcprogram">plcprogram</a></td>
<td>Startet das Programmfenster.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcrestart">plcrestart</a></td>
<td>Startet das PLC Programm neu.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcstart">plcstart</a></td>
<td>Startet das PLC Programm.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcstop">plcstop</a></td>
<td>Beendet das PLC Programm.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.serverdisconnect">serverdisconnect</a></td>
<td>Trennt eine bestehende Verbindung.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.servererror">servererror</a></td>
<td>Setzt alles zur&#252;ck f&#252;r neue Verbindungen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.tmr_plcrunning">tmr_plcrunning</a></td>
<td>Timer der den Status des PLC Programms pr&#252;ft.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.visitwebsite">visitwebsite</a></td>
<td>&#214;ffnet auf dem System einen Webbrowser zur Projektseite.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiPyControl.__init__" ID="RevPiPyControl.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl (Constructor)</h3>
<b>RevPiPyControl</b>(<i>master=None</i>)
<p>
Init RevPiPyControl-Class.
</p><dl>
<dt><i>master</i></dt>
<dd>
tkinter master
</dd>
</dl><a NAME="RevPiPyControl._btnstate" ID="RevPiPyControl._btnstate"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl._btnstate</h3>
<b>_btnstate</b>(<i></i>)
<p>
Setzt den state der Buttons.
</p><a NAME="RevPiPyControl._closeall" ID="RevPiPyControl._closeall"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl._closeall</h3>
<b>_closeall</b>(<i></i>)
<p>
Schlie&#223;t alle Fenster.
</p><a NAME="RevPiPyControl._closeapp" ID="RevPiPyControl._closeapp"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl._closeapp</h3>
<b>_closeapp</b>(<i>event=None</i>)
<p>
R&#228;umt auf und beendet Programm.
</p><dl>
<dt><i>event</i></dt>
<dd>
tkinter Event
</dd>
</dl><a NAME="RevPiPyControl._createwidgets" ID="RevPiPyControl._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<p>
Erstellt den Fensterinhalt.
</p><a NAME="RevPiPyControl._fillconnbar" ID="RevPiPyControl._fillconnbar"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl._fillconnbar</h3>
<b>_fillconnbar</b>(<i></i>)
<p>
Generiert Men&#252;eintr&#228;ge f&#252;r Verbindungen.
</p><a NAME="RevPiPyControl._fillmbar" ID="RevPiPyControl._fillmbar"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl._fillmbar</h3>
<b>_fillmbar</b>(<i></i>)
<p>
Generiert Men&#252;eintr&#228;ge.
</p><a NAME="RevPiPyControl._opt_conn" ID="RevPiPyControl._opt_conn"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl._opt_conn</h3>
<b>_opt_conn</b>(<i>text, reconnect=False</i>)
<p>
Stellt eine neue Verbindung zu RevPiPyLoad her.
</p><dl>
<dt><i>text</i></dt>
<dd>
Verbindungsname
</dd><dt><i>reconnect</i></dt>
<dd>
Socket Timeout nicht heruntersetzen
</dd>
</dl><a NAME="RevPiPyControl.infowindow" ID="RevPiPyControl.infowindow"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.infowindow</h3>
<b>infowindow</b>(<i></i>)
<p>
&#214;ffnet das Fenster f&#252;r die Info.
</p><a NAME="RevPiPyControl.plcdebug" ID="RevPiPyControl.plcdebug"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plcdebug</h3>
<b>plcdebug</b>(<i></i>)
<p>
Baut den Debugframe und packt ihn.
</p><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="RevPiPyControl.plclist" ID="RevPiPyControl.plclist"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plclist</h3>
<b>plclist</b>(<i></i>)
<p>
&#214;ffnet das Fenster f&#252;r die Verbindungen.
</p><a NAME="RevPiPyControl.plclogs" ID="RevPiPyControl.plclogs"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plclogs</h3>
<b>plclogs</b>(<i></i>)
<p>
&#214;ffnet das Fenster f&#252;r Logdateien.
</p><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="RevPiPyControl.plcoptions" ID="RevPiPyControl.plcoptions"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plcoptions</h3>
<b>plcoptions</b>(<i></i>)
<p>
Startet das Optionsfenster.
</p><a NAME="RevPiPyControl.plcprogram" ID="RevPiPyControl.plcprogram"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plcprogram</h3>
<b>plcprogram</b>(<i></i>)
<p>
Startet das Programmfenster.
</p><a NAME="RevPiPyControl.plcrestart" ID="RevPiPyControl.plcrestart"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plcrestart</h3>
<b>plcrestart</b>(<i></i>)
<p>
Startet das PLC Programm neu.
</p><a NAME="RevPiPyControl.plcstart" ID="RevPiPyControl.plcstart"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plcstart</h3>
<b>plcstart</b>(<i></i>)
<p>
Startet das PLC Programm.
</p><a NAME="RevPiPyControl.plcstop" ID="RevPiPyControl.plcstop"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plcstop</h3>
<b>plcstop</b>(<i></i>)
<p>
Beendet das PLC Programm.
</p><a NAME="RevPiPyControl.serverdisconnect" ID="RevPiPyControl.serverdisconnect"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.serverdisconnect</h3>
<b>serverdisconnect</b>(<i></i>)
<p>
Trennt eine bestehende Verbindung.
</p><a NAME="RevPiPyControl.servererror" ID="RevPiPyControl.servererror"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.servererror</h3>
<b>servererror</b>(<i></i>)
<p>
Setzt alles zur&#252;ck f&#252;r neue Verbindungen.
</p><a NAME="RevPiPyControl.tmr_plcrunning" ID="RevPiPyControl.tmr_plcrunning"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.tmr_plcrunning</h3>
<b>tmr_plcrunning</b>(<i></i>)
<p>
Timer der den Status des PLC Programms pr&#252;ft.
</p><a NAME="RevPiPyControl.visitwebsite" ID="RevPiPyControl.visitwebsite"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.visitwebsite</h3>
<b>visitwebsite</b>(<i></i>)
<p>
&#214;ffnet auf dem System einen Webbrowser zur Projektseite.
</p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -1,239 +0,0 @@
<!DOCTYPE html>
<html><head>
<title>revpipycontrol.shared.ipaclmanager</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">
revpipycontrol.shared.ipaclmanager</h1>
<p>
Verwaltet IP Adressen und deren ACLs.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#IpAclManager">IpAclManager</a></td>
<td>Verwaltung fuer IP Adressen und deren ACL Level.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#refullmatch">refullmatch</a></td>
<td>re.fullmatch wegen alter python version aus wheezy nachgebaut.</td>
</tr>
</table>
<hr /><hr />
<a NAME="IpAclManager" ID="IpAclManager"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">IpAclManager</h2>
<p>
Verwaltung fuer IP Adressen und deren ACL Level.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
None
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>acl</td></tr><tr><td>filename</td></tr><tr><td>regex_acl</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="#IpAclManager.__init__">IpAclManager</a></td>
<td>Init IpAclManager class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IpAclManager.__get_acl">__get_acl</a></td>
<td>Getter fuer den rohen ACL-String.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IpAclManager.__get_filename">__get_filename</a></td>
<td>Getter fuer Dateinamen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IpAclManager.__get_regex_acl">__get_regex_acl</a></td>
<td>Gibt formatierten RegEx-String zurueck.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IpAclManager.__iter__">__iter__</a></td>
<td>Gibt einzelne ACLs als <class 'tuple'> aus.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IpAclManager.__set_acl">__set_acl</a></td>
<td>Uebernimmt neue ACL-Liste fuer die Ausertung der Level.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IpAclManager.get_acllevel">get_acllevel</a></td>
<td>Prueft IP gegen ACL List und gibt ACL-Wert aus.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IpAclManager.loadacl">loadacl</a></td>
<td>Laed ACL String und gibt erfolg zurueck.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IpAclManager.loadaclfile">loadaclfile</a></td>
<td>Laed ACL Definitionen aus Datei.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#IpAclManager.writeaclfile">writeaclfile</a></td>
<td>Schreibt ACL Definitionen in Datei.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="IpAclManager.__init__" ID="IpAclManager.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager (Constructor)</h3>
<b>IpAclManager</b>(<i>minlevel, maxlevel, acl=None</i>)
<p>
Init IpAclManager class.
</p><dl>
<dt><i>minlevel</i></dt>
<dd>
Smallest access level (min. 0)
</dd><dt><i>maxlevel</i></dt>
<dd>
Biggest access level (max. 9)
</dd><dt><i>acl</i></dt>
<dd>
ACL Liste fuer Berechtigungen als <class 'str'>
</dd>
</dl><a NAME="IpAclManager.__get_acl" ID="IpAclManager.__get_acl"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager.__get_acl</h3>
<b>__get_acl</b>(<i></i>)
<p>
Getter fuer den rohen ACL-String.
return ACLs als <class 'str'>
</p><a NAME="IpAclManager.__get_filename" ID="IpAclManager.__get_filename"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager.__get_filename</h3>
<b>__get_filename</b>(<i></i>)
<p>
Getter fuer Dateinamen.
</p><dl>
<dt>Returns:</dt>
<dd>
Filename der ACL <class 'str'>
</dd>
</dl><a NAME="IpAclManager.__get_regex_acl" ID="IpAclManager.__get_regex_acl"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager.__get_regex_acl</h3>
<b>__get_regex_acl</b>(<i></i>)
<p>
Gibt formatierten RegEx-String zurueck.
return RegEx Code als <class 'str'>
</p><a NAME="IpAclManager.__iter__" ID="IpAclManager.__iter__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager.__iter__</h3>
<b>__iter__</b>(<i></i>)
<p>
Gibt einzelne ACLs als <class 'tuple'> aus.
</p><a NAME="IpAclManager.__set_acl" ID="IpAclManager.__set_acl"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager.__set_acl</h3>
<b>__set_acl</b>(<i>value</i>)
<p>
Uebernimmt neue ACL-Liste fuer die Ausertung der Level.
</p><dl>
<dt><i>value</i></dt>
<dd>
Neue ACL-Liste als <class 'str'>
</dd>
</dl><a NAME="IpAclManager.get_acllevel" ID="IpAclManager.get_acllevel"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager.get_acllevel</h3>
<b>get_acllevel</b>(<i>ipaddress</i>)
<p>
Prueft IP gegen ACL List und gibt ACL-Wert aus.
</p><dl>
<dt><i>ipaddress</i></dt>
<dd>
zum pruefen
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
<class 'int'> ACL Wert oder -1 wenn nicht gefunden
</dd>
</dl><a NAME="IpAclManager.loadacl" ID="IpAclManager.loadacl"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager.loadacl</h3>
<b>loadacl</b>(<i>str_acl</i>)
<p>
Laed ACL String und gibt erfolg zurueck.
</p><dl>
<dt><i>str_acl</i></dt>
<dd>
ACL als <class 'str'>
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
True, wenn erfolgreich uebernommen
</dd>
</dl><a NAME="IpAclManager.loadaclfile" ID="IpAclManager.loadaclfile"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager.loadaclfile</h3>
<b>loadaclfile</b>(<i>filename</i>)
<p>
Laed ACL Definitionen aus Datei.
</p><dl>
<dt><i>filename</i></dt>
<dd>
Dateiname fuer Definitionen
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
True, wenn Laden erfolgreich war
</dd>
</dl><a NAME="IpAclManager.writeaclfile" ID="IpAclManager.writeaclfile"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
IpAclManager.writeaclfile</h3>
<b>writeaclfile</b>(<i>filename=None, aclname=None</i>)
<p>
Schreibt ACL Definitionen in Datei.
</p><dl>
<dt><i>filename</i></dt>
<dd>
Dateiname fuer Definitionen
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
True, wenn Schreiben erfolgreich war
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="refullmatch" ID="refullmatch"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">refullmatch</h2>
<b>refullmatch</b>(<i>regex, string</i>)
<p>
re.fullmatch wegen alter python version aus wheezy nachgebaut.
</p><dl>
<dt><i>regex</i></dt>
<dd>
RegEx Statement
</dd><dt><i>string</i></dt>
<dd>
Zeichenfolge gegen die getestet wird
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
True, wenn komplett passt sonst False
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

20
docs/Makefile Normal file
View File

@@ -0,0 +1,20 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
SPHINXPROJ = RevPiPyControl
SOURCEDIR = .
BUILDDIR = _build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

7
docs/aclmanager.rst Normal file
View File

@@ -0,0 +1,7 @@
aclmanager module
=================
.. automodule:: aclmanager
:members:
:undoc-members:
:show-inheritance:

171
docs/conf.py Normal file
View File

@@ -0,0 +1,171 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# RevPiPyControl documentation build configuration file, created by
# sphinx-quickstart on Sun Oct 20 17:05:21 2019.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
import os
import sys
sys.path.insert(0, os.path.abspath('../revpipycontrol'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = ['sphinx.ext.autodoc',
'sphinx.ext.todo',
'sphinx.ext.viewcode']
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = 'RevPiPyControl'
copyright = '2019, Sven Sager (NaruX)'
author = 'Sven Sager (NaruX)'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = ''
# The full version, including alpha/beta/rc tags.
release = ''
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = True
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'alabaster'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
# This is required for the alabaster theme
# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
html_sidebars = {
'**': [
'relations.html', # needs 'show_related': True theme option to display
'searchbox.html',
]
}
# -- Options for HTMLHelp output ------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = 'RevPiPyControldoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'RevPiPyControl.tex', 'RevPiPyControl Documentation',
'Sven Sager (NaruX)', 'manual'),
]
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'revpipycontrol', 'RevPiPyControl Documentation',
[author], 1)
]
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'RevPiPyControl', 'RevPiPyControl Documentation',
author, 'RevPiPyControl', 'One line description of project.',
'Miscellaneous'),
]

20
docs/index.rst Normal file
View File

@@ -0,0 +1,20 @@
.. RevPiPyControl documentation master file, created by
sphinx-quickstart on Sun Oct 20 17:05:21 2019.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to RevPiPyControl's documentation!
==========================================
.. toctree::
:maxdepth: 2
:caption: Contents:
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

19
docs/modules.rst Normal file
View File

@@ -0,0 +1,19 @@
revpipycontrol
==============
.. toctree::
:maxdepth: 4
aclmanager
mqttmanager
mytools
revpicheckclient
revpidevelop
revpiinfo
revpilegacy
revpilogfile
revpioption
revpiplclist
revpiprogram
revpipycontrol
shared

7
docs/mqttmanager.rst Normal file
View File

@@ -0,0 +1,7 @@
mqttmanager module
==================
.. automodule:: mqttmanager
:members:
:undoc-members:
:show-inheritance:

7
docs/mytools.rst Normal file
View File

@@ -0,0 +1,7 @@
mytools module
==============
.. automodule:: mytools
:members:
:undoc-members:
:show-inheritance:

View File

@@ -0,0 +1,7 @@
revpicheckclient module
=======================
.. automodule:: revpicheckclient
:members:
:undoc-members:
:show-inheritance:

7
docs/revpidevelop.rst Normal file
View File

@@ -0,0 +1,7 @@
revpidevelop module
===================
.. automodule:: revpidevelop
:members:
:undoc-members:
:show-inheritance:

7
docs/revpiinfo.rst Normal file
View File

@@ -0,0 +1,7 @@
revpiinfo module
================
.. automodule:: revpiinfo
:members:
:undoc-members:
:show-inheritance:

7
docs/revpilegacy.rst Normal file
View File

@@ -0,0 +1,7 @@
revpilegacy module
==================
.. automodule:: revpilegacy
:members:
:undoc-members:
:show-inheritance:

7
docs/revpilogfile.rst Normal file
View File

@@ -0,0 +1,7 @@
revpilogfile module
===================
.. automodule:: revpilogfile
:members:
:undoc-members:
:show-inheritance:

7
docs/revpioption.rst Normal file
View File

@@ -0,0 +1,7 @@
revpioption module
==================
.. automodule:: revpioption
:members:
:undoc-members:
:show-inheritance:

7
docs/revpiplclist.rst Normal file
View File

@@ -0,0 +1,7 @@
revpiplclist module
===================
.. automodule:: revpiplclist
:members:
:undoc-members:
:show-inheritance:

7
docs/revpiprogram.rst Normal file
View File

@@ -0,0 +1,7 @@
revpiprogram module
===================
.. automodule:: revpiprogram
:members:
:undoc-members:
:show-inheritance:

7
docs/revpipycontrol.rst Normal file
View File

@@ -0,0 +1,7 @@
revpipycontrol module
=====================
.. automodule:: revpipycontrol
:members:
:undoc-members:
:show-inheritance:

22
docs/shared.rst Normal file
View File

@@ -0,0 +1,22 @@
shared package
==============
Submodules
----------
shared\.ipaclmanager module
---------------------------
.. automodule:: shared.ipaclmanager
:members:
:undoc-members:
:show-inheritance:
Module contents
---------------
.. automodule:: shared
:members:
:undoc-members:
:show-inheritance:

5
make.bat Normal file
View File

@@ -0,0 +1,5 @@
@echo off
pyinstaller --clean -D --windowed ^
--add-data="data\revpipycontrol.ico;." ^
--icon=data\\revpipycontrol.ico ^
revpipycontrol\revpipycontrol.py

View File

@@ -1,150 +0,0 @@
aclmanager.AclManager.__get_acltext?6()
aclmanager.AclManager.__set_acltext?6(value)
aclmanager.AclManager._ask_delete?5()
aclmanager.AclManager._changesdone?5()
aclmanager.AclManager._checkback?5(event, tkvar, pretxt)
aclmanager.AclManager._checkclose?5(event=None)
aclmanager.AclManager._checkdot?5(event, tkvar, nexttxt)
aclmanager.AclManager._clearfields?5()
aclmanager.AclManager._createwidgets?5()
aclmanager.AclManager._loadfields?5()
aclmanager.AclManager._refreshacls?5()
aclmanager.AclManager._save?5()
aclmanager.AclManager._savefields?5()
aclmanager.AclManager._status_editremove?5(tkevt)
aclmanager.AclManager.acl?7
aclmanager.AclManager.acltext?7
aclmanager.AclManager.get_acl?4()
aclmanager.AclManager.root?7
aclmanager.AclManager?1(master, minlevel, maxlevel, acl_str="", readonly=False)
aclmanager._?8
mytools.addroot?4(filename)
mytools.gettrans?4(proglang=None)
mytools.savefile_connections?7
mytools.savefile_programpath?7
revpicheckclient.RevPiCheckClient.__chval?6(device, io, event=None)
revpicheckclient.RevPiCheckClient.__hidewin?6(win, event=None)
revpicheckclient.RevPiCheckClient.__saveoldvalue?6(event, tkvar)
revpicheckclient.RevPiCheckClient.__showwin?6(win)
revpicheckclient.RevPiCheckClient.__spinboxkey?6(device, io, event=None)
revpicheckclient.RevPiCheckClient._createiogroup?5(device, frame, iotype)
revpicheckclient.RevPiCheckClient._createwidgets?5()
revpicheckclient.RevPiCheckClient._onfrmconf?5(canvas)
revpicheckclient.RevPiCheckClient._warnwrite?5()
revpicheckclient.RevPiCheckClient._workvalues?5(io_dicts=None, writeout=False)
revpicheckclient.RevPiCheckClient.hideallwindows?4()
revpicheckclient.RevPiCheckClient.maxint?4(bytelen)
revpicheckclient.RevPiCheckClient.readvalues?4()
revpicheckclient.RevPiCheckClient.refreshvalues?4()
revpicheckclient.RevPiCheckClient.tmr_workvalues?4()
revpicheckclient.RevPiCheckClient.toggleauto?4()
revpicheckclient.RevPiCheckClient.togglewrite?4()
revpicheckclient.RevPiCheckClient.validatereturn?4(returnlist)
revpicheckclient.RevPiCheckClient.writevalues?4()
revpicheckclient.RevPiCheckClient?1(master, xmlcli, xmlmode=0)
revpicheckclient._?8
revpiinfo.RevPiInfo._checkclose?5(event=None)
revpiinfo.RevPiInfo._createwidgets?5(extended=False)
revpiinfo.RevPiInfo.visitwebsite?4(event=None)
revpiinfo.RevPiInfo?1(master, xmlcli, version)
revpiinfo._?8
revpilegacy.RevPiOption._changesdone?5()
revpilegacy.RevPiOption._checkclose?5(event=None)
revpilegacy.RevPiOption._createwidgets?5()
revpilegacy.RevPiOption._loadappdata?5(refresh=False)
revpilegacy.RevPiOption._setappdata?5()
revpilegacy.RevPiOption.askxmlon?4()
revpilegacy.RevPiOption.xmlmod2_tail?4()
revpilegacy.RevPiOption.xmlmod_tail?4()
revpilegacy.RevPiOption?1(master, xmlcli)
revpilegacy._?8
revpilogfile.RevPiLogfile._checkclose?5(event=None)
revpilogfile.RevPiLogfile._createwidgets?5()
revpilogfile.RevPiLogfile._load_log?5(textwidget, xmlcall, startposition, full)
revpilogfile.RevPiLogfile.btn_clearapp?4()
revpilogfile.RevPiLogfile.btn_clearplc?4()
revpilogfile.RevPiLogfile.get_applog?4(full=False)
revpilogfile.RevPiLogfile.get_plclog?4(full=False)
revpilogfile.RevPiLogfile?1(master, xmlcli)
revpilogfile._?8
revpioption.RevPiOption._changesdone?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_slaveacl?4()
revpioption.RevPiOption.btn_xmlacl?4()
revpioption.RevPiOption?1(master, xmlcli)
revpioption._?8
revpiplclist.RevPiPlcList._checkclose?5(event=None)
revpiplclist.RevPiPlcList._createwidgets?5()
revpiplclist.RevPiPlcList._saveappdata?5()
revpiplclist.RevPiPlcList.build_listconn?4()
revpiplclist.RevPiPlcList.evt_btnadd?4()
revpiplclist.RevPiPlcList.evt_btnnew?4()
revpiplclist.RevPiPlcList.evt_btnremove?4()
revpiplclist.RevPiPlcList.evt_btnsave?4()
revpiplclist.RevPiPlcList.evt_keypress?4(evt=None)
revpiplclist.RevPiPlcList.evt_listconn?4(evt=None)
revpiplclist.RevPiPlcList.myapp?7
revpiplclist.RevPiPlcList.root?7
revpiplclist.RevPiPlcList?1(master)
revpiplclist._?8
revpiplclist.get_connections?4()
revpiprogram.RevPiProgram._checkclose?5(event=None)
revpiprogram.RevPiProgram._createwidgets?5()
revpiprogram.RevPiProgram._evt_optdown?5(text="")
revpiprogram.RevPiProgram._evt_optup?5(text="")
revpiprogram.RevPiProgram.check_replacedir?4(rootdir)
revpiprogram.RevPiProgram.create_filelist?4(rootdir)
revpiprogram.RevPiProgram.getpictoryrsc?4()
revpiprogram.RevPiProgram.getprocimg?4()
revpiprogram.RevPiProgram.picontrolreset?4()
revpiprogram.RevPiProgram.plcdownload?4()
revpiprogram.RevPiProgram.plcupload?4()
revpiprogram.RevPiProgram.setpictoryrsc?4(filename=None)
revpiprogram.RevPiProgram?1(master, xmlcli, xmlmode, revpi)
revpiprogram._?8
revpiprogram._loaddefaults?5(revpiname=None)
revpiprogram._savedefaults?5(revpiname, settings)
revpipycontrol.RevPiPyControl._btnstate?5()
revpipycontrol.RevPiPyControl._closeall?5()
revpipycontrol.RevPiPyControl._closeapp?5(event=None)
revpipycontrol.RevPiPyControl._createwidgets?5()
revpipycontrol.RevPiPyControl._fillconnbar?5()
revpipycontrol.RevPiPyControl._fillmbar?5()
revpipycontrol.RevPiPyControl._opt_conn?5(text, reconnect=False)
revpipycontrol.RevPiPyControl.infowindow?4()
revpipycontrol.RevPiPyControl.myapp?7
revpipycontrol.RevPiPyControl.plcdebug?4()
revpipycontrol.RevPiPyControl.plclist?4()
revpipycontrol.RevPiPyControl.plclogs?4()
revpipycontrol.RevPiPyControl.plcoptions?4()
revpipycontrol.RevPiPyControl.plcprogram?4()
revpipycontrol.RevPiPyControl.plcrestart?4()
revpipycontrol.RevPiPyControl.plcstart?4()
revpipycontrol.RevPiPyControl.plcstop?4()
revpipycontrol.RevPiPyControl.root?7
revpipycontrol.RevPiPyControl.serverdisconnect?4()
revpipycontrol.RevPiPyControl.servererror?4()
revpipycontrol.RevPiPyControl.tmr_plcrunning?4()
revpipycontrol.RevPiPyControl.visitwebsite?4()
revpipycontrol.RevPiPyControl?1(master=None)
revpipycontrol._?8
revpipycontrol.pycontrolversion?7
revpipycontrol.shared.ipaclmanager.IpAclManager.__get_acl?6()
revpipycontrol.shared.ipaclmanager.IpAclManager.__get_filename?6()
revpipycontrol.shared.ipaclmanager.IpAclManager.__get_regex_acl?6()
revpipycontrol.shared.ipaclmanager.IpAclManager.__iter__?6()
revpipycontrol.shared.ipaclmanager.IpAclManager.__set_acl?6(value)
revpipycontrol.shared.ipaclmanager.IpAclManager.acl?7
revpipycontrol.shared.ipaclmanager.IpAclManager.filename?7
revpipycontrol.shared.ipaclmanager.IpAclManager.get_acllevel?4(ipaddress)
revpipycontrol.shared.ipaclmanager.IpAclManager.loadacl?4(str_acl)
revpipycontrol.shared.ipaclmanager.IpAclManager.loadaclfile?4(filename)
revpipycontrol.shared.ipaclmanager.IpAclManager.regex_acl?7
revpipycontrol.shared.ipaclmanager.IpAclManager.writeaclfile?4(filename=None, aclname=None)
revpipycontrol.shared.ipaclmanager.IpAclManager?1(minlevel, maxlevel, acl=None)
revpipycontrol.shared.ipaclmanager.refullmatch?4(regex, string)

View File

@@ -1,8 +0,0 @@
AclManager ttk.Frame
RevPiCheckClient tkinter.Frame
RevPiInfo tkinter.Frame
RevPiLogfile tkinter.Frame
RevPiOption tkinter.Frame
RevPiPlcList tkinter.Frame
RevPiProgram tkinter.Frame
RevPiPyControl tkinter.Frame

View File

@@ -1,344 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
<!-- eric project file for project revpipycontrol -->
<!-- Saved: 2018-04-04, 15:41:50 -->
<!-- Copyright (C) 2018 Sven Sager, akira@narux.de -->
<Project version="5.1">
<Language>en_US</Language>
<Hash>66103e2eaf8a762f14d1fd51d8b1c9dcaf35a275</Hash>
<ProgLanguage mixed="0">Python3</ProgLanguage>
<ProjectType>Console</ProjectType>
<Description></Description>
<Version>0.6.0</Version>
<Author>Sven Sager</Author>
<Email>akira@narux.de</Email>
<Eol index="1"/>
<Sources>
<Source>revpipycontrol/revpipycontrol.py</Source>
<Source>revpipycontrol/revpicheckclient.py</Source>
<Source>setup.py</Source>
<Source>revpipycontrol/revpiplclist.py</Source>
<Source>revpipycontrol/revpilogfile.py</Source>
<Source>revpipycontrol/revpioption.py</Source>
<Source>revpipycontrol/revpiprogram.py</Source>
<Source>revpipycontrol/mytools.py</Source>
<Source>revpipycontrol/revpiinfo.py</Source>
<Source>revpipycontrol/aclmanager.py</Source>
<Source>revpipycontrol/revpilegacy.py</Source>
<Source>revpipycontrol/shared/ipaclmanager.py</Source>
<Source>revpipycontrol/shared/__init__.py</Source>
</Sources>
<Forms/>
<Translations/>
<Resources/>
<Interfaces/>
<Others>
<Other>data</Other>
<Other>doc</Other>
<Other>revpipycontrol.api</Other>
<Other>stdeb.cfg</Other>
</Others>
<MainScript>revpipycontrol/revpipycontrol.py</MainScript>
<Vcs>
<VcsType>Mercurial</VcsType>
<VcsOptions>
<dict>
<key>
<string>add</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>checkout</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>commit</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>diff</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>export</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>global</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>history</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>log</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>remove</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>status</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>tag</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>update</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
</dict>
</VcsOptions>
<VcsOtherData>
<dict/>
</VcsOtherData>
</Vcs>
<FiletypeAssociations>
<FiletypeAssociation pattern="*.idl" type="INTERFACES"/>
<FiletypeAssociation pattern="*.py" type="SOURCES"/>
<FiletypeAssociation pattern="*.py3" type="SOURCES"/>
<FiletypeAssociation pattern="*.pyw" type="SOURCES"/>
<FiletypeAssociation pattern="*.pyw3" type="SOURCES"/>
</FiletypeAssociations>
<Documentation>
<DocumentationParams>
<dict>
<key>
<string>ERIC4API</string>
</key>
<value>
<dict>
<key>
<string>ignoreDirectories</string>
</key>
<value>
<list>
<string>data</string>
<string>deb</string>
<string>dist</string>
<string>doc</string>
</list>
</value>
<key>
<string>ignoreFilePatterns</string>
</key>
<value>
<list>
<string>setup.py</string>
</list>
</value>
<key>
<string>includePrivate</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>languages</string>
</key>
<value>
<list>
<string>Python3</string>
</list>
</value>
<key>
<string>outputFile</string>
</key>
<value>
<string>revpipycontrol.api</string>
</value>
<key>
<string>useRecursion</string>
</key>
<value>
<bool>True</bool>
</value>
</dict>
</value>
<key>
<string>ERIC4DOC</string>
</key>
<value>
<dict>
<key>
<string>ignoreDirectories</string>
</key>
<value>
<list>
<string>data</string>
<string>deb</string>
<string>dist</string>
<string>doc</string>
</list>
</value>
<key>
<string>ignoreFilePatterns</string>
</key>
<value>
<list>
<string>setup.py</string>
</list>
</value>
<key>
<string>outputDirectory</string>
</key>
<value>
<string>doc</string>
</value>
<key>
<string>qtHelpEnabled</string>
</key>
<value>
<bool>False</bool>
</value>
<key>
<string>sourceExtensions</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>useRecursion</string>
</key>
<value>
<bool>True</bool>
</value>
</dict>
</value>
</dict>
</DocumentationParams>
</Documentation>
<Checkers>
<CheckersParams>
<dict>
<key>
<string>Pep8Checker</string>
</key>
<value>
<dict>
<key>
<string>DocstringType</string>
</key>
<value>
<string>pep257</string>
</value>
<key>
<string>ExcludeFiles</string>
</key>
<value>
<string></string>
</value>
<key>
<string>ExcludeMessages</string>
</key>
<value>
<string>E123,E226,E24</string>
</value>
<key>
<string>FixCodes</string>
</key>
<value>
<string></string>
</value>
<key>
<string>FixIssues</string>
</key>
<value>
<bool>False</bool>
</value>
<key>
<string>HangClosing</string>
</key>
<value>
<bool>False</bool>
</value>
<key>
<string>IncludeMessages</string>
</key>
<value>
<string></string>
</value>
<key>
<string>MaxLineLength</string>
</key>
<value>
<int>79</int>
</value>
<key>
<string>NoFixCodes</string>
</key>
<value>
<string>E501</string>
</value>
<key>
<string>RepeatMessages</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>ShowIgnored</string>
</key>
<value>
<bool>False</bool>
</value>
</dict>
</value>
</dict>
</CheckersParams>
</Checkers>
</Project>

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Manager für ACL Einträge."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter
import tkinter.messagebox as tkmsg
from mytools import gettrans
@@ -21,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)
@@ -56,8 +55,8 @@ class AclManager(ttk.Frame):
self.aclinfo = ttk.Frame(self)
for acltext in self.__dict_acltext:
lbl = ttk.Label(self.aclinfo)
lbl["text"] = _("Level") + " {}: {}".format(
acltext, self.__dict_acltext[acltext]
lbl["text"] = _("Level") + " {id}: {text}".format(
id=acltext, text=self.__dict_acltext[acltext]
)
lbl.pack(anchor="w")
@@ -276,12 +275,12 @@ class AclManager(ttk.Frame):
ask = tkmsg.askyesno(
_("Question"),
_("Do you really want to delete the following item? \n"
"\nIP: {} / Level: {}").format(*lst_ipacl),
"\nIP: {0} / Level: {1}").format(*lst_ipacl),
parent=self.master, default="no"
)
if ask:
new_acl = self.__acl.acl.replace(
"{},{}".format(*lst_ipacl), ""
"{0},{1}".format(*lst_ipacl), ""
).replace(" ", " ")
if self.__acl.loadacl(new_acl.strip()):
@@ -354,7 +353,7 @@ class AclManager(ttk.Frame):
def _savefields(self):
u"""Übernimmt neuen ACL Eintrag."""
new_acl = "{}.{}.{}.{},{}".format(
new_acl = "{0}.{1}.{2}.{3},{4}".format(
self.var_ip1.get(),
self.var_ip2.get(),
self.var_ip3.get(),
@@ -386,8 +385,8 @@ class AclManager(ttk.Frame):
acltext = property(__get_acltext, __set_acltext)
# Debugging
if __name__ == "__main__":
root = AclManager(tkinter.Tk(), 0, 9, " 192.168.50.100,2 127.0.0.*,1")
root.acltext = {0: "Keine Rechte", 1: "Hohe Rechte"}
root.mainloop()
print(root.acl)

File diff suppressed because it is too large Load Diff

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_on_event"] 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 structure the messages 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_on_event"])
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 mqtt
client can publish messages with the new io 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_on_event"] = 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_on_event": 0,
"mqttsendinterval": 30,
"mqtttls_set": 0,
"mqttusername": "",
"mqttwrite_outputs": 0,
}
root = MqttManager(tkinter.Tk(), dict_mqttsettings)
root.mainloop()

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
"""Tools-Sammlung."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import gettext
import locale
import sys
@@ -15,12 +14,16 @@ from os.path import join as pathjoin
from sys import platform
# Systemwerte und SaveFiles
# TODO: Mac einbauen
if platform == "linux":
homedir = environ["HOME"]
else:
homedir = environ["APPDATA"]
savefile_connections = pathjoin(
homedir, ".revpipyplc", "connections.dat")
savefile_developer = pathjoin(
homedir, ".revpipyplc", "developer.dat")
savefile_programpath = pathjoin(
homedir, ".revpipyplc", "programpath.dat")

View File

@@ -1,13 +1,15 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
# Thranks to: http://stackoverflow.com/questions/3085696/adding-a-
# scrollbar-to-a-group-of-widgets-in-tkinter
u"""Fenstererweiterung für den 'watch modus'."""
u"""Fenstererweiterung für den 'watch modus'.
Thranks to: http://stackoverflow.com/questions/3085696/adding-a-
scrollbar-to-a-group-of-widgets-in-tkinter
"""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import pickle
import tkinter
import tkinter.messagebox as tkmsg
@@ -99,8 +101,8 @@ class RevPiCheckClient(tkinter.Frame):
try:
newvalue = io[5].get()
# Wertebereich prüfen
if newvalue < 0 or newvalue > self.maxint(io[1]):
raise ValueError("too big")
if not self.minint(io) <= newvalue <= self.maxint(io):
raise ValueError("value not valid")
self.__chval(device, io)
@@ -108,8 +110,11 @@ class RevPiCheckClient(tkinter.Frame):
io[5].set(self.__oldvalue)
tkmsg.showerror(
_("Error"),
_("Given value for Output '{}' is not valid! \nReset to ""'{}'"
"").format(self.dict_devices[device], self.__oldvalue),
_("Given value for Output '{0}' is not valid! \n"
"Reset to '{1}'").format(
self.dict_devices[device],
self.__oldvalue
),
parent=self.dict_wins[device]
)
@@ -135,10 +140,11 @@ class RevPiCheckClient(tkinter.Frame):
canvas = tkinter.Canvas(
frame,
borderwidth=0,
width=180,
width=190,
heigh=calc_heigh if calc_heigh <= 600 else 600
)
s_frame = tkinter.Frame(canvas)
s_frame.columnconfigure(1, weight=1)
vsb = tkinter.Scrollbar(frame, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)
@@ -163,10 +169,10 @@ class RevPiCheckClient(tkinter.Frame):
# IOs generieren
rowcount = 0
for io in lst_io:
# io = [name,bytelen,byteaddr,bmk,bitaddress,(tkinter_var)]
# io = [name,blen,baddr,bmk,bitaddr,(tkinter_var),border,signed]
tkinter.Label(s_frame, text=io[0]).grid(
column=0, row=rowcount, sticky="w"
column=1, row=rowcount, sticky="w"
)
if io[4] >= 0:
@@ -177,10 +183,14 @@ class RevPiCheckClient(tkinter.Frame):
check["state"] = "disabled" if iotype == "inp" else "normal"
check["text"] = ""
check["variable"] = var
check.grid(column=1, row=rowcount)
check.grid(column=0, row=rowcount)
else:
var = tkinter.IntVar()
txt = tkinter.Spinbox(s_frame, to=self.maxint(io[1]))
txt = tkinter.Spinbox(
s_frame,
from_=self.minint(io),
to=self.maxint(io),
)
txt.bind(
"<Key>",
lambda event, tkvar=var: self.__saveoldvalue(event, tkvar)
@@ -193,15 +203,17 @@ class RevPiCheckClient(tkinter.Frame):
txt["command"] = \
lambda device=device, io=io: self.__chval(device, io)
txt["state"] = "disabled" if iotype == "inp" or \
self.maxint(io[1]) == 0 else "normal"
txt["width"] = 5
self.maxint(io) == 0 else "normal"
width = len(str(self.maxint(io))) + 1
txt["width"] = 7 if width > 7 else width
txt["textvariable"] = var
txt.grid(column=1, row=rowcount)
txt.grid(column=0, row=rowcount)
# Steuerelementvariable in IO übernehmen (mutabel)
io.append(var)
io.insert(5, var)
rowcount += 1
s_frame.update()
def _createwidgets(self):
"""Erstellt den Fensterinhalt."""
@@ -213,12 +225,11 @@ class RevPiCheckClient(tkinter.Frame):
for dev in self.lst_devices:
win = tkinter.Toplevel(self)
win.wm_title("{} | {}".format(dev, self.dict_devices[dev]))
win.wm_title("{0} | {1}".format(dev, self.dict_devices[dev]))
win.protocol(
"WM_DELETE_WINDOW",
lambda win=win: self.__hidewin(win)
)
win.resizable(False, True)
win.withdraw()
self.dict_wins[dev] = win
@@ -230,12 +241,13 @@ class RevPiCheckClient(tkinter.Frame):
for iotype in ["inp", "out"]:
frame = tkinter.Frame(group)
frame.pack(side="left", fill="both", expand=True)
frame.update()
self._createiogroup(dev, frame, iotype)
# Button erstellen
btn = tkinter.Button(devgrp)
btn["command"] = lambda win=win: self.__showwin(win)
btn["text"] = "{} | {}".format(dev, self.dict_devices[dev])
btn["text"] = "{0} | {1}".format(dev, self.dict_devices[dev])
btn.pack(**cfxpxy53)
# Steuerungsfunktionen
@@ -311,16 +323,28 @@ class RevPiCheckClient(tkinter.Frame):
try:
ba_values = bytearray(self.cli.ps_values().data)
self.err_workvalues = 0
except:
except Exception:
if self.autorw.get():
self.err_workvalues += 1
else:
self.err_workvalues = self.max_errors
if self.err_workvalues >= self.max_errors:
# Fenster zerstören bei zu vielen Fehlern
self.hideallwindows()
if self.autorw.get():
self.autorw.set(False)
self.toggleauto()
self.dowrite.set(False)
self.pack_forget()
tkmsg.showerror(
_("Error"),
_("To many errors while reading IO data. "
"Can not show the Watch-Mode."),
parent=self.master
)
return None
# Multicall zum Schreiben vorbereiten
@@ -328,7 +352,7 @@ class RevPiCheckClient(tkinter.Frame):
xmlmc = MultiCall(self.cli)
for dev in self.dict_devices:
# io = [name,bytelen,byteaddr,bmk,bitaddress,(tkinter_var)]
# io = [name,blen,baddr,bmk,bitaddr,(tkinter_var),border,signed]
# IO Typ verarbeiten
for iotype in io_dicts:
@@ -341,7 +365,9 @@ class RevPiCheckClient(tkinter.Frame):
# Bytes umwandeln
int_byte = int.from_bytes(
ba_values[io[2]:io[2] + io[1]], byteorder="little"
ba_values[io[2]:io[2] + io[1]],
byteorder="little" if len(io) < 7 else io[6],
signed=False if len(io) < 8 else io[7],
)
if io[4] >= 0:
# Bit-IO
@@ -367,11 +393,35 @@ class RevPiCheckClient(tkinter.Frame):
for win in self.dict_wins:
self.dict_wins[win].withdraw()
def maxint(self, bytelen):
def maxint(self, io):
u"""Errechnet maximalen int() Wert für Bytes max 22.
@param bytelen Anzahl Bytes
@param io IO-Liste, deren Wert berechnet werden soll
@return int() max oder 0 bei Überschreitung"""
return 0 if bytelen > 22 else 256 ** bytelen - 1
# io = [name,blen,baddr,bmk,bitaddr,(tkinter_var),border,signed]
bytelen = io[1]
if bytelen == 0:
return 0
signed = io[-1] if type(io[-1]) == bool else False
return 0 if bytelen > 22 else int.from_bytes(
(b'\x7f' if signed else b'\xff') + b'\xff' * (bytelen - 1),
byteorder="big"
)
def minint(self, io):
u"""Errechnet maximalen int() Wert für Bytes max 22.
@param io IO-Liste, deren Wert berechnet werden soll
@return int() max oder 0 bei Überschreitung"""
# io = [name,blen,baddr,bmk,bitaddr,(tkinter_var),border,signed]
bytelen = io[1]
if bytelen == 0:
return 0
signed = io[-1] if type(io[-1]) == bool else False
rc = 0 if bytelen > 22 or not signed else int.from_bytes(
b'\x80' + b'\x00' * (bytelen - 1),
byteorder="big",
signed=True
)
return rc
def readvalues(self):
u"""Ruft nur Input Werte von RevPi ab und aktualisiert Fenster."""
@@ -390,7 +440,7 @@ class RevPiCheckClient(tkinter.Frame):
if not self.autorw.get():
try:
self.chk_auto["state"] = "normal"
except:
except Exception:
pass
return None
@@ -436,10 +486,11 @@ class RevPiCheckClient(tkinter.Frame):
# Fehlermeldungen erstellen
devicename = self.dict_devices[lst_result[0]]
str_errmsg += _(
"Error set value of device '{}' Output '{}': {} \n"
"Error set value of device '{0}' Output '{1}': {2} \n"
).format(devicename, lst_result[1], lst_result[3])
if str_errmsg != "":
tkmsg.showerror(_("Error"), str_errmsg)
tkmsg.showerror(_("Error"), str_errmsg, parent=self.master)
def writevalues(self):
u"""Schreibt geänderte Outputs auf den RevPi."""

View File

@@ -0,0 +1,318 @@
# -*- coding: utf-8 -*-
u"""PLC Programm und Konfig hoch und runterladen."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import gzip
import os
import pickle
import tkinter
import tkinter.filedialog as tkfd
import tkinter.messagebox as tkmsg
from mytools import homedir
from mytools import gettrans
from mytools import savefile_developer as savefile
from tkinter import ttk
from xmlrpc.client import Binary
# Übersetzung laden
_ = gettrans()
def _loaddefaults(revpiname=None):
u"""Übernimmt für den Pi die letzen Pfade.
@param revpiname Einstellungen nur für RevPi laden
@return <class 'dict'> mit Einstellungen"""
if os.path.exists(savefile):
with open(savefile, "rb") as fh:
dict_all = pickle.load(fh)
if revpiname is None:
return dict_all
else:
return dict_all.get(revpiname, {})
return {}
def _savedefaults(revpiname, settings):
u"""Schreibt fuer den Pi die letzen Pfade.
@param revpiname Einstellungen sind für diesen RevPi
@param settings <class 'dict'> mit Einstellungen
@return True, bei erfolgreicher Verarbeitung
"""
try:
os.makedirs(os.path.dirname(savefile), exist_ok=True)
if revpiname is None:
dict_all = settings
else:
dict_all = _loaddefaults()
dict_all[revpiname] = settings
with open(savefile, "wb") as fh:
pickle.dump(dict_all, fh)
except Exception:
return False
return True
class RevPiDevelop(ttk.Frame):
u"""Zeigt Debugfenster an."""
def __init__(self, master, xmlcli, xmlmode, revpi):
u"""Init RevPiDevelop-Class.
@return None"""
if xmlmode < 3:
return None
super().__init__(master)
self.pack(expand=True, fill="both")
self.revpi = revpi
self.xmlcli = xmlcli
# Letzte Einstellungen übernehmen
self.opt = _loaddefaults(revpi)
# Einstellungen
self.pathselected = self.opt.get("pathselected", False)
self.watchpath = self.opt.get("watchpath", homedir)
self.watchfiles = self.opt.get("watchfiles", [])
# Fenster bauen
self._createwidgets()
# Alte Einstellungen anwenden
if self.pathselected:
self.load_pathfiles(silent=True)
self.refresh_stats()
def _checkclose(self, event=None):
u"""Prüft ob Fenster beendet werden soll.
@param event tkinter-Event"""
# Einstellungen speichern
self.opt["pathselected"] = self.pathselected
self.opt["watchpath"] = self.watchpath
self.opt["watchfiles"] = self.watchfiles
_savedefaults(self.revpi, self.opt)
def _createwidgets(self):
u"""Erstellt alle Widgets."""
self.rowconfigure(0, weight=1)
self.columnconfigure(0, weight=1)
# cpad = {"padx": 4, "pady": 2}
# cpade = {"padx": 4, "pady": 2, "sticky": "e"}
cpadw = {"padx": 4, "pady": 2, "sticky": "w"}
cpadwe = {"padx": 4, "pady": 2, "sticky": "we"}
# Gruppe Develop
devel = ttk.LabelFrame(self)
devel.columnconfigure(0, weight=1)
devel["text"] = _("File watcher for PLC development")
devel.grid(**cpadwe)
r = 0
lbl = ttk.Label(devel)
lbl["text"] = _("Path to list files:")
lbl.grid(row=r, **cpadw)
btn = ttk.Button(devel)
btn["command"] = self.btn_selectpath
btn["text"] = _("Select path")
btn.grid(row=r, column=1, **cpadw)
r += 1
self.lbl_path = ttk.Label(devel)
self.lbl_path["width"] = 50
self.lbl_path.grid(row=r, column=0, columnspan=2, **cpadw)
# Listbox
r += 1
trv = ttk.Frame(devel)
trv.columnconfigure(0, weight=1)
trv.grid(row=r, columnspan=2, sticky="we")
scb_files = ttk.Scrollbar(trv)
self.trv_files = ttk.Treeview(trv)
self.trv_files.bind("<<TreeviewSelect>>", self.select_pathfiles)
self.trv_files["height"] = 15
self.trv_files["yscrollcommand"] = scb_files.set
self.trv_files.grid(row=0, column=0, sticky="we")
scb_files["command"] = self.trv_files.yview
scb_files.grid(row=0, column=1, sticky="ns")
# Uploadbutton
r += 1
btnlist = ttk.Frame(devel)
btnlist.columnconfigure(1, weight=1)
btnlist.grid(row=r, columnspan=2, sticky="we")
self.btn_jobs = ttk.Button(btnlist)
self.btn_jobs["command"] = lambda: self.btn_domyjob(stop_restart=True)
self.btn_jobs["text"] = _("Stop / Upload / Start")
self.btn_jobs.grid(row=0, column=0, **cpadwe)
self.btn_jobs = ttk.Button(btnlist)
self.btn_jobs["command"] = lambda: self.btn_domyjob(stop_restart=False)
self.btn_jobs["text"] = _("Just upload")
self.btn_jobs.grid(row=0, column=1, **cpadwe)
def btn_domyjob(self, stop_restart=True):
u"""Hochladen und neu starten.
@param stop_restart Bestehendes Programm Beenden/Starten"""
if stop_restart:
# PLC Programm anhalten
self.xmlcli.plcstop()
# Aktuell konfiguriertes Programm lesen (für uploaded Flag)
opt_program = self.xmlcli.get_config()
opt_program = opt_program.get("plcprogram", "none.py")
uploaded = True
ec = 0
for fname in self.watchfiles:
# FIXME: Fehlerabfang bei Dateilesen
with open(fname, "rb") as fh:
# Ordnernamen vom System entfernen
sendname = fname.replace(self.watchpath, "")[1:]
# Prüfen ob Dateiname bereits als Startprogramm angegeben ist
if sendname == opt_program:
uploaded = False
# Datei übertragen
try:
ustatus = self.xmlcli.plcupload(
Binary(gzip.compress(fh.read())), sendname
)
except Exception:
ec = -2
break
if not ustatus:
ec = -1
break
if ec == 0:
# Wenn eines der Dateien nicht das Hauptprogram ist, info
if uploaded:
tkmsg.showinfo(
_("Information"),
_("A PLC program has been uploaded. Please check the "
"PLC options to see if the correct program is "
"specified as the start program."),
parent=self.master
)
elif ec == -1:
tkmsg.showerror(
_("Error"),
_("The Revolution Pi could not process some parts of the "
"transmission."),
parent=self.master
)
elif ec == -2:
tkmsg.showerror(
_("Error"),
_("Errors occurred during transmission"),
parent=self.master
)
if stop_restart:
# PLC Programm starten
self.xmlcli.plcstart()
def btn_selectpath(self):
u"""Lässt dem Benuzter ein Verzeichnis auswählen."""
dirselect = tkfd.askdirectory(
parent=self.master,
title=_("Directory to watch"),
mustexist=False,
initialdir=self.watchpath
)
if not dirselect:
return
# Neuen Pfad übernehmen
if os.path.exists(dirselect):
self.pathselected = True
self.watchpath = dirselect
self.load_pathfiles()
else:
tkmsg.showerror(
_("Error"),
_("Can not open the selected folder."),
parent=self.master
)
self.refresh_stats()
def load_pathfiles(self, silent=False):
u"""Aktualisiert die Dateiliste.
@param silent Keinen Dialog anzeigen"""
# Liste leeren
self.trv_files.delete(*self.trv_files.get_children())
# Dateiliste erstellen
filecount = 0
for tup_walk in os.walk(self.watchpath):
for filename in sorted(tup_walk[2]):
fullname = os.path.join(tup_walk[0], filename)
self.trv_files.insert(
"", "end", fullname,
text=fullname.replace(self.watchpath, "")[1:],
values=fullname
)
# Dateiobergrenze
filecount += 1
if filecount >= 1000:
break
if filecount >= 1000:
if not silent:
tkmsg.showwarning(
_("Warning"),
_("Found more than 1000 files! Only 1000 files can be "
"shown in this dialog, all other will be ignored."
""),
parent=self.master
)
break
# Alle Elemente für Selection prüfen und anwenden
for watchfile in self.watchfiles.copy():
try:
self.trv_files.item(watchfile)
except Exception:
self.watchfiles.remove(watchfile)
self.trv_files.selection_set(self.watchfiles)
def select_pathfiles(self, tkevt):
u"""Setzt state der Buttons."""
self.watchfiles = list(self.trv_files.selection())
self.refresh_stats()
def refresh_stats(self):
u"""Passt die Widgets an."""
self.btn_jobs["state"] = "normal" if len(self.watchfiles) > 0 \
else "disabled"
self.lbl_path["text"] = self.watchpath
# Debugging
if __name__ == "__main__":
from xmlrpc.client import ServerProxy
cli = ServerProxy("http://localhost:55123")
root = tkinter.Tk()
app = RevPiDevelop(root, cli, 3, "debugging")
app.mainloop()

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Programminformationen anzeigen."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter
import tkinter.font as tkf
import webbrowser
@@ -55,7 +54,7 @@ class RevPiInfo(tkinter.Frame):
lbl.pack(pady=5)
lbl = tkinter.Label(self)
lbl["font"] = fntmid
lbl["text"] = _("Version: {}").format(self.version)
lbl["text"] = _("Version: {0}").format(self.version)
lbl.bind(
"<ButtonPress-2>",
lambda event: self._createwidgets(extended=not extended)

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Alte Klassen laden hier, bevor sie entsorgt werden."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter
import tkinter.messagebox as tkmsg
from mytools import gettrans
@@ -23,7 +22,7 @@ class RevPiOption(tkinter.Frame):
@return None"""
try:
self.dc = xmlcli.get_config()
except:
except Exception:
self.dc = None
return None
@@ -46,17 +45,17 @@ class RevPiOption(tkinter.Frame):
u"""Prüft ob sich die Einstellungen geändert haben.
@return True, wenn min. eine Einstellung geändert wurde"""
return (
self.var_start.get() != self.dc.get("autostart", "1")
or self.var_reload.get() != self.dc.get("autoreload", "1")
or self.var_zexit.get() != self.dc.get("zeroonexit", "0")
or self.var_zerr.get() != self.dc.get("zeroonerror", "0")
or self.var_startpy.get() != self.dc.get("plcprogram", "none.py")
or self.var_startargs.get() != self.dc.get("plcarguments", "")
or self.var_pythonver.get() != self.dc.get("pythonversion", "3")
or self.var_slave.get() != self.dc.get("plcslave", "0")
or self.var_xmlon.get() != (self.dc.get("xmlrpc", 0) >= 1)
or self.var_xmlmod2.get() != (self.dc.get("xmlrpc", 0) >= 2)
or self.var_xmlmod3.get() != (self.dc.get("xmlrpc", 0) >= 3)
self.var_start.get() != self.dc.get("autostart", "1") or
self.var_reload.get() != self.dc.get("autoreload", "1") or
self.var_zexit.get() != self.dc.get("zeroonexit", "0") or
self.var_zerr.get() != self.dc.get("zeroonerror", "0") or
self.var_startpy.get() != self.dc.get("plcprogram", "none.py") or
self.var_startargs.get() != self.dc.get("plcarguments", "") or
self.var_pythonver.get() != self.dc.get("pythonversion", "3") or
self.var_slave.get() != self.dc.get("plcslave", "0") or
self.var_xmlon.get() != (self.dc.get("xmlrpc", 0) >= 1) or
self.var_xmlmod2.get() != (self.dc.get("xmlrpc", 0) >= 2) or
self.var_xmlmod3.get() != (self.dc.get("xmlrpc", 0) >= 3)
# or self.var_xmlport.get() != self.dc.get("xmlrpcport", "55123")
)
@@ -273,6 +272,7 @@ class RevPiOption(tkinter.Frame):
tkmsg.showinfo(
_("Information"),
_("You have not made any changes to save."),
parent=self.master
)
self._checkclose()
return None

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Zeigt die Logfiles an."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter
from mytools import gettrans
@@ -106,7 +105,7 @@ class RevPiLogfile(tkinter.Frame):
self.applog, self.xmlcli.load_applog, self.mrkapp, full
)
self.errapp = 0
except:
except Exception:
self.errapp += 1
# Timer neu starten
@@ -122,7 +121,7 @@ class RevPiLogfile(tkinter.Frame):
self.plclog, self.xmlcli.load_plclog, self.mrkplc, full
)
self.errplc = 0
except:
except Exception:
self.errplc += 1
# Timer neu starten

View File

@@ -1,14 +1,14 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Optionsfenster."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter
import tkinter.messagebox as tkmsg
from aclmanager import AclManager
from mqttmanager import MqttManager
from mytools import gettrans
# Übersetzung laden
@@ -24,7 +24,7 @@ class RevPiOption(tkinter.Frame):
@return None"""
try:
self.dc = xmlcli.get_config()
except:
except Exception:
self.dc = None
return None
@@ -33,10 +33,34 @@ 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_on_event": 0,
"mqttsendinterval": 30,
"mqtttls_set": 0,
"mqttusername": "",
"mqttwrite_outputs": 0,
}
self.replace_ios_options = [
_("Do not use replace io file"),
_("Use static file from RevPiPyLoad"),
_("Use dynamic file from work directory"),
_("Give own path and filename"),
]
self.mrk_xmlmodask = False
self.dorestart = False
@@ -44,26 +68,59 @@ class RevPiOption(tkinter.Frame):
self._createwidgets()
self._loadappdata()
def __state_replace_ios(self, text):
u"""Konfiguriert Werte für replace_io.
@param text: Ausgewählter Eintrag in Liste"""
selected_id = self.replace_ios_options.index(text)
# Preset value
if selected_id == 0:
self.var_replace_ios.set("")
elif selected_id == 1:
self.var_replace_ios.set("/etc/revpipyload/replace_ios.conf")
else:
self.var_replace_ios.set("replace_ios.conf")
# Set state of input field
self.txt_replace_ios["state"] = "normal" \
if self.xmlmodus >= 4 and \
selected_id == 3 \
else "disabled"
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_start.get() != self.dc.get("autostart", 1)
or self.var_reload.get() != self.dc.get("autoreload", 1)
or self.var_reload_delay.get() !=
str(self.dc.get("autoreloaddelay", 5))
or self.var_zexit.get() != self.dc.get("zeroonexit", 0)
or self.var_zerr.get() != self.dc.get("zeroonerror", 0)
self.var_start.get() != self.dc.get("autostart", 1) or
self.var_reload.get() != self.dc.get("autoreload", 1) or
self.var_reload_delay.get() !=
str(self.dc.get("autoreloaddelay", 5)) or
self.var_zexit.get() != self.dc.get("zeroonexit", 0) or
self.var_zerr.get() != self.dc.get("zeroonerror", 0) or
self.var_replace_ios.get() != self.dc.get("replace_ios", "") or
# TODO: rtlevel (0)
or self.var_startpy.get() != self.dc.get("plcprogram", "none.py")
or self.var_startargs.get() != self.dc.get("plcarguments", "")
or self.var_pythonver.get() != self.dc.get("pythonversion", 3)
or self.var_slave.get() != self.dc.get("plcslave", 0)
or self.var_slaveacl.get() != self.dc.get("plcslaveacl", "")
or self.var_xmlon.get() != self.dc.get("xmlrpc", 0)
or self.var_xmlacl.get() != self.dc.get("xmlrpcacl", "")
self.var_startpy.get() != self.dc.get("plcprogram", "none.py") or
self.var_startargs.get() != self.dc.get("plcarguments", "") or
self.var_pythonver.get() != self.dc.get("pythonversion", 3) or
self.var_plcworkdir_set_uid.get() != \
self.dc.get("plcworkdir_set_uid") or
self.var_slave.get() != self.dc.get("plcslave", 0) or
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", "") 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"""
@@ -105,6 +162,9 @@ class RevPiOption(tkinter.Frame):
# Gruppe Start/Stop
stst = tkinter.LabelFrame(self)
stst.columnconfigure(0, weight=1)
stst.columnconfigure(1, weight=1)
stst.columnconfigure(2, weight=1)
stst["text"] = _("Start / Stop behavior")
stst.grid(columnspan=2, pady=2, sticky="we")
@@ -113,112 +173,148 @@ class RevPiOption(tkinter.Frame):
self.var_reload_delay = tkinter.StringVar(stst)
self.var_zexit = tkinter.BooleanVar(stst)
self.var_zerr = tkinter.BooleanVar(stst)
self.var_replace_ios = tkinter.StringVar(stst)
self.var_replace_ios_options = tkinter.StringVar(stst)
# Row 0
ckb_start = tkinter.Checkbutton(stst)
ckb_start["text"] = _("Start program automatically")
ckb_start["state"] = xmlstate
ckb_start["variable"] = self.var_start
ckb_start.grid(columnspan=2, **cpadw)
ckb_start.grid(columnspan=3, **cpadw)
# Row 1
ckb_reload = tkinter.Checkbutton(stst)
ckb_reload["text"] = _("Restart program after exit")
ckb_reload["state"] = xmlstate
ckb_reload["variable"] = self.var_reload
ckb_reload.grid(columnspan=2, **cpadw)
ckb_reload.grid(columnspan=3, **cpadw)
# Row 2
lbl = tkinter.Label(stst)
lbl["text"] = _("Restart after n seconds of delay")
lbl.grid(**cpadw)
lbl.grid(columnspan=2, **cpadw)
sbx = tkinter.Spinbox(stst)
sbx["to"] = 60
sbx["from_"] = 5
sbx["textvariable"] = self.var_reload_delay
sbx["width"] = 4
sbx.grid(column=1, row=2, **cpade)
sbx.grid(column=2, row=2, **cpade)
# Row 3
lbl = tkinter.Label(stst)
lbl["text"] = _("Set process image to NULL if program terminates...")
lbl.grid(columnspan=2, **cpadw)
lbl.grid(columnspan=3, **cpadw)
# Row 4
ckb_zexit = tkinter.Checkbutton(stst, justify="left")
ckb_zexit["state"] = xmlstate
ckb_zexit["text"] = _("... successfully")
ckb_zexit["variable"] = self.var_zexit
ckb_zexit.grid(**cpadw)
ckb_zexit.grid(column=1, **cpadw)
# Row 5
ckb_zerr = tkinter.Checkbutton(stst, justify="left")
ckb_zerr["state"] = xmlstate
ckb_zerr["text"] = _("... with errors")
ckb_zerr["variable"] = self.var_zerr
ckb_zerr.grid(**cpadw)
ckb_zerr.grid(column=1, **cpadw)
# Row 6
lbl = tkinter.Label(stst)
lbl["text"] = _("Replace IO file:")
lbl.grid(row=6, **cpadw)
opt = tkinter.OptionMenu(
stst, self.var_replace_ios_options, *self.replace_ios_options,
command=self.__state_replace_ios
)
opt["state"] = xmlstate
opt["width"] = 30
opt.grid(row=6, column=1, columnspan=2, **cpadwe)
# Row 7
self.txt_replace_ios = tkinter.Entry(stst)
self.txt_replace_ios["state"] = xmlstate
self.txt_replace_ios["textvariable"] = self.var_replace_ios
self.txt_replace_ios.grid(column=1, columnspan=2, **cpadwe)
# Gruppe Programm
prog = tkinter.LabelFrame(self)
prog.columnconfigure(0, weight=1)
prog.columnconfigure(1, weight=1)
prog.columnconfigure(2, weight=1)
prog["text"] = _("PLC program")
prog.grid(columnspan=2, pady=2, sticky="we")
self.var_pythonver = tkinter.IntVar(prog)
self.var_startpy = tkinter.StringVar(prog)
self.var_startargs = tkinter.StringVar(prog)
self.var_slaveacl = tkinter.StringVar(prog)
self.var_plcworkdir_set_uid = tkinter.BooleanVar(prog)
self.var_pythonver.set(3)
# Row 0
lbl = tkinter.Label(prog)
lbl["text"] = _("Python version") + ":"
lbl.grid(columnspan=2, row=0, **cpadw)
lbl.grid(row=0, **cpadw)
rbn = tkinter.Radiobutton(prog)
rbn["state"] = xmlstate
rbn["text"] = "Python2"
rbn["value"] = 2
rbn["variable"] = self.var_pythonver
rbn.grid(column=0, row=1, **cpade)
rbn.grid(row=0, column=1, **cpade)
rbn = tkinter.Radiobutton(prog)
rbn["state"] = xmlstate
rbn["text"] = "Python3"
rbn["value"] = 3
rbn["variable"] = self.var_pythonver
rbn.grid(column=1, row=1, **cpadw)
rbn.grid(row=0, column=2, **cpadw)
# Row 2
# Row 1
lbl = tkinter.Label(prog)
lbl["text"] = _("Python PLC program name")
lbl.grid(columnspan=2, **cpadw)
lbl.grid(columnspan=3, **cpadw)
# Row 3
# Row 2
lst = self.xmlcli.get_filelist()
lst.sort()
if ".placeholder" in lst:
lst.remove(".placeholder")
if len(lst) == 0:
lst.append("none")
opt_startpy = tkinter.OptionMenu(
prog, self.var_startpy, *lst
)
opt_startpy["state"] = xmlstate
opt_startpy.grid(columnspan=2, **cpadwe)
opt_startpy.grid(columnspan=3, **cpadwe)
# Row 4
# Row 3
lbl = tkinter.Label(prog)
lbl["text"] = _("Program arguments")
lbl.grid(columnspan=2, **cpadw)
lbl["text"] = _("Program arguments:")
lbl.grid(**cpadw)
# Row 5
txt = tkinter.Entry(prog)
txt["textvariable"] = self.var_startargs
txt.grid(columnspan=2, **cpadw)
txt.grid(row=3, column=1, columnspan=2, **cpadwe)
# Row 4
ckb = tkinter.Checkbutton(prog)
ckb["text"] = _("Set write access to workdirectory")
ckb["state"] = xmlstate
ckb["variable"] = self.var_plcworkdir_set_uid
ckb.grid(columnspan=2, **cpadw)
# Gruppe Services
services = tkinter.LabelFrame(self)
services["text"] = _("RevPiPyLoad server services")
services.grid(columnspan=2, pady=2, sticky="we")
self.var_slave = tkinter.BooleanVar(services)
self.var_xmlon = tkinter.BooleanVar(services)
self.var_xmlacl = tkinter.StringVar(services)
# RevPiSlave Service
self.var_slave = tkinter.BooleanVar(services)
self.var_slaveacl = tkinter.StringVar(services)
row = 0
ckb_slave = tkinter.Checkbutton(services, justify="left")
ckb_slave["state"] = xmlstate
@@ -229,7 +325,7 @@ class RevPiOption(tkinter.Frame):
btn_slaveacl = tkinter.Button(services, justify="center")
btn_slaveacl["command"] = self.btn_slaveacl
btn_slaveacl["text"] = _("Edit ACL")
btn_slaveacl.grid(column=1, row=row, **cpade)
btn_slaveacl.grid(column=1, row=row, **cpadwe)
row = 1
lbl = tkinter.Label(services)
@@ -242,8 +338,39 @@ class RevPiOption(tkinter.Frame):
lbl["text"] = _("running") if status else _("stopped")
lbl.grid(column=1, row=row, **cpadwe)
# MQTT Service
self.var_mqtton = tkinter.BooleanVar(services)
try:
status = self.xmlcli.mqttrunning()
except Exception:
pass
else:
row = 2
ckb_slave = tkinter.Checkbutton(services, justify="left")
ckb_slave["state"] = xmlstate
ckb_slave["text"] = _("MQTT process image publisher")
ckb_slave["variable"] = self.var_mqtton
ckb_slave.grid(column=0, **cpadw)
btn_slaveacl = tkinter.Button(services, justify="center")
btn_slaveacl["command"] = self.btn_mqttsettings
btn_slaveacl["text"] = _("Settings")
btn_slaveacl.grid(column=1, row=row, **cpadwe)
row = 3
lbl = tkinter.Label(services)
lbl["text"] = _("MQTT publish service is:")
lbl.grid(column=0, **cpade)
lbl = tkinter.Label(services)
lbl["fg"] = "green" if status else "red"
lbl["text"] = _("running") if status else _("stopped")
lbl.grid(column=1, row=row, **cpadwe)
# XML-RPC Service
row = 2
self.var_xmlon = tkinter.BooleanVar(services)
self.var_xmlacl = tkinter.StringVar(services)
row = 4
ckb_xmlon = tkinter.Checkbutton(services)
ckb_xmlon["command"] = self.askxmlon
ckb_xmlon["state"] = xmlstate
@@ -254,7 +381,7 @@ class RevPiOption(tkinter.Frame):
btn_slaveacl = tkinter.Button(services, justify="center")
btn_slaveacl["command"] = self.btn_xmlacl
btn_slaveacl["text"] = _("Edit ACL")
btn_slaveacl.grid(column=1, row=row, **cpade)
btn_slaveacl.grid(column=1, row=row, **cpadwe)
# Buttons am Ende
btn_save = tkinter.Button(self)
@@ -279,11 +406,30 @@ class RevPiOption(tkinter.Frame):
self.var_reload_delay.set(self.dc.get("autoreloaddelay", 5))
self.var_zexit.set(self.dc.get("zeroonexit", 0))
self.var_zerr.set(self.dc.get("zeroonerror", 0))
replace_ios = self.dc.get("replace_ios", "")
self.var_replace_ios.set(replace_ios)
if replace_ios == "":
self.var_replace_ios_options.set(self.replace_ios_options[0])
elif replace_ios == "/etc/revpipyload/replace_ios.conf":
self.var_replace_ios_options.set(self.replace_ios_options[1])
elif replace_ios == "replace_ios.conf":
self.var_replace_ios_options.set(self.replace_ios_options[2])
else:
self.var_replace_ios_options.set(self.replace_ios_options[3])
self.__state_replace_ios(self.var_replace_ios_options.get())
# TODO: rtlevel (0)
self.var_startpy.set(self.dc.get("plcprogram", "none.py"))
self.var_startargs.set(self.dc.get("plcarguments", ""))
self.var_pythonver.set(self.dc.get("pythonversion", 3))
self.var_plcworkdir_set_uid.set(
self.dc.get("plcworkdir_set_uid", False))
# 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", ""))
@@ -299,6 +445,7 @@ class RevPiOption(tkinter.Frame):
tkmsg.showinfo(
_("Information"),
_("You have not made any changes to save."),
parent=self.master
)
self._checkclose()
return None
@@ -307,13 +454,6 @@ class RevPiOption(tkinter.Frame):
if not self._checkvalues():
return None
# ask = tkmsg.askyesnocancel(
# _("Question"),
# _("The settings are now saved on the Revolution Pi. \n\n"
# "Should the new settings take effect immediately? \nThis "
# "means a restart of the service and the PLC program!"),
# parent=self.master
# )
ask = tkmsg.askokcancel(
_("Question"),
_("The settings will be set on the Revolution Pi now. \n\n"
@@ -329,13 +469,41 @@ class RevPiOption(tkinter.Frame):
self.dc["plcprogram"] = self.var_startpy.get()
self.dc["plcarguments"] = self.var_startargs.get()
self.dc["pythonversion"] = self.var_pythonver.get()
self.dc["plcworkdir_set_uid"] = \
int(self.var_plcworkdir_set_uid.get())
# TODO: rtlevel (0)
self.dc["zeroonerror"] = int(self.var_zerr.get())
self.dc["zeroonexit"] = int(self.var_zexit.get())
self.dc["replace_ios"] = self.var_replace_ios.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_on_event"] = \
int(self._dict_mqttsettings["mqttsend_on_event"])
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()
@@ -368,34 +536,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"),
@@ -403,4 +583,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()

View File

@@ -1,17 +1,18 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Fenster um RevPi-Verbindungen einzurichten."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import os.path
import pickle
import tkinter
import tkinter.messagebox as tkmsg
from mytools import gettrans
from mytools import savefile_connections as savefile
from revpidevelop import _loaddefaults as developloaddefaults
from revpidevelop import _savedefaults as developsavedefaults
from revpiprogram import _loaddefaults as programloaddefaults
from revpiprogram import _savedefaults as programsavedefaults
from os import makedirs
@@ -150,15 +151,20 @@ class RevPiPlcList(tkinter.Frame):
with open(savefile, "wb") as fh:
pickle.dump(self._connections, fh)
self.changes = False
except:
except Exception:
return False
# Andere Einstellungen aufräumen
dict = programloaddefaults()
for revpi in tuple(dict.keys()):
dict_o = developloaddefaults()
for revpi in tuple(dict_o.keys()):
if revpi not in self._connections:
del dict[revpi]
programsavedefaults(None, dict)
del dict_o[revpi]
developsavedefaults(None, dict_o)
dict_o = programloaddefaults()
for revpi in tuple(dict_o.keys()):
if revpi not in self._connections:
del dict_o[revpi]
programsavedefaults(None, dict_o)
return True
@@ -195,7 +201,7 @@ class RevPiPlcList(tkinter.Frame):
item = self.list_conn.get(item_index[0])
ask = tkmsg.askyesno(
_("Question"),
_("Do you really want to delete the selected connection '{}'?"
_("Do you really want to delete the selected connection '{0}'?"
"").format(item),
parent=self.master
)
@@ -243,9 +249,9 @@ class RevPiPlcList(tkinter.Frame):
def evt_keypress(self, evt=None):
u"""Passt bei Tastendruck den Status der Buttons an."""
okvalue = "normal" if (
self.var_address.get() != ""
and self.var_name.get() != ""
and self.var_port.get() != ""
self.var_address.get() != "" and
self.var_name.get() != "" and
self.var_port.get() != ""
) else "disabled"
self.btn_add["state"] = okvalue

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""PLC Programm und Konfig hoch und runterladen."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import gzip
import os
import pickle
@@ -15,8 +14,8 @@ import tkinter.filedialog as tkfd
import tkinter.messagebox as tkmsg
import zipfile
from mytools import gettrans
from mytools import homedir
from mytools import savefile_programpath as savefile
from os import makedirs
from shutil import rmtree
from tempfile import mkstemp, mkdtemp
from xmlrpc.client import Binary
@@ -48,7 +47,7 @@ def _savedefaults(revpiname, settings):
"""
try:
makedirs(os.path.dirname(savefile), exist_ok=True)
os.makedirs(os.path.dirname(savefile), exist_ok=True)
if revpiname is None:
dict_all = settings
else:
@@ -56,7 +55,7 @@ def _savedefaults(revpiname, settings):
dict_all[revpiname] = settings
with open(savefile, "wb") as fh:
pickle.dump(dict_all, fh)
except:
except Exception:
return False
return True
@@ -82,7 +81,7 @@ class RevPiProgram(tkinter.Frame):
self.xmlstate = "normal" if xmlmode >= 3 else "disabled"
# Letzte Einstellungen übernehmen
self.opt = _loaddefaults()
self.opt = _loaddefaults(revpi)
# Fenster bauen
self._createwidgets()
@@ -325,7 +324,7 @@ class RevPiProgram(tkinter.Frame):
if fh is not None:
try:
fh.write(self.xmlcli.get_pictoryrsc().data)
except:
except Exception:
tkmsg.showerror(
_("Error"),
_("Could not load and save file!"),
@@ -339,7 +338,7 @@ class RevPiProgram(tkinter.Frame):
)
# Einstellungen speichern
self.opt["getpictoryrsc_dir"] = os.path.dirname(fh.name)
self._savedefaults(self.revpi, self.opt)
_savedefaults(self.revpi, self.opt)
finally:
fh.close()
@@ -356,7 +355,7 @@ class RevPiProgram(tkinter.Frame):
if fh is not None:
try:
fh.write(self.xmlcli.get_procimg().data)
except:
except Exception:
tkmsg.showerror(
_("Error"),
_("Could not load and save file!"),
@@ -370,7 +369,7 @@ class RevPiProgram(tkinter.Frame):
)
# Einstellungen speichern
self.opt["getprocimg_dir"] = os.path.dirname(fh.name)
self._savedefaults(self.revpi, self.opt)
_savedefaults(self.revpi, self.opt)
finally:
fh.close()
@@ -418,7 +417,7 @@ class RevPiProgram(tkinter.Frame):
# Einstellungen speichern
self.opt["setpictoryrsc_dir"] = os.path.dirname(fh.name)
self._savedefaults(self.revpi, self.opt)
_savedefaults(self.revpi, self.opt)
elif ec == -1:
tkmsg.showerror(
_("Error"),
@@ -561,7 +560,7 @@ class RevPiProgram(tkinter.Frame):
self.opt["typedown"] = self.var_typedown.get()
self.opt["picdown"] = self.var_picdown.get()
except:
except Exception:
raise
tkmsg.showerror(
_("Error"),
@@ -576,7 +575,7 @@ class RevPiProgram(tkinter.Frame):
)
# Einstellungen speichern
self._savedefaults(self.revpi, self.opt)
_savedefaults(self.revpi, self.opt)
finally:
fh.close()
@@ -588,6 +587,7 @@ class RevPiProgram(tkinter.Frame):
dirtmp = None
filelist = []
fileselect = None
foldername = ""
rscfile = None
if tup == 0:
@@ -595,7 +595,7 @@ class RevPiProgram(tkinter.Frame):
fileselect = tkfd.askopenfilenames(
parent=self.master,
title="Upload Python program...",
initialdir=self.opt.get("plcupload_dir", ""),
initialdir=self.opt.get("plcupload_dir", homedir),
filetypes=(("Python", "*.py"), (_("All files"), "*.*"))
)
if type(fileselect) == tuple and len(fileselect) > 0:
@@ -608,8 +608,12 @@ class RevPiProgram(tkinter.Frame):
parent=self.master,
title=_("Folder to upload"),
mustexist=True,
initialdir=self.opt.get("plcupload_dir", self.revpi)
initialdir=self.opt.get("plcupload_dir", homedir)
)
# Ordnernamen merken um diesen auf RevPi anzulegen
foldername = os.path.basename(dirselect)
if type(dirselect) == str and dirselect != "":
filelist = self.create_filelist(dirselect)
@@ -706,7 +710,11 @@ class RevPiProgram(tkinter.Frame):
if dirselect == "":
sendname = os.path.basename(fname)
else:
sendname = fname.replace(dirselect, "")[1:]
# Ordnernamen in Dateipfad für RevPi übernehmen
sendname = os.path.join(
foldername,
fname.replace(dirselect, "")[1:]
)
# Prüfen ob Dateiname bereits als Startprogramm angegeben ist
if sendname == opt_program:
@@ -716,7 +724,7 @@ class RevPiProgram(tkinter.Frame):
try:
ustatus = self.xmlcli.plcupload(
Binary(gzip.compress(fh.read())), sendname)
except:
except Exception:
ec = -2
break
@@ -752,7 +760,7 @@ class RevPiProgram(tkinter.Frame):
self.opt["typeup"] = self.var_typeup.get()
self.opt["picup"] = self.var_picup.get()
self._savedefaults(self.revpi, self.opt)
_savedefaults(self.revpi, self.opt)
elif ec == -1:
tkmsg.showerror(

View File

@@ -1,14 +1,14 @@
#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# RevPiPyControl
# Version: see global var pycontrolverion
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Hauptprogramm."""
u"""RevPiPyControl main program."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
__version__ = "0.8.1"
import revpicheckclient
import revpidevelop
import revpiinfo
import revpilogfile
import revpioption
@@ -25,8 +25,6 @@ from xmlrpc.client import ServerProxy
# Übersetzung laden
_ = gettrans()
pycontrolversion = "0.6.0"
class RevPiPyControl(tkinter.Frame):
@@ -42,13 +40,15 @@ class RevPiPyControl(tkinter.Frame):
self.cli = None
self.dict_conn = revpiplclist.get_connections()
self.errcount = 0
self.revpiaddress = None
self.revpiname = None
self.revpipyversion = [0, 0, 0]
self.xmlfuncs = []
self.xmlmode = 0
# Debugger vorbereiten
# Frames vorbereiten
self.debugframe = None
self.developframe = None
# Globale Fenster
self.tkcheckclient = None
@@ -75,10 +75,15 @@ class RevPiPyControl(tkinter.Frame):
u"""Schließt alle Fenster."""
if self.tkcheckclient is not None:
self.tkcheckclient.destroy()
if self.developframe is not None:
self.developframe._checkclose()
self.developframe.destroy()
self.developframe = None
if self.tklogs is not None:
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:
@@ -86,7 +91,7 @@ class RevPiPyControl(tkinter.Frame):
self.debugframe = None
try:
self.cli.psstop()
except:
except Exception:
pass
def _closeapp(self, event=None):
@@ -125,38 +130,43 @@ class RevPiPyControl(tkinter.Frame):
menu1.add_command(label=_("Info..."), command=self.infowindow)
self.mbar.add_cascade(label=_("Help"), menu=menu1)
self.var_conn = tkinter.StringVar(self)
self.txt_connect = tkinter.Entry(self, state="readonly", width=40)
self.main_frame = tkinter.Frame(self)
self.main_frame.pack(side="left", fill="y")
self.var_conn = tkinter.StringVar(self.main_frame)
self.txt_connect = tkinter.Entry(
self.main_frame, state="readonly", width=40
)
self.txt_connect["textvariable"] = self.var_conn
self.txt_connect.pack(fill="x")
self.btn_plcstart = tkinter.Button(self)
self.btn_plcstart = tkinter.Button(self.main_frame)
self.btn_plcstart["text"] = _("PLC start")
self.btn_plcstart["command"] = self.plcstart
self.btn_plcstart.pack(fill="x")
self.btn_plcstop = tkinter.Button(self)
self.btn_plcstop = tkinter.Button(self.main_frame)
self.btn_plcstop["text"] = _("PLC stop")
self.btn_plcstop["command"] = self.plcstop
self.btn_plcstop.pack(fill="x")
self.btn_plcrestart = tkinter.Button(self)
self.btn_plcrestart = tkinter.Button(self.main_frame)
self.btn_plcrestart["text"] = _("PLC restart")
self.btn_plcrestart["command"] = self.plcrestart
self.btn_plcrestart.pack(fill="x")
self.btn_plclogs = tkinter.Button(self)
self.btn_plclogs = tkinter.Button(self.main_frame)
self.btn_plclogs["text"] = _("PLC logs")
self.btn_plclogs["command"] = self.plclogs
self.btn_plclogs.pack(fill="x")
self.var_status = tkinter.StringVar(self)
self.txt_status = tkinter.Entry(self)
self.var_status = tkinter.StringVar(self.main_frame)
self.txt_status = tkinter.Entry(self.main_frame)
self.txt_status["state"] = "readonly"
self.txt_status["textvariable"] = self.var_status
self.txt_status.pack(fill="x")
self.btn_debug = tkinter.Button(self)
self.btn_debug = tkinter.Button(self.main_frame)
self.btn_debug["text"] = _("PLC watch mode")
self.btn_debug["command"] = self.plcdebug
self.btn_debug.pack(fill="x")
@@ -179,6 +189,12 @@ class RevPiPyControl(tkinter.Frame):
label=_("PLC options..."), command=self.plcoptions)
self.mplc.add_command(
label=_("PLC program..."), command=self.plcprogram)
self.mplc.add_command(
label=_("PLC developer..."), command=self.plcdevelop)
self.mplc.add_separator()
self.mplc.add_command(
label=_("piCtory configuration"), command=self.plcpictory)
self.mplc.add_separator()
self.mplc.add_command(
@@ -194,12 +210,12 @@ class RevPiPyControl(tkinter.Frame):
@param text Verbindungsname
@param reconnect Socket Timeout nicht heruntersetzen"""
if reconnect:
socket.setdefaulttimeout(10)
socket.setdefaulttimeout(6)
else:
socket.setdefaulttimeout(2)
sp = ServerProxy(
"http://{}:{}".format(
"http://{0}:{1}".format(
self.dict_conn[text][0], int(self.dict_conn[text][1])
)
)
@@ -208,18 +224,19 @@ class RevPiPyControl(tkinter.Frame):
self.xmlfuncs = sp.system.listMethods()
self.xmlmode = sp.xmlmodus()
self.revpipyversion = list(map(int, sp.version().split(".")))
except:
except Exception as e:
self.servererror()
else:
self._closeall()
socket.setdefaulttimeout(10)
socket.setdefaulttimeout(6)
self.cli = ServerProxy(
"http://{}:{}".format(
"http://{0}:{1}".format(
self.dict_conn[text][0], int(self.dict_conn[text][1])
)
)
self.revpiaddress = self.dict_conn[text][0]
self.revpiname = text
self.var_conn.set("{} - {}:{}".format(
self.var_conn.set("{0} - {1}:{2}".format(
text, self.dict_conn[text][0], int(self.dict_conn[text][1])
))
self.mbar.entryconfig("PLC", state="normal")
@@ -229,10 +246,9 @@ class RevPiPyControl(tkinter.Frame):
win = tkinter.Toplevel(self)
win.focus_set()
win.grab_set()
revpiinfo.RevPiInfo(win, self.cli, pycontrolversion)
revpiinfo.RevPiInfo(win, self.cli, __version__)
self.wait_window(win)
self.dict_conn = revpiplclist.get_connections()
self._fillconnbar()
def plcdebug(self):
u"""Baut den Debugframe und packt ihn.
@@ -242,45 +258,72 @@ class RevPiPyControl(tkinter.Frame):
if "psstart" not in self.xmlfuncs:
tkmsg.showwarning(
_("Warning"),
_("The watch mode ist not supported in version {} "
_("The watch mode ist not supported in version {0} "
"of RevPiPyLoad on your RevPi! You need at least version "
"0.5.3! Maybe the python3-revpimodio2 module is not "
"installed on your RevPi at least version 2.0.0."
"").format(self.cli.version()),
parent=self.master
)
return
# FIXME: Bei neuer piCtory Konfig schneller vernichten
if self.debugframe is None:
try:
self.debugframe = revpicheckclient.RevPiCheckClient(
self.main_frame, self.cli, self.xmlmode
)
except Exception:
tkmsg.showwarning(
_("Error"),
_("Can not load piCtory configuration. \n"
"Did you create a hardware configuration? "
"Please check this in piCtory!"),
parent=self.master
)
self.btn_debug["state"] = "normal"
return None
# Fehler prüfen
if self.debugframe.err_workvalues >= self.debugframe.max_errors:
self.debugframe = None
return None
# Show/Hide wechseln
if self.debugframe.winfo_viewable():
self.debugframe.hideallwindows()
if self.debugframe.autorw.get():
self.debugframe.autorw.set(False)
self.debugframe.toggleauto()
self.debugframe.dowrite.set(False)
self.debugframe.pack_forget()
else:
# Debugfenster laden
if self.debugframe is None \
or self.debugframe.err_workvalues >= \
self.debugframe.max_errors:
try:
self.debugframe = revpicheckclient.RevPiCheckClient(
self, self.cli, self.xmlmode
)
except:
tkmsg.showwarning(
_("Error"),
_("Can not load piCtory configuration. \n"
"Did you create a hardware configuration? "
"Please check this in piCtory!"),
parent=self.master
)
self.btn_debug["state"] = "normal"
return None
self.debugframe.pack(fill="x")
# Show/Hide wechseln
if self.debugframe.winfo_viewable():
self.debugframe.hideallwindows()
if self.debugframe.autorw.get():
self.debugframe.autorw.set(False)
self.debugframe.toggleauto()
self.debugframe.dowrite.set(False)
self.debugframe.pack_forget()
else:
self.debugframe.pack(fill="x")
self.btn_debug["state"] = "normal"
self.btn_debug["state"] = "normal"
def plcdevelop(self):
u"""Startet das Developfenster."""
if self.xmlmode < 3:
tkmsg.showwarning(
_("Warning"),
_("XML-RPC access mode in the RevPiPyLoad "
"configuration is too small to access this dialog!"),
parent=self.master
)
return
# Developframe laden
if self.developframe is None:
self.developframe = revpidevelop.RevPiDevelop(
self, self.cli, self.xmlmode, self.revpiname
)
if self.developframe.winfo_viewable():
self.developframe._checkclose()
self.developframe.pack_forget()
else:
self.developframe.pack(side="right") # fill="x")
def plclist(self):
u"""Öffnet das Fenster für die Verbindungen."""
@@ -298,7 +341,7 @@ class RevPiPyControl(tkinter.Frame):
if "load_plclog" not in self.xmlfuncs:
tkmsg.showwarning(
_("Warning"),
_("This version of Logviewer ist not supported in version {} "
_("This version of Logviewer ist not supported in version {0} "
"of RevPiPyLoad on your RevPi! You need at least version "
"0.4.1.").format(self.cli.version()),
parent=self.master
@@ -344,6 +387,10 @@ class RevPiPyControl(tkinter.Frame):
if self.debugframe is not None:
self.cli.psstart()
def plcpictory(self):
u"""Öffnet piCtory Konfiguraiton."""
webbrowser.open("http://{0}/".format(self.revpiaddress))
def plcprogram(self):
u"""Startet das Programmfenster."""
if self.xmlmode < 2:
@@ -388,7 +435,10 @@ class RevPiPyControl(tkinter.Frame):
self.serverdisconnect()
tkmsg.showerror(
_("Error"),
_("Can not reach server!"),
_("Can not connect to RevPi XML-RPC Service! \n\n"
"This could have the following reasons: The RevPi is not "
"online, the XML-RPC service is not running or the ACL "
"permission is not set for your IP!!!"),
parent=self.master
)
@@ -401,7 +451,7 @@ class RevPiPyControl(tkinter.Frame):
else:
try:
plcec = self.cli.plcexitcode()
except:
except Exception:
self.errcount += 1
if self.errcount >= 5:
self.var_status.set("SERVER ERROR")

View File

@@ -1 +1,6 @@
# -*- coding: utf-8 -*-
"""Shared modules."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# IpAclManager
#
# (c) Sven Sager, License: LGPLv3
# Version 0.1.0
#
"""Verwaltet IP Adressen und deren ACLs."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
from os import access, R_OK, W_OK
from re import match as rematch
@@ -66,7 +65,7 @@ class IpAclManager():
return ACLs als <class 'str'>"""
str_acl = ""
for aclip in sorted(self.__dict_acl):
str_acl += "{},{} ".format(aclip, self.__dict_acl[aclip])
str_acl += "{0},{1} ".format(aclip, self.__dict_acl[aclip])
return str_acl.strip()
def __get_filename(self):
@@ -173,14 +172,14 @@ class IpAclManager():
if not access(filename, W_OK):
return False
header = "# {}Access Control List (acl)\n" \
header = "# {0}Access Control List (acl)\n" \
"# One entry per Line IPADRESS,LEVEL\n" \
"#\n".format("" if aclname is None else aclname + " ")
with open(filename, "w") as fh:
fh.write(header)
for aclip in sorted(self.__dict_acl):
fh.write("{},{}\n".format(aclip, self.__dict_acl[aclip]))
fh.write("{0},{1}\n".format(aclip, self.__dict_acl[aclip]))
return True

107
setup.py
View File

@@ -1,10 +1,11 @@
# -*- coding: utf-8 -*-
#
# (c) Sven Sager, License: LGPLv3
#
"""Setupscript fuer RevPiPyLoad."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "LGPLv3"
import distutils.command.install_egg_info
from sys import platform
from distutils.core import setup
from glob import glob
@@ -17,78 +18,42 @@ class MyEggInfo(distutils.command.install_egg_info.install_egg_info):
pass
globsetup = {
"author": "Sven Sager",
"author_email": "akira@narux.de",
"url": "https://revpimodio.org/revpipyplc/",
"license": "LGPLv3",
"version": "0.6.0",
setup(
version="0.8.1",
python_requires="~=3.4",
requires=["tkinter", "zeroconf"],
"name": "revpipycontrol",
scripts=["data/revpipycontrol"],
data_files=[
("share/applications", ["data/revpipycontrol.desktop"]),
("share/icons/hicolor/32x32/apps", ["data/revpipycontrol.png"]),
("share/revpipycontrol", glob("revpipycontrol/*.*")),
("share/revpipycontrol/shared", glob("revpipycontrol/shared/*.*")),
(
"share/revpipycontrol/locale/de/LC_MESSAGES",
glob("revpipycontrol/locale/de/LC_MESSAGES/*.mo")
),
],
"description": "PLC Loader für Python-Projekte auf den RevolutionPi",
"long_description": ""
# Additional meta-data
name="revpipycontrol",
author="Sven Sager",
author_email="akira@narux.de",
maintainer="Sven Sager",
maintainer_email="akira@revpimodio.org",
url="https://revpimodio.org/revpipyplc/",
description="GUI for Revolution Pi to upload programs and do IO-Checks",
long_description=""
"Dieses Programm startet beim Systemstart ein angegebenes Python PLC\n"
"Programm. Es überwacht das Programm und startet es im Fehlerfall neu.\n"
"Bei Abstruz kann das gesamte /dev/piControl0 auf 0x00 gesettz werden.\n"
"Außerdem stellt es einen XML-RPC Server bereit, über den die Software\n"
"auf den RevPi geladen werden kann. Das Prozessabbild kann über ein Tool\n"
"zur Laufzeit überwacht werden.",
}
if platform == "linux":
from setuptools import setup
setup(
maintainer="Sven Sager",
maintainer_email="akira@revpimodio.org",
scripts=["data/revpipycontrol"],
data_files=[
("share/applications", ["data/revpipycontrol.desktop"]),
("share/icons/hicolor/32x32/apps", ["data/revpipycontrol.png"]),
("share/revpipycontrol", glob("revpipycontrol/*.*")),
("share/revpipycontrol/shared", glob("revpipycontrol/shared/*.*")),
(
"share/revpipycontrol/locale/de/LC_MESSAGES",
glob("revpipycontrol/locale/de/LC_MESSAGES/*.mo")
),
],
install_requires=["tkinter"],
classifiers=[
"License :: OSI Approved :: "
"GNU Lesser General Public License v3 (LGPLv3)",
"Operating System :: POSIX :: Linux",
],
cmdclass={"install_egg_info": MyEggInfo},
**globsetup
)
elif platform == "win32":
import sys
from cx_Freeze import setup, Executable
sys.path.append("revpipycontrol")
exe = Executable(
script="revpipycontrol/revpipycontrol.py",
base="Win32GUI",
compress=False,
copyDependentFiles=True,
appendScriptToExe=True,
appendScriptToLibrary=False,
icon="data/revpipycontrol.ico"
)
setup(
options={"build_exe": {
"include_files": [
"revpipycontrol/revpipycontrol.png",
"revpipycontrol/locale"
]
}},
executables=[exe],
**globsetup
)
classifiers=[
"License :: OSI Approved :: GNU Lesser General Public License v3 (GPLv3)",
"Operating System :: POSIX :: Linux",
],
license="LGPLv3",
cmdclass={"install_egg_info": MyEggInfo},
)