alexa-fhem: amazon alexa smart home skill für fhem

Begonnen von justme1968, 05 November 2016, 23:21:32

Vorheriges Thema - Nächstes Thema

sucht

Hallo zusammen,

custom skill funktioniert.

Ich habe verschiedene Readings vom meinem Pool in der Art

Redox = 492.62 mV
PH = 6.8 PH
Pooltemperatur = 0.38 °C

Ich möchte jetzt diese Werte abfragen. muss ich hier für jeden dieser Werte einen eigenen Dummy anlegen mit einen homebridgemapping in der Art state=Poolcontroller_R:Redox

und dann über status redox mir den Wert ansagen lassen.

kann man auch abfragen wert von Redox

Danke und Gruss Michael

vbs

Wäre es nicht sinnvoll, wenn alexa ein eigenes Unterforum hätte? Ich hab das Gefühl, dass hier in dem einen Thread sehr viele Fragen untergehen (inkl. meiner eigenen, aber vielleicht sind die Fragen blöd).
Ich hätte auch noch ein paar weitere inhaltliche Fragen bzw. bin auch der Meinung ein paar Bugs gefunden zu haben. Aber im Moment machts glaub ich keinen Sinn, das hier im Thread diskutieren zu wollen.

stera

Hallo vbs,

ich denke das wäre auch sinnvoll.

Bin endlich mal wieder dazu gekommen, mich mit Alexa auseinander zu setzen und vorweg herzlichen Dank an Andre und alle anderen nochmal, für die rasante weiterentwicklung  :D . Endlich funktioniert das so gut mit Guten Morgen und Gute Nacht ;o)

Beim Testen ist mir was aufgefallen.

Wenn ich im Service Simulator folgendes eingebe:



alexa, sage james r. s. h. an

Kommt folgender Request:

"intent": {
      "name": "OnIntent",
      "slots": {
        "On_Value": {
          "name": "On_Value",
          "value": "an"
        },
        "Device": {
          "name": "Device",
          "value": "s. h."
        },
        "preposition": {
          "name": "preposition"
        },
        "Room": {
          "name": "Room"
        },
        "article": {
          "name": "article"
        }
      }
    }



Kann mir jemand sagen, warum er das r. kürzt?

Info: RSH ist bei uns ein Radiosender im Norden und alexa erkennt das ja nun mal so!

Gruß,
SteRa


vbs

Ich vermute mal, dass die Erkennung nicht gut funktioniert, da dein Satz nicht zur Definition passt.
Für das OnItent sind folgende Samples definiert:
OnIntent schalte {Device} {On_Value}
OnIntent schalte {Device} {preposition} {Room} {On_Value}
OnIntent schalte {article} {Device} {On_Value}
OnIntent schalte {article} {Device} {preposition} {Room} {On_Value}


Du hast zB das Verb "schalte" gar nicht gesagt. Hast du denn ein alexa-Device, das "r.s.h." heißt?

stera

Du hast recht , mit schalte davor funktioniert es. Habe aber trotzdem  den Namen auf s. h. geandert. Ohne schalte ist die Aussage doch angenehmer ;-)

vbs

Ich verzweifele bald. Ich kapier einfach das homebridgeMapping nicht. Ich hab alles an Doku gelesen, was ich gefunden habe und mir sind nichtmal die Grundlagen klar, was das Ding überhaupt machen sollen. :/ Ich scheine da irgendwo mal gedanklich falsch abgebogen zu sein, ob komm jetzt nicht mehr auf die Spur.

Ich halte mich da an die Doku aus diesen Links:
https://wiki.fhem.de/wiki/Alexa-Fhem
https://forum.fhem.de/index.php/topic,48558.0.html

Gibt es noch woanders etwas zu lesen? Ich hab das Gefühl, Teil 2 zu lesen, aber Teil 1 noch nicht zu kennen  8)

Vielleicht kann ich ja mal einfach ein paar Fragen ins Blaue stelle. Vielleicht ergibt sich dann, was ich nicht kapiert habe.

Das Attribut homebridgeMapping wird für beide Skills am zu steuernden Gerät gesetzt und übersetzt diese Charakteristiken in die konkreten Befehle, die das Gerät versteht. Der inhalt des Attributs wird von links nach rechts ausgewertet und ist wie folgt aufgebaut:
Was sind das denn für "konkrete Befehle" und vor allem: wie werden sie mittels homebridgeMapping gebildet? Doch vermutlich set- und get-Befehle? Wann wird es denn ein get und wann ein set?

