Skip to content
  • Home
  • 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

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [Gelöst]Python prozess wird nach Zeit X mehrfach ausgeführt.

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.7k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    880

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

[Gelöst]Python prozess wird nach Zeit X mehrfach ausgeführt.

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
13 Beiträge 3 Kommentatoren 899 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.
  • wendy2702W wendy2702

    Hi,

    um meinen Felicity Akku auslesen zu können läuft auf einem Pi3B mit Bookworm ein Python script welches ich in einem anderen Forum gefunden und angepasst habe.

    Das Script und die Abfrage funktioniert soweit und läuft als Service auf dem PI.

    mirko@felicity:~ $ systemctl status FelicityBMS.service
    ● FelicityBMS.service - hit service
         Loaded: loaded (/etc/systemd/system/FelicityBMS.service; enabled; preset: enabled)
         Active: active (running) since Wed 2025-02-26 17:27:24 CET; 4min 0s ago
       Main PID: 580 (python)
          Tasks: 2 (limit: 767)
            CPU: 1.824s
         CGroup: /system.slice/FelicityBMS.service
                 └─580 /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
    
    Feb 26 17:27:24 felicity systemd[1]: Started FelicityBMS.service - hit service.
    
    

    Der Service scheint dauerhaft stabil zu laufen, seit letztem restart des PI's

    mirko@felicity:~ $ sudo journalctl -f -u FelicityBMS.service
    Feb 26 17:27:24 felicity systemd[1]: Started FelicityBMS.service - hit service.
    
    

    Das Script sieht so aus:

    mirko@felicity:~/felicityBMSscript $ cat BMSsnippet_iob_leon.py
    import logging
    import signal
    import sys
    import paho.mqtt.client as mqtt
    import datetime
    import time
    import os.path
    from FelicityBMSManager import FelicityBMSManager
    
    # Configure logging
    logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
    
    #DataItem = namedtuple("DataItem", ["key", "command", "data", "lastdata", "isdirty"])
    class DataItem:
    
       def __init__(self, command : str, clientid : int):
           self.command = command
           self.clientid = clientid
           self.data = None
           self.lastdata = None
    
    class MQTTBroker:
    
       def __init__(self, name: str, address : str, topic : str):
           self.name = name
           self.address = address
           self.topic = topic
           self.client = None
    
    
    ioBroker_broker = MQTTBroker('ioBroker', '192.168.178.18', 'felicity/battery')
    
    def on_connect(client, userdata, rc, *extra_params):
       print('ioBroker: Connected with result code ' + str(rc))
       client.subscribe(ioBroker_broker.topic + '/set/#')
       #client.publish(settings.MQTT_TOPIC + '', get_gpio_status(), 1)
    
    
    ioBroker_broker.client = mqtt.Client()
    isrunning = True
    
    def _handle_sigterm(sig, frame):
       logging.info("SIGTERM received. Exiting...")
       isrunning = False
       ioBroker_broker.client.loop_stop()
       exit()
    
    def getFormattedData(command, clientid):
       ws = FelicityBMSManager(command=command, clientid=clientid)
       data = ws.get_data()
    
       #if websocket_data != last_websocket_data:
    
       formatted_data = {}
    
       for inverter_key in data:
           inverter_item = data[inverter_key]
           value = inverter_item.value
    
           #if value == '--':
           #    value = '0'
    
           formatted_data[inverter_key] = {"name": inverter_item.name, "value": value, "unit": inverter_item.unit}
           #print(inverter_key, inverter_item.desc, value, inverter_item.unit)
    
       return formatted_data
    
    def sendData(broker, topic_key, data):
       broker.client.publish(broker.topic + topic_key, data)
       #print(broker.name, broker.address, broker.topic + topic_key, data)
    
    starttime = datetime.datetime.min
    resettime = datetime.datetime.min
    
    try:
       signal.signal(signal.SIGTERM, _handle_sigterm)
    
       ioBroker_broker.client.on_connect = on_connect
       #ioBroker_broker.client.on_message = on_message
       ioBroker_broker.client.username_pw_set("mqtt","ioBroker")
       ioBroker_broker.client.connect(ioBroker_broker.address, 1889, 60)
       ioBroker_broker.client.loop_start()
    
       starttime = datetime.datetime.min
    
       battery_information_list = [
           DataItem(command="GetBMSBatteryInformation", clientid = 1),
           DataItem(command="GetBMSBatteryInformation", clientid = 2),
           DataItem(command="GetBMSBatteryInformation", clientid = 3),
           DataItem(command="GetBMSBatteryInformation", clientid = 4)
       ]
    
       cell_information_list = [DataItem(command="GetBMSCellInformation", clientid = battery_information.clientid) for battery_information in battery_information_list]
    
       while isrunning:
           if datetime.datetime.now() > starttime + datetime.timedelta(seconds = 10): #org 10
               try:
                   isDirtyDefault = False
    
                   if datetime.datetime.now() > resettime + datetime.timedelta(seconds = 60): #org 60
                       isDirtyDefault = True
                       resettime = datetime.datetime.now()
    
                   for battery_index, battery_information in enumerate(battery_information_list):
                       battery_information.lastdata = battery_information.data
    
                       battery_information.data = getFormattedData(command =  battery_information.command, clientid = battery_information.clientid)
                       time.sleep(1)
    
                       if isDirtyDefault or battery_information.lastdata != battery_information.data:
                           battery_voltage = battery_information.data["BatteryVoltage"]["value"]
                           battery_current = battery_information.data["BatteryCurrent"]["value"]
                           battery_power = battery_voltage * battery_current * -1 # positiv Ladung, negativ Entladung
                           battery_soc = battery_information.data["SOC"]["value"]
    
                           sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/battery_voltage', battery_voltage)
                           sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/battery_current', battery_current)
                           sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/battery_power', round(battery_power, 1))
                           sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/soc', battery_soc)
    
                       cell_information = cell_information_list[battery_index]
                       cell_information.lastdata = cell_information.data
                       cell_information.data = getFormattedData(command = cell_information.command, clientid = cell_information.clientid)
                       time.sleep(1)
    
                       if isDirtyDefault or cell_information.lastdata != cell_information.data:
                           for cell_index in range(1, 17):
                               cell_voltage = cell_information.data["Cell" + str(cell_index) + " Voltage"]["value"]
                               sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/cell_' + str(cell_index) + '_voltage', cell_voltage)
    
               except Exception as e:
                   exc_type, exc_obj, exc_tb = sys.exc_info()
                   fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
                   logging.exception("Caught exception")
                   print(exc_type, fname, exc_tb.tb_lineno)
                   pass
    
               starttime = datetime.datetime.now()
    
           time.sleep(1)
    
    #except KeyboardInterrupt:
    #    GPIO.cleanup()
    #    dmx_stop()
    finally:
       print("cleanup")
    
    mirko@felicity:~/felicityBMSscript $
    
    

    Der Service ist so eingerichtet:

    mirko@felicity:/etc/systemd/system $ cat FelicityBMS.service
    [Unit]
    Description=hit service
    After=network-online.target
    
    [Service]
    ExecStart=/usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
    
    [Install]
    WantedBy=multi-user.target
    mirko@felicity:/etc/systemd/system $
    
    

    Jemand ne Idee was die Ursache sein kann das ich irgendwann x Python Prozesse aktiv habe und die Abfrage dann nicht mehr funktioniert?

    Thx

    BananaJoeB Offline
    BananaJoeB Offline
    BananaJoe
    Most Active
    schrieb am zuletzt editiert von BananaJoe
    #2

    @wendy2702 sagte in Python prozess wird nach Zeit X mehrfach ausgeführt.:

    FelicityBMS.service

    kannst auch mal den Inhalt der FelicityBMS.service posten? ok stand ganz unten

    Ich habe auch diverse Python-Skripte als Dienst laufen, bei mir sieht die Service-Datei so aus:

    [Unit]
    Description=Zabbix Sender URL Service
    After=syslog.target
    
    [Service]
    Type=simple
    WorkingDirectory=/gpio/flask
    ExecStart=/gpio/flask/ZabbixSenderByURL.py
    SyslogIdentifier=zabbixsenderbyurl
    StandardOutput=syslog
    StandardError=syslog
    Restart=always
    RestartSec=3
    
    [Install]
    WantedBy=multi-user.target
    

    type=simple hast du nicht angegeben, sollte aber auch der Default wert sein.
    Mein Python-Skript ist ausführbar ( chmod +x ... ) weshalb ich den Interpreter nicht extra mit angeben muss.
    After=network-online.target sollte auch ok sein.

    Im Skript sehe ich auf anhieb auch nicht was einen mehrfachen Start auslösen sollte.

    ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 750W kaskadiert || Creality CR-10 SE 3D-Drucker

    wendy2702W 1 Antwort Letzte Antwort
    0
    • wendy2702W wendy2702

      Hi,

      um meinen Felicity Akku auslesen zu können läuft auf einem Pi3B mit Bookworm ein Python script welches ich in einem anderen Forum gefunden und angepasst habe.

      Das Script und die Abfrage funktioniert soweit und läuft als Service auf dem PI.

      mirko@felicity:~ $ systemctl status FelicityBMS.service
      ● FelicityBMS.service - hit service
           Loaded: loaded (/etc/systemd/system/FelicityBMS.service; enabled; preset: enabled)
           Active: active (running) since Wed 2025-02-26 17:27:24 CET; 4min 0s ago
         Main PID: 580 (python)
            Tasks: 2 (limit: 767)
              CPU: 1.824s
           CGroup: /system.slice/FelicityBMS.service
                   └─580 /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
      
      Feb 26 17:27:24 felicity systemd[1]: Started FelicityBMS.service - hit service.
      
      

      Der Service scheint dauerhaft stabil zu laufen, seit letztem restart des PI's

      mirko@felicity:~ $ sudo journalctl -f -u FelicityBMS.service
      Feb 26 17:27:24 felicity systemd[1]: Started FelicityBMS.service - hit service.
      
      

      Das Script sieht so aus:

      mirko@felicity:~/felicityBMSscript $ cat BMSsnippet_iob_leon.py
      import logging
      import signal
      import sys
      import paho.mqtt.client as mqtt
      import datetime
      import time
      import os.path
      from FelicityBMSManager import FelicityBMSManager
      
      # Configure logging
      logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
      
      #DataItem = namedtuple("DataItem", ["key", "command", "data", "lastdata", "isdirty"])
      class DataItem:
      
         def __init__(self, command : str, clientid : int):
             self.command = command
             self.clientid = clientid
             self.data = None
             self.lastdata = None
      
      class MQTTBroker:
      
         def __init__(self, name: str, address : str, topic : str):
             self.name = name
             self.address = address
             self.topic = topic
             self.client = None
      
      
      ioBroker_broker = MQTTBroker('ioBroker', '192.168.178.18', 'felicity/battery')
      
      def on_connect(client, userdata, rc, *extra_params):
         print('ioBroker: Connected with result code ' + str(rc))
         client.subscribe(ioBroker_broker.topic + '/set/#')
         #client.publish(settings.MQTT_TOPIC + '', get_gpio_status(), 1)
      
      
      ioBroker_broker.client = mqtt.Client()
      isrunning = True
      
      def _handle_sigterm(sig, frame):
         logging.info("SIGTERM received. Exiting...")
         isrunning = False
         ioBroker_broker.client.loop_stop()
         exit()
      
      def getFormattedData(command, clientid):
         ws = FelicityBMSManager(command=command, clientid=clientid)
         data = ws.get_data()
      
         #if websocket_data != last_websocket_data:
      
         formatted_data = {}
      
         for inverter_key in data:
             inverter_item = data[inverter_key]
             value = inverter_item.value
      
             #if value == '--':
             #    value = '0'
      
             formatted_data[inverter_key] = {"name": inverter_item.name, "value": value, "unit": inverter_item.unit}
             #print(inverter_key, inverter_item.desc, value, inverter_item.unit)
      
         return formatted_data
      
      def sendData(broker, topic_key, data):
         broker.client.publish(broker.topic + topic_key, data)
         #print(broker.name, broker.address, broker.topic + topic_key, data)
      
      starttime = datetime.datetime.min
      resettime = datetime.datetime.min
      
      try:
         signal.signal(signal.SIGTERM, _handle_sigterm)
      
         ioBroker_broker.client.on_connect = on_connect
         #ioBroker_broker.client.on_message = on_message
         ioBroker_broker.client.username_pw_set("mqtt","ioBroker")
         ioBroker_broker.client.connect(ioBroker_broker.address, 1889, 60)
         ioBroker_broker.client.loop_start()
      
         starttime = datetime.datetime.min
      
         battery_information_list = [
             DataItem(command="GetBMSBatteryInformation", clientid = 1),
             DataItem(command="GetBMSBatteryInformation", clientid = 2),
             DataItem(command="GetBMSBatteryInformation", clientid = 3),
             DataItem(command="GetBMSBatteryInformation", clientid = 4)
         ]
      
         cell_information_list = [DataItem(command="GetBMSCellInformation", clientid = battery_information.clientid) for battery_information in battery_information_list]
      
         while isrunning:
             if datetime.datetime.now() > starttime + datetime.timedelta(seconds = 10): #org 10
                 try:
                     isDirtyDefault = False
      
                     if datetime.datetime.now() > resettime + datetime.timedelta(seconds = 60): #org 60
                         isDirtyDefault = True
                         resettime = datetime.datetime.now()
      
                     for battery_index, battery_information in enumerate(battery_information_list):
                         battery_information.lastdata = battery_information.data
      
                         battery_information.data = getFormattedData(command =  battery_information.command, clientid = battery_information.clientid)
                         time.sleep(1)
      
                         if isDirtyDefault or battery_information.lastdata != battery_information.data:
                             battery_voltage = battery_information.data["BatteryVoltage"]["value"]
                             battery_current = battery_information.data["BatteryCurrent"]["value"]
                             battery_power = battery_voltage * battery_current * -1 # positiv Ladung, negativ Entladung
                             battery_soc = battery_information.data["SOC"]["value"]
      
                             sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/battery_voltage', battery_voltage)
                             sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/battery_current', battery_current)
                             sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/battery_power', round(battery_power, 1))
                             sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/soc', battery_soc)
      
                         cell_information = cell_information_list[battery_index]
                         cell_information.lastdata = cell_information.data
                         cell_information.data = getFormattedData(command = cell_information.command, clientid = cell_information.clientid)
                         time.sleep(1)
      
                         if isDirtyDefault or cell_information.lastdata != cell_information.data:
                             for cell_index in range(1, 17):
                                 cell_voltage = cell_information.data["Cell" + str(cell_index) + " Voltage"]["value"]
                                 sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/cell_' + str(cell_index) + '_voltage', cell_voltage)
      
                 except Exception as e:
                     exc_type, exc_obj, exc_tb = sys.exc_info()
                     fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
                     logging.exception("Caught exception")
                     print(exc_type, fname, exc_tb.tb_lineno)
                     pass
      
                 starttime = datetime.datetime.now()
      
             time.sleep(1)
      
      #except KeyboardInterrupt:
      #    GPIO.cleanup()
      #    dmx_stop()
      finally:
         print("cleanup")
      
      mirko@felicity:~/felicityBMSscript $
      
      

      Der Service ist so eingerichtet:

      mirko@felicity:/etc/systemd/system $ cat FelicityBMS.service
      [Unit]
      Description=hit service
      After=network-online.target
      
      [Service]
      ExecStart=/usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
      
      [Install]
      WantedBy=multi-user.target
      mirko@felicity:/etc/systemd/system $
      
      

      Jemand ne Idee was die Ursache sein kann das ich irgendwann x Python Prozesse aktiv habe und die Abfrage dann nicht mehr funktioniert?

      Thx

      Thomas BraunT Online
      Thomas BraunT Online
      Thomas Braun
      Most Active
      schrieb am zuletzt editiert von
      #3

      @wendy2702

      So aus dem Stehgreif würde ich behaupten, das hängt mit der fehlenden Angabe zum Restart zusammen.

      Setzt das mal auf always.

      Linux-Werkzeugkasten:
      https://forum.iobroker.net/topic/42952/der-kleine-iobroker-linux-werkzeugkasten
      NodeJS Fixer Skript:
      https://forum.iobroker.net/topic/68035/iob-node-fix-skript
      iob_diag: curl -sLf -o diag.sh https://iobroker.net/diag.sh && bash diag.sh

      wendy2702W 1 Antwort Letzte Antwort
      0
      • BananaJoeB BananaJoe

        @wendy2702 sagte in Python prozess wird nach Zeit X mehrfach ausgeführt.:

        FelicityBMS.service

        kannst auch mal den Inhalt der FelicityBMS.service posten? ok stand ganz unten

        Ich habe auch diverse Python-Skripte als Dienst laufen, bei mir sieht die Service-Datei so aus:

        [Unit]
        Description=Zabbix Sender URL Service
        After=syslog.target
        
        [Service]
        Type=simple
        WorkingDirectory=/gpio/flask
        ExecStart=/gpio/flask/ZabbixSenderByURL.py
        SyslogIdentifier=zabbixsenderbyurl
        StandardOutput=syslog
        StandardError=syslog
        Restart=always
        RestartSec=3
        
        [Install]
        WantedBy=multi-user.target
        

        type=simple hast du nicht angegeben, sollte aber auch der Default wert sein.
        Mein Python-Skript ist ausführbar ( chmod +x ... ) weshalb ich den Interpreter nicht extra mit angeben muss.
        After=network-online.target sollte auch ok sein.

        Im Skript sehe ich auf anhieb auch nicht was einen mehrfachen Start auslösen sollte.

        wendy2702W Online
        wendy2702W Online
        wendy2702
        schrieb am zuletzt editiert von
        #4

        @bananajoe hi und danke für deine Info.

        Ich passe den Service mal an und beobachte.

        Kann aber erst am Wochenende schauen da ich jetzt unterwegs bin.

        Bitte keine Fragen per PN, die gehören ins Forum!

        Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

        1 Antwort Letzte Antwort
        0
        • wendy2702W wendy2702

          Hi,

          um meinen Felicity Akku auslesen zu können läuft auf einem Pi3B mit Bookworm ein Python script welches ich in einem anderen Forum gefunden und angepasst habe.

          Das Script und die Abfrage funktioniert soweit und läuft als Service auf dem PI.

          mirko@felicity:~ $ systemctl status FelicityBMS.service
          ● FelicityBMS.service - hit service
               Loaded: loaded (/etc/systemd/system/FelicityBMS.service; enabled; preset: enabled)
               Active: active (running) since Wed 2025-02-26 17:27:24 CET; 4min 0s ago
             Main PID: 580 (python)
                Tasks: 2 (limit: 767)
                  CPU: 1.824s
               CGroup: /system.slice/FelicityBMS.service
                       └─580 /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
          
          Feb 26 17:27:24 felicity systemd[1]: Started FelicityBMS.service - hit service.
          
          

          Der Service scheint dauerhaft stabil zu laufen, seit letztem restart des PI's

          mirko@felicity:~ $ sudo journalctl -f -u FelicityBMS.service
          Feb 26 17:27:24 felicity systemd[1]: Started FelicityBMS.service - hit service.
          
          

          Das Script sieht so aus:

          mirko@felicity:~/felicityBMSscript $ cat BMSsnippet_iob_leon.py
          import logging
          import signal
          import sys
          import paho.mqtt.client as mqtt
          import datetime
          import time
          import os.path
          from FelicityBMSManager import FelicityBMSManager
          
          # Configure logging
          logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
          
          #DataItem = namedtuple("DataItem", ["key", "command", "data", "lastdata", "isdirty"])
          class DataItem:
          
             def __init__(self, command : str, clientid : int):
                 self.command = command
                 self.clientid = clientid
                 self.data = None
                 self.lastdata = None
          
          class MQTTBroker:
          
             def __init__(self, name: str, address : str, topic : str):
                 self.name = name
                 self.address = address
                 self.topic = topic
                 self.client = None
          
          
          ioBroker_broker = MQTTBroker('ioBroker', '192.168.178.18', 'felicity/battery')
          
          def on_connect(client, userdata, rc, *extra_params):
             print('ioBroker: Connected with result code ' + str(rc))
             client.subscribe(ioBroker_broker.topic + '/set/#')
             #client.publish(settings.MQTT_TOPIC + '', get_gpio_status(), 1)
          
          
          ioBroker_broker.client = mqtt.Client()
          isrunning = True
          
          def _handle_sigterm(sig, frame):
             logging.info("SIGTERM received. Exiting...")
             isrunning = False
             ioBroker_broker.client.loop_stop()
             exit()
          
          def getFormattedData(command, clientid):
             ws = FelicityBMSManager(command=command, clientid=clientid)
             data = ws.get_data()
          
             #if websocket_data != last_websocket_data:
          
             formatted_data = {}
          
             for inverter_key in data:
                 inverter_item = data[inverter_key]
                 value = inverter_item.value
          
                 #if value == '--':
                 #    value = '0'
          
                 formatted_data[inverter_key] = {"name": inverter_item.name, "value": value, "unit": inverter_item.unit}
                 #print(inverter_key, inverter_item.desc, value, inverter_item.unit)
          
             return formatted_data
          
          def sendData(broker, topic_key, data):
             broker.client.publish(broker.topic + topic_key, data)
             #print(broker.name, broker.address, broker.topic + topic_key, data)
          
          starttime = datetime.datetime.min
          resettime = datetime.datetime.min
          
          try:
             signal.signal(signal.SIGTERM, _handle_sigterm)
          
             ioBroker_broker.client.on_connect = on_connect
             #ioBroker_broker.client.on_message = on_message
             ioBroker_broker.client.username_pw_set("mqtt","ioBroker")
             ioBroker_broker.client.connect(ioBroker_broker.address, 1889, 60)
             ioBroker_broker.client.loop_start()
          
             starttime = datetime.datetime.min
          
             battery_information_list = [
                 DataItem(command="GetBMSBatteryInformation", clientid = 1),
                 DataItem(command="GetBMSBatteryInformation", clientid = 2),
                 DataItem(command="GetBMSBatteryInformation", clientid = 3),
                 DataItem(command="GetBMSBatteryInformation", clientid = 4)
             ]
          
             cell_information_list = [DataItem(command="GetBMSCellInformation", clientid = battery_information.clientid) for battery_information in battery_information_list]
          
             while isrunning:
                 if datetime.datetime.now() > starttime + datetime.timedelta(seconds = 10): #org 10
                     try:
                         isDirtyDefault = False
          
                         if datetime.datetime.now() > resettime + datetime.timedelta(seconds = 60): #org 60
                             isDirtyDefault = True
                             resettime = datetime.datetime.now()
          
                         for battery_index, battery_information in enumerate(battery_information_list):
                             battery_information.lastdata = battery_information.data
          
                             battery_information.data = getFormattedData(command =  battery_information.command, clientid = battery_information.clientid)
                             time.sleep(1)
          
                             if isDirtyDefault or battery_information.lastdata != battery_information.data:
                                 battery_voltage = battery_information.data["BatteryVoltage"]["value"]
                                 battery_current = battery_information.data["BatteryCurrent"]["value"]
                                 battery_power = battery_voltage * battery_current * -1 # positiv Ladung, negativ Entladung
                                 battery_soc = battery_information.data["SOC"]["value"]
          
                                 sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/battery_voltage', battery_voltage)
                                 sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/battery_current', battery_current)
                                 sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/battery_power', round(battery_power, 1))
                                 sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/soc', battery_soc)
          
                             cell_information = cell_information_list[battery_index]
                             cell_information.lastdata = cell_information.data
                             cell_information.data = getFormattedData(command = cell_information.command, clientid = cell_information.clientid)
                             time.sleep(1)
          
                             if isDirtyDefault or cell_information.lastdata != cell_information.data:
                                 for cell_index in range(1, 17):
                                     cell_voltage = cell_information.data["Cell" + str(cell_index) + " Voltage"]["value"]
                                     sendData(ioBroker_broker, '/' + str(battery_information.clientid) + '/cell_' + str(cell_index) + '_voltage', cell_voltage)
          
                     except Exception as e:
                         exc_type, exc_obj, exc_tb = sys.exc_info()
                         fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
                         logging.exception("Caught exception")
                         print(exc_type, fname, exc_tb.tb_lineno)
                         pass
          
                     starttime = datetime.datetime.now()
          
                 time.sleep(1)
          
          #except KeyboardInterrupt:
          #    GPIO.cleanup()
          #    dmx_stop()
          finally:
             print("cleanup")
          
          mirko@felicity:~/felicityBMSscript $
          
          

          Der Service ist so eingerichtet:

          mirko@felicity:/etc/systemd/system $ cat FelicityBMS.service
          [Unit]
          Description=hit service
          After=network-online.target
          
          [Service]
          ExecStart=/usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
          
          [Install]
          WantedBy=multi-user.target
          mirko@felicity:/etc/systemd/system $
          
          

          Jemand ne Idee was die Ursache sein kann das ich irgendwann x Python Prozesse aktiv habe und die Abfrage dann nicht mehr funktioniert?

          Thx

          BananaJoeB Offline
          BananaJoeB Offline
          BananaJoe
          Most Active
          schrieb am zuletzt editiert von
          #5

          @wendy2702 was beim Skript so beim mehrmaligen anschauen blöd sein könnte, ist das es beim Start eine MQTT Verbindung zum MQTT Broker aufbaut (Zeile 79 bis 83).
          Erhält das Skript den Stopp-Befehl, so wird die Verbindung wieder abgebaut.
          Ich sehe nichts was die Verbindung zur Laufzeit prüft, danach wird in der Hauptschleife nur noch gesendet.
          Ob das wirklich ein Problem ist, weis ich aber nicht (oder ob der paho.mqtt.client das händelt).

          ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 750W kaskadiert || Creality CR-10 SE 3D-Drucker

          wendy2702W 1 Antwort Letzte Antwort
          0
          • Thomas BraunT Thomas Braun

            @wendy2702

            So aus dem Stehgreif würde ich behaupten, das hängt mit der fehlenden Angabe zum Restart zusammen.

            Setzt das mal auf always.

            wendy2702W Online
            wendy2702W Online
            wendy2702
            schrieb am zuletzt editiert von
            #6

            @thomas-braun sagte in Python prozess wird nach Zeit X mehrfach ausgeführt.:

            @wendy2702

            So aus dem Stehgreif würde ich behaupten, das hängt mit der fehlenden Angabe zum Restart zusammen.

            Setzt das mal auf always.

            Ok.

            Das hat @BananaJoe ja auch drin stehen.

            Mal meinen Sohn antriggern ob der das schnell ändern kann.

            Bitte keine Fragen per PN, die gehören ins Forum!

            Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

            1 Antwort Letzte Antwort
            0
            • BananaJoeB BananaJoe

              @wendy2702 was beim Skript so beim mehrmaligen anschauen blöd sein könnte, ist das es beim Start eine MQTT Verbindung zum MQTT Broker aufbaut (Zeile 79 bis 83).
              Erhält das Skript den Stopp-Befehl, so wird die Verbindung wieder abgebaut.
              Ich sehe nichts was die Verbindung zur Laufzeit prüft, danach wird in der Hauptschleife nur noch gesendet.
              Ob das wirklich ein Problem ist, weis ich aber nicht (oder ob der paho.mqtt.client das händelt).

              wendy2702W Online
              wendy2702W Online
              wendy2702
              schrieb am zuletzt editiert von
              #7

              @bananajoe sagte in Python prozess wird nach Zeit X mehrfach ausgeführt.:

              @wendy2702 was beim Skript so beim mehrmaligen anschauen blöd sein könnte, ist das es beim Start eine MQTT Verbindung zum MQTT Broker aufbaut (Zeile 79 bis 83).
              Erhält das Skript den Stopp-Befehl, so wird die Verbindung wieder abgebaut.
              Ich sehe nichts was die Verbindung zur Laufzeit prüft, danach wird in der Hauptschleife nur noch gesendet.
              Ob das wirklich ein Problem ist, weis ich aber nicht (oder ob der paho.mqtt.client das händelt).

              Das habe ich dank KI auch erfahren aber kann mir nicht vorstellen das es zu mehreren Prozessen führen kann.

              Bin aber auch kein Informatiker etc.

              Bitte keine Fragen per PN, die gehören ins Forum!

              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

              1 Antwort Letzte Antwort
              0
              • wendy2702W Online
                wendy2702W Online
                wendy2702
                schrieb am zuletzt editiert von
                #8

                So,

                Hatte vor einigen Tagen den Service geändert:

                
                Unit]
                Description=Felicity Abfrage  service
                After=network-online.target
                
                [Service]
                Type=simple
                ExecStart=/usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                SyslogIdentifier=felictyabfrage
                StandardOutput=syslog
                StandardError=syslog
                Restart=always
                
                [Install]
                WantedBy=multi-user.target
                
                
                

                Heute läuft der Python Prozeß wieder mehrfach.

                Sieht hier noch wer einen Fehler oder hat einen anderen Tipp?

                Bitte keine Fragen per PN, die gehören ins Forum!

                Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                BananaJoeB 1 Antwort Letzte Antwort
                0
                • wendy2702W wendy2702

                  So,

                  Hatte vor einigen Tagen den Service geändert:

                  
                  Unit]
                  Description=Felicity Abfrage  service
                  After=network-online.target
                  
                  [Service]
                  Type=simple
                  ExecStart=/usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                  SyslogIdentifier=felictyabfrage
                  StandardOutput=syslog
                  StandardError=syslog
                  Restart=always
                  
                  [Install]
                  WantedBy=multi-user.target
                  
                  
                  

                  Heute läuft der Python Prozeß wieder mehrfach.

                  Sieht hier noch wer einen Fehler oder hat einen anderen Tipp?

                  BananaJoeB Offline
                  BananaJoeB Offline
                  BananaJoe
                  Most Active
                  schrieb am zuletzt editiert von BananaJoe
                  #9

                  @wendy2702 kannst du mal ein

                  /usr/bin/python --version
                  

                  aufrufen? Und ich hoffe da kommt nicht 2.7 ...

                  Und wenn der wieder "mehrfach" läuft, gib bitte diesen Befehl ein und poste hier die Ausgabe:

                  ps -aux |grep python
                  

                  und beim Service hänge unter das Restart dann auch noch diese Zeile:

                  RestartSec=30
                  

                  damit er ein wenig Pause macht vor einem Neustart.

                  Ich war schon drauf und dran das Skript anzupassen - aber ich könnte es bei mir ja nicht testen.
                  Blöd ist, das das Skript ja nicht wirklich auf Start/Stop-Anforderungen reagiert.

                  Hier hat jemand eine schöne Idee dafür vorgeschlagen: https://oxylabs.io/blog/python-script-service-guide
                  Bei der Lösung reagiert das Skript selbst auf die Anforderungen.
                  Meine Python-Dienste nutzen alle Flask, ich vermute das hat das schon eingebaut.

                  ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 750W kaskadiert || Creality CR-10 SE 3D-Drucker

                  wendy2702W 1 Antwort Letzte Antwort
                  0
                  • BananaJoeB BananaJoe

                    @wendy2702 kannst du mal ein

                    /usr/bin/python --version
                    

                    aufrufen? Und ich hoffe da kommt nicht 2.7 ...

                    Und wenn der wieder "mehrfach" läuft, gib bitte diesen Befehl ein und poste hier die Ausgabe:

                    ps -aux |grep python
                    

                    und beim Service hänge unter das Restart dann auch noch diese Zeile:

                    RestartSec=30
                    

                    damit er ein wenig Pause macht vor einem Neustart.

                    Ich war schon drauf und dran das Skript anzupassen - aber ich könnte es bei mir ja nicht testen.
                    Blöd ist, das das Skript ja nicht wirklich auf Start/Stop-Anforderungen reagiert.

                    Hier hat jemand eine schöne Idee dafür vorgeschlagen: https://oxylabs.io/blog/python-script-service-guide
                    Bei der Lösung reagiert das Skript selbst auf die Anforderungen.
                    Meine Python-Dienste nutzen alle Flask, ich vermute das hat das schon eingebaut.

                    wendy2702W Online
                    wendy2702W Online
                    wendy2702
                    schrieb am zuletzt editiert von
                    #10

                    @bananajoe Die Python Version ist:

                    Python 3.11.2
                    

                    Service werde ich erweitern und mir den Link mal anschauen.

                    Danke!

                    Bitte keine Fragen per PN, die gehören ins Forum!

                    Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                    1 Antwort Letzte Antwort
                    0
                    • wendy2702W Online
                      wendy2702W Online
                      wendy2702
                      schrieb am zuletzt editiert von
                      #11

                      @bananajoe sagte in Python prozess wird nach Zeit X mehrfach ausgeführt.:

                      ps -aux |grep python

                      Jetzt dachte ich nach einfügen der Restart Zeit würde es funktionieren aber dann sehe ich heute wieder mehrere Prozesse.

                      @BananaJoe hier mal die gewünschte Ausgabe

                      mirko@felicity:~ $ ps -aux |grep python
                      root        1833  0.5  2.7 109996 25984 ?        Ssl  Mar04  31:55 /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                      mirko       2482  0.0  0.1   2320  1280 ?        Ss   Mar04   0:00 /bin/sh -c /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                      mirko       2483  0.5  2.7 109996 25996 ?        Sl   Mar04  28:54 /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                      mirko       4229  0.0  0.1   2320  1280 ?        Ss   Mar05   0:00 /bin/sh -c /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                      mirko       4230  0.4  2.6 109020 25044 ?        Sl   Mar05  20:35 /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                      mirko       5979  0.0  0.1   2320  1280 ?        Ss   Mar06   0:00 /bin/sh -c /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                      mirko       5980  0.4  2.6 108996 25032 ?        Sl   Mar06  12:39 /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                      mirko       7714  0.0  0.1   2320  1280 ?        Ss   Mar07   0:00 /bin/sh -c /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                      mirko       7715  0.4  2.6 108996 24892 ?        Sl   Mar07   5:21 /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                      mirko       9345  0.0  0.2   6088  1920 pts/0    S+   14:53   0:00 grep --color=auto python
                      
                      

                      Bitte keine Fragen per PN, die gehören ins Forum!

                      Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                      BananaJoeB 1 Antwort Letzte Antwort
                      0
                      • wendy2702W wendy2702

                        @bananajoe sagte in Python prozess wird nach Zeit X mehrfach ausgeführt.:

                        ps -aux |grep python

                        Jetzt dachte ich nach einfügen der Restart Zeit würde es funktionieren aber dann sehe ich heute wieder mehrere Prozesse.

                        @BananaJoe hier mal die gewünschte Ausgabe

                        mirko@felicity:~ $ ps -aux |grep python
                        root        1833  0.5  2.7 109996 25984 ?        Ssl  Mar04  31:55 /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                        mirko       2482  0.0  0.1   2320  1280 ?        Ss   Mar04   0:00 /bin/sh -c /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                        mirko       2483  0.5  2.7 109996 25996 ?        Sl   Mar04  28:54 /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                        mirko       4229  0.0  0.1   2320  1280 ?        Ss   Mar05   0:00 /bin/sh -c /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                        mirko       4230  0.4  2.6 109020 25044 ?        Sl   Mar05  20:35 /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                        mirko       5979  0.0  0.1   2320  1280 ?        Ss   Mar06   0:00 /bin/sh -c /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                        mirko       5980  0.4  2.6 108996 25032 ?        Sl   Mar06  12:39 /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                        mirko       7714  0.0  0.1   2320  1280 ?        Ss   Mar07   0:00 /bin/sh -c /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                        mirko       7715  0.4  2.6 108996 24892 ?        Sl   Mar07   5:21 /usr/bin/python /home/mirko/felicityBMSscript/BMSsnippet_iob_leon.py
                        mirko       9345  0.0  0.2   6088  1920 pts/0    S+   14:53   0:00 grep --color=auto python
                        
                        
                        BananaJoeB Offline
                        BananaJoeB Offline
                        BananaJoe
                        Most Active
                        schrieb am zuletzt editiert von
                        #12

                        @wendy2702 der läuft aber ja 1x als root und 9x als mirko in 2 verschiedenen Varianten

                        Der als root ist vermutlich der richtige, der hat auch die niedrigste Prozessnummer.
                        Also du hast irgendwo noch etwas was weitere Instanzen startet auf 2 wegen.
                        Da iobroker nicht der Besitzer ist, der vermutlich nicht.

                        was steht denn in den Cronjobs von mirko?

                        crontab -e
                        

                        ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 750W kaskadiert || Creality CR-10 SE 3D-Drucker

                        wendy2702W 1 Antwort Letzte Antwort
                        1
                        • BananaJoeB BananaJoe

                          @wendy2702 der läuft aber ja 1x als root und 9x als mirko in 2 verschiedenen Varianten

                          Der als root ist vermutlich der richtige, der hat auch die niedrigste Prozessnummer.
                          Also du hast irgendwo noch etwas was weitere Instanzen startet auf 2 wegen.
                          Da iobroker nicht der Besitzer ist, der vermutlich nicht.

                          was steht denn in den Cronjobs von mirko?

                          crontab -e
                          
                          wendy2702W Online
                          wendy2702W Online
                          wendy2702
                          schrieb am zuletzt editiert von
                          #13

                          @bananajoe Bist mein Held für heute.

                          Es gab von den ersten Versuchen noch einen crontab den ich komplett vergessen hatte.

                          Denke mit löschen des Eintrags sollte mein Problem jetzt gelöst sein.

                          Bitte keine Fragen per PN, die gehören ins Forum!

                          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                          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

                          347

                          Online

                          32.6k

                          Benutzer

                          82.1k

                          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
                          • Home
                          • Aktuell
                          • Tags
                          • Ungelesen 0
                          • Kategorien
                          • Unreplied
                          • Beliebt
                          • GitHub
                          • Docu
                          • Hilfe