Seite 1 von 2

SnipsAi unter MQTT2.4 einbinden

Verfasst: 24. Nov 2019 17:42
von tomy7om
Hallo zusammen,

...nachdem ich, mit Hilfe von euch aus dem Forum, meine Steckdosen nun endlich per OH2 schalzten kann, muss ich ja "nur noch" meinen Snips-Raspi anbinden, dass ich mit den Rules arbeiten kann - und da waren sie wieder, meine Probleme...

Egal ob ich per PaperUI oder per VisualStudioCode, sprich per "snips.things"-Datei, arbeite - ich bekomme keine Kommunikation hin :?:

Per PaperUI komme ich ich bis zum Thing, welches dann auch "online" ist:
snips_thing.JPG
Wenn ich dann aber einen Channel anlegen möchte, um diesen mit meinem Item, welches vom Typ String ist, zu verbinden - bekomme ich nur den Typ "Publish trigger" angeboten?!?

Versuche ich das ganze mit "snips.things", das Beispiel habe ich aus dem englischen Forum, https://community.openhab.org/t/voice-c ... -2-4/73947
legt sich zwar der Channel an; geht aber nicht online, weil ihn irgendwas daran stört:

Channels:
Type string : Snips_Intent "Snips Intent" [
stateTopic="hermes/intent/#:state:default",
commandTopic="hermes/intent/#:state:default"
]

...mache ich das nämlich weg, geht das Thing wieder online - ich bin aber beim selben Problem wie wenn ich es per PUI anlege...?!?

Lausche ich per MQTTfx auf den Snips-Raspi, bekomme ich die Kommunikation mit...

Vielleicht hat ja jemand von euch ne Idee :?

Re: SnipsAi unter MQTT2.4 einbinden

Verfasst: 24. Nov 2019 20:22
von udo1toni
Was Du da angelegt hast, ist eine Bridge. Die Bridge ist die verbindende Brücke (sic!) zwischen Broker und Thing(s). Du musst nu als ein Generic MQTT Thing anlegen, welches mit der Bridge verbunden ist. Im Thing kannst Du dann normale Channel anlegen. Der Code im Link ist zumindest nicht ganz korrekt:

Code: Alles auswählen

Bridge mqtt:broker:SnipsAI "MQTT - SnipsAI Broker" @ "MQTT" [ 
  host="<IP of your Snips service>",
  secure=false,
  port=1883,
  qos=0,
  retainMessages=false,
  clientID="Openhab2",
  keep_alive_time=30000,
  reconnect_time=60000,
  username="<username if you added one in Snips config>",
  password="<password if you added one in Snips config>"
]
{
    Thing topic SnipsAI "MQTT - SnipsAI Thing" @ "MQTT"  {      // diese Zeile ist angepasst!!!
        Channels:
            Type string : Snips_Intent "Snips Intent" [ 
                stateTopic="hermes/intent/#:state:default",
                commandTopic="hermes/intent/#:state:default"      
            ]
    }
}
Der (leider unsichtbare) xtend-example Teil der offiziellen Doku erläutert das Format: https://github.com/openhab/openhab2-add ... xamples.md

Re: SnipsAi unter MQTT2.4 einbinden

Verfasst: 25. Nov 2019 16:49
von tomy7om
Hallo nochmal,

...ich hab jetzt mal meine PUI-Things rausgeworfen - und im VSC "deinen" Code eingefügt...
Und bekomme nun diese Meldung:
snips_thing_01.JPG
Was mache ich denn nun schon wieder falsch?!?

Der Snips-Raspi ist online und erreichbar...

LG Tom

Re: SnipsAi unter MQTT2.4 einbinden

Verfasst: 25. Nov 2019 20:07
von udo1toni
Die Settings hast Du aber schon passend gesetzt? IP des Brokers, username und passwort?

Re: SnipsAi unter MQTT2.4 einbinden

Verfasst: 26. Nov 2019 19:24
von tomy7om
Hallo nochmal,
...jep, den host hatte ich eingetragen; und den user (sollte ja der Standard-User "pi" sein?!) + mein geändertes PW auch.
Aber - nix

Bin dann hingegangen und habe den Code im VSC wieder "ausgeblendet", dass die Things wieder verschwinden.
Habe die dann wieder Schritt für Schritt per PUI angelegt:
  • zuerst den "MQTT Broker Snips" mitsamt Hostadresse, Port, User und PW
    - online
  • dann das "Generic MQTT Thing Snips", mit Verweis auf den Broker
    - online
  • dann den Channel "Snips_Intent" als Text value angelegt; noch ohne "state-" und "command-topic"
    - online
  • sobald ich aber im Channel auch nur ein topic beschreibe; z.B. das state-topic mit "hermes/intent/#:state:default"
    - geht das "Generic MQTT Thing Snips" offline - mit der Fehlermeldung die im letzten Bild ja zu sehen ist
?!?

Jetzt meine Frage; passt dieser EIntrag denn zu dem, was ich per MQTTfx mitlesen kann, wenn ich dort etwas spreche?:
MQTTfx.JPG
bzw. passt das zu dem Item, welches ich angelegt habe (aus einem Forum übernommen)?:

String Snips_Intent "Snips Intent" { mqtt="<[snips:hermes/intent/#:state:default]" }
...oder muss anstelle von "snips" in der Klammer die IP vom Snips-Raspi rein?!?

Fragen über Fragen - aber vielleicht habt ihr ja wieder Ideen :idea: für mich :?:

LG Tom

Re: SnipsAi unter MQTT2.4 einbinden

Verfasst: 27. Nov 2019 00:03
von udo1toni
Das Item passt schon mal nicht, denn das Item hat einen Link zum mqtt1 Binding, Du arbeitest aber hoffentlich mit dem mqtt2 Binding.

Weder das stateTopic noch das commandTopic darf das # enthalten, es handelt sich um nackte topics.

Die Verknüpfung im Item verweist auf den Channel. (in Paper UI kannst Du den korrekten Link anzeigen und sogar in die Zwischenablage kopieren lassen)

Re: SnipsAi unter MQTT2.4 einbinden

Verfasst: 28. Nov 2019 14:37
von tomy7om
...ja, ich versuche mit dem 2.4er Binding zu arbeiten - das klappt ja soweit auch ganz gut, inzwischen.

Nur hab ich leider keinen Plan, was bei den topics stehen muss... auch die OH-Doku bringt mich persönlich nicht wirklich weiter :-(
Das Item habe ich inzwischen auch per PUI angelegt, ist soweit auch alles gut - bis auf eben diese topics.

Die habe ich jetzt aber auch mal parallel im Snips-Forum erfragt.

LG Tom

Re: SnipsAi unter MQTT2.4 einbinden

Verfasst: 3. Dez 2019 12:15
von tomy7om
Hallo schon wieder,

...das Problem mit den "intents" ist inzwischen gelöst ;-)

Jetzt habe ich noch ein Problem mit den "rules"...

Ich habe jetzt diese "rule":
var String oh2ONOFF

rule "on_off"
when
Item Snips_Intent received update
then

logInfo("Snips Intent: ", Snips_Intent.state.toString)

var String intentName = transform("JSONPATH", "$.intent.intentName", Snips_Intent.state.toString)
var String pureIntent = intentName.split(":").get(1);
var String device_val = transform("JSONPATH", "$.slots[0].value.value", Snips_Intent.state.toString)

logInfo("Snips Gerät: ", device_val)

pureIntent = pureIntent.toLowerCase

logInfo("Snips device value: ", pureIntent)

if (pureIntent == 'einschalten') {
oh2ONOFF = "ON"
} else if (pureIntent == 'ausschalten') {
oh2ONOFF = "OFF"
}

if (device_val == 'Stehlampe') {
sendCommand(switch1,oh2ONOFF)
}
logInfo("Snips device value: ", device_val)
end
und diese "items":
Switch switch1 "SofaLicht" {mqtt=">[localhost:cmnd/tasmota-1/POWER:command:ON:1],>[localhost:cmnd/tasmota-1/POWER:command:OFF:0]"}
Switch switch2 "Licht_2" {mqtt=">[localhost:cmnd/tasmota-2/POWER:command:ON:1],>[localhost:cmnd/tasmota-2/POWER:command:OFF:0]"}
Switch switch3 "Licht_3" {mqtt=">[localhost:cmnd/tasmota-3/POWER:command:ON:1],>[localhost:cmnd/tasmota-3/POWER:command:OFF:0]"}
Switch switch4 "Licht_4" {mqtt=">[localhost:cmnd/tasmota-4/POWER:command:ON:1],>[localhost:cmnd/tasmota-4/POWER:command:OFF:0]"}
Switch switch5 "Licht_5" {mqtt=">[localhost:cmnd/tasmota-5/POWER:command:ON:1],>[localhost:cmnd/tasmota-5/POWER:command:OFF:0]"}
und das Problem, dass im LogViewer von OH2 dieser Fehler erscheint:
2019-12-03 11:54:36.696 [INFO ] [smarthome.model.script.Snips Gerät: ] - Stehlampe

2019-12-03 11:54:36.700 [INFO ] [me.model.script.Snips device value: ] - wohnzimmer

2019-12-03 11:54:36.713 [WARN ] [rthome.model.script.actions.BusEvent] - Cannot convert 'null' to a command type which item 'switch1' accepts: [OnOffType, RefreshType].

2019-12-03 11:54:36.716 [INFO ] [me.model.script.Snips device value: ] - Stehlampe
...WAS muss ich denn nun WO anpassen, dass das funzt?! - stehe mal wieder auf dem Schlauch - sorry

LG Tom

Re: SnipsAi unter MQTT2.4 einbinden

Verfasst: 3. Dez 2019 14:05
von tomy7om
...ok, bin inzwischen so weit, dass ich glaube zu verstehen, dass das "Zerlegen" des Intent nicht stimmt; hab mal noch ein paar Log-Zeilen eingefügt, und sehe dass der "pureIntent" falsch referenziert...

Hier mal der komplette Log für den EIN-Befehl
2019-12-03 13:59:30.398 [INFO ] [marthome.model.script.Snips Intent: ] - {"sessionId":"c0987ead-6b9d-401b-8c44-7f32b5654f84","customData":null,"siteId":"default","input":"stehlampe ein","asrTokens":[[{"value":"stehlampe","confidence":1.0,"rangeStart":0,"rangeEnd":9,"time":{"start":0.0,"end":1.3199999}},{"value":"ein","confidence":0.4939228,"rangeStart":10,"rangeEnd":13,"time":{"start":1.3199999,"end":1.9698691}}]],"asrConfidence":0.7027964,"intent":{"intentName":"tomy7om:Wohnzimmer","confidenceScore":1.0},"slots":[{"rawValue":"stehlampe","value":{"kind":"Custom","value":"Stehlampe"},"alternatives":[],"range":{"start":0,"end":9},"entity":"Untitled","slotName":"Geraete","confidenceScore":1.0},{"rawValue":"ein","value":{"kind":"Custom","value":"1"},"alternatives":[],"range":{"start":10,"end":13},"entity":"an_aus","slotName":"schalten","confidenceScore":0.4939228}],"alternatives":[{"intentName":null,"confidenceScore":0.07469625,"slots":[]}]}

2019-12-03 13:59:30.424 [INFO ] [smarthome.model.script.Snips Gerät: ] - Stehlampe

2019-12-03 13:59:30.429 [INFO ] [.smarthome.model.script.IntentName: ] - tomy7om:Wohnzimmer

2019-12-03 13:59:30.434 [INFO ] [.smarthome.model.script.pureIntent: ] - Wohnzimmer

2019-12-03 13:59:30.440 [INFO ] [me.model.script.Snips device value: ] - wohnzimmer

2019-12-03 13:59:30.447 [INFO ] [se.smarthome.model.script.oh2ONOFF: ] - null

2019-12-03 13:59:30.452 [WARN ] [rthome.model.script.actions.BusEvent] - Cannot convert 'null' to a command type which item 'switch1' accepts: [OnOffType, RefreshType].

2019-12-03 13:59:30.455 [INFO ] [me.model.script.Snips device value: ] - Stehlampe
Dabei ist tomy7om mein Benutzername und Wohnzimmer der Intentname; siehe Bild:
snips.JPG
Vielleicht kann mir jemand helfen das in der "rule" richtig aufzulösen?!?

LG Tom

Re: SnipsAi unter MQTT2.4 einbinden

Verfasst: 3. Dez 2019 14:11
von peter-pan
Also, wie Udo schon weiter oben geschrieben hast, benutzt du in deiner .items-Datei die Channel-Verlinkung so wie sie unter MQTT1 üblich ist, das klappt aber nicht.

Die Warnung resultiert wahrscheinlich von diesem Befehl:

Code: Alles auswählen

sendCommand(switch1,oh2ONOFF)

bzw. von der vorhergehenden Zuordnung:

Code: Alles auswählen

oh2ONOFF = "OFF"
Probiere hier mal

Code: Alles auswählen

oh2ONOFF = OFF
ohne Anführungszeichen