Peter Heydt Posted September 2 Posted September 2 Gibt es eine Möglichkeit einen x-beliebigen Textstring aus einem Shelly auf eine Broadcast Adresse xxx.xxx.xxx.255 und angegebenem Port zu schicken? Ich habe ein Steuerungssystem das komplett mit vielen Aktoren und Sensoren über udp Broadcasting läuft. Es befindet sich in einem anderen IP Bereich als das Shelly-Netzwerk. Es wird nicht per MQTT gesteuert! Ich möchte nun Aktoren in diesem Steuerungssystem über Shellys ansteuern. Das ganze Broadcasting muss aber nicht mitgelesen werden. Kann man das ggf. über Shelly-Script machen? Für eine qualifizierte Antwort wäre ich sehr dankbar! 1 Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish
shellymelly Posted September 6 Posted September 6 (edited) Falls ich dich richtig verstanden habe, willst du ein UDP DatagramPacket an eine IP-Adresse senden, ein Aktor der die Nachricht versteht soll dann eine Aktion durchführen. Wenn das so ist, dann würde ich, naiverweise so vorgehen. Shelly Geräte können mit Hilfe von Webhooks URLs aufrufen. Also würde ich einen einfachen Webserver (alsGateway/Proxy) schreiben der diese URLs entgegennimmt und dann entsprechende Daten an eine IP Adresse über UDP sofort versendet. Soweit ich weiss, man könnte auch nginx dafür konfigurieren, aber der Konfigurationsärger lohnt sich kaum, denn so ein Webserver ist zügig implementiert. Mit java, python oder Go sind es "nur ein Paar" Zeilen code. import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpExchange; import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.DatagramSocket; import java.net.DatagramPacket; import java.nio.charset.StandardCharsets; public class HttpToUdpForwarder { public static void main(String[] args) throws IOException { // Create an HTTP server listening on port 8080 HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0); server.createContext("/forward", new HttpHandler() { @Override public void handle(HttpExchange exchange) throws IOException { if ("POST".equals(exchange.getRequestMethod())) { // Read the request body byte[] requestBody = exchange.getRequestBody().readAllBytes(); String requestData = new String(requestBody, StandardCharsets.UTF_8); // Forward the request data to the UDP server forwardToUdpServer(requestData, "127.0.0.1", 9999); // Send a response back to the client String response = "Request forwarded to UDP server"; exchange.sendResponseHeaders(200, response.getBytes().length); OutputStream os = exchange.getResponseBody(); os.write(response.getBytes()); os.close(); } else { exchange.sendResponseHeaders(405, -1); // Method Not Allowed } } }); // Start the server server.setExecutor(null); server.start(); System.out.println("HTTP server started on port 8080"); } private static void forwardToUdpServer(String data, String udpHost, int udpPort) { try (DatagramSocket socket = new DatagramSocket()) { byte[] buffer = data.getBytes(StandardCharsets.UTF_8); InetSocketAddress address = new InetSocketAddress(udpHost, udpPort); DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address); socket.send(packet); System.out.println("Data forwarded to UDP server: " + data); } catch (IOException e) { e.printStackTrace(); } } } Edited September 6 by shellymelly Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish
Peter Heydt Posted October 2 Author Posted October 2 Hallo shellymelly, danke für die Antwort und für das Snippet. Ja du hattest richtig verstanden, ich habe ein System mit einigen Arduino's die alle gemeinsam auf ein UDP Broadcast hören. Das Modul das mit der Nachricht etwas anfangen kann reagiert dann darauf. An die Möglichkeit mit einem zwischengeschalteten "Übersetzer" hatte ich auch schon gedacht. Es wäre halt schön gewesen, wenn ich so ein "Telegramm" direkt aus dem Shelly hätte schicken können. Trotzdem vielen Dank. Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish
energy-geek Posted October 4 Posted October 4 Ich suche übrigens auch nach einer Möglichkeit direkt Datagramme per UDP vom Shelly aus zu versenden. Bisher leider ohne Erfolg. Mich wundert etwas, dass ich noch keine klare Absage gesehen habe, im Sinne von es geht nicht. Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.