Noch jemand aus Deutschland?

#41

Hi @zerosquared,

Mein Intent sieht so aus:

{  
   "sessionId":"f30033c8-cfe8-4ba0-876c-da750770b641",
   "customData":null,
   "siteId":"server",
   "input":"schalte das licht im wohnzimmer aus",
   "asrTokens":[  
      [  
         {  
            "value":"schalte",
            "confidence":1.0,
            "range_start":0,
            "range_end":7,
            "time":{  
               "start":0.0,
               "end":0.42
            }
         },
         {  
            "value":"das",
            "confidence":1.0,
            "range_start":8,
            "range_end":11,
            "time":{  
               "start":0.42,
               "end":0.59999996
            }
         },
         {  
            "value":"licht",
            "confidence":1.0,
            "range_start":12,
            "range_end":17,
            "time":{  
               "start":0.59999996,
               "end":0.81
            }
         },
         {  
            "value":"im",
            "confidence":1.0,
            "range_start":18,
            "range_end":20,
            "time":{  
               "start":0.81,
               "end":0.9
            }
         },
         {  
            "value":"wohnzimmer",
            "confidence":1.0,
            "range_start":21,
            "range_end":31,
            "time":{  
               "start":0.9,
               "end":1.35
            }
         },
         {  
            "value":"aus",
            "confidence":1.0,
            "range_start":32,
            "range_end":35,
            "time":{  
               "start":1.35,
               "end":2.31
            }
         }
      ]
   ],
   "intent":{  
      "intentName":"wanmet:openhabCommands",
      "probability":1.0
   },
   "slots":[  
      {  
         "confidence":1.0,
         "rawValue":"licht",
         "value":{  
            "kind":"Custom",
            "value":"Licht"
         },
         "range":{  
            "start":12,
            "end":17
         },
         "entity":"device",
         "slotName":"openhabDevice"
      },
      {  
         "confidence":1.0,
         "rawValue":"wohnzimmer",
         "value":{  
            "kind":"Custom",
            "value":"Wohnzimmer"
         },
         "range":{  
            "start":21,
            "end":31
         },
         "entity":"rooms",
         "slotName":"openhabLocation"
      },
      {  
         "confidence":1.0,
         "rawValue":"aus",
         "value":{  
            "kind":"Custom",
            "value":"aus"
         },
         "range":{  
            "start":32,
            "end":35
         },
         "entity":"command",
         "slotName":"openhabCommand"
      }
   ]
}

Das parse ich als JSON und kann so dann auf alles zugreifen. So habe ich neben SessionId und SiteId (z.B. der Raum, wo der jeweilige Snips steht) Zugriff auf den Intentnamen (hier: “wanmet:openhabCommands”) und auf die “slots”. D.h., ich weiß über openhabCommands, dass etwas geschaltet oder abgefragt werden soll. Ist es ein anderer Intentname kann ich über openHAB andere Sachen machen. Zum Beispiel über eine API Trello als Einkaufsliste benutzen.

Die Slots (hier: openhabCommand, openhabDevice, openhabLocation, openhabColor, openhabPercentage) werte ich dann aus (und zwar den value -> value). Da steht dann der Wert drin, den du in den Items in der SNIPS Console definiert hast. Bei den Items kannst du Synonyme definieren; zum Beispiel gibst du bei Elternzimmer “Schlafzimmer” als eins der Synonyme ein. Sagst du dann “Schalte das Licht im Schlafzimmer an”, übergibt SNIPS “Elternzimmer” als Wert und “schlafzimmer” als rawValue. So kannst du wirklich variieren, gibt keine Begrenzung. Du kannst ja auch ständig den Assistenten erweitern.

Zum Thema Doku: Ja, das ist ganz schön dünn. Ich habe mir andere Apps runtergeladen, die geforkt und reingeschaut, wie andere das gemacht haben. Die Hausautomatisierungsapp (HASSIO) ist ein guter Anfang oder auch die Apps von Domi (?). Das ist echt kein Hexenwerk.

