Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. HID Relais steuern

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    HID Relais steuern

    This topic has been deleted. Only users with topic management privileges can see it.
    • J
      Jazzy._.Jazz last edited by

      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 🙂

      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @Jazzy._.Jazz last edited by

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

        Was versteht das Python Skript?

        J 1 Reply Last reply Reply Quote 1
        • J
          Jazzy._.Jazz @paul53 last edited by

          @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 🙂

          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @Jazzy._.Jazz last edited by 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 1 Reply Last reply Reply Quote 1
            • J
              Jazzy._.Jazz @paul53 last edited by Jazzy._.Jazz

              @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 Reply Quote 0
              • First post
                Last post

              Support us

              ioBroker
              Community Adapters
              Donate

              940
              Online

              31.9k
              Users

              80.2k
              Topics

              1.3m
              Posts

              2
              5
              148
              Loading More Posts
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes
              Reply
              • Reply as topic
              Log in to reply
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
              The ioBroker Community 2014-2023
              logo