Hauptmenü

Übergabe von Werten

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

Vorheriges Thema - Nächstes Thema

Superposchi

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.

MadMax-FHEM

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

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.

Ellert

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

Superposchi

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.

MadMax-FHEM

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

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.

MadMax-FHEM

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

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.

MadMax-FHEM

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