Willkommen im Loxone Community Forum. Um alle Funktionen nutzen und sehen zu können, registriere dich bitte zuerst. Dies gilt auch für das herunterladen von Dateien.
Dieser Bereich ist für fertige Lösungen gedacht. Nutze bitte für Diskussionen die anderen Bereiche.
hätte jemand ein knappes howto für mich wie man einen beliebigen wert einer variable per udp an den miniserver sendet?
hintergrund - gpio status in der visu anzeigen, da diese ein Relais-board steuern welches wiederum für die bewässerung verantwortlich ist (das alles funkt schon per webseite und buttons)
In Loxone legst Du einen Virtuellen UDP Eingang an.
In die Senderadresse kommt die IP Adresse von Deinem Raspberry.
Im UDP Empfangsport kommt 1234 (Kann natürlich auch ein anderer sein, muss halt der gleiche sein wie im Python)
Under dem Virtuellen UDP Eingang legst Du einen Virtuellen UDP Eingang Befehl an.
Als Befehlserkennung schreibst Du: Test=\v (somit wird bei einem UDP-Empfang nach dem Text "Test=" gesucht und der Wert dahinter, also 245 angezeigt)
Das wars auch schon.
Raspberry
sudo python test.py
sollte nun "Test=245.7" senden
Zur Kontrolle dienen die print Zeilen in test.py
UDP target IP: xxx.xxx.xxx.xxx
UDP target port: 1234
message: Test=245.7
Loxone
Im UDP Monitor von Loxone sollte dies dann angezeigt werden, sofern dieser vorher schon eingeschaltet war.
Wenn der Virtuelle UDP Eingang Befehl visualisiert wird, sollte dort jetzt die Zahl 245.7 zu sehen sein.
An den Eingang kann natürlich auch was angeschlossen werden, so zum Beispiel ein Virtueller Status.
Edit: Ich war da scheinbar wieder einmal zu langsam
Hallo,
ich habe für mich eine etwas mächtigere lösung im einsatz... und zwar hab ich eine bidirektionale multithreaded struktur in meinen skripts. der vorteil ist, dass das sehr stabil und zuverlässig läuft, auch wenn z.B. mal eine aktion etc... etwas länger dauert.
Code:
#!/usr/bin/python
# script to process and transmit udp packets from [XXXPI] to loxone
# running on a raspberry pi
# by bernhard@daenzer.net
# feel free to reuse the code
# standard library modules used in code
import sys
import time
import datetime
import argparse
import socket
from Queue import Queue
import threading
import SocketServer
import RPi.GPIO as GPIO
print 'script starting'
BUTTON = 22 # GPIO
GPIO.setmode(GPIO.BCM)
#Alerts OFF
GPIO.setwarnings(False)
GPIO.setup(BUTTON, GPIO.IN)
# set script basedir
basedir = "/home/pi/"
# set up parser with command summary
parser = argparse.ArgumentParser(
description='udp gateway')
# set up arguments with associated help and defaults
parser.add_argument('-s',
dest='lox_ip',
help='lox IP address',
default='192.168.1.2')
parser.add_argument('-u',
dest='lox_port',
help='lox UDP port',
default='7777')
parser.add_argument('-d',
dest='debug',
help='debug 1 or 0',
default='0')
# process the arguments
args=parser.parse_args()
# turn the arguments into numbers
debug=int(args.debug)
lox_ip=str(args.lox_ip)
#
#for testing only, using the tool "Packet Sender" www.packetsender.com on laptop for debugging, comment out on live pi
#
#lox_ip='192.168.1.10'
#
#
#
lox_port=int(args.lox_port)
remoteHost = lox_ip
remotePort = lox_port
# tell the user what is happening if script is run in terminal/debug
if debug == 1:
print "script initializing...",
print "UDP Destination"
print " IP: "+str(lox_ip)
print " Port: "+str(lox_port),
# open the udp socket
s_udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s_udp.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# Set some options to make it multicast-friendly
s_udp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
s_udp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
except AttributeError:
pass # Some systems don't support SO_REUSEPORT
s_udp.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 20)
s_udp.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)
# Set some more multicast options
intf = socket.gethostbyname(socket.gethostname())
s_udp.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(intf))
#function that is called from code to trigger a message to lox
def s2l(s_msg):
#add to lox udp output queue
#do any format conversions here
q_out.put(s_msg)
return True
#new multhithread function that only handles the UDP msg queue outbound to loxone
def s2l_worker(q_out):
while True:
try:
if q_out.empty() == False:
s_msg = q_out.get()
#output s_msg over the loxone socket
s_udp.sendto(s_msg, (lox_ip, int(lox_port)))
time.sleep(0.01)
q_out.task_done()
except:
#except KeyboardInterrupt:
exit
#start lox outbound queue out worker thread
q_out = Queue(maxsize=0)
script2lox = threading.Thread(target=s2l_worker, args=(q_out,))
script2lox.setDaemon(True)
script2lox.start()
#init variables of global scope
init=1
q_l_p = Queue(maxsize=0)
#new multhithread function that only processes the inbound messages from loxone
def procl_worker(q_l_p):
while True:
try:
Lox_data = q_l_p.get()
except Empty:
Lox_data = ''
if Lox_data:
if debug ==1:
print "procl_worker Lox_data: "+str(Lox_data)
l2s(Lox_data)
Lox_data = ""
q_l_p.task_done()
#start processing from loxone
proclox = threading.Thread(target=procl_worker, args=(q_l_p,))
proclox.setDaemon(True)
proclox.start()
#new multhithread function that only handles the udp inbound message reception from loxone
def recl_worker(q_l_in):
buf_size = 1024
# Create the socket
s2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Set some options to make it multicast-friendly
s2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
s2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
except AttributeError:
pass # Some systems don't support SO_REUSEPORT
s2.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 20)
s2.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)
# Bind to the port
s2.bind(('', lox_port))
# Set some more multicast options
intf = socket.gethostbyname(socket.gethostname())
s2.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(intf))
while True:
try:
L_data, L_sender_addr = s2.recvfrom(buf_size)
if L_data:
q_l_p.put(L_data)
except:
exit
# Receive the data, then unregister multicast receive membership, then close the port
s2.close()
#start reception handler thread from loxone
q_l_in = Queue(maxsize=0)
reclox = threading.Thread(target=recl_worker, args=(q_l_in,))
reclox.setDaemon(True)
reclox.start()
#main program
#function that is called upon gpio interrupt
def system_action(BUTTON):
print('Button press = negative edge detected on channel %s'%BUTTON)
button_press_timer = 0
while True:
if (GPIO.input(BUTTON) == False) : # while button is still pressed down
button_press_timer += 1 # keep counting until button is released
else: # button is released, figure out for how long
if (button_press_timer > 5) : # pressed for > 5 seconds
print "long press > 5", button_press_timer
#sample output to lox
s2l("BUTTON LONG PRESS"
elif (button_press_timer > 1) : # press for > 1 < 5 seconds
print "short press > 1 < 5", button_press_timer
#sample output to lox
s2l("BUTTON SHORT PRESS"
button_press_timer = 0
sleep(1) # 1 sec delay so we can count seconds
# setup the thread, detect a falling edge on gpio "BUTTON" and debounce it with 200mSec
GPIO.add_event_detect(BUTTON, GPIO.FALLING, callback=system_action, bouncetime=200)
# assume this is the main code...
try:
while True:
# do whatever
# while "waiting" for falling edge on BUTTON
sleep (2)
except KeyboardInterrupt:
GPIO.cleanup() # clean up GPIO on CTRL+C exit
GPIO.cleanup() # clean up GPIO on normal exit
Hier ein von mir eingesetztes Script, das auf einem Raspberry Pi mit Musicbox ermöglicht, die Lautstärke und den Track zu wechseln, evtl hilft es ja jemandem weiter.
Es werden hier aber nur Werte vom Miniserver auf Port 9900 empfangen.
Senden ist aber nicht schwierig, hab ich mit Code-Beispielen aus dem Internet auch schon geschafft
LG
Stefan
Ps zum starten, die Endung in .py ändern (das Forum nimmt keine .py Dateien an)
Möchte bei diesem Thema noch um eine Erweiterung nachfragen.
Ich habe auf dem Loxberry MPC installiert inkl. Webradio. Für die Senderauswahl schicke ich jeweils PHP-Skripte ans Loxberry. Ich würde nun gerne die aktuelle Lautstärke von MPC (wie der Zustand der GPIO, das funktioniert bei mir) per UDP (Oder wenn es eine bessere Methode gibt?) an den MS senden. Habe im Netz bereits danch gesucht, bin aber nicht fündig geworden. Kann mit hier jemand auf die Sprünge helfen, wie ich das erledigen kann?
Wir verarbeiten personenbezogene Daten über Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen, Werbung zu personalisieren und Websiteaktivitäten zu analysieren. Wir können bestimmte Informationen über unsere Nutzer mit unseren Werbe- und Analysepartnern teilen. Weitere Einzelheiten finden Sie in unserer Datenschutzrichtlinie.
Wenn Sie unten auf "Einverstanden" klicken, stimmen Sie unserer Datenschutzrichtlinie und unseren Datenverarbeitungs- und Cookie-Praktiken wie dort beschrieben zu. Sie erkennen außerdem an, dass dieses Forum möglicherweise außerhalb Ihres Landes gehostet wird und Sie der Erhebung, Speicherung und Verarbeitung Ihrer Daten in dem Land, in dem dieses Forum gehostet wird, zustimmen.
Kommentar