Hauptmenü

Übergabe von Werten

Begonnen von Superposchi, 20 Mai 2021, 12:10:23

Vorheriges Thema - Nächstes Thema

Superposchi

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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MadMax-FHEM

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
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

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?

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MadMax-FHEM

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
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
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
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

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?

MadMax-FHEM

#8
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
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

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.

MadMax-FHEM

#10
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
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

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?

MadMax-FHEM

#12
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
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 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.

MadMax-FHEM

#14
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
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)