FHEM Forum

FHEM => Frontends => FHEMWEB => Thema gestartet von: schwatter am 14 März 2026, 17:25:25

Titel: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 14 März 2026, 17:25:25
Hallo zusammen,

ich möchte euch das Projekt "VoiceControl" vorstellen. Mit dem JavaScript voicecontrol.js ist es möglich, Sprachbefehle direkt im Browser in Text umzuwandeln (Speech-to-Text) und an FHEM zu übertragen.

Das Konzept:
Die erkannten Befehle werden im Device "global" im Reading "STT" abgelegt. Dieses Reading dient als zentraler Einstiegspunkt und kann ganz flexibel über ein notify, DOIF oder andere Event-Handler ausgewertet werden.

Es gibt zwei Varianten:

1. Web-Variante (voicecontrol.js):
Ideal für die Nutzung am Desktop oder auf mobilen Geräten. Unterstützt Push-to-Talk und einen bedingt Always-On-Modus.

2. Hardware-Variante (voicecontrol_echo_s3r.js):
In Verbindung mit einem M5Stack Atom Echo S3 kann eine dedizierte Hardware-Lösung realisiert werden, die permanent auf ein Wakeword lauscht.

Wichtiger Hinweis zur Kompatibilität:
Da das System im Backend die Google Web Speech API nutzt, funktioniert es aktuell nur Chrome basierten Browsern (z. B. Chrome, Edge, Fully Browser). Firefox unterstützt diese API derzeit leider nicht.

Dokumentation & Wiki:
Eine detaillierte Anleitung zur Einrichtung und Beispiele für die Auswertung findet ihr im Wiki:
https://wiki.fhem.de/wiki/FHEMWEB/VoiceControl:_Web-STT_%26_Hardware-Wakeword

Alle benötigten Dateien findet ihr im Anhang. Viel Spaß beim Ausprobieren!

Gruß
schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 14 März 2026, 17:39:01
Aso, ich hatte auch mit webkitSpeechRecognition gespielt. Aber mein Chrome lässt mich nicht das Mikro
unter http freischalten. Da ist wohl https erforderlich  :( Oder irre ich mich?

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: Dr. Boris Neubert am 14 März 2026, 19:22:58
Zitat von: schwatter am 14 März 2026, 17:25:25defmod VoiceControl dummy
attr VoiceControl readingList state
attr VoiceControl room Test
attr VoiceControl setList state

setstate VoiceControl off
setstate VoiceControl 2026-03-14 17:24:00 state off

Wie ist denn das Widget mit dem Dummy verknüpft? Braucht man da nicht noch ein widgetOverride?
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 14 März 2026, 20:07:15
Das ist in dem JS voicebutton.js fest drinne

    function voiceOn() {
      console.log("Voice ON");
      FW_cmd('/fhem?cmd=set VoiceControl state on&XHR=1');
    }

    function voiceOff() {
      console.log("Voice OFF");
      FW_cmd('/fhem?cmd=set VoiceControl state off&XHR=1');
    }

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 14 März 2026, 20:24:34
Oh,

ok ich bin etwas weiter. Wer wie ich noch http benutzt kann in Chrome z.B
chrome://flags/#unsafely-treat-insecure-origin-as-secure aktivieren und in dem Feld
darunter den Link zu Fhem eintragen: http://192.168.1.76:8084
Jetzt habe ich zugriff auf das Mikro, bzw es ist freigeschaltet. Ich schaue mal.

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 14 März 2026, 20:42:34
Super,

jetzt funktioniert es. Am Laptop spinnt das Mikro. Konnte auf dem Handy gerade erfolgreich in den
state vom Dummy VoiceControl VoicetoText übertragen. Dazu beim sprechen den Button halten.
Update im ersten Post.

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: rudolfkoenig am 14 März 2026, 21:29:53
Ich habe f18.js mit STT erweitert.

Im Select-Style/f18 Menu gibt es einw STT Option, was das Micro oben einschaltet.

Beim Druecken auf das Micro kommt ein Dialog, da kann man was sagen, und das Ergebnis zu FHEM schicken.
In FHEM wird im dazugehoerigen FHEMWEB ein STT Reading gesetzt bzw. ein Event ausgeloest.
Die Sprache (DE oder EN) haengt vom "attr global language" ab, Voreinstellung ist EN.
Ich habe es mit Chromium, deutsch und englisch getestet. Es funktioniert auch ohne https.
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 14 März 2026, 21:57:02
Funktioniert!  :)

Aber bei mir mit http auf Chrome Android auch erst nachdem ich Insecure... aktiviert habe.
Vorher wird das Micro nicht aktiviert.

Edit:
Und bei mir werden relativ schnell doppelte/dreifache Wörter aufgenommen.
setstate WEBphone 2026-03-14 21:59:52 STT EsszimmerEsszimmerEsszimmerEsszimmer Licht Licht aus
Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 14 März 2026, 22:13:54
Update im ersten Post.
Beispiel notify für den Voicebutton hinzugefügt.

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: Beta-User am 15 März 2026, 08:35:25
Wow!

Vielen Dank erst mal an euch beide!!! Kommt mir vor wie Ostern und Weihnachten zusammen ;D .

Habe erst mal zum Testen Rudis Variante aktiviert, weil das "direkt in FHEM" ohne große Umwege für die Allgemeinheit zur Verfügung steht. Erste Eindrücke (http):

- unter firefox@Linux kam "SpeechRecognition Interface missing"
- selbes Gerät, Chromium: Dialogfeld öffnet sich, aber ohne die Einstellung "chrome://flags/#unsafely-treat-insecure-origin-as-secure" passiert nichts. Wenn das für die FHEMWEB-Instanz freigegeben wird, kommt die Anfrage, ob man das Mikro freigeben will => OK. Leider wird dann aber immer noch nichts aufgenommen, das Mikro an sich ist aber an.

- firefox unter Android: wieder "SpeechRecognition Interface missing"
- chrome, Android: Nach Freigabe von "unsafely" und Mikrozugriff: Aufnahme, aber mit Wortwiederholungen (s.u.)
- fully, Android: Funktioniert ootb, aber mit Wortwiederholungen

Wortwiederholungen meint: Aus "Das ist ein Test" wird "setstate WEB 2026-03-15 07:19:02 STT dasdas istdas ist ein Test".
Es werden also (bereits im Dialogfeld so sichtbar) alle bereits erkannten Bestandteile wiederholt, sobald das nächste Wort fertig ist.

Ich vermute, dass man das Dialogfeld nach jedem Wort erst wieder leeren sollte?


Anmerkungen, Wünsche und Anregungen ::) :

Zum etwas größeren Bild, was schwebt mir eigentlich vor?

Verschiedene Endgeräte sollen dialogisch (per Sprachein- und -ausgabe) mit FHEM interagieren können.

Also sowas sollte möglich sein:
Zitat von: Beta-User am 19 November 2025, 07:31:05(ich) "Mach deutlich lauter"
(Handy) "soll das Radio im Wohnzimmer oder in der Küche lauter gemacht werden?"
(Anm: Sowas kann bei RHASSPY vorkommen, wenn grade beide Audio-Geräte angeschaltet sind und unklar ist, in welchem Raum sich der Sprechende befindet...)

Oder für sowas:
(ich) "Schalte den Fernseher aus"
(Handy) "soll ich wirklich den Fernseher ausschalten?"
(ich) "ja, mach!" (oder "ja bitte")
(Handy) "wird erledigt" (oder "okay", "aber gerne doch", "Aye, Sir!" usw.)

Hier läuft sowas (zumindest im Moment) mit RHASSPY, das ginge aber wohl genausogut mit Babble oder anderen FHEM-Methoden.

Dazu notwändig wäre m.E., dass man
Vermutlich liese sich der f18-js-Teil relativ leicht dahingehend aufbohren, dass zumindest klar ist, welche IP-Adresse das betreffende Endgerät hat, super wäre, direkt die betreffende Browser-Seite (asynchron) wieder ansprechen zu können (jedenfalls, solange diese offen ist). Keine Ahnung, ob das besonders kompliziert wäre...

Viele Wünsche, ich weiß O:-) .
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 15 März 2026, 08:54:52
Moin,

- Ich finde FHEMWEB nicht ideal. Besser sowas wie global. Das ist leichter bei mehreren FHEMWEB's. Ein Knotenpunkt. Deswegen habe ich den dummy.
- Zu Dialog führen. Kann der Text nicht einfach per notify an Rhasspy weitergereicht werden?

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 15 März 2026, 09:49:01
Update im ersten Post - voicecontrol.js

- Der Text wird jetzt mit setreading nach global STT geschrieben. Dummy fällt weg.
- Es gibt eine 2te Bubble für den erkannten Text.

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: Beta-User am 15 März 2026, 09:53:09
Zitat von: schwatter am 15 März 2026, 08:54:52- Zu Dialog führen. Kann der Text nicht einfach per notify an Rhasspy weitergereicht werden?
RHASSPY hat eine NotifyFn() und setzt -abängig von der Konfiguration- NOTIFYDEF derzeit maximal auf "TYPE=(AMADCommBridge|AMADDevice|ROOMMATE|GUEST),global"

AMAD.* ist der "historische" Weg, um über TTS-Ereignisse und das Ende von Sprachausgaben informiert zu werden, ROOMMATE und GUEST dienen zum Chatten (hier via Telegram). In allen Fällen wird "angefragter Text" dann an Rhasspy bzw. die dortige Intent-Auswertung übergeben und das Ergebnis dann wieder in FHEM verarbeitet, alles selbstredend asynchron. RHASSPY "merkt" sich dabei, wohin ggf. dann welche Rückmeldung von Rhasspy zu senden ist, so dass auch - theoretisch - viele parallele Sitzungen möglich sind.

 
Zitat von: schwatter am 15 März 2026, 08:54:52- Ich finde FHEMWEB nicht ideal. Besser sowas wie global. Das ist leichter bei mehreren FHEMWEB's. Ein Knotenpunkt. Deswegen habe ich den dummy.
Für meine Zwecke ist es letztlich egal, wo das Event ausgelöst wird. Das NOTIFYDEF auf TYPE=FHEMWEB auszuweiten wäre jedenfalls kein Problem, und auch (in den meisten Installationen) begrenzter als alle dummy-TYPE-Instanzen mit auszuwerten. Events an "global" (zusätzlich anders) auszuwerten ginge selbstredend auch.

Unabhängig davon: AMADCommBridge nimmt die TTS-Info entgegen UND auch die Info, von welcher AMADDevice-Instanz die Anfrage stammt. So kann RHASSPY die zu sprechende Antwort genau dahin schicken, wo die Anweisung ursprünglich her war. (Für ROOMMATE|GUEST ist es sowieso klar).
Für meine Zwecke MUSS es also in jedem Fall eine zweite Info geben, wohin die Antwort (bzw. ggf. Rückfrage...) gesendet werden soll.

"Schön" wäre es, wenn auch das Ende einer von FHEM ausgelösten Sprachausgabe signalisiert werden könnte, und dafür erscheint mir "global" nicht der passende Ort zu sein; das ist bei FHEMWEB schon schwierig, weil da ja mehrere Sitzungen offen sein können...
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: rudolfkoenig am 15 März 2026, 11:03:52
Das Firefox Problem habe ich jetzt in Prinzip (s.u.) gefixt.
Zum Aktivieren muss in about:config media.webspeech.recognition.enable auf true gesetzt werden.
Dann oeffnet sich das Dialog, nach Sprachaufnahme kommt aber die Meldung: Error connecting to the service.
Chrome@Android meldet bei mir nichtmal Audio started, keine Ahnung, was da falsch laeuft.

Die Doppelung der Texte lag vielleicht an stt.interimResults=true, das habe ich jetzt entfernt.
Bei mir hat das keinen Unterschied bewirkt.

Die anderen Punkte:
- eine eindeutige Zuordnung des Clients ist kein Problem, will aber (mit dem Rest auch) abwarten, welchen Weg wir gehen wollen
- Sprachausgabe ist laut Doku moeglich, habs aber nicht getestet
- Dialog veraltet: ich habe gerne ein Feedback, solange die Erkennung nicht perfekt ist. Was schwebt Dir vor?

HTTPS mit einem gueltigen Zertifikat hat den Vorteil, dass man damit eine WebApp installieren kann, was wiederum Benachrichtigungen empfangen kann (ungetestet).
Weiss (noch) nicht, ob man damit auch Sprachausgabe ausloesen kann, bin eher skeptisch.
Gueltige Zertifikate kann man auch selbst erstellen, das Zertifikat muss auf dem Client dann installiert werden.
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 15 März 2026, 11:40:35
Ich habe jetzt auch versucht bei Firefox mit http Zugriff zu bekommen. Klappt nicht.
Habe in about:config folgende auf true gesetzt. Aber auch danach kein Glück:
media.webspeech.recognition.enable true
media.devices.enumerate.legacy.enabled true
media.getusermedia.insecure.enabled true

Du hattest ja manifest schon hinzugefügt. Wäre es nicht sinnvoll, dem User direkt beim installieren
https zur Verfügung zu stellen, ohne das er sich mit der Einrichtung beschäftigen muss.

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: Beta-User am 15 März 2026, 12:16:00
Zitat von: rudolfkoenig am 15 März 2026, 11:03:52Die Doppelung der Texte lag vielleicht an stt.interimResults=true, das habe ich jetzt entfernt.
Zumindest unter fully funktioniert das damit erwartungsgemäß :) .

Zitat von: rudolfkoenig am 15 März 2026, 11:03:52Das Firefox Problem habe ich jetzt in Prinzip (s.u.) gefixt.
Zum Aktivieren muss in about:config (about:config) media.webspeech.recognition.enable auf true gesetzt werden.
Jetzt erscheint zumindest sowohl auf dem Androiden wie unter Linux das Dialogfeld. Das unter Android hinzubiegen war was größeres, auf about:config kommt man da nur über einen Umweg, ich hab's mit dem Weg aus https://discuss.techlore.tech/t/i-found-a-way-to-enable-about-config-on-regular-firefox-for-android/14584 gemacht, chrome://geckoview/content/config.xhtml aufgerufen und dort den entsprechenden Punkt direkt aktiviert.
Es wird allerdings trotzdem nichts aufgenommen, die Berechtigung zum Zugriff auf das Mikro wird auch nicht angefragt. Vielleicht fehlt noch was anderes, was in about:config aktiviert werden muss?

Zitat von: rudolfkoenig am 15 März 2026, 11:03:52- eine eindeutige Zuordnung des Clients ist kein Problem, will aber (mit dem Rest auch) abwarten, welchen Weg wir gehen wollen
Danke, ich hatte mir schon gedacht, dass der Punkt mit dem Rückweg dann einer der Folgeschritte sein soll.

Zitat von: rudolfkoenig am 15 März 2026, 11:03:52- Sprachausgabe ist laut Doku moeglich, habs aber nicht getestet
fully kann das, von daher _glaube_ ich, dass es von der technischen Seite her kein Hexenwerk sein wird, "irgendeinen" Browser dazu zu bewegen, entweder eine Audio-File abzuspielen oder das am Endgerät verfügbare TTS-System anzusteuern (allgemeine Berechtigung dazu vorausgesetzt). Die Frage wäre, wie man das aus FHEM heraus testen würde?

Zitat von: rudolfkoenig am 15 März 2026, 11:03:52- Dialog veraltet: ich habe gerne ein Feedback, solange die Erkennung nicht perfekt ist. Was schwebt Dir vor?
Das kann ich grade nicht so recht einordnen:

"Bisher" (AMAD-Weg) war es so, dass nach einer gewissen silence-Phase der bis dahin erkannte Text an AMADCommBridge weitergegeben wurde und das Mikrofon dann zu war. Also - übertragen auf die jetzige Fassung - dem "Audio stopped" direkt ein automatisches "submit" folgen würde. 
Während des Sprechens zu sehen, was gerade "getippt wird", ist dabei allerdings in der Tat hilfreich, und das war zumindest in meiner Erinnerung auch so - manchmal mit "rückwirkender Änderung" bereits erkannter Worte - vermutlich wegen des besser erkannten Kontextes des einzelnen Bruchstücks.
Wäre klasse, wenn wir was in die Richtung hin bekämen, alternativ würde es m.E. auch eine kürzere Wartezeit auch tun, nach der ein (optionales?) "submit" erfolgt? Insbesondere, wenn man das Mikro auch auf andere Weise als den Button aktivieren kann (Reaktion auf einen Näherungssensor, z.B.), kann der User durchaus auch etwas entfernter sein, so dass er uU. gar nicht lesen kann, was erkannt wird.

RHASSPY hat dann diesen Inhalt an Rhasspy geschickt zur Intent-Erkennung. Da kam "irgendein" Ergebnis raus zwischen "nichts passendes gefunden" bis "Es wurde der Satz 'Mach lauter' mit 100% Wahrscheinlichkeit erkannt, die Bausteinchen sind ....". Je nach Treffgenauigkeit wird dann entweder die Aktion ausgelöst, eine Rückfrage gestellt ("soll wirklich das Licht im Wohnzimmer an geschaltet werden?") oder eben zurück gemeldet, dass nichts ermittelt werden konnte (optional: mit weiterer Eingabemöglichkeit = Mikro wieder offen).

Es ist daher in der Regel kein allzu großes Problem, wenn "Müll" erkannt wird, weil darauf keine Reaktion erfolgt ist - was im Übrigen deutlich angenehmer ist wie die Audio-Dekodierung mit den Rhasspy-defaults, die immer einen zwingenden match mit irgendeinem der hinterlegten Anweisungssätze ergeben hat, mit 100% Wahrscheinlichkeit ::) ...

Was HTTP/HTTPS angeht: Das STT/TTS-Thema direkt mit Browser-Bordmitteln lösen zu können, ohne extra irgendeine spezielle App zu benötigen, ist imo ein Aspekt, der die f18.js-Variante deutlich attraktiv macht! Selbst wenn man dann erst mal diverse Berechtigungen für den FHEM-Server freischalten muss, wenn man nur HTTP verwenden will.
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 15 März 2026, 12:45:23
@rudolf

Besser, jetzt habe ich keine Doppelung mehr.

@Beta-User
Fully zickt bei mir noch. Egal ob mein JS oder von Rudolf, ich bekomme "SpeechRecognition Interface missing".
Ist ein FireHD10...mmhh. Habe in den Settings in Fully "Enable Microphone Access" an. Noch ein Tip von dir?

edit:
Mist, auf dem Handy mit Fully funktioniert es sofort :(

edit2:
Irgend eine Voicerecorder app funktioniert aucu aus dem Store....

edit3:
Das ist wohl ein FireOS Problem....egal

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: Beta-User am 15 März 2026, 15:18:44
Zitat von: rudolfkoenig am 15 März 2026, 11:03:52Was schwebt Dir vor?
Vielleicht sollten wir auch bei Gelegenheit klären, wer "Dir" ist, bzw. wer welche Zielsetzung(en) hat.

Mir persönlich ging es als Minimalziel darum, einen Weg zu finden, wie man diverse Androiden möglichst einfach und möglichst ohne viele Abhängigkeiten von irgendwelchen großen Internetdienstleistern dazu nutzen kann, "typische Nutzerinteraktionen per Sprache" an und mit FHEM zu ermöglichen.

Das Gespann Rhasspy/RHASSPY war im Hinblick auf offline-Fähigkeit nahezu ideal, nur leider war (und ist) der STT-Teil im Hinblick auf Useability und effektive Ergebnisse eher bescheiden.
Der "alte" Workaround, für den STT-Teil eben doch die "normale online"-Fähikeit der Handys zu verwenden, war (mit ein paar Abstichen) ganz ok, benötigt(e) aber entweder die "Automagic"-App, die zwar noch erhältlich ist, aber nur in der vorletzten Version mit aktuellen Handys nutzbar ist, aber im mittelfristig "tot" ist, oder "Tasker", dessen Konfiguration (der aktuellen Version) (nicht nur) mich überfordert...

Wenn "wir" (also eher ihr...) den TTS/STT-Teil erfolgreich hier implementiert haben sollten, wäre mein persönliches Minimalziel eigentlich schon erreicht.
Vermutlich läßt sich das dann auch genauso mit Babble nutzen. Das war nie in meinem Fokus, mir lag die (bezogen auf den FHEM-Teil) weitgehend dezentrale Konfiguration von RHASSPY sehr viel näher.

Soweit, so gut.

Mittelfristig wird sich auch das Problem stellen, dass Rhasspy nicht mehr - jedenfalls nicht mehr in der jetzigen Systematik - weiterentwickelt werden wird. Nach meinem jetzigen Verständnis ist das "eigentlich" kein Beinbruch, denn der eigentliche Kern - die Intent-Erkennung - scheint sowieso (wie bei Babble auch) auf Rivescript zu basieren. Das "passend" zu konfigurieren (bzw. bei Änderungen der FHEM-Konfiguration auch zu aktualisieren), ist sicher etwas Aufwand, aber vermutlich (mit Unterstützung...) lösbar.

RHASSPY selbst ist gepackaged, so dass es praktisch kein Aufwand wäre, das zu klonen - und den Klon dann dieselben Attribute verwenden zu lassen, wie das bisherige Modul ;D .

Von daher wäre die "mittelfristige Mission", RHASSPY2 (oder künftig vielleicht "RiveInterface") zu basteln, um damit eine (relativ) einfach zu konfigurierende Zwischenschicht pro FHEM-Installation (und Sprache) anbieten zu können, die - abgesehen von der STT-Seite - offline läuft.
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 15 März 2026, 19:57:42
Ich persönlich, eigentlich hat mich Sprachsteuerung nie interessiert. Mein Heim ist beim Smarthome 100% Cloudfree.
Daher kam Alexa und Co nie in die engere Auswahl. Und alles andere ohne Cloud war mir zu mhhh, jedenfalls nicht
mein Ding. Aber ein bisschen mitreißen lasse ich mich hier jetzt schon.

Daher nochmal ein Update im ersten Post. Ein Mini-Jarvis. Bzw Hotworderkennung mit "Jarvis". Ohne die Wird der Text
nicht gesendet. Kurz tippen Jarvis an, kurz tippen Jarvis aus. Halten, dann Jarvis sagen + Kommando. Im Moment landet
das wie vorher gesagt auch in global als Reading STT.

Edit:
Jarvis auf dem Desktop klappt dauerhaft. Mobile noch nicht. Aber halten und sprechen auf Mobile ist ok.

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 15 März 2026, 22:09:59
Update im ersten Post voicecontrol_jarvis.js
- Antippen und dauerhaft zuhören klappt jetzt auch bei Mobile.
- Das Hotword ist James bzw james. Muss klein.

Wer selber mal auf Mobile remote debuggen will, bzw von Chrome Desktop auf AndroidMobileChrome.
1. Im Handy unter Entwicklertools USB-Debugging an.
2. Handy per Kabel Pc
3. adb devices
4. adb forward tcp:9222 localabstract:chrome_devtools_remote
5. Chrome Desktop öffnen
6. chrome://inspect/#devices in der Adresszeile eingeben.
7. Da taucht dann euer Chromedesktop sowie das Mobiledevice auf.
8. Den richtigen Tab mit inspect aufrufen. Und zack Remoteconsole.

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 16 März 2026, 09:31:57
Moin update - voicecontrol_james.js

- Hotword und Bezeichnung auf James umgestellt
- Sprachausgabe hinzugefügt (Minimal, siehe unten)
- Auf Desktop mit Windows11 wird erst nach VoiceStefan gesucht.

Audioaufzeichnung und Sprachausgabe im Einklang ist sehr diffizil...sonst antwortet James sich selbst.
Drücken und halten klappt super. Dauerhaft lauschen funktioniert jetzt auch ganz passabel. Gerade auf Mobile
mag Chrome es nicht so gerne, lange das Mikro offen zu lassen. Aktuell kann das JS es ganz gut abfangen.
Wenn James mal nicht antwortet, dann war wieder eine Unterbrechung. Zu sehen am kleinen grünen Punkt der
oben in der Statusleiste im Handy verschwindet.

Die Sprachausgabe hatte ich erst ausgeweitet. Aber das Timing ist schwierig. Wenn ich sage "James Esszimmer Licht an" und er dann antwortet "Befehl Esszimmer Licht an gesendet" kam es auch mal zu Rückkopplungen. Das hatte ich dann abgefangen, in dem
James sich nicht mehr zuhört, aber dann haut auch schon wieder das Timingproblem dazwischen, da Google gerne das Mikro aus
hat...deshalb antwortet er bei einem Befehl einfach mit ok aber den gesprochenen Befehl sieht man zum überprüfen in der Blase.

Wer z.B eine männliche Sprachausgabe haben möchte kann dies anpassen. Hier bei mir unter Lineageos 23.2:
Einstellungen --> Bedienungshilfen --> Sprachausgabe --> Rechts Zahnrad neben Bevorzugtes Modul --> Sprache installieren --> Deutsch klicken --> 4 Stimmen zur Auswahl. Ich habe Stimme III


Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 16 März 2026, 13:58:03
Mh,

ich habe es gerade erst bemerkt. Das ständige restarten der Spracherkennung bei AlwaysOn löst einen Ton aus.
Es ist mir nicht aufgefallen, da Systemtöne auf minimal waren...Daher werde ich es wohl wieder entfernen müssen.

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: Beta-User am 16 März 2026, 17:40:59
Hammerhart!

Kurze Wasserstandsmeldung zu den jarvis/james-js: Sieht auch (optisch und funktional) cool aus, und der Ansatz, das per "solange man drückt, kann man sprechen", zu lösen, gefällt mir persönlich auch gut. Kann mir allerdings denken, dass andere das nicht so einfach zu bedienen finden. Mal sehen, ob jemand anderes sich dazu zu Wort meldet.

Hatte versucht, ob das overlay auch an fhemapp "weitervererbt" wird, aber jedenfalls ohne weiteres ist es mir nicht gelungen, das auch dort sichtbar zu machen. Jedenfalls kam es mir so vor, dass das separate js ein Ansatz sein könnte, diese Art Funktionalität auch dort unterzubringen.

Generell könnte ich mir vorstellen, zweigleisig zu fahren:
- die f18-Lösung als "Basisvariante für alle Browser", aber eben nur im "normalen FHEMWEB" (falls es nicht eine einfache Lösung gibt, den "Mikro-Button" in fhemAPP irgendwie auch sichtbar und funktional zu machen, und die
- VoiceButton-Lösung als "vollintegrierte FULLY/RHASSPY(2)"- Lösung auszubauen.
fully (PLUS-Version) hat eine (m.E. hinreichend) ausgefeilte API, mit der man v.a. auch die aufgezeigten Timing-Probleme beim Zusammenspiel zwischen Mikro und Lautsprecher in den Griff bekommen sollte (bei AMAD ist das vergleichbar gewesen, soweit ich das in Erinnerung habe und im Moment überblicken kann). Dazu könnte man z.B. per js checken, ob fully in der PLUS-Version läuft (String fully.getDeviceId() aus https://www.fully-kiosk.com/en/#rest, dort "JavaScript Interface ( PLUS )", "Get device info"), und dann statt an global das betreffende FULLY-Device mit der Info versorgen, was STT ermittelt hat.

Zitat von: schwatter am 15 März 2026, 19:57:42Ich persönlich, eigentlich hat mich Sprachsteuerung nie interessiert. Mein Heim ist beim Smarthome 100% Cloudfree.
Daher kam Alexa und Co nie in die engere Auswahl. Und alles andere ohne Cloud war mir zu mhhh, jedenfalls nicht
mein Ding. Aber ein bisschen mitreißen lasse ich mich hier jetzt schon.
Kommt mir bekannt vor... Hatte vermutlich 1000 Zeilen Code in RHASSPY geändert, bevor ich den Dienst überhaupt selbst installiert habe :)) .

Jedenfalls: Falls du Interesse hast, ist Rhasspy@docker in 0,nix am Laufen, und die Konfiguration in FHEM ist zwischenzeitlich auch easy... Letztlich "brauchen" wir für's Weiterentwickeln jedenfalls keine Hardware, egal, ob jetzt in der FULLY-Variante oder mit "global" und FHEM-TTS ;) .
(Ich muss nur bei RHASSPY dann wieder ziemlich unter das Auto steigen, um das zu erweitern und noch einige Patches sauber einzuarbeiten, die aus einer Diskussion mit gregorv stammen, aber nicht ganz finalisiert sind)...
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 16 März 2026, 20:07:04
Zitat von: Beta-User am 16 März 2026, 17:40:59und der Ansatz, das per "solange man drückt, kann man sprechen", zu lösen, gefällt mir persönlich auch gut. Kann mir allerdings denken, dass andere das nicht so einfach zu bedienen finden. Mal sehen, ob jemand anderes sich dazu zu Wort meldet.

Ich sehe bei Browser + Mobile aktuell keine andere Lösung. Dazu habe ich Post #1 auch wieder überarbeitet. Bei Mobile wird man nach ca.6sek. ohne Spracheingabe einfach rausgeschmissen.
Eine Restartschleife ist trotzdem noch drinne. Aber ein bisschen nervt das gepiepse. Auf Desktop funktioniert das hingegen hervorragend. Kurzer push und James hört dauerhaft zu. bzw keine nervigen Geräusche. Neue Version von voicecontrol.js liegt auch wieder in #1 Post.

Für AlwaysOn müsste man eigentlich einen anderen Unterbau verwenden oder ein Hardwaredevice. Egal, so schlecht funktioniert es erstmal nicht. Vielleicht finde ich auch noch etwas
solideres. Ich hatte auch schon weißes Rauschen eingebaut...aber so blöd ist die API dann doch nicht :)

Zitat von: Beta-User am 16 März 2026, 17:40:59Hatte versucht, ob das overlay auch an fhemapp "weitervererbt" wird, aber jedenfalls ohne weiteres ist es mir nicht gelungen, das auch dort sichtbar zu machen. Jedenfalls kam es mir so vor, dass das separate js ein Ansatz sein könnte, diese Art Funktionalität auch dort unterzubringen.

Da frag lieber den Autor von fhemapp. Vielleicht kann er einen einfach Voicebutton selber bereitstellen. Ich nutze nur Fhem mit f18 und versuche alles darin abzubilden.

Zitat von: Beta-User am 16 März 2026, 17:40:59Generell könnte ich mir vorstellen, zweigleisig zu fahren:
- die f18-Lösung als "Basisvariante für alle Browser", aber eben nur im "normalen FHEMWEB" (falls es nicht eine einfache Lösung gibt, den "Mikro-Button" in fhemAPP irgendwie auch sichtbar und funktional zu machen, und die
- VoiceButton-Lösung als "vollintegrierte FULLY/RHASSPY(2)"- Lösung auszubauen.
fully (PLUS-Version) hat eine (m.E. hinreichend) ausgefeilte API, mit der man v.a. auch die aufgezeigten Timing-Probleme beim Zusammenspiel zwischen Mikro und Lautsprecher in den Griff bekommen sollte (bei AMAD ist das vergleichbar gewesen, soweit ich das in Erinnerung habe und im Moment überblicken kann). Dazu könnte man z.B. per js checken, ob fully in der PLUS-Version läuft (String fully.getDeviceId() aus https://www.fully-kiosk.com/en/#rest, dort "JavaScript Interface ( PLUS )", "Get device info"), und dann statt an global das betreffende FULLY-Device mit der Info versorgen, was STT ermittelt hat.

Zu f18. Rudolf hat schon super implementiert. Ich nutze es gerade nicht, weil ich an meinem FireHD noch pfeile. FireOS ist echt mist. Ich konnte bei Fully mit Pluslicense
nichts aktivieren. Nur mein JS funktioniert jetzt halb, nachdem ich die Googleapp installiert habe. Bedeutet, ich kann zumindest Sprachkommandos senden. Aber Lautsprecher
kann ich nicht aktivieren. Damit ich Voiceausgabe habe. Aber egal James redet auch nicht viel :D Wenn ich bei mydealz wieder ein passendes Tablet finde oder eine andere
günstige Kombi für ein Homedisplay, dann kommt das in die Tonne.

Ach auch hier, das Timingproblem liegt am Browser...leider.


Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: Beta-User am 17 März 2026, 07:29:03
Zitat von: schwatter am 16 März 2026, 20:07:04Da frag lieber den Autor von fhemapp. Vielleicht kann er einen einfach Voicebutton selber bereitstellen.
Entweder das. Die Alternative (bzw. ein weiterer Weg) wäre, die "js-injection" zu nutzen, die fully bereitstellt. Damit habe ich eben zumindest das "jarvis"-Mikro in die fhemapp-Anzeige bekommen. Ist zwar etwas fummelig, den kompletten Code in das Eingabefeld zu kopieren, aber: das Mikro wird auch da angezeigt :) .
Und: Dass der gesprochene Text in "global" nicht ankam, lag "nur" an einem "FHEMWEB WEB CSRF error".

Schade, dass dein fully unter dem angegrauten Android so zickig ist.

Letztlich wäre es m.E. wünschenswert, wenn wir am Ende einen "Einheitscode" hätten, der für alle Browser prizipiell funktioniert, und über den dann auch das Mikro wieder (de-)aktivieren könnten (und optimalerweise Statusmeldungen erhalten, ob noch STT-Operationen laufen, etc. pp.).

Zitat von: schwatter am 16 März 2026, 20:07:04Neue Version von voicecontrol.js liegt auch wieder in #1 Post.
Thx!
Hoffentlich komme ich zeitnah zum Testen :) .

EDIT: zumindest kurz angetestet wirkt das in fully und Chrome (@Android 13) sehr funktional. Allerdings gibt es weder eine Ansage "James aktiv", noch irgendwelchen Sound?
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 17 März 2026, 09:59:17
Moin,

ja das funktioniert. Ist manchmal tricky aber normal muss die Seite dich fragen.
Sprachausgabe funktioniert wenn:

- Systemlautstärke für Benachrichtigung nicht aus ist. Ist mir auch schon passiert  ::)
- Die Webseite dich fragt nach Mikrofon und auch Ton. Nachschauen unter Einstellungen->Webseiten-Einstellungen->Berechtigungen
- Bei mir mit Android16 als Beispiel unter Einstellungen->Bedienungshilfen->Sprachausgabe checken.

Wenn das nicht funktioniert, weiter suchen.

Wie gesagt bei mir, Handys mit Chrome und Fully ok.
Fully auf FireOs mist.

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: Beta-User am 17 März 2026, 12:38:11
Hmm, muss mal sehen, wo da welche Einstellungen fehlen.

Firefox ist komplett in alle Richtungen still, sowohl unter Android wie Linux.

Bzgl. Fully: hast du auch ein Gerät mit Plus-Version und das FULLY-Modul?
Soll (bzw. muss...) ich mich darum kümmern, wie die tts-Info an die passende Instanz von FULLY kommt, oder magst du den js-Code entsprechend aufbohren ::) ?
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: rudolfkoenig am 17 März 2026, 12:44:24
ZitatFirefox ist komplett in alle Richtungen still, sowohl unter Android wie Linux.
Ist das auch mit f18 der Fall?
Ich habe versucht in f18 alle Statusaenderungen anzuzeigen.
Leider habe ich auf meinem Android Testsystem auch komplette Stille, und ich wuesste gerne, was da fehlt.
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: Beta-User am 17 März 2026, 12:56:01
Zitat von: rudolfkoenig am 17 März 2026, 12:44:24
ZitatFirefox ist komplett in alle Richtungen still, sowohl unter Android wie Linux.
Ist das auch mit f18 der Fall?
Ich habe versucht in f18 alle Statusaenderungen anzuzeigen.
Leider habe ich auf meinem Android Testsystem auch komplette Stille, und ich wuesste gerne, was da fehlt.
Stand ist nach wie vor wie hier:
https://forum.fhem.de/index.php?msg=1359526