Wichtig ist nur, dass du eine Action definierst (habe die von der Hausautomatisierungsapp genommen), damit via MQTT etwas übergeben wird.

Hoffe, das hilft schon weiter. Wie gut sind denn deine JavaScript-Skills?

Grüße
freddy

1 Like

#42

Hey!

Wow, das hilft mir tatsächlich schonmal weiter, ich danke Dir! Da werde ich am Wochenende ja erstmal was zum probieren haben, schauen wir mal, was ich alles so hinbekomme.

Mit Javascript habe ich ein wenig Erfahrung, hauptsächlich von der Uni mit Scripten für Websites; im Prinzip weiß ich also wie man damit umgeht - lesen geht auf jeden Fall klar und daraus kann man sich dann ja sowieso immer was basteln.

Nochmal danke, mit so einer ausführlichen, hilfreichen Antwort habe ich gar nicht gerechnet.

Grüße,
Lars

Edit: Achso, was mir noch einfällt: Wie ist deine mqtt-Broker Situation? Ich habe auf dem OpenHab-Server Mosquito laufen und momentan zu Testzwecken auf dem Snips noch den eigenen mqtt-Broker und in OpenHab dann zwei Bridges konfiguriert.
Ich hätte eigentlich gern den Snips so konfiguriert, dass er den OpenHab-Mosquitto verwendet, jedes mal wenn ich ihn so konfiguriere reagiert er aber nicht mehr auf Befehle, irgendwas timed out, ich weiß gerade nicht mehr genau, was es war.
Entweder hab ich es jedes Mal falsch gemacht oder es gibt einen Trick? Gerade diese Seiten sind in der Dokumentation aber leider nicht mehr sonderlich hilfreich, hast Du da eventuell einen heißen Tipp für mich?

0 Likes

#43

Hi @zerosquared,

dann gibt es noch ein bisschen JavaScript zum Nachtisch (Vorsicht, einfach rauskopiert, können Klammern etc. fehlen).

    Snips_Intent = getItem("Snips_Intent");
    var intent = JSON.parse(Snips_Intent.state);

    logInfo('SNIPS','Snips intent name: ' + intent.intent.intentName);

    if (!intent.intent) {
        logInfo('SNIPS','Snips_Intent is not in the expected format!');
    } else {
        logInfo('SNIPS','Snips intent name: ' + intent.intent.intentName);
    }

    // meta data
    var siteId  = intent.siteId;
    var sessionId  = intent.sessionId;

    sessions[siteId] = sessionId;

    logInfo('SNIPS','Snips Session: ' + sessionId);
    logInfo('SNIPS','Snips SiteId: ' + siteId);

    /******************** openhabCommands START ***/
    if (intent.intent.intentName == "wanmet:openhabCommands") {

        // find slots of certain types for later reference
        var commandSlot = intent.slots.filter(function (slot) {
            return (slot.slotName === 'openhabCommand');
        });
        var deviceSlot  = intent.slots.filter(function (slot) {
            return (slot.slotName === 'openhabDevice');
        });
        var locationSlot = intent.slots.filter(function (slot) {
            return (slot.slotName === 'openhabLocation');
        });
        var colorSlot = intent.slots.filter(function (slot) {
            return (slot.slotName === 'openhabColor');
        });
        var percentageSlot = intent.slots.filter(function (slot) {
            return (slot.slotName === 'openhabPercentage');
        });
        
        var command = (commandSlot.length) ? commandSlot[0].value.value.toLowerCase() : null;
        var device = (deviceSlot.length) ? deviceSlot[0].value.value.toLowerCase() : null;
        var location = (locationSlot.length) ? locationSlot[0].value.value.toLowerCase() : null;
        var color = (colorSlot.length) ? colorSlot[0].value.value.toLowerCase() : null;
        var percentage = (percentageSlot.length) ? percentageSlot[0].value.value.toLowerCase() : null; 

Anschließend kannst du schalten und walten, reagieren usw.

Gruß
freddy

2 Likes

#44

Vielen, vielen Dank!
Extrem hilfreich, da werde ich am Wochenende gut zu tun haben.
Wenn Du jetzt noch einen Tipp auf meinen Edit eben mit der mqtt-Broker-Sache hast bist Du mein persönlicher Held. :grin:

Grüße,
Lars

0 Likes

#45

Hi @zerosquared,

oh Mann, da bin ich aber wirklich an einem coolen Titel vorbeigeschlittert… Denn ich nutze tatsächlich den Snips-eigenen Broker und mehr nicht. :slight_smile:

Tendenziell würde ich mit dem Snips-eigenen Broker arbeiten, den haben die gut auf ihre Bedürfnisse abgestimmt. Was spricht denn dagegen?

Gruß
freddy

1 Like

#46

Verdammt. :sweat_smile:

Dagegen spricht so gesehen nicht viel; allerdings möchte ich meinen Snips nicht immer anhaben, sondern nur immer mal wieder - OpenHab läuft aber dauerhaft, daher braucht der auch einen durchgehend laufenden Broker für meinen ganzen Sensoren etc.

Aber gut, das finde ich auch noch raus. Und wenn es am Ende die unsaubere Lösung ist, einfach mit einem binding alles, was vom snips broker kommt auf den OH-Broker kommt und umgekehrt soll es mir auch recht sein.
Schöner wäre allerdings das Umkonfigurieren von Snips; es scheint ja möglich zu sein, er verbindet sich ja auch, nur diese mysteriösen timeouts bin ich damit noch nicht losgeworden. Aber gut, schauen wir mal…

0 Likes

#47

Hallo zusammen,

bin seit gestern auch dabei Snips mit Fhem zu verbinden und alles darüber steuern.
Habe Pi 3 b+ zuerst ohne Docker eingerichtet.
Grüße
Rover

0 Likes

#48

Ich habe das Problem, dass snips immer den falschen intent auswählt obwohl jeder einzelne slot richtig erkannt wird. Durch den falschen intent macht home assistant auch falsche Sachen. Ich habe über 50 traingexamples erstellt. Aber snips scheitert bei mir schon an Licht an und aus. Der Satz wird richtig erkannt jeder aber anstatt an wird der intent für aus ausgewählt oder anders rum…

Vielleicht kennt ja jemand das Problem.

0 Likes

#49

Hey nxd4n,

was genau meinst du mit den Slots ?

0 Likes

#50

In der snipsconsole kannst du sowas wie Variabeln definieren: - “hey snips, mache das _Küchen_licht an”
“mache das Licht in der Küche an.” (oder Bad, Stube,…) Das geht über Slots um mit dem selben Intent verschiedene Lichter bedienen zu können. I

0 Likes

#51

Das heißt, ich kann alle meine Lampen in der Wohnung steuern( Ein, Aus, Farbton , Helligkeit) ?

Was genau tragen ich dann in der configuration.yaml ?

0 Likes

#52

Ich oute mich auch mal als Deutscher :de: Hab gerade erst angefangen mit Snips. Zum experimentieren (!) hab ich hier mal einen Dockercontainer mit PulseAudio-Unterstützung hochgeladen: https://github.com/stiller-leser/snips-docker-pulseaudio (sollte allerdings nicht produktiv genutzt werden). Bin mal gespannt was sich mit Snips so alles anstellen lässt. Hab schon einige Erfahrung mit der Entwicklung für den Google Assistant. Mal schauen, was sich ergibt.

0 Likes

#53

Ich fühle mich hier ein bisschen unwohl bei so vielen Neulingen, welche doch mit Fachbegriffen um sich werfen, welche ich nicht mal kenne. :0 Verzichte schon lange auf Alexa und wollte nun eine Offline Sprachsteuerung. Jetzt bin ich endlich fündig geworden… bin aber nen Beginner in dem Thema…
Habe jetzt alles soweit installiert und Snips reagiert auch. Sprachausgabe geht über HDMI beim Pi3B+, leider kommt der Ton jedoch sehr verzögert raus.

Bisher habe ich mir folgende Hardware besorgt, um diesen Lautsprecher zu bauen: https://medium.com/@zibra_/how-to-build-a-voice-controlled-speaker-that-protects-your-privacy-ec6429a2c673
(Nun habe ich aber was von Matrix Voice gelesen, was das wohl alles zusammenfasst? Kann mir aber nicht vorstellen, dass die Mikrofone besser sind, als das aus dem Tutorial…)

Jedoch hat Snips wohl nen riesen Update bekommen, weshalb das komplett outdated ist. Versuche nun auf eigene Faut iwie mit der neuen Snips Version dem Tutorial zu folgen. Mal schauen ob ich es schaffe. :slight_smile:

0 Likes

#54

Hallo Freddy,

dein Script ist genau das wonach ich suche.
Habe mich bis jetzt mit viel zu vielen if Abfragen durchgekämpft.
Deine Lösung ist schön sauber!

Habe nur leider bisschen Probleme damit.

Ich bin auf Openhab 2.4, habe mir die Javascript Transformation installiert.
Wenn ich jetzt eine .rules Datei generiere mit deinem Script und das ein bisschen an meine Item Namen und Intentnamen anpasse, bekomme ich folgende Fehlermeldung in der Openhab LogConsole:

2019-02-27 12:38:56.139 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model ‘test.rules’ has errors, therefore ignoring it: [21,22]: no viable alternative at input ‘=’
[30,63]: missing ‘)’ at ‘{’
[32,10]: mismatched input ‘)’ expecting ‘}’
[33,63]: missing ‘)’ at ‘{’
[35,10]: mismatched input ‘)’ expecting ‘end’

