112 lines
4.5 KiB
Python
112 lines
4.5 KiB
Python
|
#!/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()
|
||
|
|