Oder hast du danach noch was geändert?
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 17 März 2026, 14:52:09
Für Firefox sieht es nicht gut aus. Frontend ok, aber im Backend fehlt die API.
Da muss man selber was anbieten...nah toll.

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: Beta-User am 17 März 2026, 18:00:54
Bzgl. firefox muss ich mich korrigieren: Sowohl unter Linux wie Android bekomme ich zumindest die Ansage, dass James (de-) aktiviert wurde.

Woran es noch fehlen könnte, wäre ggf. auch einfach erst mal die Anfrage, überhaupt das Mikrofon nutzen zu dürfen. Da bietet mir Firefox anscheinend keine Option an, den FHEM-Server proaktiv einzutragen?
Spätestens beim Klick auf eines der Mikrofone müßte das doch geschehen, oder?

Edit: Strg+i ist mein Freund, hilft aber nicht weiter, weil das Mikro dem Gefühl nach trotzdem nicht aktiviert wird, egal, welches der Web-Mikrofone (f18/voicecontrol) ich klicke...
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 17 März 2026, 19:21:43
Super zumindest kommt dann die Sprachausgabe. Aber für SpeechToText fehlt wirklich das Backend. Such mal quer im Netz.
Was Firefox anbietet ist, du geht auf eine Googleseite und startest da z.B Spracheingabe. Das funktioniert, da da direkt
Google angezapft wird.

Im Moment habe ich für Firefox zum testen das alles gesetzt:
# Spracherkennung (Web Speech API) aktivieren
media.webspeech.recognition.enable          -> true
media.webspeech.recognition.force_enable    -> true

# Sicherheitskontext für deine FHEM-IP umgehen (WICHTIG!)
dom.securecontext.whitelist                 -> http://192.168.1.76:8084

# Mikrofon-Zugriff für unsichere Quellen (HTTP) erlauben
media.getusermedia.insecure.enabled         -> true
media.devices.enumerate.all.insecure        -> true
dom.serviceWorkers.testing.enabled          -> true

# Berechtigungs-Abfragen komplett deaktivieren (Vorsicht: Global)
media.navigator.permission.disabled         -> true
permissions.default.microphone              -> 1

Damit ist immerhin das Micro nicht mehr blockiert. Bzw ich werde auch nicht ständig gefragt.

Als Addon habe ich "Speech Recognition Polyfill" installiert. Bis jetzt konnte ich es noch nicht anzapfen.

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 17 März 2026, 21:25:04
Kleines Update im ersten Post - nur das notify angepasst.

Bei Spracheingabe "james kommandos" wird jetzt ein Popup mit der Befehlsübersicht eingeblendet.
Momentan aber auf allen offenen Screens. Da müsste ich noch eine eindeutige ID mitschicken, um
das zu differenzieren.

@Beta-User
Sie es mir nach, wenn ich noch nicht an Fully bastele. Im Moment ist die Motivation noch nicht da.
Fully mit Plus habe ich, aber die Einschränkungen bei mir mit FireOS nerven mich. Daher bastele ich
gerade lieber an dem was funktioniert.

Insgesamt wenn es vernünftig werden soll, müssen wir wohl einen anderen Weg gehen. Also anderes Backend
wie Rhasspy und Co.

Da das hier aber so einfach ist, lass ich noch nicht von ab.

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: Beta-User am 18 März 2026, 07:40:05
Vermutlich ist Polyfill noch nicht richtig konfiguriert, aber immerhin bekomme ich nach dem f18-Mikro mit folgenden Einstellungen ein Dialogfeld, das auch Audio empfängt, am Ende dann aber meckert:
ZitatError connecting to the service.
Aus dem "Strauß" habe ich aktiviert:
Zitat von: schwatter am 17 März 2026, 19:21:43# Spracherkennung (Web Speech API) aktivieren
media.webspeech.recognition.enable          -> true
media.webspeech.recognition.force_enable    -> true (den key gab es nicht)

# Sicherheitskontext für deine FHEM-IP umgehen (WICHTIG!)
dom.securecontext.whitelist                -> http://192.168.1.76:8084 (dto, der Versuch, das per "+" hinzuzufügen, hat zwar geklappt, hatte aber keine Auswirkung. Der Weg über "Strg+i" dürfte dasselbe bewirkt haben)

# Mikrofon-Zugriff für unsichere Quellen (HTTP) erlauben
media.getusermedia.insecure.enabled        -> true (Das war die letzte Änderung, danach wurde nicht mehr ständig nach der Berechtigung gefragt)
media.devices.enumerate.all.insecure        -> true (hätte ergänzt werden müssen, fehlt im Moment)
dom.serviceWorkers.testing.enabled          -> true (gesetzt wie empfohlen)

# Berechtigungs-Abfragen komplett deaktivieren (Vorsicht: Global)
media.navigator.permission.disabled        -> true (gesetzt wie empfohlen)
permissions.default.microphone              -> 1 (hätte ergänzt werden müssen, fehlt im Moment)
Edith meint: das ist Firefox unter Linux. Am Handy war mir das heute morgen noch zu fummelig...
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: Beta-User am 19 März 2026, 11:57:45
Zwischenstand:

Mit einer zusätzlichen Zeile und einer kleinen Änderung wird das STT-Reading je nach Browser entweder nach global gesetzt, oder an die betreffende FULLY-Instanz (getestet unter fully und Chrome unter Android):

Vorne (Zeile 15) ergänzt:
        const notifydevice = ( typeof fully !== 'undefined' && typeof fully.getDeviceId() !== 'undefined' ) ? `TYPE=FULLY:FILTER=deviceid=${fully.getDeviceId()}` : "global";
und in        function sendAction(cmd) {
...
            const fhemCmd = `setreading ${notifydevice} STT ${cmd}`;        const notifydevice = ( typeof fully !== 'undefined' && typeof fully.getDeviceId() !== 'undefined' ) ? `TYPE=FULLY:FILTER=deviceid=${fully.getDeviceId()}` : "global";

...

Was aus meinem Wunschkonzert zur Funktionalität jetzt noch fehlen würde, wäre das Mikro wieder von FHEM aus aktivieren zu können für weitere STT-Aktionen. Nach meinem (immer noch rudimentärem) Verständnis müßte das über ein Reading an der FULLY-Instanz gehen können.

Tja , dann muss ich mich wohl mal bei Gelegenheit an die Renovierung von RHASSPY machen 8) .

Zitat von: schwatter am 17 März 2026, 21:25:04Insgesamt wenn es vernünftig werden soll, müssen wir wohl einen anderen Weg gehen. Also anderes Backend wie Rhasspy und Co.
Mein Vorschlag dazu wäre, das Schritt für Schritt anzugehen.

Wer heute erst mal testen will und eine "einfache" Lösung haben mag, kann ja sowas wie dein notify verwenden.

Wer heute Babble im Einsatz hat, wird das weiter verwenden wollen, und soweit ich das im Kopf habe, sollte es kein Problem sein, die Auswertungsroutinen dort aus einem sehr einfach gestrickten notify heraus anzusteuern. Ich würde wetten, dass sich pah demnächst dazu hier meldet ;D .

Was die anderen Backend-Fragen angeht:
- für Firefox ist mir noch "Speechfire" über den Weg gelaufen, https://github.com/Jejkobb/Speechfire. Das kann auch mit einem lokal installierten Server zusammenarbeiten, so dass wir - für daran interessierte User - wieder bei einer vollen offline-Funktionalität landen könnten :) .
- Im Gesamtkonstrukt, das mir im Moment als nächstem Schritt vorschwebt, spielt Rhasspy als Backend nur noch für die Intent-Erkennung (und die Identifikation der vom Sprecher gelieferten Bausteine) eine ("leider" ziemlich große) Rolle. Das zu ersetzen, aber lösbar sein. Ansonsten ist das in RHASSPY enthaltene "framework" m.E. eigentlich sehr ausgereift (und von einigen User längerfristig getestet). V.a. gibt es bereits jetzt eine Art "Sitzungsmanagement", mit dem man vermutlich zumindest die in FHEM beheimateten Timing-Probleme lösen können sollte.
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 19 März 2026, 20:23:06
Ok,

habe deinen Beitrag durchgelesen. Momentan hänge ich weiter am ausloten der Grenzen von meinem Setup. Desktop und Mobile
sind schwierig in Einklang zu bringen. Das macht einen fertig....
Immerhin habe ich jetzt Fully mit Sprachausgabe. Dazu musste ich die "Google App" installieren und auch die Google
"Speech Recognation & Synthesis" App + das JS anpassen auf fully.startSpeechRecognition .

Dadurch habe ich jetzt auch einen Patch für Rudolf um Fully mit f18 zu connecten:
function
f18_stt()
{
  var Recognition = window.SpeechRecognition || window.webkitSpeechRecognition;
  var isFully = (typeof fully !== 'undefined' && typeof fully.startSpeechRecognition === 'function');

  if (!Recognition && !isFully)
    return FW_okDialog("SpeechRecognition Interface missing");

  if (isFully) {
    fully.startSpeechRecognition("", false);
    window.onSpeechRecognitionResult = function(result) {
      if (result) {
        FW_cmd(FW_root + "?cmd=setreading " + $("body").attr("data-webName") +
               " STT " + encodeURIComponent(result) + "&XHR=1");
      }
    };
    return;
  }

  var stt = new Recognition();
  stt.continuous = true;
  stt.lang = $("body").attr("data-language") == "EN" ? "en-US":"de-DE";

  var doSend = false;
  var txt;

  stt.onresult = function(e){
    txt='';
    for(var i1=0; i1<event.results.length; i1++)
      txt += event.results[i1][0].transcript;
    $("#f18_stt").html(txt);
  };
  stt.onaudiostart = function(e){ $("#stt_state").html("Audio started") };
  stt.onaudioend   = function(e){ $("#stt_state").html("Audio stopped") };
  stt.onspeechstart= function(e){ $("#stt_state").html("Speech started") };
  stt.onspeechend  = function(e){ $("#stt_state").html("Speech stopped") };
  stt.onnomatch    = function(e){ $("#stt_state").html("No match") };
  stt.onerror      = function(e){ $("#stt_state").html(e.message) };
  stt.start();

  $("#FW_okDialog").remove();
  var div = $("<div id='FW_okDialog'>");
  $(div).html('<div id="stt_state"></div><div id="f18_stt" '+
              'style="min-height:200px;min-width:200px"></div>');
  $("body").append(div);
  var oldPos = $("body").scrollTop();
  $(div).dialog({
    dialogClass:"no-close", modal:true, width:"auto", closeOnEscape:true,
    maxWidth:$(window).width()*0.9, maxHeight:$(window).height()*0.9,
    buttons: [
      {text:"Send", click:function(){ doSend=true; $(this).dialog("close");}},
      {text:"Abort", click:function(){ $(this).dialog("close"); }}
    ],
    close:function(){
      if(doSend && txt)
        FW_cmd(FW_root+"?cmd=setreading "+$("body").attr("data-webName")+
               " STT "+encodeURIComponent(txt)+"&XHR=1");
      stt.stop();
      $(div).remove();
    }
  });

}

Außerdem sende ich jetzt noch die fw_id mit. Schaut dann im reading so aus:
setstate global 2026-03-19 19:41:04 STT kommandos [1773945420.58154]
Damit kann man genau 1 Popup auf genau dem einen Device erzeugen, welches gerade die Spracheingabe macht.
Aber ich habe Beitrag 1 noch nicht geupdatet.

Gruß schwatter
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: Beta-User am 19 März 2026, 22:36:26
Wollte einfach mal fett DANKE sagen!

Hätte alleine wohl ewig, aber erfolglos an dem Thema rumgekaut!

RHASSPY (noch ohne FULLY) ist jedenfalls jetzt soweit getestet, dass ich wieder weiß, an was es zuletzt hing ::). Zumindest tritt der Effekt, der mich damals bewogen hatte, das noch nicht einzuchecken, nur auf, wenn man einen Test-Modus aktiviert, mal sehen, ob bzw. wann das ins SVN kommt.
Hängt auch davon ab, ob jemand aus Userkreis mit testen will...

Finde es jedenfalls cool, dass wir schon so weit gekommen sind!!!!!

DANKE!
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: Beta-User am 20 März 2026, 12:26:29
Zitat von: schwatter am 19 März 2026, 20:23:06Außerdem sende ich jetzt noch die fw_id mit. Schaut dann im reading so aus:
setstate global 2026-03-19 19:41:04 STT kommandos [1773945420.58154]
Dieser Schnipsel wäre hilfreich:
Im Moment diskutiere ich mit mir als maintainer von FULLY, ob der nicht noch zwei set-Optionen verträgt.....

Denke da an
- IP (die Verbindung geht nach wie vor immer mal wieder verloren)
- TTS. Die Idee wäre dabei, die aktuelle FW_ID (auch) in FULLY zu haben, und dann den Text auch direkt an RHASSPY bzw. Babble weiterzuleiten...

Edith meint: Danke für den Update! Hatte das Wiki zur FHEMWEB-Api und der FHEMWEB-Code durcheflözt, aber nichts passendes gefunden....
Titel: Aw: VoiceButton für Fhemweb
Beitrag von: schwatter am 20 März 2026, 18:08:56
Hey,

ich habe im ersten Post das voicecontrol.js + notify angepasst. Da jetzt die fw_id mitgeschickt wird, müssen Beide aktualisiert
werden.

Hier der Codesnippet zu fw_id:
let clientId = $("body").attr("fw_id") || "no_fw_id";
const fhemCmd = `setreading global STT ${cmd} [${clientId}]`;
FW_cmd("/fhem?cmd=" + encodeURIComponent(fhemCmd) + "&XHR=1");

Auf meinem Handy und auch unter Fully im FireOS jetzt top. Auf meinem Desktop bin ich unschlüssig. Vielleicht
Probleme mit meinem Mikro? Mh...


Weil ich gestern so gefrustet war, hatte ich noch kurzerhand auf meinem Fhemserver Whisper aufgesetzt, das voicecontrol.js
angepasst und damit eine Wave an Whisper geschickt. Whisper läuft in Python

Voicecontrol nimmt Wave auf-->connected zu Whisper-->schickt Wave-->Whisper wertet Wave aus--> macht Buchstaben alle klein
--> Holt sich CSRFToken--> Patscht die fw_id mit dran --->schreibt das fertige Reading nach Fhem.

Funktioniert, aber mein kleiner Server macht bei top auch mal 200 bis 260% CPU Last....sehr unbefriedigend. Whisper hatte ich
auch getweaked mit tiny und verschiedenen Setups. Aber das ist nichts für mich glaube ich. Da schaue ich aber nochmal.

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 22 März 2026, 09:22:30
Moin,

ich habe den Eingangspost nochmal überarbeitet, da es eine Mischung aus voicebutton.js und voicecontrol.js war.
Ich habe jetzt alles auf Voicecontrol getrimmt, einschließlich der Überschrift.

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Beta-User am 22 März 2026, 11:36:36
Habe zwischenzeitlich mal in den Code von FULLY geschaut und da ein paar Dinge umgebaut.

Jetzt gibt es jedenfalls bei FULLY zwei neue set-Optionen:
set <fully> host <IP-Adresse>
Das ist dazu gedacht, (aus FHEMWEB/js) heraus die IP-Adresse ggf. neu zu setzen. Damit könnte man das (ohne MQTT) lösen:
Zitat von: Beta-User am 26 November 2025, 21:31:14Meine Erfahrungen mit FULLY fingen jetzt jedenfalls erst mal damit an, dass die IP-Adresse meines Androiden unterschiedlich war, je nach genutzem AP und Frequenz :o . Also schon mal nix mit zuverlässigen reconnects.
Vielleicht hilft da die MQTT-Schnittstelle weiter, wir werden sehen.

set <fully> gotSTT [FW_ID] <text>Im Moment nimmt das (optional)
- die FW_ID (damit man weiß, wohin die Antwort gehen soll, falls das künfig nur via FHEMWEB gelöst werden könnte, wird als Internal verwaltet) und
- den Textinput entgegen, der dann erst mal schlicht als Readingaktualisierung ein Event auslöst.
Mittelfristig wäre die Idee, das direkt weiterzugeben, per Attribut konfigurierbar.

Mal sehen, ob ich nachher noch Lust habe, f18.js entsprechend anzupassen.

@Rudi: Ich unterstelle mal, dass es ok ist, in f18.js direkt einige Sonderbehandlungen für fully vorzusehen? Hilfreich wäre in jedem Fall eine Zeile, die jeweils die host-Angabe akutell hält (über ein devspec-mit-fully-Id-set).
Prinzipiell würde ich dazu tendieren, das meiste in der temporären FHEMWEB-Instanz zu verwalten, v.a. auch, weil man nicht gezwungen sein sollte, tatsächlich eine FULLY-Instanz anzulegen, nur weil man den zufällig für einen für diesen Zweck guten Browser hält...
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Beta-User am 22 März 2026, 14:51:16
Zitat von: Beta-User am 22 März 2026, 11:36:36Mal sehen, ob ich nachher noch Lust habe, f18.js entsprechend anzupassen.
Hatte ich...

Anmerkungen:
"Vorne" in der "$(document).ready(function(){" ist die host-Aktualisierung drin:
  if (typeof fully !== 'undefined')
    FW_cmd(FW_root + "?cmd=set TYPE=FULLY:FILTER=deviceid=" + fully.getDeviceId() + " host " + fully.getHostname() + "&XHR=1");
