NEUE Betreff: Text-to-Speech App

Begonnen von mediastudio, 02 November 2025, 17:59:16

Vorheriges Thema - Nächstes Thema

mediastudio

Funktioniert die App mit flex.js überhaupt nicht oder nur bestimmte Ansichten, ich werde morgen mal
deine Fehlermeldung prüfen, andernfalls müsste ich mir ein FHEM mit  flex Style  aufsetzen.

Gisbert

Zitat von: mediastudio am 06 November 2025, 21:23:29Funktioniert die App mit flex.js überhaupt nicht oder nur bestimmte Ansichten, ich werde morgen mal
deine Fehlermeldung prüfen, andernfalls müsste ich mir ein FHEM mit  flex Style  aufsetzen.

Die App funktioniert schon, nur dass bei jedem Seitenwechsel die besagte Meldung als Einblendung vorhanden ist, die man dann erst schließen muss (mit einem ok).
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

mediastudio

Ich habe das mal untersucht,
if (typeof data.Results[0] !== "object") return;
Diese Zeile wirft den Fehler, wenn data.Results nicht existiert oder leer ist.
Also: data kommt vom FHEM-Aufruf jsonlist2 <webName>, aber FHEM liefert manchmal kein Objekt zurück, z. B. wenn:
webName leer oder falsch ist, das Device in FHEM nicht existiert, der Nutzer nicht eingeloggt ist oder falsche Rechte hat,
oder FHEM temporär nichts liefert (z. B. wegen Caching).
Dann ist data.Results undefined, und JavaScript kann data.Results[0] nicht lesen → Cannot read properties of undefined
(reading '0').
Lösung auf der JavaScript-Seite (sicherer Code),Falls du Zugriff auf flex.js hast (z. B. über dein
FTUI oder das FHEM-Verzeichnis /opt/fhem/www/pgm2/flex.js), kannst du die problematische Zeile robust absichern.

Ersetze:
 if (typeof data.Results[0] !== "object") return;

durch:
 if (!data || !data.Results || !Array.isArray(data.Results) || typeof data.Results[0] !== "object") {
    console.warn("⚠️ flex.js: Unerwartete Datenstruktur bei jsonlist2", data);
    return;
}

Damit verschwindet der JavaScript-Fehler, und du bekommst stattdessen eine Warnung in der Konsole.

Verhalten in der App: (Android-WebView), ich habe ein onConsoleMessage-Handler eingebaut, es sollte bei den Fällen:
⚠️ FTUI-Fehler in flex.js (Zeile 2346): Cannot read properties of undefined (reading '0')
Die App sollte nicht abstürzen, sondern sollte sauber den Fehler anzeigen.



Gisbert

#18
Ich hab den QR-Code ausgeführt, eine ...apk.zip Datei heruntergeladen und installiert.
Ich musste, das .zip entfernen (Änderung des Dateinamens, nicht Entpacken) - war das richtig?
Es ist anders, aber nicht besser geworden.
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

mediastudio

Hallo Gisbert,
danke für Deine Rückmeldung, ich habe noch keine Erfahrung mit fhem-flex,
Ich werde mich mal damit beschäftigen. Sollte ich die Fehler abstellen können,
werde ich das hier weitergeben. Für FHEM und FTUI Layouts sollte die App aber
ohne Probleme funktionieren. Warum habe ich diese App programmiert, ein Muss für
mich war es. die Sprachsteuerung ohne große Änderung an der fhem.cfg wieder herstellen
zu können. 

mediastudio

Betreff: Austausch der flex.js

Ich habe das Problem nun untersucht und festgestellt, dass der Fehler nicht vom FHEMVoiceClient kommt, sondern von der flex.js. Ich habe eine modifizierte Version der flex.js erstellt, die keinen Fehler mehr erzeugt. Ich habe dies bereits auf meinem System getestet und es funktioniert einwandfrei.

Es sollte keine Probleme beim Austausch der Datei flex.js geben. Bitte sichere deine aktuelle flex.js und tausche sie gegen die neue Version aus. Ich werde die Datei auf meinem Server bereitstellen, zusammen mit einer FHEMVoiceClient.apk, die ohne die vorherige Fehleranzeige läuft. Auf dem Server ist eine Datei Testapk.7z , die beinhaltet die App und die flex.js.

**Hinweis zum Herunterladen des QR-Codes**
Um den QR-Code erfolgreich aufzurufen, benötigen Ihr das bereits bekannte Passwort.

Gisbert

Hallo mediastudio,

deine App funktioniert jetzt mit der modifizierten flex.js-Datei. Bis auf einen Unterschied bei der Formatierung einer readingsGroup sehe ich auf den ersten Blick keine Unterschiede.
Wie geht es denn jetzt weiter mit der Sparcheingabe/erkennung?

Viele Grüße Gisbert

Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

mediastudio

Hallo Gisbert,
was meinst Du mit Spracherkennung, sollte erstmal so funktionieren über den unteren
Button Microfon. Ich arbeite an einer App die wie Alexa über ein Wort z.B. Hallo App Fehm
befehle ausführt. Wie gesagt, im experiment, noch nicht zu frieden stellend.
Fehm sollte dann ohne weitere Handhabung Sprachbefehle ausführen.

