Seite 1 von 1
VoiceCommand rule mit case anstatt if
Verfasst: 8. Jul 2021 21:36
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?
Re: VoiceCommand rule mit case anstatt if
Verfasst: 9. Jul 2021 00:18
von peter-pan
Hast du schon mal
probiert ?
Re: VoiceCommand rule mit case anstatt if
Verfasst: 9. Jul 2021 07:12
von Quautiputzli
Genau das ist es, funktioniert. Danke
Re: VoiceCommand rule mit case anstatt if
Verfasst: 9. Jul 2021 11:26
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:
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)
Re: VoiceCommand rule mit case anstatt if
Verfasst: 9. Jul 2021 15:55
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
Re: VoiceCommand rule mit case anstatt if
Verfasst: 9. Jul 2021 16:15
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.
Re: VoiceCommand rule mit case anstatt if
Verfasst: 9. Jul 2021 18:36
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
funktioniert es ja.
Re: VoiceCommand rule mit case anstatt if
Verfasst: 9. Jul 2021 19:30
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).
Re: VoiceCommand rule mit case anstatt if
Verfasst: 10. Jul 2021 09:12
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.
Re: VoiceCommand rule mit case anstatt if
Verfasst: 11. Jul 2021 16:11
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).