XML-RPC Valueserver

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: