From 5661217900be3c14dc48f431afeb6ba887b74659 Mon Sep 17 00:00:00 2001 From: NaruX Date: Sun, 16 Jun 2019 13:55:24 +0200 Subject: [PATCH] replace_io aus Datei importieren wird direkt vararbeitet --- doc/helper.html | 24 ++++++++ doc/mqttserver.html | 5 +- doc/procimgserver.html | 5 +- eric-revpipyload.api | 5 +- revpipyload.e4p | 4 +- revpipyload/helper.py | 110 +++++++++++++++++++++++++++++++++++ revpipyload/procimgserver.py | 15 +++-- revpipyload/revpipyload.py | 2 +- setup.py | 2 +- 9 files changed, 156 insertions(+), 16 deletions(-) diff --git a/doc/helper.html b/doc/helper.html index a58d308..e023644 100644 --- a/doc/helper.html +++ b/doc/helper.html @@ -31,6 +31,9 @@ Functions refullmatch re.fullmatch wegen alter python version aus wheezy nachgebaut. + +revpimodio_replaceio +Importiert und ersetzt IOs in RevPiModIO.

@@ -80,5 +83,26 @@ True, wenn komplett passt sonst False
Up
+

+ +

revpimodio_replaceio

+revpimodio_replaceio(revpi, filename) +

+Importiert und ersetzt IOs in RevPiModIO. +

+
revpi
+
+RevPiModIO Instanz +
filename
+
+Dateiname der Ersetzungsdatei +
+
+
Returns:
+
+True, wenn alle IOs ersetzt werden konnten +
+
+
Up

\ No newline at end of file diff --git a/doc/mqttserver.html b/doc/mqttserver.html index 43edbd9..683aea1 100644 --- a/doc/mqttserver.html +++ b/doc/mqttserver.html @@ -92,7 +92,7 @@ Static Methods

MqttServer (Constructor)

-MqttServer(basetopic, sendinterval, broker_address, port=1883, tls_set=False, username="", password=None, client_id="", send_events=False, write_outputs=False) +MqttServer(basetopic, sendinterval, broker_address, port=1883, tls_set=False, username="", password=None, client_id="", send_events=False, write_outputs=False, replace_ios=None)

Init MqttServer class.

@@ -126,6 +126,9 @@ Sendet Werte bei IO Wertaenderung
write_outputs
Per MQTT auch Outputs schreiben +
replace_ios
+
+Replace IOs of RevPiModIO

diff --git a/doc/procimgserver.html b/doc/procimgserver.html index 39b5fcf..c4b3138 100644 --- a/doc/procimgserver.html +++ b/doc/procimgserver.html @@ -93,13 +93,16 @@ Static Methods

ProcimgServer (Constructor)

-ProcimgServer(xmlserver) +ProcimgServer(xmlserver, replace_ios=None)

Instantiiert RevPiCheckServer()-Klasse.

xmlserver
XML-RPC Server +
replace_ios
+
+Replace IOs of RevPiModIO

