In diesem Beispiel starten wir einen XML-RPC-Server über den einfach die Werte der IOs abgerufen werden können. Ein Mitglied aus dem RevolutionPi Forum hatte die Idee, die Counterstände der DIO-Module über das Netzwerk abzurufen. Die Daten verarbeitet er auf einem anderen System. (Danke für die Idee!)
import revpimodio import signal from concurrent import futures from xmlrpc.server import SimpleXMLRPCServer class RevPiValueServer(): def __init__(self): """Init der Klasse.""" # RevPiModIO - mit monitoring=True damit NUR gelesen wird!!! self.rpi = revpimodio.RevPiModIO(auto_refresh=True, monitoring=True) # XMLRPC-Server self.xsrv = SimpleXMLRPCServer(("", 55000), logRequests=False) self.xsrv.register_introspection_functions() self.xsrv.register_function(self.get_iovalue) # Signal events signal.signal(signal.SIGINT, self._sigexit) signal.signal(signal.SIGTERM, self._sigexit) def _sigexit(self, signum=None, frame=None): """Behandelt das exit-Signal.""" self.xsrv.shutdown() def get_iovalue(self, device, io): """Gibt einen Wert zurueck. @param device: Modulname @param io: IO-Name @returns: IO-Wert""" if type(io) != str: raise ValueError("Nur mit IO-Namen arbeiten!") io = self.rpi.devices[device][io] return io.value def start(self): """Startet den XMLRPC-Server.""" e = futures.ThreadPoolExecutor(max_workers=1) self._futsrv = e.submit(self.xsrv.serve_forever) print("Server gestartet!") e.shutdown() if __name__ == "__main__": root = RevPiValueServer() root.start()
Abrufen kann man die Werte einfach über:
# Über IDLE getestet >>> from xmlrpc.client import ServerProxy >>> cli = ServerProxy("http://192.168.50.152:55000") >>> cli.get_iovalue(32,"Counter_1_i07") 31
Wichtig ist die piCtory Konfiguration für den MEM-Wert damit der Input auch als Counter funktioniert:
Der Zählerwert liegt dann auf dem Input Counter_1_i07: