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. JavaScript
  5. HID Relais steuern

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

HID Relais steuern

Geplant Angeheftet Gesperrt Verschoben JavaScript
5 Beiträge 2 Kommentatoren 172 Aufrufe 1 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.
  • J Offline
    J Offline
    Jazzy._.Jazz
    schrieb am zuletzt editiert von
    #1

    Hi Zusammen,

    Ich habe ein 8 Kanal USB Relaisboard an meinem Server das über HID angesteuert wird.
    Dazu habe ich ein Python Skript geschrieben, das von IO Broker aufgerufen wird und an das in einem Skript per Exec Variablen übergeben werden.
    In IO Broker habe ich ein Objekt mit 8 Kanälen, deren Status True/False sein kann, angelegt.
    Das ganze funktioniert auch soweit, aber ich kann nicht den Status für alle Relais auf einmal übergeben, da maximal 3 Variablen übergeben werden können.
    Also rufe ich je Kanal bei einer Änderung des Wertes einmal mein Skript auf.
    Hier der Auszug für den ersten Kanal.

    on({id: "0_userdata.0.Relaisboard_8_Kanal.Kanal_1", change: "any"}, function (obj) {
        console.log("Wert Kanal 1 geändert");
        //Werte für die Variable holen
        var Kanal = "1";
        var Status = getState("0_userdata.0.Relaisboard_8_Kanal.Kanal_1").val;
        //Python Script starten und Werte übergeben
        exec('/usr/bin/python3 /home/iobroker/Dokumente/Python/Relays/klingelpython2.py ' + Kanal + ' ' + Status, function (error, stdout, stderr) {
            console.log('*** stdout: ' + stdout);
            if (error !== null) {
                console.log('*** stderr: ' + error);
            }
        });
    });
    

    Ich hatte jetzt gedacht, dass ich bei Änderung von einem Status einfach alle Werte in einem Boolean Array oder einem String mit 8 Stellen speichere, zum Beispiel 01100010, und diesen String/Array dann an das Python Script übergebe.
    Leider bin ich damit noch nicht wirklich weiter gekommen, weil ich mich mit Java auch nicht so richtig auskenne und noch nicht hinbekommen habe einen String zu addieren oder ein Boolean Array zu erstellen.

    Habt ihr eine Idee, wie sich das Umsetzen lässt?

    Und das nächste Problem: Wie kann man sicher stellen, dass beim Starten des Scriptes die Werte übergeben werden (also zum Beispiel nach dem Neustart von IO Broker, damit die Kanäle vom Relaisboard mit dem Status in IO Broker übereinstimmen weil das Board ja nur bei Änderung eines Werte angesteuert wird).

    Danke :)

    paul53P 1 Antwort Letzte Antwort
    0
    • J Jazzy._.Jazz

      Hi Zusammen,

      Ich habe ein 8 Kanal USB Relaisboard an meinem Server das über HID angesteuert wird.
      Dazu habe ich ein Python Skript geschrieben, das von IO Broker aufgerufen wird und an das in einem Skript per Exec Variablen übergeben werden.
      In IO Broker habe ich ein Objekt mit 8 Kanälen, deren Status True/False sein kann, angelegt.
      Das ganze funktioniert auch soweit, aber ich kann nicht den Status für alle Relais auf einmal übergeben, da maximal 3 Variablen übergeben werden können.
      Also rufe ich je Kanal bei einer Änderung des Wertes einmal mein Skript auf.
      Hier der Auszug für den ersten Kanal.

      on({id: "0_userdata.0.Relaisboard_8_Kanal.Kanal_1", change: "any"}, function (obj) {
          console.log("Wert Kanal 1 geändert");
          //Werte für die Variable holen
          var Kanal = "1";
          var Status = getState("0_userdata.0.Relaisboard_8_Kanal.Kanal_1").val;
          //Python Script starten und Werte übergeben
          exec('/usr/bin/python3 /home/iobroker/Dokumente/Python/Relays/klingelpython2.py ' + Kanal + ' ' + Status, function (error, stdout, stderr) {
              console.log('*** stdout: ' + stdout);
              if (error !== null) {
                  console.log('*** stderr: ' + error);
              }
          });
      });
      

      Ich hatte jetzt gedacht, dass ich bei Änderung von einem Status einfach alle Werte in einem Boolean Array oder einem String mit 8 Stellen speichere, zum Beispiel 01100010, und diesen String/Array dann an das Python Script übergebe.
      Leider bin ich damit noch nicht wirklich weiter gekommen, weil ich mich mit Java auch nicht so richtig auskenne und noch nicht hinbekommen habe einen String zu addieren oder ein Boolean Array zu erstellen.

      Habt ihr eine Idee, wie sich das Umsetzen lässt?

      Und das nächste Problem: Wie kann man sicher stellen, dass beim Starten des Scriptes die Werte übergeben werden (also zum Beispiel nach dem Neustart von IO Broker, damit die Kanäle vom Relaisboard mit dem Status in IO Broker übereinstimmen weil das Board ja nur bei Änderung eines Werte angesteuert wird).

      Danke :)

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

      @jazzy-_-jazz sagte: Boolean Array oder einem String mit 8 Stellen

      Was versteht das Python Skript?

      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

      J 1 Antwort Letzte Antwort
      1
      • paul53P paul53

        @jazzy-_-jazz sagte: Boolean Array oder einem String mit 8 Stellen

        Was versteht das Python Skript?

        J Offline
        J Offline
        Jazzy._.Jazz
        schrieb am zuletzt editiert von
        #3

        @paul53 Naja, das Python Skript kann ich entsprechend anpassen, das stellt kein Problem da.
        Das Problem war bisher, dass ich in Java nicht hinbekommen habe ein Boolean Array oder den oben erwähnten String zu erstellen, um diesen an das Skript zu übergeben.
        Ich bin aber auch offen für andere Lösungen :)

        paul53P 1 Antwort Letzte Antwort
        0
        • J Jazzy._.Jazz

          @paul53 Naja, das Python Skript kann ich entsprechend anpassen, das stellt kein Problem da.
          Das Problem war bisher, dass ich in Java nicht hinbekommen habe ein Boolean Array oder den oben erwähnten String zu erstellen, um diesen an das Skript zu übergeben.
          Ich bin aber auch offen für andere Lösungen :)

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

          @jazzy-_-jazz sagte: ein Boolean Array

          Wenn Python ein Array (JSON) auswerten kann:

          const ids = $('0_userdata.0.Relaisboard_8_Kanal.Kanal_*');
          const arr = []; // Array of 8 boolean
          
          function sendArr() {
              exec('/usr/bin/python3 /home/iobroker/Dokumente/Python/Relays/klingelpython2.py ' + JSON.stringify(arr), function (error, stdout, stderr) {
                  console.log('*** stdout: ' + stdout);
                  if (error !== null) {
                      console.log('*** stderr: ' + error);
                  }
              });
          }
          
          ids.each(function(id) {
              let i = parseInt(id.slice(-1)) - 1; // i = Kanalnummer - 1
              arr[i] = getState(id).val;
          });
          sendArr();
          
          ids.on(function(dp) {
              let i = parseInt(dp.id.slice(-1)) - 1; // i = Kanalnummer - 1
              arr[i] = dp.state.val;
              sendArr();
          });
          

          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

          J 1 Antwort Letzte Antwort
          1
          • paul53P paul53

            @jazzy-_-jazz sagte: ein Boolean Array

            Wenn Python ein Array (JSON) auswerten kann:

            const ids = $('0_userdata.0.Relaisboard_8_Kanal.Kanal_*');
            const arr = []; // Array of 8 boolean
            
            function sendArr() {
                exec('/usr/bin/python3 /home/iobroker/Dokumente/Python/Relays/klingelpython2.py ' + JSON.stringify(arr), function (error, stdout, stderr) {
                    console.log('*** stdout: ' + stdout);
                    if (error !== null) {
                        console.log('*** stderr: ' + error);
                    }
                });
            }
            
            ids.each(function(id) {
                let i = parseInt(id.slice(-1)) - 1; // i = Kanalnummer - 1
                arr[i] = getState(id).val;
            });
            sendArr();
            
            ids.on(function(dp) {
                let i = parseInt(dp.id.slice(-1)) - 1; // i = Kanalnummer - 1
                arr[i] = dp.state.val;
                sendArr();
            });
            
            J Offline
            J Offline
            Jazzy._.Jazz
            schrieb am zuletzt editiert von Jazzy._.Jazz
            #5

            @paul53 Vielen vielen Dank für die Hilfe, es funktioniert perfekt! :)

            Falls sowas für jemanden noch einmal interessant werden sollte: hier sind ein paar Zeilen aus meine Pythonskript, wie das Array eingelesen wird.

            import sys
            import json
            
            #sys.argv[0] ist der pfad vom Skript das aufgerufen wird
            
            #hier werden die Daten aus dem von IOBroker beim Skriptaufruf uebergebenem Array in der Variable IOBrokerdata gespeichert
            IOBrokerdata = sys.argv[1]
            
            #um ein json array in python verarbeiten zu koennen muss es mit der json.loads() Methode bearbeitet werden
            Kanal_Status = json.loads(IOBrokerdata)
            
            #ueber Kanal_Status [0] bis [7] kann dann auf den jeweiligen Status zugegriffen werden 
            #hier 0 bis 7 weil 8 Werte uebergeben wurden
            
            
            #Ein Beispiel wie der erste Wert aus dem Array benutzt werden kann
            
            if Status[0] == True:
                do something
            if Status[0] == False:
                do something else
            
            
            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

            516

            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