Some example sentences for German

To help all the other German people in this forum i will post parts of my sentences.ini here.
I replaced a couple names and the name of my city. I will add some german comments as this is mostly usefull for people who speak german

[GetTime]
wie spät ist es [(jetzt|momentan|gerade|aktuell|eigentlich)]
sag mir (die uhrzeit | wie spät es ist)
wie viel uhr (ist es|haben wir) [gerade]
was ist die uhrzeit
welche uhrzeit haben wir [(gerade | aktuell)]

[GetDate]
welches datum haben wir [heute]
der wievielte ist heute [eigentlich]
den wievielten haben wir [heute] [eigentlich]
das [heutige] datum ist [der]
heute ist der

[GetDay]
(welcher|welchen) (tag|wochentag)(ist|haben wir)[heute]


[SetAlarm]
(stell | stelle) [mir] (den|einen|meinen) wecker [für] (heute|((morgen|):morgen)|übermorgen| $rhasspy/days){tag} auf (((viertel vor):-15)|((viertel nach):15)|(halb:-30)|:0){minute} (1..23) {stunde} [uhr]
(stell | stelle) [mir] (den | meinen |einen) wecker (für | auf) ((heute |):heute | morgen | übermorgen | $rhasspy/days){tag} [auf] (0..23){stunde} uhr (0..59){minute}

Uhrzeit kann ausgewertet werden in dem im Fall von negativen minuten die Stunden anzahl um eins reduziert wird und +60 auf die minuten gerechnet wird.

[SetTimer]
(stell | stelle) [mir] einen timer [(für (die | den | das ) | fürs) ($timer){timer}] (für|auf) (0..59) {minuten} minuten
sag mir in (0..59) {minuten} minuten bescheid das [(die | der | das)] $timer{timer} fertig (ist|sind|sein werden)
(erinnere | erinner) mich [daran] in (0..59) {minuten} minuten nach (den | dem) ($timer) {timer} zu (schauen){typ}

Der slot $timer enthält einige Sachen für die man häufiger einen Timer stellt.

[GetTemperature]
data_source=(((drinnen | innentemperatur | in meinem zimmer | hier | ):zimmer_1)|((draußen | außen):klima_2) | ((in 2 zimmer):zimmer_2) | (((laut | nach) [dem | der] (wetterbericht | wettervorhersage)) | (in ortsname)):wetterbericht){source}
wie ist die temperatur <data_source>
wie (heiß | kalt | warm) ist es <data_source>
wie viel grad hat es <data_source>
welche temperatur ((hat es)|(haben wir)) <data_source>

Bei datasource kann es bei einer Nutzung von mehrere Rhasspy sateliten Sinn machen (hier | ):siteId zu nutzen und in dem Fall die siteId für die Auswertung zu nutzen.

[GetHumidity]
wie hoch ist die [relative] luftfeuchtigkeit <GetTemperature.data_source>
wie feucht ist es <GetTemperature.data_source>

[ChangeLightState]
light_name = $lampe {name}
light_state = ((ein|an):ein | (aus|ab):aus | heller | dunkler) {state}
\[(schalte | schalt)] [(die | das | den)] <light_name> [wieder] <light_state>
(((deaktiviere):aus)|((aktiviere):ein)) {state} [(die | das | den)] <light_name>
<light_name> [wieder] ((ausschalten|deaktiviere|abschalten):aus | (einschalten|anschalten|aktiviere):ein) {state}


[SetVolume]
(stell | stelle) die ((standard lautstärke):61){volume} [wider] (her | heer | ein)
(stell | stelle | setz | setze) die lautstärke auf (1..100){volume} [prozent] [ein]
\[([(stell | stelle)] die lautstärke)] [bitte] (((etwas leiser):5-) | ((etwas lauter):5+) | ((deutlich leiser):10-) | ((deutlich lauter):10+)){volume} [stellen] [bitte]

Hier nutze ich (her | heer | ein) nur weil ich heer an einer anderen Stelle nutze und es oft statt her erkannt wird.

Falls es Fragen zu den Sätzen gibt beantworte ich diese gerne. Ich hoffe diese Beispiele helfen jemandem weiter.

Für das Inten handling nutze ich node-red. Hier kann ich eventuell bei den einfacheren Intents was zur Umsetzung sagen falls Interesse besteht

5 Likes

Hi moqart,

Nice examples. Can you explain how you realize the timer in node red?

As far as I can see, you have some experience with this grammer/ sentences engine. May be you have a guess why my sentences are not working Link.

Kind Regards, Chewy

Hi moqart,

thank you very much for your sentences. I am also interested how you realized your timer.