Gisbert

Hallo mediastudio,

ich hab die 4 Devices aus Thread #1 bei mir definiert.
Wenn ich das Mikrofon drücke, erscheint die Google Spracheingabe, nimmt einen beliebigen Befehl entgegen - aber es "passiert" dann rein gar nichts. Meine Erwartungshaltung ist vermutlich komplett falsch.

An welcher Stelle muss ich starten, bzw. welche Voraussetzungen müssen denn vorliegen, damit das, was ich als Sprachbefehl eingebe, auch ausgeführt wird?

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

mediastudio

Hallo Gisbert,

ich habe vor 14 Jahren mit FHEM meine Hausautomation in ENOCEAN Technik aufgebaut. Da gab es die WebView App, die auch bis Android V7 funktionierte, danach war die App nicht mehr auf spätere Versionen lauffähig. Ich habe bei mir in der fhem.cfg über 100 Sprachbefehle eingefügt, die waren dann nicht mehr zu gebrauchen, einfach tot.

Aus diesem Grund hab ich die neue FHEMVoiceClient App programmiert. Ohne Änderung in der fhem.cfg habe ich alle Sprachbefehle wieder funktionsfähig.

Mein FHEMVoiceClient sollte ohne Probleme funktionieren, wenn Du auch schon mal Sprachbefehle in deiner fhem.cfg integriert hast. Wichtig ist, dass Du folgendes in der fhem.cfg stehen hast:

#################################
# TTS Text2Speech
#################################
define MyTTS Text2Speech hw=0.0
attr MyTTS TTS_UseMP3Wrap 1
attr MyTTS room Text2Speech

#######################################################################
##  im Webinterface unter Android zwei Readings:                     ##
##                                                                   ##
##  lastTTS → wird vom Handy gelesen und gesprochen                  ##
##  debugTTS → dient nur der Kontrolle, was wirklich gesendet wurde  ##
#######################################################################

define voiceRecognitionLastResult dummy
attr voiceRecognitionLastResult room Android
attr voiceRecognitionLastResult setList textField

define androidTablet dummy
attr androidTablet room Android
attr androidTablet setList ttsSay:textField
attr androidTablet webCmd ttsSay


define androidTablet_tts notify androidTablet:ttsSay.* { \
  my @parts = ();; \
  for (my $i = 1;; $i < 10;; $i++) { ;;\
    my $var = "\$EVTPART$i";; \
    no strict 'refs';; \
    push @parts, eval $var if defined(eval $var) && eval($var) ne '';; \
  };; \
  my $text = join(' ', @parts);; \
  if ($text) { ;;\
  fhem("setreading androidTablet lastTTS $text");; \
  fhem("setreading androidTablet debugTTS $text");; \
      Log3('androidTablet', 3, "androidTablet_tts -> $text");; \
  } else { ;;\
      Log3('androidTablet', 3, "androidTablet_tts -> kein Text erkannt");; \
  } \
}

Und deine Sprachbefehle sollten folgenderweise so wie hier in der fhem.cfg eingetragen


### Licht Küche
define speechRecognizer_kuecheLich_ein notify .*voiceRecognitionLastResult.*Küche.*Licht.*(ein|an).* set Deckenstrahler_Actor on;; set androidTablet ttsSay Licht in der Küche eingeschaltet
define speechRecognizer_kuecheLich_aus notify .*voiceRecognitionLastResult.*Küche.*Licht.*aus.* set Deckenstrahler_Actor off;; set androidTablet ttsSay  Licht in der Küche ausgeschaltet


### Flur Esszimmer Licht
define speechRecognizer_FlurEsszimmer_ein notify .*voiceRecognitionLastResult.*Flur.*Esszimmer.*Licht.*(ein|einschalten|an).* set Flur_Esszimmer_Actor on;; set androidTablet ttsSay  Licht im Flur Esszimmer eingeschaltet
define speechRecognizer_FlurEsszimmer_aus notify .*voiceRecognitionLastResult.*Flur.*Esszimmer.*Licht.*(ausgeschaltet|aus).* set Flur_Esszimmer_Actor off;; set androidTablet ttsSay  Licht im Flur Esszimmer ausgeschaltet


### Licht Esszimmer Deckenlampe
define speechRecognizer_Deckenlampe_ein notify .*voiceRecognitionLastResult.*(Tischlampe|Tischleuchte).*(einschalten|ein|an|1).* set Tischleuchte_Licht_Actor on;; set androidTablet ttsSay  Licht im Esszimmer Deckenlampe eingeschaltet
define speechRecognizer_Deckenlampe_aus notify .*voiceRecognitionLastResult.*(Tischlampe|Tischleuchte).*(ausschalten|aus).* set Tischleuchte_Licht_Actor off;; set androidTablet ttsSay  Licht im Esszimmer Deckenlampe ausgeschaltet