In der f18_stt() ist auch der Code-Schnippsel aus
Zitat von: schwatter am 19 März 2026, 20:23:06function
f18_stt()
{
...}
etwas angepaßt drin. Bei mir ist das aber funktionslos, es kommt der "normale" Dialog wie unter Chrome auch. Daher ist dort (in der close:function) nochmal ein fully-spezifischer set-Befehl drin.
    close:function(){
      if(doSend && txt){
        if (typeof fully !== 'undefined')
          FW_cmd(FW_root + "?cmd=set TYPE=FULLY:FILTER=deviceid=" + fully.getDeviceId() + " gotSTT " + $("body").attr("fw_id") + " "  + encodeURIComponent(txt) + "&XHR=1");
        FW_cmd(FW_root+"?cmd=setreading "+$("body").attr("data-webName")+
               " STT "+encodeURIComponent(txt)+"&XHR=1");
      }
   
      stt.stop();
      $(div).remove();
    }

Damit ist der Weg nach FHEM rein zu FULLY erst mal funktional (aber noch nicht "schön"), um den Anschlusspfad, erst mal in Richtung RHASSPY geht es dann ein andermal.

Tendenziell würde ich dazu neigen, auch die FHEWEB-Events nur an der temporären Instanz dieser konkreten Verbindung zu generieren, oder alternativ die FW_ID-Info zusätzlich vorzuhalten. 
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Gisbert am 23 März 2026, 19:12:22
Hallo Jörg,
hallo schwatter

ich lese hier auch interessiert mit und teste gerne eine weitere Spracheingabe. Da Automagic nur noch in der vorletzten Version auf neuen Android-Handys funktioniert - abgesehen vom Unsicherheitsgefühl einer alten, nicht mehr aktuellen Software - und irgendwann gar nicht mehr, ist meine Motivation zu testen entsprechend hoch.

Ich sehe aber den Wald vor lauter Bäumen nicht, warte deshalb gerne noch, bis ein Stand erreicht ist, der es interessierten Nutzern erlaubt, dieses Modul zu installieren.

Mir ist noch aufgefallen, dass die Rhasspy.pm sehr viele Änderungen erfahren hat. Muss ich als User davon etwas verstehen?

Viele Grüße Gisbert 
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Beta-User am 23 März 2026, 20:47:16
Hallo Gisbert,

willkommen in unserer netten Runde hier :) .

Da ich eben meine ersten Sprachanweisungen über den FULLY/FHEMWEB<=>RHASSPY-Weg (samt passender Rückantwort) abgesetzt habe 8)  8)  8) , hier das Kochrezept zum Nachmachen:

1. Morgen ein update machen, da gibt es nochmal neue Fassungen von RHASSPY und FULLY. Zu RHASSPY schreibe ich an anderer Stelle noch was, Fully hat
- zwei neue set-Optionen, "STTinput" (bisher übergangsweise "gotSTT") und "STTresponse", sowie
- ein neues Attribut "STTprocessor".

2. Die angehängte f18.js ist eine modifizierte Fassung der von Rudi bereitgestellten und kommt nach www/pgm2. Gegenüber der Ausgangsfassung von gestern ist da nur die Syntax der Übergabe der FW_ID wie von schwatter vorgeschlagen geändert (an 2 Stellen zu finden):
FW_cmd(FW_root + "?cmd=set TYPE=FULLY:FILTER=deviceid=" + fully.getDeviceId() + " STTinput " + encodeURIComponent(txt) + " [" + $("body").attr("fw_id") + "]&XHR=1");
3. Man braucht (eventuell nur im Moment) noch eine PLUS-Lizenz von fully, damit die Sprachausgabe klappt, und eine dazu passende FULLY-Instanz. An der stellt man das Attribut STTprocessor auf den Namen der zuständigen RHASSPY-Instanz, alternativ sollte auch Babble bereits in diese Richtung funktionieren (da wäre dann aber die Sprachrückmeldung manuell zu konfigurieren, war nicht mein Thema; Details siehe unten).

4. Dann muss in den f18-Einstellungen (select style im Menü ziemlich unten zu finden) bei den room-specific-Einstellungen (?!? Warum denn da?) "STT" aktiviert werden.

5. Die "normale FHEMWEB"-Seite per fully auf dem Handy öffnen, . Dann sollte links neben dem "grünen Plus" ein Mikrofon-Symbol erscheinen. Damit die Spracheingabe aktivieren, z.B. nach der Uhrzeit fragen, "Send" klicken und es könnte schon eine Antwort kommen 8) . Ansonsten die Seite mal neu laden (das nach-unten-ziehen zum refresh zu aktivieren schadet nicht...)


Anmerkungen:
- Man kann unabhängig von RHASSPY/Babble selbstredend jeden Event-Handler auf das STT-Event lauschen und die Antworten dann einfach per "set <FULLY> STTresponse <Antwort-Text>" sprechen lassen.
Der Plan dazu wäre, hierfür noch ein Attribut für eine lokale Sprachsynthetisierung vorzusehen, damit "Jeanie" immer gleich klingt ;) .
- Für Dialoge muss man vermutlich dann auch wieder aktiv das Mikro drücken, es sollte aber klappen, dass z.B. Rückfragen nach dem Raum seitens RHASSPY korrekt zugeordnet werden (ungetestet).
- Das ganze ist noch nicht hübsch, und viele der von schwatter dankenswerterweise in seinem voicecontrol.js enthaltenen Ansätze sind (noch) nicht berücksichtigt, von daher wird es vermutlich v.a. am Coding noch einige Verbesserungsmöglichkeiten geben, Tests und Rückmeldungen sind selbstredend willkommen.

Soviel an dieser Stelle dazu, ich hoffe, es ist halbwegs nachvollziehbar :)
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 23 März 2026, 22:59:11
Nabend,

@Beta-User
Ich sehe du warst schon fleißig  :) und kommst voran. 

Um alle noch etwas mehr zu verwirren :) Im Moment fahren wir hier 2 Gleisig. Beta-User mit RHASSPY, FULLY und f18 mit
Spracheingabebutton und ich versuche immer noch Google SpeechToText weiter auszureizen.

Da meine Frau sagt, "Ist ja ganz nett die Spielerei, aber wenn ich einen Knopf drücken muss ist es solala", habe ich mich
weiter umgeschaut wie ich das aufbohren kann. Dabei geht es um das Eingangspost was ich von Zeit zu Zeit anpasse.

Als erstes bin ich bei faster-whisper gelandet. Das hat meine CPU aber zu stark belastet (230%). Dann kam mir Sonntag die Idee, ich nutze eine reine WakewordAPI. Zack https://picovoice.ai/platform/porcupine/ angemeldet....nah toll, wird hier und da als gut gelistet, die wollen aber keine Privaten. Ich warte immer noch auf Freischaltung und mit meinem Firmenaccount da reggen bringt auch nix, es soll ja für alle sein.

Dann bin ich über Openwakeword gestoplert. Das funktioniert top. Das läuft mit python venv. Ist schnell installiert und für einen Server braucht man wenig Code. Das JS verbindet sich dann per Websocket mit dem Server und schaltet bei Wakeword auf Google SpeechToText um. So konnte ich die CPU-Last von Whisper mit gut 230% auf dauerhaft 33% mit Openwakeword drücken.
Und die reine Wakeworderkennung ist wirkich top. Mitm PC und Mikro klappt das schon ganz gut. Nachteil, erstmal feste
Wakewords. James wird mit Alexa angesprochen. Aber bevor es nicht solide ist, fange ich kein Training an.

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Beta-User am 24 März 2026, 07:41:42
Moin,

die Changes (https://svn.fhem.de/trac/changeset/31010/trunk/fhem/FHEM und https://svn.fhem.de/trac/changeset/31009/trunk/fhem/FHEM) sind doch eher sehr überschaubar ;D , von daher ist "fleißig" relativ...
War schon vorher überzeugt, dass es ziemlich simpel sein sollte, FULLY als AMAD-Ersatz (sowohl für RHASSPY wie für Babble) zu verwenden, wenn man denn den STT-input "irgendwie" bekommt.

Die größere Aufgabe wird das Feintuning sein ::) .

Ad Wakeword:
- Rhasspy kann auch diverse Varianten und empfielt Porcupine. Das lief nach meinen (wenigen) Erfahrungen auch auf einem Pi (3B+?) ohne nennenswerte Last.
- Der Gedanke, ständig Audio über das Netz zu schicken, hat mir persönlich noch nie richtig gefallen... Von daher hatte ich zwischenzeitlich auch mal mit Android-Apps rumexperimentiert. Müßte das aber suchen, und wie dann der Link zu FHEMWEB/FULLY wäre, müßte man sich auch ansehen.

Im Moment würde ich eventuell optional die Aktivierung via Näherungssensor@FULLY als sinnvolle Option für Wanddisplays ansehen.


Mein Plan für die nächsten Schritte wäre,
- das Mikro interaktiv wieder zu aktivieren (für Rückfragen bzw. weitere Anweisungen)
- die Audio-Ausgabe mit "Thorsten" zu machen. Ein ebenfalls sehr schmaler Webserver für "Piper" (OHF-Voice/piper1-gpl) läuft bereits, Anleitung wäre hier zu finden: https://github.com/OHF-Voice/piper1-gpl/blob/main/docs/API_HTTP.md
- das auf der RHASSPY-Seite noch so zu ergänzen, dass es auch mit Chrome funktioniert :) .

Ansonsten finde ich die 2-gleisigkeit zumindest für den Moment völlig ok. Falls es stört, bitte melden.

An die RHASSPY-User (und eventuelle Interessierte): Falls es spezifische Themen zur dortigen Konfiguration geben sollte - Bitte in einem der RHASSPY-Threads melden oder einfach einen neuen aufmachen.
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: rudolfkoenig am 25 März 2026, 20:57:49
Ich habe FHEMWEB mit dem publicHostnames Atrtribut erweitert: wenn gesetzt, dann wird ein Zertifikat mit diesen Rechnername/IP-Adressen erstellt.
Weiterhin bekommt man in der Detailansicht von FHEMWEB unter dem Reading publicCertificate einen Link zum oeffentlichen Zertifikat.
Soweit ich sehe, akzetieren die meisten Browser keine IP-Adressen, d.h. um es sinnvoll zu verwenden, muss man FHEM mit dem Rechnernamen aufrufen.

Auf meiner TODO Liste ist noch die eindeutige Client-Kennung fuer die STT Nachrichten.
Da hier sehr viel geschrieben wurde, und ich nicht sicher bin, dass ich alles verstanden habe: kann mir noch jemand zusammenfassen, was in f18 noch eingebaut werden sollte?
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Beta-User am 26 März 2026, 09:41:49
Zitat von: rudolfkoenig am 25 März 2026, 20:57:49Da hier sehr viel geschrieben wurde, und ich nicht sicher bin, dass ich alles verstanden habe: kann mir noch jemand zusammenfassen, was in f18 noch eingebaut werden sollte?
Hier mal der Versuch einer Zusammenfassung anhand des angehängten diff:

1.
   f18_setWidePortrait();
+  if (typeof fully !== 'undefined')
+    FW_cmd(FW_root + "?cmd=set TYPE=FULLY:FILTER=deviceid=" + fully.getDeviceId() + " host " + fully.getHostname() + "&XHR=1");
 });
Das ist eine Hilfe für das FULLY-Modul. Das Modul war bisher mit fester IP oder festem hostname einzurichten, was dann nicht klappt, wenn das Android nicht speziell so konfiguriert wird, dass im jeweiligen WLAN immer dieselbe MAC-Adresse bekannt gegeben wird.
Aus meiner Sicht wäre das eine dringende Bitte, es sei denn, wir wollen alle fully-spezifischen Einstellungen in eine eigene .js auslagern. Dann käme das da rein.

2.
-  if(!window.SpeechRecognition)
+  var Recognition = window.SpeechRecognition || window.webkitSpeechRecognition;
+  var isFully = (typeof fully !== 'undefined' && typeof fully.startSpeechRecognition === 'function');
+
+  if (!Recognition && !isFully)
     return FW_okDialog("SpeechRecognition Interface missing");

-  var stt = new SpeechRecognition();
+  if (isFully) {
+    fully.startSpeechRecognition("", false);
+    window.onSpeechRecognitionResult = function(result) {
+      if (result) {
+         FW_cmd(FW_root + "?cmd=set TYPE=FULLY:FILTER=deviceid=" + fully.getDeviceId() + " STTinput " + encodeURIComponent(txt) + " [" + $("body").attr("fw_id") + "]&XHR=1");
+      }
+    };
+    return;
+  }
+
+  var stt = new Recognition();
Das ist der übernommene patch-Vorschlag von schwatter. Der Teil funktioniert bei mir nicht, das könnte eventuell für eine frühere fully-Version hilfreich sein.

Den Teil würde ich im Moment NICHT dringend ins svn übernehmen und erst mal warten, ob das mit (halbwegs) aktuellen Android-Modellen überhaupt auftritt (oder auch mit älteren der nachfolgende Teil ausreicht):

3.
-      if(doSend && txt)
+      if(doSend && txt){
+        if (typeof fully !== 'undefined')
+          FW_cmd(FW_root + "?cmd=set TYPE=FULLY:FILTER=deviceid=" + fully.getDeviceId() + " STTinput " + encodeURIComponent(txt) + " [" + $("body").attr("fw_id") + "]&XHR=1");
         FW_cmd(FW_root+"?cmd=setreading "+$("body").attr("data-webName")+
                " STT "+encodeURIComponent(txt)+"&XHR=1");
+      }
+

Damit bekommt man die für die jetzige svn-Fassung von FULLY erforderlichen Infos im von schatter vorgeschlagenen Format (in eckigen Klammern angehängte FW_ID).

Anders formuliert:
Mit den patch-Teilen 1 und 3 könnte Gisbert nach einem update mit testen. Er würde nur (in FHEM) ein FULLY-Device benötigen und müßte dort im Attribut "STTprocessor" auf sein "zuständiges" RHASSPY-Device verweisen, und dazu noch die STT-Option in f18 aktivieren. Dann sollte es zumindest mit installiertem fully (mit PLUS-Lizenz) funktionieren, von dort aus Sprachbefehle via f18 einzusprechen und die passende Antwort zu erhalten.

Meine (komplettere) Wunschliste würde ich dann später mal posten, und vorher eventuell noch das eine oder andere Testen.
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Gisbert am 26 März 2026, 11:41:52
Zitat von: Beta-User am 26 März 2026, 09:41:49Anders formuliert:
Mit den patch-Teilen 1 und 3 könnte Gisbert nach einem update mit testen. Er würde nur (in FHEM) ein FULLY-Device benötigen und müßte dort im Attribut "STTprocessor" auf sein "zuständiges" RHASSPY-Device verweisen, und dazu noch die STT-Option in f18 aktivieren. Dann sollte es zumindest mit installiertem fully (mit PLUS-Lizenz) funktionieren, von dort aus Sprachbefehle via f18 einzusprechen und die passende Antwort zu erhalten.

Hallo Jörg,

ich bin gerne bereit zu testen, falls euch das in der Entwicklung weiterhilft. Dazu müsste ich aber genau wissen, was ich zu tun habe. Das Ziel kann ich wohl erkennen, aber die einzelnen Schritte dazu verstehe ich noch nicht.
Falls dein Ansinnen nur dazu da ist, mich mit meinem Sonderweg(? - RHASSPY, AMAD, Automagic, Google Speech Service) zu begleiten, dann ist das nicht nötig. Ich warte gerne, bis ein testreifer Zustand erreicht ist, und ich wie oben geschildert einsteigen kann.

Viele Grüße Gisbert
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 26 März 2026, 18:06:40
@beta-user

zu 2.
Ich habe gerade nochmal Fully auf meinem LineageOS 23.2, sprich Android 16 installiert. Mit dem Patch aus #35
funktioniert das Mikro von Rudolf bei mir auch. Ich verstehe nicht, warum das bei dir nicht funktioniert.

@Rudolf
Danke für das einbauen um direkt Zertifikate zu generieren. Ich habe es gerade auf meinem Handy mit Chrome getestet.
Eine Verbindung mit http://hostname:8083/fhem konnte ich aufbauen. Leider kommt ständig
"Connection lost try reconnect evvery 5 sek." Ab und zu kann ich mich durch mein Fhem klicken. Woher können die
Abbrüche kommen? Longpoll habe ich auf websocket. Mit Verbose 5 sehe ich nichts. Ich muss mal ADB anschmeißen.

edit:
Hat sich erstmal erledigt. Ich habe nicht gesehen das ich auf http zugegriffen habe...Die doofe Adresszeile blendet das ja immer aus....
Ich denke jetzt ist es ok.

edit2:
Fully benötigt in den Einstellungen die Option ,,Ignore SSL Errors", damit HTTPS funktioniert.
Auf meinem Firmenhandy trat das Problem ebenfalls auf, bis mir aufgefallen ist, dass ich ja Private DNS (dns.adguard.com) konfiguriert hatte. Nach dem Deaktivieren des privaten DNS funktionierte die Verbindung problemlos.

edit3:
Außerdem kann ich bestätigen, das das Mikro von Rudolf in f18 und Semi-HTTPS funktioniert. Super.

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: rudolfkoenig am 26 März 2026, 22:19:40
ZitatMit den patch-Teilen 1 und 3 könnte Gisbert nach einem update mit testen.
Ich habe das auch so eingecheckt.

Weiterhin habe ich das Generieren des Zertifikats umgebaut.
Da aktuelle Browser keine selbstsignierten Zertifikate akzeptieren, wird erst ein CA Zertifikat erzeugt, und damit das FHEMWEB Zertifikat signiert.
Zum Download wird jetzt das CA Zertifikat angeboten, das muss man installieren.
Hat den weiteren Vorteil, dass beim Anpassen des FHEMWEB Zertifikates nichts mehr installiert werden muss, da (wenn einmal vorhanden) das CA Zertifikat nicht mehr geaendert wird.
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 26 März 2026, 22:41:38
Ich habe noch 2 Anmerkungen