Cheers Becks

At the moment i dont have an optimal setup for my timer. Its just a change node and and a delay node in node-red. II did not find the time yet to set up a better timer which supports cancelling a timer, telling which timers are currently running, and maybe extending timers or a alarm that is more then a TTS message.

Hi moqart,
great examples, will save me a lot of work.
When my complete setup is done, I will upload my German sentences added - if you allow?
Cheers, openhabgs

Hallo zusammen,
ich schreibe mal auf deutsch, da der ganze Post hier sich ja um die Sprache dreht.

Da es eine allgemeine Frage ist, die insbesondere für das Deutsche Auswirkung hat: Kennt Ihr einen Weg wie man Slots mit anderen Wörtern verknüpfen kann?

Z.B. nehmen wir hier mal einen Satz aus meiner Konfiguration.

schalte das ($roomName){roomName}licht ein

Ich habe jetzt bereits einen Slot, der mit allen Raumnamen gefüllt ist. Erwartungshaltung ist also, daß ich hier z.B. sagen kann “schalte das Wohnzimmerlicht ein” und ich bekomme den Intent und den Slot.
Erkannt wird der Intent aber nur, wenn ich es mit Pause sage oder gleich mit Leerzeichen auf der Hauptseite eingebe, d.h. “schalte das Wohnzimmer licht ein”. Beides wäre sprachlich unintuitiv.

Du hast mir schon mal einen Weg gezeigt, mit dem es zwar prinzipiell ginge:

((wohnzimmerlicht):wohnzimmer | (Bürolicht):büro){roomName}

Der erfordert allerdings, daß ich an dieser Stelle nochmals alle Werte des Slots aufzähle. Da das hier nur eines von mehreren Beispielen ist, wo ich das Problem habe, frage ich mich, ob es eine allgemeinere Lösung gibt.

@OulSiDEs Slots können auch alternativen und substitutions enthalten. Sowie dieser hier.

(leuchtstreifen | led ):leuchtstreifen
(([(mein|meinem)] licht) | ([(meine|meiner)] lampe) | beleuchtung):lampe
wohnzimmerlampe
garagenlicht

Hm, das würde es mir jetzt aber für mein Beispiel auch nicht erlauben, daß ich die Räume bekomme, oder?

Ich könnte jetzt nur den Slot der Räume erweitern, z.B.

(Wohnzimmer|Wohnzimmerlicht):Wohnzimmer

Das wiederum würde aber den Licht-Intent nicht als solchen erkennen.

Macht mer sinn einen extra slot für Lichter zu erstellen. Ich habe ein paar Sachen ausprobiert aber ich habe keinen sinnvollen weg gefunden das anders umzusetzen. Hast du denn so viele Fälle wo du etwas ähnliches brauchst?

Es ist jetzt nicht so, daß ich da Millionen Kombinationen habe. Ich weiß mir mittlerweile auch zu helfen. Ich versuche nur immer zuerst eine allgemeine Lösung zu finden und nicht für den konkreten Fall irgendwas zusammenzuscripten.

Ein anderes Beispiel wäre noch die Frage nach Umgebungsdaten wie Temperatur, Luftfeuchtigkeit. Da könnte ich z.B. fragen

wie ist die außentemperatur

Ziel wäre auch hier, daß er meinen Intent GetEnvironmentOutside erkennt und mir als Slot-Wert “temperatur” liefert, könnte z.B. auch “humidity” oder “brightness” sein.

Alles kein Beinbruch und lässt sich auch anders umsetzen. Aber mir hat sich halt die Frage gestellt, ob das eleganter geht ohne doppelte Daten zu erzeugen.

Dankeschön!

Hi,
I tried to solve a similar problem.

I am just transmitting the recognized sentence via MQTT to openHAB - there I do the complete decoding and command structure. That allows a clear separation.

That is what Rhasspy will receive and decode:
Rhasspy
The json message transmitted to openHAB looks like:

