IRSEND wie genau ?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Jojo
Beiträge: 207
Registriert: 5. Mär 2019 21:13
Answers: 2
Wohnort: Ingolstadt

IRSEND wie genau ?

Beitrag von Jojo »

Servus,

Ich schaffe es eine Gosund Steckdosenleiste per IR Fernbedienung einzuschalten ( Danke opanHAB Forum :D )
Nun möchte ich aber zwei Befehle in Folge absetzen ( Steckdose ein und danach SAT Receiver ein )
Ich mach das theoretisch über eine Rule.
Was nicht klappt ist der IRSEND Befehl, kaum das ich den aktiviere geht die ganze Rule nicht mehr.
Wie ist denn da bitte die Syntax ?

Code: Alles auswählen

rule "Radio unten aus"
when    
    Item DataLSB changed to 0x806230
then 
    power7.sendCommand(OFF)
end

rule "Radio unten ein"
when    
    Item DataLSB changed to 0x06230
then 
     power7.sendCommand(ON)
       //Verstein.sendCommand(IRSEND,{"Protocol":"RC5","Bits":12,"Data":"0x3CC","DataLSB":"0xC033","Repeat":0})

end
wenn ich die der auskommentierte Zeile aktiv setzte geht gar nichts mehr.
Der Ausdruck in den geschweiften Klammern führt in der Konsole zum Erfolg
??
Pleas help me !!!
--

Gruß

Jojo

Benutzeravatar
udo1toni
Beiträge: 15259
Registriert: 11. Apr 2018 18:05
Answers: 244
Wohnort: Darmstadt

Re: IRSEND wie genau ?

Beitrag von udo1toni »

Du musst die Anführungszeichen escapen, außerdem gehört der gesamte Ausdruck in Anführungszeichen. Sollte in etwa so aussehen:

Code: Alles auswählen

Verstein.sendCommand("IRSEND,{\"Protocol\":\"RC5\",\"Bits\":12,\"Data\":\"0x3CC\",\"DataLSB\":\"0xC033\",\"Repeat\":0}")
Alternativ kannst Du auch versuchen, ob sich der String in einfache Anführungszeichen setzen lässt:

Code: Alles auswählen

Verstein.sendCommand('IRSEND,{"Protocol":"RC5","Bits":12,"Data":"0x3CC","DataLSB":"0xC033","Repeat":0}')
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Jojo
Beiträge: 207
Registriert: 5. Mär 2019 21:13
Answers: 2
Wohnort: Ingolstadt

Re: IRSEND wie genau ?

Beitrag von Jojo »

Servus,

geht leider beides nicht.

Nochmal von vorne, zur Klarheit:
Ich habe:
- einen IR Fernbedienung
- ein Pearl URC 150.app Infrarot / WLAN Fernbedienung mit Tasmota geflasht und als YTF IR Bridge konfiguriert und als Thing angelegt
- einen Verstärker
- einen SAT-Reciever, Stromkabel steckt in einer Steckdose im Verstärker
- eine Gosund WLAN Steckdosenleiste mit Tasmota auch ein Thing
-
Die Steckdosenleiste kann ich per IR Fernbedienung schalten

Code: Alles auswählen

rule "Radio unten aus"
when    
    Item DataLSB changed to 0x06230
then 
    power7.sendCommand(OFF)
end

rule "Radio unten ein"
when    
    Item DataLSB changed to 0x806230
then 
     power7.sendCommand(ON)
end
Wenn ich die Steckdose einschalte geht der Verstärker ein, gut !
Es geht auch der SAT-Reciever an, aber nur in Standby, schlecht.
Also muss noch der Befehl zum einschalten des SAT-Receivers hinterher, und genau das bekomme ich nicht hin,
weder mit sendCommand noch mit Val Actionsmqtt.

Prinzipiell würde ich das aber gerne können ;-)

Reichen die Infos oder braucht s noch mehr ?
--

Gruß

Jojo

Benutzeravatar
udo1toni
Beiträge: 15259
Registriert: 11. Apr 2018 18:05
Answers: 244
Wohnort: Darmstadt

Re: IRSEND wie genau ?

Beitrag von udo1toni »

Funktioniert denn das Senden bisher überhaupt? wqenn nein, müssen wir uns zuerst mal die mqtt-Seite anschauen.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Jojo
Beiträge: 207
Registriert: 5. Mär 2019 21:13
Answers: 2
Wohnort: Ingolstadt

