pixelserver2/apps/textscroll.py
2024-10-28 18:10:03 +01:00

112 lines
4.5 KiB
Python
Executable File

#!/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()