Blockquote
{
“intent”: {
“name”: “Command”,
“confidence”: 1
},
“entities”: [
{
“entity”: “name”,
“value”: “licht”,
“value_details”: {
“kind”: “Unknown”,
“value”: “licht”
},
“raw_value”: “licht”,
“start”: 12,
“end”: 17,
“raw_start”: 12,
“raw_end”: 17
},
{
“entity”: “location”,
“value”: “wohnzimmer”,
“value_details”: {
“kind”: “Unknown”,
“value”: “wohnzimmer”
},
“raw_value”: “wohnzimmer”,
“start”: 21,
“end”: 31,
“raw_start”: 21,
“raw_end”: 31
},
{
“entity”: “state”,
“value”: “ein”,
“value_details”: {
“kind”: “Unknown”,
“value”: “ein”
},
“raw_value”: “ein”,
“start”: 32,
“end”: 35,
“raw_start”: 32,
“raw_end”: 35
}
],
“slots”: {
“name”: “licht”,
“location”: “wohnzimmer”,
“state”: “ein”
},
“text”: “schalte das licht im wohnzimmer ein”,
“raw_text”: “schalte das licht im wohnzimmer ein”,
“tokens”: [
“schalte”,
“das”,
“licht”,
“im”,
“wohnzimmer”,
“ein”
],
“raw_tokens”: [
“schalte”,
“das”,
“licht”,
“im”,
“wohnzimmer”,
“ein”
],
“wakeword_id”: null,
“siteId”: “RhasspySatS10”,
“sessionId”: “ec89347f-059b-c45a-ec99-ae8e0d9bdb38”,
“customData”: null,
“wakewordId”: null,
“lang”: null
}

Now my sentences - kept very basic:

Blockquote
[Command]
item_name = ($items) {name}
location_name = ($locations ) {location}
item_state = ($states) {state}
item_value = (0…100) {value!int}
[($commands)] [($articles)] <item_name> [($particles)] [<location_name>] [($particles)] <item_state>
Helligkeit <item_name> auf <item_value>
[Question]
item_parameter= ($parameters) {parameter}
location_name = ($locations ) {location}
(Sage mir | wie ist ) [($articles)] <item_parameter> [($particles)] [<location_name>]

My slots are:

Blockquote
articles:
dessen
das
dem
deren
die
der
den

Blockquote
commands:
schalt
mach
stelle
schalte

Blockquote
items:
heizung
nanoliiw
sofalampe
licht
rodernlicht
fussbodenheizung
tischlampe
tokonomalampe

Blockquote
locations:
kinderbad
elisabethzimmer
bastelzimmer
schlafzimmer
kueche
elternbad
esszimmer
wirtschaftsraum
wohnzimmer
flur
japanzimmer

Blockquote
parameters:
heizkoerpertemperatur
spartemperatur
normaltemperatur
aussentemperatur
windgeschwindigkeit
temperatur
aussenfoichtigkeit
foichtigkeit
hell
aussenhelligkeit

Blockquote
particles:
im
an
auf
wieder
in
um

Blockquote
states:
weisser
(spartemperatur|sparbetrieb):spartemperatur
(aus|ab):aus
(normaltemperatur|normalbetrieb):normaltemperatur
dunkler
max
heller
waermer
(ein|an):ein

Thanks for the short intents. I reduced mine and it looks much cleaner.
On october chewyf5 asked für an implementation in node red. I’m using a node, called

node-red-contrib-cron-plus
Here’s a short example for adding an alarm with minutes (to not forget the pizza) and time (to get up to early in the morning):

