Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
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
    17
    1
    3.2k

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.4k

HID Relais steuern

Scheduled Pinned Locked Moved JavaScript
5 Posts 2 Posters 175 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Offline
    J Offline
    Jazzy._.Jazz
    wrote on last edited by
    #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 Reply Last reply
    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
      wrote on last edited by
      #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 Reply Last reply
      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
        wrote on last edited by
        #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 Reply Last reply
        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
          wrote on last edited by 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 Reply Last reply
          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
            wrote on last edited by 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 Reply Last reply
            0
            Reply
            • Reply as topic
            Log in to reply
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes


            Support us

            ioBroker
            Community Adapters
            Donate

            421

            Online

            32.7k

            Users

            82.3k

            Topics

            1.3m

            Posts
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
            ioBroker Community 2014-2025
            logo
            • Login

            • Don't have an account? Register

            • Login or register to search.
            • First post
              Last post
            0
            • Home
            • Recent
            • Tags
            • Unread 0
            • Categories
            • Unreplied
            • Popular
            • GitHub
            • Docu
            • Hilfe