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

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

Vorheriges Thema - Nächstes Thema

amenomade

Zitat von: justme1968 am 09 Juni 2017, 09:58:07
im übrigen bin ich der meinung das für die meisten anwender das ganze nicht sicherer wird wenn man mehr und mehr komponenten in die kette einbaut. das erhöht zum einen die ausfall gefahr und zum anderen auch die potentielle angriffs fläche. so lange man amazon vertraut (und das muss man für den smart home skill) und deren oauth token (und das tut man wenn man einen amazon account mit hinterlegten bank daten hat) und verbindungen nur mit gültigem oatuh token angenommen werden ist auch die konfiguration ohne proxy nicht unsicher. ein falsch konfigurierter von aussen erreichbarer apache oder sonstiger reverse proxy ist ein größeres risiko.

Dann müsste man vielleicht die Wiki Seite ein bisschen anpassen.
Zitat von: WIKI Alexa-FhemDie Kommunikation zwischen Amazon und FHEM ist wegen der Verwendung von SSL schon verschlüsselt - prinzipiell kann aber jeder von außen mit Alexa-Fhem kommunizieren. Man sollte sich deshalb im Klaren darüber sein, dass dies eine Sicherheitslücke darstellt: Jeder offene Port verleitet zu Angriffen, und mit zunehmender Verbreitung von Alexa steigt auch das Risiko. Es wird deshalb empfohlen, vor den eigentlichen Alexa-Server zur Absicherung einen Apache-Webserver als ReverseProxy zu setzen.
Wenn man das liest, hat man das Gefühl, dass es prinzipiell zwar verschlüsselt, aber trotzdem unsicher ist. Deine Erklärung mit dem oauth Token steht z.B. nicht drinn.

Zitathinter der proxy id steckt das man die verbindung auch von innen nach aussen aufbauen könnte. dann gibt es kein problem mehr mit dem port forwarding und auch nicht mit dslite.
Klingt gut! Wird aber wahrscheinlich schwierig zu implementieren, und schwierig zu unterstützen ;)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

oeiber

Zitat von: justme1968 am 09 Juni 2017, 09:58:07
im nächsten update gibt es eine bind-ip config option.  (fhemweb nimmt zumindest potentiell jede verbindung an. d.h. es kann sinnvoll sein diese auf ein bestimmtes netz zu beschränken. alexa-fhem nimmt im gegensatz dazu sowieso nur verbindungen an die ein gültiges event enthalten, die einen gültigen oauth token haben und die von einem konfigurierten skill kommen. weiterhin ist es nicht möglich über alexa-fhem von aussen beliebige fhem kommandos zu senden.)

Vielen Dank dafür!
Ich bin auch der Meinung, dass man das Ganze so einfach wie möglich gestalten sollte.

Die Idee, eine Reverse-Proxy zu nutzen, hatte ich als ich festgestellt habe, dass es gar nicht so einfach ist, auf meinem Smartphone eine Native-Webapp (FTUI) mit Basic-Auth zu kreieren. Beim iPhone zuminderst kommt eine Sicherheitswarnung, wenn man die Seite im Format https://user:pass@host.tld aufruft.
Seither nutze ich Apache als Reverse-Proxy und verwende Client-Zertifikate für die Authentifizierung. Ich bin mit der Lösung sehr zufrieden.
Deshalb habe ich das auch für alexa-fhem umgesetzt: Die AWS Lamda-Funktion authentifiziert sich auch mit Client-Zertifikaten an meinem Apache. Dabei wertet dieser den DN des Zertifikats aus, und berechtigt nur den Zugriff auf das Verzeichnis /alexa, nicht aber auf /fhem bzw. FTUI.

LG

Olli


amenomade

@oeiber: darf ich fragen, wie deine VirtualHost dann aussieht?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

oeiber

Zitat von: amenomade am 09 Juni 2017, 11:19:15
@oeiber: darf ich fragen, wie deine VirtualHost dann aussieht?

Aber klar doch  ;D


Apache-VirtualHost:

ServerName XXXXXX
ServerSignature Off
<VirtualHost *:80>
        RedirectPermanent / https://XXXXXX
</VirtualHost>
<VirtualHost *:443>
        SSLEngine on
        SSLProtocol all -SSLv2 -SSLv3
        SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-$
        SSLHonorCipherOrder on
        SSLCompression off
        SSLOptions +StrictRequire
        SSLCertificateFile /opt/fhem/certs/server-cert.pem
        SSLCertificateKeyFile /opt/fhem/certs/server-key.pem
        <Location />
                ProxyPass http://localhost:8080/fhem/frontend/ timeout=3600 retry=0 disablereuse=off Keepalive=off
                ProxyPassReverse http://localhost:8080/fhem/frontend/
                Require expr %{SSL_CLIENT_S_DN_CN} -strcmatch ,,*(USER)"
       </Location>
        <Location /fhem>
                ProxyPass  http://localhost:8080/fhem timeout=3600 retry=0 disablereuse=off Keepalive=off
                ProxyPassReverse http://localhost:8080/fhem
                Require expr %{SSL_CLIENT_S_DN_CN} -strcmatch ,,*(USER)"
        </Location>
        <Location /alexa>
                ProxyPass http://localhost:3000 timeout=3600 retry=0 disablereuse=off Keepalive=off
                ProxyPassReverse http://localhost:3000
                Require expr %{SSL_CLIENT_S_DN_CN} -strcmatch "*(FHEM)" || %{SSL_CLIENT_S_DN_CN} -strcmatch "*(ALEXA)"
        </Location>
        SSLProxyEngine on
        SSLOptions +stdEnvVars
        ProxyHTMLEnable off
        ProxyVia off
        SSLVerifyClient require
        SSLVerifyDepth 1
        SSLCACertificateFile /opt/fhem/proxy/fhem-ca.cer
        SSLCARevocationFile /opt/fhem/proxy/fhem-ca.crl
        SSLCARevocationCheck chain
        SetOutputFilter DEFLATE
        Protocols h2 http/1.1
</VirtualHost>


AWS Lamda Funktion:

const PORT=443;
const HOST=,"XXXXXXXt';
const PATH='/alexa';
const CERT='smarthome.crt';
const KEY='smarthome.key';
const PASSPHRASE='';

// entry
exports.handler = function(event, context, callback) {

  console.log(`EVENT: ${event}`);
  console.log(`CONTEXT: ${context}`);

  var fs = require('fs');
  var post_data = JSON.stringify(event);

  var options = {
    hostname: HOST,
    port: PORT,
    cert: fs.readFileSync(CERT),
    key: fs.readFileSync(KEY),
    passphrase: PASSPHRASE,
    //family: 6,
    path: PATH,
    method: 'POST',
    rejectUnauthorized: false, // accept self-signed
    headers: {
      'Content-Type': 'application/json',
      'Content-Length': Buffer.byteLength(post_data)
    }
  };

  var request = require('https').request(options, (result) => {
    console.log(`STATUS: ${result.statusCode}`);
    console.log(`HEADERS: ${JSON.stringify(result.headers)}`);
    result.setEncoding('utf8');
    var body = '';
    result.on('data', (chunk) => body += chunk);
    result.on('end', () => {
      console.log(`BODY: ${JSON.stringify(body)}`);
      callback(null, JSON.parse(body) );
      return;
    });
  });

  request.on('error', (e) => {
    console.log(`problem with request: ${e.message}`);
    callback(null, createError(ERROR_TARGET_OFFLINE) );
    return;
  });

  request.write(post_data);
  request.end();

  return;

}// exports.handler


Dabei wird der Code mit samt Zertifikaten bei AWS per ZIP-Datei hochgeladen.


LG

Olli

hawkeyexp

#2704
Hi zusammen, mal ne kurze Frage weil Alexa wohl ab und an ihre Launen hat :-)

Ich habe eine Dummy der weitere Aktion antriggert wenn z.B. HDMI1 seitens Alexa angesteuert wird. Allerdings hat die gute manchmal die Laune "HDMI1 " als "HDMI eins" zu liefern und manchmal als "HDMIeins". Ich habe hier versucht es im Mapping abzufangen mittels "values=hdmieins:hdmi1" was aber nicht immer sauber greift. Hat hier jemand ne bessere Lösung die sauber ans Ziel führt damit ein eingespriochenes "HDMI eins" als HDMI1 am dummy ankommt ?


-> Hat sich erledigt -< Ein Values=HDMI+eins im Mapping hat das Problem behoben.

amenomade

#2705
Problem mit Duofern und Smarthome Skill basic

Ich habe alexa-fhem in Betrieb, und versuche meine Jalousie damit zu steuern. Die Jalousien sind mit Duofern Stick mit FHEM verbunden, und lassen sich über Fhemweb gut steuern. Das Problem ist: die Position für Alexa ist umgekehrt!

Wenn ich sage: "Alexa, fahre die Jalousie auf 10%", fährt die Jalousie auf 90%.
"Alexa, fahre die Jalousie auf 80%" bringt die auf 20%