diff --git a/eric-revpipyload.api b/eric-revpipyload.api index a661233..c3374a7 100644 --- a/eric-revpipyload.api +++ b/eric-revpipyload.api @@ -4,6 +4,7 @@ helper.__license__?9 helper._setuprt?5(pid, evt_exit) helper._zeroprocimg?5() helper.refullmatch?4(regex, string) +helper.revpimodio_replaceio?4(revpi, filename) logsystem.LogReader.closeall?4() logsystem.LogReader.load_applog?4(start, count) logsystem.LogReader.load_plclog?4(start, count) @@ -28,7 +29,7 @@ mqttserver.MqttServer.newlogfile?4() mqttserver.MqttServer.reload_revpimodio?4() mqttserver.MqttServer.run?4() mqttserver.MqttServer.stop?4() -mqttserver.MqttServer?1(basetopic, sendinterval, broker_address, port=1883, tls_set=False, username="", password=None, client_id="", send_events=False, write_outputs=False) +mqttserver.MqttServer?1(basetopic, sendinterval, broker_address, port=1883, tls_set=False, username="", password=None, client_id="", send_events=False, write_outputs=False, replace_ios=None) mqttserver.__author__?9 mqttserver.__copyright__?9 mqttserver.__license__?9 @@ -63,7 +64,7 @@ procimgserver.ProcimgServer.setvalue?4(device, io, value) procimgserver.ProcimgServer.start?4() procimgserver.ProcimgServer.stop?4() procimgserver.ProcimgServer.values?4() -procimgserver.ProcimgServer?1(xmlserver) +procimgserver.ProcimgServer?1(xmlserver, replace_ios=None) procimgserver.__author__?9 procimgserver.__copyright__?9 procimgserver.__license__?9 diff --git a/revpipyload.e4p b/revpipyload.e4p index 50c279a..63c4f3d 100644 --- a/revpipyload.e4p +++ b/revpipyload.e4p @@ -1,7 +1,7 @@ - + en_US @@ -9,7 +9,7 @@ Python3 Console Dieser Loader wird über das Init-System geladen und führt das angegebene Pythonprogramm aus. Es ist für den RevolutionPi gedacht um automatisch das SPS-Programm zu starten. - 0.7.5 + 0.7.6 Sven Sager akira@narux.de diff --git a/revpipyload/helper.py b/revpipyload/helper.py index 915f546..34c8f81 100644 --- a/revpipyload/helper.py +++ b/revpipyload/helper.py @@ -5,6 +5,7 @@ __copyright__ = "Copyright (C) 2018 Sven Sager" __license__ = "GPLv3" import os import proginit +from configparser import ConfigParser from re import match as rematch from subprocess import Popen, PIPE @@ -117,6 +118,115 @@ def _zeroprocimg(): ) +def revpimodio_replaceio(revpi, filename): + """Importiert und ersetzt IOs in RevPiModIO. + + @param revpi RevPiModIO Instanz + @param filename Dateiname der Ersetzungsdatei + @return True, wenn alle IOs ersetzt werden konnten + + """ + cp = ConfigParser() + try: + with open(filename, "r") as fh: + cp.read_file(fh) + except Exception as e: + proginit.logger.error( + "could not read replace_io file '{0}' | {1}".format(filename, e) + ) + return False + + # Pre-check + lst_replace = [] + rc = True + for io in cp: + if io == "DEFAULT": + continue + + dict_replace = { + "replace": cp[io].get("replace", ""), + "frm": cp[io].get("frm"), + "bmk": cp[io].get("bmk", ""), + "byteorder": cp[io].get("byteorder", "little"), + } + + if dict_replace["replace"] in revpi.io: + + # Byteorder prüfen + if not (dict_replace["byteorder"] == "little" or + dict_replace["byteorder"] == "big"): + proginit.logger.error( + "byteorder of '{0}' must be 'little' or 'big'".format(io) + ) + rc = False + continue + + if dict_replace["frm"] == "?": + + # Convert defaultvalue from config file + try: + dict_replace["default"] = cp[io].getboolean("defaultvalue") + except Exception: + proginit.logger.error( + "could not convert '{0}' defaultvalue '{1}' to boolean" + "".format(io, cp[io].get("defaultvalue")) + ) + rc = False + continue + + # Get bitaddress + try: + dict_replace["bitaddress"] = cp[io].getint("bitaddress", 0) + except Exception: + proginit.logger.error( + "could not convert '{0}' bitaddress '{1}' to integer" + "".format(io, cp[io].get("bitaddress")) + ) + rc = False + continue + + else: + # Convert defaultvalue from config file + try: + dict_replace["default"] = cp[io].getint("defaultvalue") + except Exception: + proginit.logger.error( + "could not convert '{0}' defaultvalue '{1}' to integer" + "".format(io, cp[io].get("defaultvalue")) + ) + rc = False + continue + + else: + proginit.logger.error( + "can not find io '{0}' to replace with '{1}'" + "".format(dict_replace["replace"], io) + ) + rc = False + continue + + # Replace_IO übernehmen + lst_replace.append(dict_replace) + + if not rc: + # Abbrechen, wenn IO-Verarbeitung einen Fehler hatte + return False + + # Replace IOs + for dict_replace in lst_replace: + + # FIXME: Hier können Fehler auftreten !!! + + revpi.io[dict_replace["replace"]].replace_io( + io, + frm=dict_replace["frm"], + bmk=dict_replace["bmk"], + bit=dict_replace["bitaddress"], + byteorder=dict_replace["byteorder"], + defaultvalue=dict_replace["default"] + ) + + def refullmatch(regex, string): """re.fullmatch wegen alter python version aus wheezy nachgebaut. diff --git a/revpipyload/procimgserver.py b/revpipyload/procimgserver.py index ad55575..25d3739 100644 --- a/revpipyload/procimgserver.py +++ b/revpipyload/procimgserver.py @@ -11,6 +11,7 @@ __license__ = "GPLv3" import pickle import proginit import revpimodio2 +from .helper import revpimodio_replaceio from xmlrpc.client import Binary @@ -108,14 +109,12 @@ class ProcimgServer(): return e # Replace IOs of RevPiModIO - if self.replace_ios: - try: - self.rpi.import_replaced_ios(self.replace_ios) - except Exception as e: - proginit.logger.error( - "could not load replaced ios into RevPiModIO - using " - "defaults | {0}".format(e) - ) + if self.replace_ios and \ + not revpimodio_replaceio(self.rpi, self.replace_ios): + proginit.logger.error( + "could not load all or some replaced ios into RevPiModIO - " + "see log file" + ) # NOTE: Warum das? self.rpi.syncoutputs(device=0) diff --git a/revpipyload/revpipyload.py b/revpipyload/revpipyload.py index 33fe736..75818c3 100755 --- a/revpipyload/revpipyload.py +++ b/revpipyload/revpipyload.py @@ -28,7 +28,7 @@ begrenzt werden! __author__ = "Sven Sager" __copyright__ = "Copyright (C) 2018 Sven Sager" __license__ = "GPLv3" -__version__ = "0.7.5" +__version__ = "0.7.6" import gzip import logsystem import picontrolserver diff --git a/setup.py b/setup.py index 3e5a623..cef2511 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ setup( license="LGPLv3", name="revpipyload", - version="0.7.5", + version="0.7.6", scripts=["data/revpipyload"],