VoiceCommand rule mit case anstatt if

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

VoiceCommand rule mit case anstatt if

Beitrag von Quautiputzli »

Hallo, ich versuche mich gerade an der Sprachsteuerung über die OH App

Ich habe dazu ein Item Voice Command angelegt. Dort kommen die gesprochenen Wörter auch als String an. Ich habe zum Test mal folgende Rule geschrieben:

Code: Alles auswählen

rule "Voice"
when
   Item VoiceCommand received update
then
    val txt = VoiceCommand.state.toString.toLowerCase
    logInfo("Test","VoiceCommand hat empfangen "+txt)
    if(VoiceCommand.state == "Licht an") {
        GF_Office_Light.sendCommand(ON)
    }
end
Das funktioniert soweit auch. Lässt sich diese Regel auch mit "case" aufbauen. Ich fände das in dem Fall übersichtlicher. Ich habe das mal so versucht, aber so klappt es nicht:

Code: Alles auswählen

rule "Voice"
when
   Item VoiceCommand received update
then
    val txt = VoiceCommand.state.toString.toLowerCase
    logInfo("Test","VoiceCommand hat empfangen "+txt)
    switch(receivedEvent)  {
        case "Licht an" : GF_Office_Light.sendCommand(ON)
        case "Licht aus" : GF_Office_Light.sendCommand(OFF)
    }
end
Das "switch(receivedEvent)" passt in diesem Fall nicht. Was muss ich stattdessen nutzen?
Servus

Benutzeravatar
peter-pan
Beiträge: 2772
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: VoiceCommand rule mit case anstatt if

Beitrag von peter-pan »

Hast du schon mal

Code: Alles auswählen

switch(txt)
probiert ?
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: VoiceCommand rule mit case anstatt if

Beitrag von Quautiputzli »

Genau das ist es, funktioniert. Danke
Servus

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

Re: VoiceCommand rule mit case anstatt if

Beitrag von udo1toni »

Nur zur Ergänzung: receivedEvent wäre schon korrekt, Aber man muss imer im Hinterkopf behalten, dass receivedEvent einen Status enthält.
Du vergleichst mit dem switch Befehl aber einen String.
An vielen Stellen in der DSL Rule werden Objekte, so möglich automatisch gewandelt, wenn dies erforderlich (und möglich) ist. switch() gehört aber nicht dazu (weil Du eben genauso gut auch mit Status als Vergleichsobjekten arbeiten könntest). Entsprechend musst Du explizit nach String wandeln:

Code: Alles auswählen

switch(receivedEvent.toString)
Im Gegensatz dazu kannst Du aber den log-Befehl anders formulieren und musst dort nicht auf das Format Rücksicht nehmen:

Code: Alles auswählen

logInfo("Test","VoiceCommand hat {} als Befehl empfangen. ",receivedEvent)
Wenn Du explizit Kleinbuchstaben haben willst, musst Du natürlich dennoch das .toString angeben:

Code: Alles auswählen

logInfo("Test","VoiceCommand hat {} als Befehl empfangen. ",receivedEvent.toString.toLowerCase)
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: VoiceCommand rule mit case anstatt if

Beitrag von Quautiputzli »

Das mit receivedEvent scheint nicht zu funktionieren. Kann das sein, dass das nur bei einem Channel funktioniert und nicht bei Items

Code: Alles auswählen

2021-07-09 15:52:34.995 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'voice2-1' failed: The name 'receivedEvent' cannot be resolved to an item or type; line 5, column 65, length 13 in voice2
Servus

Benutzeravatar
peter-pan
Beiträge: 2772
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: VoiceCommand rule mit case anstatt if

Beitrag von peter-pan »

Quautiputzli hat geschrieben: 9. Jul 2021 15:55 Kann das sein, dass das nur bei einem Channel funktioniert
Wenn ich mir die Doku anschaue, ja.
Aber wahrscheinlich gilt das von Udo beschriebene Vorgehen auch für die implizite Variable receivedCommand.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: VoiceCommand rule mit case anstatt if

Beitrag von Quautiputzli »

receivedCommand erkennt er auch nicht. Aber macht ja auch nichts. So wie oben mit:

Code: Alles auswählen

val txt = VoiceCommand.state.toString.toLowerCase
    switch(txt)
bzw

Code: Alles auswählen

    switch(VoiceCommand.state.toString.toLowerCase)
funktioniert es ja.
Servus

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

Re: VoiceCommand rule mit case anstatt if

Beitrag von udo1toni »

Ups... Man sollte immer noch mal über das geschriebene drüber schauen... receivedEvent ist natürlich Quatsch. newState ist die korrekte implizite Variable...

Ansonsten wäre die Frage (ich nutze keine Spracherkennung), ob received command als Trigger ebenfalls funktioniert (das ist nicht einheitlich im System, teilweise kann man es im Binding (pro Channel) konfigurieren, ob empfangene Daten als command oder als state gewertet werden).
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: VoiceCommand rule mit case anstatt if

Beitrag von Quautiputzli »

Ich denke nicht, dass das funktioniert. Es gibt dazu kein Binding und damit keine Channels. Ich habe einfach ein Item vom Typ String angelegt. Und dieses Item wird dann bei den Einstellungen unter Rule "Voice Interpreter" angegeben.
Bild_2021-07-10_090937.png
Und dann kann man die Spracheingabe über die OH App nutzen. Das gesprochene erscheint dann in diesem Item, und kann mit einer Rule weiterverarbeitet werden.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Servus

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

Re: VoiceCommand rule mit case anstatt if

Beitrag von udo1toni »

Ja, stimmt, aber letztlich müssen die Daten ja ins System kommen. Meine Frage war die nach den Events. Tritt hier nur received update auf (und natürlich changed, falls vorher ein anderer Text empfangen wurde) oder tritt received command auf (was dann auch zu einem update führt, weil openHAB default ein empfangenes Kommando als Status setzt, wenn dies möglich ist).
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten