RevPiModIODriver - Virtuelle Devices von piCtory mit Daten füttern für logiCAD
Posted: 19 Mar 2017, 21:54
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. 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:
Und nun kommt logiCAD ins Spiel - Und da brauche ich mal Hilfe
Wir haben die exportierte Datei aus piCtory nach der Anleitung von Kunbus in logiCAD eingefügt, starten das Programm und erhalten die erwarteten Werte! 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
Gruß, Sven!
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. 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()
Wir haben die exportierte Datei aus piCtory nach der Anleitung von Kunbus in logiCAD eingefügt, starten das Programm und erhalten die erwarteten Werte! 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
Gruß, Sven!