jede einzelne der characteristic konfiguraion besteht aus dem namen der characteristic gefolgt von einem = gefolgt von einer durch komma unterteilten liste von parametern
attr <device> homebridgeMapping <Characteristic1>=<param1.1>,<param1.2>,... <Characteristic2>=<param2.1>,<param2.2>,...
jeder parameter besteht entweder aus
<cmd>:<device>:<reading>
hier können nicht verwendete elemente von links nach rechts weg gelassen werden
<name>=<value>
dem schlüsselwort clear
löscht alle vorhandenen (default) paramter dieser characteristic

Also ein Parameter kann zb die Form "<cmd>:<device>:<reading>" haben. Soweit so gut. Aber wo kommt diese Syntax ins Spiel, wenn es darum geht aus einer Characteristic einen Befehl zu generieren? Was passiert mit dem Reading zB?

Und mal direkt zum ersten Beispiel im Wiki zu CustomSkills:
attr Alexa.Weckzeit homebridgeMapping Weckzeit=state,cmd=+
Also der erste Parameter ist "state". Passt für mich eigentlich nicht zu der vorher beschrieben Syntax, die besagt:
-<cmd>:<device>:<reading>
-<name>=<value>
-dem schlüsselwort clear

Also als einzelnes Wort wäre nur "clear" erlaubt, nicht "state". (?)

Nächster Parameter, "cmd=+". Passt zumindest auf die Syntx "<name>=<value>". Aber was soll cmd=+ bedeuten? Ich hab schon irgendwo gelesen, dass "+" ein Leerzeichen sein kann. Also cmd=" "? Macht ja auch keinen Sinn :( Macht man da auf einen Dummy "set myDummy +"? Auch komisch...

Bin echt dankbar für jeden, der mich hier mal auf die Spur setzen kann :)

justme1968

#1971
@stera: du hast schalte nicht mit gesagt.

@vbs: homebridgeMapping ist hier: https://forum.fhem.de/index.php/topic,48558.0.html und hier: https://github.com/justme-1968/homebridge-fhem beschrieben.

die konkreten befehle sind die die das fhem device versteht und die nicht für alle devices gleich sind. also z.b. desired-temp oder desiredTemperature oder für die temperatur oder rgb oder hsv oder RGB für die farbe.

attr Alexa.Weckzeit homebridgeMapping Weckzeit=state,cmd=+
- state ist das reading in <cmd>:<device>:<reading>. nicht verwendete teile dürfen von links nach rechts weg gelassen werden.
- + steht für ein leerzeichen und ist nötig um im mapping anzugeben das es 'kein' kommando gibt da bei einem dummy meist set <name> <wert> verwendet wird statt set <name> <cmd> <wert>


hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

a4f

Zitat von: a4f am 11 Februar 2017, 23:37:30
Hallo zusammen,

habe die aktuelle Version 0.2.0 und versuche die Heizung (Homematic-Thermostat) auszuschalten ("schalte die Heizung im Arbeitszimmer aus")
Habe folgendes konfiguriert

attr  AZ_Heizung_Clima alexaName Heizung
attr  AZ_Heizung_Clima alexaRoom Arbeitszimmer
attr  AZ_Heizung_Clima genericDeviceType thermostat
attr  AZ_Heizung_Clima homebridgeMapping On=desired-temp,cmdOn=desired-temp+on,cmdOff=desired-temp+off,valueOff=off

der richtige FHEM Befehl für das Ausschalten ist SET  AZ_Heizung_Clima desired-temp off

Alexa sagt "Ich kann das Gerät mit Namen heizung nicht schalten"

(stelle auf XX grad funktioniert)

Wenn alexa-fhem startet sehe ich im Log für das Gerät

[2/11/2017, 11:24:42 PM] [FHEM] homebridgeMapping: On=desired-temp,cmdOn=desired-temp+on,cmdOff=desired-temp+off,valueOff=off
[2/11/2017, 11:24:42 PM] [FHEM] AZ_Heizung_Clima is thermostat
[2/11/2017, 11:24:42 PM] [FHEM] AZ_Heizung_Clima has
[2/11/2017, 11:24:42 PM] [FHEM]   TargetTemperature [desired-temp]
[2/11/2017, 11:24:42 PM] [FHEM]   Custom Actuation [ValvePosition]
[2/11/2017, 11:24:42 PM] [FHEM]   CurrentTemperature [measured-temp]
[2/11/2017, 11:24:42 PM] [FHEM]   CurrentHeatingCoolingState [undefined]
  2017-02-11 23:24:42 caching: AZ_Heizung_Clima-desired-temp: off
  2017-02-11 23:24:42 caching: AZ_Heizung_Clima-ValvePosition: 0
[2/11/2017, 11:24:42 PM] [FHEM]     caching: Custom Actuation: 0 (as number; from '0')
  2017-02-11 23:24:42 caching: AZ_Heizung_Clima-measured-temp: 19.3

Also steht unter "AZ_Heizung_Clima has" keine Characteristic On
deshalb sagt mir Alexa "kann nicht schalten"

Ich habe im Thread gesehen dass eine ähnliche Frage gestellt wurde, konnte die Lösung leider nicht finden.
Bin für einen Hinweis dankbar, wie füge ich "On" richtig hinzu.

auf meine eigene Frage: habe für mich eine Lösung gefunden indem 3 Zeilen in lib/fhem.js ab der Zeile 2115 auskommentiert werden (Version 0.2.0):

  if( this.mappings.CurrentPosition || this.mappings.TargetTemperature
      || this.service_name === 'lock' || this.service_name === 'garage' || this.service_name === 'window' )
    delete this.mappings.On;

d.h. die über homebridgeMapping  vorhin definierte On Funktion nicht mehr gelöscht wird.

Jetzt funktioniert der Custom Skill sowohl mit "stelle Heizung im Arbeitszimmer auf X Grad" als auch "schalte Heizung im Arbeitszimmer aus".

Frage @justme1968: mache ich dabei eine sinnvolle Funktionalität für etwas anderes kaputt oder ist die Änderung so OK?

TWART016

Zitat von: vbs am 12 Februar 2017, 12:46:35
Wäre es nicht sinnvoll, wenn alexa ein eigenes Unterforum hätte? Ich hab das Gefühl, dass hier in dem einen Thread sehr viele Fragen untergehen (inkl. meiner eigenen, aber vielleicht sind die Fragen blöd).
Ich hätte auch noch ein paar weitere inhaltliche Fragen bzw. bin auch der Meinung ein paar Bugs gefunden zu haben. Aber im Moment machts glaub ich keinen Sinn, das hier im Thread diskutieren zu wollen.

Finde ich auch gut. Vielleicht ein Unterforum für Sprachsteuerung (Alexa, Siri, ...)

a4f

wenn ich es richtig verstehe kann man nicht direkt Status eines Device in einem Zimmer abfragen, z.B.
"wie ist der Staus von Heizung im Arbeitszimmer"

Aktuell gibt es folgende Intent-Definition:

StatusIntent {Device} status
StatusIntent status von {Device}
StatusIntent wie ist der status von {Device}
StatusIntent wie ist der status {preposition} {Room}

ich habe wie folgt ergänzt

StatusIntent status von {Device} {preposition} {Room}
StatusIntent wie ist der status von {Device} {preposition} {Room}

Dann müsste man im server.js noch folgendes ergänzen:

