#!/usr/bin/python3 # -*- coding: utf-8 -*- from typing import Dict # ließ und schreibt RGB Daten für die farbige Tastaturbeleuchtung auf Clevo NL51 Laptops # Notwendigerweise müssen die Treiber von NovaCustom oder Tuxedo kompiliert und geladen sein # siehe: https://wiki.siningsoft.de/doku.php?id=terra:1500p # Kernelmodul: tuxedo_keyboard # 2026-02-02 - devnull - initial # 2026-02-03 - devnull - added Brightness restore # 2026-02-04 - devnull - JSON statefile # 2026-02-11 - devnull - Einführung einer Klasse ver="1.1" import os import sys import argparse import json class kbdLED_class: # 2026-02-11 - devnull - Einführung einer Klassendefinition # diese Versionsnummer wird getrennt vom Programmcode geführt, da es sich getrennt entwickeln wird __version__ = 1.1 config = Dict() # Objekt erzeugen def __init__(self, cmd, kbd_state_fp='/var/lib/kbdLED.state.json', sysfs_color_fp='/sys/devices/platform/tuxedo_keyboard/leds/rgb:kbd_backlight/multi_intensity', sysfs_bri_fp='/sys/devices/platform/tuxedo_keyboard/leds/rgb:kbd_backlight/brightness'): self.config['sysfs']['color']=sysfs_color_fp self.config['sysfs']['bri']=sysfs_bri_fp self.config['state']=kbd_state_fp if cmd=="start": self.readStateFile(self.config['state']) self.writeColor() self.writeBrightness() elif cmd=="stop": self.readColor() self.readBrightness() self.writeStateFile(self.config['state']) def readStateFile(kbd_state_fp): config = {"color": {"R": 255, "G": 255, "B": 255}, "Brightness": 255 } try: with open(kbd_state_fp, 'r') as kbd_state_fh: config = json.load(kbd_state_fh) except FileNotFoundError: print("keine Statusdatei gefunden, nutze Standardwerte") except PermissionError: print("Fehler beim lesen") return config def writeStateFile(kbd_state_fp): try: with open(kbd_state_fp, 'w') as kbd_state_fh: json.dump(self.config, kbd_state_fh) except FileNotFoundError: print("Verzeichnis nicht gefunden") return True # color String nach Config Dict def color2dict(self,color_string): ca=color_string.split(" ") self.config['color']['R'] = int(ca[0]) self.config['color']['G'] = int(ca[1]) self.config['color']['B'] = int(ca[2]) # color Confi Dict nach String def dict2color(self): return self.config['color']['R'] + " " + self.config['color']['G'] + " " + self.config['color']['B'] # reads the color Values from sysfs def readColor(self): try: with open(self.config['sysfs']['sysfs_color_fp']) as fh: self.color2dict(fh.read()) except FileNotFoundError: print("- fehler beim Öffnen der Sysfs Datei " + self.config['sysfs']['sysfs_color_fp']) sys.exit(1) except PermissionError: print("- keine Rechte die Datei zu lesen " + self.config['sysfs']['sysfs_color_fp']) sys.exit(1) # writes the color values to sysfs def writeColor(self): try: with open(self.config['sysfs']['color']) as fh: fh.write(self.dict2color()) except FileNotFoundError: print("- fehler beim Schreiben der Sysfs Datei " + self.config['sysfs']['color']) sys.exit(1) except PermissionError: print("- keine Rechte die Datei zu schreiben " + self.config['sysfs']['color']) sys.exit(1) # reads Brightness from sysfs def readBrightness(self): try: with open(self.config['sysfs']['bri']) as fh: self.config['Brightness'] = int(fh.read()) except FileNotFoundError: print("- fehler beim Öffnen der Sysfs Datei " + self.config['sysfs']['bri']) sys.exit(1) except PermissionError: print("- keine Rechte die Datei zu lesen " + self.config['sysfs']['bri']) sys.exit(1) # writes Brightness to sysfs def writeBrightness(self): try: with open(self.config['sysfs']['bri']) as fh: fh.write(self.config['Brightness']) except FileNotFoundError: print("- fehler beim Schreiben der Sysfs Datei " + self.config['sysfs']['bri']) sys.exit(1) except PermissionError: print("- keine Rechte die Datei zu schreiben " + self.config['sysfs']['bri']) sys.exit(1) # Press the green button in the gutter to run the script. if __name__ == '__main__': parser = argparse.ArgumentParser( prog='T1500_KeyboardLED', description='saves and restore LED Colors', epilog='GPL') startstop = parser.add_mutually_exclusive_group() startstop.add_argument('--start', action='store_true', help='will be used for system starts') startstop.add_argument('--stop', action='store_true', help='will be used for system shutdowns') startstop.add_argument('--version', action='version', version='%(prog)s ' + ver, default='d') args = parser.parse_args() if args.start: print("Keyboard: read and set Color and Brightness") kL = kbdLED_class("start") elif args.stop: print("Keyboard: read and save Color and Brightness") kL = kbdLED_class("stop") else: parser.print_help() sys.exit((1)) sys.exit(0)