"Alexa, fahre die Jalousie auf 20%" ergibt in Log:
2017-06-11_15:58:51 ez_Rolladen ventilatingPosition: 80
2017-06-11_15:58:51 ez_Rolladen ventilatingMode: off
2017-06-11_15:58:51 ez_Rolladen sunPosition: 65
2017-06-11_15:58:51 ez_Rolladen sunMode: off
2017-06-11_15:58:51 ez_Rolladen timeAutomatic: off
2017-06-11_15:58:51 ez_Rolladen sunAutomatic: off
2017-06-11_15:58:51 ez_Rolladen dawnAutomatic: off
2017-06-11_15:58:51 ez_Rolladen duskAutomatic: off
2017-06-11_15:58:51 ez_Rolladen manualMode: on
2017-06-11_15:58:51 ez_Rolladen position: 80
2017-06-11_15:58:51 ez_Rolladen 80
2017-06-11_15:58:51 ez_Rolladen moving: stop


Gibt es eine Lösung? Das stört mich insb. weil ich andere Jalousien habe, die mit Homematic gesteuert sind, und die reagieren in die richtige Richtung!

Ich könnte wahrscheinlich durch irgendwelches Dummy + Notify die Position umwandeln, aber... seitens alexa / duofern kann man nichts tun?

Internals:
   CFGFN
   CODE       61AC5E
   DEF        61AC5E
   Duofern_stick_MSGCNT 99
   Duofern_stick_RAWMSG 0FFF0F21800050000000415014000161AC5EFFFFFF01
   Duofern_stick_TIME 2017-06-11 15:58:51
   IODev      Duofern_stick
   LASTInputDev Duofern_stick
   MSGCNT     99
   NAME       ez_Rolladen
   NR         242
   STATE      80
   SUBTYPE    RolloTron Comfort Master
   TYPE       DUOFERN
   Readings:
     2017-06-11 15:58:51   dawnAutomatic   off
     2017-06-11 15:58:51   duskAutomatic   off
     2017-06-11 15:58:51   manualMode      on
     2017-06-11 15:58:51   moving          stop
     2017-06-11 15:58:51   position        80
     2017-06-11 15:58:51   state           80
     2017-06-11 15:58:51   sunAutomatic    off
     2017-06-11 15:58:51   sunMode         off
     2017-06-11 15:58:51   sunPosition     65
     2017-06-11 15:58:51   timeAutomatic   off
     2017-06-11 15:58:51   ventilatingMode off
     2017-06-11 15:58:51   ventilatingPosition 80
     2017-06-11 15:58:51   version         1.4
   Helper:
Attributes:
   IODev      Duofern_stick
   alexaName  RolloEZ
   alexaRoom  Elternzimmer
   devStateIcon (0|opened):fts_shutter_10@green (100|closed):fts_shutter_100@red 9\d.*:fts_shutter_90 8\d.*:fts_shutter_80 7\d.*:fts_shutter_70 6\d.*:fts_shutter_60 5\d.*:fts_shutter_50 4\d.*:fts_shutter_40 3\d.*:fts_shutter_30 2\d.*:fts_shutter_20 1\d.*:fts_shutter_10 0\d.*:fts_shutter_10
   eventMap   up:auf down:zu
   genericDeviceType blind
   room       EG Elternzimmer,alexa
   webCmd     position:auf:zu:stop
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

justme1968

bei homematic und homekit und alexa bedeutet 0 unten/zu/dunkel und 100 oben/auf/hell.

im homebridgeMapping gibt es mit invert=1 die möglichkeit die richtung umzudrehen. für DUOFERN rollläden wird invert automatisch gesetzt damit die verwendete richtung zum aktor passt der scheinbar anders herum arbeit.

vielleicht hilft in deinem fall ein invert=0 im homebridgeMapping,

das geht aber nur so lange gut wie amazon keine explizite rolladen unterstützung hat und ein gesprochenes auf oder zu direkt in ein 100 bzw. 0 umwandelt.

gruss
  andre

ps: vermutlich arbeitet nur dein DUOFERN rolladen richtig herum und die homematic rollläden sind verkehrt herum angeschlossen :)
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

amenomade

Danke für die Anwort. Ich habe es gerade gelöst, indem ich in lib/fhem.js die beide Zeilen auskommentiert habe:
      if( s.Internals.TYPE == 'DUOFERN' ) {
        //this.mappings.CurrentPosition.invert = true;
        //this.mappings.TargetPosition.invert = true;

Kann man mit homebridgeMapping das Verhalten vom Standard Skill auch beeinflussen? Ist mir neu. Ich werde bisschen investigieren...
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Ich schaffe es mit homebridgeMapping nicht (hab wieder die Zeilen in lib/fhem.js aktiviert).

attr ez_Rolladen homebridgeMapping CurrentPosition=invert=0 TargetPosition=invert=0

oder
attr ez_Rolladen homebridgeMapping CurrentPosition=position,invert=0 TargetPosition=position::position,invert=0
ändert nix. Immer noch die "umgekehrte" Werte. Wie wäre das genau zu schreiben?

Wenn wir dabei sind, hätte ich gerne ein Mapping "hoch"=> "position 0" und "runter" => "position 100"
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

justme1968

was gibt alexa-fhem beim start mit --debug zum aktor aus?

hoch und runter geht nur mit dem custom skill. beispiel direkt im post mit dem download.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

amenomade

Übrigens:
Zitat von: justme1968 am 11 Juni 2017, 16:39:04
ps: vermutlich arbeitet nur dein DUOFERN rolladen richtig herum und die homematic rollläden sind verkehrt herum angeschlossen :)
Jein: die Duofern RolloTron Comfort haben ein Display, das den Wert zeigt. Und im Display steht 100% für zu, und 0% für auf ;)

Da ich alexa-fhem mit systemd starte, muss ich ein bisschen basteln, um die Log vom Start zu liefern.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

justme1968

eben weil das bei den duofern so ist wird ja invert automatisch gesetzt weil bei den anderen systemen eben 100=offen ist. wie bei einem dimmer. 100=hell, 0=dunkel. wenn das bei deinem hm aktor  nicht so ist hast du entweder levelInvert gesetzt oder das ding falsch rum angeschlossen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

amenomade

Ja, mit Homematic, hab ich levelInvert genutzt :)

[2017-06-11 17:40:31] [FHEM] ez_Rolladen is blind
[2017-06-11 17:40:31] [FHEM] ez_Rolladen has
[2017-06-11 17:40:31] [FHEM]   PositionState [moving]
[2017-06-11 17:40:31] [FHEM]   CurrentPosition [position]
[2017-06-11 17:40:31] [FHEM]   TargetPosition [position]
[2017-06-11 17:40:31] [FHEM] value2homekit_re: [ { re: '^up', to: 'INCREASING' },
  { re: '^down', to: 'DECREASING' },
  { re: '.*', to: 'STOPPED' } ]
[2017-06-11 17:40:31] [FHEM] { reading: 'moving',
  values: [ '/^up/:INCREASING', '/^down/:DECREASING', '/.*/:STOPPED' ],
  device: 'ez_Rolladen',
  informId: 'ez_Rolladen-moving',
  characteristic_type: 'PositionState',
  log:
   { [Function: bound ]
     debug: [Function],
     info: [Function],
     warn: [Function],
     error: [Function],
     log: [Function],
     prefix: 'FHEM' },
  value2homekit: {},
  value2homekit_re:
   [ { re: '^up', to: 'INCREASING' },
     { re: '^down', to: 'DECREASING' },
     { re: '.*', to: 'STOPPED' } ] }
  2017-06-11 17:40:31 caching: ez_Rolladen-moving: stop
[2017-06-11 17:40:31] [FHEM] { reading: 'position',
  invert: '0',
  device: 'ez_Rolladen',
  informId: 'ez_Rolladen-position',
  characteristic_type: 'CurrentPosition',
  log:
   { [Function: bound ]
     debug: [Function],
     info: [Function],
     warn: [Function],
     error: [Function],
     log: [Function],
     prefix: 'FHEM' } }
  2017-06-11 17:40:31 caching: ez_Rolladen-position: 40
[2017-06-11 17:40:31] [FHEM] { reading: 'position',
  cmd: 'position',
  delay: true,
  invert: '0',
  device: 'ez_Rolladen',
  informId: 'ez_Rolladen-position',
  characteristic_type: 'TargetPosition',
  log:
   { [Function: bound ]
     debug: [Function],
     info: [Function],
     warn: [Function],
     error: [Function],
     log: [Function],
     prefix: 'FHEM' } }


Kann es sein, dass ich "false" statt "0" schreiben muss?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Ne, der setzt dann
2017-06-11 17:46:21] [FHEM] { reading: 'position',
  cmd: 'position',
  delay: true,
  invert: 'false',
  device: 'ez_Rolladen',
  informId: 'ez_Rolladen-position',
  characteristic_type: 'TargetPosition',

statt invert: false
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Hab's geschaft mit:
attr ez_Rolladen homebridgeMapping clear CurrentPosition=position TargetPosition=position::position,delay=1000

"clear", um dein Code zu überschreiben. Dann muss aber alles neu definiert werden :)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus