Hauptmenü

Script für Echo Ausgabe

Begonnen von Superposchi, 08 Februar 2023, 12:49:59

Vorheriges Thema - Nächstes Thema

Superposchi

Ich habe vor einiger Zeit mal ein Snippet für die Sprachausgabe an Googlecast-Geräten gefunden und in meine myUtils übernommen.
In dem Snippet kann ein oder mehrere Googlecast-Geräte angegeben die in einer Schleife ausgelsen werden.
Aktuell stelle ich alles von Google auf Alexa um. Leider komme ich nicht dahinter wie die Schleifenkommandos geändert werden müssen, dass diese auf Echo-Geräte statt auf Googlecast-Geräte ausgelegt ist und die Einzelnamen ausliest. Einen einzelnen Echonamen kann ich natürlich angeben und das funktioniert auch, nur das Auslesen bei mehreren Device-Namen hapert.

Hier das Snippet von damals für die Googlecast-Devices
sub Sprachausgabe($$)
{
  my ($Ansage, $CastDevice)  = @_;
  my @GoogleCasts = ($CastDevice); # Namen der GoogleCast die für die Ansage "herhalten" sollen ;)
  my $ActLSGoogleCast = 0;
  my $ActGoogleCast = "";

  foreach $ActGoogleCast(@GoogleCasts)
  {
fhem("set $ActGoogleCast speak \"$Ansage\""); # Ansage absetzen
  }
}


Mein Perl ist einfach nicht so, dass ich das komplett verstehe. Muss ich an der Variablen $ActGoogleCast was ändern oder ist es einfach nur ein Platzhalter?

MadMax-FHEM

So ich DEINEN Code verstehe/lese übergibst du den Ansagetext und eine Liste/Array mit GoogleCast Geräten, die du in der Schleife durchgehst und den speak aufrufst.

Ich sehe eigentlich keinen Grund, warum das mit ECHO-Devices nicht auch gehen soll.

Du kannst ja mal den Aufruf der Sub posten, damit ich sehe, wie du die GoogleCasts aktuell übergibst und ich prüfe das mit Echos aus...
...oder du selbst, wenn du bereits Echos hast.

U.U. ist das Escapen der Anführungszeichen bzw. die Anführungszeichen generell unnötig beim Echo (schaden aber verm. nicht)...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Otto123

Zitat von: Superposchi am 08 Februar 2023, 12:49:59
Muss ich an der Variablen $ActGoogleCast was ändern oder ist es einfach nur ein Platzhalter?
Kannst Du mMn auch weglassen und durch die Laufvariable $_ ersetzen
foreach (@GoogleCasts)
  {
fhem("set $_ speak \"$Ansage\""); # Ansage absetzen
  }

Dadurch wird es klarer und anonymer :)
https://www.perl.com/article/perl-foreach-loops/
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Superposchi

Hallo Otto,

Wenn ich das richtig verstehe, würde er damit aber immer an allen Echos ausgeben, oder?

Aktuell habe ich zwei und möchte je nach Meldungsart mal auf dem einen, mal auf dem Anderen oder auf Beiden die Ansage ausgeben.

@MaMax-FHEM
Wie oben geschrieben besitze ich bereits zwei Echos.
Probiere schon den ganzen Morgen rum. Hab das Problem inzwischen gefunden. Im Aufruf war das Arrey mit Komma getrennt, es hatte sich aber nach dem Komma noch ein Leerzeichen eingeschlichen.

Im Moment versuche ich gerade die Lautstärke mit einzubauen, wobei mir das Zurücksetzen auf die Originallautstärke noch Probleme bereitet.

Superposchi

Hier mal der Aufruf so wie ich ihn bisher habe.
{Ansage("Das ist eine Testansage", "Echo_Wohnzimmer,Echo_Schlafzimmer", 50)} Wie gesagt hatte sich nach dem Koma ein Leerzeichen eingeschlichen.

Das aktuelle Snippet sieht so aus:
sub Ansage($$$)
{
  my ($Ansage, $Device, $Volume)  = @_;
  my @Echolist  = ($Device); # Namen der GoogleCast die für die Ansage "herhalten" sollen ;)
  my $Volume_old = 0;
  my $Echo  = "";

  foreach $Echo (@Echolist)
  {
$Volume_old = ReadingsVal($Echo, "volume", 50); # Volume auslsesen
      # aktuelle Lautstärke im Reading volume_saved speichern und Ansagenlautstärke setzen
                fhem("set $Echo volume $Volume");
                fhem("set $Echo sounds tuerklingel_3");
                fhem("sleep 0.3");
                fhem("set $Echo speak \"$Ansage\"");
  }
}


Bei meinen Experimenten ist mir leider aufgefallen, dass beim Aufruf immer was anderes passiert.
Mal wird alles ausgegeben, dann wieder nur die Ansage ohne den Sound oder auch umgekehrr nur der Sound ohne Ansage.
Ganz kurious, der Sound kommt im Wohnzimmer und die Ansage im Schlafzimmer.
Und es ist unabhängig von der Schreibweise. Ich kann auch alles in einen Befehl reinpacken, da sind die Ergebnisse genauso unterschiedlich.