Re: IRSEND wie genau ?

Beitrag von Jojo »

Udo mein Held,
in mqtt.fx kommt nichts an
MQTT an sich geht, ich empfange Daten diverser ESp´s
Über die Konsole des Pearl Gedöns kann ich auch die IR Befehle senden und es geht.
Sieht so aus als würde openHAB nicht senden ??!!
--

Gruß

Jojo

Benutzeravatar
udo1toni
Beiträge: 15259
Registriert: 11. Apr 2018 18:05
Answers: 244
Wohnort: Darmstadt

Re: IRSEND wie genau ?

Beitrag von udo1toni »

Nein, ich meinte das anders. Kannst Du denn in mqtt.fx erfolgreich einen Befehl an Infrarot senden? Wie sieht das dann aus?
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Jojo
Beiträge: 207
Registriert: 5. Mär 2019 21:13
Answers: 2
Wohnort: Ingolstadt

Re: IRSEND wie genau ?

Beitrag von Jojo »

Mit mqtt.fx geht es:
Bildschirmfoto 2021-01-10 um 08.27.18.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
--

Gruß

Jojo

Jojo
Beiträge: 207
Registriert: 5. Mär 2019 21:13
Answers: 2
Wohnort: Ingolstadt

Re: IRSEND wie genau ?

Beitrag von Jojo »

es gab eine Syntax die ich noch nicht hatte

Code: Alles auswählen

val mqttActions = getActions("mqtt","mqtt:broker:JojoBroker")
   		mqttActions.publishMQTT("cmnd/IRWLAN/IRSEND", "{\"Protocol\":\"RC5\",\"Bits\":12,\"Data\":\"0xBCC\",\"DataLSB\":\"0xD033\",\"Repeat\":0}")
mit der geht es !!
--

Gruß

Jojo

dcridaz
Beiträge: 18
Registriert: 20. Jun 2022 16:16
Answers: 0

Re: IRSEND wie genau ?

Beitrag von dcridaz »

Guten Morgen Zusammen,
ich möchte diesen Beitrag nochmal aufgreifen, da ich mit dem "schalten" über MQTT noch Probleme habe.
Sobald mein Setup läuft, würde ich ein kurzes schriftliches Tutorial an dieser Stelle geben, damit auch zukünftig andere
"schneller" ans Ziel kommen.
Zur Hardware:
Ich habe die lernfähige IR-Universal-Fernbedienung NX4519 von Pearl gekauft, um ältere Geräte (Musikanlage, Reciever, etc.) ins Smarthome zu integrieren.
Der NX4519 lässt sich ziemlich leicht öffnen und hat die "benötigten" Schnittstellen zum flashen einer alternativen Firmware auf der innenliegenden Plantine. Dort habe ich die aktuelle Tasmota IR-Lib installiert und mithilfe des Templates auch den IR-Sender/Empfänger eingestellt.
Nachdem ich in den Einstellungen die MQTT-Zugangsdaten eingeben habe, konnte ich den Datenverkehr mithilfe von MQTT.FX "auslesen".
Wenn ich in der Tasmota Console den Befehl

Code: Alles auswählen

"IRsend {"Protocol":"RC5","Bits":12,"Data":0x201}"
bekomme ich die Meldung:

Code: Alles auswählen

17:54:01 CMD: IRsend {"Protocol":"RC5","Bits":12,"Data":0x201}
17:54:01 MQT: stat/infrarot/RESULT = {"IRSend":"Done"}
Das gerät (Verstärker) wird geschaltet (SourceEingangDVD), alles wunderbar.
Nun wollte ich das ganze mit MQTT-versuchen.
Im MQTT.FX in der Publish Konsole den Wert,

Code: Alles auswählen

cmnd/infrarot/IRsend 
und als "Publish die Werte

Code: Alles auswählen

{"Protocol":"RC5","Bits":12,"Data":0x201}
eingetragen. Und siehe da, auch hier bekomme ich das Gerät geschaltet.
Also nun an die Integration bei Openhab3 (kann ja dann auch nicht mehr so schwer sein, dachte ich).
Ich habe als Thing ein Generic MQTT-Thing angelegt.
Dann einen Channel angelegt, indem ich im Command Topic den Wert:

Code: Alles auswählen

 cmnd/infrarot/IRsend