1. Wenn puplicHostnames gesetzt und dann HTTPS auf 1 blockiert mein Browser. Ein Neustart cancelt dann den Save?

2. puplicHostnames ohne Domain sind schlecht, da in Chrome z.B. keine Logindaten gespeichert werden können. Mh, wird .local verschluckt?

Grußs schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Beta-User am 26 März 2026, 23:06:37
Zitat von: rudolfkoenig am 26 März 2026, 22:19:40Ich habe das auch so eingecheckt.
Danke!

Zitat von: schwatter am 26 März 2026, 18:06:40@beta-user

zu 2.
Ich habe gerade nochmal Fully auf meinem LineageOS 23.2, sprich Android 16 installiert. Mit dem Patch aus #35 funktioniert das Mikro von Rudolf bei mir auch. Ich verstehe nicht, warum das bei dir nicht funktioniert.
Kann durchaus sein, dass ich beim Testen was falsch gemacht habe, werd's bei Gelegenheit nochmal durchspielen. fully ist/war zumindest bei den ersten Tests ziemlich zickig, was die Akzeptanz des geänderten js anging, und mit der Sprache selbst fremdle ich auch noch ziemlich, und war vor allem froh, als es dann "irgendwie" und irgendwann überhaupt funktioniert hat ::) .

Zitat von: Gisbert am 26 März 2026, 11:41:52ich bin gerne bereit zu testen, falls euch das in der Entwicklung weiterhilft. Dazu müsste ich aber genau wissen, was ich zu tun habe. Das Ziel kann ich wohl erkennen, aber die einzelnen Schritte dazu verstehe ich noch nicht.

Falls (!) ich das richtig zusammengepuzzelt habe, wäre Schritt 1, das neue "publicHostnames"-Attribut an dem FHEMWEB-Device zu setzen, über das du in fully (sofern vorhanden) oder Chrome auf FHEM zugreifst, und im Browser nicht die IP-Adresse einzugeben, sondern den hostname.

2. Im Moment müßte f18 als Style gewählt sein und in den f18-Style-Einstellungen dann die Option STT aktiviert werden.

Dann solltest du nach dem Neuladen der FHEMWEB-Seite (eventuell nach Bestätigung des Zugriffs auf das Mikro) mit einem Klick auf das neu hinzugekommene Mikrofon-Symbol das Dialogfeld erhalten und was einsprechen können, das dann nach Klick auf "OK" an der FULLY-Instanz (falls angelegt) und zusätzlich am FHEMWEB-Device als Reading landet (auch hier ggf. die Seite neu laden, damit das neu angelegte Reading sichtbar wird).

3. Um das mit RHASSPY zu koppeln, wäre dann am FULLY-Device einfach der Name des RHASSPY-Devices einzutragen (Attribut: STTprocessor).   

4. Frage nach der Uhrzeit, schalte das Licht ein, usw.. Im Moment braucht man dazu eine PLUS-Lizenz, weil (intern) der reguläre "speak"-Befehl genutzt wird. Ansonsten ist am FULLY-Device zu sehen, was geantwortet worden wäre.

5. Weitere Tests: Mal sehen...
So oder so: vermutlich ist der Hauptteil erst mal jeweils die js zu tauschen (und den Browser zu überreden, die auch zu laden). Da steckt jeweils erst mal die meiste Funktionalität drin, den FULLY/RHASSPY-Teil würde ich dann via svn bereitstellen, vermutlich schlicht im regulären update.
Mein nächstes Zwischenziel wäre in Richtung Bedienbarkeit v.a. die Möglichkeit, von FHEM aus das Mikro wieder aufzumachen. Sollte eigentlich auf Basis von dem "welche Optionen gibt es"-Schnippsel von schwatter zu machen sein... :)
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 28 März 2026, 12:02:04
Mahlzeit,

ich habe mir für WakeWord-only einen Atom EchoS3R gekauft. Hat etwas gedauert bis ich wieder mit ESPHome drinne war,
aber nu klappt es sehr gut. Für den Anfang mit Alexa als Wakeword. Wenn erkannt, sendet er an das Topic
atom_echos3r_9888e00f4280:atom_echo/wakeword:.* wakeword.
Mein Plan, kleinen "Male to Male" adapter und den ESP direkt in den USB_Port von meinem FireHD 10 Plus, welches per
per Induktion geladen wird. Der kleine ist echt schnell und auch die Reichweite ist passabel. Google SpeechToText
klappt auch, aber das muss ich noch besser anbinden.

defmod atom_echos3r_9888e00f4280 MQTT2_DEVICE atom_echos3r_9888e00f4280
attr atom_echos3r_9888e00f4280 readingList atom_echos3r_9888e00f4280:atom_echo/debug:.* debug\
atom_echos3r_9888e00f4280:esphome/discover/atom-echos3r:.* { json2nameValue($EVENT) }\
atom_echos3r_9888e00f4280:atom_echo/status:.* status\
atom_echos3r_9888e00f4280:homeassistant/binary_sensor/atom-echos3r/atom_button/config:.* { json2nameValue($EVENT) }\
atom_echos3r_9888e00f4280:atom_echo/binary_sensor/atom_button/state:.* state\
atom_echos3r_9888e00f4280:atom_echo/wakeword:.* wakeword
attr atom_echos3r_9888e00f4280 room MQTT2_DEVICE

setstate atom_echos3r_9888e00f4280 OFF
setstate atom_echos3r_9888e00f4280 2026-03-28 10:51:51 IODev myFhembroker
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 avty_t atom_echo/status
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 board esp32-s3-devkitc-1
setstate atom_echos3r_9888e00f4280 2026-03-28 12:02:47 debug ␛[0;;36m[D][esp32.preferences:144]: Writing 1 items: 0 cached, 1 written, 0 failed␛[0m
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 dev_cns_1_1 mac
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 dev_cns_1_2 9888e00f4280
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 dev_ids 9888e00f4280
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 dev_mdl esp32-s3-devkitc-1
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 dev_mf Espressif
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 dev_name Atom Echo Alexa
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 dev_sw 2026.3.1 (config hash 0x3315fe1d)
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 friendly_name Atom Echo Alexa
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 ip 192.168.1.77
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 mac 9888e00f4280
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 name Atom Button
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 network wifi
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 platform ESP32
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 port 6053
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 stat_t atom_echo/binary_sensor/atom_button/state
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 state OFF
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 status online
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 uniq_id ESPbinary_sensoratom_button
setstate atom_echos3r_9888e00f4280 2026-03-28 12:01:48 version 2026.3.1
setstate atom_echos3r_9888e00f4280 2026-03-28 11:47:09 wakeword alexa_detected


Hier die original Yaml:
https://github.com/m5stack/esphome-yaml/blob/main/common/atom-echos3r-satellite-base.yaml

Meine angepasste für Fhem im Anhang.
Edit:
Jetzt immer in #1

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 28 März 2026, 17:07:29
Update im ersten Post

echo_s3r.yaml und voicecontrol_echo_s3r.js hinzugefügt. Der Echo s3r erkennt Alexa und sendet wie gesagt per
MQTT an Fhem. Das JS lauscht im Moment per Websocket im Hintergrund nach dem Reading wakeword. Erkennt es
alexa_detected wird Google SpeechToText freigeschaltet. Funktioniert jetzt dauerhaft top.
Vielleicht könnte ich auch im JS das Topic einfach abonnieren? Mal sehen, jetzt gerade ist es sehr
robust. Bitte lacht nicht, das Javascript ist ne Mischung aus James und Alexa. Der Umstand halt, früher
oder später wollte ich James mal trainieren.

Wer Interesse hat, es wird nur der Atom Echo s3r benötigt. Habe ich bei Botland gekauft. Kommt aus Polen
und dauert auch nur 2 Tage.
https://botland.de/atom-serie/27570-atom-echos3r-programmierbarer-lautsprecher-esp32-m5stack-c126-echo-6972934176189.html

Abscheckend kann ESPHome sein. Manchmal etwas kniffelig beim aufsetzen. Ich hatte erst das neuste Python installiert
und bin auf die Nase gefallen. Bei 3.13 ist gerade Ende. Habe dann 3.12 installiert.

Edit:
Werde ab und zu Infos in Post #1 hinzufügen.

Gruß schwatter

Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 30 März 2026, 20:03:29
Nabend,

ich habe das Eingangspost bearbeitet und auch einen Wikieintrag erstellt.

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Beta-User am 30 März 2026, 21:30:06
Hallo zusammen,

sieht so aus, als wäre es eventuell lohnend, den M5-Atom-Echo nochmal aus der Grabbel-Kiste zu holen. Hatte mal mit dem als Rhasspy-Satelliten experimentiert: https://community.rhasspy.org/t/m5-atom-echo-as-satellite/1784, vermutlich ist das noch keine S3-Variante.

Es gibt die Dinger übrigens auch mit Display: https://github.com/RealDeco/xiaozhi-esphome?tab=readme-ov-file

Habe im Moment noch andere Baustellen, von daher kann ich das Tempo im Moment nicht mitgehen.
Sehr cool ist jedenfalls auch das mit dem WebApp-Support. Nach der Anleitung von https://forum.fhem.de/index.php?msg=1360621 ist es mir auch gelungen, zumindest unter Chrome@Android ohne allzugroße Umstände mein Testsystem fullscreen auf dem Handy angezeigt zu bekommen und was einsprechen zu können. Von daher werde ich wohl erst mal versuchen RHASSPY so aufzubohren, dass das mit FHEMWEB-Events umgehen kann und passende Antworten ausspricht :) , ohne dass man dafür FULLY/fully benötigt.

Bezüglich Doku und Installation etc.: Ist geplant, die für die global-notify-Lösung benötigten .js-Files ins svn (contrib) zu bringen?

Damit das Ganze für später Lesende nicht zu verwirrend wird, ist es vermutlich besser, für die RHASSPY-spezifischen Themen dann einen neuen Thread aufzumachen, oder?
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 30 März 2026, 22:15:53
Zitat von: Beta-User am 30 März 2026, 21:30:06Hallo zusammen,

sieht so aus, als wäre es eventuell lohnend, den M5-Atom-Echo nochmal aus der Grabbel-Kiste zu holen. Hatte mal mit dem als Rhasspy-Satelliten experimentiert: https://community.rhasspy.org/t/m5-atom-echo-as-satellite/1784, vermutlich ist das noch keine S3-Variante.

Es gibt die Dinger übrigens auch mit Display: https://github.com/RealDeco/xiaozhi-esphome?tab=readme-ov-file

Ja, wenn du Zeit findest, mach mal. Die mit dem Display finde ich auch ganz nett. Meinen jetzigen finde ich super,
da er so klein ist und wie ein Hörgerät am Usb-Port hängt.
Und mein James Wakeword brauche ich auch nicht mehr trainieren. Es gibt eine große Sammlung.

https://github.com/TaterTotterson/microWakeWords

Das einbinden habe ich im Wiki auch beschrieben.

Zitat von: Beta-User am 30 März 2026, 21:30:06Habe im Moment noch andere Baustellen, von daher kann ich das Tempo im Moment nicht mitgehen.
Sehr cool ist jedenfalls auch das mit dem WebApp-Support. Nach der Anleitung von https://forum.fhem.de/index.php?msg=1360621 ist es mir auch gelungen, zumindest unter Chrome@Android ohne allzugroße Umstände mein Testsystem fullscreen auf dem Handy angezeigt zu bekommen und was einsprechen zu können. Von daher werde ich wohl erst mal versuchen RHASSPY so aufzubohren, dass das mit FHEMWEB-Events umgehen kann und passende Antworten ausspricht :) , ohne dass man dafür FULLY/fully benötigt.

Das Feature finde ich super, danke hier nochmal an Rudolph für HTTPS und WebAPP Support.

Zitat von: Beta-User am 30 März 2026, 21:30:06Bezüglich Doku und Installation etc.: Ist geplant, die für die global-notify-Lösung benötigten .js-Files ins svn (contrib) zu bringen?

Ja kann ich machen. Dann können sich interessierte User das Script aus dem contrib nach /fhem/www/pgm2 kopieren.

Zitat von: Beta-User am 30 März 2026, 21:30:06Damit das Ganze für später Lesende nicht zu verwirrend wird, ist es vermutlich besser, für die RHASSPY-spezifischen Themen dann einen neuen Thread aufzumachen, oder?

Ja, ich denke jetzt ist es an der Zeit, da es jetzt doch sehr auseinander driftet.

Btw:
Das notify überarbeite ich auch noch. Damit ist durch Filtern mehr natürliche Sprache möglich:
global:STT:.* {

  my ($cleanEvent, $clientId) = $EVENT =~ /^(.*)\s\[(.*)\]$/;
  $cleanEvent //= $EVENT;
  $clientId   //= "unknown";

  my $event_lc = lc($cleanEvent);

  # ---------------------------
  # Text bereinigen (optional)
  # ---------------------------
  $event_lc =~ s/\b(ich|brauche|mach|bitte|kannst du|würdest du|mal|doch)\b//g;

  # ---------------------------
  # Synonyme
  # ---------------------------
  my %rooms = (
    "esszimmer" => "Lampe01_Ez",
    "küche"     => "Deckenlampe_Kue",
  );

  my %onWords  = map { $_ => 1 } qw(an ein einschalten schalte starte aktivier aktiviere);
  my %offWords = map { $_ => 1 } qw(aus ausschalten schalte stop stoppe beende deaktivier deaktiviere);

  # ---------------------------
  # INTENT: LICHT
  # ---------------------------
  if ($event_lc =~ /(licht|lampe)/) {

    my ($room) = grep { $event_lc =~ /\b$_\b/ } keys %rooms;

    my $cmd;
    if (grep { $event_lc =~ /\b$_\b/ } keys %onWords) {
      $cmd = "on";
    }
    elsif (grep { $event_lc =~ /\b$_\b/ } keys %offWords) {
      $cmd = "off";
    }

    if ($room && $cmd) {
      fhem("set $rooms{$room} $cmd");
      return;
    }
  }

  # ---------------------------
  # INTENT: FERNSEHER
  # ---------------------------
  if ($event_lc =~ /(fernseher|tv)/) {

    if (grep { $event_lc =~ /\b$_\b/ } keys %onWords) {
      fhem("set VuPlus on");
    }
    elsif (grep { $event_lc =~ /\b$_\b/ } keys %offWords) {
      fhem("set VuPlus off");
    }

    return;
  }

  # ---------------------------
  # INTENT: STAUBSAUGER
  # ---------------------------
  if ($event_lc =~ /(reinige|sauge|putze)/) {

    my %roomsVac = (
      "arbeitszimmer" => "Arbeitszimmer",
      "badezimmer"    => "Badezimmer",
      "esszimmer"     => "Esszimmer",
      "flur"          => "Flur",
      "küche"         => "Küche",
      "wohnzimmer"    => "Wohnzimmer"
    );

    my @found = grep { $event_lc =~ /\b$_\b/ } keys %roomsVac;

    if (@found) {
      fhem("set MQTT2_valetudo_FlusteredUnequaledFish clean_segment " .
        join(",", map { $roomsVac{$_} } @found));
    }

    return;
  }

  # ---------------------------
  # INTENT: AMBIENTE
  # ---------------------------
  if ($event_lc =~ /ambiente/) {

    if ($event_lc =~ /(\d+)/) {
      my $b = ($1 > 255 ? 255 : ($1 < 1 ? 1 : $1));
      fhem("set LampeSzeneAlle brightness $b");
    }
    elsif (grep { $event_lc =~ /\b$_\b/ } keys %onWords) {
      fhem("set LampeSzeneAlle on");
    }
    elsif (grep { $event_lc =~ /\b$_\b/ } keys %offWords) {
      fhem("set LampeSzeneAlle off");
    }

    return;
  }

  # ---------------------------
  # INTENT: AMBILIGHT (SSH)
  # ---------------------------
  if ($event_lc =~ /ambilight/) {
    system("sshpass -p '1431Fhem1982' ssh -o StrictHostKeyChecking=no root\@192.168.1.46 '/usr/share/hyperhdr/scripts/hyperhdr_toggle.sh'");
    return;
  }

  # ---------------------------
  # INTENT: LADESTATION
  # ---------------------------
  if ($event_lc =~ /(lade|aufladen|dock)/) {
    fhem("set MQTT2_valetudo_FlusteredUnequaledFish charge");
    return;
  }

  # ---------------------------
  # HILFE
  # ---------------------------
  if ($event_lc =~ /(hilfe|kommandos)/) {

    my $h = '<div style="text-align:left;;min-width:200px;;font-family:sans-serif;;"><b>Beispiele:</b><br><br>';
    $h .= "• Licht im Esszimmer an<br>";
    $h .= "• Küche Licht aus<br>";
    $h .= "• Reinige Wohnzimmer<br>";
    $h .= "• Ambiente 120<br>";
    $h .= "• Fernseher an<br></div>";

    $h =~ s/'/\\"/g;

    my $js = "if((document.querySelector('input[name=\"fw_id\"]')||{}).value==='$clientId'){FW_okDialog('$h')}";

    FW_directNotify("#FHEMWEB:$_", $js, "")
      for devspec2array("TYPE=FHEMWEB");

    return;
  }
}

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Beta-User am 03 April 2026, 11:27:30
(v.a.) @Rudi
Habe nochmal etwas rumexperimentiert mit "interimResults".
Zumindest auf Chrome unter Android hat man zum einen die direkte Rückmeldung über die Zwischenergebnisse und nur eine einmalige Anzeige des Endergebnisses:

var stt = new Recognition();
  stt.continuous = true;
  stt.interimResults = true;
  stt.lang = $("body").attr("data-language") == "EN" ? "en-US":"de-DE";

  var doSend = false;
  var txt = '';

  stt.onresult = function(e){
    var interim_txt = '';

    for(var i1=event.resultIndex; i1<event.results.length; ++i1) {
      if (event.results[i1].isFinal) {
        txt = event.results[i1][0].transcript;
        $("#f18_stt").html(txt);
      } else {
        interim_txt += event.results[i1][0].transcript;
        $("#f18_stt").html(interim_txt);
      }
    }
  };

Zitat von: schwatter am 30 März 2026, 22:15:53Ja kann ich machen. Dann können sich interessierte User das Script aus dem contrib nach /fhem/www/pgm2 kopieren.
Thx. Vielleicht dann noch die dynamischen Teile (insbes. $FW_id?) vorher anpassen, so dass das etwas weniger manueller Anpassung durch interessierte User braucht?

Zitat von: schwatter am 30 März 2026, 22:15:53Ja, ich denke jetzt ist es an der Zeit, da es jetzt doch sehr auseinander driftet.
Folgethread wäre hier zu finden: https://forum.fhem.de/index.php?topic=144370.0
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 03 April 2026, 18:46:05
Hallo zusammen,

das voicecontrol.js liegt jetzt im contrib. Das ist die Version für PushToTalk oder kurz AlwaysOn.
Außerdem hat das notify jetzt eine zentrale Mappingtabelle. Mit der ist es möglich, ein Hauptkeyword mit
diversen Filtern zu setzen. Ich hoffe damit ist es Userfreundlicher.

Beispiel:
"esszimmer:licht|lampe|deckenlampe" => { dev => "Lampe01_Ez", label => "Licht Esszimmer", cmdOn => "on", cmdOff => "off" }
Aufschlüsselung:
"hauptkeyword:Filter1|Filter3|Filter3" => { dev => "Devicename", label => "Übersichtname", cmdOn => "on", cmdOff => "off" }
Ich habe dazu das Wiki weiter angepasst:
https://wiki.fhem.de/wiki/FHEMWEB/VoiceControl:_Web-STT_%26_Hardware-Wakeword

Zitat von: Beta-User am 03 April 2026, 11:27:30
Zitat von: schwatter am 30 März 2026, 22:15:53Ja kann ich machen. Dann können sich interessierte User das Script aus dem contrib nach /fhem/www/pgm2 kopieren.
Thx. Vielleicht dann noch die dynamischen Teile (insbes. $FW_id?) vorher anpassen, so dass das etwas weniger manueller Anpassung durch interessierte User braucht?

Mh, anpassen muss man da eigentlich nichts? Das Javascript kopieren und laden. Das notify erstellen und los gehts.

Edit:
Ganz vergessen. Mit dem notify können jetzt auch mehrere Befehle kombiniert werden:

Ich: James!?
James: Ja?
Ich: Schalte das Licht in der Küche aus und schalte das Licht im Esszimmer an.
James: Erledigt!


Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Beta-User am 03 April 2026, 21:08:02
Zitat von: schwatter am 03 April 2026, 18:46:05das voicecontrol.js liegt jetzt im contrib. Das ist die Version für PushToTalk oder kurz AlwaysOn.
Thx!

Zitat von: schwatter am 03 April 2026, 18:46:05Mh, anpassen muss man da eigentlich nichts?
Sorry, falsche Referenz, geht um "FW_root". Das ist nicht zwangsläufig in jeder Installation "/fhem".
Habe das jetzt in der modifizierten Fassung so drin:
FW_cmd(FW_root+"?cmd=setreading TYPE=FHEMWEB:FILTER=FW_ID="+$("body").attr("fw_id")+
                        " STT "+encodeURIComponent(finalCommand)+"&XHR=1");

Damit landet die STT-Info in der betreffenden (temporären) FHEMWEB-Instanz. Hat den Nachteil, dass es nur solange "lebt", wie diese Instanz eben existiert, aber man kann dann das notify (bzw. künftig die NotifyFn() in RHASSPY&Co.) direkt darauf ansetzen und muss nicht erst den FW_ID-Teil rausoperieren (was zugegebenermaßen auch kein großer Aufwand ist).
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: rudolfkoenig am 04 April 2026, 12:17:00
ZitatHabe nochmal etwas rumexperimentiert mit "interimResults".
Habe es uebernommen.
Und dabei etwas modernere JS Sprachelemente genutzt (implementiert seit 10+ Jahren in den meisten Browsern), wenn jemand noch ein iPad 1 oder Internet Explorer verwendet, wird damit vmtl. keine Freude haben.

ZitatDamit landet die STT-Info in der betreffenden (temporären) FHEMWEB-Instanz.
Habe die Idee leicht angepasst uebernommen, und eine mini f18_speak Funktion eingebaut.
Damit ist Folgendes moeglich:
defmod sn notify WEB.*STT:.* { $EVENT=~s/STT: //;; FW_AsyncOutput($defs{$NAME},'',qq/["#FHEMWEB:","f18_speak('Got $EVENT')",""]/)}
Voraussetzung ist z.Bsp. mit Chrome @ Android die installierte und aktivierte Sprachsynthese App von Google.

Man kann mit der obigen Methode auch direkt Nachrichten schicken, allerdings werden sie nur dann vorgelesen, wenn Chrome sichtbar ist.
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 04 April 2026, 13:11:31
Hallo Rudi

danke. Ich habe ein paar Fragen

1. Beta_User und Rudi
Beta-User sagt: "FW_root". Das ist nicht zwangsläufig in jeder Installation "/fhem".
Wie ist das gemeint. Es ist ja hier dokumentiert:
https://wiki.fhem.de/wiki/DevelopmentFHEMWEB-API

2. Kann man Fhemweb direkt ein Inform rauskitzeln, das ein Device betrifft, was nicht im selben Raum ist,
oder wenn man sich nicht gerade in der Deviceübersicht befindet. Was dann funktioniert, wie eine
Websocketverbindung im Hintergrund. Nach meinem Verständnis kann ich über Fhemweb nur Devices auslesen,
die Direkt im sichtbaren Bereich sind.

3.
Mir ist beim anschauen per F12 Konsole aufgefallen, das Werte von Readings immer gedoppelt sind.
Warum ist das so? Beispiel:
13:10:13.353 Rcvd: ["MQTT2_valetudo_UrbanBrownKoala-signal","-69","-69"]
fhemweb.js:613 13:10:13.354 Rcvd: ["MQTT2_valetudo_UrbanBrownKoala-signal-ts","2026-04-04 13:10:13","2026-04-04 13:10:13"]

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: rudolfkoenig am 04 April 2026, 13:27:38
ZitatBeta-User sagt: "FW_root". Das ist nicht zwangsläufig in jeder Installation "/fhem".
Wie ist das gemeint.
So wie er das sagt :)
FW_root ist auf der JavaScript Seite der Wert des FHEMWEB Attributes webname.

ZitatNach meinem Verständnis kann ich über Fhemweb nur Devices auslesen,
die Direkt im sichtbaren Bereich sind.
Auslesen kannst Du jederzeit z.Bsp. mit jsonlist2, nur eine Benachrichtigung kriegst Du nicht.
Man kann mit einer inform=XXX Nachricht eine andere Benachrichtigung bestellen, was die Aktuelle ersetzt.

ZitatMir ist beim anschauen per F12 Konsole aufgefallen, das Werte von Readings immer gedoppelt sind.
Die erste Zeile ist Wert, die Zweite Zeitstempel, historisch gewachsen.
Parameter 2 und 3 im Array sind fuer readingsUpdates gleich, in anderen Faellen nicht.
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 04 April 2026, 14:29:02
Zu 1.
Oha, ich habe das falsch interpretiert. Ich dachte ich solle fw_root nicht nehmen. Es war anderherum gemeint,
Asche auf mein Haupt  ::)

Zu 2.
Anders gefragt, es gibt ja in fhemweb.js die FW_longpoll(). Die hat diverse Filter, die mich meiner Meinung nach
daran hindern, direkt inform=xxx zu nutzen, von Devices welche nicht im Raum oder in der Deviceübersicht vorhanden
sind.

Ich nutze dazu momentan:
const protocol = location.protocol === "https:" ? "wss:" : "ws:";
const combinedFilter = `(${DEVICE}|global)`;
jamesSocket = new WebSocket(`${protocol}//${FHEM_IP}/fhem?XHR=1&inform=type=status;filter=${combinedFilter}`);

Wie findest du es, wenn man mit einem geladenen JS in Fhemweb direkt an der Stelle per inform=xxx abonieren könnte?

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Beta-User am 05 April 2026, 09:25:15
Zitat von: rudolfkoenig am 04 April 2026, 12:17:00und eine mini f18_speak Funktion eingebaut.
Komme mir vor wie wenn Weihnachten und Ostern zusammenfallen ;D  ;D  ;D  ;D  ;D

Vielen Dank!

Bin bei der Frage, wie das mit dem automatisierten Wieder-Öffnen des Mikros gehen könnte dann über das hier gestolpert:
https://iifx.dev/en/articles/457363230/chrome-tts-workarounds-solving-the-speechsynthesisutterance-event-and-initial-speak-failure (Stand: 11/25), und habe daraufhin jetzt mal auf die Schnelle den Code so erweitert:

function
f18_speak(txt)
{
  let synth = window.speechSynthesis;
  if(!synth)
    return FW_okDialog("No speechSynthesis available");

  const utterance = new SpeechSynthesisUtterance(txt);
   
  // Good practice: Set listeners even if they're unreliable on all voices
  utterance.onend = () => {
        var fw_id = $("body").attr("fw_id");
        FW_cmd(`${FW_root}?cmd=setreading `+
               `TYPE=FHEMWEB:FILTER=FW_ID=${fw_id}:FILTER=inform=.%2B `+
               `TTS_state finished&XHR=1`);
  };

  synth.speak(utterance);
}

Mein eigentlicher Gedanke war gewesen, das direkt in JavaScript zu lösen (erst mal nicht unbedingt "modern", aber halt funktional... ::) ), aber wenn das nicht in allen Browsern/Systemen verlässlich geht, kann ich mir wohl auch mit NotifyFn() in RHASSPY behelfen und alternativ einen (längeren) InternalTimer setzen, um den Dialog fortzusetzen.

