Hallo, ich würde gerne ein generischen DOIF für Audioausgaben auf meinem Nest erstellen.
Die Auslagerung deshalb, weil der Lautsprecher normalerweise zu leise für verständliche Aussage eingestellt ist und vor der Ansage lauter und anschließend wieder zurück gestellt werden soll.
Das mit der Lautstärkeeinstellung bekomme ich hin, aber da es ja eine universelle Lösung sein soll, sollte der Ansagetext nicht festgelegt werden, sondern vom Aufruf mitgegeben werden. Zum starten des DOIF sollte ja Trigger zum Einsatz kommen. Gibt es dazu eine Möglichkeit
Zitat von: Superposchi am 20 Mai 2021, 12:10:23
Hallo, ich würde gerne ein generischen DOIF für Audioausgaben auf meinem Nest erstellen.
Die Auslagerung deshalb, weil der Lautsprecher normalerweise zu leise für verständliche Aussage eingestellt ist und vor der Ansage lauter und anschließend wieder zurück gestellt werden soll.
Das mit der Lautstärkeeinstellung bekomme ich hin, aber da es ja eine universelle Lösung sein soll, sollte der Ansagetext nicht festgelegt werden, sondern vom Aufruf mitgegeben werden. Zum starten des DOIF sollte ja Trigger zum Einsatz kommen. Gibt es dazu eine Möglichkeit
Da DOIF ein Modul ist und keine Funktion/Befehl, die man aufruft, gibt es auch keine Übergabeparameter. Man kann durch Auswertung des Events unterschiedliches Verhalten im DOIF-Device programmieren.
Ist das nicht eine "fast-Dublette" von dem hier: https://forum.fhem.de/index.php/topic,121171.msg1157817.html#msg1157817 ;)
Wo soll denn der Text herkommen?
Bzw. durch was soll denn die Ansage ausgelöst werden?
Ich habe mal sowas für das EchoDevice "geschrieben", als es noch kein extra Attribut für "Ansagen-Lautstärke" gab.
Mittlerweile macht das Modul das ja selbst...
Mal sehen, ob ich das noch finde...
...ansonsten muss es irgendwo im EchoDevice-Thread stehen (jaja, der ist halt leider lang :-\ )...
Gruß, Joachim
Es ist die gleiche Problematik.
Im anderen Threat geht es darum, dass die Ansage nicht kontinuierlich funktioniert.
Hier geht es mehr darum eine universelle Möglichkeit zu haben, dass Ansagen etwas Lauter als die sonstige Einstellung ist.
Heißt doch immer, dass man jedes Problem in einen eigenen Thread packen soll.
Wird der Echo automatisch lauter?
Ich habe nur Google Nest Geräte und mich mit dem Alexa Kram daher gar nicht auseinander gesetzt.
Macht das dann die Hardware selbst oder wird das in der Software geregelt? Vielleicht gibt es ja für die Nest Teile eine vergleichbare Funktion.
Ich hatte gehofft in einem DOIF/Notify eine Variable ($text) zu befüllen und diese in dem DOIF welches per Trigger gestartet wird als Text mit "... speak /"$Text/"" auszugeben.
Die Frage ist wie lange besteht die Variable?
Ist sie Global oder nur innerhalb eines Moduls oder innerhalb eines Devices gültig? Gibt es unterschiedliche Arten von Variablen?
Zitat von: Superposchi am 21 Mai 2021, 22:45:32
Es ist die gleiche Problematik.
Im anderen Threat geht es darum, dass die Ansage nicht kontinuierlich funktioniert.
Hier geht es mehr darum eine universelle Möglichkeit zu haben, dass Ansagen etwas Lauter als die sonstige Einstellung ist.
Heißt doch immer, dass man jedes Problem in einen eigenen Thread packen soll.
Wird der Echo automatisch lauter?
Ich habe nur Google Nest Geräte und mich mit dem Alexa Kram daher gar nicht auseinander gesetzt.
Macht das dann die Hardware selbst oder wird das in der Software geregelt? Vielleicht gibt es ja für die Nest Teile eine vergleichbare Funktion.
Ich hatte gehofft in einem DOIF/Notify eine Variable ($text) zu befüllen und diese in dem DOIF welches per Trigger gestartet wird als Text mit "... speak /"$Text/"" auszugeben.
Die Frage ist wie lange besteht die Variable?
Ist sie Global oder nur innerhalb eines Moduls oder innerhalb eines Devices gültig? Gibt es unterschiedliche Arten von Variablen?
Du kannst im Event deine Infos übergeben und in der Variablen $event auslesen.
Es macht nicht die HW, sondern das echodevice-Modul...
Es gibt 2 Lautstärken. Eine für Ansagen und dann halt eine für den Rest...
Gruß, Joachim
Also ich hab mal nach meinen alten Sachen gesucht und das gefunden: :)
D.h. ich rufe die Sub "my_Ansage" auf (z.B. aus einem notify heraus oder wegen sonstiger "Gründe" oder auch einfach per FHEMWeb "eingetippt").
Dort übergebe ich den Ansagetext und die gewünschte Lautstärke.
Dann wird die aktuelle Lautstärke gespeichert, die Lautstärke erhöht (oder gesenkt ;) ) und die Ansage auf den Google-Devices ausgegeben.
sub my_Ansage($$)
{
my ($Ansage, $Volume) = @_;
my @GoogleCasts = ("Marvin","Jarvis"); # Namen der GoogleCast die für die Ansage "herhalten" sollen ;)
my $ActLSGoogleCast = 0;
my $ActGoogleCast = "";
foreach $ActGoogleCast(@GoogleCasts)
{
$ActLSGoogleCast = ReadingsVal($ActGoogleCast, "volume", 30); # oder anderen default
# aktuelle Lautstärke im Reading volume_saved speichern und Ansagenlautstärke setzen
fhem("setreading $ActGoogleCast volume_saved $ActLSGoogleCast; set $ActGoogleCast volume $Volume");
}
foreach $ActGoogleCast(@GoogleCasts)
{
fhem("set $ActGoogleCast speak \"$Ansage\""); # Ansage absetzen
}
}
Dann gibt es wohl ein Reading, das anzeigt, dass die Ansage fertig ist?
Darauf habe ich dann ein notify, was dann "my_ResetVolume" aufruft.
Im notify übergebe ich dann das Google-Device welches "auslöst".
define nGoogleCastVolumeReset notify .*mediaPlayerState:.IDLE {my_ResetVolume($NAME)}
sub my_ResetVolume($)
{
my ($Device) = @_;
my $SavedLSGoogleCast = ReadingsVal($Device, "volume_saved", "na");
# wenn eine Lautstärke gespeichert wurde, dann wieder zurücksetzen. Ansonsten: nix ;)
if($SavedLSGoogleCast ne "na")
{
fhem("set $Device volume $SavedLSGoogleCast; setreading $Device volume_saved na");
}
}
ANMERKUNG: das ist SEHR ALT! Und noch mit dem ALTEN GOOGLECAST-Modul! Es hat funktioniert, ich habe es aber nur "spasseshalber" (weil im Forum gefragt wurde ;) ) mal "gebastelt"...
Und dann habe ich auf der Suche nach meinem "alten Zeugs" noch das hier gefunden:
https://forum.fhem.de/index.php/topic,107000.msg1008451.html#msg1008451
Gruß, Joachim
Das mit dem Ändern der Lautstärke habe ich so ähnlich wie im aufgezeigten Thread, nur ohne Reading, sondern ebenfalls nur in einer Variable - Funktioniert soweit gut.
Wenn ich deinen Code richtig verstehe, hast du diesen aber für jeden Ansagetext einzeln vorliegen oder woher nimmst du den Text und die Lautstärke? Das " = @_" sagt mir leider nichts.
Bin halt mit Perl noch weniger Vertraut als mit allem anderen - komme einfach nicht dazu.
Mein Ziel ist es eher die Angabe des Textes und die Ausgabe zu trennen. Also das $Ansage in einem DOIF/Notify zu befüllen und in einem anderen auszuwerten und ansagen zu lassen. so dass letzteres immer identisch ist und nur einmal existiert.
Das Foreach könnte ich mir schenken, da ich die Ausgabe nur auf einem Gerät haben will.
Wo ist der Unterschied zwischen "my $ActLSGoogleCast = 0;" und "my $ActGoogleCast = "";" außer das die Variable einmal auf Null und einmal auf "empty" gesetzt wird?
Ich nehme den Text und die Lautstärke "nirgends" her.
Es gibt doch einen Grund WARUM eine Ansage erfolgen soll oder nicht?
Der GRUND bestimmt doch den ANSAGETEXT oder nicht?
Die Sub ist eben "nur" eine Möglichkeit eine Ansage auszugeben mit "gewünschter" Lautstärke (je nach GRUND auch unterschiedlich, drum als Parameter -> das @_ "liest" die Parameter ein / jaja, ich weiß: man soll nix Prototyp machen und mit "shift" arbeiten / kann ja jeder wie er will / ich pers. finde Prototypen "sauberer" und alle anderen "Sprachen" die ich verwende arbeiten damit oder setzen diese sogar voraus).
Nach der Ansage (und durch das notify eben genau nach der Ansage, egal wie lang die ist) wird wieder die ursprüngliche Lautstärke eingestellt...
Beim Aufruf kann man entweder den Text direkt angeben (fix) oder vorher aus einem Reading, Attribut, Textdatei, ... "lesen" oder (so hab ich das z.B. u.a. gemacht) in einer anderen Sub "zusammenbauen", um z.B. Messwerte in die Nachricht einzubauen oder auch per Zufallsauswahl aus einer Liste vorgefertigter Texte auswählen oder oder oder...
EDIT: z.B. Bewegungsmelder löst aus oder Presence meldet, dass ich nach hause gekommen bin -> notify -> Ansage mit z.B. "Hallo, in der Wohnung war alles ok. Die Temperatur ist XGrad" (X Grad eben z.B. abgefragt von einem Device). Der Text wird eben im notify des BWM/Presence "zusammengebaut" und mittels geposteter Sub ausgegeben. Evtl. sogar je nach Uhrzeit mit untersch. Lautstärke... Daher: ich verstehe nicht so ganz WAS du eigentlich willst...
Drum ja die Frage: zu welchem Zweck DU eine Ansage willst und wo DU den Text hernehmen willst...
Gruß, Joachim
Sorry, aber wir leben offenbar wirklich in verschiedenen Welten, denn ich verstehe nicht was an meiner Ausdrucksweise so schwer zu verstehen ist.
Ich will wie du in deinem Mittelteil ausgeführt hast einen Text je nach Event zusammenstellen und auf einem meiner Lautsprecher ausgeben.
Damit dieses DOIF/Notify nicht unnötig groß wird bzw. sich doppelt und dreifacht möchte ich die Ausgabe dieses Textes outsourcen, also in ein anderes unabhängiges Device auslagern, welches dann die Lautstärke speichert, ändert, den Text ansagt und die alte Lautstärke wieder herstellt.
Outsourcen eben darum, damit ich nicht in jeder Ansage diese 3 Kommandos für die Lautstärke mit einbauen muss.
Genau das Outsourcen macht doch die Sub von mir...
...man übergibt gewünschten Text und gewünschte Ansagenlautstärke (man kann das ja auch fix immer gleich laut machen) und die Lautstärke Anpassung und "Rückanpassung" geht dann "automatisch"...
Also statt: "Speichere Lautstärke", "set Sprechdevice Ansage", "setze Lautstärke zurück" einfach: my_Ansage(Ansagetext, Lautsärke)
Gruß, Joachim
ZitatIch nehme den Text und die Lautstärke "nirgends" her.
Wieso, bei dir ist doch das Befüllen der Variablen und die Lautstärkeanpassung in der Sub drin und muss somit für jeden Text jedesmal komplett in Fhem enthalten sein.
Zitatdas @_ "liest" die Parameter ein
Welche Parameter und woher kommen diese?
Aber der Text muss doch immer irgendwo her kommen, den lässt sich fhem doch nicht einfach einfallen... ;)
Wenn du mal ein Beispiel geben würdest was du eigentlich machen willst, dann könnte man auch helfen.
WO kommt denn in deinen Gedanken der Text her?
Und WODURCH soll denn die Ansage erfolgen?
DORT dann einfach statt nur: "set Sprachausgabedevice Text" eben die Sub mit dem Text aufrufen.
Und dass die Lautstärke für die Ansage mit übergeben wird/werden kann ermöglicht halt auch unterschiedlich laute Ansagen (z.B. nachts leiser etc.)...
Gruß, Joachim
Ich habe mal ein kleines Diagramm erstellt, vielleicht wird es dann einfacher zu verstehen.
Event1 = Person kommt nach Hause
Event2 = Saugroboter ist Fertig
Event3 = Erinnerung an Geburtstag
DOIF1 = Reaktion auf Event1 in der Variable $Text auf "Marko kommt nach Hause" gesetzt wird. Anschließend Aufruf von DOIF Universal.
DOIF2 = Reaktion auf Event2 bei der die Variable $Text auf "Saugroboter ist fertig. Bitte neu Befüllen!" gesetzt wird. Anschließend Aufruf von DOIF Universal.
DOIF3 = Reaktion auf Event3 bei der die Variable $Text$ auf "xxx hat morgen Geburtstag" gesetzt wird. Anschließend Aufruf von DOIF Universal.
DOIF Universal = Speicherung der Lautstärke, Anpassung der Lautstärke, Ausgabe von $Text per "... speak "$Text", Rücksetzung der Lautstärke
DOIF Universal ist also die ausführende Sub, diese gibt es nur ein einziges Mal. Die drei DOIF's die auf die Events reagieren sind klein und überschaubar gehalten. Ändere ich die Lautstärke muss ich dies so nur ein einziges Mal machen und zwar in DOIF Universal. Ändert sich die Syntex, muss dies nur ein einziges Mal geändert werden etc.
Die DOIF's 1-3 dienen ausschließlich als Reaktion und Festsetzung des Textes. Sonst nichts.
So wie ich deine Lösung verstehe, wird von dem Event1-3 jeweils das DOIF Universal aufgerufen, das heißt, das das DOIF zigmal lediglich mit unterschiedlichen Texten existiert und gepflegt werden muss.
Gut meine Sub ist dein DOIF Universal ;)
Du rufst halt in deinen 3 DOIF für "komme heim", "Staubsauger", etc. einfach my_Ansage("$TEXT", Ansagenlautstärke) auf...
Wie geschrieben: wenn die Ansage immer gleich laut sein soll, dann kannst du doch den Teil einfach fix machen...
Die Sub kannst du doch von beliebig vielen DOIF/notify oder auch einfach manuell in FhemWeb eingetippt aufrufen...
Genau wie mein Beispiel oben mit "ich komme heim"...
Warum muss die Ansage mit Speicherung unbedint ein DOIF sein?
Warum nicht eine Sub?
EDIT: ich habe die Sub und das notify zum Zurückstellen GENAU EINMAL. Die rufe ich halt überall dort auf wo ich eben einen Text angesagt haben will inkl. "Lautstärke Wiederherstellung"... Statt eben direkt meine Echis, Googles, Sonis, ... ausgeben zu lassen...
Ändert such was, z.B. ich stelle um von Google auf Echo, dann ändere ich nur die Sub auf Ausgabe auf Echo (und muss halt beim Echo sehen wie ich das Ende der Ansage mitkriege, um wieder zurü zu stellen) und gut...
Aber egal...
Bau dir halt dein DOIF Universal, wenn du unbedingt ein DOIF willst/brauchst...
Gruß, Joachim
ZitatBau dir halt dein DOIF Universal, wenn du unbedingt ein DOIF willst/brauchst...
Brauche ich nicht zwingen und will ich auch nicht zwingend.
Ich kenne halt einfach den anderen Aufruf nicht. Wenn das so funktioniert ist das ja genau das was ich will. Ich kann aber nur mit dem arbeiten was ich kenne, deshalb die Lösung mit den verschiedenen DOIF's.
Muss ich erstmal schauen ob und wie ich deine Variante erlerne und umsetzen kann.
Ich hatte das halt so verstanden, dass der Text eben für jede Ansage in der sub festgelegt ist. Mein Fehler.
Kein Problem.
Deshalb ja als Parameter übergeben... ;)
https://wiki.fhem.de/wiki/99_myUtils_anlegen
Du kannst dir auch selber eine Sub basteln, da dann nur den Text als Parameter und in die Sub dann deinen Aufruf mit dem sleep.
Allerdings ist dein sleep ja immer gleich lang, unabhängig davon wie lang die Ansage ist (also wenn du das als Sub umsetzt).
Daher habe ich zum Zurückschalten der Lautstärke halt das notify und die 2te Sub.
Das notify reagiert halt auf das Ende der Ansage (gut nur, wenn sonst nix läuft bzw. nach der Ansage im "idle" geschalten wird).
Was bei dir dazu geht weiß ich nicht, da ich nicht weiß was dein "Ansage-Device" so zu bieten hat...
Gruß, Joachim
Werde ich mir Morgen mal in ruhe anschauen. Im Moment versuche ich dieses dämliche Kommaproblem im DOIF aus dem anderen Thread zu lösen.
Zitat von: Superposchi am 22 Mai 2021, 16:28:18
Ich habe mal ein kleines Diagramm erstellt, vielleicht wird es dann einfacher zu verstehen.
Event1 = Person kommt nach Hause
Event2 = Saugroboter ist Fertig
Event3 = Erinnerung an Geburtstag
DOIF1 = Reaktion auf Event1 in der Variable $Text auf "Marko kommt nach Hause" gesetzt wird. Anschließend Aufruf von DOIF Universal.
DOIF2 = Reaktion auf Event2 bei der die Variable $Text auf "Saugroboter ist fertig. Bitte neu Befüllen!" gesetzt wird. Anschließend Aufruf von DOIF Universal.
DOIF3 = Reaktion auf Event3 bei der die Variable $Text$ auf "xxx hat morgen Geburtstag" gesetzt wird. Anschließend Aufruf von DOIF Universal.
DOIF Universal = Speicherung der Lautstärke, Anpassung der Lautstärke, Ausgabe von $Text per "... speak "$Text", Rücksetzung der Lautstärke
DOIF Universal ist also die ausführende Sub, diese gibt es nur ein einziges Mal. Die drei DOIF's die auf die Events reagieren sind klein und überschaubar gehalten. Ändere ich die Lautstärke muss ich dies so nur ein einziges Mal machen und zwar in DOIF Universal. Ändert sich die Syntex, muss dies nur ein einziges Mal geändert werden etc.
Die DOIF's 1-3 dienen ausschließlich als Reaktion und Festsetzung des Textes. Sonst nichts.
So wie ich deine Lösung verstehe, wird von dem Event1-3 jeweils das DOIF Universal aufgerufen, das heißt, das das DOIF zigmal lediglich mit unterschiedlichen Texten existiert und gepflegt werden muss.
Es ist nicht vorgesehen eine Perlvariable an ein DOIF zu übergeben. Einen Text kannst Du in ein Reading schreiben und das UniversalDOIF darauf triggern lassen.
DOIF 1,2,3 triggern auf Event 1,2,3 und schreiben per "setreading universalDOIF ansagetext Text 1,2,3". Das UniversalDOIF triggert dann auf [$SELF:ansagetext] und führt die gewünschten Befehle aus, wie z.B.
ZitatSpeicherung der Lautstärke, Anpassung der Lautstärke, Ausgabe von ansagetext per "set Augabegerät [$SELF:ansagetext]", Rücksetzung der Lautstärke
Also deine Sub funktioniert. Jetzt hab ich auch verstanden, das die Auslagerung gar nicht als Device existiert sondern eben in der 99_myUtils.
Allerdings habe ich noch ein Problem damit, dass die Ausgabe nicht immer erfolgt. Das liegt aber offenbar an dem Google-Nest-Device.
Wenn die Aktivierung zu schnell hintereinander erfolgt, reagiert jedenfalls der Nest, es kommt aber keine Ansage. Ich denke mal da wird irgendwas im Nest-Device nicht so schnell zurückgesetzt.
Aber das muss ich mir noch genauer anschauen wann sich welche Readings verändern.
Zitat von: Superposchi am 23 Mai 2021, 14:00:33
Aber das muss ich mir noch genauer anschauen wann sich welche Readings verändern.
Ja klar, das war ja "damals" das "alte" Chromecast oder wie das hieß Modul...
Einfach mal den Eventmonitor öffnen und eine Ansage starten und sehen ob ein passendes Reading/Event das Ende der Durchsage "angiebt"...
Das dann einfach als Auslöser für das "Rücksetz-notify" nehmen...
Und wie geschrieben: die Lautstärke kann auch "fix" in der Sub gesetzt werden, dann einfach den Parameter "rausnehmen"...
Oder (wie bei mir genutzt) je nach Uhrzeit oder "Anlass" auch eine andere Ansagen-Lautstärke nehmen...
Gleiches gilt für die "Liste" der "Sprachdevices" in der Sub.
Wenn du auch bei Aufruf der Sub entscheiden willst "wo" die Ansage erfolgen soll, dann kann man die auch umbauen, dass du auch das Ausgabedevice "übergibst"...
Das ist ja das schöne an Subs: man kann da frei programmieren was man braucht.
Aufgerufen wird sie dann eben je nach Bedarf...
Und wenn man entsprechend "gute Namen" für Devices hat, dann kann man auch viel "generisch" machen, sowohl beim Definieren des notify/DOIF als auch in der Sub...
Ich würde heute verm. die Liste der Sprachdevices nicht mehr so machen, sondern evtl. eher über devsepc2array...
Aber die Sub ist auch schon wirklich lange her ;)
Viel Spaß damit, Joachim
ZitatJa klar, das war ja "damals" das "alte" Chromecast oder wie das hieß Modul...
Einfach mal den Eventmonitor öffnen und eine Ansage starten und sehen ob ein passendes Reading/Event das Ende der Durchsage "angiebt"...
Das dann einfach als Auslöser für das "Rücksetz-notify" nehmen...
Da hast du mich falsch verstanden.
Ich meinte mir die Readings ansehen um zu schauen warum manchmal die Ansage ausgesprochen wird und manchmal eben nicht. Es muss innerhalb des Googlecast Device irgendwas geben was die Ansage unterdrückt wenn irgend was nicht stimmt, zb noch eine andere Ansage läuft etc.
Deine Sub läuft komplett durch inkl. Rücksendung.
Wenn ich in der Sub die Devices durch eine Variable ersetze, wie müsste dann die Übergabe aussehen wenn mehrere Ausgabegeräte angesprochen werden sollen.
Zitat von: Superposchi am 23 Mai 2021, 15:46:24
Da hast du mich falsch verstanden.
Ich meinte mir die Readings ansehen um zu schauen warum manchmal die Ansage ausgesprochen wird und manchmal eben nicht. Es muss innerhalb des Googlecast Device irgendwas geben was die Ansage unterdrückt wenn irgend was nicht stimmt, zb noch eine andere Ansage läuft etc.
Ok.
War ja nicht sicher, ob das Event zum Zurücksetzen noch dasselbe ist ;)
Zitat von: Superposchi am 23 Mai 2021, 15:46:24
Wenn ich in der Sub die Devices durch eine Variable ersetze, wie müsste dann die Übergabe aussehen wenn mehrere Ausgabegeräte angesprochen werden sollen.
Wenn auch mehrere möglich sein sollen, dann als "array" oder String/Zeichenkette.
Z.B.
my_Ansage("Text", "Google1,Google2,Google3")
und dann in der Sub:
sub my_Ansage($$)
{
my ($Ansage, $CastDevList) = @_;
my @GoogleCasts = split($CastDevList, /,/);
}
oder so ähnlich und dann eben wie in meinem Beispiel durch die Liste "arbeiten" und aufrufen.
Geht sicher auch "schöner", bin kein Perl-Spezialist...
Wenn auch die Lautstärke als parameter bleiben soll, dann eben:
my_Ansage("Text", "Google1,Google2,Google3", 30)
sub my_Ansage($$$)
{
my ($Ansage, $CastDevList, $Volume) = @_;
my @GoogleCasts = split($CastDevList, /,/);
}
ACHTUNG: möglicher "Prototyp-Fehler", da sich ja die Anzahl der Parameter geändert hat. Drum ja in Perl usw. ohne Prototyp ("kann" ich aber nicht und will/mache ich auch nicht / andere Diskussion)
(also das "notify" könnte sich "beschweren", dass der dort verwendete Aufruf nicht [mehr] passt oder andersrum beim Ändern der Sub eine "Beschwerde" kommen, dass eben die Sub so "falsch" wäre / entweder dann ganz ohne "Prototyp", also die
my_Ansage($$) bzw.
my_Ansage($$$) in
my_Ansage ändern und dann die Parameter per "shift" abfragen... Oder so ähnlich. / es geht auch den Aufruf aus dem notify oder DOIF etc. einfach mal rauszunehmen und dann [nach dem Anpassen] wieder reinzunehmen / evtl. "passiert" auch gar nichts / wollte nur schon mal "vorwarnen"... ;) )
ABER: die Ansage wird nat. NIE wirklich "gleichzeitig" über alle Castdevices passieren, da ja in einer "Schleife" nacheinander aufgerufen wird...
Wenn du "einfach" immer ALLE haben willst (und "gute Namen" hast oder es sonst eine devspec gibt die passt) dann auch einfach per "devspec":
set GoogleCast.* speak $Text
Wenn alle GoogleCast-Devices mit "GoogleCast" beginnen.
Ansonsten halt eine andere devspec, z.B. bzgl. Typ etc.
Musst du halt sehen was es da so gibt.
Hab keine GoogleCast mehr im Einsatz...
Gruß, Joachim
Zitatmy_Ansage("Text", "Google1,Google2,Google3", 30)
Code: [Auswählen]
sub my_Ansage($$$)
{
my ($Ansage, $CastDevList, $Volume) = @_;
my @GoogleCasts = split($CastDevList, /,/);
}
Ich kenne mich mit Perl wahrscheinlich noch weniger aus, daher eine kurze Rückfrage.
Muss die Anzahl der Komma in der Sub (my @GoogleCasts = split($CastDevList
, /,/)) mit der Anzahl im Aufruf übereinstimmen oder wird in der Sub pauschal das Komma nur als Trenner angegeben?
Ich habe 2 Googlecast Geräte, also nur ein Komma. Außerdem ist die Frage interressant für den Fall, dass man eben einmal nur eins der beiden Ausgabegeräte ansprechen will.
Das Komma zwischen / und / also /,/ ist nur das Trennzeichen.
Es sollte egal sein wie viele du übergibst.
Eigentl. sogar nur einer ohne Komma...
Einfach mal probieren... ;)
split teilt die Zeichenkette in $CastDevList am Komma auf und macht daraus ein Array das dann in der foreach durchgenudelt wird...
Es darf halt im Devicenamen kein Komma sein, darf aber eh nicht (soweit ich weiß).
Ansonsten einfach einen anderen Trenner nehmen...
EDIT: theoretisch (gut praktisch nat. auch ;) ) ginge sogar für jedes übergebene Castdevice eine eigene Ansagenlautstärke... Oder eine beim Device hinterlegte Ansagenlautstärke (Stichwort userattr) und sogar unterschiedliche ja nach Tageszeit und/oder "Dringlichkeit"... Im Prinzip geht (fast) alles, man muss nur überlegen was (genau) man (wie) will und wie viel Aufwand sein darf/soll... ;)
Gruß, Joachim