So war das mit ttsSay aufgebaut und funktioniert auch mit der FHEMVoiceClient App, bei mir sind wie gesagt über
100 Befehle vor 14 Jahren so programmiert und das ist heute auch noch so funktionsfähig.

Teste das mal.
 

Beta-User

Im Vergleich zu RHASSPY (oder evtl. Terco(?)) ist das mit den vielen notify ziemlich umständlich.

Komme nur leider grade nicht dazu, mich zu kümmern.

@Gisbert: es sollte funktionieren, das Reading mit dem erkannten Text auf ein AMAD-Device zu schicken und die AMAD-Variante von RHASSPY zu verwenden.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Gisbert

Hallo mediastudio,

die Anleitung verstehe ich - ich komme aber erst später nächste Woche zum Testen.

Hallo Jörg,

den Weg über AMAD habe ich nicht verstanden. Teste ich auch gerne, falls du Zeit hast, ein konkreteres Beispiel zu nennen. Eilt aber nicht, da ich erst später nächste Woche Zeit habe.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Beta-User

https://commandref.fhem.de/#RHASSPY-attr-rhasspySpeechDialog

Konzept wäre, tts über die App zu machen und dann wieder stt. Dazwischen "einfach" RHASSPY.

@mediastudio
Die Auswertung auf FHEM-Devices macht dann RHASSPY, dein Flur_Esszimmer_Actor muss dann nur ein genericDeviceType "light" sein und der Devspec in RHASSPY entsprechen und eleinen "sprechbaren Namen" bekommen.
Die Satzstruktur wird in Rhasspy in der sentence.ini zentral festgelegt.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

mediastudio

Ich habe mir mal RHASSPY angesehen, https://rhasspy.readthedocs.io/en/latest/tutorials/
und https://wiki.fhem.de/wiki/RHASSPY, das scheint sehr  interessant zu sein, ich selbst habe
damit noch keine Erfahrung. Nun eines ist zu sagen, eine NEUE Struktur nicht einfach nur FHEM.
Sollte ich mir RHASSPY installieren, werde ich es mit meiner App versuchen zu verbinden.   

RHASSPY kann auf dem gleichen Raspberry Pi wie FHEM laufen, aber es kommt darauf an, wie man es installieren und
betreiben will. RHASSPY ist ein verteiltes Spracherkennungs-Framework, das typischerweise als separater Server
läuft und mit Rhasspy (dem Spracherkennungsprojekt) oder anderen Clients spricht. FHEM kann über passende
Bindings oder HTTP-Requests mit RHASSPY kommunizieren.

Wichtige Punkte:

- Architektur
 RHASSPY wird oft als eigenständiger Sprachverarbeitung-Server betrieben (Spracherkennung, NLU, Intent-Handling). FHEM kann als Hausautomations-Zentrale die Kommandos steuern und mit RHASSPY integrieren, z. B. über REST- oder MQTT-Schnittstellen.
Hardware-Anordnung
Man kannst RHASSPY auf demselben Raspberry Pi installieren, auf dem auch FHEM läuft, solange Ressourcen ausreichend sind (CPU, RAM, Netzwerk). Ein Pi 4 oder neuer ist hier vorteilhaft.

Besser den RHASSPY auch auf einem separaten Raspberry Pi betreiben (z. B. ein Pi Zero, Pi 3/4).
In vielen Setups wird das empfohlen, wenn man mehrere Zonen abdecken oder sprachgesteuerte Eingänge in verschiedenen Räumen realisieren will. Mehrere Zonen / Raum-Verteilte
Spracherkennung.  Jeder Raum braucht  einen passenden Client (z. B. ein kleines Raspberry Pi-Gerät) mit einem Mikrofon, das die Sprache aufzeichnet und an den RHASSPY-Server sendet. Der Server führt die Spracherkennung aus und sendet die Ergebnisse zurück (NLU, Intent).
Ein Pi Zero kann als leichter Client dienen, der Sprachaufnahmen an den Zentralserver sendet. Allerdings hat der Pi Zero begrenzte Rechenleistung und Netzwerk-Bandbreite; die Spracherkennung wird eher im zentralen Server oder auf leistungsfähigeren Geräten erledigt.

Konkrete Installationshinweise grober Überblick:
RHASSPY-Installation: Man installierst Rhasspy oder RHASSPY-Komponenten auf dem Server (z. B. RHASSPY-Server-Teil). Es wird eine API-Verbindung zu FHEM eingerichtet (z. B. über MQTT oder HTTP), damit Befehle weitergegeben werden. In FHEM wird ein Command-Device oder eine URL/HTTP-Befehl-Verbindung einrichten, sodass erkannte Absichten an FHEM weitergereicht werden (z. B. "Turn on Licht im Wohnzimmer" -> FHEM-Befehl).
Clients in Räumen: Auf jedem Raumgerät (Pi Zero, Pi 3/4) installierst du Rhasspy-Client-Funktionen oder konfigurierst den Mikrofonzugriff so, dass Audio an den zentralen RHASSPY-Server gesendet wird.