Hier meine Rules Datei:

Meine Änderungen sind
Zeile 1-4 (damit die Rule greift)
Zeile 6 (getItem auf mein Item angepasst)
Zeile 27 (meinen Intentnamen angepasst)
Zeile 31 (meinen Slotnamen angepasst)

    rule "Snips"
when 
Item Snips_Intent_MQTT received update
then 

Snips_Intent = getItem("Snips_Intent_MQTT");
var intent = JSON.parse(Snips_Intent.state);

logInfo('SNIPS','Snips intent name: ' + intent.intent.intentName);

if (!intent.intent) {
    logInfo('SNIPS','Snips_Intent is not in the expected format!');
} else {
    logInfo('SNIPS','Snips intent name: ' + intent.intent.intentName);
}

// meta data
var siteId  = intent.siteId;
var sessionId  = intent.sessionId;

sessions[siteId] = sessionId;

logInfo('SNIPS','Snips Session: ' + sessionId);
logInfo('SNIPS','Snips SiteId: ' + siteId);

/******************** openhabCommands START ***/
if (intent.intent.intentName == "cirkator:LampenAnSchalten") {

    // find slots of certain types for later reference
    var commandSlot = intent.slots.filter(function (slot) {
        return (slot.slotName === 'value');
    });
    var deviceSlot  = intent.slots.filter(function (slot) {
        return (slot.slotName === 'openhabDevice');
    });
    var locationSlot = intent.slots.filter(function (slot) {
        return (slot.slotName === 'openhabLocation');
    });
    var colorSlot = intent.slots.filter(function (slot) {
        return (slot.slotName === 'openhabColor');
    });
    var percentageSlot = intent.slots.filter(function (slot) {
        return (slot.slotName === 'openhabPercentage');
    });
    
    var command = (commandSlot.length) ? commandSlot[0].value.value.toLowerCase() : null;
    var device = (deviceSlot.length) ? deviceSlot[0].value.value.toLowerCase() : null;
    var location = (locationSlot.length) ? locationSlot[0].value.value.toLowerCase() : null;
    var color = (colorSlot.length) ? colorSlot[0].value.value.toLowerCase() : null;
    var percentage = (percentageSlot.length) ? percentageSlot[0].value.value.toLowerCase() : null; 

Muss ich noch im Openhab irgendetwas umstellen damit Javascript funktioniert?
Wäre für Hilfe sehr dankbar!
Und Danke dass du deine Lösung bereitstellst!

0 Likes

#55

Hi @cirkator,

ich denke, da ist noch etwas unklar. Ich beschreibe mal meine Situation.

  • Die Regel ist keine DSL-Rule, sondern eine jsr223. Ich benutze die JS-Lib von @lewie (aus dem OH-Forum). https://www.openhab.org/docs/configuration/jsr223-js.html
    -> Deswegen kann das mit deiner .rules nicht klappen.

  • Du musst im Ordner automation/jsr223 (in conf) die Regel mit .js anlegen

  • Dann musst du die jslib (https://github.com/lewie/openhab2-javascript) in den Ordner reinkopieren.

  • Wichtig: Es gibt eine Version bis OH 2.3 und eine ab OH 2.4!

  • Auf der Ebene kannst du dann die Datei anlegen.

  • Wichtig: load(’/srv/openhab2-conf/automation/jsr223/jslib/JSRule.js’); -> Ganz oben in die Datei, Pfad ggf. anpassen

  • Um die Regel drum herum muss dann oben:
    JSRule({
    name: “Snips”,
    description: “Most simple spelling live”,
    triggers: [
    UpdatedEventTrigger(“Snips_Intent”)
    ],
    execute: function( module, input){
    HIER KOMMT DEIN CODE REIN
    }
    });

Ist blöd formatiert, aber das bekommst du hin, denke ich.

Versuch das mal, dann schauen wir weiter. Wir bekommen das schon hin. :slight_smile:

Gruß
Fredddy

0 Likes

#56

Hi, danke dir für die schnelle und detaillierte Antwort.
Das sollte ich so schon hinbekommen, werds am Abend hoffentlich probieren können.

Paar Fragen hab ich noch:

Gibts einen Grund warum du das in Javascript machst und nicht mit den OH rules?

Weißt du ob es mit der OH DSL Sprache auch gehen würde? Will mir ungern ein paar Addons installieren wenns nicht sein muss. Wird auf Dauer einfach unübersichtlicher.

Kenne mich mit Javascript leider nicht aus, mit den OH rules hab ich das Gefühl dass ich da im OH Forum mehr Material und Snippets finde. Kann ich mir mit deinem Script die Variablen befüllen lassen und die dann mit OH .rules weiterverarbeiten?

Wäre es für dich in Ordnung, wenn ich (nachdem wir da nochmal genauer drüber gesprochen haben) dein Script im OH Forum reinstelle und die Profis dort frage ob sowas auch mit OH rules zu bewerkstelligen wäre?

Danke und LG

0 Likes

#57

Hi @cirkator,

Fragen kostet nix. :grin:

Warum JS?

  • Weil ich das besser kann.
  • Weil DSL in OH ein Auslaufmodell ist.
  • Weil JS flexibler ist für das, was ich noch vorhabe.

In OH wird sich jython und JS durchsetzen.

Geht das mit DSL?

Davon habe ich mich inspirieren lassen.

Ich denke, du könntest Items befüllen und dann in DSL auswerten. Besser wäre es dann aber, direkt alles in DSL zu machen. Das Skript von ysc ist ein guter Anfang.

Braucht man für JSR223 ein extra Binding? Kann ich mich gar nicht mehr dran erinnern.

Du kannst den Code gerne im OH Forum posten. :slight_smile:

Gute Nacht
Freddy

0 Likes

#58

Deutsche!? Hier?!

… das kann ich nicht glauben. :sunglasses::nerd_face::innocent:

0 Likes

#59

Willkommen! :slight_smile:

0 Likes

#60

Ich möchte snips gerne als Server auf meiner Synology im Docker laufen lassen, da diese eh 24h läuft.
raspi2 dann als Satellit.

Hat schon jemand snips als Server auf einem Rasp2 am laufen gehabt? Dann könnte ich damit mal die ersten Versuche starten.
Mein Rasp3 ist im Moment die Homematic Zentrale und im Synology Docker läuft iobroker.
Vielen Dank schon mal

0 Likes