Python/SPS-Kommunikation mit FHEM

Begonnen von StefanMunsch, 19 Mai 2017, 23:32:17

Vorheriges Thema - Nächstes Thema

StefanMunsch

Hallo Forengemeinde,
in Sachen FHEM bin ich noch ein Anfänger. In einige Sachen habe ich mich zwar eingelesen und Anregungen für spätere Modifikationen holen können, aber ein paar grundsätzliche Fragen sind leider noch unbeantwortet geblieben.

Hier mal ein paar Eckdaten zu meiner Anwendung:
Meine Hausautomation (einige Lichter, alle Rollläden, Temperatursensoren und Heizungstellantriebe) läuft seit mehreren Jahren schon über eine SPS. Da ich jetzt mehr Zeit habe, möchte ich eine Visualisierung mit FHEM realisieren. FHEM läuft jetzt mal auf einem Raspberry Pi 3, dort sind auch Python-Skripte, die mit der SPS kommunizieren.
Für ein Licht habe ich jetzt in der Konfiguration folgendes eingefügt:

define VI_KuecheLicht dummy
attr VI_KuecheLicht alias Küchenlicht
attr VI_KuecheLicht group Licht
attr VI_KuecheLicht room Küche
attr VI_KuecheLicht webCmd toggle
define VI_KuecheLicht_toggle notify VI_KuecheLicht:toggle {system('python /home/pi/writeADSCommand.py VI_KuecheLicht 1 &');;}

Dadurch wird an die SPS in die entsprechende Merkervariable eine 1 geschrieben und der entsprechende Ausgang invertiert (wie ein Stromstoßrelais). Die Merkervariable wird dann von der SPS wieder auf 0 gesetzt, so dass für einen Zustandswechsel immer nur eine 1 an die SPS geschickt werden muss.

Die Rückgabe erfolgt z. B. mit folgender Python-Funktion:
# Funktion in der Python-Datei, die den Wert der Variablen per Telent an FHEM sendet:
def sendTelnetData(varname, wert):
    cmd = 'echo "setreading '+str(varname)+' state '+str(wert)+';quit\n" | nc '+ telnet_ip+' ' + telnet_port
    subprocess.call(cmd, shell=True)


Für den Anfang habe ich folgende Fragen:
1. Als Status eines SPS-Ausgangs erhalte ich in FHEM mit obiger Python-Funktion 0 (=AUS) bzw. 1 (=AN). Wie kann ich erreichen, dass das entsprechende Icon (z. B. Glühbirne) angezeigt wird, und in der WEB-Ansicht statt "toggle" der entsprechende Befehl, der beim "Drücken" an der SPS ausgeführt werden würde (z. B. "Aus", wenn die Lampe bereits an ist) angezeigt wird.

2. Ich muss die Daten "manuell" holen, d. h. Polling betreiben indem ich ein Python-Script regelmäßig, z. B. jede Sekunde, aufrufe. Um den Traffic geringer zu halten, möchte ich dieses häufige Polling nur durchführen, wenn FHEM auf irgend einem Gerät angezeigt wird. Gibt´s da vielleicht ein Attribut vom WEB-Device, oder wie lässt sich das realisieren? (Ansonsten würde ich das Script z. B. nur alle 5 Minuten aufrufen, das ginge ja über das at-Kommando).

Ich hoffe meine Fragen sind verständlich rübergekommen, für Antworten bin ich sehr dankbar.

LG Stefan

KernSani

Hi,


Frage 1 ist einfach zu beantworten:
Entweder du nutzt das Attribut eventMap, um 1 auf on und 0 auf off zu mappen - dann macht FHEM automatisch die Icons, oder
Du nutzt das Attribut devStateIcon und definierst dir pro state ein icon (dazu gibt es in der Detailansicht unten links auch einen Link "Extend devStateIcon")

Frage 2 ist etwas komplexer, es gibt FHEM-interne Funktionen, mit denen du das rausfinden könntest. Ich würde aber beim "at" bleiben. Ich weiß ja nicht, wie deine Pläne sind, aber vielleicht willst du ja in Zukunft mal auf events in FHEM reagieren, dann wäre es gut, wenn diese Events auch kommen würden, wenn gerade niemand auf die Oberfläche schaut...  Eine andere Möglichkeit wäre, dass du aus einem python script den status in FHEM z.B. über einen telnet Befehl änderst (falls das in deinem Fall möglich ist).

RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Thorsten Pferdekaemper

Hi,
was ist denn das für eine SPS? Ich glaube, es gibt schon Leute, die bestimmte SPSse an FHEM drangebastelt haben. Siehe z.B. hier:
https://wiki.fhem.de/wiki/S7
Gruß,
   Thorsten
FUIP

StefanMunsch

Hallo Zusammen,
vielen Dank für die Antworten.

@Thorsten:
Es handelt sich um eine Beckhoff-SPS, die schon seit ein paar Jahren läuft. Dort läuft auch eine spartanische Web-Visu mit Javascript. Die anzupassen ist aber ziemlich kompliziert, deshalb der Wunsch nach FHEM. Ursprünglich wollte ich für die ADS-Kommunikation mit FHEM eine Python-ADS-Bibliothek nutzen. Das hat aber irgendwie nicht funktioniert. Dann habe ich mir mit Wireshark den Datenverkehr meiner bisherigen WEB-Visu genauer angeschaut und bilde ihn jetzt mit meinen Python-Skripten nach. Für Interessierte: Beim Lesen von der SPS wird dem Kommande nur die Indexgruppe und der Byteoffset sowie die zu lesende Länge mitgegeben. Dann kommen von der SPS die Base64-Decodierten Daten zurück.

@ KernSani:
Vielen Dank für deine Vorschläge, werden von mir ausprobiert.
Wegen dem Polling: Natürlich würde ich so eine Art "Grund-Polling", z. B. alle 5 Minuten mit einem "at" realisieren, damit grundsätzliche Automatismen funktionieren. Für die WEB-Ansicht müsste dass dann aber z. B. sekündlich erfolgen, damit die Zustände (Rollladenpositionen, Lichter, Temperaturen, etc.) quasi Live sind. Ich gehe aber davon aus, dass die meiste Zeit niemand die Web-Oberfläche auf hat und eine niedrigere Polling-Rate reichen würde.

Da stehe ich momentan noch auf dem Schlauch wie ich das realisieren kann.   

LG Stefan

Thorsten Pferdekaemper

Hi,
lass doch Dein Python-Skript als Service endlos laufen. ...bzw. starte es einmal per FHEM im Hintergrund (!) und lass es dann in einer Endlosschleife jede Sekunde (oder so) Deine SPS auslesen. Den FHEM-Aufruf ("setreading ...") machst Du aber nur, wenn sich etwas geändert hat. Dann verhält sich das ganze wie ein "normales" Gerät in FHEM. D.h. Du bekommst in FHEMWEB einen sofortigen Update, aber trotzdem passiert nur dann was, wenn es auch muss.
Gruß,
   Thorsten
FUIP