Infodisplay: Unterschied zwischen den Versionen

Aus Stratum 0
Wechseln zu:Navigation, Suche
K (umstortiert)
Zeile 1: Zeile 1:
 
{{Projekt
 
{{Projekt
|kontakt=Kasa, larsan
+
|kontakt=drc
 
|status=aktiv
 
|status=aktiv
 
|beschreibung=S0 Infodisplay
 
|beschreibung=S0 Infodisplay
Zeile 6: Zeile 6:
 
|bildbeschreibung= Das Infodisplay im Flur des Spaces
 
|bildbeschreibung= Das Infodisplay im Flur des Spaces
 
|interessenten=
 
|interessenten=
|source=https://gitli.stratum0.org/kasalehlia/s0infodisplay/
+
|source=https://gitli.stratum0.org/drc/python-infodisplay
 
|lizenz=
 
|lizenz=
 
|download=
 
|download=
Zeile 13: Zeile 13:
 
[[Datei:Bewegungsmelder am Infodisplay-Pi.jpg|thumb|Bewegungsmelder]]
 
[[Datei:Bewegungsmelder am Infodisplay-Pi.jpg|thumb|Bewegungsmelder]]
  
Auf dem Serverschrank steht ein großer Full HD Fernseher, daran wurde eine Pi angeschlossen und ein bisschen [https://gitli.stratum0.org/kasalehlia/s0infodisplay/ Software] geschrieben. Zu guter letzt bekam der Pi einen Bewegungsmelder, sodass der Fernseher nicht 24/7 laufen muss.
+
Im Flur hängt ein großer Fernseher, der ein paar Infos anzeigt, die im Vorbeigehen interessant sein könnten, wie z.B. das Wetter draußen, die nächsten Termine im Kalender und die aktuelle CO2-Konzentration.  
  
Auf dem Infodisplay stehen relevante Informationen zur Verfügung:
+
Der Pi infodisplay.s0 am Display selbst zeigt dazu eine Webseite im Kioskmodus an. Die Webseite selbst ist auf http://ingodisplay.s0:8888/ gehostet.
* Uhrzeit und auf welche Entität der Space derzeit geöffnet ist
 
* [https://maurudor.de/ Katzenbilder]
 
* Wetter
 
* Relative und absolute ÖPNV-Abfahrtszeiten von Haltestelle ''Hamburger Straße'', sowie ''Ludwigstraße''
 
* [[Kalender]]
 
* Visualisiert Stromverbrauch und Netzwerkdinge im Spacenetz
 
* IRC-Channel
 
  
Das ganze ist derzeit auf Full-HD optimiert. Da die Software auf einer [http://infodisplay.local:8000 Webseite] basiert (im Fullscreen angezeigt, aus dem Space-Netz erreichbar), ist sie theoretisch auf mehreren Displays deploybar.
+
Das Display wird von einem Bewegungsmelder aufgeweckt.
  
== Setup ==
+
<pre>#!/usr/bin/env python3
Raspbian auf Raspberry Pi installieren. Dann:
 
  
Pakete installieren:
+
import RPi.GPIO as GPIO
sudo apt -y install git firefox-esr xserver-xorg-legacy xserver-xorg x11-xserver-utils python3-rpi.gpio python3-venv cec-utils xinit libicu-dev unattended-upgrades
+
import time
# oder auch 'firefox', je nach Verfügbarkeit
+
from subprocess import call
#
+
GPIO.setmode(GPIO.BCM)
# ggf nötig, aber vermutlich nicht mehr, da libcec aus den repos wieder läuft und nicht mehr selbst gebaut werden muss:
 
# sudo apt -y install cmake libp8-platform-dev libudev-dev
 
  
s0infodisplay macht lokal einen HTTP-Server und baut die HTML-Seite:
+
GPIO.setup(4, GPIO.IN)
git clone https://gitli.stratum0.org/kasalehlia/s0infodisplay/
+
#GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
cd s0infodisplay/
+
print("works so far")
python3 -m venv env
 
source env/bin/activate
 
pip install -r requirements.txt
 
# python3 main.py
 
  
infopoint-html startet einen Firefox im Vollbild:
+
pir = 4
cd
+
previous_state = 0
git clone https://github.com/rohieb/infopoint-html.git
+
current_state = 0
echo -e '#!/bin/sh\nexec /home/pi/infopoint-html/src/infopoint-html' | sudo tee /usr/bin/infopoint-html
 
sudo chmod +x /usr/bin/infopoint-html
 
echo 'URL="http://localhost:8000/"' | sudo tee /etc/default/infopoint-html
 
  
systemd-logind session activation für den X-Server umgehen:
+
try:
sudo dpkg-reconfigure xserver-xorg-legacy  # hier dann die dritte Option, "Anybody", auswählen
+
    while True:
 +
        time.sleep(0.1)
 +
        current_state = GPIO.input(pir)
 +
        if current_state == 1 and previous_state == 0:
 +
            print("GPIO pin %s is %s, turning screen on" % (pir, current_state))
 +
            call("echo on 0 | cec-client -s -d 1", shell=True)
 +
            previous_state = 1
 +
        elif current_state == 0 and previous_state == 1:
 +
            print("GPIO pin %s is %s, turning screen off" % (pir, current_state))
 +
            call("echo standby 0 | cec-client -s -d 1", shell=True)
 +
            previous_state = 0
 +
        time.sleep(0.01)
  
systemd-Services installieren:
+
except KeyboardInterrupt:
sudo cp s0infodisplay/s0infodisplay.service s0infodisplay/pirscreencontrol.service infopoint-html/infopoint-html.service /etc/systemd/system/
+
    pass
sudo systemctl daemon-reload
+
finally:
sudo systemctl enable s0infodisplay.service
+
    GPIO.cleanup()
sudo systemctl enable infopoint-html.service
+
</pre>
sudo systemctl enable pirscreencontrol.service
 
 
 
=== Troubleshooting ===
 
* Wenn das Display mit einem schwarzen Rahmen angezeigt wird
 
sudo raspi-config
 
-> 7 Advanced Options -> A2 Overscan -> <no>
 
 
 
== TODO ==
 
* Mauszeiger wegbekommen (unclutter?)
 
* Energieverbrauchsanzeige reparieren (greift gerade noch auf einen externen, nicht mehr laufenden Server zu, könnte intern auf das Grafana auf der service-vm zugreifen
 
* Stärkeres Netzteil für den Pi
 
* SD-Karten-Verschleiß minimieren
 

Version vom 15. Dezember 2024, 22:16 Uhr

Infodisplay
Das Infodisplay im Flur des Spaces
Das Infodisplay im Flur des Spaces
Beschreibung: S0 Infodisplay
Kontakt: drc
Status: aktiv (Was heißt das?)
Quellcode: https://gitli.stratum0.org/drc/python-infodisplay
Bewegungsmelder

Im Flur hängt ein großer Fernseher, der ein paar Infos anzeigt, die im Vorbeigehen interessant sein könnten, wie z.B. das Wetter draußen, die nächsten Termine im Kalender und die aktuelle CO2-Konzentration.

Der Pi infodisplay.s0 am Display selbst zeigt dazu eine Webseite im Kioskmodus an. Die Webseite selbst ist auf http://ingodisplay.s0:8888/ gehostet.

Das Display wird von einem Bewegungsmelder aufgeweckt.

#!/usr/bin/env python3

import RPi.GPIO as GPIO
import time
from subprocess import call
GPIO.setmode(GPIO.BCM)

GPIO.setup(4, GPIO.IN)
#GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
print("works so far")

pir = 4
previous_state = 0
current_state = 0

try:
    while True:
        time.sleep(0.1)
        current_state = GPIO.input(pir)
        if current_state == 1 and previous_state == 0:
            print("GPIO pin %s is %s, turning screen on" % (pir, current_state))
            call("echo on 0 | cec-client -s -d 1", shell=True)
            previous_state = 1
        elif current_state == 0 and previous_state == 1:
            print("GPIO pin %s is %s, turning screen off" % (pir, current_state))
            call("echo standby 0 | cec-client -s -d 1", shell=True)
            previous_state = 0
        time.sleep(0.01)

except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()