#!/usr/bin/env python3 import os import sys import pygame import paho.mqtt.client as mqtt import random class ScrollingTextDisplay: def __init__(self, width: int, height: int): pygame.init() self.width = width self.height = height self.screen = pygame.Surface((width, height)) self.clock = pygame.time.Clock() # Liste der Standardtexte self.default_texts = [ "Text per MQTT an: mqtt.chaospott.de Topic: test/topic ", # Hardcodierte IP-Adresse "Willkommen beim MQTT-Display!", "Aktuelle Nachrichten hier empfangen.", "MQTT-Server verbindet...", "Textnachricht anzeigen...", ] self.error_text = "MQTT-Server nicht erreichbar!" self.text = self.get_random_default_text() # Zufälligen Standardtext auswählen self.text_x = width # Schriftart 'PressStart2P-Regular' aus dem Verzeichnis 'apps' laden self.font = pygame.font.Font("PressStart2P-Regular.ttf", 16) # Schriftgröße anpassen # Fest codierte MQTT-Einstellungen self.mqtt_broker = "mqtt.chaospott.de" # Beispiel IP-Adresse des MQTT-Brokers self.topic = "test/topic" # Beispiel Topic self.mqtt_client = mqtt.Client() self.mqtt_client.on_connect = self.on_connect self.mqtt_client.on_message = self.on_message self.mqtt_client.on_disconnect = self.on_disconnect # Versuche die Verbindung aufzubauen self.connect_to_mqtt() # Zähler für die angezeigte Nachricht self.message_display_count = 0 def get_random_default_text(self): """Wählt zufällig einen Standardtext aus der Liste aus.""" return random.choice(self.default_texts) def connect_to_mqtt(self): try: self.mqtt_client.connect(self.mqtt_broker) self.mqtt_client.loop_start() except Exception as e: print(f"Verbindungsfehler zu MQTT-Server: {e}") self.text = self.error_text # Setze Fehlertext für die Anzeige self.text_x = self.width # Text von rechts starten def on_connect(self, client, userdata, flags, rc): if rc == 0: client.subscribe(self.topic) self.text = self.get_random_default_text() # Setze einen zufälligen Standardtext else: print(f"Fehler beim Verbinden mit MQTT: Code {rc}") self.text = self.error_text def on_disconnect(self, client, userdata, rc): if rc != 0: print("Verbindung zum MQTT-Server verloren. Erneuter Verbindungsversuch...") self.text = self.error_text self.text_x = self.width # Fehlertext von rechts starten # Erneut die Verbindung aufbauen self.connect_to_mqtt() def on_message(self, client, userdata, msg): self.text = msg.payload.decode("utf-8") if msg.payload.decode("utf-8") else self.get_random_default_text() self.text_x = self.width # Text von rechts starten self.message_display_count = 3 # Setze den Zähler auf 3 def draw_text(self): self.screen.fill((0, 0, 0)) # Bildschirm leeren text_surface = self.font.render(self.text, True, (255, 255, 255)) text_width = text_surface.get_width() # Breite des Textes ermitteln text_y = (self.height - text_surface.get_height()) // 2 # Y-Position zentrieren self.screen.blit(text_surface, (self.text_x, text_y)) # Text zentriert zeichnen def display(self): while True: text_surface = self.font.render(self.text, True, (255, 255, 255)) text_width = text_surface.get_width() # Breite des Textes ermitteln self.text_x -= 1 # Text nach links verschieben if self.text_x < -text_width: # Wenn der Text komplett verschwunden ist self.text_x = self.width # Text von rechts neu starten # Falls der Text leer ist, setze Standardtext oder Fehlertext if self.message_display_count > 0: self.message_display_count -= 1 else: self.text = self.get_random_default_text() # Setze zurück auf zufälligen Standardtext self.draw_text() os.write(1, pygame.image.tostring(self.screen, "RGB")) self.clock.tick(30) if __name__ == "__main__": Nx = int(sys.argv[1]) # Breite des Displays Ny = int(sys.argv[2]) # Höhe des Displays display = ScrollingTextDisplay(Nx, Ny) display.display()