Jetzt gibt es erst mal Frühstück, meine Rest-Wunschliste niederzuschreiben muss erst mal noch warten :) . 
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 05 April 2026, 19:28:59
Nabend Rudolf,

ich habe mich mal genauer mit FHEMWEB.pm und fhemweb.js beschäftig. Mir ist es gelungen, ein Device in einem
Raum per inform mit hinzuzufügen ohne das das Device vorhanden ist.

1. Änderungen in fhemweb.js
A) Ganz oben in der Datei (bei den anderen Variablen):
var FW_additionalInformIds = [];

B) Innerhalb der function FW_longpoll():
// Suche die Zeile mit 'var since = "null";' und ändere den Block darunter so ab:

  var since = "null";
  if(FW_serverGenerated)
    since = FW_serverLastMsg + (FW_serverGenerated-FW_serverFirstMsg);

  // --- START PATCH ---
  var informString = "type=status;filter="+filter+";since="+since+";fmt=JSON";

  // IDs aus dem globalen Array hinzufügen, falls vorhanden
  if(typeof FW_additionalInformIds !== "undefined" && FW_additionalInformIds.length > 0) {
      informString += ";addIds=" + FW_additionalInformIds.join(",");
  }

  var inform = encodeURIComponent(informString);
  // --- END PATCH ---

  var query = "?XHR=1"+
              "&inform="+inform+
// ... Rest der Funktion bleibt gleich

2. Änderungen in 01_FHEMWEB.pm
Suche die sub FW_initInform($$).

Perl
# --- In 01_FHEMWEB.pm ---
# Suche die Zeile: my %h = map { $_ => 1 } devspec2array($filter);
# Füge direkt danach diesen Block ein:

  my %h = map { $_ => 1 } devspec2array($filter);

  # --- START PATCH ---
  if($me->{inform} && $me->{inform}{addIds}) {
    foreach my $d (split(",", $me->{inform}{addIds})) {
      if($defs{$d}) {
        $h{$d} = 1;
        $FW_visibleDeviceHash{$d} = 1;
      }
    }
  }
  # --- END PATCH ---

  $h{global} = 1 if( $me->{inform}{addglobal} );
// ... Rest der Funktion bleibt gleich

Danach kann ich in der Browserkonsole den Inform auslösen:
window.FW_additionalInformIds = ["Pumpe_FBH_Pwr"];
FW_closeConn(); setTimeout(FW_longpoll, 500);


Danach kam mir aber die Idee, das das nicht so dolle ist. Jedesmal stoppen um dann wieder zu starten.
Wie wäre es, wenn direkt in FHEMWEB-Device ein attr additionalInformID hinzugefügt wird. Da kann dann
eine Liste mit Device(s) eingetragen werden, welche in jedem Raum verfügbar sein soll.

Gruß schwatter {"frohe": "Ostern"}

Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 05 April 2026, 23:17:48
So,

damit geht es nur mit 01_FHEMWEB.pm

  # Initialize internal structures
  map { addToAttrList($_, "FHEMWEB") } (
    "additionalInformIds",
    "cmdIcon",
    "devStateIcon:textField-long",
    "devStateStyle",
    "icon",
    "sortby",
    "webCmd",
    "webCmdLabel:textField-long",
    "widgetOverride"
  );

  my %h = map { $_ => 1 } devspec2array($filter);
  # --- Manuelle IDs in den Überwachungs-Hash injizieren (start)---
  my $addIds = AttrVal($FW_wname, "additionalInformIds", undef);
  if(my $addIds = AttrVal($FW_wname, "additionalInformIds", undef)) {
    map { $h{$_} = $FW_visibleDeviceHash{$_} = 1 if($defs{$_}) } split(/\s*,\s*/, $addIds);
  }
  # --- Manuelle IDs in den Überwachungs-Hash injizieren (ende)---
  $h{global} = 1 if( $me->{inform}{addglobal} );

attr WEBphone additionalInformIds Pumpe_FBH_Pwr,Kuehlschrank
Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Prof. Dr. Peter Henning am 06 April 2026, 09:33:56
Wenn wir schon über solche Dinge diskutieren: Im Juli letzten Jahres habe ich die Javascript-Programme veröffentlicht, mit denen ich FHEM dazu bringen kann, per push in einem der modernen Browser eine von FHEM gelieferte MP3-Datei abzuspielen. Anders ausgedrückt: Sprachausgabe direkt im Browser.

Dazu wird im Browser ein Shared Worker für Server Side Events gestartet, der auf einen bestimmten Port am FHEM-Server lauscht. Am FHEM-Server wird dann, wenn benötigt, ein Push auf diesen Port ausgelöst.

Das könnte man eigentlich problemlos in das Standard-Frontend integrieren und hätte dann nicht nur die eine Richtung.

LG

pah
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: rudolfkoenig am 06 April 2026, 12:02:47
ZitatBin bei der Frage, wie das mit dem automatisierten Wieder-Öffnen des Mikros gehen könnte dann über das hier gestolpert:
Wieso oeffnet das gezeigte Code-Stueck das Micro wieder?
Und warum will man das ueberhaupt? :)


Zitatdamit geht es nur mit 01_FHEMWEB.pm
Habs leicht abgewandelt als additionalInform eingebaut.


ZitatDas könnte man eigentlich problemlos in das Standard-Frontend integrieren und hätte dann nicht nur die eine Richtung.
Push ist seit 28.3 in f18.js eingebaut (siehe https://forum.fhem.de/index.php?topic=143778.msg1360637#msg1360637), und fuer TTS siehe meinen Beitrag hier von vorgestern.
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Beta-User am 07 April 2026, 06:26:36
Zitat von: rudolfkoenig am 06 April 2026, 12:02:47Wieso oeffnet das gezeigte Code-Stueck das Micro wieder?
Der Code wirft jetzt "nur" einen "bin fertig mit sprechen" Event, damit man auf der FHEM-Seite den Zeitpunkt kennt, ab wann man das Mikro wieder aufmachen kann, WENN man weitere Infos vom Sprecher haben möchte.
ZitatUnd warum will man das ueberhaupt? :)
Das scheine ich nicht gut erklärt zu haben. "Man" will das nicht zwangsläufig immer, sondern nur in gewissen Fällen. Wenn es auf der js-Seite sicher klappen würde, hätte ich dementsprechend versucht, das mit der Übergabe eines weiteren Parameters zu steuern, ob danach das Mikro wieder aktiviert werden soll :) .
So ist jetzt der "AMAD-Weg" der Plan; das wirft auch einen Event, wenn die jeweilige Anweisung "durch" ist.

