NEWS
Geekworm X1202 USV Variable in IObroker übernehmen
-
Sie lagen im home/pi habe sie nun mit
sudo npm uninstall onoff
wieder entfernt.ich sollte weiter mit blockly basteln das Script kram liegt mir nicht.
-
Und gewöhn dir den exzessiven Einsatz von sudo ab. Da ist im Kontext vom ioBroker eigentlich nie erforderlich und zu 99% einfach falsch.
-
Kann es vielleicht daran liegen das ich einen Rpi5 nutze mit Bookworm?
habe gerade gelesen das einige User probleme mit den GPIO in verbindung mit bookworm haben -
Die GPIOs werden nun anders angesprochen und Programme müssen dahingehend umgestellt werden.
-
@lieggie sagte: probleme mit den GPIO in verbindung mit bookworm haben
Das Python-Skript hat doch funktioniert: Einen String mit den Werten geliefert. Dann nimm das Python-Skript (ohne sudo) und zerlege den String.
Wenn du das Skript nach /opt/iobroker verschoben hast, dann ersetze "home" durch "opt".
-
es geht nur so mit sudo -S
Es wir aber nichts zurückgegebenGebe ich nur sudo ein kommt die Meldung
script.js.Skript_1: sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper sudo: a password is required
ganz ohne sudo
script.js.Skript_1: Traceback (most recent call last): File "/opt/iobroker/merged.py", line 50, in <module> with open(pidfile, 'w') as f: ^^^^^^^^^^^^^^^^^^ PermissionError: [Errno 13] Permission denied: '/run/X1200.pid'
-
@lieggie sagte: ganz ohne sudo
Das Python-Skript wird abgearbeitet bis zur Zeile 50, wo es offenbar ein Problem mit Zugriffsrechten auf das Verzeichnis /run gibt.
EDIT: Deshalb muss Python3 offenbar mit root-Rechten ausgeführt werden. -
@lieggie sagte in Geekworm X1202 USV Variable in IObroker übernehmen:
ich sollte weiter mit blockly basteln das Script kram liegt mir nicht.
Ok
Evtl hilft das Skript ja jemanden anderen weiter -
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
-
@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
-
@paul53 said in Geekworm X1202 USV Variable in IObroker übernehmen:
python3 /opt/iobroker/merged.py
Ich bekomme nun den String angezeigt
nun kann ich mich an das zerlegen machen . Vielen Dank.
Magst du mir erklären was wir dort nun genau rausgenommen haben ?
-
@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
-
@paul53 danke an alle die geholfen haben, nun läuft alles
anbei noch mal das Blockly
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
-
@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 daso wie es aussieht habt ihr ja den python weg auch hinbekommen