RevPiModIODriver - Virtuelle Devices von piCtory mit Daten füttern für logiCAD

Hier kannst du dein Revolution Pi Projekt der Community vorstellen
Post Reply
User avatar
RevPiModIO
KUNBUS
Posts: 322
Joined: 20 Jan 2017, 08:44
Answers: 0
Contact:

RevPiModIODriver - Virtuelle Devices von piCtory mit Daten füttern für logiCAD

Post by RevPiModIO »

Wir haben unser RevPiModIO-Modul für Python mal um eine Art "Treiberklasse" erweitert. Damit wollen wir die einfache Entwicklung von "Treibern" für virtuelle Devices ermöglichen.
https://revpimodio.org/startseite/ueber ... diodriver/

In piCtory haben wir ein virtuelles Device gesetzt und die Bytes die wir verwenden wollen mit dem "export" Haken versehen.
Screenshot_20170319_171215_klein.png
Screenshot_20170319_171215_klein.png (159.07 KiB) Viewed 4195 times
Unser Python Programm soll die Systemzeit, die prozentuale Belegung vom root mount und die CPU-Temperatur in das virtuelle Device einfügen

Input-Byte 0 bis 3 als int verwenden für timestamp
Input-Byte 4 als int verwenden für n% Belegung root mount
Input-Byte 5 - 6 als int für CPU Temperatur in Centigrad

Dann lassen wir unser Python Programm laufen:

Code: Select all

import revpimodio
import signal
import time
from os import statvfs
from threading import Event


class MyDriver():

    def __init__(self):
        """Instantiiert den Treiber."""
        self._evt_exit = Event()

        # Einstellungen laden
        self._loadconfig()

        # Signal events
        signal.signal(signal.SIGINT, self._sigexit)
        signal.signal(signal.SIGTERM, self._sigexit)
        signal.signal(signal.SIGHUP, self._loadconfig)

    def _loadconfig(self, signum=None, frame=None):
        """Load/Reload configuration."""
        # RevPiModIODriver instantiieren
        self.rpi = revpimodio.RevPiModIODriver([64])

        # RevPiModIODriver konfigurieren

        # Input-Byte 0 bis 3 als int verwenden für timestamp
        self.rpi.devices[64].reg_out("timestamp", "Input_1_i09", "L")

        # Input-Byte 4 als int verwenden für n% Belegung root mount
        self.rpi.devices[64].reg_out("roothdused", "Input_5_i09", "B")

        # Input-Byte 5 - 6 als int für CPU Temperatur * 100 (Centigrad)
        self.rpi.devices[64].reg_out("cputemp", "Input_6_i09", "H")

        # Nach run() Durchlauf diese Sekunden warten bis erneuter Durchlauf
        self.refresh = 1

    def _sigexit(self, signum, frame):
        """Signal handler to exit."""
        self._evt_exit.set()

    def run(self):
        """Lauft bis exit gesetzt wrid."""
        while not self._evt_exit.is_set():

            # Inputs lesen, aus Sicht von logiCAD sind dies Outputs!
            # (auch wenn wir diese momentan nicht verwenden)
            self.rpi.devices.readprocimg()

            # Timestamp - RevPi-Zeit schreiben
            self.rpi.devices[64]["timestamp"].value = int(time.time())

            # Speicherbelegung des root mounts
            hd = statvfs("/")
            usedspace = int(
                (hd.f_blocks - hd.f_bavail) / hd.f_blocks * 100
            )
            self.rpi.devices[64]["roothdused"].value = usedspace

            # CPU-Temperatur
            with open("/sys/devices/virtual/thermal/thermal_zone0/temp") as fh:
                tmp = fh.read()
            self.rpi.devices[64]["cputemp"].value = int(tmp.strip()[:-1])

            # Outputs schreiben, aus Sicht von logiCAD sind dies Inputs!
            self.rpi.devices.writeprocimg()

            # Warten
            self._evt_exit.wait(self.refresh)


if __name__ == "__main__":
    root = MyDriver()
    root.run()
Und nun kommt logiCAD ins Spiel - Und da brauche ich mal Hilfe :D

Wir haben die exportierte Datei aus piCtory nach der Anleitung von Kunbus in logiCAD eingefügt, starten das Programm und erhalten die erwarteten Werte!
Screenshot_20170319_171430_klein.png
Screenshot_20170319_171430_klein.png (132.63 KiB) Viewed 4195 times
Es gibt doch hier im Forum sicher Spezis, die in logiCAD diese Bytes jetzt in Integer-Werte umwandeln können, oder? Wäre echt dankbar für Hilfe dabei :D

Gruß, Sven!
Last edited by RevPiModIO on 20 Mar 2017, 08:03, edited 2 times in total.
python3-RevPiModIO - https://revpimodio.org/ || Der RevPi ist das Beste, was passieren konnte!
User avatar
volker
Posts: 1046
Joined: 09 Nov 2016, 15:41
Answers: 1

Re: RevPiModIODriver - Virtuelle Devices von piCtory mit Daten füttern für logiCAD

Post by volker »

Hallo Sven,
das ist nicht wirklich kompliziert: Du musst einfach an dem Offset einen anderen Typ statt Byte deklarieren. Niemand zwingt Dich ja, die Exportdatei 1:1 in logi.cad3 zu verwenden.
Wir werden sehr bald auch einen RAP-Editor zusammenbauen, mit dem Du dann ein wneig einfacher eigene Adapter für ÜiCtory definieren kannst, die nicht nur aus Bytes bestehen. Dann klappt wieder der direkte Import. Es muss natürlich der korrekte Endian (HB oder LB first) verwendet werden. In logi.cad liegt das LB immer auf der niedrigeren Adresse.
Unser RevPi Motto: Don't just claim it - make it!
User avatar
RevPiModIO
KUNBUS
Posts: 322
Joined: 20 Jan 2017, 08:44
Answers: 0
Contact:

Re: RevPiModIODriver - Virtuelle Devices von piCtory mit Daten füttern für logiCAD

Post by RevPiModIO »

Danke Volker! Klappt perfekt! Nun habe ich die Werte auch genau ich ich sie im Python Programm übergebe in logiCAD!

Timestamp in Sekunden = Input_1_i09
root mount Belegung % voll = Input_5_i09
CPU Temperatur Centigrad = Input_6_i09
Screenshot_20170320_080333_klein.png
Screenshot_20170320_080333_klein.png (120.21 KiB) Viewed 4186 times
Gruß, Sven
python3-RevPiModIO - https://revpimodio.org/ || Der RevPi ist das Beste, was passieren konnte!
Post Reply