Socketio emit Problem

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
timosie29
User
Beiträge: 2
Registriert: Donnerstag 12. Oktober 2023, 11:54

Guten Nachmittag,

ich arbeite seit ein paar Tagen an einem Problem, das ich bisher nicht lösen konnte. Hier ist mein Ziel:

Ich möchte einen Webserver auf meinem Raspberry Pi betreiben und dann lokal darauf zugreifen. Die Verbindung zwischen Server und Client soll über WebSockets erfolgen, und dafür verwende ich die Bibliothek Flask-SocketIO. Alles funktioniert problemlos, bis ich den Taster betätige, den ich mit meinem Raspberry Pi verbunden habe. Dieser Taster löst eine Funktion aus, und diese Funktion wird auch ausgeführt. Nach dieser Ausführung wird jedoch keine Kommunikation mehr zwischen Server und Client übertragen.

Können Sie mir bei diesem Problem helfen?
hier ist noch der html und der python code

Code: Alles auswählen

<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Slider Example</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.3.2/socket.io.js"></script>
  

    <style>
.range-slider {
    -webkit-appearance: none;
    width: 100%;
    height: 8px;
    border-radius: 10px;  
    background: #0082f3;
    outline: none;
    -webkit-transition: .2s;
    transition: opacity .2s;
    cursor: pointer;
    margin-top: 50px;
  }
  
  .range-slider::-webkit-slider-thumb {
    -webkit-appearance: none;
    appearance: none;
    width: 30px;
    height: 30px;
    border-radius: 50%; 
    background: #ff9900;
    cursor: pointer;
  }
  
  .range-slider::-moz-range-thumb {
    width: 30px;
    height: 30px;
    border-radius: 50%;
    background: #ff9900;
    cursor: pointer;
  }

.slider-container{
  width: 50%;
}
    </style>
  

    
    
</head>
<body>
    <h1>Slider Example</h1>
    
    <div class="slider-container">
        <input class="range-slider"  type="range" id="slider0" min="0" max="100" value="50">
        <input class="range-slider"  type="range" id="slider1" min="0" max="100" value="50">                
        <input class="range-slider"  type="range" id="slider2"  min="0" max="100" value="50">           
        <input class="range-slider"  type="range" id="slider3"  min="0" max="100" value="50">           
        <input class="range-slider"  type="range" id="slider4"  min="0" max="100" value="50">           
        <input class="range-slider"  type="range" id="slider5"  min="0" max="100" value="50">           
    </div>
    

    
    <script>
    const socket = io.connect('http://localhost:3000');
     
    socket.on('connect',() => {
        socket.emit('Client Verbunden', 'connect');
        console.log("Funktioniert")
        slider_values = {}
        value = slider_values
    });

    var slider0 = document.getElementById('slider0');
    var slider1 = document.getElementById('slider1');
    var slider2 = document.getElementById('slider2');    
    var slider3 = document.getElementById('slider3');
    var slider4 = document.getElementById('slider4');
    var slider5 = document.getElementById('slider5');

    slider0.addEventListener('input', () => {
        var value = slider0.value;
        socket.emit('slider_value', {id: 'slider0', value: value});
    });

    slider1.addEventListener('input', () => {
        var value = slider1.value;
        socket.emit('slider_value', {id: 'slider1', value: value})
    });

    slider2.addEventListener('input', () => {
        var value = slider2.value;
        socket.emit('slider_value', {id: 'slider2', value: value})
    });

    slider3.addEventListener('input', () => {
        var value = slider3.value;
        socket.emit('slider_value', {id: 'slider3', value: value})
    });

    slider4.addEventListener('input', () => {
        var value = slider4.value;
        socket.emit('slider_value', {id: 'slider4', value: value})
        
    });

    slider5.addEventListener('input', () => {
        var value = slider5.value;
        socket.emit('slider_value', {id: 'slider5', value: value})
    });
    // Werte der Slider an den Server schiken


    // function für das Updaten der Slider werte
    
    function setSliderValues(values) {
        for (var id in values){
            document.getElementById(id).value = values[id];
        }
    }

    // slider werden gesetzt wen taster gedrück wird
    socket.on("daten", (values)  => {
        setSliderValues(values);
        console.log("funktioniert bis hier")
       
        
    });

</script>    
</body>
</html>
 

Code: Alles auswählen

from flask import Flask, render_template
from flask_socketio import SocketIO, send, emit
import eventlet
import RPi.GPIO as GPIO



# Hier wird der code geladen der auf dem Server laufen wird
app = Flask(__name__, template_folder='/home/pi/Desktop/Test_Komplett/templates')
socketio = SocketIO(app)


# Pin bei dem  der Taster angehängt ist
BUTTON_PIN = 22

# Hier werden die Variabeln gesetzt
slider_values = {}

# Initialisieren der GPIO Bibliothek
GPIO.setmode(GPIO.BCM)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)


@app.route('/')
def index():
    return render_template('index.html')


# wird ausgeführt wen vom Client die Nachricht connect kommt
@socketio.on('connect')
def connection():
    print("Client Verbunden")

# bekommt die Werte der slider wen sie
@socketio.on('slider_value')
def handle_slider_value(data):
    #Daten von slidern empfangen
    slider_id = data['id']
    slider_value = data['value']
    # Werte der Slider speichern
    slider_values[slider_id] = slider_value
    print(slider_values)
    



def ping(channel):
    print("Taster wurde gedrückt")
    slider_values['slider1'] = 20
    slider_values['slider2'] = 30
    slider_values['slider3'] = 40
    slider_values['slider4'] = 50
    slider_values['slider5'] = 60
    print(slider_values)
    socketio.emit('daten', slider_values)



# Überwachung des Tasters
GPIO.add_event_detect(BUTTON_PIN, GPIO.RISING, callback=ping, bouncetime=200)

if __name__ == '__main__':
    socketio.run(app, host='0.0.0.0', port=3000)

GPIO.cleanup()

Sirius3
User
Beiträge: 18054
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann wird der Callback von GPIO wohl nicht sehr gut mit socket io zusammenarbeiten.
In einem Callback sollte sowieso möglichst wenig Code stehen. Am besten schreibst du dort nur in eine Queue, dass ein Knopf gedrückt worden ist.
Mit start_background_task startest Du eine Funktion, die kontinuierlich auf die Queue horcht, und dann socketio anspricht.
timosie29
User
Beiträge: 2
Registriert: Donnerstag 12. Oktober 2023, 11:54

Okay, danke für die Antwort. Das werde ich mal ausprobieren. 👍🏻
Antworten