eingetragen habe und nun kommt mein Problem:
Egal wo auch immer ich versuche das "eigentliche" Command {"Protocol":"RC5","Bits":12,"Data":0x201}
zu verschicken, klappt es einfach nicht.
Ich habe gestern Abend schon sämtliche Lösungsansätze aus diesem Forum ausprobiert, und leider keinerlei Lösungsansatz gefunden.
Ich habe auch versucht den Stat mit einem String Item auszulesen, und die Income Transvalue mit

Code: Alles auswählen

JSONPATH:IRsend.Bits.Data.
auszulesen.
Ebenfalls ohne Erfolg.
Dann habe ich als Custom ON/OFF Value den Command

Code: Alles auswählen

{"Protocol":"RC5","Bits":12,"Data":0x201} 
eingegeben, mal mit, mal ohne geschweifte Klammern.
Bei MQTT.FX konnte ich im tele sehen, dass das Kommando auch geschickt wurde, genau wie beim "manuellen Publish unter MQTT.FX"
aber weder das Endgerät (Verstärker,SourceEingangDVD) hat geschaltet, noch habe ich in der Tasmota Console die Rückmeldung

Code: Alles auswählen

MQT: stat/infrarot/RESULT = {"IRSend":"Done"}
sehen.

Ich würde ja, wenn es mit einem Kanal geht, sämtliche Tasten der Fernbedienungen als Channel anlegen, aber selbst eine einzige Taste via MQTT
zu schalten, funktioniert nicht.

Ach By-the-way: Die Protokolle der einzelnen Fernbedienungstasten lassen sich ganz einfach über die Tasmota Console "auslesen" wenn man
diese richtung Empfänger hält und dann lange drückt.

Kann mir hier jemand weiterhelfen?

Liebe Grüße
Tim
Openhab3 auf einem Raspberry-PI4, Wemos D1 mini über MQTT, AVM Fritz!, Wifi LED, Diverse Shelly Produkte, Gardena Smart Produkte, Reolink-IP Cams, Wansview-IP Cams, Foscam-IP Cams.

Benutzeravatar
udo1toni
Beiträge: 15259
Registriert: 11. Apr 2018 18:05
Answers: 244
Wohnort: Darmstadt

Re: IRSEND wie genau ?

Beitrag von udo1toni »

Schade, dass Du keine konkrete Konfiguration, die Du in openHAB ausprobiert hast gepostet hast. Macht aber nichts :)

Der Punkt bei der Infrarotschnittstelle ist: Du willst nicht nur exakt ein Kommando senden, sondern im Grunde beliebig viele unterschiedliche Kommandos. Das bedeutet, der richtige Weg führt nicht über einen Channel pro Befehl, sondern über einen "universellen" Channel, mit dem Du den Befehl sendest. Welcher Befehl das ist, das wird über eine Rule gelöst.
Universell bedeutet in dem Zusammenhang natürlich, dass Du einen String verwendest.
Ich habe keinen solchen Transceiver, aber nach Deiner Beschreibung sähe meine Konfiguration für dieses Gerät so aus:

Code: Alles auswählen

UID: mqtt:topic:mosquitto:infrarot
label: NX4519 Infrarot Transceiver
thingTypeUID: mqtt:topic
configuration:
  payloadNotAvailable: Offline
  availabilityTopic: tele/infrarot/LWT
  payloadAvailable: Online
bridgeUID: mqtt:broker:mosquitto
channels:
  - id: send
    channelTypeUID: mqtt:string
    label: Send
    description: ""
    configuration:
      commandTopic: cmnd/infrarot/IRsend
  - id: receive
    channelTypeUID: mqtt:string
    label: Receive
    description: ""
    configuration:
      stateTopic: stat/infrarot/IRReceive
  - id: result
    channelTypeUID: mqtt:string
    label: Result
    description: ""
    configuration:
      stateTopic: stat/infrarot/RESULT
Das Topic für den Empfangskanal ist geraten :) aber das Wichtigste: Es sind drei unidirektionale Channel, die nun mit drei String Items verknüpft werden können, nennen wir diese der Einfachheit halber irSend, irReceive und irResult. In den beiden letzten landet jeweils ein JSON Objekt, welches von einer Rule ausgewertet werden kann. Ich verwende grundsätzlich die DSL und dort die Variante über Textdateien, das ist einfach besser lesbar.

Code: Alles auswählen

rule "check ir send state"
when
    Item irResult received update
then
    val strState = irResult.state.toString
    var strResult = "xxx"
    if(strState.contains("IRSend"))
        strResult  = transform("JSONPATH","$.IRSend",strState)
    logInfo("irTrans","irResult hat getriggert. Ergebnis: {} JSON Objekt: {}",strResult,strState)
