NEWS
HID Relais steuern
-
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
-
@jazzy-_-jazz sagte: Boolean Array oder einem String mit 8 Stellen
Was versteht das Python Skript?
-
@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 -
@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(); });
-
@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