User Tools

Site Tools


digint:user-de

Benutzer-Zentralen-Bibliothek

InhaltZentralenBenutzer-Bibliotheken


Eine Benutzer-Zentralen-Bibliothek muss mit einem MQTT-Broker verbunden sein, um Befehle zu erhalten und Feld-Ereignisse zu veröffentlichen.
Mit dieser Methode ist die Zentralen-Bibliothek von den Rocrail-Quellen vollständig unabhängig und kann auch mit anderer Software verwendet werden.
Die Programmiersprache der Wahl ist auch unabhängig, solange eine Verbindung zu einem MQTT-Broker hergestellt werden kann.

Python-Beispiel

Das Script als mqtt-cs.py speichern.

import time
import os
import xml.etree.ElementTree as ET
import paho.mqtt.client as paho #https://pypi.org/project/paho-mqtt/1.0/
broker="nasRR" #this is the IP of the computer on which the MQTT broker is installed.
 
def onSys(node):
  if node.get('cmd') == "shutdown":
    print("SYSTEM SHUTDOWN... Clean up and exit...")
    #os._exit(0)
 
def onOutput(node):
  print("set output " + node.get('addr') + ":" + node.get('port') + " to " + node.get('cmd') )
 
def onClock(node):
  print(node.get('cmd') + " clock to " + node.get('hour') + ":" + node.get('minute') )
 
#define callback
def on_message(client, userdata, message):
  #evaluate the Rocrail command
  print("broker message = " + str(message.payload.decode("utf-8")))
  node = ET.fromstring(str(message.payload.decode("utf-8")))
  if node.tag == "sys":
    onSys(node)
  if node.tag == "co":
    onOutput(node)
  if node.tag == "clock":
    onClock(node)
 
#create client object 
client= paho.Client("client-001")
 
#Bind function to callback
client.on_message=on_message
 
print("connecting to broker ",broker)
client.connect(broker)#connect
 
#start loop to process received messages
client.loop_start()
 
print("subscribing ")
client.subscribe("rocrail/service/command")
 
while 1:
  #evaluate the field sensors and publish
  addr  = "4711"
  state = "true"
  client.publish("rocrail/service/field","<fb iid=\"python\" addr=\""+addr+"\" state=\""+state+"\"/>")
  time.sleep(5)
 
client.disconnect()
client.loop_stop()

Es gibt Python-Module, mit denen die eingehenden XML-Rocrail-Befehle im RCP-Format ausgewertet werden können.
Die Befehle sind relativ einfach strukturiert und können auch mit Standard-Textfunktionen ausgewertet werden.
Wenn das Attribut iid (Schnittstellen-Kennung) in einem Befehl enthalten ist, muss geprüft werden, ob der Befehl von dieser Benutzer-Bibliothek verarbeitet werden soll.

Sitzung

Python

Das Script mit python mqtt-cs.py starten.

('connecting to broker ', 'nasRR')
subscribing 
('command =', '<clock divider="1" hour="10" minute="44" wday="0" mday="21" month="4" year="2019" time="1555836244" temp="20" bri="255" cmd="sync"/>\n')
('command =', '<sys cmd="go" informall="true"/>\n')

Rocrail

20190421.104604.509 r9999I clocktic OClntCon 0606 mqtt publish to [rocrail/service/command]:[<clock divider="1" hour="10" minute="46"]

20190421.104828.200 r9999I mqttread OClntCon 0799 broker published [rocrail/service/field]:[<fb iid="python" addr="4711" state="true"/>]
20190421.104828.201 r9999a mqttread OModel   5124 trying to match sensor event: [python] 0:4711 uidname=[] state=1 code=
20190421.104828.201 r9999a mqttread OModel   5160 sensor key: 0_4711_python_
20190421.104828.201 r9999a mqttread OModel   5180 unregistered sensor event: [python] 0:4711 uidname=[]

Konfiguration von Benutzer-Bibliotheken

Die Konfiguration von Benutzer-Bibliotheken wird durch Rocrail nicht unterstützt und muss extern erfolgen. Zum Beispiel mit einer .conf-Text-Datei.

digint/user-de.txt · Last modified: 2019/06/04 23:38 by rainerk