diff --git a/README.md b/README.md index 6bc1567..0b92df4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # RealTime OpenControl (RTOC) -### Version 1.8.2 +### Version 1.8.7.5 [**This README is available in GERMAN here.**](misc/README_german.md) diff --git a/RTOC.egg-info/PKG-INFO b/RTOC.egg-info/PKG-INFO index efae9b9..0b6101a 100644 --- a/RTOC.egg-info/PKG-INFO +++ b/RTOC.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 1.2 Name: RTOC -Version: 1.8.6 +Version: 1.8.7.5 Summary: RealTime OpenControl Home-page: https://github.com/Haschtl/RealTimeOpenControl Author: Sebastian Keller diff --git a/RTOC.egg-info/SOURCES.txt b/RTOC.egg-info/SOURCES.txt index 799df69..800c61a 100644 --- a/RTOC.egg-info/SOURCES.txt +++ b/RTOC.egg-info/SOURCES.txt @@ -97,6 +97,8 @@ RTOC/data/ui/icons/icons8-stornieren-480.png RTOC/data/ui/icons/invert.png RTOC/data/ui/icons/labels.png RTOC/data/ui/icons/legend.png +RTOC/data/ui/icons/list.png +RTOC/data/ui/icons/list_dark.png RTOC/data/ui/icons/measure.png RTOC/data/ui/icons/mittlere_prioritaet.png RTOC/data/ui/icons/mittlere_prioritaet_grey.png @@ -179,6 +181,7 @@ RTOC/data/ui/icons/dark/up_arrow.png RTOC/data/ui/icons/dark/up_arrow_disabled.png RTOC/lang/en_en.qm RTOC/lang/en_en.ts +RTOC/lang/en_en_old.ts RTOC/plugins/Generator.py RTOC/plugins/NetWoRTOC.py RTOC/plugins/Funktionsgenerator/gen_function.ui diff --git a/RTOC/LoggerPlugin.py b/RTOC/LoggerPlugin.py index 4398409..cb76676 100644 --- a/RTOC/LoggerPlugin.py +++ b/RTOC/LoggerPlugin.py @@ -48,8 +48,13 @@ def stream(self, *args, **kwargs): for idx, arg in enumerate(args): if idx == 0: y = arg - kwargs['x'] = [time.time()]*len(y) + if type(y) == list: + kwargs['x'] = [time.time()]*len(y) + else: + kwargs['x'] = [time.time()] self.__cb(*args, **kwargs) + else: + print('ERROR: cannot stream signals. No callback connected') def plot(self, x=[], y=[], *args, **kwargs): dataname = kwargs.get('sname', "noName") diff --git a/RTOC/RTLogger.py b/RTOC/RTLogger.py index 922e5a6..68ce256 100644 --- a/RTOC/RTLogger.py +++ b/RTOC/RTLogger.py @@ -383,7 +383,9 @@ def handleTcpLogger(self, loggerDict): loggerDict[call]['starttime'] = self.starttime loggerDict[call]['telegram_token'] = self.config['telegram_token'] loggerDict[call]['telegram_bot'] = self.config['telegram_bot'] - loggerDict[call]['signal_memory'] = self.logger.getSignalSize() + size, maxsize = self.getSignalSize() + loggerDict[call]['signal_memory'] = size + loggerDict[call]['signal_memory_limit'] = maxsize return loggerDict def getPluginDict(self): @@ -410,12 +412,12 @@ def startPlugin(self, name, callback=None, remote=True): try: if name in self.devicenames.keys(): fullname = self.devicenames[name] - if callback is None: - self.pluginObjects[name] = importlib.import_module( - fullname).Plugin(self.addDataCallback, self.plot, self.addNewEvent) - else: - self.pluginObjects[name] = importlib.import_module( - fullname).Plugin(callback, self.addNewEvent) + # if callback is None: + self.pluginObjects[name] = importlib.import_module( + fullname).Plugin(self.addDataCallback, self.plot, self.addNewEvent) + # else: + # self.pluginObjects[name] = importlib.import_module( + # fullname).Plugin(callback, self.addNewEvent) self.analysePlugin(self.pluginObjects[name], name) self.pluginStatus[name] = True print("PLUGIN: " + name+' connected\n') @@ -779,6 +781,10 @@ def addDataCallback(self, datasY=[], *args, **kwargs): if idx == 4: createCallback = arg + if type(datasY) == float or type(datasY) == int: + datasY = [datasY] + print('Warning: You should stream a list of signals, not a single signal') + if type(datasY) == list: if datasX == [None]: datasX = [None]*len(datasY) @@ -1058,6 +1064,13 @@ def load_config(self): # with open(self.config['documentfolder']+"/config.json", 'w', encoding="utf-8") as fp: # json.dump(conf, fp, sort_keys=False, indent=4, separators=(',', ': ')) + def clearCache(self): + self.config = defaultconfig + self.save_config() + filename = self.config['documentfolder']+"/plotStyles.json" + if os.path.exists(filename): + os.remove(filename) + def save_config(self): self.config["deviceWidget"] = True self.config["pluginsWidget"] = False @@ -1110,6 +1123,7 @@ def getSignalNames(self, id): return [[''], ['']] def getSignalSize(self): + maxsize = len(self.signals)*(2*(self.maxLength*8+64)+16) outerlayer = sys.getsizeof(self.signals) innerlayer = 0 for sig in self.signals: @@ -1117,7 +1131,7 @@ def getSignalSize(self): innerlayer += sys.getsizeof(sig[0])*2 innerlayer += sys.getsizeof(list(sig[0]))*2 size = outerlayer + innerlayer - return size + return size, maxsize def check_for_updates(self): import xmlrpc.client diff --git a/RTOC/__init__.py b/RTOC/__init__.py index 62cb5c1..1a9bf7e 100644 --- a/RTOC/__init__.py +++ b/RTOC/__init__.py @@ -1,4 +1,4 @@ from .data import * name = "RTOC" -__version__ = "1.8.6" +__version__ = "1.8.7.5" diff --git a/RTOC/__main__.py b/RTOC/__main__.py index bd9acb5..fee068f 100644 --- a/RTOC/__main__.py +++ b/RTOC/__main__.py @@ -32,7 +32,7 @@ def main(): 'RTOC.py [-h, -s] [-r ]\n -h: Hilfe\n-s: TCP-Server ohne GUI\n-r : TCP-Client zu RTOC-Server\n-p: Starte TCP-Server auf anderem Port (Standart: 5050)') sys.exit() elif opt == '-s': - logger = RTLogger.RTLogger(True, port) + logger = RTLogger(True, port) #runInBackground() while logger.run: time.sleep(1) diff --git a/RTOC/data/Actions.py b/RTOC/data/Actions.py index f120299..c7c7ec5 100644 --- a/RTOC/data/Actions.py +++ b/RTOC/data/Actions.py @@ -45,6 +45,8 @@ def connectButtons(self): self.aboutAction.triggered.connect(self.showAboutMessage) self.checkUpdatesAction.triggered.connect(self.checkUpdates) + self.clearCacheAction.triggered.connect(self.clearCache) + self.searchEdit.textChanged.connect(self.filterDevices) def toggleTcpServer(self): @@ -279,3 +281,9 @@ def checkUpdates(self): info = self.tr('Um die Version zu überprüfen, installiere RTOC mit "pip3 install RTOC"') pyqtlib.info_message(self.tr('Version'), text, info) + + def clearCache(self): + ok = pyqtlib.alert_message(self.tr('Cache leeren'), self.tr('Wollen Sie wirklich den Cache leeren?'), self.tr('Dadurch gehen gespeicherte Ploteinstellungen sowie Einstellungen verloren.')) + if ok: + self.plotStyles = {} + self.logger.clearCache() diff --git a/RTOC/data/RTPlotActions.py b/RTOC/data/RTPlotActions.py index 79d7cf6..596f9ef 100644 --- a/RTOC/data/RTPlotActions.py +++ b/RTOC/data/RTPlotActions.py @@ -44,6 +44,8 @@ def initPlotWidget(self): 200, 200, 200), fill=(200, 200, 200, 50), html=None) # , self.plot.addItem(self.plotMouseLabel, ignoreBounds = True) + self.hideSignalsButton.clicked.connect(self.hideSignalList) + def initPlotViewWidget(self): self.plotViewWidget = QtWidgets.QWidget() uic.loadUi(packagedir+"/ui/plotViewWidget.ui", self.plotViewWidget) @@ -84,6 +86,12 @@ def initPlotViewWidget(self): self.gridViewWidget.yCheckbox.clicked.connect(self.gridYAction) self.gridViewWidget.alphaSlider.valueChanged.connect(self.gridAlphaAction) + def hideSignalList(self): + if self.hideSignalsButton.isChecked(): + self.widget_2.show() + else: + self.widget_2.hide() + def gridXAction(self): value = self.gridViewWidget.xCheckbox.isChecked() self.grid[0] = value @@ -361,7 +369,7 @@ def filterDevices(self, tex): tex = tex+';' tex = tex.replace('; ', ';') for item in self.signalTreeWidgetItems: - sig = self.treeWidget.itemWidget(item, 0) + sig = self.treeWidget.itemWidget(item, 1) found = False for text in tex.split(';'): # print(text) diff --git a/RTOC/data/RTPlotWidget.py b/RTOC/data/RTPlotWidget.py index 7be1934..192f33f 100644 --- a/RTOC/data/RTPlotWidget.py +++ b/RTOC/data/RTPlotWidget.py @@ -165,6 +165,8 @@ def addSignalRAW(self, signalObject): self.treeWidget.setItemWidget(self.signalTreeWidgetItems[idx], 0, self.signalObjects[idx]) self.treeWidget.setItemWidget( self.signalTreeWidgetItems[idx], 1, self.signalObjects[idx].label) + #self.treeWidget.resizeColumnToContents(0) + #self.treeWidget.resizeColumnToContents(1) self.deviceTreeWidgetItems[self.devices.index(devicename)].setExpanded(True) self.updateCountLabel() @@ -212,11 +214,15 @@ def addSignal(self, devicename, signalname, id, unit): self.treeWidget.setItemWidget(self.signalTreeWidgetItems[idx], 0, self.signalObjects[idx]) self.treeWidget.setItemWidget( self.signalTreeWidgetItems[idx], 1, self.signalObjects[idx].label) + + #self.treeWidget.resizeColumnToContents(0) + #self.treeWidget.resizeColumnToContents(1) self.deviceTreeWidgetItems[self.devices.index(devicename)].setExpanded(True) self.updateCountLabel() def updateCountLabel(self): - self.countLabel.setText(self.tr("Signale: ")+str(len(self.signalObjects))+' ('+lib.bytes_to_str(self.logger.getSignalSize())+')') + size, maxsize = self.logger.getSignalSize() + self.countLabel.setText(self.tr("Signale: ")+str(len(self.signalObjects))+' ('+lib.bytes_to_str(size)+'/'+lib.bytes_to_str(maxsize)+')') def startDragTreeWidget(self, actions): self.self._drag_info = {"oldWidget": "", "newWidget": "", "signalObjects": []} diff --git a/RTOC/data/signalEditWidget.py b/RTOC/data/signalEditWidget.py index de95f94..4090c4e 100644 --- a/RTOC/data/signalEditWidget.py +++ b/RTOC/data/signalEditWidget.py @@ -100,6 +100,7 @@ def editPlotStyle(self): "."+str(self.self.signalname)]["brush"] = brush self.self.labelItem.setColor(symbol["color"]) + self.self.updateLegend() def deleteSignal(self): self.self.remove() diff --git a/RTOC/data/signalWidget.py b/RTOC/data/signalWidget.py index a3bb704..adf04e8 100644 --- a/RTOC/data/signalWidget.py +++ b/RTOC/data/signalWidget.py @@ -10,6 +10,7 @@ from .signalEditWidget import SignalEditWidget from . import define as define from .stylePlotGUI import setStyle as setPlotStyle +from .stylePlotGUI import getStyle as getPlotStyle def mouseClickEventPlotCurveItem(self, ev): @@ -78,14 +79,29 @@ def setBackColor(self, color): backColor = QtCore.pyqtProperty(QtGui.QColor, getBackColor, setBackColor) -class SignalWidget(QtWidgets.QToolButton): +#class SignalWidget(QtWidgets.QToolButton): +class SignalWidget(QtWidgets.QWidget): def __init__(self, plotWidget, logger, devicename, signalname, id, unit): super(SignalWidget, self).__init__() + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + self.layout = QtWidgets.QHBoxLayout() + self.setLayout(self.layout) + self.legend = QtWidgets.QLabel('-') + self.legend.setSizePolicy(sizePolicy) + self.button = QtWidgets.QToolButton() + self.layout.addWidget(self.legend) + self.layout.addWidget(self.button) + self.clicked=self.button.clicked + sizePolicy = QtGui.QSizePolicy( QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) self.setSizePolicy(sizePolicy) + self.button.setSizePolicy(sizePolicy) self.setCheckable(True) self.setText(signalname) @@ -146,6 +162,81 @@ def __init__(self, plotWidget, logger, devicename, signalname, id, unit): self.signalModifications = [0, 0, 1, 1] + self.updateLegend() + + def setCheckable(self, value): + self.button.setCheckable(value) + + def setText(self, signalname): + self.button.setText(signalname) + + def setChecked(self, value): + self.button.setChecked(value) + + def isChecked(self): + return self.button.isChecked() + #def setSizePolicy(self, policy): + # self.button.setSizePolicy(policy) + + def menu(self): + return self.button.menu() + + def setStyleSheet(self, stylesheet): + self.button.setStyleSheet(stylesheet) + + def setMinimumHeight(self, height): + self.button.setMinimumHeight(height) + + def setMaximumHeight(self, height): + self.button.setMaximumHeight(height) + + def updateLegend(self): + symbol, brush = getPlotStyle(self.plot) + self.setLegendType(symbol['style'],brush['style']) + self.setLegendColor(symbol['color']) + self.legend.setFont(QtGui.QFont('SansSerif', 6+symbol['width']*3)) + + def setLegendType(self, line='-', symbol=''): + if line == 1 or line == 0: + line = '_' + elif line == 2: + line = '-' + elif line == 3: + line = '.' + elif line == 4: + line = '-.' + elif line == 5: + line = '-..' + else: + line ='' + + # if symbol == 0: + # symbol = "d" + # elif symbol == 1: + # symbol = "o" + # elif symbol == 2: + # symbol = "x" + # elif symbol == 3: + # symbol = "s" + # elif symbol == 4: + # symbol = "t" + # elif symbol == 5: + # symbol = "+" + # else: + # symbol = '' + if symbol is None: + symbol = "" + #else: + # symbol = '' + self.legend.setText(line+symbol+line) + + def setLegendColor(self, color, bgcolor=None): + if bgcolor == None: + self.legend.setStyleSheet("QLabel { color : "+str(color)+"; }"); + else: + self.legend.setStyleSheet("QLabel { background-color : red; color : blue; }"); + + def onMove(self, pos): act_pos = self.plot.mapFromScene(pos) p1 = self.plot.scatter.pointsAt(act_pos) @@ -174,12 +265,12 @@ def r(): return random.randint(0, 255) return symbol, brush def initMenu(self): - self.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) - self.setMenu(QtWidgets.QMenu(self)) + self.button.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) + self.button.setMenu(QtWidgets.QMenu(self.button)) action = QtWidgets.QWidgetAction(self) self.editWidget = SignalEditWidget(self, self.id, self.plotWidget) action.setDefaultWidget(self.editWidget) - self.menu().addAction(action) + self.button.menu().addAction(action) def newDataIncoming(self): if self.plotWidget.plotViewWidget.blinkingButton.isChecked(): @@ -310,7 +401,8 @@ def updatePlot(self): self.eventItems[idx].vLine.setPos(pos) def toggleSignal(self): - + print(self.isChecked()) + print(self.hidden) if self.isChecked() and not self.hidden: self.active = True self.plotWidget.legend.addItem( @@ -336,7 +428,7 @@ def remove(self, cb=True, total=True): if total: idx = self.logger.removeSignal(self.id) self.labelItem.hide() - self.menu().hide() + self.button.menu().hide() self.hide() self.close() diff --git a/RTOC/data/stylePlotGUI.py b/RTOC/data/stylePlotGUI.py index ed050b2..8295691 100644 --- a/RTOC/data/stylePlotGUI.py +++ b/RTOC/data/stylePlotGUI.py @@ -151,15 +151,15 @@ def setGUIStyle(self, symbol, brush): style = symbol["shadowStyle"] idx = 0 if style == QtCore.Qt.SolidLine: - idx = 0 - elif style == QtCore.Qt.DotLine: idx = 1 - elif style == QtCore.Qt.DashLine: + elif style == QtCore.Qt.DotLine: idx = 2 - elif style == QtCore.Qt.DashDotLine: + elif style == QtCore.Qt.DashLine: idx = 3 - elif style == QtCore.Qt.DashDotDotLine: + elif style == QtCore.Qt.DashDotLine: idx = 4 + elif style == QtCore.Qt.DashDotDotLine: + idx = 5 self.shadowStyleComboBox.setCurrentIndex(idx) if "alpha" in symbol.keys(): @@ -251,26 +251,30 @@ def getGUIStyle(self): style = self.lineStyleComboBox.currentText() if style in ["Linie", "Line"]: symbol["style"] = QtCore.Qt.SolidLine - elif style in ["Punkte (P)", "Dots"]: + elif style in ["Punkte (P)", "Dots (D)"]: symbol["style"] = QtCore.Qt.DotLine - elif style in ["Striche (S)", "Stroke"]: + elif style in ["Striche (S)", "Stroke (S)"]: symbol["style"] = QtCore.Qt.DashLine - elif style in ["P S", "Dot Stroke"]: + elif style in ["P S", "D S"]: symbol["style"] = QtCore.Qt.DashDotLine - elif style in ["P P S", 'Dot Dot Stroke']: + elif style in ["P P S", 'D D S']: symbol["style"] = QtCore.Qt.DashDotDotLine + else: + print('no style applied') style = self.shadowStyleComboBox.currentText() if style in ["Linie", "Line"]: - symbol["style"] = QtCore.Qt.SolidLine - elif style in ["Punkte (P)", "Dots"]: - symbol["style"] = QtCore.Qt.DotLine - elif style in ["Striche (S)", "Stroke"]: - symbol["style"] = QtCore.Qt.DashLine - elif style in ["P S", "Dot Stroke"]: - symbol["style"] = QtCore.Qt.DashDotLine - elif style in ["P P S", 'Dot Dot Stroke']: - symbol["style"] = QtCore.Qt.DashDotDotLine + symbol["shadowStyle"] = QtCore.Qt.SolidLine + elif style in ["Punkte (P)", "Dots (D)"]: + symbol["shadowStyle"] = QtCore.Qt.DotLine + elif style in ["Striche (S)", "Stroke (S)"]: + symbol["shadowStyle"] = QtCore.Qt.DashLine + elif style in ["P S", "D S"]: + symbol["shadowStyle"] = QtCore.Qt.DashDotLine + elif style in ["P P S", 'D D S']: + symbol["shadowStyle"] = QtCore.Qt.DashDotDotLine + else: + symbol["shadowStyle"] = 0 symbol["alpha"] = self.alphaSpinBox.value()/100 symbol["width"] = self.lineWidthSpinBox.value() @@ -364,6 +368,7 @@ def setStyle(plot, symbol={}, brush={}): pen = pg.mkPen(color=symbol["color"], width=int( symbol["width"]), style=int(symbol["style"])) plot.setPen(pen) + print(symbol["style"]) if symbol["shadowWidth"] is not None and symbol["shadowStyle"] is not None: plot.setShadowPen(color=symbol["shadowColor"], width=int( symbol["shadowWidth"]), style=int(symbol["shadowStyle"]), cosmetic=True) diff --git a/RTOC/data/ui/icons/list.png b/RTOC/data/ui/icons/list.png new file mode 100644 index 0000000..a638636 Binary files /dev/null and b/RTOC/data/ui/icons/list.png differ diff --git a/RTOC/data/ui/icons/list_dark.png b/RTOC/data/ui/icons/list_dark.png new file mode 100644 index 0000000..0a77b20 Binary files /dev/null and b/RTOC/data/ui/icons/list_dark.png differ diff --git a/RTOC/data/ui/plotWidget.ui b/RTOC/data/ui/plotWidget.ui index 79d8b7b..c4a6124 100644 --- a/RTOC/data/ui/plotWidget.ui +++ b/RTOC/data/ui/plotWidget.ui @@ -16,13 +16,13 @@ - 11 - 11 - 341 - 245 + 40 + 30 + 471 + 254 - + @@ -196,90 +196,135 @@ + + + + Plot pausieren/fortsetzen + + + + + + + icons/list.pngicons/list.png + + + + 25 + 25 + + + + true + + + true + + + - - + + 0 + + 0 + + + 0 + + + 0 + + + 0 + - - - Suche Signal; ... - - - - - - - true - - - true - - - QAbstractItemView::DragDrop - - - Qt::CopyAction - - - QAbstractItemView::ExtendedSelection - - - 1 - - - false - - - true - - - true - - - false - - - true - - - 200 - - - 5 - - - true - - - false - - - - Signale - - - - - Wert - - - - - - - - Signale: 0 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 0 - + + + + Suche Signal; ... + + + + + + + true + + + true + + + QAbstractItemView::DragDrop + + + Qt::CopyAction + + + QAbstractItemView::ExtendedSelection + + + 1 + + + false + + + true + + + true + + + false + + + true + + + 200 + + + 5 + + + true + + + false + + + + Signale + + + + + Wert + + + + + + + + Signale: 0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + diff --git a/RTOC/data/ui/rtoc.ui b/RTOC/data/ui/rtoc.ui index 5a2f1cc..24baeb8 100644 --- a/RTOC/data/ui/rtoc.ui +++ b/RTOC/data/ui/rtoc.ui @@ -403,6 +403,8 @@ &Hilfe + + @@ -709,6 +711,11 @@ Port: 5050 + + + Cache leeren + + diff --git a/RTOC/data/ui/stylePlotDialog2.ui b/RTOC/data/ui/stylePlotDialog2.ui index b7c348c..9c51907 100644 --- a/RTOC/data/ui/stylePlotDialog2.ui +++ b/RTOC/data/ui/stylePlotDialog2.ui @@ -130,6 +130,11 @@ 0 + + + + + Linie diff --git a/RTOC/lang/en_en.qm b/RTOC/lang/en_en.qm index 9d66d94..83bfaea 100644 Binary files a/RTOC/lang/en_en.qm and b/RTOC/lang/en_en.qm differ diff --git a/RTOC/lang/en_en.ts b/RTOC/lang/en_en.ts index 9f2469a..5d9d2bc 100644 --- a/RTOC/lang/en_en.ts +++ b/RTOC/lang/en_en.ts @@ -3,6 +3,75 @@ Actions + + + RTOC - Web gestartet + RTOC - Web started + + + + RTOC - Web ist jetzt unter localhost:5006 erreichbar + RTOC - Web is now available at localhost:5006 + + + + Diese Seite kann im gesamten Netzwerk geöffnet werden + This page can be opened in your local network + + + + Bot Token eingeben + Enter bot token + + + + Bitte erzeugen sie in Telegram mit "Botfather" einen Bot, + generiere einen Bot und füge dessen Token hier ein + Please create a bot in telegram (using "Botfather") +Enter the bot-token here + + + + TCP Passwort eingeben + Enter tcp password + + + + Schütze deine Übertragung vor unerwünschten Gästen +Leer lassen, um Passwort zu deaktivieren + Protect your communication +Leave empty to deactivate protection + + + + Passwort-Schutz: Aus + Password-encrypted: No + + + + Passwort-Schutz: An + Password-encrypted: Yes + + + + Port: + Port: + + + + Fehler + Error + + + + Bitte gib eine Zahl zwischen 0 und 65535 an + Please enter a valid port (0 - 65535) + + + + Ihre Eingabe war ungültig. + Your entry is invalid. + Warnung @@ -11,12 +80,12 @@ Wollen Sie wirklich alle Daten löschen? - Do you really want to delete all data? + Do you really want to delete all signals? (Unwiederrufbar) - (Data will be lost) + @@ -31,12 +100,12 @@ Excel-Tabelle (*.xlsx) - Excel-Table (*.xlsx) + Excel (*.xlsx) CSV-Datei (*.csv) - CSV-File (*.csv) + CSV (*.csv) @@ -46,7 +115,7 @@ Excel-Tabelle (*.xlsx);;CSV-Datei (*.csv) - Excel-Table (*.xlsx);;CSV-File (*.csv) + Excel (*.xlsx);;CSV (*.csv) @@ -60,7 +129,11 @@ Alle Symbole werden unter der 'Creative Commons Attribution-NoDerivs 3.0 Unported' Lizenz bereitgestellt von icons8 (https://icons8.de) Copyright (C) 2018 Sebastian Keller - + RealTime OpenControl (RTOC) is a free open source software under the BSD-3 license. + +All icons are provided under the Creative Commons Attribution-NoDerivs 3.0 Unported License by icons8 (https://icons8.de) + +Copyright (C) 2018 Sebastian Keller @@ -70,63 +143,7 @@ Copyright (C) 2018 Sebastian Keller Bitte Programm neustarten - Please restart this software - - - - RTOC - Web gestartet - RTOC - Web started - - - - Bot Token eingeben - Enter Bot-Token - - - - Bitte erzeugen sie in Telegram mit "Botfather" einen Bot, - generiere einen Bot und füge dessen Token hier ein - Please generate a bot with "Botfather" in Telegram -and enter it's bot-token here: - - - - TCP Passwort eingeben - Enter TCP-Passwort - - - - Schütze deine Übertragung ein bisschen (wirklich nur ein bisschen) vor unerwünschten Gästen -Leer lassen, um Passwort zu deaktivieren - Protect your TCP-Connection a little bit (really just a little bit) -Leave empty to deactivate password-protection - - - - Passwort-Schutz: Aus - Password-Protection: Off - - - - Passwort-Schutz: An - Passwort-Protection: On - - - - RTOC - Web ist jetzt unter localhost:5006 erreichbar - RTOC - Web is now reachable at 'localhost:5006' - - - - Diese Seite kann im gesamten Netzwerk geöffnet werden - This page can be opened in local network - - - - Schütze deine Übertragung vor unerwünschten Gästen -Leer lassen, um Passwort zu deaktivieren - Protect your TCP connection with AES password encryption. -Leave empty to deativate password. + Please restart RTOC @@ -136,7 +153,12 @@ Leave empty to deativate password. Entschuldigung. Konnte RTOC bei PyPi nicht finden. Schau mal bei 'https://pypi.org/project/RTOC/' - Sorry. Couldn't get version information from PyPi. Please visit 'https://pypi.org/project/RTOC/' + Sorry, couldn't find RTOC at PyPi. Have a look at 'https://pypi.org/project/RTOC/' for the newest version + + + + , Neuste Version: + , newest version: @@ -149,50 +171,25 @@ Leave empty to deativate password. "pip3 install RTOC --upgrade" - New version available! Please update with: + New version available. Update with: -"pip3 install RTOC --upgrade" +"pip3 install RTOC --upgrade RTOC wurde nicht mit PyPi installiert. - RTOC was not installed with PyPi. + RTOC wasn't installed with pip3. Um die Version zu überprüfen, installiere RTOC mit "pip3 install RTOC" - To enable version-checking, please install it with "pip3 install RTOC" + Please install RTOC with "pip3 install RTOC" to enable checking for updates. Version - Version info - - - - , Neuste Version: - , newest version: - - - - Port: - Port: - - - - Fehler - Failure - - - - Bitte gib eine Zahl zwischen 0 und 65535 an - Please enter a free port (0 to 65535) - - - - Ihre Eingabe war ungültig. - Your entry is invalid + Version @@ -200,7 +197,7 @@ Leave empty to deativate password. Dialog - + Dialog @@ -210,52 +207,52 @@ Leave empty to deativate password. Minimum - + Min. Y [ ] - + Y [ ] 1 - + 1 X [s] - + X [s] Maximum - + Max. Differenz - Difference + Diff. 1s - + 1s Stile anpassen - Change style + Change plotstyle Signal 1 - + Signal 1 Signal 2 - + Signal 2 @@ -265,12 +262,12 @@ Leave empty to deativate password. Auf alle anwenden - Style all + Apply to all Auf Auswahl anwenden - Style selected + Apply to selection @@ -278,7 +275,7 @@ Leave empty to deativate password. %H:%M:%S %d.%m.%Y - %H:%M:%S %Y.%m.%d + @@ -291,22 +288,22 @@ Leave empty to deativate password. X-Linien - Horizontal lines + X-Linien Y-Linien - Vertical lines + Y-Linien Alpha: - + Alpha: Zeige Crosshair - Show Crosshair + Show crosshair @@ -316,52 +313,52 @@ Leave empty to deativate password. Öffne Mess-Rechteck in Plot - Open measure-rectangle in graph + Show measure-rectangle in graph Rechteck-Messwerkzeug - Rectangle + Rectangle-tool Schneide-Werkzeug - Cutting-Tool + Cutting-tool Signal-Labels ein/ausblenden - Show/hide Signal-labels + Show/hide signal-labels Signal-Labels - - - - - X-Achse als Zeit formatieren - Horizontal is timeaxis + Signal-labels - - Zeitachse - Timeaxis + + Darstellung invertieren + Invert colors Aktivieren, X-Achse time.time()+x ist - Activate x-axis time.time()+x + Activate, X-axis is time.time()+x Zeitsignal - Timesignal + Livesignal - - Darstellung invertieren - Invert color + + X-Achse als Zeit formatieren + Format X-Axis for livesignals + + + + Zeitachse + Timeaxis @@ -381,27 +378,27 @@ Leave empty to deativate password. Blinkender Indikator an/aus - Show/hide blinking indicators + Enable/disable blinking indicator Blinkender Indikator - Blinking indicators + Blinking indicator Mehrere Plotstile anpassen - Style multiple plots + Change plotstyles Plotstile anpassen - Style plots + Change plotstyles Global X-Offset: - + Global X-offset: @@ -411,7 +408,7 @@ Leave empty to deativate password. Plot-Rate: - + Plotrate: @@ -431,7 +428,7 @@ Leave empty to deativate password. Automatisch importierte Libraries: - Automatically imported libraries: + Available libraries: @@ -456,7 +453,7 @@ Leave empty to deativate password. trig LOGIC_EXPRESSION: #Use like "if" but with only one execution on change - trig LOGIC_EXPRESSION: #Use like "if" but with only one execution on change + trig LOGIC_EXPRESSION: #Use like &quot;if&quot; but with only one execution on change @@ -473,6 +470,11 @@ Leave empty to deativate password. plot([y],sname="noName",dname="noDevice",unit="") # X-Werte = range(len(y)) + + + event(text="", sname="noName", dname="noDevice", x=clock, priority=0) + + {ans} = sendTCP(hostname = "localhost", *args, **kwargs) @@ -486,12 +488,12 @@ Leave empty to deativate password. clearData() # löscht alle Daten - clearData() # delete all signals + clearData() # delete all signals exportData(Filetype="json", filename=AUTO) # Exportiert alle Daten - exportData(Filetype="json", filename=AUTO) # export all data + exportData(Filetype=&quot;json&quot;, filename=AUTO) # export all data @@ -516,17 +518,18 @@ Leave empty to deativate password. [x], [y] = rtoc.mean([x], [y], n= 40) # Mittelwert über die letzten X Werte - [x], [y] = rtoc.mean([x], [y], n= 40) # mean of latest n values + [x], [y] = rtoc.mean([x], [y], n= 40) # mean of latest n values [x], [y] = rtoc.runningMean([x], [y], n=40) # Laufender Mittelwert über Signal - [x], [y] = rtoc.runningMean([x], [y], n=40) # running mean of signal + [x], [y] = rtoc.runningMean([x], [y], n=40) # running mean of signal [x], [y], [params] = rtoc.lsfit([x], [y] , DEF, x0, n) # LeastSquare fit auf benutzerdefinierte DEF, oder vordefinidert: DEF = "linear" oder "quad" - [x], [y], [params] = rtoc.lsfit([x], [y] , DEF, x0, n) # LeastSquare fit for user defined DEF, oder predefined: DEF = "linear" oder "quad" + [x], [y], [params] = rtoc.lsfit([x], [y] , DEF, x0, n) # LeastSquare fit auf benutzerdefinierte DEF, oder vordefinidert: DEF = &quot;linear&quot; oder &quot;quad&quot;</source> + <translation>[x], [y], [params] = rtoc.lsfit([x], [y] , DEF, x0, n) # LeastSquare fit for user defined DEF, oder predefined: DEF = &quot;linear&quot; oder &quot;quad&quot; @@ -551,7 +554,7 @@ Leave empty to deativate password. Geräte - Devices + Devices @@ -561,22 +564,22 @@ Leave empty to deativate password. X-Werte : Gerät.Signal.x - X-Values : device.signal.x + X-Values: Device.signal.x Aktuellster X-Wert: Gerät.Signal.latest - Latest X-Value: device.signal.latest + Latest x-value: device.signal.latest Y-Werte : Gerät.Signal.y - Y-Values : device.signal.y + Y-value: device.signal.y Start - + Start @@ -587,13 +590,15 @@ Leave empty to deativate password. trig Funktionsgenerator.Square.latest == 1: print("one") - + trig Generator.Square.latest == 1: + print("one") Zuerst Script starten - Start script first + Start script first + @@ -603,7 +608,7 @@ Leave empty to deativate password. + - + + @@ -611,19 +616,19 @@ Leave empty to deativate password. Export signal to CSV - + Signal löschen - Delete signal + Delete Signal zuschneiden - Cut signal + Cut Signal duplizieren - Duplicate signal + Duplicate @@ -638,13 +643,18 @@ Leave empty to deativate password. Plotstil anpassen - Style plot + Change plotstyle Label anzeigen/ausblenden Show/hide label + + + Änderungen werden erst mit "Anwenden" in die Daten geschrieben + Changes will be applied to signal after hitting "Apply". + Modifikation @@ -653,17 +663,17 @@ Leave empty to deativate password. Scale - + Scale Offset - + Offset s - + s @@ -673,63 +683,33 @@ Leave empty to deativate password. Signal umbenennen - Rename signal + Rename Signal umbenennen (neue Daten werden nicht umgeleitet!) - Rename signal (new data-streams will not be redirected!) + Rename (new data will not be added to this signal anymore) Rename - + Rename Modifikationen in Daten schreiben - Write modifications to signal + Apply modifications - + Modifikationen in Daten schreiben, Daten werden überschrieben - Write modifications to signal, signal will be overwritten + Apply modifications. signal will be rewritten Anwenden Apply - - - Samplerate-Triggered: Skript wird mit definierter Samplerate ausgefürt - Samplerate-Triggered: Skript is executed in samplerate - - - - Samplerate-Triggered - - - - - Signal-Triggered: Script wird mit Geräte-Samplerate verknüpft und ausgeführt - Signal-Triggered: Script is executed, if selected signal gets updated - - - - Signal-Triggered - - - - - Keines - None - - - - Änderungen werden erst mit "Anwenden" in die Daten geschrieben - Changes will be applied to signal after hitting "Apply" - Plot pausieren @@ -753,22 +733,47 @@ Leave empty to deativate password. Signalstil anpassen - Style plot + Change plotstyle + + + + Samplerate-Triggered: Skript wird mit definierter Samplerate ausgefürt + Samplerate-triggered: script is executed with defined samplerate + + + + Samplerate-Triggered + Samplerate-triggered - - Von - From + + Signal-Triggered: Script wird mit Geräte-Samplerate verknüpft und ausgeführt + Signal-triggered: script is executed, if selected signals are getting new data - - bis - till + + Signal-Triggered + Signal-triggered + + + + Keines + Empty + + + + Filter + Filter + + + + Lösche alle Signale + Delete all signals Zeitpunkt - Timepoint + Timestamp @@ -776,30 +781,15 @@ Leave empty to deativate password. Content - + Gerät - Device + Device Signal Signal - - - Filter - Filter - - - - Lösche alle Signale - Delete all Events - - - - event(text="", sname="noName", dname="noDevice", x=clock, priority=0) - - MainWindow @@ -811,12 +801,12 @@ Leave empty to deativate password. Aufzeichnungsdauer: - Recordlength: + Recording length: Ändere die Aufzeichnungsdauer - Change the recordlength + Change the recording-length @@ -826,27 +816,27 @@ Leave empty to deativate password. Lösche alle Signale - Delete all signals + Delete all signals Geräte, für die PlugIns vorhanden sind, erscheinen hier - Devices with plugins will be shown here + Available devices are shown here - + &Geräte - Devices + Devices Suche Gerät - Search device + Search device Falls ein Gerät ein GUI-PlugIn besitzt, erscheint dies hier - Devices with plugins will be shown here + Available devices with GUI are shown here @@ -861,28 +851,43 @@ Leave empty to deativate password. Öffnen, Speichern, Exportieren - Open, save, export + Open, save, export &Datei File + + + Telegram-Bot + + + + + TCP - Server + + Unterfenster-Darstellung verwalten - Arrange View + Show/hide subwindows &Fenster - View + Subwindows &Hilfe Help + + + Sprache + Language + Skripte @@ -893,6 +898,11 @@ Leave empty to deativate password. toolBar + + + Events + + &Daten exportieren @@ -901,22 +911,22 @@ Leave empty to deativate password. Bitte nutze RECHTSKLICK auf Plotbereich - Please use RIGHTCLICK in plot + Please use RIGHT CLICK in graph &Beenden - Close + Quit &Plot anpassen - Style plot + Change plotstyles Plot-Darstellung - Plot-Style + Plotstyles @@ -936,27 +946,27 @@ Leave empty to deativate password. Signale-Unterfenster - Signal-Subwindow + Signal-subwindow - + Geräte-Unterfenster - Devices-Subwindow + Devices-subwindow Plugins-Unterfenster - Plugin-Subwindow + Plugins-subwindow S&kript - Scripts + Script Skripte-Unterfenster - Script-Subwindow + Script-subwindow @@ -986,7 +996,7 @@ Leave empty to deativate password. Zuletzt geladen - Latest sessions + Recently edited @@ -996,12 +1006,12 @@ Leave empty to deativate password. &Hilfe zu KellerLogger - Help + Read the docs - + Über RTOC - About RTOC + About RTOC @@ -1013,21 +1023,11 @@ Leave empty to deativate password. Minimize to SystemTray - - - TCP - Server - - Multiproessing - Listener - - - Sprache - Language - Deutsch @@ -1038,20 +1038,10 @@ Leave empty to deativate password. English English - - - Events - Events - - - - Telegram-Bot - Telegram-Bot - Bot-Token eingeben - Enter Bot-Token + Enter bot-token @@ -1061,7 +1051,7 @@ Leave empty to deativate password. RTOC - Web - RTOC - Web + @@ -1071,17 +1061,17 @@ Leave empty to deativate password. Passwort-Schutz - Password-Protection + Password-protection - + Auf Updates prüfen - Check for updates + Check for updates Port: 5050 - Port: 5050 + @@ -1091,16 +1081,16 @@ Leave empty to deativate password. NetWoRTOC - - - Verbinden - Connect - Suchen Search + + + Verbinden + Connect + RTOC-Server @@ -1114,12 +1104,12 @@ Leave empty to deativate password. Aufzeichnungsdauer: - Recordlength: + Recording length: - + Ändere die Aufzeichnungsdauer - Change the recordlength of remote-RTOC-Server + Change recording-length @@ -1127,9 +1117,9 @@ Leave empty to deativate password. Values - + Lösche alle Signale - Delete all signals from remote RTOC-Server + Delete all signals @@ -1142,34 +1132,39 @@ Leave empty to deativate password. - + Alle auswählen - Select all + Select all - + Geräte - Devices + Devices - + Geräte Funktionen und Parameter - Device functions and paramters + Device-functions and parameters - + Signal löschen - Delete signal + Delete signal + + + + Sucht... + Searching... RTOC-Netzwerksuche - Search RTOC-Servers + RTOC-Networkscan - + Möchten Sie wirklich das Netzwerk nach RTOC-Servern durchsuchen? - Do you really want to search your local network for RTOC-Servers? + Do you really want to search the local network for RTOC-servers? @@ -1177,24 +1172,34 @@ Leave empty to deativate password. This will take some time - - Sucht... - Searching... + + Bitte warten + Please wait + + + + NetWoRTOC sucht gerade nach RTOC-Servern + NetWoRTOC is searching for RTOC-servers + + + + Bitte warten bis der Vorgang abgeschlossen ist. + Please wait until the process finished. Fertig - Finished + Completed RTOC-Suche abgeschlossen - Searching for RTOC-Servers finished + Networksearch completed Server gefunden. - server found. + servers found. @@ -1202,29 +1207,29 @@ Leave empty to deativate password. Warning - + Möchten sie wirklich alle Daten am RTOC-Server löschen? - Do you really want to delete all data from this RTOC-Server? + Do you really want to delete all signals on this RTOC-server? (Unwiederrufbar) - (Data will be lost) + - + Remote-Funktion ausführen - Call remote function + Call remote-function an Host - at host + execution at - + ausführen. - execution. + . @@ -1234,57 +1239,37 @@ Leave empty to deativate password. Fehler - Failure + Error - + Funktionsparameter sind nicht gültig - Submitted functionsparameters are not valid + Functionparameter not valid - + Bitte geben Sie gültige Parameter an - Please enter valid parameters + Please enter a valid parameter - + Remote-Parameter ändern - change remote-parameter + Change remote-parameter - + ändern. - change. + will be modified. - + Wert ungültig - Value not valid + Not valid - + Bitte geben Sie einen gültigen Wert an - Please enter a valid value - - - - Beenden - Close - - - - Bitte warten - Please wait - - - - NetWoRTOC sucht gerade nach RTOC-Servern - NetWoRTOC is searching for RTOC-Servers - - - - Bitte warten bis der Vorgang abgeschlossen ist. - Please wait. + Please enter a valid parameter. @@ -1297,9 +1282,9 @@ Leave empty to deativate password. The RTOC-Server - + ist passwortgeschützt. Bitte Passwort eintragen - is password protected. Please enter password + is password-protected. Please enter password @@ -1307,9 +1292,14 @@ Leave empty to deativate password. TCP-password - + + Beenden + Disconnect + + + Geschützt - Protected + Protected @@ -1326,55 +1316,27 @@ Leave empty to deativate password. - RTLogger - - - Plugin gestartet: - Plugin startet: - - - - Plugin gestoppt - Plugin stopped: - - - - Signal-Stream hinzugefügt: - Signal-Stream added: - + RTOC - - Neues Signal geplottet: - Signal-Plot added: + + Passwort-Schutz: Aus + Password-protection: Yes - - Plugin gestoppt: - Plugin stopped: + + Passwort-Schutz: An + Password-protection: No - - Signal-Plot hinzugefügt: - Signal-Plot added: + + Port: + Port: - - - Signale - Signals - - - - RTOC Anzeigen Show - - - Beenden - Close - Im Hintergrund laufen @@ -1385,33 +1347,40 @@ Leave empty to deativate password. TCP Server + + + Beenden + Stop + Fehler - Failure + Error Fehler beim Laden der Geräte GUI Bitte Code überprüfen. - Loading device GUI failed. + Error loading device-GUI +Please check plugin-code. Fehler beim Laden des Geräts Bitte stellen Sie sicher, dass das Gerät verbunden ist. - Loading device failed. Please make sure the device is connected. + Error loading device +Please make sure to be connected to the device. + + + + läuft im Hintergrund weiter und zeichnet Messwerte auf + is running in background. RealTime OpenControl - - - läuft im Hintergrund weiter und zeichnet Messwerte auf - is running in background and collecting data - Speichern @@ -1422,21 +1391,6 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Wollen Sie die aktuelle Sitzung speichern? Do you want to save the current session? - - - Passwort-Schutz: Aus - Password-Protection: Off - - - - Passwort-Schutz: An - Password-Protection: On - - - - Port: - Port: - RTOC_TCP @@ -1451,19 +1405,6 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Do you want to save the current session? - - RTPlotActions - - - Signale - Signals - - - - Vergangene Zeit - Elapsed time - - RTPlotWidget @@ -1477,12 +1418,12 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Fehler beim laden der Datei - Loading file failed + Error loading file Fehler - Failure + Error @@ -1520,17 +1461,17 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Wähle zuerst das Schneide-Tool aus - Please select Cutting-Tool first + Please select Cut-tool first Du musst zuerst deine Schnittbereich festlegen - Please set your Cut-Area first + You need to define your cut-zone first CSV-Datei (*.csv) - CSV-File (*.csv) + CSV (*.csv) @@ -1545,7 +1486,7 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Bitte gib einen neuen Namen an - Please enter a new signalname + Please enter a new name @@ -1555,7 +1496,7 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Daten werden dauerhaft geändert - Signal will be changed permanently + Data will be modified permanently @@ -1588,13 +1529,18 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Zeitpunkt - Timepoint + Timestamp Verbindung fehlgeschlagen Connection failed + + + Passwort falsch + Password wrong + Verbinden @@ -1608,7 +1554,7 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. (TCP-Server Passwort) - (TCP-Server password) + (TCP-server password) @@ -1618,20 +1564,7 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Verbindung trennen - Close connection - - - - Passwort falsch - Password wrong - - - - a - - - Signal-Plot hinzugefügt: - Signal-Plot added: + Disconnect @@ -1639,37 +1572,37 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Stile anpassen - Style plots + Change plotstyles Füllung - Fill + Fill Füllfarbe - Fillcolor + Fillcolor y = - + y = Füllen bis - Fill until + Fill until Füllung löschen - Remove fill + Delete fill Färben - Colorize + Set color @@ -1679,7 +1612,7 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Schattenstil - Shadow-Style + Shadowstyle @@ -1689,27 +1622,27 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Punkte (P) - Dots + Dots (D) Striche (S) - Stroke + Stroke (S) P S - Dot Stroke + D S P P S - Dot Dot Stroke + D D S Schattenbreite - Shadowwidth + Shadow-width @@ -1729,12 +1662,12 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Linienstil - Line-Style + Linestyle Opazität - Opacity + Opacity @@ -1744,7 +1677,7 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Symbol - + Symbol @@ -1754,12 +1687,12 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Symbolrandfarbe - Symbolbrushcolor + Symbolborder-color Symbolgröße - Symbolsize + Symbolsize @@ -1769,7 +1702,7 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. X - + X @@ -1779,17 +1712,17 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Dreieck - Triangle + Rectangle Raute - Rectangle + Diamond Plus - + Plus @@ -1809,6 +1742,16 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Form + + + Zeige Crosshair + Show crosshair + + + + Öffne Mess-Rechteck in Plot + Open rectangle-tool in graph + Tools @@ -1822,7 +1765,7 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Plot pausieren/fortsetzen - Pause plot + Pause/resume plot @@ -1844,231 +1787,191 @@ Bitte stellen Sie sicher, dass das Gerät verbunden ist. Signale: 0 Signals: 0 - - - Zeige Crosshair - Show Crosshair - - - - Öffne Mess-Rechteck in Plot - Open Measure-Rectangle in plot - - - - self.rtoc - - - Plugin gestartet: - Plugin startet: - - - - Plugin gestoppt: - Plugin gestoppt: - - - - Signal-Stream hinzugefügt: - Signal-Stream added: - - - - Signal-Plot hinzugefügt: - Signal-Plot added: - telegram - + Event-Benachrichtigung festlegen Event-Notifications - + Letzte Messwerte - Latest Values + Latest values - + Signale Signals - + Geräte - Devices + Devices + + + + Event erzeugen + Create event - + Einstellung angepasst Settings updated - + Signale löschen - Delete signals + Delete signals - + Aufzeichnungsdauer ändern - Change recordlength + Recording length changed - + <-- Zurück - <-- Back + <-- Back - + Aufzeichnungsdauer geändert - Recordlength was changed + Recording length changed - + Fehlerhafte Eingabe - No valid message + Wrong entry + + + + Event gesendet. + Event sent. - + Gerät beenden - Stop device + Stop device - + Gerät starten - Start device + Start device - + Gerätefehler - Device-failure + Device-error - + Funktionen Functions - + Parameter Parameters - + Wenn dein Text aussieht, wie eine JSON, dann kannst du damit später alles machen - You reached the end of this telegram-bot. Well done. Lets get back to the menu ... + Not implemented - + Was soll ich dazu sagen ... - Oh no ... + Whoops... this shouldn't happen... - + Zeit [s] Time [s] - + Derzeitige Aufzeichnungsdauer: - Current recordlength: + Current recording length: + + + + +Signale verwenden + Signals are using + + + + Neues Event erzeugen +Sende eine Nachricht, um ein Event zu erzeugen. +Wähle ein Signal aus, um das Event einem Signal zuzuordnen. + Create new event +Send a message to create an event +Select a signal before to asign a signal to this event - + + Signal ausgewählt: + Selected signals + + + Funktionen Functions - + Bitte gib Parameter an, falls benötigt - Please enter parameters, if needed + Please send a parameter, if necessary - + Bitte gib einen neuen Wert an. Derzeitiger Wert: Please enter a new value. -Current Value: +Current value: - + Fehler - Failure + Error - + Hauptmenü - Mainmenu + Mainmenu - + Alle Benachrichtigungen All notifications - + Warnungen Warnings - + Nur Fehlermeldungen Only errors - + Keine Benachrichtigung No notifications - - <- Zurück - <- Back - - - + Wähle eine Benachrichtigungsstufe aus. Derzeitige Stufe: - Select a notification level. Current level: - + Select notification-level. Current level: - + Keine Messwerte vorhanden - No measurements recorded yet - - - - Event erzeugen - Create event - - - - Event gesendet. - Event sent. - - - - -Signale verwenden - -Signals use - - - - Neues Event erzeugen -Sende eine Nachricht, um ein Event zu erzeugen. -Wähle ein Signal aus, um das Event einem Signal zuzuordnen. - Create new event -Send a message to create an event -Select a signal before to asign a signal to this event - - - - Signal ausgewählt: - Selected signal: + No measurements available diff --git a/RTOC/lang/en_en_old.ts b/RTOC/lang/en_en_old.ts new file mode 100644 index 0000000..9f2469a --- /dev/null +++ b/RTOC/lang/en_en_old.ts @@ -0,0 +1,2074 @@ + + + + + Actions + + + Warnung + Warning + + + + Wollen Sie wirklich alle Daten löschen? + Do you really want to delete all data? + + + + (Unwiederrufbar) + (Data will be lost) + + + + Session laden + Load session + + + + Session speichern + Save session + + + + Excel-Tabelle (*.xlsx) + Excel-Table (*.xlsx) + + + + CSV-Datei (*.csv) + CSV-File (*.csv) + + + + Export + Export + + + + Excel-Tabelle (*.xlsx);;CSV-Datei (*.csv) + Excel-Table (*.xlsx);;CSV-File (*.csv) + + + + Über + About + + + + RealTime OpenControl (RTOC) ist eine freie OpenSource Software unter der BSD-3-Lizenz. + +Alle Symbole werden unter der 'Creative Commons Attribution-NoDerivs 3.0 Unported' Lizenz bereitgestellt von icons8 (https://icons8.de) + +Copyright (C) 2018 Sebastian Keller + + + + + Sprache geändert + Language changed + + + + Bitte Programm neustarten + Please restart this software + + + + RTOC - Web gestartet + RTOC - Web started + + + + Bot Token eingeben + Enter Bot-Token + + + + Bitte erzeugen sie in Telegram mit "Botfather" einen Bot, + generiere einen Bot und füge dessen Token hier ein + Please generate a bot with "Botfather" in Telegram +and enter it's bot-token here: + + + + TCP Passwort eingeben + Enter TCP-Passwort + + + + Schütze deine Übertragung ein bisschen (wirklich nur ein bisschen) vor unerwünschten Gästen +Leer lassen, um Passwort zu deaktivieren + Protect your TCP-Connection a little bit (really just a little bit) +Leave empty to deactivate password-protection + + + + Passwort-Schutz: Aus + Password-Protection: Off + + + + Passwort-Schutz: An + Passwort-Protection: On + + + + RTOC - Web ist jetzt unter localhost:5006 erreichbar + RTOC - Web is now reachable at 'localhost:5006' + + + + Diese Seite kann im gesamten Netzwerk geöffnet werden + This page can be opened in local network + + + + Schütze deine Übertragung vor unerwünschten Gästen +Leer lassen, um Passwort zu deaktivieren + Protect your TCP connection with AES password encryption. +Leave empty to deativate password. + + + + Installierte Version: + Installed version: + + + + Entschuldigung. Konnte RTOC bei PyPi nicht finden. Schau mal bei 'https://pypi.org/project/RTOC/' + Sorry. Couldn't get version information from PyPi. Please visit 'https://pypi.org/project/RTOC/' + + + + RTOC ist auf dem neusten Stand. + RTOC is up to date. + + + + Neue Version verfügbar. Update mit der Konsole: + +"pip3 install RTOC --upgrade" + + New version available! Please update with: + +"pip3 install RTOC --upgrade" + + + + + RTOC wurde nicht mit PyPi installiert. + RTOC was not installed with PyPi. + + + + Um die Version zu überprüfen, installiere RTOC mit "pip3 install RTOC" + To enable version-checking, please install it with "pip3 install RTOC" + + + + Version + Version info + + + + , Neuste Version: + , newest version: + + + + Port: + Port: + + + + Fehler + Failure + + + + Bitte gib eine Zahl zwischen 0 und 65535 an + Please enter a free port (0 to 65535) + + + + Ihre Eingabe war ungültig. + Your entry is invalid + + + + Dialog + + + Dialog + + + + + Messtool + Measure + + + + Minimum + + + + + Y [ ] + + + + + 1 + + + + + X [s] + + + + + Maximum + + + + + Differenz + Difference + + + + 1s + + + + + Stile anpassen + Change style + + + + Signal 1 + + + + + Signal 2 + + + + + Abbrechen + Abort + + + + Auf alle anwenden + Style all + + + + Auf Auswahl anwenden + Style selected + + + + EventWidget + + + %H:%M:%S %d.%m.%Y + %H:%M:%S %Y.%m.%d + + + + Form + + + Form + + + + + X-Linien + Horizontal lines + + + + Y-Linien + Vertical lines + + + + Alpha: + + + + + Zeige Crosshair + Show Crosshair + + + + Fadenkreuz + Crosshair + + + + Öffne Mess-Rechteck in Plot + Open measure-rectangle in graph + + + + Rechteck-Messwerkzeug + Rectangle + + + + Schneide-Werkzeug + Cutting-Tool + + + + Signal-Labels ein/ausblenden + Show/hide Signal-labels + + + + Signal-Labels + + + + + X-Achse als Zeit formatieren + Horizontal is timeaxis + + + + Zeitachse + Timeaxis + + + + Aktivieren, X-Achse time.time()+x ist + Activate x-axis time.time()+x + + + + Zeitsignal + Timesignal + + + + Darstellung invertieren + Invert color + + + + Grid + Grid + + + + Legende ein/ausblenden + Show/hide legend + + + + Legende + Legend + + + + Blinkender Indikator an/aus + Show/hide blinking indicators + + + + Blinkender Indikator + Blinking indicators + + + + Mehrere Plotstile anpassen + Style multiple plots + + + + Plotstile anpassen + Style plots + + + + Global X-Offset: + + + + + s + + + + + Plot-Rate: + + + + + Hz + + + + + Script Hilfe + Script help + + + + Logger-Funktionen + Logger-functions + + + + Automatisch importierte Libraries: + Automatically imported libraries: + + + + import numpy as np + + + + + import scipy as sp + + + + + import math + + + + + global VARNAME = 0 # Definiere globale Variablen !!Benutzung durch self.VARNAME!! + global VARNAME = 0 # Define global variable !!Use variable with self.VARNAME!! + + + + trig LOGIC_EXPRESSION: #Use like "if" but with only one execution on change + trig LOGIC_EXPRESSION: #Use like "if" but with only one execution on change + + + + stream(y=0, sname="noName", dname="noDevice", unit="") + + + + + plot([x],[y],sname="noName",dname="noDevice",unit="") + + + + + plot([y],sname="noName",dname="noDevice",unit="") # X-Werte = range(len(y)) + + + + + {ans} = sendTCP(hostname = "localhost", *args, **kwargs) + + + + + print() + + + + + clearData() # löscht alle Daten + clearData() # delete all signals + + + + exportData(Filetype="json", filename=AUTO) # Exportiert alle Daten + exportData(Filetype="json", filename=AUTO) # export all data + + + + Standard-Funktionen + Default-functions + + + + [x], [[y], [y2],...] = rtoc.combine([[x],[y], [x2],[y2], ...], n=10) # Bringe mehrere Signale auf die gleiche X-Achse + [x], [[y], [y2],...] = rtoc.combine([[x],[y], [x2],[y2], ...], n=10) # make signals with different samplerates comparable + + + + [x], [y] = rtoc.resample([x], [y], n=10) # Sample ein Signal ab + [x], [y] = rtoc.resample([x], [y], n=10) # sample up/down + + + + [x], [y] = rtoc.resampleFourier([x], [y], n=10) # Sample ein Signal ab mit Fourier + [x], [y] = rtoc.resampleFourier([x], [y], n=10) # sample up/down with fourier + + + + [x], [y] = rtoc.mean([x], [y], n= 40) # Mittelwert über die letzten X Werte + [x], [y] = rtoc.mean([x], [y], n= 40) # mean of latest n values + + + + [x], [y] = rtoc.runningMean([x], [y], n=40) # Laufender Mittelwert über Signal + [x], [y] = rtoc.runningMean([x], [y], n=40) # running mean of signal + + + + [x], [y], [params] = rtoc.lsfit([x], [y] , DEF, x0, n) # LeastSquare fit auf benutzerdefinierte DEF, oder vordefinidert: DEF = "linear" oder "quad" + [x], [y], [params] = rtoc.lsfit([x], [y] , DEF, x0, n) # LeastSquare fit for user defined DEF, oder predefined: DEF = "linear" oder "quad" + + + + dy = rtoc.d([x], [y]) # Ableitung eines Signals + dy = rtoc.d([x], [y]) # difference of signal + + + + [x], [dy] = rtoc.diff([x], [y]) + [x], [dy] = rtoc.diff([x], [y]) # difference of latest values + + + + t = rtoc.PID([x], [y], Sollwert, kp=1, kd=0) # PD-Regelung + t = rtoc.PID([x], [y], Sollwert, kp=1, kd=0) # PD-controller + + + + t, newI = rtoc.PID([x], [y], Sollwert, kp=1, kd=0, ki=0, lastI) # PID-Regelung + t, newI = rtoc.PID([x], [y], Sollwert, kp=1, kd=0, ki=0, lastI) # PID-controller + + + + Geräte + Devices + + + + Signale = x,y + Signals = x,y + + + + X-Werte : Gerät.Signal.x + X-Values : device.signal.x + + + + Aktuellster X-Wert: Gerät.Signal.latest + Latest X-Value: device.signal.latest + + + + Y-Werte : Gerät.Signal.y + Y-Values : device.signal.y + + + + Start + + + + + Python Skript Bereich + Python-script area + + + + trig Funktionsgenerator.Square.latest == 1: + print("one") + + + + + Zuerst Script starten + + Start script first + + + + Skript in Datei speichern + Save script to file + + + + + + + + + + Signal als CSV-Datei exportieren + Export signal to CSV + + + + Signal löschen + Delete signal + + + + Signal zuschneiden + Cut signal + + + + Signal duplizieren + Duplicate signal + + + + Darstellung + View + + + + Plotdarstellung pausieren + Pause plot + + + + Plotstil anpassen + Style plot + + + + Label anzeigen/ausblenden + Show/hide label + + + + Modifikation + Modifications + + + + Scale + + + + + Offset + + + + + s + + + + + X-Y vertauschen + Swap X-Y + + + + Signal umbenennen + Rename signal + + + + Signal umbenennen (neue Daten werden nicht umgeleitet!) + Rename signal (new data-streams will not be redirected!) + + + + Rename + + + + + Modifikationen in Daten schreiben + Write modifications to signal + + + + Modifikationen in Daten schreiben, Daten werden überschrieben + Write modifications to signal, signal will be overwritten + + + + Anwenden + Apply + + + + Samplerate-Triggered: Skript wird mit definierter Samplerate ausgefürt + Samplerate-Triggered: Skript is executed in samplerate + + + + Samplerate-Triggered + + + + + Signal-Triggered: Script wird mit Geräte-Samplerate verknüpft und ausgeführt + Signal-Triggered: Script is executed, if selected signal gets updated + + + + Signal-Triggered + + + + + Keines + None + + + + Änderungen werden erst mit "Anwenden" in die Daten geschrieben + Changes will be applied to signal after hitting "Apply" + + + + Plot pausieren + Pause plot + + + + als CSV exportieren + Export as CSV + + + + Signal-Events ein/ausblenden + Show/hide signal-events + + + + Label ein/ausblenden + Show/hide label + + + + Signalstil anpassen + Style plot + + + + Von + From + + + + bis + till + + + + Zeitpunkt + Timepoint + + + + Inhalt + Content + + + + Gerät + Device + + + + Signal + Signal + + + + Filter + Filter + + + + Lösche alle Signale + Delete all Events + + + + event(text="", sname="noName", dname="noDevice", x=clock, priority=0) + + + + + MainWindow + + + RealTime OpenControl + + + + + Aufzeichnungsdauer: + Recordlength: + + + + Ändere die Aufzeichnungsdauer + Change the recordlength + + + + Messwerte + Values + + + + Lösche alle Signale + Delete all signals + + + + Geräte, für die PlugIns vorhanden sind, erscheinen hier + Devices with plugins will be shown here + + + + &Geräte + Devices + + + + Suche Gerät + Search device + + + + Falls ein Gerät ein GUI-PlugIn besitzt, erscheint dies hier + Devices with plugins will be shown here + + + + &Plugins + Plugins + + + + Page 2 + + + + + Öffnen, Speichern, Exportieren + Open, save, export + + + + &Datei + File + + + + Unterfenster-Darstellung verwalten + Arrange View + + + + &Fenster + View + + + + &Hilfe + Help + + + + Skripte + Scripts + + + + toolBar + + + + + &Daten exportieren + Export data + + + + Bitte nutze RECHTSKLICK auf Plotbereich + Please use RIGHTCLICK in plot + + + + &Beenden + Close + + + + &Plot anpassen + Style plot + + + + Plot-Darstellung + Plot-Style + + + + &Plot exportieren + Export plot + + + + Fenster + View + + + + &Signale + Signals + + + + Signale-Unterfenster + Signal-Subwindow + + + + Geräte-Unterfenster + Devices-Subwindow + + + + Plugins-Unterfenster + Plugin-Subwindow + + + + S&kript + Scripts + + + + Skripte-Unterfenster + Script-Subwindow + + + + &Skript laden + Load script + + + + Skript aus Datei laden + Load script from file + + + + S&kript speichern + Save script + + + + Skript in Datei speichern + Save script to file + + + + S&ession speichern + Save session + + + + Zuletzt geladen + Latest sessions + + + + Session &laden + Load session + + + + &Hilfe zu KellerLogger + Help + + + + Über RTOC + About RTOC + + + + Daten &importieren + Import data + + + + Minimize to SystemTray + + + + + TCP - Server + + + + + Multiproessing - Listener + + + + + Sprache + Language + + + + Deutsch + German + + + + English + English + + + + Events + Events + + + + Telegram-Bot + Telegram-Bot + + + + Bot-Token eingeben + Enter Bot-Token + + + + Aktiviert + Activated + + + + RTOC - Web + RTOC - Web + + + + Aktivieren + Activate + + + + Passwort-Schutz + Password-Protection + + + + Auf Updates prüfen + Check for updates + + + + Port: 5050 + Port: 5050 + + + + NetWoRTOC + + + NetWoRTOC + + + + + Verbinden + Connect + + + + Suchen + Search + + + + RTOC-Server + + + + + 127.0.0.1 + + + + + Aufzeichnungsdauer: + Recordlength: + + + + Ändere die Aufzeichnungsdauer + Change the recordlength of remote-RTOC-Server + + + + Messwerte + Values + + + + Lösche alle Signale + Delete all signals from remote RTOC-Server + + + + Signale + Signals + + + + Samplerate: + + + + + Alle auswählen + Select all + + + + Geräte + Devices + + + + Geräte Funktionen und Parameter + Device functions and paramters + + + + Signal löschen + Delete signal + + + + RTOC-Netzwerksuche + Search RTOC-Servers + + + + Möchten Sie wirklich das Netzwerk nach RTOC-Servern durchsuchen? + Do you really want to search your local network for RTOC-Servers? + + + + Dieser Vorgang wird einige Zeit in Anspruch nehmen + This will take some time + + + + Sucht... + Searching... + + + + Fertig + Finished + + + + RTOC-Suche abgeschlossen + Searching for RTOC-Servers finished + + + + Server gefunden. + server found. + + + + Warnung + Warning + + + + Möchten sie wirklich alle Daten am RTOC-Server löschen? + Do you really want to delete all data from this RTOC-Server? + + + + (Unwiederrufbar) + (Data will be lost) + + + + Remote-Funktion ausführen + Call remote function + + + + an Host + at host + + + + ausführen. + execution. + + + + Funktionsparameter + Functionparameters + + + + Fehler + Failure + + + + Funktionsparameter sind nicht gültig + Submitted functionsparameters are not valid + + + + Bitte geben Sie gültige Parameter an + Please enter valid parameters + + + + Remote-Parameter ändern + change remote-parameter + + + + ändern. + change. + + + + Wert ungültig + Value not valid + + + + Bitte geben Sie einen gültigen Wert an + Please enter a valid value + + + + Beenden + Close + + + + Bitte warten + Please wait + + + + NetWoRTOC sucht gerade nach RTOC-Servern + NetWoRTOC is searching for RTOC-Servers + + + + Bitte warten bis der Vorgang abgeschlossen ist. + Please wait. + + + + Passwort + Password + + + + Der RTOC-Server + The RTOC-Server + + + + ist passwortgeschützt. Bitte Passwort eintragen + is password protected. Please enter password + + + + TCP-Passwort + TCP-password + + + + Geschützt + Protected + + + + Plot + + + Signale + Signals + + + + Vergangene Zeit + Elapsed time + + + + RTLogger + + + Plugin gestartet: + Plugin startet: + + + + Plugin gestoppt + Plugin stopped: + + + + Signal-Stream hinzugefügt: + Signal-Stream added: + + + + Neues Signal geplottet: + Signal-Plot added: + + + + Plugin gestoppt: + Plugin stopped: + + + + Signal-Plot hinzugefügt: + Signal-Plot added: + + + + Signale + Signals + + + + RTOC + + + Anzeigen + Show + + + + Beenden + Close + + + + Im Hintergrund laufen + Run in background + + + + TCP Server + + + + + Fehler + Failure + + + + Fehler beim Laden der Geräte GUI +Bitte Code überprüfen. + Loading device GUI failed. + + + + Fehler beim Laden des Geräts +Bitte stellen Sie sicher, dass das Gerät verbunden ist. + Loading device failed. Please make sure the device is connected. + + + + RealTime OpenControl + + + + + läuft im Hintergrund weiter und zeichnet Messwerte auf + is running in background and collecting data + + + + Speichern + Save + + + + Wollen Sie die aktuelle Sitzung speichern? + Do you want to save the current session? + + + + Passwort-Schutz: Aus + Password-Protection: Off + + + + Passwort-Schutz: An + Password-Protection: On + + + + Port: + Port: + + + + RTOC_TCP + + + Speichern + Save + + + + Wollen Sie die aktuelle Sitzung speichern? + Do you want to save the current session? + + + + RTPlotActions + + + Signale + Signals + + + + Vergangene Zeit + Elapsed time + + + + RTPlotWidget + + + Signale: + Signals: + + + + ScriptWidget + + + Fehler beim laden der Datei + Loading file failed + + + + Fehler + Failure + + + + Datei + File + + + + nicht gefunden + not found + + + + Unbenannt + Unknown + + + + Skript laden + Load script + + + + Schließen + Close + + + + SignalEditWidget + + + Info + Info + + + + Wähle zuerst das Schneide-Tool aus + Please select Cutting-Tool first + + + + Du musst zuerst deine Schnittbereich festlegen + Please set your Cut-Area first + + + + CSV-Datei (*.csv) + CSV-File (*.csv) + + + + Export + Export + + + + Umbenennen + Rename + + + + Bitte gib einen neuen Namen an + Please enter a new signalname + + + + Achtung + Warning + + + + Daten werden dauerhaft geändert + Signal will be changed permanently + + + + Ja + Yes + + + + Nein + No + + + + Web + + + Signal + Signal + + + + Index + Index + + + + Messwert + Value + + + + Zeitpunkt + Timepoint + + + + Verbindung fehlgeschlagen + Connection failed + + + + Verbinden + Connect + + + + Pause + Pause + + + + (TCP-Server Passwort) + (TCP-Server password) + + + + Vergangene Zeit [s] + Elapsed time [s] + + + + Verbindung trennen + Close connection + + + + Passwort falsch + Password wrong + + + + a + + + Signal-Plot hinzugefügt: + Signal-Plot added: + + + + layout + + + Stile anpassen + Style plots + + + + Füllung + Fill + + + + Füllfarbe + Fillcolor + + + + y = + + + + + Füllen bis + Fill until + + + + Füllung löschen + Remove fill + + + + Färben + Colorize + + + + Schatten + Shadow + + + + Schattenstil + Shadow-Style + + + + Linie + Line + + + + Punkte (P) + Dots + + + + Striche (S) + Stroke + + + + P S + Dot Stroke + + + + P P S + Dot Dot Stroke + + + + Schattenbreite + Shadowwidth + + + + Schattenfarbe + Shadowcolor + + + + Linienfarbe + Linecolor + + + + % + + + + + Linienstil + Line-Style + + + + Opazität + Opacity + + + + Linienbreite + Linewidth + + + + Symbol + + + + + Symbolfarbe + Symbolcolor + + + + Symbolrandfarbe + Symbolbrushcolor + + + + Symbolgröße + Symbolsize + + + + Kreis + Circle + + + + X + + + + + Quadrat + Square + + + + Dreieck + Triangle + + + + Raute + Rectangle + + + + Plus + + + + + Abbrechen + Abort + + + + Anwenden + Apply + + + + plotWidgetX + + + Form + + + + + Tools + Tools + + + + Darstellung + View + + + + Plot pausieren/fortsetzen + Pause plot + + + + Suche Signal; ... + Search signal; ... + + + + Signale + Signals + + + + Wert + Value + + + + Signale: 0 + Signals: 0 + + + + Zeige Crosshair + Show Crosshair + + + + Öffne Mess-Rechteck in Plot + Open Measure-Rectangle in plot + + + + self.rtoc + + + Plugin gestartet: + Plugin startet: + + + + Plugin gestoppt: + Plugin gestoppt: + + + + Signal-Stream hinzugefügt: + Signal-Stream added: + + + + Signal-Plot hinzugefügt: + Signal-Plot added: + + + + telegram + + + Event-Benachrichtigung festlegen + Event-Notifications + + + + Letzte Messwerte + Latest Values + + + + Signale + Signals + + + + Geräte + Devices + + + + Einstellung angepasst + Settings updated + + + + Signale löschen + Delete signals + + + + Aufzeichnungsdauer ändern + Change recordlength + + + + <-- Zurück + <-- Back + + + + Aufzeichnungsdauer geändert + Recordlength was changed + + + + Fehlerhafte Eingabe + No valid message + + + + Gerät beenden + Stop device + + + + Gerät starten + Start device + + + + Gerätefehler + Device-failure + + + + Funktionen + Functions + + + + Parameter + Parameters + + + + Wenn dein Text aussieht, wie eine JSON, dann kannst du damit später alles machen + You reached the end of this telegram-bot. Well done. Lets get back to the menu ... + + + + Was soll ich dazu sagen ... + Oh no ... + + + + Zeit [s] + Time [s] + + + + Derzeitige Aufzeichnungsdauer: + Current recordlength: + + + + Funktionen + Functions + + + + Bitte gib Parameter an, falls benötigt + Please enter parameters, if needed + + + + Bitte gib einen neuen Wert an. +Derzeitiger Wert: + Please enter a new value. +Current Value: + + + + Fehler + Failure + + + + Hauptmenü + Mainmenu + + + + Alle Benachrichtigungen + All notifications + + + + Warnungen + Warnings + + + + Nur Fehlermeldungen + Only errors + + + + Keine Benachrichtigung + No notifications + + + + <- Zurück + <- Back + + + + Wähle eine Benachrichtigungsstufe aus. Derzeitige Stufe: + + Select a notification level. Current level: + + + + + Keine Messwerte vorhanden + No measurements recorded yet + + + + Event erzeugen + Create event + + + + Event gesendet. + Event sent. + + + + +Signale verwenden + +Signals use + + + + Neues Event erzeugen +Sende eine Nachricht, um ein Event zu erzeugen. +Wähle ein Signal aus, um das Event einem Signal zuzuordnen. + Create new event +Send a message to create an event +Select a signal before to asign a signal to this event + + + + Signal ausgewählt: + Selected signal: + + + diff --git a/RTOC/telegramBot.py b/RTOC/telegramBot.py index 3f6d86d..87893ae 100644 --- a/RTOC/telegramBot.py +++ b/RTOC/telegramBot.py @@ -4,7 +4,11 @@ from telegram import KeyboardButton, ReplyKeyboardMarkup, ChatAction, Bot, ParseMode from threading import Thread from io import BytesIO -import matplotlib.pyplot as plt +try: + import matplotlib.pyplot as plt +except ImportError: + print('Could not import matplotlib.pyplot\nThis happens if matplotlib or tkinker isn\'t installed. \nReceiving plots via telegram is disabled.') + plt = None from PyQt5.QtCore import QCoreApplication from PyQt5.QtCore import QObject @@ -319,15 +323,18 @@ def sendSignalPlot(self, bot, update, signalname): data = self.logger.getSignal(self.logger.getSignalId(a[0], a[1])) # Make a square figure and axes - plt.gcf().clear() - plt.plot(data[0], data[1]) - plt.xlabel(translate('telegram', 'Zeit [s]')) - plt.savefig('telegram_export.png') - plt.title(signalname) - t = self.createToolTip(self.logger.getSignalId(a[0], a[1])) - print(t) - bot.send_photo(chat_id=update.message.chat_id, photo=open('telegram_export.png', 'rb')) - bot.send_message(chat_id=update.message.chat_id, text=t) + if plt != None: + plt.gcf().clear() + plt.plot(data[0], data[1]) + plt.xlabel(translate('telegram', 'Zeit [s]')) + plt.savefig('telegram_export.png') + plt.title(signalname) + t = self.createToolTip(self.logger.getSignalId(a[0], a[1])) + print(t) + bot.send_photo(chat_id=update.message.chat_id, photo=open('telegram_export.png', 'rb')) + bot.send_message(chat_id=update.message.chat_id, text=t) + else: + bot.send_message(chat_id=update.message.chat_id, text='Could not send plot.\n This happens, if matplotlib or tkinker isn\'t installed. on the RTOC-Server\n') def createToolTip(self, id): maxduration = self.calcDuration(list(self.logger.getSignal(id)[0])) @@ -368,9 +375,10 @@ def resizeHandler(self, bot, update): commands.append(translate('telegram', '<-- Zurück')) button_list = [KeyboardButton(s) for s in commands] reply_markup = ReplyKeyboardMarkup(self.build_menu(button_list, n_cols=1)) + size, maxsize = self.logger.getSignalSize() bot.send_message(update.message.chat_id, text=translate( 'telegram', "Derzeitige Aufzeichnungsdauer: ")+str(self.logger.maxLength)+translate( - 'telegram', '\nSignale verwenden ')+lib.bytes_to_str(self.logger.getSignalSize()), reply_markup=reply_markup) + 'telegram', '\nSignale verwenden ')+lib.bytes_to_str(size)+'/'+lib.bytes_to_str(maxsize), reply_markup=reply_markup) def pluginsHandler(self, bot, update): commands = list(self.logger.devicenames) diff --git a/misc/README_german.md b/misc/README_german.md index 5f79e28..a29718f 100644 --- a/misc/README_german.md +++ b/misc/README_german.md @@ -1,10 +1,10 @@ # RealTime OpenControl (RTOC) -### Version 1.8 +### Version 1.8.7.5 [**This README is available in ENGLISH here.**](README.md) -[Dokumentation](https://github.com/Haschtl/RealTimeOpenControl/wiki/(GERMAN)-RealTime-OpenControl-(RTOC)) +[Dokumentation](https://git.kellerbase.de/haschtl/kellerlogger/wikis/(GERMAN)-RealTime-OpenControl-(RTOC)) RealTime OpenControl ermöglicht die einfache Echtzeit-Datenaufzeichnung, -darstellung und Bearbeitung. Die Aufzeichnung kann mit lokale Python-Skripten oder über TCP lokal oder aus dem Netzwerk erfolgen. Darstellung und Bearbeitung ist lokal, im Netzwerk (TCP und HTML) und über Telegram am Smartphone verfügbar. @@ -83,7 +83,7 @@ plotStyles.json // Angepasste Plotstile werden gespeichert Um RTOC zu benutzen müssen folgende Abhängigkeiten vorhanden sein ```python -pip3 install numpy pyqt5 pyqtgraph markdown2 xslxwriter scipy qtmodern +pip3 install numpy pyqt5 pyqtgraph markdown2 xslxwriter scipy ``` Folgende Pakete sollten ebenfalls installiert werden @@ -92,22 +92,20 @@ Folgende Pakete sollten ebenfalls installiert werden pip3 install python-telegram-bot matplotlib requests python-nmap bokeh pycryptdomex ``` -Für das DPS5020-Plugin ist noch folgende Abhängigkeit zu installieren +You can use different stylesheets if you want. Just install one of these with pip: +'QDarkStyle', 'qtmodern', 'qdarkgraystyle'. -```python -pip3 install minimalmodbus -``` Dann kann die RTOC-Repository geklont werden mit ```shell -git@github.com:Haschtl/RealTimeOpenControl.git +git clone git@git.kellerbase.de:haschtl/kellerlogger ``` Nun kann RTOC gestartet werden: ```shell -cd RTOC +cd kellerlogger // Für lokale RTOC-Instanz mit GUI python3 RTOC // Für lokale RTOC-Instanz ohne GUI (nur TCP-Server, [HTTP-Server, Telegram-Bot]) @@ -132,16 +130,20 @@ plotStyles.json // Angepasste Plotstile werden gespeichert ![Beispielschematik](screenshots/RTOC-schematik.png) ### Wiki -[Lese die Dokumentation](https://github.com/Haschtl/RealTimeOpenControl/wiki/(GERMAN)-RealTime-OpenControl-(RTOC)) +[Lese die Dokumentation](https://git.kellerbase.de/haschtl/kellerlogger/wikis/(GERMAN)-RealTime-OpenControl-(RTOC)) ### Standart/Beispiel Plugins: - Funktionsgenerator: Erzeugt Sinus, Square, Sawtooth, Random, AC, DC +- NetWoRTOC: Steuerung und Datenaustausch zwischen mehreren RTOC's im Netzwerk + +Weitere Plugins gibt es in der [RTOC-Plugin-Repository](https://git.kellerbase.de/haschtl/rtoc-plugins): - System: Zur Aufzeichnung vieler Systemvariablen (CPU, Memory, Network,...) - Octoprint: Aufzeichnung für 3D-Drucker - DPS5020: Netzgerät-Aufzeichnung und Steuerung (evtl. auch DPS5005, ...) - HoldPeak VC820: Multimeter Messaufzeichnung (wahrsch. auch andere VC820) -- NetWoRTOC: Steuerung und Datenaustausch zwischen mehreren RTOC's im Netzwerk +- ... + ### First GUI-Run @@ -161,7 +163,7 @@ Die graphische Oberfläche von RTOC bietet eine Fülle an Funktionen zur Datenda - Skalieren, verschieben von Signalen - Mehrere Skripte parallel laufen lassen -[Vollständige Anleitung zur GUI hier.](https://github.com/Haschtl/RealTimeOpenControl/wiki/GUI) +[Vollständige Anleitung zur GUI hier.](https://git.kellerbase.de/haschtl/kellerlogger/wikis/GUI) ### Write simple Python-Plugin @@ -172,7 +174,7 @@ Python-Plugins werden in RTOC integriert und können Aber **nicht** auf Messdaten zugreifen. Hierzu muss das Plugin per TCP auf RTOC zugreifen. -[Beispiel-Plugins hier.](https://github.com/Haschtl/RealTimeOpenControl/wiki/PlugIns) +[Beispiel-Plugins hier.](https://git.kellerbase.de/haschtl/kellerlogger/wikis/PlugIns) ### Einfacher lokaler TCP-Datensender @@ -188,11 +190,11 @@ Die TCP-Kommunikation findet mit JSONs statt. Dadurch lässt sich die Kommunikat Die Verbindung zwischen RTOC-Server und Client kann mit einem Passwort Ende-zu-Ende verschlüsstelt werden (AES). -[Beispiele für TCP hier.]https://github.com/Haschtl/RealTimeOpenControl/wiki/clientCommunication) +[Beispiele für TCP hier.](https://git.kellerbase.de/haschtl/kellerlogger/wikis/clientCommunication) ### Telegram einbinden -[Anleitung zu Telegram hier.](https://github.com/Haschtl/RealTimeOpenControl/wiki/telegram) +[Anleitung zu Telegram hier.](https://git.kellerbase.de/haschtl/kellerlogger/wikis/telegram) ## Screenshots diff --git a/setup.py b/setup.py index 9c7c412..7f2f404 100644 --- a/setup.py +++ b/setup.py @@ -1,8 +1,8 @@ # Tutorial at https://blog.jetbrains.com/pycharm/2017/05/how-to-publish-your-package-on-pypi/ # https://packaging.python.org/tutorials/packaging-projects/ -# python setup.py sdist bdist_wheel -# python -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* +# python3 setup.py sdist bdist_wheel +# python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* # python.exe -m pip install --index-url https://test.pypi.org/simple/ RTOC # virtual env for testing: @@ -10,16 +10,20 @@ # move to directory and use python from There # public: -# python setup.py bdist_wheel -# python -m twine upload dist/* - -DESCRIPTION = """\ -RealTime OpenControl is a universal measurement, plot and control-software. -It's purpose is to put measurements from different devices (for example 3d-printers, multimeters, power supplies, microcontroller,...) into one tool. -Its fully expandable for every device with Python-Plugins and a running TCP-server. -You can also control the devices (if your plugin has this functionality) with python-scripts, which you can write and run at runtime! This makes it also possible to plot everything else. -There are some example-plugins and example-scripts included. -It also offers an extended plotting-GUI with multiple plots, measure-tools, style-adjustments. +# python3 setup.py bdist_wheel +# python3 -m twine upload dist/* + +DESCRIPTION = """RealTime OpenControl enables simple real-time data recording, visualization and editing. The recording can be done with a local Python scripts or via TCP locally/from the network. Visualization and editing is available locally, in the network (TCP and HTML) and via Telegram on the smartphone. + +In addition to data recording, events can also be recorded. These can, for example, trigger a telegram message. + +Possible applications: + +- Central measurement data recording of laboratory instruments with PC connection (e.g. power supply unit, multimeter, sensors, microcontroller) +- Central recording of measurement data from Internet devices (e.g. mobile weather stations, drones, smartphones) +- Remote monitoring and control of processes and devices with PC and Smartphone (Telegram) (e.g. 3D printing, heating, Custom-SmartHome) +- Controlling between several devices (e.g.: power regulation of a power supply unit on the temperature sensor of a multimeter) +- Decentralized data recording (e.g. on Raspberry) and access via network connection (smart projects) """ setupOpts = dict( @@ -71,9 +75,9 @@ path = os.path.split(__file__)[0] #sys.path.insert(0, os.path.join(path, 'tools')) -version = "1.8.2" -forcedVersion = "1.8.2" -gitVersion ="1.8.2" +version = "1.8.7.5" +forcedVersion = "1.8.7.5" +gitVersion ="1.8.7.5" initVersion=1.0 @@ -152,7 +156,9 @@ def run(self): 'markdown2', 'xlsxwriter', 'scipy', - 'qtmodern', +# 'QDarkStyle', +# 'qtmodern', +# 'qdarkgraystyle', 'python-telegram-bot', 'matplotlib', 'requests', diff --git a/setupStandalone.py b/setupStandalone.py index aa4a1ee..7a31ab1 100644 --- a/setupStandalone.py +++ b/setupStandalone.py @@ -18,7 +18,7 @@ setup( name='RealTimeOpenControl', - version = '1.8.2', + version = '1.8.7.5', description = 'RTOC', options = dict(build_exe = buildOptions), executables = executables