Übergabe Wert von optionalen Slots

Hallo liebe Community,

ich versuche mich gerade an einer ersten (Rechner) App und ich scheitere immer wieder.
In der Hermes-Dokumentation bin ich leider auch nicht fündig geworden, vielleicht kann mir hier jemand einen Tipp geben.

Mein Intent ist eine einfache Summenfunktion, welche bis zu drei Nachkommastellen (alle optional) erkennen soll. Wenn ich mir die Ergebnisse von sam watch so ansehe, klappt deren Erkennung auch.
Sobald der Nutzer eine Nachkommastelle nicht nennt, soll der Wert dafür einfach auf 0 gesetzt werden.

Zum eigentlichen Problem:
Wie muss ich denn meinen Code formulieren, damit in einem if-Statement ein quasi leerer Slot “true” zurückgibt?
Bisher habe ich versucht einen leeren Slot über " is None" zu erkennen, war damit aber wenig erfolgreich.

Code
zahl1 = int(intent_message.slots.ersterSummand.first().value)
if intent_message.slots.zahl1_Stelle1.first().value is None:
    decimal11 = 0
else:
    decimal11 = int(intent_message.slots.zahl1_Stelle1.first().value)
if intent_message.slots.zahl1_Stelle2.first().value is None:
    decimal12 = 0
else:
    decimal12 = int(intent_message.slots.zahl1_Stelle2.first().value)
if intent_message.slots.zahl1_Stelle3.first().value is None:
    decimal13 = 0
else:
    decimal13 = int(intent_message.slots.zahl1_Stelle3.first().value)

Ich hoffe mal ich blamiere mich jetzt nicht völlig mit dieser Frage.
schönen Sonntag & Grüße

Sehe ich das richtig, dass du für eine Zahl drei Slots verwenden willst? Wäre es nicht einfacher, direkt die ganze Zahl als Slot zu behandeln? Snips sollte das auch problemlos erkennen können mit den eingebauten Typen.

Sind in all deinen Kommandos immer alle 3 Slots enthalten? Oder wie hast du die Erkennung aufgebaut?

Ob ein Slot im Kommando enthalten war, oder nicht, kannst du zum Beispiel so prüfen:

    def on_intent(self, hermes, intent_message):
        temperature = None

        try:
            if len(intent_message.slots):
                if len(intent_message.slots.temperature):
                    temperature = int(intent_message.slots.temperature.first().value)
        except:
                pass

        if temperature:
            ...

https://hermespython.readthedocs.io/en/latest/tutorial.html#extracting-slots

Danke für die Antwort.

Ja das siehst du richtig, es sind sogar 4 Slots, drei für die Nachkommastellen und einen für den vorausgehenden Ganzzahlwert.

Das damit einhergehende Problem haben wohl schon andere vor mir festgestellt: Decimal/floating-point numbers in slots

Nein nicht immer. Bitte korrigier mich hier ruhig wenn ich etwas missverstanden habe, aber die Sprachkommandos die ich für den Intent hinterlege sollen doch so weit wie möglich jeden potentiellen Fall abbilden können. Also behandele ich die Stelle vor dem Komma als einen Slot, der immer gegeben sein muss und die anderen als optional.

Dankeschön! :slight_smile:
Leider hat das heute auf die schnelle noch nicht das gewünschte Ergebnis erzielt. Aber ich versuchs am Wochenende nochmal wenn ich mehr Kopf dafür habe, als jetzt nach Feierabend.

Verstehe. Das ist natürlich unglücklich. Habe zwar auch eine App die die Heizung steuert, hier caste ich aber gerade ohnehin auf int, Nachkommazahlen hab ich noch gar nicht probiert.

In meinen Sprachkommandos hab ich keine optionalen Slots, allerdings habe ich für ein und denselben Intent Beispiele mit und Beispiele ohne Slot (“Regnet es?”, “Wird es am Wochenende regnen?”). Mit o.g. Code lässt sich dann unterscheiden, ob der Slot drin war, oder nicht.

Siehe auch z. B.: https://github.com/patrickjane/snipsweather/blob/master/action-s710-weather.py