Und wie gesagt suche ich noch eine Möglichkeit die Lautstärke nach der Ansage wieder auf den Ursprungswert zurückzusetzen. Gespeichert bekomme ich sie (aktuell nicht implementiert), aber nicht wieder zurückgesetzt.

Hätte einfach gerne ein universales Script für diverseste Ansagen und damit es nicht so in den Raum reinplatzt halt der kurze Sound davor wenn es geht.

MadMax-FHEM

Zitat von: Superposchi am 08 Februar 2023, 14:39:58
Im Moment versuche ich gerade die Lautstärke mit einzubauen, wobei mir das Zurücksetzen auf die Originallautstärke noch Probleme bereitet.

Wo liegt das Problem?

Ich habe sowas eingebaut für die Ansage bei: Alexa Film ab :)

Ich merke mir die aktuelle Lautstärke (ReadingsVal...), mache die Ansage und setze dann zurück...

Ist das "wann" zurücksetzen das Problem?
Leider gibt es kein Reading welches "anzeigt", dass eine Ansage läuft bzw. dass/wann diese zu ende ist...

Bei meinem Beispiel kenne ich die Ansagenlänge, daher habe ich einfach einen passenden sleep zwischen Ansage und Zurücksetzen...
Ich hatte auch schon mal (als ich das noch "dynamische" Ansagen im Kopf hatte) einen "Algorithmus" im Kopf (entwickelt?) wo ich die Worte gezählt habe und dann abgeschätzt habe, wann die Ansage wohl fertig sein müsste ;)

Jetzt wo ich schreibe überlege ich grad, ob ich das nicht sogar im Echodevice-Thread gepostet habe oder ich hab sogar eine bessere Lösung im Kopf: Reaktion auf ein Reading... Hmmm. Es gibt ja im Modul sowas für "Alarme", da übernimmt das Setzen/Zurücksetzen das Modul...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MadMax-FHEM

#6
Zitat
                fhem("set $Echo volume $Volume");
                fhem("set $Echo sounds tuerklingel_3");
                fhem("sleep 0.3");
                fhem("set $Echo speak \"$Ansage\"");

Wenn du willst, dass das wirkt (sleep und Reihenfolge), dann musst du alles in eine Zeile packen!

Also:


fhem("set $Echo volume $Volume ; set $Echo sounds tuerklingel_3 ; sleep 0.3 ; set $Echo speak \"$Ansage\"");


EDIT: willst du nur für den Alarm eine andere Lautstärke? Es gibt ja im Echodevice Volume und AlarmVolume (musst mal nachschauen wie das genau heißt bzw. gibt es das als Attribut)...
EDIT2: ok, andersrum ;) Man kann einstellen, mit welcher Lautstärke speak-Ansagen erfolgen sollen Attribut speak_volume / das Modul/Device stellt dann kurzzeitig (eben für den speak-Befehl) "dort hin" und anschließend wieder zurück...

Und ich denke beim Echodevice geht statt \"$Ansage\" auch einfach nur $Ansage

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Superposchi

Natürlich ist der Zeitpunkt ein Problem, aber bei mir geht es eher darum, dass die Lautstärke einfach nicht zurückgesetzt wurde. Es blieben immer die 50, die beim Aufruf mit übermittelt wurden stehen.
Aber wie gesagt, das habe ich erst mal zurück gestellt, da ich halt die Probleme mit der Ausgabe insgesamt habe, dass oftmals nur Teile wiedergegeben werden.

Dabei spielt es wie gesagt keine Rolle ob es wie ich es geschrieben hatte "als Aufzählung" oder in einem einzigen Funktionsaufruf geschrieben ist.
Mal wird ein Teil im Wohnzimmer und ein Teil im Schlafzimmer wiedergegeben, Mal wird generell nur ein Sound wiedergegeben, Mal wird nur die Ansage ohne Sound ausgegeben.
Ich erkenne bisher auch noch kein Muste darin.

Wo kann ich denn die Lautstärke für Speak einstellen? Ich sehe nur Volume und Volume_alarm. Oder gilt Volume_alarm auch für speak?

TomLee

Was du machst ist das hier:
Für die Kommandozeile (und da mal testen):
fhem("set Echo_Wohnzimmer,Echo_Schlafzimmer volume 50;;set Echo_Wohnzimmer,Echo_Schlafzimmer sounds tuerklingel_3;;sleep 0.3;;set Echo_Wohnzimmer,Echo_Schlafzimmer speak Testtext")

Also eine kurze Schreibweise eines FHEM-Befehls (Devicenamen mit Komma anzugeben, bei gleichem set-Befehl).

Vlt. geht das ja nicht bei den Echos und irgendwas kommt durcheinander, habs nicht ausprobiert.

Mach mal aus dem $Device wirklich ein Array, dann macht die Schleife auch Sinn.
Sowas würde dann auch klappen wenn es Verwendung finden soll$Volume_old = ReadingsVal($Echo, "volume", 50); # Volume auslsesenvlt. klappts ja dann.


Superposchi

Dein Text für die Kommandozeile kann nicht funktionieren, da er das Array (Echo_Wohnzimmer, Echo_Schlafzimmer) nicht aufdröseln kann - dafür ist ja eben die Schleife im Script.
Von daher verstehe ich den Kommentar nicht wirklich.

Außerdem funktioniert die Ausgabe ja grundsätzlich. Es scheint eher so, als wenn sich die Einzelbefehle überkreuzen und dadurch die Ausgabe verschluckt wird. Das spricht auch dafür, dass es immer andere Konstellationen gibt. Die Frage ist also wie man eine Überschneidung verhindert kann.

Da die Echos keine Zustandsmeldung für die Ausgabe haben wüsste ich nicht wie man das kontrollieren kann.

MadMax-FHEM

#10
Soll denn die Lautstärke für die Ausgabe per speak immer gleich hoch gesetzt werden (klar, eigene Höhe pro Echo)?

Wenn ja: siehe mein Attribut

Weiteres sollten deine Fragen bzgl. unterschiedlicher Volume ebenfalls in der Modul-Doku stehen...

Evtl. sollte/muss auch zwischen set volume und speak eine (kleine) Pause rein.
Alle Befehle gehen ja per http an die "Cloud" und von dort dann an die Echos...

EDIT: evtl. wäre die Frage auch besser im echodevice Thread aufgehoben...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Superposchi

Ich habe geplant die Echos Abends bzw. Nachts leiser bzw. Stumm zu schalten. Um sicherzustellen, dass Ansagen aber immer gehört werden sollte die Lautstärke vorher hochgesetzt werden. Das kann immer auf einen festen Wert erfolgen.

Sorry, hatte das Attribut nicht gesehen. Das macht Sinn und löst zumindest das Lautstärke Problem komplett auf.

Werde jetzt mal mit dem Sound und der Ansage ausprobieren ob das dann funktioniert.

TomLee

#12
ZitatVon daher verstehe ich den Kommentar nicht wirklich.

ZitatDein Text für die Kommandozeile kann nicht funktionieren, ...

Doch (und das ist nicht mein Text, sondern deiner/das was dein Code macht), aus
https://fhem.de/commandref_modular_DE.html#command
mal ein Ausschnitt:
ZitatKeine Angst, das Vorherige kann in FHEM auch deutlich einfacher formuliert werden als:

    define onAt at 07:00 set Lamp1,Lamp2 on-for-timer 600
...

Was spricht gegen ausprobieren ?

Zitat... da er das Array (Echo_Wohnzimmer, Echo_Schlafzimmer) nicht aufdröseln kann ...

Das ist kein Array, ich meine die richtige Bezeichnung wäre String.

Zitat
... - dafür ist ja eben die Schleife im Script.

Dein Array @Echolist beinhaltet nur ein Element, den String "Echo_Wohnzimmer, Echo_Schlafzimmer"
von daher macht die Schleife keinen Sinn.

Superposchi

ZitatWas spricht gegen ausprobieren ?
Habe ich gemacht, was denkst du woher ich weiß das es nicht funktioniert.

ZitatDas ist kein Array, ich meine die richtige Bezeichnung wäre String.
Es ist ein Array; eine Kommagetrennte Liste. Und die wird im Script von der Schleife auch sauber verarbeitet, so dass beide Echo's angesprochen werden. Komisch wo es doch ein String deiner Meinung nach ist. Offenbar meinst du da wohl falsch, sonst würde es ja nicht funktionieren.

Sorry, aber bitte versuch nicht immer alles zu vereinfachen, genau das bringt erst die Fehler rein, denn dadurch lernt man nicht, da man es nicht versteht. Geh lieber mal mal auf das beschriebene Problem ein, ansonsten verursachst du nur mehr Probleme.

Superposchi

Mit folgendem Aufruf:
{Ansage("Das ist eine Testansage", "Echo_Wohnzimmer,Echo_Schlafzimmer")}
und diesem Script-Snippet:
sub Ansage($$)
{
  my ($Ansage, $Device)  = @_;
  my @Echolist  = ($Device); # Namen der Lautsprecher
  my $Echo  = "";

  foreach $Echo (@Echolist)
  {
                fhem("set $Echo sounds kirchenglocke ; sleep 0.7 ; set $Echo speak \"$Ansage\"");
  }
}

und dem Attribut funktioniert die Ausgabe grundsätzlich.
Einzig das Problem, dass manchmal die Ausgabe nur Teilweise erfolgt bleibt bestehen. Dabei kommt es zu diversesten Konstellationen wie:
1. Ton auf beiden, Ansage nur im Schlafzimmer
2. Ton auf beiden, Ansage nur im Wohnzimmer
3. Ton auf beiden, Ansage auf beiden
4. Ton im Wohnzimmer, Ansage auf beiden
5. Ton im Schlafzimmer, Ansage im Schlafzimmer

Ich denke das die restlichen Kombinationen bei genügendem Ausprobieren sicher auch noch auftreten würden.
Frage ist also, warum wird manchmal ein Teil des Kommandos auf einem oder beiden Echos "verschluckt"?