#!/usr/bin/env python3 # -*- coding: utf-8 -*- # reads and writes RGB and brightness data for led background color of Clevo NL51 Laptops # ensure to compile drivers before ! read: https://wiki.siningsoft.de/doku.php?id=terra:1500p # Kernelmodul: tuxedo_keyboard # ToDo: add argument and function for switching color on commandline # ToDo: add argument and functions for switching brightness on commandline # 2026-02-02 - devnull - initial # 2026-02-03 - devnull - added Brightness restore # 2026-02-04 - devnull - JSON statefile # 2026-02-11 - devnull - created class # 2026-02-18 - devnull - added logging ver="1.1" import sys import argparse import json import logging log = logging.getLogger("kbdLED") 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, log, 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 , "bri" : sysfs_bri_fp }, "state" : kbd_state_fp} #DEBUGprint("debug: " + str(self.config)) if cmd=="start": self.readStateFile(self.config['state']) #print("debug: " + str(self.config)) self.writeColor() self.writeBrightness() elif cmd=="stop": self.readColor() self.readBrightness() self.writeStateFile(self.config['state']) def readStateFile(self,kbd_state_fp): config = {"color": {"R": 255, "G": 255, "B": 255}, "Brightness": 255 } try: with open(kbd_state_fp, 'r') as kbd_state_fh: self.config = json.load(kbd_state_fh) except FileNotFoundError: print("keine Statusdatei gefunden, nutze Standardwerte") except PermissionError: print("Fehler beim lesen") def writeStateFile(self,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") # color String nach Config Dict def color2dict(self,color_string): ca=color_string.split(" ") self.config['color'] = {"R": int(ca[0]), "G": int(ca[1]), "B": int(ca[2])} # color Confi Dict nach String def dict2color(self): return str(self.config['color']['R']) + " " + str(self.config['color']['G']) + " " + str(self.config['color']['B']) # reads the color Values from sysfs def readColor(self): try: with open(self.config['sysfs']['color']) as fh: self.color2dict(fh.read()) except FileNotFoundError: print("- fehler beim Öffnen der Sysfs Datei " + self.config['sysfs']['color']) sys.exit(1) except PermissionError: print("- keine Rechte die Datei zu lesen " + self.config['sysfs']['color']) 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()) fh = open(self.config['sysfs']['color'], 'w') fh.write(self.dict2color()) fh.close() 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']) fh = open(self.config['sysfs']['bri'], 'w') fh.write(str(self.config['Brightness'])) fh.close() 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('--verbose', action='store_true', help='extended Logging') startstop.add_argument('--debug', action='store_true', help='debugging information') startstop.add_argument('--version', action='version', version='%(prog)s ' + ver, default='d') args = parser.parse_args() if args.verbose: log.setLevel(logging.INFO) if args.debug: log.setLevel(logging.DEBUG) if args.start: print("Keyboard: read and set Color and Brightness") log.debug("System start") kL = kbdLED_class("start", log) elif args.stop: print("Keyboard: read and save Color and Brightness") log.debug("System stop") kL = kbdLED_class("stop", log) else: parser.print_help() sys.exit((10)) sys.exit(0)