Skip to content
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Hardware
  4. Geekworm X1202 USV Variable in IObroker übernehmen

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.2k

Geekworm X1202 USV Variable in IObroker übernehmen

Geplant Angeheftet Gesperrt Verschoben Hardware
45 Beiträge 5 Kommentatoren 3.7k Aufrufe 3 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • L Lieggie

    @oliverio
    ich stehe auf dem schlauch ... gemacht habe ich nun 11.JPG

    Variable erstellt
    12.JPG

    Minutliche ausführung
    13.JPG

    nu komme ich nicht weiter weil mein merged.py so aussieht.
    wo soll ich deine Zeilen einfügen.

    #!/usr/bin/python3
    
    import os
    import struct
    import smbus
    import time
    import logging
    import subprocess
    import gpiod
    from subprocess import call
    
    # User-configurable variables
    SHUTDOWN_THRESHOLD = 3  # Number of consecutive failures required for shutdown
    SLEEP_TIME = 60  # Time in seconds to wait between failure checks
    Loop =  False
    
    def readVoltage(bus):
        read = bus.read_word_data(address, 2)
        swapped = struct.unpack("<H", struct.pack(">H", read))[0]
        voltage = swapped * 1.25 / 1000 / 16
        return voltage
    
    def readCapacity(bus):
        read = bus.read_word_data(address, 4)
        swapped = struct.unpack("<H", struct.pack(">H", read))[0]
        capacity = swapped / 256
        return capacity
    
    def get_battery_status(voltage):
        if 3.87 <= voltage <= 4.2:
            return "Full"
        elif 3.7 <= voltage < 3.87:
            return "High"
        elif 3.55 <= voltage < 3.7:
            return "Medium"
        elif 3.4 <= voltage < 3.55:
            return "Low"
        elif voltage < 3.4:
            return "Critical"
        else:
            return "Unknown"
    
    # Ensure only one instance of the script is running
    pid = str(os.getpid())
    pidfile = "/run/X1200.pid"
    if os.path.isfile(pidfile):
        print("Script already running")
        exit(1)
    else:
        with open(pidfile, 'w') as f:
            f.write(pid)
    
    try:
        bus = smbus.SMBus(1)
        address = 0x36
        PLD_PIN = 6
        chip = gpiod.Chip('gpiochip4')
        pld_line = chip.get_line(PLD_PIN)
        pld_line.request(consumer="PLD", type=gpiod.LINE_REQ_DIR_IN)
    
        while True:
            failure_counter = 0
    
            for _ in range(SHUTDOWN_THRESHOLD):
                ac_power_state = pld_line.get_value()
                voltage = readVoltage(bus)
                battery_status = get_battery_status(voltage)
                capacity = readCapacity(bus)
                print(f"Capacity: {capacity:.2f}% ({battery_status}), AC Power State: {'Plugged in' if ac_power_state == 1 else 'Unplugged'}, Voltage: {voltage:.2f}V")
                if capacity < 20:
                    print("Battery level critical.")
                    failure_counter += 1
                elif voltage < 3.20:
                    print("Battery voltage critical.")
                    failure_counter += 1
                elif ac_power_state == 0:
                    print("UPS is unplugged or AC power loss detected.")
                    failure_counter += 1
                else:
                    failure_counter = 0
                    break
    
                if failure_counter < SHUTDOWN_THRESHOLD:
                    time.sleep(SLEEP_TIME) 
    
            if failure_counter >= SHUTDOWN_THRESHOLD:
                shutdown_reason = ""
                if capacity < 20:
                    shutdown_reason = "due to critical battery level."
                elif voltage < 3.20:
                    shutdown_reason = "due to critical battery voltage."
                elif ac_power_state == 0:
                    shutdown_reason = "due to AC power loss or UPS unplugged."
    
                shutdown_message = f"Critical condition met {shutdown_reason} Initiating shutdown."
                print(shutdown_message)
                call("sudo nohup shutdown -h now", shell=True)
            else:
                #print("System operating within normal parameters. No action required.")
                if Loop:
                    time.sleep(SLEEP_TIME)
                else:
                    exit(0)
    
    finally:
        if os.path.isfile(pidfile):
            os.unlink(pidfile)
        exit(0)
    
    
    
    paul53P Offline
    paul53P Offline
    paul53
    schrieb am zuletzt editiert von paul53
    #41

    @lieggie sagte: wo soll ich deine Zeilen einfügen.

    Damit es ohne sudo laufen kann, kommentiere die Zeilen 44 bis 51 und 106, 107 aus und teste es erst einmal auf der Konsole (ohne sudo).

    python3 /opt/iobroker/merged.py
    

    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

    L 1 Antwort Letzte Antwort
    0
    • paul53P paul53

      @lieggie sagte: wo soll ich deine Zeilen einfügen.

      Damit es ohne sudo laufen kann, kommentiere die Zeilen 44 bis 51 und 106, 107 aus und teste es erst einmal auf der Konsole (ohne sudo).

      python3 /opt/iobroker/merged.py
      
      L Offline
      L Offline
      Lieggie
      schrieb am zuletzt editiert von
      #42

      @paul53 said in Geekworm X1202 USV Variable in IObroker übernehmen:

      python3 /opt/iobroker/merged.py

      Ich bekomme nun den String angezeigt

      pi5.JPG

      nun kann ich mich an das zerlegen machen . Vielen Dank.

      Magst du mir erklären was wir dort nun genau rausgenommen haben ?

      paul53P 1 Antwort Letzte Antwort
      0
      • L Lieggie

        @paul53 said in Geekworm X1202 USV Variable in IObroker übernehmen:

        python3 /opt/iobroker/merged.py

        Ich bekomme nun den String angezeigt

        pi5.JPG

        nun kann ich mich an das zerlegen machen . Vielen Dank.

        Magst du mir erklären was wir dort nun genau rausgenommen haben ?

        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von
        #43

        @lieggie sagte: Magst du mir erklären was wir dort nun genau rausgenommen haben ?

        Die Prüfung über eine pid-Datei, ob das Skript schon läuft, wurde raus genommen. Das Skript wird nur jede Minute gestartet und sollte sich vorher selbst beenden mit

        Loop = False
        

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        L 1 Antwort Letzte Antwort
        0
        • paul53P paul53

          @lieggie sagte: Magst du mir erklären was wir dort nun genau rausgenommen haben ?

          Die Prüfung über eine pid-Datei, ob das Skript schon läuft, wurde raus genommen. Das Skript wird nur jede Minute gestartet und sollte sich vorher selbst beenden mit

          Loop = False
          
          L Offline
          L Offline
          Lieggie
          schrieb am zuletzt editiert von Lieggie
          #44

          @paul53 danke an alle die geholfen haben, nun läuft alles
          anbei noch mal das Blockly
          pi6.JPG

          und das merged Skript ohne die Zeilen 44 bis 51 und 106, 107

          co#!/usr/bin/python3
          
          import os
          import struct
          import smbus
          import time
          import logging
          import subprocess
          import gpiod
          from subprocess 
          import call
          
          
          
          
          # User-configurable variables
          SHUTDOWN_THRESHOLD = 3  # Number of consecutive failures required for shutdown
          SLEEP_TIME = 60  # Time in seconds to wait between failure checks
          Loop =  False
          
          def readVoltage(bus):
              read = bus.read_word_data(address, 2)
              swapped = struct.unpack("<H", struct.pack(">H", read))[0]
              voltage = swapped * 1.25 / 1000 / 16
              return voltage
             
          
          def readCapacity(bus):
              read = bus.read_word_data(address, 4)
              swapped = struct.unpack("<H", struct.pack(">H", read))[0]
              capacity = swapped / 256
              return capacity
          
          def get_battery_status(voltage):
              if 3.87 <= voltage <= 4.2:
                  return "Full"
              elif 3.7 <= voltage < 3.87:
                  return "High"
              elif 3.55 <= voltage < 3.7:
                  return "Medium"
              elif 3.4 <= voltage < 3.55:
                  return "Low"
              elif voltage < 3.4:
                  return "Critical"
              else:
                  return "Unknown"
          
          
          # Ensure only one instance of the script is running
          
          
          try:
              bus = smbus.SMBus(1)
              address = 0x36
              PLD_PIN = 6
              chip = gpiod.Chip('gpiochip4')
              pld_line = chip.get_line(PLD_PIN)
              pld_line.request(consumer="PLD", type=gpiod.LINE_REQ_DIR_IN)
          
              while True:
                  failure_counter = 0
          
                  for _ in range(SHUTDOWN_THRESHOLD):
                      ac_power_state = pld_line.get_value()
                      voltage = readVoltage(bus)
                      battery_status = get_battery_status(voltage)
                      capacity = readCapacity(bus)
                      print(f"Capacity: {capacity:.2f}% ({battery_status}), AC Power State: {'Plugged in' if ac_power_state == 1 else 'Unplugged'}, Voltage: {voltage:.2f}V")
                      if capacity < 20:
                          print("Battery level critical.")
                          failure_counter += 1
                      elif voltage < 3.20:
                          print("Battery voltage critical.")
                          failure_counter += 1
                      elif ac_power_state == 0:
                          print("UPS is unplugged or AC power loss detected.")
                          failure_counter += 1
                      else:
                          failure_counter = 0
                          break
          
                      if failure_counter < SHUTDOWN_THRESHOLD:
                          time.sleep(SLEEP_TIME) 
          
                  if failure_counter >= SHUTDOWN_THRESHOLD:
                      shutdown_reason = ""
                      if capacity < 20:
                          shutdown_reason = "due to critical battery level."
                      elif voltage < 3.20:
                          shutdown_reason = "due to critical battery voltage."
                      elif ac_power_state == 0:
                          shutdown_reason = "due to AC power loss or UPS unplugged."
          
                      shutdown_message = f"Critical condition met {shutdown_reason} Initiating shutdown."
                      print(shutdown_message)
                      call("sudo nohup shutdown -h now", shell=True)
                  else:
                      #print("System operating within normal parameters. No action required.")
                      if Loop:
                          time.sleep(SLEEP_TIME)
                      else:
          
                          exit(0)
          
          finally:
             
              exit(0)de_text
          
          1 Antwort Letzte Antwort
          0
          • L Lieggie

            @oliverio

            ich versuche grad 2 gleisig zu fahren....ich komme weder mit blockly noch mit deinem Script weiter.

            Aus deine script bekomme ich diesen fehler

            javascript.0	14:59:52.402	info	Start JavaScript script.js.USV (Javascript/js)
            javascript.0	14:59:52.417	error	script.js.USV: Error: EINVAL: invalid argument, write
            javascript.0	14:59:52.417	error	at script.js.USV:26:18
            javascript.0	14:59:52.417	error	at script.js.USV:169:3
            

            komme damit auch nicht weiter

            OliverIOO Offline
            OliverIOO Offline
            OliverIO
            schrieb am zuletzt editiert von
            #45

            @lieggie sagte in Geekworm X1202 USV Variable in IObroker übernehmen:

            ich versuche grad 2 gleisig zu fahren....ich komme weder mit blockly noch mit deinem Script weiter.

            hier mal noch was ich dir per PM geantwortet habe für alle

            wahrscheinlich das was thomas geschrieben hat, das seit der letzten betriebssystem version die bisherige methode zur kommunikation mit gpio nicht mehr funktioniert. man müsste dann opengpio nehmen, das berücksichtigt die neuesten änderungen. wahrscheinlich wäre es einfach, aber es kann auch ein wenig testen und rumprobieren bedeuten.
            da du geschrieben hast, das das mit skript nix für dich ist, verfolge erst einmal mit den anderen den python weg.
            wenn da wirklich gar nix geht, dann können wir mal schauen. für doppelt-entwicklung ist die zeit aktuell nicht da

            so wie es aussieht habt ihr ja den python weg auch hinbekommen

            Meine Adapter und Widgets
            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
            Links im Profil

            1 Antwort Letzte Antwort
            0
            Antworten
            • In einem neuen Thema antworten
            Anmelden zum Antworten
            • Älteste zuerst
            • Neuste zuerst
            • Meiste Stimmen


            Support us

            ioBroker
            Community Adapters
            Donate

            445

            Online

            32.4k

            Benutzer

            81.4k

            Themen

            1.3m

            Beiträge
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
            ioBroker Community 2014-2025
            logo
            • Anmelden

            • Du hast noch kein Konto? Registrieren

            • Anmelden oder registrieren, um zu suchen
            • Erster Beitrag
              Letzter Beitrag
            0
            • Aktuell
            • Tags
            • Ungelesen 0
            • Kategorien
            • Unreplied
            • Beliebt
            • GitHub
            • Docu
            • Hilfe