Servus Gemeinde,
mein erster Versuch Gemini zur intelligenten Sprachsteuerung zu verwenden, hat heute Früchte getragen. Testweise habe ich 3 Leuchten, 3 Jalousien und eine Kaffeemaschine eingebunden.
Dinge wie "es ist etwas dunkel im Wohnzimmer" oder "mir wäre jetzt nach einem Espresso" münden schon mal in den richtigen Aktionen. Auch beliebig formulierte Varianten bis hin zu "ich würde gerne im Arbeitszimmer lesen" gibt je nach Tageszeit die richtigen Kommandos.
Wirklich beeindruckend, aber da ist noch viel zu tun. Vielleicht gibts ja schon Erfahrungen damit im Forum.
Gruß
Hallo,
das finde ich auch spannend, kannst Du mal die Testanbindung vorstellen?
Was wird alles benötigt?
Wie kommt die Spracheingabe ins Fhem?
VG Christian
wie gesagt, bin ganz am Anfang und noch weit weg von Fragen wie>
-wie kommen die Sprachkomandos in verschiedenen Räumen in Gemini, derzeit nur über mein Iphone und die Gemini App oder im Textmode im Browser
-wo werden Rückmeldungen ausgegeben
-habe ich die richtige Struktur in meiner Definition der Geräte oder rächt sich da der Wildwuchs über die Jahre (Nomenklatur etc)
etc. etc.
Aber ist schon lustig, wenn ein "es ist ziemlich dunkel im Wohnzimmer" eine Entscheidung triggert, ob es entsprechend der Tageszeit und dem Status der Aussenrollos Sinn macht entweder erstmal die Rollos hochzufahren oder/und das Licht noch anzumachen ist.
FHEM Anbindung derzeit über Telnet, irgendwie kann man auch eine Art Inventory der definierten Geräte machen. Wie gesagt, gaanz am Anfang
Zur konkreten Umsetzung frag am besten Gemini, da wird Dir geholfen. Ist schon beeindruckend, wirklich.
Mein Anfangs Plot für Gemini war ganz einfach: kann man dich eigentlich mit Sprachsteuerung auch ansprechen/aufwecken, so Alexa like, wobei Alexa für FHEM schon läuft?
Darauf hin startete ein Dialog zur Umsetzung "Gemini für FHEM"
Wobei ich mir noch gar nicht sicher bin ob ich das will, mal sehen
Hast du denn schon ein Device zur Kopplung im FHEM?
Der Thread kommt mir seltsam vor.
Entweder Du hast eine Umsetzung und magst uns dran teilhaben oder Du hast nichts.
Zusammen kann man Deine vorhandene Lösung ja weiter ausbauen. Viele Köpfe denken besser.
Zitat von: CoolTux am 10 Januar 2026, 11:11:44Der Thread kommt mir seltsam vor.
Das ist mMn. noch untertrieben.
#Clickbait
#VielLärmumNichts
Und dann noch in
Anfängerfragen gepostet um maximale Reichweite zu erlangen.
ABER: @TE Ich lasse mich gerne eines Besseren belehren. Also dann mal Butter bei die Fische...
VG Sebastian
kann der Moderator dieses Thema bitten schließen oder löschen? Auf diese Art der Unterhaltung hab ich keine Lust.
@CoolTux,
nein, ich habe kein Konzept ich bin im Versuchsmodus.
Es handelt sich um eine mit Gemini entwickelte reduzierte Grundfunktion als Idee, die ich gerne hier im Forum teile. Ich kann Dir, wenn Du möchtest, den 3 Stündigen Dialog mit Gemini posten. Ich denke, wir dürfen uns bei der Art wie wir Konzepte entwickeln, für die Zukunft neu ausrichten. Ich finds spannend. Mach einen Versuch und gehe die ersten Schritte für Dich selbst, komm bitte zurück und schildere Deine Erfahrungen.
Ich glaube CoolTux Frage bezog sich vor allem auf diesen Punkt:
Zitat von: tgv_boost am 10 Januar 2026, 10:09:01FHEM Anbindung derzeit über Telnet
Da bist du reichlich unkonkret geblieben, obwohl das typischerweise der interessanteste Punkt sein dürfte. Also wie kommen die Daten aus dem LLM (das viele von uns nur als Weboberfläche im Browser kennen) in Telnet bzw. FHEM.
Finde die Nachfrage deshalb durchaus berechtigt.
Das ist ja im Zweifel auch in wenigen Sätzen erklärt, jedenfalls wäre mehr schön als "joa Telnet halt". Sonst erschließt sich auch mir der Sinn von diesem Post nicht. Du hast das alles ja auch erst kürzlich eingerichtet und dürftest dich noch gut daran erinnern, sodass du das ja einfach kurz zusammenfassen kannst. Falls nicht, kannst du Gemini doch einfach prompten, dir das fürs Forum zusammenzufassen ;D
ClickBait und VielLärmUmNichts nehme ich persönlich. Eigentlich war ich Binford Fan, aber scheinbar ist da ein ewig gestriger am Werk und die Binford Ära ist ja auch schon lange vorbei. Und übrigens, ich habe hier niemanden von nichts zu überzeugen. Wenn ihr weitermachen wollt, wendet Euch am Gemini. Hier mal ein Baustein der Kommunikation auf Raspberry Seite:
import google.generativeai as genai
import socket
import time
# --- KONFIGURATION ---
GEMINI_API_KEY = "DEIN_API_KEY"
FHEM_IP = "127.0.0.1"
FHEM_PORT = 7072
genai.configure(api_key=GEMINI_API_KEY)
# Automatische Modellwahl
try:
available_models = [m.name for m in genai.list_models() if 'generateContent' in m.supported_generation_methods]
selected_model_name = next((m for m in available_models if "gemini-2.5-flash" in m), available_models[0])
model = genai.GenerativeModel(selected_model_name)
except Exception as e:
print(f"Konnte Modelle nicht laden: {e}")
exit()
def send_fhem_command(cmd):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(2)
s.connect((FHEM_IP, FHEM_PORT))
# Den Befehl senden
message = f"{cmd}\nquit\n"
s.sendall(message.encode('utf-8'))
time.sleep(0.1) # Jetzt funktioniert sleep
s.close()
print(f"Befehl erfolgreich an FHEM übertragen: {cmd}")
except Exception as e:
print(f"Verbindung zu FHEM (127.0.0.1:7072) fehlgeschlagen: {e}")
def ask_gemini(user_text):
# HIER ist das Gedächtnis der KI
system_instruction = """
Du bist die Smart-Home-KI für FHEM. Antworte NUR mit dem FHEM-Befehl.
DEINE GERÄTE-LISTE:
- Das Hauptlicht heißt: Wohnzimmer
BEISPIELE:
'Es ist dunkel im Wohnzimmer' -> set Wohnzimmer on
'Licht aus im Wohnzimmer' -> set Wohnzimmer off
"""
prompt = f"{system_instruction}\n\nUser sagt: {user_text}"
response = model.generate_content(prompt)
return response.text.strip()
if __name__ == "__main__":
while True:
befehl = input("Was soll ich tun? (oder 'exit'): ")
if befehl.lower() == 'exit': break
fhem_cmd = ask_gemini(befehl)
print(f"KI schlägt vor: {fhem_cmd}")
# Nur senden, wenn die KI einen set-Befehl generiert hat
if "set" in fhem_cmd:
send_fhem_command(fhem_cmd)
und bei FHEm ists bis jetzt relativ trivial:
define allowedTelnet allowed
define telnetPort telnet 7072 global
Das ist doch schon mal was.
Umsetzung in Python mit Hilfe der Gemini SDK. Damit kann man doch arbeiten bei Interesse.
Soo, jetzt habe ich auch gestartet.
Ich mag es gerne, wenn im FHEM nicht soviel extern, also z.B. in Python aufgerufen wird.
Den Key habe ich schon mal im Store abgelegt
Zuerst den Key holen: https://aistudio.google.com/api-keys
Dann im FHEM ablegen
{KeyValue("store","Gemini_AI_Key","DEIN_API_KEY_HIER")}
Das HTTPMOD sieht dann zum Testen schon mal so aus
Das liegt nun in meinem contrib.
Leider ist das kostenlose Model limitiert auf 20 Aufrufe pro Tag, da wird es sicher eng, wenn man es für's SmartHome nutzen möchte.
VG Christian
Danke an Christian und CoolTux fürs teilen.
(Wir sollten den Ersteller etwas mehr loben, dann ist er vielleicht zutraulicher ;) )
20 Aufrufe pro Tag sind etwas knapp, wenn man die gesamte Sprachsteuerung darüber macht.
Praktikabel ist das wenn es die bisherigen Geräte (Alexa) ohne große Umstände nutzt. Braucht man das https://www.amazon.in/CazyUndee-Corp-Gemini/dp/B0FJ2VYP4F (https://www.amazon.in/CazyUndee-Corp-Gemini/dp/B0FJ2VYP4F)?
Handy z.B. wären mir da zu umständlich.
Zitat von: tgv_boost am 10 Januar 2026, 13:06:23Hier mal ein Baustein der Kommunikation auf Raspberry Seite
Super, danke dir!
Zitat von: rabehd am 10 Januar 2026, 15:32:3620 Aufrufe pro Tag sind etwas knapp, wenn man die gesamte Sprachsteuerung darüber macht.
Gemini meint: Das Limit des kostenlosen Keys liegt bei Gemini (je nach Modell) bei etwa 15 Anfragen pro Minute oder 1.500 pro Tag – davon bist du weit entfernt.
Zitat von: erdnar am 10 Januar 2026, 16:59:25Gemini meint: Das Limit des kostenlosen Keys liegt bei Gemini (je nach Modell) bei etwa 15 Anfragen pro Minute oder 1.500 pro Tag – davon bist du weit entfernt.
Ich habe mich bezogen auf:
Zitat von: ch.eick am 10 Januar 2026, 14:30:33Leider ist das kostenlose Model limitiert auf 20 Aufrufe pro Tag, da wird es sicher eng, wenn man es für's SmartHome nutzen möchte.
Zitat von: rabehd am 10 Januar 2026, 17:01:40Zitat von: erdnar am 10 Januar 2026, 16:59:25Gemini meint: Das Limit des kostenlosen Keys liegt bei Gemini (je nach Modell) bei etwa 15 Anfragen pro Minute oder 1.500 pro Tag – davon bist du weit entfernt.
Ich habe mich bezogen auf:
Zitat von: ch.eick am 10 Januar 2026, 14:30:33Leider ist das kostenlose Model limitiert auf 20 Aufrufe pro Tag, da wird es sicher eng, wenn man es für's SmartHome nutzen möchte.
In der http Rückmeldung steht das Limit von 20 auch drin.
Welche URL und welches Model verwendet ihr?
Hier mal eine Rückmeldung vom Limit
{
"error": {
"code": 429,
"message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits. To monitor your current usage, head to: https://ai.dev/rate-limit. \n* Quota exceeded for metric: generativelanguage.googleapis.com/generate_content_free_tier_requests, limit: 20, model: gemini-2.5-flash\nPlease retry in 38.035617409s.",
"status": "RESOURCE_EXHAUSTED",
"details": [
{
"@type": "type.googleapis.com/google.rpc.Help",
"links": [
{
"description": "Learn more about Gemini API quotas",
"url": "https://ai.google.dev/gemini-api/docs/rate-limits"
}
]
},
{
"@type": "type.googleapis.com/google.rpc.QuotaFailure",
"violations": [
{
"quotaMetric": "generativelanguage.googleapis.com/generate_content_free_tier_requests",
"quotaId": "GenerateRequestsPerDayPerProjectPerModel-FreeTier",
"quotaDimensions": {
"location": "global",
"model": "gemini-2.5-flash"
},
"quotaValue": "20"
}
]
},
{
"@type": "type.googleapis.com/google.rpc.RetryInfo",
"retryDelay": "38s"
}
]
}
}
So, für heute ist dann jetzt schluss.
Ich habe hier nochmal ein Update vom Device gemacht. (https://forum.fhem.de/index.php?msg=1355525)
Es gibt nun
- set 10_ask
Für normale Anfragen
- set 10_FHEM_instruction
Hier wird vorher mit Anweisungen aus dem userattr FHEM_Instructions angelernt.
Dann kann man eine Anfrage mit "set 10_FHEM_instruction Mach mal in der Küche licht" einen Aufruf machen.
Ich habe gerade online noch einen Test gemacht und das Ergebnis finde ich recht gut.
Der Vorteil ist halt, dass man schreiben und später eventuell auch Sprechen kann, wie der Schnabel gewachsen ist.
NUTZERANFRAGE: Mach ma Küche hell und dann wieder aus.
responce: set MQTT2_zigbee_Ku_Licht ON;; set MQTT2_zigbee_Ku_Licht OFF
NUTZERANFRAGE: küche dunkel
responce: set MQTT2_zigbee_Ku_Licht OFF
NUTZERANFRAGE: küche an
responce: set MQTT2_zigbee_Ku_Licht ON
NUTZERANFRAGE: küche is echt grell
responce: set MQTT2_zigbee_Ku_Licht OFF
Ich könnte mir vorstellen, dass man für mehr Abfragen eventuell mehrere Konten einrichtet, die man dann in einem rollierend verwendet.
VG Christian
Zitat von: rabehd am 10 Januar 2026, 17:01:40Zitat von: erdnar am 10 Januar 2026, 16:59:25Gemini meint: Das Limit des kostenlosen Keys liegt bei Gemini (je nach Modell) bei etwa 15 Anfragen pro Minute oder 1.500 pro Tag – davon bist du weit entfernt.
Ich habe mich bezogen auf:
Zitat von: ch.eick am 10 Januar 2026, 14:30:33Leider ist das kostenlose Model limitiert auf 20 Aufrufe pro Tag, da wird es sicher eng, wenn man es für's SmartHome nutzen möchte.
Ich hatte
gemeinsam mit Gemini an den Einstellungen gewerkelt. Als mal keine Antwort zurückkam, hatte ich Gemini gefragt, ob es am kostenlosen Key liegen könnte... Antwort siehe oben.
Aber evtl. ist es ja aus der Kategorie
stimmt´s oder stammt es von einer KI :-\
ErdnaR
Edit meint: Hier (https://cloud.google.com/vertex-ai/generative-ai/pricing?hl=de#gemini-models-2.5) ist die Preisliste. Auszug:
Gemini 2.0 Flash, 2.5 Flash und 2.5 Flash-Lite bieten insgesamt 1.500 gegroundete Prompts pro Tag ohne Aufpreis. ...
Zitat von: erdnar am 11 Januar 2026, 11:14:58Zitat von: rabehd am 10 Januar 2026, 17:01:40Zitat von: erdnar am 10 Januar 2026, 16:59:25Gemini meint: Das Limit des kostenlosen Keys liegt bei Gemini (je nach Modell) bei etwa 15 Anfragen pro Minute oder 1.500 pro Tag – davon bist du weit entfernt.
Ich habe mich bezogen auf:
Zitat von: ch.eick am 10 Januar 2026, 14:30:33Leider ist das kostenlose Model limitiert auf 20 Aufrufe pro Tag, da wird es sicher eng, wenn man es für's SmartHome nutzen möchte.
Ich hatte gemeinsam mit Gemini an den Einstellungen gewerkelt. Als mal keine Antwort zurückkam, hatte ich Gemini gefragt, ob es am kostenlosen Key liegen könnte... Antwort siehe oben.
Aber evtl. ist es ja aus der Kategorie stimmt´s oder stammt es von einer KI :-\
ErdnaR
Edit meint: Hier (https://cloud.google.com/vertex-ai/generative-ai/pricing?hl=de#gemini-models-2.5) ist die Preisliste. Auszug: Gemini 2.0 Flash, 2.5 Flash und 2.5 Flash-Lite bieten insgesamt 1.500 gegroundete Prompts pro Tag ohne Aufpreis. ...
Ich verwende nur die kostenlosen Abfragen, habe also keine Cloud gebucht.
Zitat
Kostenlose Versionen:
- Web & App: Du kannst die Gemini App und die Webversion (gemini.google.com) kostenlos nutzen, um Fragen zu stellen und Inhalte zu generieren.
- API: Für Entwickler gibt es eine kostenlose Stufe der Gemini API mit niedrigeren Ratenbegrenzungen zum Testen.
Da steht für die API "mit niedrigeren Ratenbegrenzungen zum Testen"
Hallo zusammen,
da mein Device jetzt immer größer wird stelle ich es gleich in meinem contrib bereit. (https://svn.fhem.de/fhem/trunk/fhem/contrib/ch.eick/Gemini_AI/RAW_Gemini_AI.txt)
Mein letzter Test war sehr begeisternd :-)
Nutzerfrage: Generiere mir alle vorhandenen Rollo Namen mit einem 'set' davor und 'open' dahinter. Für das Arbeitszimmer soll es auf 40 gesetzt werden.
response: set WZ_O_Rollo open;;set WZ_W_Rollo open;;set KU_S_Rollo open;;set SC_W_Rollo open;;set BA_N_Rollo open;;set AR_O_Rollo position 40
Das zeigt mal wieder wie wichtig es ist sich über die Namen vorher gedanken zu machen ;-)
In meinem Fall könnte es auch mit den 20 API Aufrufen reichen, da ich nicht so viele Manuelle Eingriffe im Haus habe.
Ansonsten könnte ich mir vorstellen noch ein zweites Konto zu eröffne und dann die Anfragen wechselweise zu schicken, es ist ja nur der Key zu tauschen und die SystemInstructions werden ja jedesmal mitgesendet. Somit würde man bereits auf 40 Anfragen kommen können.
EDIT: Ich habe jetzt den Switch zwischen zwei Keys auch bereits eingebaut.
Mindestens den default Gemini_AI_Key_0 ablegen
{KeyValue("store","Gemini_AI_Key_0","DEIN_API_KEY_HIER")}
Verwendet man zwei Keys ist dieses reading anzulegen: setreading Gemini_AI Gemini_AI_Key 0
{KeyValue("store","Gemini_AI_Key_1","DEIN_ZWEITER_API_KEY_HIER")}
Durch das reading Gemini_AI_Key entsteht ein Zähler, der zwischen 0 und 1 wechselt, wird das reading gelöscht wird Gemini_AI_Key_0 als default verwendet.
Es gibt nun
- set 10_ask
Für normale Anfragen
- set 02_FHEM_CMD
Hier wird vorher mit Anweisungen aus den userattr KI_* angelernt.
Dann kann man eine Anfrage z.B. mit "set 02_FHEM_CMD Mach mal in der Küche licht" einen Aufruf machen.
Ein Vorgeschmack auf die userattr KI_* gibt es im Device im contrib.
Die KI_* sind als KI_CMD[nn] und KI_Instr[nn] gruppiert und können im userattr erweitert werden.
VG Christian
Zitat von: erdnar am 11 Januar 2026, 11:14:58Ich hatte gemeinsam mit Gemini an den Einstellungen gewerkelt. Als mal keine Antwort zurückkam, hatte ich Gemini gefragt, ob es am kostenlosen Key liegen könnte... Antwort siehe oben.
Aber evtl. ist es ja aus der Kategorie stimmt´s oder stammt es von einer KI :-\
ErdnaR
Edit meint: Hier (https://cloud.google.com/vertex-ai/generative-ai/pricing?hl=de#gemini-models-2.5) ist die Preisliste. Auszug: Gemini 2.0 Flash, 2.5 Flash und 2.5 Flash-Lite bieten insgesamt 1.500 gegroundete Prompts pro Tag ohne Aufpreis. ...
Könntest Du Deine Key Konfiguration mal näher erleutern?
Ich habe hier unter Key folgendes eingetragen. (https://aistudio.google.com/api-keys)
Screenshot 2026-01-12 101939.png
Dort kann man auch auf "View usage" gehen und sieht unter Fehler "429 TooManyRequests", wenn man im Diagramm über den roten Balken geht die Anzahl von 21.
Screenshot 2026-01-12 102615.png
VG Christian
Ich nochmal :-)
Bezüglich zweiten API Key klappt das Vorgehen.
- Man legt sich eine zweite Mail Adresse an, wenn man noch keine hat
- Meldet das als google Konto an und durchläuft die Verifizierung
- Dann meldet man sich mit dem neuen Accout an und wechselt zu aistudio (https://aistudio.google.com/api-keys)
- Man kann den default Key verwenden oder sich ein eigenes Projekt anlegen.
Das Limit gilt jedoch nicht pro Projekt, sondern pro Account :-(
Somit habe ich jetzt bei rollierender Verwendung 2x20 Anfrage, was mir erstmal ausreicht.
Zu meinem letzten Test
# Ich habe folgende SystemInstruction definiert, die die Umgebung beschreiben und mit der die KI zusätzlich lernt
# 1.
attr Gemini_AI KI_Instr00 Du bist die Smart-Home-KI für FHEM. Antworte NUR mit dem FHEM-Befehl.
attr Gemini_AI KI_Instr01 Mehrere Befehle trenne mit ;;;;
attr Gemini_AI KI_Instr02 Deine GERÄTE-LISTE: - Das Hauptlicht heißt: Küche
# 2. Das beschreibt meine Rollo Installation, ohne die Device Namen direkt anzugeben
# 2.1 Wie heißen die Räume und welche Kurznamen sollen verwendet werden
attr Gemini_AI KI_Instr03 Es gibt Rollos in allen Räumen. Wohnzimmer -> WZ;; Küche -> KU;; Schlafzimmer -> SC;; Bad -> BA;; Arbeitszimmer -> AR;;
# 2.2 Wie sind die Aurichtungen der Rollos in den Räumen
# Man kann auch mehrere Beschreibungen in eine Zeile schreiben, die Zeilen sollen es nur lesbarer machen.
# Welche Kommandos können für Rollos verwendet werden?
attr Gemini_AI KI_Instr04 WZ hat je 1 Ost und West, KU 1 Süd, SC 1 West, BA 1 Nord und AZ 1 Ost Rollo. Es gibt Kommandos open, close und position mit 0 bis 100.
# 2.3 Das beschreibt meinen Namensstandard für die Rollos
attr Gemini_AI KI_Instr05 Die Gerätenamen entsprechen folgendem Syntax mit _ als Trennzeichen: 'Kurzname des Raums' 'Kurzname der Himmelsrichtung' 'Rollo'
# 2.3 Hier lernt die KI noch, dass die Himmelsrichtungen abgekürzt werden.
attr Gemini_AI KI_Instr06 Die Himmelsrichtungen werden mit dem ersten Buchstaben abgekürzt.
# 3. Für direkte Kommandos und Aussagen gibt man Beispiele. Dies ist sinnvoll, wenn es keinen guten Namensstandard gibt, oder das Kommando komplexer ist.
attr Gemini_AI KI_CMD00 BEISPIELE:
attr Gemini_AI KI_CMD01 'Es ist dunkel in der Küche' -> set MQTT2_zigbee_Ku_Licht ON 'Licht aus in der Küche' -> set MQTT2_zigbee_Ku_Licht OFF
An meinen vorherigen Post, mit Tests sieht man, dass die KI auch aus anderen Aussagen durchaus das richtige Kommando findet.
Bei den Attributen habe die Möglichkeit von 00-99 eingerichtet, die man jedoch noch im userattr fortlaufend ergänzen muss.
Jetzt fehlt noch die Ausführung der KI Kommandos und die Kopplung mit Signal (in meinem Fall).
VG Christian
Zitat von: ch.eick am 12 Januar 2026, 10:35:52Dort kann man auch auf "View usage" gehen und sieht unter Fehler "429 TooManyRequests", wenn man im Diagramm über den roten Balken geht die Anzahl von 21.
Screenshot 2026-01-12 102615.png
VG Christian
Mahlzeit,
ich habe zwischenzeitlich gelernt, dass es wohl einen Unterschied gibt zwischen Anfragen an Gemini und solche über die API. :-[
Die Diagramm hatte ich auch gesehen und war, wie du, bei
API-Anfragen insgesamt schon weit über 20 hinaus, hatte aber noch keine
TooManyRequests.
Ich ziehe also, wie so oft, meinen Redebeitrag zurück (Grund: viel Meinung - wenig Wissen) :'(.
OT Apropos wenig Wissen: Du benutzt
KeyValue("store","Gemini... für den Key. Da dies bei mir zu
Undefined subroutine &main::KeyValue called at (eval... führte, habe ich es auf die Schnelle in einen Dummy gelegt und von da geholt.
attr Gemini_AI replacement01Value { ReadingsVal("Gemini_Config","api_key","") } Wie komme ich zum KeyValue ?
Danke
ErdnaR
Hallo Erdnar
Zitat von: erdnar am 12 Januar 2026, 13:28:16OT Apropos wenig Wissen: Du benutzt KeyValue("store","Gemini... für den Key. Da dies bei mir zu Undefined subroutine &main::KeyValue called at (eval... führte, habe ich es auf die Schnelle in einen Dummy gelegt und von da geholt.
attr Gemini_AI replacement01Value { ReadingsVal("Gemini_Config","api_key","") } Wie komme ich zum KeyValue ?
Danke
ErdnaR
Dazu gibt es im Forum und Wiki natürlich mehr Infos :-)
Hier auf die Schnelle die Funktion für die 99_myUtils.pm, wie immer ohne Gewähr.
Achtung, das ist kein Passwort Tresor, gibt aber die Möglichkeit Passworte und Schlüssel aus dem Device zu halten, falls man es so wie ich mal schnell teilt.
######################################################
# {KeyValue("read|store","PW_PV_Anlage_1_API_user","<passwort>")}
# {KeyValue("store","PW_PV_Anlage_1_API_user",undef)} # zum löschen
######################################################
sub KeyValue {
my ($step, $index, $value) = @_;
my $key = getUniqueId().$index;
my $e_value = "";
my $error;
if (eval "use Digest::MD5;1") {
$key = Digest::MD5::md5_hex(unpack "H*", $key);
$key .= Digest::MD5::md5_hex($key);
}
if ($step eq "read") {
($error, $value) = getKeyValue($index);
if ( defined($error) ) {
Log3 $index,3, "$index, can't read key from FhemUtils/uniqueID: $error";
return undef;
}
if ( defined($value) ) {
my $dec_value = '';
for my $char (map { pack('C', hex($_)) } ($value =~ /(..)/g)) {
my $decode = chop($key);
$dec_value .= chr(ord($char)^ord($decode));
$key = $decode.$key;
}
return $dec_value;
}
else {
Log3 $index,3,"$index, no key found in FhemUtils/uniqueID";
return undef;
}
}
if ($step eq "store") {
for my $char (split //, $value) {
my $encode = chop($key);
$e_value .= sprintf("%.2x",ord($char)^ord($encode));
$key = $encode.$key;
}
$error = setKeyValue($index, $e_value);
return "error while saving key : $error" if(defined($error));
return "Key successfully saved in FhemUtils/uniqueID Key $index";
}
};
VG Christian
Wir benutzen LLM in verschiedenen Forschungsprojekten. Vor dem Hintergrund habe ich erhebliche Bedenken über die hier geübte Vorgehensweise, denn das ist eine irrsinnige Ressourcenverschwendung.
Was man sinnvoll machen kann, ist ein Sprachmodell einzusetzen, um einen Text zu normieren, also generell einen Intent zu erkennen. Die Umsetzung in einen finalen FHEM-Befehl sollte man aber auf andere Weise machen, dafür gibt es schon verschiedene Module.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 12 Januar 2026, 19:33:54Wir benutzen LLM in verschiedenen Forschungsprojekten. Vor dem Hintergrund habe ich erhebliche Bedenken über die hier geübte Vorgehensweise, denn das ist eine irrsinnige Ressourcenverschwendung.
Was man sinnvoll machen kann, ist ein Sprachmodell einzusetzen, um einen Text zu normieren, also generell einen Intent zu erkennen. Die Umsetzung in einen finalen FHEM-Befehl sollte man aber auf andere Weise machen, dafür gibt es schon verschiedene Module.
Hallo pah,
hättest Du da mal links zum Lesen für mich, ich lerne ja gerade noch sehr viel dazu.
VG Christian
Zitat von: ch.eick am 12 Januar 2026, 19:37:04links zum Lesen
Wär schön, das ist aber vorderste Front der Forschung.
Einfacher Test für das, was ich meine, das funktioniert mit jedem LLM.
Erzeuge aus einer Untermenge Deines FHEM relevante Daten. Sagen wir, für einen Raum: Innentemperatur, Feuchte, Außentemperatur, Stellung der Rollläden. Außerdem für diese Raum die steuerbaren Geräte und ihren Status. Sagen wir: Heizung-Solltemperatur,Klimanlage-Status, Rollläden-Stand, Leuchten-Status.
Eine klare Anweisung, z.B.: "Stelle die Temperatur im Wohnzimmer auf 21 Grad"
kann von mehreren FHEM-Modulen interpretiert werden. ich verwende dazu Babble, das eine semantische Analyse durchführt.
Wenn die Anweisung nicht mehr klar ist, z.B.:"Im Wohnzimmer ist es zu kalt"
kann das noch von einem regelbasierten Chatbot erkannt werden. Dazu verwende ich RiveScript, das kann an Babble angekoppelt werden.
Erst komplizierte Formulierungen, z.B. "Ich habe eiskalte Füße und gehe jetzt ins Wohnzimmer" erfordern mehr als die semantische Analyse, nämlich einen umfassenden Kontext. Das wäre also eine Aufgabe für ein LLM, das diesen Kontext in seinen Trainingskorpora findet. Liefere also diese Formulierung zusammen mit den eingangs genannten Daten und frage nach einer Maßnahme.
LG
pah
Hallo pah,
ich habe jetzt bereits eine Vorstufe für klar definierte Kommandos, die mit einem einfachen Perl Mapping das Kommando ausgibt.
Natürlich möchte ich nicht jeden Text zu Gemini schicken, das wäre echt der Obergau.
READINGS:
2026-01-13 17:27:10 _2B49172
2026-01-13 17:27:10 in_analyse setreading WB_1_lp_1 ui_command_1 Stop
2026-01-13 17:27:10 in_groupName FHEM cli
2026-01-13 17:27:10 in_message Wallbox Stopp
2026-01-13 17:27:10 in_source +49172
2026-01-13 17:27:10 signal_in_json {"jsonrpc":"2.0","method":"receive","params":{"envelope":{"source":"+491728447553","sourceNumber":"+49172","sourceUuid":"925814d3-c417-4848-bfbf-aaf306b978bd","sourceName":"","sourceDevice":1,"timestamp":1768321630775,"serverReceivedTimestamp":1768321630333,"serverDeliveredTimestamp":1768321630335,"syncMessage":{"sentMessage":{"destination":null,"destinationNumber":null,"destinationUuid":null,"timestamp":1768321630775,"message":"Wallbox Stopp","expiresInSeconds":0,"viewOnce":false,"groupInfo":{"groupId":"ik32NK0yahSjfnXJC9gmHqyGKr0okcm62Fa/9+ereJc=","groupName":"FHEM cli","revision":0,"type":"DELIVER"}}}},"account":"+49172"}}
Attributes:
in_commands 'küche licht an'=>'set KU_Licht ON', 'wallbox sofort laden'=>'setreading WB_1_lp_1 ui_command_1 SofortLaden', 'wallbox nur pv'=>'setreading WB_1_lp_1 ui_command_1 NurPV', 'wallbox stopp'=>'setreading WB_1_lp_1 ui_command_1 Stop', 'pool an'=>'setreading Pool_PV_Perl 01_2_Eigenverbrauch_manuell_An', 'pool aus'=>'setreading Pool_PV_Perl 01_3_Eigenverbrauch_manuell_Aus', 'media an'=>'setreading Wohnzimmer_Standby Standby_Steckdose_ein', 'media aus'=>'setreading Wohnzimmer_Standby Standby_Steckdose_aus'
Danke für Deine Hinweise, hättest Du da bereits FHEM Basierte Schnellstarts, die ich mir anschauen könnte?
Mein FHEM ist der Docker Container vom Image ghcr.io/fhem/fhem-docker:latest .
VG Christian
Zitat von: ch.eick am 13 Januar 2026, 17:38:43Natürlich möchte ich nicht jeden Text zu Gemini schicken, das wäre echt der Obergau.
Genau, Du hast das Problem richtig erkannt.
Das Babble-Modul ist im Wiki einigermaßen dokumentiert, muss ich vlt. mal aktualisieren. Die Funktionsweise ist so, dass etwas, das nicht erkannt wird, automatisch an RiveScript weitergeleitet wird.
RiveScript findest Du hier https://www.rivescript.com/
Ich hänge hier mal meine Haupt-Rivescript-Datei an (bereinigt um ein paar vertrauliche Dinge...). Vlt. interessant zu sehen, wie ich dabei die Funktionalität der originalen "Eliza" mit eingebaut habe. Außerdem kann das Ding auch neue FHEM-Kommandos für Babble lernen, erklären, was es machen kann etc. Wichtig ist auch der Teil, in dem normalerweise geantwortet würde "Das habe ich nicht verstanden": Hier könnte ggf eine Weiterleitung an ein LLM stehen, dessen Output wieder an Babble oder Rivescript geht.
Außerdem sieht man das Konzept der Perl-Objekte, die von Rivescript gerufen werden. Die davon gerufenen Perl-Funktionen habe ich zwar nicht beigelegt, aber das Prinzip sollte klar sein.
Und eine Datei test.pl, um einen minimalen Chatbot zu starten. _Natürlich_ muss man dazu die Perl-Version von Rivescript installieren, siehe dazu die Anleitung auf der RiveScript-Webseite.
LG
pah
Note added in proof: Ich hatte in den letzten Jahren einen schönen Lehrauftrag am Institut für Bildungswissenschaft der Uni Wien. Dort habe ich unter anderem Pädagogikstudentinnen dazu gebracht, mit RiveScript einen Chatbot zu bauen - so einfach ist das...
Zitat von: Prof. Dr. Peter Henning am 13 Januar 2026, 19:57:52Zitat von: ch.eick am 13 Januar 2026, 17:38:43Natürlich möchte ich nicht jeden Text zu Gemini schicken, das wäre echt der Obergau.
Genau, Du hast das Problem richtig erkannt.
Das Babble-Modul ist im Wiki einigermaßen dokumentiert, muss ich vlt. mal aktualisieren. Die Funktionsweise ist so, dass etwas, das nicht erkannt wird, automatisch an RiveScript weitergeleitet wird.
Hallo pah,
ich teste gerade Babble und es sieht schon recht gut aus.
Muss man immer Gerät, Ort, Verb, Ziel angeben, auch wenn weniger Angaben eindeutig wären?
Ich habe z.B. nur eine Zirkulationspumpe, die wir für Heißes Wasser in der Küche zum Spülen verwenden.
Es funktioniert: Zirkulation in der Küche anschalten
Eindeutig wäre : Zirkulation an
Muss man an und ein separat als Ziel definieren, oder geht das auch einfacher?
Screenshot 2026-01-14 184047.png
Screenshot 2026-01-14 184216.png
Hättest Du noch ein Beispiel für die textuellen Zustände bei einer Wallbox, oder definiere ich die einfach beim babbleStatus ?
Die Funktion scheint es nicht zu geben
Babble_TestIt("Babble","<zu analysierender Satz>",<exec-Flag>,[,parm0,parm1,...])
2026.01.14 17:10:43.025 1: PERL WARNING: Subroutine Babble_Initialize redefined at ./FHEM/95_Babble.pm line 181.
2026.01.14 17:10:43.026 1: PERL WARNING: Subroutine Babble_Define redefined at ./FHEM/95_Babble.pm line 225.
2026.01.14 17:10:43.026 1: PERL WARNING: Subroutine Babble_Undef redefined at ./FHEM/95_Babble.pm line 290.
2026.01.14 17:10:43.026 1: PERL WARNING: Subroutine Babble_Attr redefined at ./FHEM/95_Babble.pm line 312.
2026.01.14 17:10:43.026 1: PERL WARNING: Subroutine Babble_CreateEntry redefined at ./FHEM/95_Babble.pm line 335.
2026.01.14 17:10:43.027 1: PERL WARNING: Subroutine Babble_Set redefined at ./FHEM/95_Babble.pm line 374.
2026.01.14 17:10:43.027 1: PERL WARNING: Subroutine Babble_Get redefined at ./FHEM/95_Babble.pm line 421.
2026.01.14 17:10:43.027 1: PERL WARNING: Subroutine Babble_save redefined at ./FHEM/95_Babble.pm line 450.
2026.01.14 17:10:43.027 1: PERL WARNING: Subroutine Babble_savename redefined at ./FHEM/95_Babble.pm line 468.
2026.01.14 17:10:43.027 1: PERL WARNING: Subroutine Babble_restore redefined at ./FHEM/95_Babble.pm line 482.
2026.01.14 17:10:43.028 1: PERL WARNING: Subroutine Babble_Test redefined at ./FHEM/95_Babble.pm line 516.
2026.01.14 17:10:43.029 1: PERL WARNING: Subroutine Babble_Normalize redefined at ./FHEM/95_Babble.pm line 627.
2026.01.14 17:10:43.030 1: PERL WARNING: Subroutine Babble_timecorrector redefined at ./FHEM/95_Babble.pm line 1016.
2026.01.14 17:10:43.030 1: PERL WARNING: Subroutine Babble_createRive redefined at ./FHEM/95_Babble.pm line 1049.
2026.01.14 17:10:43.030 1: PERL WARNING: Subroutine Babble_getcsrf redefined at ./FHEM/95_Babble.pm line 1074.
2026.01.14 17:10:43.031 1: PERL WARNING: Subroutine Babble_DoIt redefined at ./FHEM/95_Babble.pm line 1096.
2026.01.14 17:10:43.032 1: PERL WARNING: Subroutine Babble_checkattrs redefined at ./FHEM/95_Babble.pm line 1304.
2026.01.14 17:10:43.032 1: PERL WARNING: Subroutine Babble_ModPlace redefined at ./FHEM/95_Babble.pm line 1343.
2026.01.14 17:10:43.032 1: PERL WARNING: Subroutine Babble_ModVerb redefined at ./FHEM/95_Babble.pm line 1369.
2026.01.14 17:10:43.032 1: PERL WARNING: Subroutine Babble_ModHlp redefined at ./FHEM/95_Babble.pm line 1417.
2026.01.14 17:10:43.032 1: PERL WARNING: Subroutine Babble_ModCmd redefined at ./FHEM/95_Babble.pm line 1435.
2026.01.14 17:10:43.033 1: PERL WARNING: Subroutine Babble_RemCmd redefined at ./FHEM/95_Babble.pm line 1473.
2026.01.14 17:10:43.033 1: PERL WARNING: Subroutine Babble_getids redefined at ./FHEM/95_Babble.pm line 1513.
2026.01.14 17:10:43.033 1: PERL WARNING: Subroutine Babble_getdevs redefined at ./FHEM/95_Babble.pm line 1544.
2026.01.14 17:10:43.034 1: PERL WARNING: Subroutine Babble_antistupidity redefined at ./FHEM/95_Babble.pm line 1653.
2026.01.14 17:10:43.034 1: PERL WARNING: Subroutine Babble_gethelp redefined at ./FHEM/95_Babble.pm line 1677.
2026.01.14 17:10:43.034 1: PERL WARNING: Subroutine Babble_getplaces redefined at ./FHEM/95_Babble.pm line 1693.
2026.01.14 17:10:43.034 1: PERL WARNING: Subroutine Babble_getverbs redefined at ./FHEM/95_Babble.pm line 1775.
2026.01.14 17:10:43.035 1: PERL WARNING: Subroutine Babble_getwords redefined at ./FHEM/95_Babble.pm line 1857.
2026.01.14 17:10:43.036 1: PERL WARNING: Subroutine Babble_Html redefined at ./FHEM/95_Babble.pm line 1942.
2026.01.14 17:10:43.037 1: [Babble] the RiveScript module has been imported successfully, chatbot functionality available
2026.01.14 17:10:43.042 1: [Babble] new RiveScript interpreter generated
2026.01.14 17:11:24.167 1: ERROR evaluating { Babble_TestIt("Babble","Schalte in der Küche Licht an") }: Undefined subroutine &main::Babble_TestIt called at (eval 10574461) line 1.
Zumindest schein im FHEM Docker Container bereits RiveScript vorhanden zu sein, soweit bin ich jedoch noch nicht.
Und dann noch das hier, was ist da Baaaaah :-) , das würde den WAF erhöhen.
2026.01.14 17:10:43.064 1: [Babble] Baaaaah ! It is not a good idea to name a device spülwasser similar to a place in Babble
VG Christian
Hallo nochmal,
für die, die sich wundern, dass hier jetzt noch Babble oder andes auftaucht.
Damit man etwas besser mit den Resourcen umgeht, denn die KI im RZ schluckt Unmengen an Energie, habe ich mich für ein mehrstufiges Konzept entschieden.
Die einfachen Anfragen sollen direkt lokal erledigt werden und nur wenn es zu komplex wird könnte man die KI noch hinzuziehen. Hier ist noch der Post von pah dazu. (https://forum.fhem.de/index.php?msg=1355803)
Mein Ansatz sieht momentan so aus:
- Sprach oder Text Eingabe erfolgt über Signal mit den Handys
Hierzu wird im Signal die Google Spracherkennung aktiviert
Man öffnet einen Chat und tippt ins Eingabefeld => die Tastatur erscheint
Über das Rädchen kommt man in die Tastatur Einstellungen
Weiter unten kommt man zur Spracheingabe ( antippen )
Dort kann man die Google-Spracheingabe aktivieren oder auch einen anderen Dienst
Wenn man nun Text eingeben möchte hat man links unter der Tastatur ein Microphon, auf das man zur Spracherkennung einfach tippt.
Bei Google erscheint ein großes Feld zur Aktivierung des Microphons und bei Samsung ist es direkt das kleine Microphon Symbol, was dann blau wird.
Ich werde wohl ein altes Smartphone mit Signal für die Spracheingabe in der Wohnung verwenden, das kann man dann genau wie eine Fernbedienung immer schön suchen gehen :-)
- signal-mqtt läuft im Docker Container
- Ein signal-receiver defindet sich im FHEM als MQTT2-Device
- Als ersten Test habe ich da bereits mit Perl Mapping einige direkte FHEM Kommandos umgesetz
- Wird dort nichts gefunden soll es zu Babble weiter gehen
- Mit RiveScript habe ich mich noch nicht befasst, was jedoch auch lokal laufen würde
- Erst ganz zum Schluss kann dann Gemini folgen
Ein Vorteil wäre auch, dass man nicht zuviele Gemini Aufrufe generieren würde, da die meisten Kommandos direkt vorher abgefangen werden.
Zusätzlich ist man so auch noch etwas unabhängiger vom Internet und dessen Dienste.
Der Status ist, wie pah schon so schön geschrieben hat: "Wär schön, das ist aber vorderste Front der Forschung."
VG Christian
Gemach, ich muss das erstmal nachstellen, bin gerade am Hacken der BOSE-Boxen.
Demnächst mehr hier in diesem Post.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 15 Januar 2026, 14:22:51Gemach, ich muss das erstmal nachstellen, bin gerade am Hacken der BOSE-Boxen.
Ich dachte Du hättest schon einen Fundus von Definitionen in Deinem Babble :-)
Hab ich auch, war aber gerade mit dem BOSE-Zeug sehr beschäftigt.
ZitatMuss man immer Gerät, Ort, Verb, Ziel angeben, auch wenn weniger Angaben eindeutig wären?
Ich habe z.B. nur eine Zirkulationspumpe, die wir für Heißes Wasser in der Küche zum Spülen verwenden.
Es funktioniert: Zirkulation in der Küche anschalten
Eindeutig wäre : Zirkulation an
Muss man an und ein separat als Ziel definieren, oder geht das auch einfacher?
Erste Frage: Nein, das geht einfacher. Ich habe z.B. auch genau eine Zirkulationspumpe. Die bekommt den Babble-Namen "Zirkulation" und taucht dann automatisch in der Babble-Liste auf. Bei mir etwas komplizierter, das FHEM-Device heißt hier Voice.Zirkulation, weil das von dort noch auf einen anderen FHEM-Server weitergeleitet wird. Siehe Screenshot
Zweite Frage: Nein, "an" und "ein" sind synonym.
LG
pah
Screenshot 2026-01-15 152344.png
Input: Zirkulation in der Küche anschalten
Ergebnis: Category=3.4.7: Gerät=zirkulation Ort=küche Verb=schalten Ziel=an / ==> set Zirkulation on
Input: Zirkulation Küche einschalten
Ergebnis: Category=3.4.7: Gerät=zirkulation Ort=küche Verb=schalten Ziel=an / ==> set Zirkulation on
Input: Zirkulation anschalten
Ergebnis: undefined
Input: Zirkulation an
Ergebnis: undefined
So, ich habe noch ein Goodie.
Im repository steht die Babble-Version 1.42 von 2019.
Ich selbst betreibe die Version 2.3. Die kennt noch eine wesentliche Neuerung, nämlich "generic devices"...
Das heißt konkret: Wenn man ein FHEM-Device hat, das den genericDeviceType=thermometer,thermostat,hygrometer
hat (alle möglichen Werte sind durch komma getrennt) und im babbleRoom=arbeitszimmer ist,
versteht Babble die Befehle
-- wie ist die temperatur im arbeitszimmer (gelesen wird das reading temperature oder measured-temp)
-- wie ist die feuchte im arbeitszimmer (gelesen wird das reading humidity)
-- stelle die temperatur im arbeitszimmer auf xx grad (geschrieben wird das Kommando set <device> desired-temp xx
Auch Rollläden und Fensteröffnungen stelle ich auf diese Weise, ohne irgendetwas in Babble explizit zu definieren. Licht kann ich auch ohne explizite Definition einschalten.
Diese Sache funktioniert sogar mit entfernten FHEM-Servern, wenn auf denen eine Datei 99_BabbleUtils.pm installiert ist. Dann holt sich Babble nämlich auf Wunsch alle generic devices des entfernten Servers, und kann sie fortan bedienen.
Nachteil dieses Features: Noch nicht gut dokumentiert, und noch nicht internationalisiert. Also, genau genommen. ewas "Beta".
Also mein Tipp: Babble erst einmal in der stabilen Version zum Laufen bringen, und dann diese aktualisierte Version testen.
LG
pah
ZitatInput: Zirkulation Küche einschalten
Tipp: Entferne die Zeile mit der Küche ...
Noch ein Tipp: Will man komplexere Sachen auch ohne Rivescript machen, geht das mit dem Attribut babblePreSubs (Vor-Substitutionen)
Beispiel: Mein Device YYY hat den Babble-Namen "Haus" und kennt den Befehl "set YYY mode donotdisturb", um Störungen der Mittagsruhe auszuschalten.
Es gibt also, siehe Screenshot, einen Babble-Befehl "Haus stören aus", dieser setzt (in diesem Fall sogar an einen externen FHEM-Server) das Kommando ab:
defmod dndoff at +01:00 set YYY mode normal;;set YYY mode donotdisturb;;d.h., der Modus wird nach einer Stunde wieder zurückgesetzt.
Nun will ich nicht sagen müssen "Haus stören aus". Sondern "Bitte nicht stören". Also gibt es im Attribut babblepreSubs einen Eintrag
bitte\snicht\sstören:haus\sstören\sausAblauf also: Der Bediener sagt "Bitte nicht stören" => Substituiert durch "Haus stören aus" => von Babble semantisch analysiert und umgesetzt in das o.a. Kommando.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 15 Januar 2026, 15:27:27ZitatInput: Zirkulation Küche einschalten
Tipp: Entferne die Zeile mit der Küche ...
Klappt nicht so wirklich mit allen Permutationen.
Es gab vorhin mal eine Konfiguration, bei der zumindest zwei Varianten gingen, dabei war aber die Reihen folge der Zeilen wichtig.
Screenshot 2026-01-15 155157.png
Das Problem dabei ist jedoch, dass man das irgendwie nicht beeinflussen kann.
Selbst mit Save und reload kommen die Zeilen dann wieder anders.
Ich wollte meine Vorabfrage, die ich für einige Kurzbefehle hatte, damit dann auch direkt erledigen.
Zitat von: ch.eick am 15 Januar 2026, 14:28:30Ich dachte Du hättest schon einen Fundus von Definitionen in Deinem Babble
Ja. 58 "named devices", und folgende generic devices. Alles in Allem also deutlich mehr als 100 Geräte und Aktionen, plus alles das, was die rivescript-datei enthält.
generic_192_168_0_90
AZ.All.Fen AZ.All.Roll AZ.HMTh AZ.Strip BI.All.Roll BI.HMHz BI.Roll.F BI.Roll.T BI.WS BK.OWM BZ.HMHz BZ.Roll BZ.WS EB.HMHz GB.HMHz GB.Roll GZ.All.Roll GZ.Beleuchtung GZ.HMTh JZ.HMHz JZ.Roll JZ.WS K.Roll KB.All.Roll SZ.All.Roll SZ.Clima SZ.HMTh SZ.J SZ.P SZ.Roll.0 SZ.Roll.1 SZ.Roll.2 SZ.Roll.3 TH.Strip VK.D VK.OWM WK.OWM WZ.AC WZ.All.Roll WZ.Clima WZ.OWM WZ.Roll.0 WZ.Roll.1 WZ.Roll.2 WZ.Roll.3 ZK.Beleuchtung ZK.HMThgeneric_local
Alexa.Abwesenheit Alexa.Blind.A Alexa.Blind.F Alexa.Blind.T Alexa.House Alexa.Maindoor Alexa.Nichtstoeren Alexa.Party Alexa.Spracheingabe Alexa.Tab.M Alexa.Tab.OG Alexa.Tab1.EG Alexa.Tab2.EG Alexa.Yarddoor SZ.AC Voice.Beleuchtung Voice.Beleuchtung.Esstisch Voice.Beleuchtung.Fernsehen Voice.Beleuchtung.Schlummern Voice.Beleuchtung.Sitzgruppe Voice.Bewaesserung Voice.Gong Voice.Harmony Voice.Harmony.BluRay Voice.Harmony.Fernseher Voice.Harmony.Musik Voice.Harmony.Programm Voice.Harmony.Radio Voice.Harmony.Stille Voice.Harmony.Volume Voice.Weckzeit Voice.Zirkulation WZ.ACGerade habe ich abgesetzt "spiele musik im arbeitszimmer von alison balsom"...
LG
pah
Hallo pah,
da ich meine Unstimmigkeiten mit der Konfiguration von Babble nicht lösen konnte wollte ich direkt mal die neuere Version testen, was jedoch im FHEM docker Container nicht klappt, da dort wohl noch etwas fehlt.
Can't locate Text/Levenshtein.pm in @INC (you may need to install the Text::Levenshtein module) (@INC entries checked: ./FHEM/lib ./lib fhem.p/lib fhem.p/FHEM/lib ./FHEM ./ /usr/local/FHEM/share/fhem/FHEM/lib . /usr/src/app/core/lib/perl5/5.38.5/aarch64-linux-gnu /usr/src/app/core/lib/perl5/5.38.5 /usr/src/app/core/lib/perl5/aarch64-linux-gnu /usr/src/app/core/lib/perl5 /usr/src/app/3rdparty/lib/perl5/5.38.5/aarch64-linux-gnu /usr/src/app/3rdparty/lib/perl5/5.38.5 /usr/src/app/3rdparty/lib/perl5/aarch64-linux-gnu /usr/src/app/3rdparty/lib/perl5 /usr/local/lib/perl5/site_perl/5.38.5/aarch64-linux-gnu /usr/local/lib/perl5/site_perl/5.38.5 /usr/local/lib/perl5/vendor_perl/5.38.5/aarch64-linux-gnu /usr/local/lib/perl5/vendor_perl/5.38.5 /usr/local/lib/perl5/5.38.5/aarch64-linux-gnu /usr/local/lib/perl5/5.38.5) at ./FHEM/95_Babble.pm line 48.
BEGIN failed--compilation aborted at ./FHEM/95_Babble.pm line 48.
Im Wiki scheinst Du bereits Funktionen aus der neuen Version dokumentiert zu haben.
Das Java File habe ich nach ./www/Babble/ gelegt.
Ich fange nun nochmals mit der alten Version an, jedoch hat dort das "babblePreSubs (Vor-Substitutionen)" bisher noch nicht funktioniert.
EDIT:
im babblePreSubs muss anscheinend alles klein geschrieben werden, jetzt wird es wohl richtig umgesetzt.
Ich denke dass sollte im MOdul vor der Verwendung mit lc() automatisch umgesetzt werden, denn da werden sicher auch andere drüber stolpern.
So sieht die Definition unter Babble Devices momentan aus
babblePreSubs zirkulation\san:zirkulation\sküche\seinschalten
Zirkulation Küche schalten an set Zirkulation on
Küche leer leer set Zirkulation on
leer leer leer set Zirkulation on
# Das teste ich in der FHEM Kommando Zeile
{ print Babble_DoIt("Babble","Zirkulation","testit",0)."\n";;
print Babble_DoIt("Babble","Zirkulation an","testit",0)."\n";;
print Babble_DoIt("Babble","Zirkulation Küche an","testit",0)."\n";;
print Babble_DoIt("Babble","Zirkulation Küche anschalten","testit",0)."\n" }
# Und das steht dann im Log
[Babble_Normalize] Input: Zirkulation
Ergebnis: Category=X.X.X: Gerät=zirkulation Ort=none Verb=none Ziel=none / none==> set Zirkulation on
[Babble_Normalize] Input: Zirkulation an
Ergebnis: Category=3.4.7: Gerät=zirkulation Ort=küche Verb=schalten Ziel=an / ==> set Zirkulation on
[Babble_Normalize] Input: Zirkulation Küche an
Ergebnis: Category=3.4.7: Gerät=zirkulation Ort=küche Verb=none Ziel=none / ==> set Zirkulation on
[Babble_Normalize] Input: Zirkulation Küche anschalten
Ergebnis: Category=3.4.7: Gerät=zirkulation Ort=küche Verb=schalten Ziel=an / ==> set Zirkulation on
Screenshot 2026-01-17 155804.png
Bei der Eingabe unter Babble Devices läuft es echt komisch. Nach einem Sichern und anschließendem Browser Reload kommen die Eingetragenen Zeilen durcheinander.
Manchmal erscheinen zusätzliche neue, oder es fehlen welche, oder eine neue Zeile hat wieder einen vorherigen Wert.
Zusammenfassend kann man mit Babble bereits sehr viele Varianten bei der Kommandoeingabe durch gesprochenes Wort auflösen. Das verringert dann später die Anzahl der Gemini Aufrufe, was in diesem Thread ja das eigentliche Thema ist ;-)
VG Christian
Ich habe gerade hier meinen Ansatz mit Informationen zur Spracheingabe ergänzt. (https://forum.fhem.de/index.php?msg=1355913)
Kann es sein, dass Du das JavaScript-File nicht installiert hast? Das sorgt für die richtige Reihenfolge der Buttons.
Das Levenshtein-Modul enthält einen Algorithmus, der Textabstände bestimmt.
cpan Levenshtein
LG
pah
Nix cpan, sondern apt und libtext-levenshtein-perl und zwar wie hier beschrieben als Modifikation des Image: https://github.com/fhem/fhem-docker?tab=readme-ov-file#since-version-4
Zitat von: passibe am 17 Januar 2026, 18:22:44Nix cpan
Das darf wohl jeder selbst entscheiden?
pah
Zitat von: Prof. Dr. Peter Henning am 17 Januar 2026, 17:57:34Kann es sein, dass Du das JavaScript-File nicht installiert hast? Das sorgt für die richtige Reihenfolge der Buttons.
Hmm, wie macht man das?
Ich habe es nur unter ./www/Babble/ abgelegt :-)
Zitat von: Prof. Dr. Peter Henning am 17 Januar 2026, 18:29:15Zitat von: passibe am 17 Januar 2026, 18:22:44Nix cpan
Das darf wohl jeder selbst entscheiden?
Natürlich, jedoch müsste man das dann immer wieder machen, wenn man den Container aktualisiert.
Ich habe es deshalb auch lieber im Docker Compose hinterlegt und es wird somit jedesmal automatisch nachinstalliert.
Sooo, is auch drin,
jedoch reicht das mit "apt-get install libtext-levenshtein-perl" wohl doch nicht aus, denn die Meldung kommt weiterhin.
Can't locate Text/Levenshtein.pm in @INC (you may need to install the Text::Levenshtein module) (@INC entries checked: ./FHEM/lib ./lib fhem.p/lib fhem.p/FHEM/lib ./FHEM ./ /usr/local/FHEM/share/fhem/FHEM/lib . /usr/src/app/core/lib/perl5/5.38.5/aarch64-linux-gnu /usr/src/app/core/lib/perl5/5.38.5 /usr/src/app/core/lib/perl5/aarch64-linux-gnu /usr/src/app/core/lib/perl5 /usr/src/app/3rdparty/lib/perl5/5.38.5/aarch64-linux-gnu /usr/src/app/3rdparty/lib/perl5/5.38.5 /usr/src/app/3rdparty/lib/perl5/aarch64-linux-gnu /usr/src/app/3rdparty/lib/perl5 /usr/local/lib/perl5/site_perl/5.38.5/aarch64-linux-gnu /usr/local/lib/perl5/site_perl/5.38.5 /usr/local/lib/perl5/vendor_perl/5.38.5/aarch64-linux-gnu /usr/local/lib/perl5/vendor_perl/5.38.5 /usr/local/lib/perl5/5.38.5/aarch64-linux-gnu /usr/local/lib/perl5/5.38.5) at ./FHEM/95_Babble.pm line 48.
BEGIN failed--compilation aborted at ./FHEM/95_Babble.pm line 48.
root@raspberrypi:/opt/fhem# apt-get install libtext-levenshtein-perl
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
libtext-levenshtein-perl
0 upgraded, 1 newly installed, 0 to remove and 40 not upgraded.
Need to get 11.6 kB of archives.
After this operation, 28.7 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian bookworm/main arm64 libtext-levenshtein-perl all 0.15-1 [11.6 kB]
Fetched 11.6 kB in 0s (284 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package libtext-levenshtein-perl.
(Reading database ... 47972 files and directories currently installed.)
Preparing to unpack .../libtext-levenshtein-perl_0.15-1_all.deb ...
Unpacking libtext-levenshtein-perl (0.15-1) ...
Setting up libtext-levenshtein-perl (0.15-1) ...
Zitat von: ch.eick am 17 Januar 2026, 18:30:33Hmm, wie macht man das?
Muss unter www/pgm2
LG
pah
Hm, es scheint als würden die Dateien unter /usr/share/perl5 installiert (klick (https://packages.debian.org/de/bookworm/all/libtext-levenshtein-perl/filelist)). Und das ist anscheinend nicht in @INC (wieso auch immer, ist das vielleicht ein Bug des Containers?).
Das heißt entweder du machst 1x einen Symlink (der aber, wenn du den FHEM-Ordner neu erstellst, wieder weg ist; ich nehme aber mal an, dass das nicht passiert):
mkdir /opt/fhem/lib/Text && ln -s /usr/share/perl5/Text/Levenshtein.pm /opt/fhem/lib/Text/Levenshtein.pm
Oder du nutzt tatsächlich CPAN im Dockerfile, das scheint die Dateien an die richtigen Stellen zu legen:
RUN cpan install Text::Levenshtein
Hallo zusammen,
da dieser Thread absolut nichts mehr mit anfänger Fragen zu tun hat ziehe ich jetzt mal nach hier um. (https://forum.fhem.de/index.php?topic=143834.0)
Ich werde offene Punkte von hier dann auch noch aufnehmen.
VG Christian