NEWS
Skript - Alexa Speak wenn zwei Bedingungen erfüllt
-
Hallo,
ich bastel nun schon einige Zeit mit Javascript und HomeMatic Programmen herum.
Mein Anliegen ist folgendes:
Ich setze auf der HomeMatic aus Programmen verschiedene Variablen auf "true".
Sollte sich die Variable auf "true" ändern
UND
prüfe das Objekt "alexa2.0.Echo-Devices.xxxxxx.Commands.doNotDisturb" ist auf "false"
DANN setze das Objekt "alexa2.0.Echo-Devices.xxxx.Commands.speak" auf z.B. "Achtung. xxx".Momentan habe ich aus den HomeMatic-Programmen per SimpleAPI das speak direkt gesetzt.
Allerdings fängt Alexa dann auch Nachts an diese Sprachausgaben zu tätigen.
Eine Übergangslösung war, per SimpleAPI das command.ssml zu setzen, hier wird anscheinend der do not disturb modus berücksichtigt. Dieses funktioniert allerdings bei mir nicht zuverlässig genug.Wie müsste das Javascript für diesen Fall aussehen?
-
@nils50122 sagte in Skript - Alexa Speak wenn zwei Bedingungen erfüllt:
Sollte sich die Variable auf "true" ändern
UND
prüfe das Objekt "alexa2.0.Echo-Devices.xxxxxx.Commands.doNotDisturb" ist auf "false"
DANN setze das Objekt "alexa2.0.Echo-Devices.xxxx.Commands.speak" auf z.B. "Achtung. xxx".Eine System-Variable der Rega ?
const idSV = 'hm-rega.0.xyz'; // Anpassen ! const idND = 'alexa2.0.Echo-Devices.xxxxxx.Commands.doNotDisturb'; const idSpeak = 'alexa2.0.Echo-Devices.xxxx.Commands.speak'; on(idSV, function(dp) { if(dp.state.val && !getState(idND).val) setState(idSpeak, 'Achtung.xxx'); });
-
Danke für das Skript.
Leider löst es anscheinend nicht aus.
Die rega Variable hat sich aktualisiert.
Dieser Text soll auch nur bei "true" ausgeführt werden.
Bei "false" soll ein anderer Text ausgeführt werden.
Sieht wie folgt aus:
const idSV = 'hm-rega.0.14932'; // Anpassen ! const idND = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.doNotDisturb'; const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.speak'; on(idSV, function(dp) { if(dp.state.val && !getState(idND).val) setState(idSpeak, 'Ich+habe+Regen+erkannt+und+das+Dachfenster+im+Ankleidezimmer+ist+noch+offen%21'); });
-
@nils50122 sagte:
Die rega Variable hat sich aktualisiert.
Dieser Text soll auch nur bei "true" ausgeführt werden.
Bei "false" soll ein anderer Text ausgeführt werden.So wird auch nur bei Wertänderung getriggert.
const idSV = 'hm-rega.0.14932'; const idND = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.doNotDisturb'; const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.speak'; on({id: idSV}, function(dp) { // triggert bei Aktualisierung if(!getState(idND).val) { let txt = 'anderer Text'; if(dp.state.val) txt = 'Ich+habe+Regen+erkannt+und+das+Dachfenster+im+Ankleidezimmer+ist+noch+offen%21'); setState(idSpeak, txt); } });
-
javascript.0 2020-07-10 07:20:47.824 error (2329) at processTicksAndRejections (internal/process/task_queues.js:97:5) javascript.0 2020-07-10 07:20:47.823 error (2329) at runMicrotasks (<anonymous>) javascript.0 2020-07-10 07:20:47.822 error (2329) at /opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49 javascript.0 2020-07-10 07:20:47.821 error (2329) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23) javascript.0 2020-07-10 07:20:47.820 error (2329) at /opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:608:33 javascript.0 2020-07-10 07:20:47.819 error (2329) at /opt/iobroker/node_modules/iobroker.javascript/main.js:1112:17 javascript.0 2020-07-10 07:20:47.818 error (2329) at /opt/iobroker/node_modules/iobroker.javascript/main.js:1521:17 javascript.0 2020-07-10 07:20:47.817 error (2329) at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1468:37) javascript.0 2020-07-10 07:20:47.815 error (2329) at compile (/opt/iobroker/node_modules/iobroker.javascript/main.js:1245:28) javascript.0 2020-07-10 07:20:47.814 error (2329) at Object.createScript (vm.js:263:10) javascript.0 2020-07-10 07:20:47.813 error (2329) at new Script (vm.js:88:7) javascript.0 2020-07-10 07:20:47.812 error (2329) SyntaxError: Unexpected token ')' javascript.0 2020-07-10 07:20:47.811 error (2329) ^ javascript.0 2020-07-10 07:20:47.810 error (2329) if(dp.state.val) txt = 'Ich+habe+Regen+erkannt+und+das+Dachfenster+im+Ankleidezimmer+ist+noch+offen%21'); javascript.0 2020-07-10 07:20:47.808 error at script.js.Alexa_TTS_Regenalarm_Ankleidezimmer_Soundbar_Wohnzimmer:8 javascript.0 2020-07-10 07:20:47.808 error (2329) script.js.Alexa_TTS_Regenalarm_Ankleidezimmer_Soundbar_Wohnzimmer compile failed:
-
const idSV = 'hm-rega.0.14932'; const idND = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.doNotDisturb'; const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.speak'; on({id: idSV}, function(dp) { // triggert bei Aktualisierung if(!getState(idND).val) { let txt = 'anderer Text'; if(dp.state.val) txt = 'Ich+habe+Regen+erkannt+und+das+Dachfenster+im+Ankleidezimmer+ist+noch+offen%21'; setState(idSpeak, txt); } });
-
Hatte es in der Zwischenzeit schon selber gefunden, danke.
Ich möchte nun die Anzahl der Scripts auf dem IOBroker reduzieren, bzw. hier nicht jedes mal den neuen Text definieren.
Ich ändere nun die Systemvariable "Alexa_TTS" auf der HomeMatic und beschreibe diese mit dem Ausgabetext.
Bei Aktualisierung der Systemvariable "Alexa_TTS" triggert ein HM-Programm die Rega im IOBroker zur sofortigen Aktualisierung.Wie ändere ich nun das Javascript ab, sodass es jedes mal wenn die SV aktualisiert wird, dessen Text als speak ausgibt? Natürlich unter Berücksichtigung des Do not disturb.
-
Meinst du das so, also das der Wert den du einträgst auch ausgegeben wird?
const idSV = 'hm-rega.0.14932'; const idND = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.doNotDisturb'; const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.speak'; on({id: idSV}, function(dp) { // triggert bei Aktualisierung if(!getState(idND).val) { let txt = 'anderer Text'; if(dp.state.val) txt = dp.state.val; setState(idSpeak, txt); } });
-
Genau, also es soll quasi jedes mal wenn sich die SV "Alexa_TTS" ändert dessen Inhalt (Text) ausgegeben werden.
Das aber auch nur wenn donotdisturb auf false ist.
Der Inhalt der SV "Alexa_TTS" wird von den HM-Programmen geschrieben.Mich iritiert nun ein wenig die Zeile "anderer Text", kann die nicht raus?
Idealerweise setzen wir vor senden des speak commands (alexa2.0.Echo-Devices.xxxx.Commands.speak-volume) noch die Lautstärke auf z.B. 20 (kann ruhig im Script definiert werden)
-
@nils50122 sagte:
"anderer Text", kann die nicht raus?
Ja.
const idSV = 'hm-rega.0.14932'; const idND = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.doNotDisturb'; const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands.speak'; on(idSV, function(dp) { // triggert bei Wertänderung if(!getState(idND).val) setState(idSpeak, dp.state.val); });
-
@nils50122 sagte in Skript - Alexa Speak wenn zwei Bedingungen erfüllt:
Idealerweise setzen wir vor senden des speak commands (alexa2.0.Echo-Devices.xxxx.Commands.speak-volume) noch die Lautstärke auf z.B. 20 (kann ruhig im Script definiert werden)
const idSV = 'hm-rega.0.14932'; const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands'; const ausgabelautstaerke = 20; on({id: idSV}, function(dp) { // triggert bei Aktualisierung if(!getState(idSpeak + '.doNotDisturb').val) { alexaSprich(idSpeak, dp.state.val, ausgabelautstaerke); } }); function alexaSprich(idAlexa, text, lautstaerke) { var alteLautstaerke = getState(idAlexa + '.speak-volume').val; setState(idAlexa + '.speak-volume', lautstaerke); setState(idAlexa + '.speak', text); setState(idAlexa + '.speak-volume', alteLautstaerke); }
-
Sogar mit dem setzen der alten Lautstärke, was ein Luxus
Klappt perfekt, besten Dank.Die letzte bitte:
Ich würde eine zweite SV "Alexa TTS - High Prio" für Ausgaben die DoNotDisturb nicht interessiert, anlegen.
Welchen Teil im Skript muss ich löschen?
-
@nils50122 sagte in Skript - Alexa Speak wenn zwei Bedingungen erfüllt:
Ich würde eine zweite SV "Alexa TTS - High Prio" für Ausgaben die DoNotDisturb nicht interessiert, anlegen.
Welchen Teil im Skript muss ich löschen?const idSV = 'hm-rega.0.14932'; const idSV2 = 'hm-rega.0.14933'; const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands'; const idSpeak2 = 'alexa2.0.Echo-Devices.yyDeviceIDyy.Commands'; const ausgabelautstaerke = 20; const ausgabelautstaerke2 = 50; on({id: idSV}, function(dp) { // triggert bei Aktualisierung und führt Sprachausgabe aus wenn doNotDisturb nicht gesetzt ist if(!getState(idSpeak + '.Commands.doNotDisturb').val) { alexaSprich(idSpeak, dp.state.val, ausgabelautstaerke); } }); on({id: idSV2}, function(dp) { // triggert bei Aktualisierung und führt Sprachausgabe aus auch wenn doNotDisturb gesetzt ist alexaSprich(idSpeak2, dp.state.val, ausgabelautstaerke2); }); function alexaSprich(idAlexa, text, lautstaerke) { var alteLautstaerke = getState(idAlexa + '.speak-volume').val; setState(idAlexa + '.speak-volume', lautstaerke); setState(idAlexa + '.speak', text); setState(idAlexa + '.speak-volume', alteLautstaerke); }
-
Wenn ich das richtig sehe, steuert das Skript nun zwei Devices an, oder?
Das soll schon beides auf dem selben ankommen.
-
@nils50122 sagte in Skript - Alexa Speak wenn zwei Bedingungen erfüllt:
Das soll schon beides auf dem selben ankommen.
on({id: idSV2}, function(dp) { // triggert bei Aktualisierung und führt Sprachausgabe aus auch wenn doNotDisturb gesetzt ist alexaSprich(idSpeak, dp.state.val, ausgabelautstaerke2); });
-
Anscheinend funktioniert das DoNotDisturb nicht korrekt (Übertragung IOBroker <-> Alexa).
Somit wurden wir nun schon mehrmals Nachts von der TTS geweckt.Kriegen wir es hin zusätzlich in das bereits vorhandene Skript eine Zeitprüfung (Zeitfenster 08:00 Uhr - 22:00 Uhr erlaubt, danach nicht) einzubauen?
-
@nils50122 Hier sollte doch doNotDisturb nicht beachtet werden.
Zeitprüfung:const idSV = 'hm-rega.0.14932'; const idSV2 = 'hm-rega.0.14933'; const idSpeak = 'alexa2.0.Echo-Devices.xxDeviceIDxx.Commands'; const idSpeak2 = 'alexa2.0.Echo-Devices.yyDeviceIDyy.Commands'; const ausgabelautstaerke = 20; const ausgabelautstaerke2 = 50; on({id: idSV}, function(dp) { // triggert bei Aktualisierung und führt Sprachausgabe aus wenn doNotDisturb nicht gesetzt ist if(!getState(idSpeak + '.Commands.doNotDisturb').val && compareTime("08:00", "22:00", "between")) { alexaSprich(idSpeak, dp.state.val, ausgabelautstaerke); } }); on({id: idSV2}, function(dp) { // triggert bei Aktualisierung und führt Sprachausgabe aus auch wenn doNotDisturb gesetzt ist if (compareTime("08:00", "22:00", "between")) { alexaSprich(idSpeak, dp.state.val, ausgabelautstaerke2); } }); function alexaSprich(idAlexa, text, lautstaerke) { var alteLautstaerke = getState(idAlexa + '.speak-volume').val; setState(idAlexa + '.speak-volume', lautstaerke); setState(idAlexa + '.speak', text); setState(idAlexa + '.speak-volume', alteLautstaerke); }
-
Gibt es eine Möglichkeit die Systemvariable (idSV und idSV2) nach erfolgreicher Übergabe zu leeren?
Ansonsten gibt es momentan immer das Problem, dass bei einem Neustart z.B. der Rega-Instanz, des IOBrokers, der Raspberrymatic die Systemvariable noch einmal übergeben wird.