in dem Block
      } else if( intent_name === 'StatusIntent' ) {
        response.response.outputSpeech.text = '';
        function status(device, room) {
            ...
        }
        if( command.room || type || !device ) {
          if( command.room && device ) {
            response.response.outputSpeech.text += status.bind(this)(device, command.room);
          } else
          for( var d in this.devices ) {

die fettgedruckte Ergänzung tätigen.

@justme1968: macht es aus deiner Sicht Sinn, wenn ja könntest Du das mit aufnehmen?








cyvr1

#1975
Hallo,

dank der tollen Unterstützung hier im Forum habe ich  nun fast alles mit dem CustomSkill entsprechend eingerichtet. Es fehlt mir im Moment nur noch der Füllstandsmelder in meiner Zisterne.

Dafür gibt es ja kein "genericDeviceType", also schätze ich, dass ich mir da einen eigenen Gerätetyp definieren und mit dem hombridgeMapping arbeiten muss.

Wenn da jemand einen Tipp hat, wäre ich sehr dankbar.

EDIT:

Ein bisschen was habe ich selber hinbekommen. Ist zwar bestimmt nicht so ganz im Sinne des Erfinders, aber es funktioniert erst mal.

In der server.js unter lib habe ich folgenden Eintrag bei "StatusIntent" ergänzt:


if( device.mappings.CurrentWaterLevel ) {
    if( state ) { state.replace( ' und ', ', ' ); state += ' und ' };
    state += 'ist zu '+ device.fhem.cached(device.mappings.CurrentWaterLevel.informId)+' Prozent gefüllt';
}



Bei "homebridgeMapping" im Füllstandmesser:

clear CurrentWaterLevel=level


Funktioniert erstmal und ich bekomme bei der Abfrage zurückgemeldet "Zisterne ist zu 100% gefüllt". Soweit, so gut.

Bleibt nur noch das Problem mit dem "genericDeviceType". Ich habe zur Zeit "Security" ausgewählt, da sonst nichts passendes vorhanden ist und die Zisterne nicht beim allgemeinen Statusabruf z.B. der Fenster oder Rolläden mit ausgegeben werden soll.

Wie kann ich das eleganter lösen? Eigenes "genericDeviceType"?

----------
Stephan Krätzschmar

rizo

Ich bin gerade dabei Alexa dazu zu bringen meine Sat Sender zu schalten.

Das klappt bei manchen Sendern ganz gut.

Wenn ich z.B. sage Alexa sage TV stelle Sender auf Vox,schaltet Alexa auch auf Vox. Das gleiche wenn ich Sixx nutze.
Auch nach Zahlen schaltet Alexa vernünftig um.

Was nicht geht ist ard und rtl.

Aktion=state,verb=stelle,valuePrefix=auf,values=r.t.l:rtl;vox:vox;a.r.d.:ard;sixx:sixx

Habe wie im Code zu sehen getestet rtl mit r.t.l und bei ard mit a.r.d. Ich hatte gedacht mit verschiedenen Punkten würde es evtl. klappen, aber Pusteblume.

Diese Definition ist auch bei Slot Device hinterlegt.

Wisst ihr wie man Alexa solche Sender beibringen kann?

Die Umsetzung habe ich von Antwort 1193 hier aus dem Thread übernommen.


vbs

Zitat von: rizo am 13 Februar 2017, 10:35:25
Habe wie im Code zu sehen getestet rtl mit r.t.l und bei ard mit a.r.d. Ich hatte gedacht mit verschiedenen Punkten würde es evtl. klappen, aber Pusteblume.
Ich hab auch Probleme mit solchen Abkürzungen und hatte dafür schonmal einen eigenen Thread angelegt:
https://forum.fhem.de/index.php/topic,66946.0.html
Ich vermute mal, dass die Ursache dieselbe ist.

rizo

ja sieht nach dem gleichen Problem aus.

Wenn ich dem Custom Skill den Invocation Name TV gebe, dann kann Alexa damit auch nichts anfangen.

Man muss TV dann T.V. schreiben. Dann versteht Alexa das wenigstens.

Aber das hilft leider nicht bei den Sendern.

vbs

Zitat von: justme1968 am 12 Februar 2017, 17:53:01
attr Alexa.Weckzeit homebridgeMapping Weckzeit=state,cmd=+
- state ist das reading in <cmd>:<device>:<reading>. nicht verwendete teile dürfen von links nach rechts weg gelassen werden.
- + steht für ein leerzeichen und ist nötig um im mapping anzugeben das es 'kein' kommando gibt da bei einem dummy meist set <name> <wert> verwendet wird statt set <name> <cmd> <wert>
Ok, danke dir. Bringt schonmal etwas Licht in die Sache.

Aber was ist der Unterschied zwischen dem Parameter "<cmd>:<device>:<reading>" und dem Parameter "cmd=<wert>". Beide legen ja das cmd fest?!

Und bei der Syntax "<cmd>:<device>:<reading>":
Wenn ich schreibe "hue:wz_lampe:state", wozu ist da das "reading" gut? Allein über die ersten beiden Angaben "cmd" und "device" können doch getter und setter gebaut werden in der Art "set wz_lampe hue 80" bzw. "get wz_lampe hue".