Nachtrag: die eben eingecheckte Version von RHASSPY enthält eine erste funktionsfähige Event-Verarbeitung in diesem Sinne, so dass wir uns jetzt dann (optionalen) optischen und funktionalen Fragen zu wenden könnten (und ich die in CustomIntent mit Dialog (https://forum.fhem.de/index.php?topic=139337.0) begonnenen Erweiterungen fortsetzen kann).

ZitatPush ist seit 28.3 in f18.js eingebaut (siehe https://forum.fhem.de/index.php?topic=143778.msg1360637#msg1360637 (https://forum.fhem.de/index.php?topic=143778.msg1360637#msg1360637)),
Mit den Neuerungen bzgl. push und additionalInform muss ich mich erst mal befassen, wie das in dem Zusammenhang zweckmäßigerweise einzubauen ist.

Zitatund fuer TTS siehe meinen Beitrag hier von vorgestern.
Wenn ich das richtig verstanden habe, geht es pah nicht darum, die TTS-Fähigeit des Endgeräts direkt zu nutzen, sondern "Jeannie" (?) sprechen zu lassen, damit die Sprachausgabe aus FHEM auf allen Endgeräten gleich klingt.
Dazu wird vorab Audio generiert (und zwischengespeichert) und dann das passende Audio abgespielt.
Da will ich (zumindest als Option) letztlich auch hinkommen, nur dass meine Audios nirgends gespeichert werden, sondern via piper-tts-Server (https://github.com/OHF-Voice/piper1-gpl/blob/main/docs/API_HTTP.md) on the fly generiert werden sollen.

Dementsprechend sollte die Push-Anweisung dahin gehen, das Audio (ggf. unter Angabe der Stimme für unterschiedliche Sprachen, je nach "Gesprächspartner") abzuholen, abzuspielen, und danach den Event "bin fertig mit Sprechen" zu generieren (oder eben das Mikro bei entsprechendem flag wieder direkt aufzumachen).
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Prof. Dr. Peter Henning am 07 April 2026, 18:21:57
Zitat von: Beta-User am 07 April 2026, 06:26:36Wenn ich das richtig verstanden habe, geht es pah nicht darum, die TTS-Fähigeit des Endgeräts direkt zu nutzen, sondern "Jeannie" (?) sprechen zu lassen, damit die Sprachausgabe aus FHEM auf allen Endgeräten gleich klingt.
Dazu wird vorab Audio generiert (und zwischengespeichert) und dann das passende Audio abgespielt.
Da will ich (zumindest als Option) letztlich auch hinkommen, nur dass meine Audios nirgends gespeichert werden, sondern via piper-tts-Server (https://github.com/OHF-Voice/piper1-gpl/blob/main/docs/API_HTTP.md) on the fly generiert werden sollen.

Dementsprechend sollte die Push-Anweisung dahin gehen, das Audio (ggf. unter Angabe der Stimme für unterschiedliche Sprachen, je nach "Gesprächspartner") abzuholen, abzuspielen, und danach den Event "bin fertig mit Sprechen" zu generieren (oder eben das Mikro bei entsprechendem flag wieder direkt aufzumachen).

Erstmal ist das vollkommen unabhängig von der Quelle der MP3-Datei - die kann man "on-the-fly" oder sonstwie generieren. Wobei hinzuzufügen wäre: 1. Selbstverständlich wird bei mir alles, was keine vordefinierte "Utterance" ist, neu generiert. 2. Meine vordefinierten Sachen haben alle 3-Ziffern-Codes. Beispielsweise steht 152 für "Der ID7 beginnt das Laden". Wenn ich jetzt mein speak()-Programm aufrufe mit speak("Tab1.EG",":152: weil die Sonne scheint"), wird als End-MP3 erzeugt "Der ID7 beginnt das Laden weil die Sonne scheint". Wobei nur der 2. Teil neu gerendert wird. Die Ausgabe erfolgt das auf dem Device "Tab1.EG". 3. Alle vordefinierten Sachen liegen bereits, alle neu gerenderten Sachen werden in einer mini-Datenbank gecasht, Kennzeichnung über ein Hash des Textes. Beim zweiten Aufruf identischer Texte wird also nicht neu gerendet, sondern das genommen, was schon in der Datenbank liegt.

Zweitens geht es tatsächlich nicht um "sowieso TTS-fähige Endgeräte". Sondern um beliebige Endgeräte, die per Browser mit FHEMWEB kommunizieren. Die können in der Regel MP3 abspielen, wenn man das als Benutzer anklickt. Was ich realisiert habe, ermöglicht das Abspielen beliebiger MP3-Dateien _ohne_ Benutzeraktion, also initiiert von FHEM im Browser (Safarr, Firefox, Chrome, Microsoft). Eben per Server Side Event.

Das muss also keineswegs eine Sprachnachricht sein, man kann problemlos realisieren, dass irgendein Event als Klingelton abgespielt wird. Beispielsweise steht ":203:" bei mir für den Ton einer richtig großen Kirchenglocke. speak("Browser",":203:") macht genau das an meinem Laptop.

LG

pah
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 07 April 2026, 19:38:43
Nabend,

in etwa so?

1. fhemweb.js
function fw_playAudio(file) {
  var url = '/fhem/www/audio/' + file;

  console.log('PLAY:', url);

  var a = new Audio(url);
  a.play().catch(function(e){
    console.log('audio blocked:', e);
  });
}

2. in /opt/fhem/www/audio/ballhupe.mp3  user:fhem group:dialout

3. notify zum testen um meine Frau in den Wahnsinn zu treiben
defmod n_audio_test notify Lampe01_Ez:on { FW_directNotify("#FHEMWEB:$FW_wname","fw_playAudio('ballhupe.mp3')","");; }
Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Prof. Dr. Peter Henning am 08 April 2026, 03:17:00
Ohne das jetzt ausprobiert zu haben: Das würde mit ziemlicher Sicherheit in zwei auf den FHEM-Server geöffneten Browserfenstern zweimal die Audiodatei abspielen. Aus dem Grund habe ich einen "Shared Worker" implementiert.

LG

pah
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Beta-User am 08 April 2026, 07:24:58
Zitat von: schwatter am 07 April 2026, 19:38:43in etwa so?
:)
THX!

Wird ein wenig dauern, bis ich in Ruhe zum Testen komme, aber wie es ausschaut sollte das als Baumaterial genügen, um RHASSPY auch mit Thorsten zum Sprechen zu bringen ::) .

Hier noch ein ungeprüfter Netzfund zum "fertig"-Event:
myAudio.addEventListener("ended", function(){
     myAudio.currentTime = 0;
     console.log("ended");
});

https://stackoverflow.com/questions/11103582/how-do-you-detect-when-html5-audio-has-finished-playing-more-than-once
(Da die Variable immer neu definiert wird, braucht man das mit der currentTime hier eventuell nicht.)
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 08 April 2026, 07:38:44
Zitat von: Prof. Dr. Peter Henning am 08 April 2026, 03:17:00Ohne das jetzt ausprobiert zu haben: Das würde mit ziemlicher Sicherheit in zwei auf den FHEM-Server geöffneten Browserfenstern zweimal die Audiodatei abspielen. Aus dem Grund habe ich einen "Shared Worker" implementiert.

LG

pah

Morgen,

genau das macht es. Das ist der Rundumschlag. Zum differenzieren schicken wir dann
die fw_id mit. Mit der wird nur eine Nachricht in dem Fenster abgespielt, welches
gerade geöffnet ist. Dazu muss es noch etwas abgeändert werden.

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Prof. Dr. Peter Henning am 08 April 2026, 10:05:10
Es ging mir weniger ums Differenzieren, als darum, dass nur einmal abgespielt wird. Aber gut, der Weg ist tatsächlich einfacher als mit dem SSE-Server.

Da ich verschiedene FHEM-Server habe, wird mir als Titel der Seite jeweils das letzte Oktett der Server-IP angezeigt. Und bei dem FHEM mit dem SSE-Server kommt noch ein farbiger Punkt dazu, der den Status der SSE-Verbindung anzeigt. Rot=tot, Grün=SSE steht, Orange=wartet.

Wir bräuchten also in fhemweb.js auch noch eine Statusvariable. Dann könnte man z.B. bei blockiertem Audio wenigstens einen roten Punkt o.ä. anzeigen lassen.

LG

pah

//------------------------------------------------------------------------------------------------------
// Dynamisch Titel "FHEM <letztes Oktett der Server-IP>" setzen
//------------------------------------------------------------------------------------------------------

function setFhemHeaderFromServerIP() {
    try {
        const serverIP = new URL(window.location.href).hostname;
        const lastOctet = serverIP.split(".").pop();
        const hdr = document.getElementById("hdr");
       
        if (hdr && ! document.getElementById("fhem-title")) {
            const container = document.createElement("div");
            container.id = "fhem-title-container";
            container.style.cssText = "display: inline-block; margin: 0; padding: 0; vertical-align: middle;";
           
            const title = document.createElement("span");
            title.id = "fhem-title";
            title.textContent = "FHEM " + lastOctet;
            title.style.cssText = "display:inline;color:#6d77e2;font-size:24px;font-weight:bold;" +
            "text-shadow:2px 2px #c5c5c5;margin-right:6px;";
           
            const indicator = document.createElement("span");
            indicator.id = "sse-status";
            indicator.style.cssText = "display:inline-block;width:5px;height:5px;margin-left:4px;" +
            "border-radius:50%;vertical-align:middle;";
           
            container.appendChild(title);
            container.appendChild(indicator);
           
            hdr.insertBefore(container, hdr.firstChild);
        }
    }
    catch (e) {
        console.warn("Fehler beim Ermitteln der Server-IP: ", e);
    }
}

//------------------------------------------------------------------------------------------------------
// setHeaderStatusIcon (Farbwechsel für Statussymbol)
//------------------------------------------------------------------------------------------------------

function setHeaderStatusIcon(status) {
    const indicator = document.querySelector("#sse-status");
    if (! indicator || ! window.sseStatusAllowed) return;
   
    // Alle Statusklassen entfernen
    indicator.classList.remove("ok", "error", "waiting");
   
    // Neue Statusklasse setzen
    if (status === "ok") {
        indicator.classList.add("ok");
        indicator.style.backgroundColor = "#00cc00";
        indicator.title = "SSE-Verbindung aktiv";
    } else if (status === "error") {
        indicator.classList.add("error");
        indicator.style.backgroundColor = "#cc0000";
        indicator.title = "SSE-Verbindung fehlgeschlagen";
    } else if (status === "waiting") {
        indicator.classList.add("waiting");
        indicator.style.backgroundColor = "#ffcc00";
        indicator.title = "Verbindungsaufbau läuft";
    } else {
        indicator.remove();
    }
}
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 08 April 2026, 22:45:59
Nabend,

1. In Fhemweb.js am Ende einfügen

// --- FHEM Universal Audio & Speech Backend (Hybrid: Browser & Fully) ---
var fhemSelectedVoice = null;

function FW_audioControl(input) {
    if (!input || input.trim() === "") return;

    // --- 0. Variablen & Fully-Check ---
    var isFully = (typeof fully !== 'undefined' && typeof fully.textToSpeech === 'function');
    var onlyThisWindow = false;

    if (/\|actualWindow$/i.test(input)) {
        onlyThisWindow = true;
        input = input.replace(/\|actualWindow$/i, "").trim();
    }

    var myId = (document.querySelector('input[name="fw_id"]') || {}).value;
    if (onlyThisWindow && !myId) return;

    // --- 1. Stimmen-Management (nur für Standard-Browser nötig) ---
    var loadVoices = function() {
        if (isFully || typeof window.speechSynthesis === 'undefined') return;
        var voices = window.speechSynthesis.getVoices();
        if (voices.length > 0) {
            fhemSelectedVoice =
                voices.find(v => v.name.includes("Stefan")) ||
                voices.find(v => v.name.includes("Hans")) ||
                voices.find(v => v.lang.startsWith("de"));
        }
    };

    if (!isFully && window.speechSynthesis) {
        if (!fhemSelectedVoice) loadVoices();
        if (window.speechSynthesis.onvoiceschanged !== undefined) {
            window.speechSynthesis.onvoiceschanged = loadVoices;
        }
    }

    // --- 2. AUDIO-DATEI PLAYBACK (.mp3, .wav, .ogg) ---
    if (/\.(mp3|wav|ogg)$/i.test(input)) {
        var url = '/fhem/www/audio/' + input;
        console.log('FHEM_AUDIO PLAY:', url);
        var a = new Audio(url);
        a.play().catch(e => console.log('Audio blocked:', e));
    }
   
    // --- 3. SPRACHAUSGABE (TTS) ---
    else {
        console.log('FHEM_AUDIO SPEAK:', input);
       
        // Textreinigung (Markdown entfernen für Gemini)
        var cleanText = input.replace(/[_*#]/g, ' ').trim();
        cleanText = cleanText.replace(/\bOk\b/i, "Ok,,,");

        // A) Weg für Fully Kiosk (Tablet)
        if (isFully) {
            console.log('Using Fully Kiosk TTS');
            fully.textToSpeech(cleanText);
        }
        // B) Weg für Standard Browser (PC/Handy)
        else if (typeof SpeechSynthesisUtterance !== 'undefined' && window.speechSynthesis) {
            console.log('Using Web Speech API');
            try {
                window.speechSynthesis.cancel(); // Stau verhindern
                var utter = new SpeechSynthesisUtterance(cleanText);
                utter.lang = "de-DE";
                if (fhemSelectedVoice) utter.voice = fhemSelectedVoice;
                window.speechSynthesis.speak(utter);
            } catch (e) {
                console.error('TTS Error:', e);
            }
        } else {
            console.error('Keine Sprachausgabe-Engine verfügbar (Browser zu alt oder blockiert).');
        }
    }
}

// Optional: Einmaliges Vorab-Laden beim Start der Seite
if (window.speechSynthesis) {
    if (window.speechSynthesis.onvoiceschanged !== undefined) {
        window.speechSynthesis.onvoiceschanged = function() {
            var v = window.speechSynthesis.getVoices();
            if (v.length > 0 && !fhemSelectedVoice) {
                fhemSelectedVoice = v.find(s => s.name.includes("Stefan")) || v.find(s => s.lang.startsWith("de"));
            }
        };
    }
}

2. notify Beispiele

Aktuelles offenes Browserfenster
defmod n_audio_test notify Lampe01_Ez:on { FW_directNotify("#FHEMWEB:$FW_wname","FW_audioControl('ballhupe.mp3|actualWindow')","");; }
defmod n_audio_test notify Lampe01_Ez:on { FW_directNotify("#FHEMWEB:$FW_wname","FW_audioControl('Das ist ein Test|actualWindow')","");; }
Alle offenen Browser
defmod n_audio_test notify Lampe01_Ez:on { FW_directNotify("#FHEMWEB:$FW_wname","FW_audioControl('ballhupe.mp3')","");; }defmod n_audio_test notify Lampe01_Ez:on { FW_directNotify("#FHEMWEB:$FW_wname","FW_audioControl('Das ist ein Test')","");; }
EIn Statusicon ist noch nicht drin.

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Prof. Dr. Peter Henning am 11 April 2026, 11:18:24
Zwei kleine Ergänzungen:

1. Da es vorkommen kann, dass eine eigene Datei für TTS-Funktionen, die FW_directNotify aufruft, vor FHEMWEB geladen wird, sollte zur Vermeidung einer Fehlermeldung in diese eigene Datei ein
use vars qw($FW_directNotify);
2. Beim Abspielen von MP3-Dateien, die aus einzelnen Stücken zusammengesetzt worden sind, verhalten sich Browser in einer Hinsicht sehr viel zickiger als andere Geräte: Die einzelnen MP3-Stücke sollten vor dem Zusammenfügen alle dieselbe Sampling-Rate und Bitrate haben.

Statusicon habe ich in Arbeit.

LG

pah
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 12 April 2026, 10:11:11
Moin,

ich habe die Funktion für fhemweb.js nochmal geändert. Diese verarbeitet jetzt nur Sprachausgabe und Audiodatei.
Wie die Funktion dauerhaft dort verbleiben kann, ja darüber grüble ich noch. Momentan sind zu viele spezifische
Settings drin. Da müsste entschlackt werden und sowas wie den Namen des Sprechers muss vom z.B notify kommen.
Die fw_id schiebe ich jetzt nicht mehr dahin (hatte oben auch nicht richtig funktioniert), sondern verarbeite sie
wieder direkt im notify. Außerdem habe ich die Idee aus dem anderen Thread aufgegriffen, mehrstuffig zu agieren um
erst lokale Befehle zu verarbeiten, um dann bei "Frage" an Gemini zu senden.

Dialog
Ich: James?!
James: Ja?
Ich: Frage, wie wird das Wetter heute in kurz.
James: In M*********** ist es heute bewölkt bei 20 Grad Celsius

1. fhemweb.js
// --- FHEM Universal Audio & Speech Backend (Hybrid: Browser & Fully) ---
var fhemSelectedVoice = null;

function FW_audioControl(input) {
    if (!input || input.trim() === "") return;

    // --- 0. Variablen & Fully-Check ---
    var isFully = (typeof fully !== 'undefined' && typeof fully.textToSpeech === 'function');

    // --- 1. Stimmen-Management (nur für Standard-Browser nötig) ---
    var loadVoices = function() {
        if (isFully || typeof window.speechSynthesis === 'undefined') return;
        var voices = window.speechSynthesis.getVoices();
        if (voices.length > 0) {
            fhemSelectedVoice =
                voices.find(v => v.name.includes("Stefan")) ||
                voices.find(v => v.name.includes("Hans")) ||
                voices.find(v => v.lang.startsWith("de"));
        }
    };

    if (!isFully && window.speechSynthesis) {
        if (!fhemSelectedVoice) loadVoices();
        if (window.speechSynthesis.onvoiceschanged !== undefined) {
            window.speechSynthesis.onvoiceschanged = loadVoices;
        }
    }

    // --- 2. AUDIO-DATEI PLAYBACK (.mp3, .wav, .ogg) ---
    if (/\.(mp3|wav|ogg)$/i.test(input)) {
        var url = '/fhem/www/audio/' + input;
        console.log('FHEM_AUDIO PLAY:', url);
        var a = new Audio(url);
        a.play().catch(e => console.log('Audio blocked:', e));
    }
   
    // --- 3. SPRACHAUSGABE (TTS) ---
    else {
        console.log('FHEM_AUDIO SPEAK:', input);
       
        // Textreinigung (Markdown entfernen für Gemini)
        var cleanText = input.replace(/[_*#]/g, ' ').trim();
        cleanText = cleanText.replace(/\bOk\b/i, "Ok,,,");

        // A) Weg für Fully Kiosk (Tablet)
        if (isFully) {
            console.log('Using Fully Kiosk TTS');
            fully.textToSpeech(cleanText);
        }
        // B) Weg für Standard Browser (PC/Handy)
        else if (typeof SpeechSynthesisUtterance !== 'undefined' && window.speechSynthesis) {
            console.log('Using Web Speech API');
            try {
                window.speechSynthesis.cancel(); // Stau verhindern
                var utter = new SpeechSynthesisUtterance(cleanText);
                utter.lang = "de-DE";
                if (fhemSelectedVoice) utter.voice = fhemSelectedVoice;
                window.speechSynthesis.speak(utter);
            } catch (e) {
                console.error('TTS Error:', e);
            }
        } else {
            console.error('Keine Sprachausgabe-Engine verfügbar (Browser zu alt oder blockiert).');
        }
    }
}

// Optional: Einmaliges Vorab-Laden beim Start der Seite
if (window.speechSynthesis) {
    if (window.speechSynthesis.onvoiceschanged !== undefined) {
        window.speechSynthesis.onvoiceschanged = function() {
            var v = window.speechSynthesis.getVoices();
            if (v.length > 0 && !fhemSelectedVoice) {
                fhemSelectedVoice = v.find(s => s.name.includes("Stefan")) || v.find(s => s.lang.startsWith("de"));
            }
        };
    }
}

2. Voicecontrol.js aus contrib oder wer einen Atom Echo hat, aus Post 1.
{ Svn_GetFile('contrib/voicecontrol.js', 'www/pgm2/voicecontrol.js') }attr WEBphone JavaScripts www/pgm2/voicecontrol.jsDann "shutdown restart"

Hinweis: Wer einen Atom Echo s3r für Wakeword benutzt, der muss außerdem das neue attr additionalInform pro
FHEMWEB-Device setzen

attr WEBtablet additionalInform atom_echos3r_9888e00f4280,global
3. Gemini installieren
https://github.com/ahlers2mi/FHEM-Gemini

4. notify für Fhemsteuerung. Bei dem Wort "Frage" und der anschließenden Frage, wird der Textbaustein an
das Modul Gemini geschickt.
defmod n_VoiceControl notify global:STT:.* {\
    # --- VORBEREITUNG ---\
    my ($cleanEvent, $clientId) = $EVENT =~ /^(.*)\s\[(.*)\]$/;;\
    $cleanEvent //= $EVENT;;\
    $clientId   //= "unknown";;\
    my @responses;; \
    my $ki_aktiv = 0;; # Merker für die KI-Frage\
\
    # --- KONFIGURATION: Zentrales Mapping ---\
    my %smartHomeDevices = (\
        "esszimmer:licht|lampe|deckenlampe" => { dev => "Lampe01_Ez", label => "Licht Esszimmer",  cmdOn => "on", cmdOff => "off" },\
        "esszimmer:aquarium" => { dev => "Aquarium_Aktor", label => "Aquarium", cmdOn => "on", cmdOff => "off" },\
        "küche" => { dev => "Deckenlampe_Kue", label => "Licht Küche", cmdOn => "on", cmdOff => "off" },\
        "wohnzimmer" => { dev => "Lampe06_Dek", label => "Licht Wohnzimmer", cmdOn => "on", cmdOff => "off" },\
        "fernseher|tv" => { dev => "VuPlus", label => "Fernseher", cmdOn => "on", cmdOff => "off" },\
        "rechner|pc" => { dev => "PC_Aktor", label => "PC", cmdOn => "on", cmdOff => "off" },\
        "garage|tor" => { dev => "Garagentor_Aktor", label => "Garagentor öffnen/schließen", cmdOn => "open", cmdOff => "close" },\
        "kaffee" => { dev => "Kaffeemaschine", label => "Kaffeemaschine", cmdOn => "on", cmdOff => "off" },\
        "roberto" => { dev => "MQTT2_valetudo_FlusteredUnequaledFish", label => "Lade Roberto", cmdOn => "charge" },\
        "ambiente" => { dev => "LampeSzeneAlle", label => "Zentrales Licht", type => "dimmer", cmdOn => "on", cmdOff => "off" },\
        "sauge|reinige|putze|staubsauger|roboter" => { dev => "MQTT2_valetudo_FlusteredUnequaledFish", label => "Staubsauger", type => "vacuum" },\
         "ambilight" => { label => "Ambilight", type => "system", cmd => "sshpass -p '1431Fhem1982' ssh -o StrictHostKeyChecking=no root\@192.168.1.46 '/usr/share/hyperhdr/scripts/hyperhdr_toggle.sh'" }\
    );;\
\
    my %vacRooms = ("arbeitszimmer" => "Arbeitszimmer", "badezimmer" => "Badezimmer", "esszimmer" => "Esszimmer", "flur" => "Flur", "küche" => "Küche", "wohnzimmer" => "Wohnzimmer");;\
\
    my $onRegEx  = '\b(an|ein|einschalten|starte|aktivier|aktiviere|öffne|öffnen|auf|hoch|lade)\b';;\
    my $offRegEx = '\b(aus|ausschalten|stop|stoppe|beende|deaktivier|deaktiviere|schließe|schließen|zu|runter)\b';;\
\
    my @commands = split(/\s*(?:und|dann|,)\s*/, lc($cleanEvent));;\
\
    # --- DER BEFEHLS-LOOP ---\
    foreach my $cmd_part (@commands) {\
        $cmd_part =~ s/^\s+|\s+$//g;;\
        my $is_on  = ($cmd_part =~ /$onRegEx/) ? 1 : 0;;\
        my $is_off = ($cmd_part =~ /$offRegEx/) ? 1 : 0;;\
        \
        # --- GEMINI KI FRAGE ---\
        if ($cmd_part =~ /\bfrage\b/i) {\
            my ($question) = $cmd_part =~ /\bfrage\s+(.*)$/i;;\
            if ($question) {\
                fhem("set GeminiAI ask $question");;\
                push(@responses, "Ich frage Gemini nach: $question");;\
                $ki_aktiv = 1;; # Wir haben eine KI Frage, also am Ende kein "erledigt"\
            } else {\
                push(@responses, "Wie lautet deine Frage?");;\
            }\
            next;; \
        }\
\
        $cmd_part =~ s/\b(ich|brauche|mach|bitte|kannst du|würdest du|mal|doch|den|das|die|im|in der)\b//g;;\
\
        # --- GENERISCHE STEUERUNG ---\
        my $match = 0;;\
        foreach my $key (sort { ($smartHomeDevices{$b}{type}//"") cmp ($smartHomeDevices{$a}{type}//"") } keys %smartHomeDevices) {\
            my ($main, $must) = split(/:/, $key);;\
            if ($cmd_part =~ /\b($main)\b/i) {\
                next if ($must && $cmd_part !~ /\b($must)\b/i);;\
                my $d = $smartHomeDevices{$key};;\
                my $action_text = $is_off ? "aus" : "an";;\
\
                if (($d->{type} // "") eq "system") {\
                    system($d->{cmd});;\
                    push(@responses, "$d->{label} erledigt");;\
                }\
                elsif (($d->{type} // "") eq "vacuum") {\
                    my @found = grep { $cmd_part =~ /\b$_\b/ } keys %vacRooms;;\
                    fhem(@found ? "set $d->{dev} clean_segment ".join(",", map { $vacRooms{$_} } @found) : "set $d->{dev} start");;\
                    push(@responses, @found ? "Reinigung gestartet in " . join(" und ", @found) : "Staubsauger gestartet");;\
                }\
                elsif (($d->{type} // "") eq "dimmer") {\
                    if ($cmd_part =~ /(\d+)/) {\
                        my $val = int(($1 > 100 ? 100 : $1));;\
                        fhem("set $d->{dev} brightness " . int($val * 2.55));;\
                        push(@responses, "$d->{label} auf $val Prozent");;\
                    } else {\
                        fhem("set $d->{dev} " . ($is_off ? "off" : "on")) if ($is_on || $is_off);;\
                        push(@responses, "$d->{label} $action_text") if ($is_on || $is_off);;\
                    }\
                }\
                else {\
                    my $fhem_cmd = $is_off ? ($d->{cmdOff} // "off") : ($d->{cmdOn} // "on");;\
                    if ($is_on || $is_off) {\
                        fhem("set $d->{dev} $fhem_cmd");;\
                        push(@responses, "$d->{label} $action_text");;\
                    }\
                }\
                $match = 1;; last;;\
            }\
        }\
        next if $match;;\
\
        if ($cmd_part =~ /(hilfe|kommandos|übersicht)/) {\
            push(@responses, "Übersicht wird angezeigt");;\
            my $h = '<div style="text-align:left;;min-width:250px;;font-family:sans-serif;;"><b>Befehlsübersicht:</b><br><br>';;\
            my %seen;;\
            for my $k (sort keys %smartHomeDevices) {\
                my $d = $smartHomeDevices{$k};;\
                next if $seen{$d->{label}}++;; \
                my $suffix = ($d->{cmdOn} && $d->{cmdOff} && $d->{label} !~ /(an\/aus|öffnen\/schließen)/i) ? " (an/aus)" : "";;\
                $suffix = " [0-100%]" if ($d->{type} // "") eq "dimmer";;\
                $h .= "• $d->{label}$suffix<br>";;\
            }\
            $h .= '<br><u>Staubsauger Räume</u><br>• '.join(", ", map { ucfirst($_) } sort keys %vacRooms).'<br></div>';;\
            $h =~ s/'/\\"/g;;\
            my $js = "if((document.querySelector('input[name=\"fw_id\"]')||{}).value==='$clientId'){FW_okDialog('$h')}";;\
            FW_directNotify("#FHEMWEB:$_", $js, "") for devspec2array("TYPE=FHEMWEB");;\
        }\
    }\
\
    # --- SPRACHAUSGABE AN JAMES ---\
    if (@responses) {\
        # Nur "erledigt" setzen, wenn KEINE KI-Frage gestellt wurde\
        fhem("sleep 2;; setreading global voiceSpeak erledigt") if ($ki_aktiv == 0);;\
    }\
}

setstate n_VoiceControl 2026-04-12 09:26:44
setstate n_VoiceControl 2026-03-18 10:49:44 debug STT: kommandos [1773827299.67924]
setstate n_VoiceControl 2026-04-12 09:05:07 state active
setstate n_VoiceControl 2026-04-12 09:26:44 triggeredByDev global
setstate n_VoiceControl 2026-04-12 09:26:44 triggeredByEvent STT: frage wie wird das wetter heute [1775978374.82013]

5. notify für die Gemini-Sprachausgabe. Brauchen wir, weil wir eine neuen Event haben
defmod n_GeminiResponse notify GeminiAI:response:.* {\
    my $resp = ReadingsVal($NAME, "response", "");;\
    my $stt  = ReadingsVal("global", "STT", "");;\
    return if($resp eq "");;\
\
    # 1. ID extrahieren (wenn vorhanden)\
    my ($targetId) = $stt =~ /\[(.*?)\]/;;\
\
    # 2. Bereinigung für JavaScript\
    $resp =~ s/\*//g;; \
    $resp =~ s/['\r\n]/ /g;;\
    $resp =~ s/"/\\"/g;;\
\
    # 3. JavaScript-String zusammenbauen\
    my $js;;\
    if ($targetId) {\
        # Falls ID da ist: Nur ausführen, wenn die Browser-ID übereinstimmt\
        $js = "if(document.body.getAttribute('fw_id')==='$targetId'){FW_audioControl('$resp')}";;\
    } else {\
        # Falls keine ID da ist: Einfach an alle senden\
        $js = "FW_audioControl('$resp')";;\
    }\
\
    # 4. Senden\
    FW_directNotify("#FHEMWEB:$FW_wname", $js, "");;\
}

setstate n_GeminiResponse 2026-04-12 09:26:45
setstate n_GeminiResponse 2026-04-12 09:26:28 state active
setstate n_GeminiResponse 2026-04-12 09:26:45 triggeredByDev GeminiAI
setstate n_GeminiResponse 2026-04-12 09:26:45 triggeredByEvent response: In M********* ist es heute bewölkt bei 20 Grad Celsius



Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Adimarantis am 12 April 2026, 10:38:39
Zitat von: Beta-User am 26 März 2026, 09:41:49  f18_setWidePortrait();
+  if (typeof fully !== 'undefined')
+    FW_cmd(FW_root + "?cmd=set TYPE=FULLY:FILTER=deviceid=" + fully.getDeviceId() + " host " + fully.getHostname() + "&XHR=1");
 });

Diese Änderung führt bei mir jetzt dazu, dass ich in immer, wenn ich den Raum aufrufe in dem mein Fully Device steht diesen Fehler bekomme:
f18.js line 94:
Uncaught TypeError: fully.getDeviceId is not a function

Fehlt da in Fully noch ein Patch? Oder sollte es getDeviceInfo heissen (die Funktion gibt es in FULLY)

Gruß
Jörg
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 12 April 2026, 10:52:18
Laut Webseite gibt es String fully.getDeviceId()
Schauh hier unter https://www.fully-kiosk.com/en/#websiteintegration --> Get device info aufklappen

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Adimarantis am 12 April 2026, 11:56:42
Zitat von: schwatter am 12 April 2026, 10:52:18Laut Webseite gibt es String fully.getDeviceId()
Schauh hier unter https://www.fully-kiosk.com/en/#websiteintegration --> Get device info aufklappen

Gruß schwatter
Ok, da war ich erstmal falsch unterwegs - ist eine Javascript Routine und hat nichts mit dem FHEM Device zu tun.
Das Problem scheint daher zu kommen das mein FHEM device "fully" heisst - wenn ich das umbenenne verschwindet die Fehlermeldung.
Irgendwo glaubt das f18.js, dass das Javascript Objekt "fully" verfügbar wäre, wenn ein Raum ein Device namens "fully" enthält.

Jörg
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: rudolfkoenig am 12 April 2026, 14:55:45
ZitatDas Problem scheint daher zu kommen das mein FHEM device "fully" heisst - wenn ich das umbenenne verschwindet die Fehlermeldung.
Liegt daran, dass Browser alle HTML Elemente mit einem #id als globale Variablen anlegen.
Die Abfrage
typeof fully !== 'undefined'ist also leider nicht genau, wir sollten es weiter einschraenken.
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Prof. Dr. Peter Henning am 12 April 2026, 15:12:58
Hat jemand einen Link für mich auf die Verwendung eines Atom Echo für Wakeword Detection?

LG

pah
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 12 April 2026, 16:08:17
https://github.com/esphome/wake-word-voice-assistants/blob/main/m5stack-atom-echo/m5stack-atom-echo.yaml

Von dem habe ich mein Template für den Echo s3r erstellt. Da ist allerdings viel drinne, was für Fhem keiner
braucht. Schau dir mal das Template auf Seite 1 dazu an.

edit:
Und beim bauen mit esphome nutze ich im python 3.12. Ab einer bestimmten neueren Version funktioniert es nicht mehr. Ab 3.13? Habs gerade nicht im Kopf.

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 13 April 2026, 22:06:25
Nabend

Update im contrib
{ Svn_GetFile('contrib/voicecontrol.js', 'www/pgm2/voicecontrol.js') }

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Beta-User am 14 April 2026, 07:06:26
@Adimarantis: Sorry für die Unannehmlichkeiten,

Zitat von: rudolfkoenig am 12 April 2026, 14:55:45ist also leider nicht genau, wir sollten es weiter einschraenken.
Habe die beiden Abfragen (#92 und #200) in f18.js erweitert:
  if(typeof fully !== 'undefined' && typeof fully.getDeviceId !== 'undefined')
(Mit javascript fremdle ich immer noch: warum hat denn "typeof ... === 'function'" nicht funktioniert?!? (bitte nicht beantworten, vermutlich ist es halt ein string, man braucht irgendwelche "anderen Klammern" oder whatever))
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: rudolfkoenig am 15 April 2026, 22:38:06
Zitatif(typeof fully !== 'undefined' && typeof fully.getDeviceId !== 'undefined')
Ich wuerde es gerne "positiv" ausdruecken: was liefert denn in der JS Console typeof(fully) bzw. typeof(fully.getDeviceId) zurueck?
Wenn keine JS Console verfuegbar ist, dann kann man es auch mit FW_okDialog(typeof(fully)) versuchen.
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: Beta-User am 16 April 2026, 07:38:45
Zitat von: rudolfkoenig am 15 April 2026, 22:38:06
Zitatif(typeof fully !== 'undefined' && typeof fully.getDeviceId !== 'undefined')
Ich wuerde es gerne "positiv" ausdruecken: was liefert denn in der JS Console typeof(fully) bzw. typeof(fully.getDeviceId) zurueck?
Wenn keine JS Console verfuegbar ist, dann kann man es auch mit FW_okDialog(typeof(fully)) versuchen.
Hab's jetzt über setreading-Anweisungen in f18.js so ausgeknobelt:
  if(typeof fully === 'object' && typeof fully.getDeviceId === 'function')(Das Problem v.a. in fully scheint zu sein, dass man nie genau sagen kann, welche Fassung von einem script jetzt wirklich geladen ist...
Jedenfalls habe ich keinen Zugang zu js-Konsole oä. entdecken können.)
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 16 April 2026, 08:34:43
Moin,

ich habe in Fully auch noch nie Debug betrieben. Laut Fully Seite. Da steht bei
"Advanced Web Settings". --> " Enable Webview Contents Debugging".
Das wäre dann das wahrscheinlich:
https://forum.fhem.de/index.php?msg=1359579

Heut Abend schau ich mir das an. Ob Fully direkt was anbietet oder ob es so
gemacht werden muss wie im Link von mir.

Gruß schwatter
Titel: Aw: [Voicecontrol] Button für Fhemweb
Beitrag von: schwatter am 26 April 2026, 18:30:30
Nabend,

Update der voicecontrol_echo.js auf Seite 1.

- Status wir jetzt in localStorage gespeichert. Damit überlebt das JS einen Seitenwechsel.

Gruß schwatter