[{"id":"d0212a8b.b6bf18","type":"cronplus","z":"86f51c47.a1e7c","name":"","outputField":"payload","timeZone":"","persistDynamic":false,"commandResponseMsgOutput":"output2","outputs":2,"options":[{"name":"schedule1","topic":"schedule1","payloadType":"default","payload":"","expressionType":"cron","expression":"0 * * * * * *","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"}],"x":620,"y":220,"wires":[["1f9c582a.056248"],["32c7cffb.c2ed3"]]},{"id":"1f9c582a.056248","type":"debug","z":"86f51c47.a1e7c","name":"Ausgabe bei Alarm","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":830,"y":200,"wires":[]},{"id":"32c7cffb.c2ed3","type":"debug","z":"86f51c47.a1e7c","name":"Ausgabe bei Info","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":830,"y":260,"wires":[]},{"id":"d18b290e.29f088","type":"change","z":"86f51c47.a1e7c","name":"Wann wird es klingeln ?","rules":[{"t":"set","p":"payload","pt":"msg","to":"{         \"command\": \"status-all\"       }","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":330,"y":180,"wires":[["d0212a8b.b6bf18"]]},{"id":"89ebd162.08ca7","type":"inject","z":"86f51c47.a1e7c","name":"FromRhasspy","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":110,"y":180,"wires":[["d18b290e.29f088"]]},{"id":"f34e80a9.f2f15","type":"function","z":"86f51c47.a1e7c","name":"Nächster Alarm (Uhrzeit)","func":"// Bei Wunsch: Antwort\nfunction getAnswer(slots){\n    return{payload: \"Ich habe einen Wecker im \" + \n                    slots.room + \" auf \" + \n                    slots.hour + \" Uhr \" + \n                    slots.minute + \" gestellt\"}\n}\n/**\nEingabe: \n    msg.slots.hour (Stunde zu der geweckt werden soll)\n    msg.slots.minute (Minute zu der geweckt werden soll)\n    msg.slots.room (Raum/Satellite als Ausgabe um dort zu klingeln)\n*/\nif (msg.slots.hour && msg.slots.minute ){\n    \n    // Wenn Bestätigung gewünscht wird\n    answer = getAnswer(msg.slots)\n    // Eingabe für cron-node\n    \n    msg.payload = {\n        \"command\": \"add\",\n        \"name\": (new Date()).getTime(), // eindeutiger Name (Millisekunden)\n        \"expression\": \"* \" + msg.slots.minute + \" \"+ msg.slots.hour + \"  * * * *\", //cron\n        \"payload\": msg.slots.room, // Ausgabe\n        \"type\": \"default\",\n        \"limit\": 1 \n      }\n    \n}\nreturn [msg,answer];","outputs":2,"noerr":0,"initialize":"","finalize":"","x":330,"y":220,"wires":[["d0212a8b.b6bf18"],["41c9e25d.2b6a8c"]]},{"id":"44fd972a.2916b8","type":"inject","z":"86f51c47.a1e7c","name":"FromRhasspy","props":[{"p":"slots","v":"{\"minute\":12,\"hour\":8,\"room\":\"Wohnzimmer\"}","vt":"json"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payloadType":"str","x":110,"y":220,"wires":[["f34e80a9.f2f15"]]},{"id":"7012fe9c.87844","type":"function","z":"86f51c47.a1e7c","name":"Nächster Alarm (Minuten)","func":"// Bei Wunsch: Antwort\nfunction getAnswer(value, dt){\n    var timeString = dt.toLocaleTimeString([],\n        {\n            hour: \"2-digit\", \n            minute: \"2-digit\",\n            hour12: false\n        });    \n    return {payload :\"Es wird in \" + value + \" Minuten um \" + timeString + \"h  klingeln\"};\n\n}\n\n\n/**\nEingabe: \n    msg.slots.value (Anzahl Minuten die gewartet werden soll)\n    msg.slots.room (Raum/Satellite als Ausgabe um dort zu klingeln)\n*/\nif (msg.slots.value ){\n    var dt = new Date(); // aktuelle Uhrzeit\n    dt.setMinutes( dt.getMinutes() + msg.slots.value ); // Anzahl Minuten hinzufügen\n    \n    // Wenn Bestätigung gewünscht wird\n    answer = getAnswer(msg.slots.value ,dt)\n\n    // Eingabe für cron-node\n    msg.payload = {\n        \"command\": \"add\",\n        \"name\": (new Date().getTime()), // eindeutiger Name (Millisekunden)\n        \"expression\": dt.getSeconds() + \" \" + dt.getMinutes() + \" \"+ dt.getHours() + \"  * * * *\", //cron\n        \"payload\": msg.slots.room, // Ausgabe\n        \"type\": \"str\",\n        \"limit\": 1 \n      }\n\n    \n    \n    return [msg, answer];\n}\n\n\n","outputs":2,"noerr":0,"initialize":"","finalize":"","x":330,"y":260,"wires":[["d0212a8b.b6bf18"],["41c9e25d.2b6a8c"]]},{"id":"94745508.ae7d28","type":"inject","z":"86f51c47.a1e7c","name":"FromRhasspy","props":[{"p":"slots","v":"{\"value\":2,\"room\":\"Wohnzimmer\"}","vt":"json"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":110,"y":260,"wires":[["7012fe9c.87844"]]},{"id":"41c9e25d.2b6a8c","type":"debug","z":"86f51c47.a1e7c","name":"Bestätigung der Eingabe","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":610,"y":360,"wires":[]}]

Explanation:
You have to create a cron job with the same grammar as real crons and send them to the node. For that you should format the incoming information (minute / hour:minute) to the right format. You can specify the output which will be sended later. I send the name of the satellite, where the alarm should be established, so I can ring at the right place. The example gives you also a confirmation, that the cron has been started. This sshould be sent to the satellite, where you gave the input.
You can also ask for the time of the next alarm.

Hope, someone likes it

Kay

The disadvantage of your soulution is that you loose the alarm times on a restart of node-red. I used a similiar solution for a while until i switched to an alarm (Wecker) which is handled by the home-automation system fhem. If i remember correctly you can also remove alarms from the cron-plus node which is a usefull feature to implement. I might take a look at my old flow to look how i did it. (this was not used for my timer which still only consist of a delay node as i am not using it and i did not have enough time to figure a better solution out.