end
Die Rule triggert, sobald irResult ein Update bekommt (es spielt also keine Rolle, ob dort zweimal hintereinander das gleiche landet).
Der Status wird als String in der lokalen Konstanten strState gespeichert.
Es wird eine lokale Variable mit dem Inhalt "xxx" erzeugt.
Falls das Ergebnis den Teilstring IRSend enthält, versucht die Rule eine Transformation über JSONPATH. das Ergebnis des Pfads $.IRSend landet in der lokalen Variablen.
Abschließend wird eine Zeile ins Log geschrieben.

Einen Code senden: Dazu brauchen wir natürlich einen Trigger, also z.B. einen Knopf in der UI. Es gibt viele verschiedene Wege, das umzusetzen, ich möchte hier einfach davon ausgehen, dass der Knopf ein Number Item verwendet und den Befehl 1 sendet (Jede Bedienung über die UI sollte im Normalfall ein sendCommand auslösen). Ich nenne das Item der Einfachheit halber irSendNumber, nur, um einen Namen zu haben...

Code: Alles auswählen

rule "send IR code"
when
    Item irSendNumber received command
then
    if(!(receivedCommand instanceof Number)) {
        logInfo("irTrans","send IR code: Code {} ist ungültig. Abbruch",receivedCommand)
        return;
    }
    var strCommand = "xxx"
    switch(receivedCommand as Number) {
        case 1: strCommand = '{"Protocol":"RC5","Bits":12,"Data":0x201}' // Man beachte die doppelten und einfachen Anführungszeichen
        default : {
            logInfo("irTrans","send IR Code: Für Code {} ist kein Befehl hinterlegt! Abbruch.")
            return;
        }
    }
    irSend.sendCommand(strCommand)
end
Der Code prüft beim Empfang eines Befehls zunächst, ob es sich um eine Zahl handelt. Ist das nicht der Fall, so bricht die Rule ab.
Anschließend wird eine lokale Variable erzeugt.
Nun folgt das switch Statement, mit dem je nach empfangener Zahl ein anderer Teil des Codes ausgeführt wird.
Falls das Kommando 1 empfangen wurde, wird die lokale Variable mit dem passenden JSON Objekt gefüllt.
Bei jeder anderen Zahl (default) wird eine Meldung ausgegeben und die Rule abgebrochen.
Zum Schluss sendet die Rule den String als Befehl an das Item irSend.

In der Empfangsrichtung sähe das so aus:

Code: Alles auswählen

rule "receive IR code"
when
    Item irReceive received update
then
    val strState = irReceive.state.toString
    if(!(strState.contains("Data"))) {
        logInfo("irTrans","receive IR Code: {} enthält keine Daten! Abbruch.",strState)
    }
    val strProt = transform("JSONPATH","$.Protocol",strState)
    val strBits = transform("JSONPATH","$.Bits",strState).toString
    val strData = transform("JSONPATH","$.Data",strState).toString
    logInfo("irTrans","receive IR Code: Protokoll ist {}, Datenbits sind {}, Data ist {}",strProt,strBits,strData)
end
Sobald das Item ein Update empfängt, sucht die Rule im nach String gewandelten Status nach dem Begriff Data. Ist dieser vorhanden, versucht die Rule, Protokoll, Bitanzahl und enthaltene Daten zu extrahieren. Anschließend wird eine Logzeile mit dem Ergebnis ausgegeben. Hier würde man natürlich die Daten weiter auseinander nehmen, also vielleicht zunächst nach Protokoll unterscheiden und anschließend nach empfangenen Daten (analog zur Senderichtung).

Voraussetzung ist natürlich, dass JSONPATH installiert ist ;)

Für JSONPATH ist die Notation wie folgt: Das $ steht für den Ursprungsknoten, dann folgt an jeder Verzweigung ein Punkt, gefolgt vom Namen des Knotens, bis hin zum Label des gesuchten Wertes. Enthält der Name des Knotens (oder Labels) Leerzeichen, so muss der Knoten anders notiert werden:
$.Data.["Mein Knoten"].ID wäre da dann richtig.

Solange du nur ein einziges Kommando absetzen willst, kannst Du natürlich auch den Channel passend konfigurieren, Du musst aber unbedingt auf die Anführungszeichen achten, da kann es hakelig werden.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten