DanköööööDann werd ich mal mit dem Ersatz-Odys rumtesten: Akku aufgebläht, sonst läufts noch.
Im Mom hab n zweites in der Wand...noch unter WinDoof
.
from http.server import BaseHTTPRequestHandler, HTTPServer
import subprocess
import json
import time
import threading
import logging
# Konfigurieren des Loggings
logging.basicConfig(filename='/home/visu/http_server.log', level=logging.INFO,
format='%(asctime)s %(message)s')
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
brightness_value = None
def do_GET(self):
path = self.path.strip("/")
print(f"Empfangene Anfrage: {path}")
if path == "reboot":
self.handle_reboot()
elif path.startswith("brightness="):
self.handle_brightness(path)
elif path.startswith("firefox="):
self.handle_firefox(path)
elif path.startswith("chrome="):
self.handle_chrome(path)
elif path == "status/reboot":
self.check_reboot_status()
elif path == "status/brightness":
self.check_brightness_status()
elif path == "status/firefox":
self.check_firefox_status()
elif path == "status/chrome":
self.check_chrome_status()
else:
self.send_response(404)
self.end_headers()
self.wfile.write("Unbekannter Befehl\n".encode("utf-8"))
def handle_reboot(self):
print("Reboot Befehl empfangen. Der PC wird neu gestartet...")
try:
password = 'password' #<- password durch Lubuntu-Benutzer-Passwort ersetzen!
command = 'echo {} | sudo -S reboot'.format(password)
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
if process.returncode == 0:
logging.info("Rebooting...")
self.send_response(200)
self.end_headers()
self.wfile.write("Rebooting...\n".encode("utf-8"))
else:
logging.error(f"Error: {stderr.decode('utf-8')}")
self.send_response(500)
self.end_headers()
self.wfile.write("Fehler beim Neustarten\n".encode("utf-8"))
except Exception as e:
logging.error(f"Fehler beim Neustarten: {e}")
self.send_response(500)
self.end_headers()
self.wfile.write(f"Fehler: {e}\n".encode("utf-8"))
def handle_brightness(self, path):
brightness_value = path.split("=")[1]
try:
brightness_value = float(brightness_value)
if 0 <= brightness_value <= 100:
logging.info(f"Setze Helligkeit auf {brightness_value}%")
success = self.set_brightness(brightness_value)
if success:
SimpleHTTPRequestHandler.brightness_value = brightness_value
self.send_response(200)
self.end_headers()
self.wfile.write(f"Helligkeit auf {brightness_value}% gesetzt.".encode("utf-8"))
else:
logging.error("Fehler beim Setzen der Helligkeit")
self.send_response(500)
self.end_headers()
self.wfile.write("Fehler beim Setzen der Helligkeit\n".encode("utf-8"))
else:
self.send_response(400)
self.end_headers()
self.wfile.write("Ungültiger Helligkeitswert. Muss zwischen 0 und 100 liegen.\n".encode("utf-8"))
except ValueError:
self.send_response(400)
self.end_headers()
self.wfile.write("Ungültiger Wert für Helligkeit. Es muss eine Zahl sein.\n".encode("utf-8"))
def handle_firefox(self, path):
url_status = path.split("=")[1]
try:
if "OFF" in url_status:
logging.info("Schließe Firefox...")
subprocess.run(["pkill", "firefox"], check=True)
self.send_response(200)
self.end_headers()
self.wfile.write("Firefox wurde geschlossen.\n".encode("utf-8"))
elif "ON" in url_status:
logging.info("Starte Firefox...")
subprocess.Popen(["firefox", "--kiosk"])
self.send_response(200)
self.end_headers()
self.wfile.write("Firefox wurde gestartet.\n".encode("utf-8"))
else:
self.send_response(400)
self.end_headers()
self.wfile.write("Ungültiger Befehl für Firefox. Verwende 'ON' oder 'OFF'.\n".encode("utf-8"))
except Exception as e:
logging.error(f"Fehler beim Verarbeiten des Firefox-Befehls: {e}")
self.send_response(500)
self.end_headers()
self.wfile.write(f"Fehler: {e}\n".encode("utf-8"))
def handle_chrome(self, path):
url_status = path.split("=")[1]
try:
if "OFF" in url_status:
logging.info("Schließe Chrome...")
subprocess.run(["killall", "chrome"], check=True)
self.send_response(200)
self.end_headers()
self.wfile.write("Chrome wurde geschlossen.\n".encode("utf-8"))
elif "ON" in url_status:
logging.info("Starte Chrome...")
subprocess.Popen(["google-chrome", "--start-fullscreen"])
self.send_response(200)
self.end_headers()
self.wfile.write("Chrome wurde gestartet.\n".encode("utf-8"))
else:
self.send_response(400)
self.end_headers()
self.wfile.write("Ungültiger Befehl für Chrome. Verwende 'ON' oder 'OFF'.\n".encode("utf-8"))
except Exception as e:
logging.error(f"Fehler beim Verarbeiten des Chrome-Befehls: {e}")
self.send_response(500)
self.end_headers()
self.wfile.write(f"Fehler: {e}\n".encode("utf-8"))
def set_brightness(self, brightness_percentage):
try:
brightness_value = brightness_percentage / 100.0
current_brightness = self.get_current_brightness()
if brightness_percentage == 0:
logging.info("Setze Helligkeit auf 0%. Bildschirm wird ausgeschaltet.")
subprocess.run(["xrandr", "-display", ":0.0", "--output", "eDP-1", "--brightness", str(brightness_value)], check=True)
subprocess.run(["/usr/bin/xset", "-display", ":0.0", "dpms", "force", "off"], check=True)
subprocess.run(["/usr/bin/xset", "-display", ":0.0", "s", "off"], check=True)
else:
logging.info("Bildschirm wird eingeschaltet.")
subprocess.run(["/usr/bin/xset", "-display", ":0.0", "dpms", "force", "on"], check=True)
subprocess.run(["xrandr", "-display", ":0.0", "--output", "eDP-1", "--brightness", str(brightness_value)], check=True)
subprocess.run(["/usr/bin/xset", "-display", ":0.0", "s", "off", "-dpms"], check=True)
return True
except Exception as e:
logging.error(f"Fehler beim Setzen der Helligkeit: {e}")
return False
def get_current_brightness(self):
try:
result = subprocess.run(["xrandr", "-display", ":0.0", "--verbose"], stdout=subprocess.PIPE)
output = result.stdout.decode()
brightness_line = next(line for line in output.split("\n") if "Brightness" in line)
brightness_value = float(brightness_line.split(":")[1].strip()) * 100
return brightness_value
except Exception as e:
logging.error(f"Fehler beim Abrufen der aktuellen Helligkeit: {e}")
return None
def check_reboot_status(self):
self.send_response(200)
self.end_headers()
response = json.dumps({"status": "OFF"})
self.wfile.write(response.encode("utf-8"))
def check_brightness_status(self):
try:
brightness_value = self.get_current_brightness()
if brightness_value is not None:
self.send_response(200)
self.end_headers()
response = json.dumps({"status": f"{brightness_value:.2f}"})
self.wfile.write(response.encode("utf-8"))
# Bildschirmstatus und Einstellungen prüfen und ggfs. korrigieren
result = subprocess.run(["xset", "-display", ":0.0", "-q"], stdout=subprocess.PIPE)
output = result.stdout.decode()
if brightness_value > 0:
if "Monitor is Off" in output:
print("Korrektur Bildschirm Einschaltzustand: Bildschirm wird eingeschalten.")
logging.info("Korrektur Bildschirm Einschaltzustand: Bildschirm wird eingeschalten.")
subprocess.run(["/usr/bin/xset", "-display", ":0.0", "dpms", "force", "on"], check=True)
if "DPMS is Enabled" in output:
print("Korrektur Energieeinstellungen und Bildschirmschoner")
logging.info("Korrektur Energieeinstellungen und Bildschirmschoner.")
subprocess.run(["/usr/bin/xset", "-display", ":0.0", "s", "off", "-dpms"], check=True)
else:
if "Monitor is On" in output:
print("Korrektur Bildschirm Einschaltzustand: Bildschirm wird ausgeschalten.")
logging.info("Korrektur Bildschirm Einschaltzustand. Bildschirm wird ausgeschalten.")
subprocess.run(["/usr/bin/xset", "-display", ":0.0", "dpms", "force", "off"], check=True)
subprocess.run(["/usr/bin/xset", "-display", ":0.0", "s", "off"], check=True)
else:
self.send_response(500)
self.end_headers()
response = json.dumps({"error": "Fehler beim Abrufen der Helligkeit"})
self.wfile.write(response.encode("utf-8"))
except Exception as e:
self.send_response(500)
self.end_headers()
response = json.dumps({"error": str(e)})
self.wfile.write(response.encode("utf-8"))
def check_firefox_status(self):
try:
result = subprocess.run(['pgrep', 'firefox'], stdout=subprocess.PIPE)
if result.stdout:
status = "ON"
else:
status = "OFF"
self.send_response(200)
self.end_headers()
response = json.dumps({"status": status})
self.wfile.write(response.encode("utf-8"))
except Exception as e:
self.send_response(500)
self.end_headers()
response = json.dumps({"error": str(e)})
self.wfile.write(response.encode("utf-8"))
def check_chrome_status(self):
try:
result = subprocess.run(['pgrep', 'chrome'], stdout=subprocess.PIPE)
if result.stdout:
status = "ON"
else:
status = "OFF"
self.send_response(200)
self.end_headers()
response = json.dumps({"status": status})
self.wfile.write(response.encode("utf-8"))
except Exception as e:
self.send_response(500)
self.end_headers()
response = json.dumps({"error": str(e)})
self.wfile.write(response.encode("utf-8"))
def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler, port=8080):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print(f"Server läuft auf http://localhost:{port}/")
httpd.serve_forever()
if __name__ == '__main__':
run()
// Für Linux-Skript
Thing http:url:VisuFlur_LAN "Visu Flur" [ baseURL="http://XXX.XXX.XXX.XX:8080/", commandMethod="GET", stateMethod="GET" ] {
Channels:
Type dimmer : DisplayHelligkeit [ commandExtension="brightness=%2$s", mode="READWRITE", stateExtension="status/brightness", stateTransformation="JSONPATH:$.status" ]
Type switch : Neustart [ commandExtension="reboot", mode="READWRITE", onValue="ON", offValue="OFF", stateExtension="status/reboot", stateTransformation="JSONPATH:$.status" ]
Type switch : Firefox [ commandExtension="firefox=%2$s", mode="READWRITE", onValue="ON", offValue="OFF", stateExtension="status/firefox", stateTransformation="JSONPATH:$.status" ]
Type switch : Chrome [ commandExtension="chrome=%2$s", mode="READWRITE", onValue="ON", offValue="OFF", stateExtension="status/chrome", stateTransformation="JSONPATH:$.status" ]}
) ein paar Detailbilder für mich, wie genau das Surface an der Wand befestigt ist?
) ein paar Detailbilder für mich, wie genau das Surface an der Wand befestigt ist?Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.


Einen Kommentar schreiben: