Weiter zum Inhalt
  • Home
  • Aktuell
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Praktische Anwendungen (Showcase)
  4. Hannah — Open Source Smart-Home-Sprachassistentin

NEWS

  • Monatsrückblick Juli / August 2026 ist online!
    BluefoxB
    Bluefox
    10
    1
    552

  • Der neue Monatsrückblick für Mai und Juni 2026 ist online!
    BluefoxB
    Bluefox
    8
    1
    1.3k

  • wichtiges UPDATE für controller 7.2.2 im stable
    HomoranH
    Homoran
    10
    1
    3.8k

Hannah — Open Source Smart-Home-Sprachassistentin

Geplant Angeheftet Gesperrt Verschoben Praktische Anwendungen (Showcase)
78 Beiträge 17 Kommentatoren 8.9k Aufrufe 34 Beobachtet
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M Offline
    M Offline
    manne01
    schrieb am zuletzt editiert von
    #65

    Wow🤩 Freue mich riesig drauf das Compose einzurichten und melde mich wieder.
    DANKE @Leonie !
    Ich hoffe dass das den Anwenderkreis am Ende auch nochmal so deutlich erweitert wie ich mir das vorstelle👍

    Okay, und eine Domain habe ich grundsätzlich schon auch, ich probiere es damit nochmal.

    1 Antwort Letzte Antwort
    0
    • L Leonie

      @manne01 sagte:

      Meinen Telegram Account zu verbinden - es kommt "Bot domain invalid" und meine "lokale" Domain bei Telegram mit /setdomain zu verknüpfen macht doch irgendwie keinen Sinn? Zur Domainregistrierung finde ich kaum Infos.

      Ich ziehe das nochmal nach.
      Leider habe ich selbst keinen Einfluss auf das was Telegram verlangt. Hannah nutzt ein "Login with Telegram" in der WebUI für die Verknüpfung. Dafür benötigt der BotFather eine Domain, die Domain unter der die WebUI erreichbar ist.
      Leider funktionieren da keine IP-Adressen und keine lokalen Domains. Telegram erfordert eine öffentliche überprüfbare Domain. Nicht falsch verstehen, die WebUI muss nur eine öffentliche Domain nutzen, nicht aus der Öffentlichkeit erreichbar sein.
      Ja, ist nicht ideal, aber den Ablauf gibt leider Telegram vor.
      Ich selbst habe glücklicherweise eine eigene Domain. Unter der kann ich meine WebUI aufrufen und Telegram ist glücklich. Damit ich die aber aufrufen kann, muss ich zu Hause sein. Aus dem Internet geht es nicht.
      An der Stelle mag ich schonmal sagen, das eine DynDNS-Adresse bspw. von MyFritz! schon ausreichend ist, damit der BotFather zu Frieden ist.

      Liebe Grüße
      Leonie

      OliverIOO Offline
      OliverIOO Offline
      OliverIO
      schrieb am zuletzt editiert von
      #66

      @Leonie sagte:

      An der Stelle mag ich schonmal sagen, das eine DynDNS-Adresse bspw. von MyFritz! schon ausreichend ist, damit der BotFather zu Frieden ist.

      wer einen port nach außen öffnet, sollte unbedingt einen
      reverse proxy einsetzen um die Angriffsfläche zu verkleinern.
      Weiterhin das noch mit fail2ban absichern, was aber ein wenig Beobachtung und Konfiguration erfordert

      beides ist als dockercontainer verfügbar.
      einen container mit dem reverse proxy ist sehr einfach
      durch ein paar zusätzliche Anweisungen im docker compose welcher dann im internet auf anfragen horchen soll.
      https://hub.docker.com/r/jwilder/nginx-proxy
      https://hub.docker.com/r/linuxserver/fail2ban

      kleine werbung in eigener Sache: Wer fail2ban mit einer webgui überwachen möchte kann sich diesen Container anschauen, leider ist die kommandozeile von fail2ban etwas grausam:
      https://hub.docker.com/r/oweitman/fail2bancontrol
      und zur Überwachung im iobroker:
      https://github.com/oweitman/ioBroker.fail2bancontrol

      Meine Adapter und Widgets
      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
      Links im Profil

      L 1 Antwort Letzte Antwort
      1
      • OliverIOO OliverIO

        @Leonie sagte:

        An der Stelle mag ich schonmal sagen, das eine DynDNS-Adresse bspw. von MyFritz! schon ausreichend ist, damit der BotFather zu Frieden ist.

        wer einen port nach außen öffnet, sollte unbedingt einen
        reverse proxy einsetzen um die Angriffsfläche zu verkleinern.
        Weiterhin das noch mit fail2ban absichern, was aber ein wenig Beobachtung und Konfiguration erfordert

        beides ist als dockercontainer verfügbar.
        einen container mit dem reverse proxy ist sehr einfach
        durch ein paar zusätzliche Anweisungen im docker compose welcher dann im internet auf anfragen horchen soll.
        https://hub.docker.com/r/jwilder/nginx-proxy
        https://hub.docker.com/r/linuxserver/fail2ban

        kleine werbung in eigener Sache: Wer fail2ban mit einer webgui überwachen möchte kann sich diesen Container anschauen, leider ist die kommandozeile von fail2ban etwas grausam:
        https://hub.docker.com/r/oweitman/fail2bancontrol
        und zur Überwachung im iobroker:
        https://github.com/oweitman/ioBroker.fail2bancontrol

        L Online
        L Online
        Leonie
        schrieb am zuletzt editiert von Leonie
        #67

        @OliverIO sagte:

        wer einen port nach außen öffnet

        Das muss es auch nicht. Davon habe ich nichts gesagt. Die Adresse muss existieren und hausintern erreichbar sein. Mehr nicht.

        Ich habe nochmal alles überprüft und habe hier eine bessere Anqleitung/Erklärung:

        Telegram-Konto mit Hannah verknüpfen — Setup & Voraussetzungen

        Über die WebUI (/me) kann jeder Nutzer sein eigenes Telegram-Konto mit seinem Hannah-Account verknüpfen (z.B. für Benachrichtigungen). Damit der Button dafür überhaupt erscheint, muss der Betreiber der Hannah-Instanz vorher einmalig etwas einrichten.

        Was man braucht

        1. Einen Telegram-Bot (Token + Username)
        2. Eine Domain, unter der die WebUI erreichbar ist
        3. HTTPS auf der WebUI (Zertifikat darf selfsigned sein)
        4. Bot-Daten in der WebUI-Konfiguration eingetragen

        Schritt für Schritt

        1. Bot bei BotFather anlegen

        In Telegram mit @BotFather chatten, /newbot ausführen. Man bekommt danach:

        • einen Bot-Token (z.B. 123456789:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
        • einen Bot-Usernamen (z.B. MeinHannahBot)

        2. Domain beim Bot freischalten

        Ebenfalls bei BotFather: /setdomain ausführen und die Domain eintragen, unter der die WebUI erreichbar ist (z.B. hannah.mein-zuhause.duckdns.org).

        Wichtig: Ohne diesen Schritt lehnt Telegram den Login-Versuch direkt ab, noch bevor er bei der WebUI ankommt.

        3. Bot-Daten in der WebUI eintragen

        In config.yaml:

        ```yaml
        telegram_bot_token: "123456789:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        telegram_bot_username: "MeinHannahBot"
        ```

        Oder bei Docker-Deployment als Umgebungsvariablen:

        ```
        HANNAH_WEBUI_TELEGRAM_BOT_TOKEN=123456789:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        HANNAH_WEBUI_TELEGRAM_BOT_USERNAME=MeinHannahBot
        ```

        Fehlt eines von beiden, zeigt /me nur den Hinweis "Telegram-Verknüpfung ist auf diesem Server nicht konfiguriert." — kein Fehler, einfach kein Button.

        Häufige Fragen zur Domain

        Reicht eine DynDNS-Domain (DuckDNS, No-IP, …)?
        Ja. Telegram vergleicht die Domain nur als Text (das, was bei /setdomain hinterlegt wurde, gegen das, was die WebUI beim Login-Versuch mitschickt) — es wird nicht per DNS aufgelöst oder angepingt. Dass sich die IP dahinter ständig ändert, spielt also keine Rolle.

        Muss das TLS-Zertifikat "echt" sein (Let's Encrypt o.ä.)?
        Nein, ein selfsigned Zertifikat reicht. Grund: Telegrams Server verbinden sich nie direkt mit der WebUI. Der komplette Rücksprung läuft über den Browser des jeweiligen Nutzers:

        1. Browser → oauth.telegram.org (Nutzer bestätigt dort den Login)
        2. Telegram leitet den Browser zurück zur WebUI, mit den signierten Login-Daten im Gepäck
        3. Ein kleines Skript auf der WebUI-Seite nimmt diese Daten entgegen und schickt sie an die WebUI

        Der Browser ist es also, der die TLS-Verbindung zur WebUI aufbaut — nicht Telegram. Ein selfsigned Zertifikat funktioniert, solange der jeweilige Nutzer es akzeptiert (Klick durch die Warnung, oder eigene CA im Trust-Store).

        Muss die WebUI öffentlich aus dem Internet erreichbar sein? Braucht es Portfreigabe?
        Nein. Aus demselben Grund wie oben: Da nur der Browser des Nutzers die WebUI kontaktiert (nie Telegram selbst), reicht es, wenn der Browser die WebUI erreichen kann — z.B. im Heimnetz oder per VPN. Keine Portfreigabe, keine öffentliche Erreichbarkeit nötig.

        Aber Achtung:
        Die Domain, über die man auf die WebUI zugreift, muss exakt die sein, die bei /setdomain hinterlegt wurde. Wer mal über die DynDNS-Domain und mal über eine lokale IP/einen anderen Hostnamen auf die WebUI geht, bekommt den Login-Button nur bei der registrierten Domain zu sehen bzw. der Login schlägt sonst fehl. Ich muss allerdings auch sagen, dass das nur für die Verknüpfung selbst relevant ist. Ist der Account einmal verbunden, braucht man das Widget nie wieder, bzw. erst wieder, wenn man die Verbindung trennen möchte.

        Der Ablauf beim eigentlichen Verknüpfen (zur Info)

        1. Nutzer klickt auf /me den Telegram-Button → Redirect zu Telegram
        2. Nutzer bestätigt dort den Login
        3. Telegram schickt die signierten Daten zurück — technisch als URL-Fragment (#...), das kommt beim Server gar nicht an
        4. Ein JS-Snippet auf der Seite liest das Fragment im Browser aus und leitet es als normalen Request an die WebUI weiter
        5. Die WebUI prüft die Signatur (mit dem Bot-Token) und dass die Anfrage nicht älter als 5 Minuten ist
        6. Passt alles → Konto ist verknüpft

        Typische Stolperfallen

        Problem Ursache
        Login-Button erscheint gar nicht telegram_bot_token oder telegram_bot_username fehlt in der Config
        Telegram bricht schon vor der WebUI ab Domain bei /setdomain falsch/vergessen, oder stimmt nicht mit der tatsächlich aufgerufenen Domain überein
        "ungültige oder abgelaufene Signatur" Bot-Token in der Config falsch/vertippt, oder Nutzer hat länger als 5 Minuten gebraucht, um den Login bei Telegram zu bestätigen
        OliverIOO 1 Antwort Letzte Antwort
        0
        • L Leonie

          @OliverIO sagte:

          wer einen port nach außen öffnet

          Das muss es auch nicht. Davon habe ich nichts gesagt. Die Adresse muss existieren und hausintern erreichbar sein. Mehr nicht.

          Ich habe nochmal alles überprüft und habe hier eine bessere Anqleitung/Erklärung:

          Telegram-Konto mit Hannah verknüpfen — Setup & Voraussetzungen

          Über die WebUI (/me) kann jeder Nutzer sein eigenes Telegram-Konto mit seinem Hannah-Account verknüpfen (z.B. für Benachrichtigungen). Damit der Button dafür überhaupt erscheint, muss der Betreiber der Hannah-Instanz vorher einmalig etwas einrichten.

          Was man braucht

          1. Einen Telegram-Bot (Token + Username)
          2. Eine Domain, unter der die WebUI erreichbar ist
          3. HTTPS auf der WebUI (Zertifikat darf selfsigned sein)
          4. Bot-Daten in der WebUI-Konfiguration eingetragen

          Schritt für Schritt

          1. Bot bei BotFather anlegen

          In Telegram mit @BotFather chatten, /newbot ausführen. Man bekommt danach:

          • einen Bot-Token (z.B. 123456789:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
          • einen Bot-Usernamen (z.B. MeinHannahBot)

          2. Domain beim Bot freischalten

          Ebenfalls bei BotFather: /setdomain ausführen und die Domain eintragen, unter der die WebUI erreichbar ist (z.B. hannah.mein-zuhause.duckdns.org).

          Wichtig: Ohne diesen Schritt lehnt Telegram den Login-Versuch direkt ab, noch bevor er bei der WebUI ankommt.

          3. Bot-Daten in der WebUI eintragen

          In config.yaml:

          ```yaml
          telegram_bot_token: "123456789:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
          telegram_bot_username: "MeinHannahBot"
          ```

          Oder bei Docker-Deployment als Umgebungsvariablen:

          ```
          HANNAH_WEBUI_TELEGRAM_BOT_TOKEN=123456789:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
          HANNAH_WEBUI_TELEGRAM_BOT_USERNAME=MeinHannahBot
          ```

          Fehlt eines von beiden, zeigt /me nur den Hinweis "Telegram-Verknüpfung ist auf diesem Server nicht konfiguriert." — kein Fehler, einfach kein Button.

          Häufige Fragen zur Domain

          Reicht eine DynDNS-Domain (DuckDNS, No-IP, …)?
          Ja. Telegram vergleicht die Domain nur als Text (das, was bei /setdomain hinterlegt wurde, gegen das, was die WebUI beim Login-Versuch mitschickt) — es wird nicht per DNS aufgelöst oder angepingt. Dass sich die IP dahinter ständig ändert, spielt also keine Rolle.

          Muss das TLS-Zertifikat "echt" sein (Let's Encrypt o.ä.)?
          Nein, ein selfsigned Zertifikat reicht. Grund: Telegrams Server verbinden sich nie direkt mit der WebUI. Der komplette Rücksprung läuft über den Browser des jeweiligen Nutzers:

          1. Browser → oauth.telegram.org (Nutzer bestätigt dort den Login)
          2. Telegram leitet den Browser zurück zur WebUI, mit den signierten Login-Daten im Gepäck
          3. Ein kleines Skript auf der WebUI-Seite nimmt diese Daten entgegen und schickt sie an die WebUI

          Der Browser ist es also, der die TLS-Verbindung zur WebUI aufbaut — nicht Telegram. Ein selfsigned Zertifikat funktioniert, solange der jeweilige Nutzer es akzeptiert (Klick durch die Warnung, oder eigene CA im Trust-Store).

          Muss die WebUI öffentlich aus dem Internet erreichbar sein? Braucht es Portfreigabe?
          Nein. Aus demselben Grund wie oben: Da nur der Browser des Nutzers die WebUI kontaktiert (nie Telegram selbst), reicht es, wenn der Browser die WebUI erreichen kann — z.B. im Heimnetz oder per VPN. Keine Portfreigabe, keine öffentliche Erreichbarkeit nötig.

          Aber Achtung:
          Die Domain, über die man auf die WebUI zugreift, muss exakt die sein, die bei /setdomain hinterlegt wurde. Wer mal über die DynDNS-Domain und mal über eine lokale IP/einen anderen Hostnamen auf die WebUI geht, bekommt den Login-Button nur bei der registrierten Domain zu sehen bzw. der Login schlägt sonst fehl. Ich muss allerdings auch sagen, dass das nur für die Verknüpfung selbst relevant ist. Ist der Account einmal verbunden, braucht man das Widget nie wieder, bzw. erst wieder, wenn man die Verbindung trennen möchte.

          Der Ablauf beim eigentlichen Verknüpfen (zur Info)

          1. Nutzer klickt auf /me den Telegram-Button → Redirect zu Telegram
          2. Nutzer bestätigt dort den Login
          3. Telegram schickt die signierten Daten zurück — technisch als URL-Fragment (#...), das kommt beim Server gar nicht an
          4. Ein JS-Snippet auf der Seite liest das Fragment im Browser aus und leitet es als normalen Request an die WebUI weiter
          5. Die WebUI prüft die Signatur (mit dem Bot-Token) und dass die Anfrage nicht älter als 5 Minuten ist
          6. Passt alles → Konto ist verknüpft

          Typische Stolperfallen

          Problem Ursache
          Login-Button erscheint gar nicht telegram_bot_token oder telegram_bot_username fehlt in der Config
          Telegram bricht schon vor der WebUI ab Domain bei /setdomain falsch/vergessen, oder stimmt nicht mit der tatsächlich aufgerufenen Domain überein
          "ungültige oder abgelaufene Signatur" Bot-Token in der Config falsch/vertippt, oder Nutzer hat länger als 5 Minuten gebraucht, um den Login bei Telegram zu bestätigen
          OliverIOO Offline
          OliverIOO Offline
          OliverIO
          schrieb am zuletzt editiert von
          #68

          @Leonie

          Sorry, kannte bisher nur die webhook Methode um auch Nachrichten empfangen zu können.
          Hab gesehen das es auch die long polling Methode gibt.
          Dafür brauch man dann keinen Port nach außen.

          Meine Adapter und Widgets
          TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
          Links im Profil

          1 Antwort Letzte Antwort
          0
          • Walter.O.W Online
            Walter.O.W Online
            Walter.O.
            schrieb am zuletzt editiert von Walter.O.
            #69

            @leonie
            Denkst du noch an mich?
            Habe es gerade mal auf meinem Linux PC versucht,
            das irritiert mich jetzt aber. Der core ist da ja noch garnicht draufgewesen.

            curl -fsSL https://raw.githubusercontent.com/NurPech/hannah/master/core/deploy/install.sh | sudo bash
            [sudo: authenticate] Passwort:
            [INFO] Fetching latest core release from https://hannah-update.sgessinger.de (channel: core-stable) ...
            [INFO] Latest version: v0.75.7
            walter@walter-pc:~$ systemctl status hannah
            Unit hannah.service could not be found.

            L 1 Antwort Letzte Antwort
            0
            • M Offline
              M Offline
              manne01
              schrieb zuletzt editiert von manne01
              #70

              Guten Morgen,

              @walter.o. Dir vielen dank für die Infos und erste Fassung der Dockerfiles - das hatte mir ermöglicht direkt schonmal einen Durchstich zu machen von Spracheingabe Telegram bis funktionierender ioBroker-Statusänderung und Sprachrückgabe :)

              @Leonie vielen Dank für die CI Pipeline und das Compose.
              Ich find das klasse, besonders auch zB dass die diversen configs des Stacks jetzt nebeneinander liegen.
              Es funktioniert damit schon einiges aber noch läuft die core nicht.

              Folgende kleine Änderungen habe ich gemacht, damit es für mein Setup läuft:
              a) Auskommentieren der Zeilen mit "profiles" - die blockieren wohl irgendwas im Synology Container Manager (Fehlermeldung beim compose-build dann "service mysql not found" o.ä.), scheinen auch optional zu sein
              b) mosquitto broker auskommentiert, habe ich in iobroker schon
              c) den volumes-Block unten gelöscht und stattdessen bei den Container-Definitionen die Unterordner (core_data/timer_data...) jeweils auf von mir erstellte Unterordner von /volume1/docker/hannah (in dem Verzeichnis in dem die compose liegt)

              Was läuft:

              • mysql
              • webUI - jetzt mit static assets 👍
              • voiceid
              • telegram
              • proxy

              Was läuft nicht (im sinne von container bleibt oben/terminiert nicht):

              • hannah timer bringt fehler und terminiert regelmäßig (wartet der auf core?)
              {"time":"2026-08-30T08:45:33.408807593Z","level":"INFO","msg":"starting hannah-timer","version":"dev","hannah_addr":"hannah-core:5051","db":"/app/data/timers.db"} 
              {"time":"2026-08-30T08:45:33.409175976Z","level":"ERROR","msg":"opening store","err":"running migrations: unable to open database file (14)"} 
              
              • die core, Log:
              07:54:54 [INFO] hannah.main: Hannah Core dev
              Traceback (most recent call last):
                File "/app/main.py", line 2257, i <module>
                  main()
                  ~~~~^^
                File "/app/main.py", line 101, in main
                  init_db()
                  ~~~~~~~^^
                File "/app/hannah/utils/db.py", line 216, in init_db
                  db = get_db()
                File "/app/hannah/utils/db.py", line 201, in get_db
                  db = Database.sqlite(DB_PATH)
                File "/usr/local/lib/python3.14/site-packages/pyorm/database.py", line 22, in sqlite
                  return cls(dialect.connect(database=database, **kwargs), dialect)
                             ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                File "/usr/local/lib/python3.14/site-packages/pyorm/dialects/sqlite.py", line 21, in connect
                  connection = sqlite3.connect(check_same_thread=False, **kwargs)
              sqlite3.OperationalError: unable to open database file
              
              

              Bin nicht sicher wie das gedacht ist - neben der mysql (wenn ich es richtig verstehe ist die nur für Activities) muss ja die WebUI/Core ihre Settings etc. irgendwo speichern. Wenn ich es richtig verstehe ist das eine kleine sqlite.db (hannah.db?)
              Gefunden hab ich in der core-config.yaml "nur" eine Angabe für hannah_users.db ?

              user_registry:
                db_path: "hannah_users.db"   # SQLite-Datei (relativ zum Arbeitsverzeichnis)
                sync_interval: 60            # Sekunden zwischen ioBroker-Abfragen
              

              Ist da trotz des Namens alles drin? Oder gibts mehrere db.files? Im Code habe ich auch eine hanna.db gefunden und weitere (zb rooms/memory.db)

              Auch müsste diese Datenbank ja noch aus dem Container raus und vom volume her auf den Host ausgelagert werden, so dass man auf dem Host alles wichtige außerhalb von Containern hat, backup machen kann etc.

              Aufgefallen ist mir noch dass innerhalb des Ordners mysql_data ein Ordner hannah_db angelegt wurde, ist aber leer.
              ./core_data ist auch leer (gemountet in den Container nach /app/data)

              Ich hoffe das sind nur noch Kleinigkeiten. Viele Grüße!

              1 Antwort Letzte Antwort
              0
              • L Offline
                L Offline
                Luxi
                schrieb zuletzt editiert von
                #71

                Hallo @leonie
                Vielen Dank erstmal einmal für deine tolle Arbeit.
                Zum Thema Satelliten:

                • wie weit bist du denn mit der Evaluierung von PCPway Zwecks dem Shared Projekt?
                • könntest du die nötigen Dateien für eine Produktion zur Verfügung stellen?
                  LG Luxi
                1 Antwort Letzte Antwort
                0
                • Walter.O.W Walter.O.

                  @leonie
                  Denkst du noch an mich?
                  Habe es gerade mal auf meinem Linux PC versucht,
                  das irritiert mich jetzt aber. Der core ist da ja noch garnicht draufgewesen.

                  curl -fsSL https://raw.githubusercontent.com/NurPech/hannah/master/core/deploy/install.sh | sudo bash
                  [sudo: authenticate] Passwort:
                  [INFO] Fetching latest core release from https://hannah-update.sgessinger.de (channel: core-stable) ...
                  [INFO] Latest version: v0.75.7
                  walter@walter-pc:~$ systemctl status hannah
                  Unit hannah.service could not be found.

                  L Online
                  L Online
                  Leonie
                  schrieb zuletzt editiert von
                  #72

                  Hi,

                  @Walter.O. sagte:

                  Denkst du noch an mich?

                  Ja, aber ich habe auch ein Privatleben :)

                  @manne01 sagte:

                  Bin nicht sicher wie das gedacht ist

                  Beide Fehler kommen zu 100% von deiner Änderung mit den Volumes. Ja, der Volumeblock ist optional, schließlich beschreibt der names Docker Volumes die von compose verwaltet werden. Weil du aber lieber Bind mounts nutzten willst, musst du die Dateirechte entsprechend anpassen.

                  @manne01 sagte:

                  "nur" eine Angabe für hannah_users.db

                  Der Configwert existiert bereits seit langer Zeit nicht mehr und ist in der aktuellen config.example.yaml entfernt. In meiner Container-Version wird die Datenbank nach /app/data gespeichert, weil da das Volume eingehangen wird, ist die Datenbank dann peristent. Die dedizierte hannah_users.db wird nicht verwendet.

                  Die memory.db ist der Langzeitspeicher für das LLM. Sozusagen die low-budget-Variante einer VectorDB. Konfigurieren kannst du die bspw. so:

                  llm:
                    db: "/app/data/memory.db"
                  

                  @manne01 sagte:

                  innerhalb des Ordners mysql_data ein Ordner hannah_db angelegt

                  Das ist auch ein Fehler von dir ;) bzw. eine Eigenheit von Docker. Um dir mehr dazu zu sagen, müsstest du mir dein Compose File geben.

                  @Luxi sagte:

                  Evaluierung von PCPway

                  PCBway scheint ein guter Partner dafür zu sein

                  @Luxi sagte:

                  nötigen Dateien für eine Produktion

                  Hier habe ich einen Interessenskonflikt. Ja, die ESPs funktionieren, aber nicht fehlerfrei. Es gibt Bugs bei denen ich aktuell nicht weiß ob sie in er Firmware oder der Hardware liegen. Ich kann das Projekt dort anlegen, dann könnt ihr es bestellen, aber zu 100% glücklich bin ich noch nicht und das widerstrebt meinem Perfektionismus.

                  Liebe Grüße

                  M 1 Antwort Letzte Antwort
                  0
                  • L Online
                    L Online
                    Leonie
                    schrieb zuletzt editiert von
                    #73

                    @walter.o.

                    Ich habe mir mal eben ein Ubuntu 26.04 installiert. Bei mir ist das Install-Script gesprächiger?

                    administrator@hannah-test:~$ curl -fsSL https://raw.githubusercontent.com/NurPech/hannah/master/core/deploy/install.sh | sudo bash
                    [sudo: authenticate] Password:
                    [INFO]  Fetching latest core release from https://hannah-update.sgessinger.de (channel: core-stable) ...
                    [INFO]  Latest version: v0.75.7
                    [OK]    Downloaded v0.75.7.
                    [OK]    Extracted to /opt/hannah/core.
                    [INFO]  Creating Python venv ...
                    The virtual environment was not created successfully because ensurepip is not
                    available.  On Debian/Ubuntu systems, you need to install the python3-venv
                    package using the following command.
                    
                        apt install python3.14-venv
                    
                    You may need to use sudo with that command.  After installing the python3-venv
                    package, recreate your virtual environment.
                    
                    Failing command: /opt/hannah/core/venv/bin/python3
                    
                    administrator@hannah-test:~$
                    

                    Nach der installation von python3.14-venv, habe ich das nochmal gestartet:

                    administrator@hannah-test:~$ curl -fsSL https://raw.githubusercontent.com/NurPech/hannah/master/core/deploy/install.sh | sudo bash
                    [INFO]  Fetching latest core release from https://hannah-update.sgessinger.de (channel: core-stable) ...
                    [INFO]  Latest version: v0.75.7
                    [OK]    Downloaded v0.75.7.
                    [OK]    Extracted to /opt/hannah/core.
                    [INFO]  Installing Python dependencies ...
                    bash: line 85: /opt/hannah/core/venv/bin/pip: No such file or directory
                     ls /opt/hannah/core/venv/bin/
                    python  python3  python3.14  𝜋thon
                    administrator@hannah-test:~$
                    

                    Und siehe da, Pip wurde im venv nicht installiert. Eine kurze Recherche von mir ergab, das Ubuntu das aus Ressourcengründen nicht installiert.

                    Ein Befehl bringt Abhilfe:

                    administrator@hannah-test:~$ sudo /opt/hannah/core/venv/bin/python3 -m ensurepip --default-pip
                    Looking in links: /tmp/tmpjq2mpmmu
                    Processing /tmp/tmpjq2mpmmu/pip-25.1.1-py3-none-any.whl
                    Installing collected packages: pip
                    Successfully installed pip-25.1.1
                    administrator@hannah-test:~$ ls /opt/hannah/core/venv/bin/
                    pip  pip3  pip3.14  python  python3  python3.14  𝜋thon
                    administrator@hannah-test:~$
                    

                    Dann läuft die Installation auch korrekt durch:

                    administrator@hannah-test:~$ curl -fsSL https://raw.githubusercontent.com/NurPech/hannah/master/core/deploy/install.sh | sudo bash
                    [INFO]  Fetching latest core release from https://hannah-update.sgessinger.de (channel: core-stable) ...
                    [INFO]  Latest version: v0.75.7
                    [OK]    Downloaded v0.75.7.
                    [OK]    Extracted to /opt/hannah/core.
                    [INFO]  Installing Python dependencies ...
                    
                    [OK]    Python dependencies installed.
                    [INFO]  Creating system user 'hannah' ...
                    [INFO]  Created /etc/hannah — place your config.yaml there.
                    [OK]    Service unit installed.
                    [OK]    Installed v0.75.7. Place config.yaml in /etc/hannah and run:
                    [OK]      systemctl enable --now hannah
                    administrator@hannah-test:~$ sudo systemctl enable --now hannah
                    Created symlink '/etc/systemd/system/multi-user.target.wants/hannah.service' → '/etc/systemd/system/hannah.service'.
                    administrator@hannah-test:~$
                    

                    Ubuntu scheint da ein paar Besonderheiten zu haben. Ich denke das ensurepip kann ich in den Install-Scripten einbauen. Die Paketinstallationen überlasse ich aber lieber euch.

                    Warum die Scripte bei dir komplett stumm bleiben, kann ich nicht sagen. Das muss irgendwas mit deinem System zu tun haben. Getestet habe ich auf stock Ubuntu 26.04, frisch installiert.

                    Liebe Grüße

                    1 Antwort Letzte Antwort
                    0
                    • L Leonie

                      Hi,

                      @Walter.O. sagte:

                      Denkst du noch an mich?

                      Ja, aber ich habe auch ein Privatleben :)

                      @manne01 sagte:

                      Bin nicht sicher wie das gedacht ist

                      Beide Fehler kommen zu 100% von deiner Änderung mit den Volumes. Ja, der Volumeblock ist optional, schließlich beschreibt der names Docker Volumes die von compose verwaltet werden. Weil du aber lieber Bind mounts nutzten willst, musst du die Dateirechte entsprechend anpassen.

                      @manne01 sagte:

                      "nur" eine Angabe für hannah_users.db

                      Der Configwert existiert bereits seit langer Zeit nicht mehr und ist in der aktuellen config.example.yaml entfernt. In meiner Container-Version wird die Datenbank nach /app/data gespeichert, weil da das Volume eingehangen wird, ist die Datenbank dann peristent. Die dedizierte hannah_users.db wird nicht verwendet.

                      Die memory.db ist der Langzeitspeicher für das LLM. Sozusagen die low-budget-Variante einer VectorDB. Konfigurieren kannst du die bspw. so:

                      llm:
                        db: "/app/data/memory.db"
                      

                      @manne01 sagte:

                      innerhalb des Ordners mysql_data ein Ordner hannah_db angelegt

                      Das ist auch ein Fehler von dir ;) bzw. eine Eigenheit von Docker. Um dir mehr dazu zu sagen, müsstest du mir dein Compose File geben.

                      @Luxi sagte:

                      Evaluierung von PCPway

                      PCBway scheint ein guter Partner dafür zu sein

                      @Luxi sagte:

                      nötigen Dateien für eine Produktion

                      Hier habe ich einen Interessenskonflikt. Ja, die ESPs funktionieren, aber nicht fehlerfrei. Es gibt Bugs bei denen ich aktuell nicht weiß ob sie in er Firmware oder der Hardware liegen. Ich kann das Projekt dort anlegen, dann könnt ihr es bestellen, aber zu 100% glücklich bin ich noch nicht und das widerstrebt meinem Perfektionismus.

                      Liebe Grüße

                      M Offline
                      M Offline
                      manne01
                      schrieb zuletzt editiert von manne01
                      #74

                      @Leonie Danke Dir für die erneute und schnelle Rückmeldung!
                      Hab mir das mit den Datenbanken nochmal angeschaut und ja, mich hat folgendes verwirrt:
                      im COMPOSE ist überall "hannah":

                      mysql-db:
                         image: mysql:8.0
                         container_name: hannah-db
                         profiles: ["full", "with-db"]
                         environment:
                           MYSQL_ROOT_PASSWORD: secretpassword
                           MYSQL_DATABASE: hannah_db
                           MYSQL_USER: hannah_user
                           MYSQL_PASSWORD: hannah_pass
                      
                      

                      vs. in deinem Beitrag oben ist es "Activity-DB":

                      Mitgestartet wird auch ein MySQL-Server, der für den Activity Log genutzt wird. 
                      

                      Ich dachte kurzzeitig die hannah.db soll auch in mysql oder würde dort automatisch erkannt etc. Nachdem ich nun aber annehme dass hannah.db eine sqlite ist und bleibt (und ja, die rechte fehlten😇, daher hat der core die nicht anlegen können) habe ich im compose alles mit "hannah-db" auf activity umgemünzt, damit da draufsteht was drin ist (also entsprechend der core-config in "activity_db" benannt und user usw. ebenso.)

                      Ich hoffe ich habe jetzt bzgl. der Datenbanken alles richtig verstanden!

                      Die Kerstin-Dateien musste ich noch daneben legen, das meldet ja auch das log. Wäre es eine Idee die standardmässig/als Default mitzuliefern? Ändern kann ja dann jeder selber.

                      Jetzt läuft jedenfalls alles mit dem neuen Compose und alle Container und Logs schauen happy aus! 😊 Jetzt muss ich wohl erstmal in ioBroker meine ganzen Objekte/Geräte kategorisieren... Ich vermute da ist erstmal das virtual device script (von dem ich bisher nur mal gelesen habe) hier die Empfehlung der Wahl?

                      Viele Grüße!

                      L 1 Antwort Letzte Antwort
                      0
                      • M manne01

                        @Leonie Danke Dir für die erneute und schnelle Rückmeldung!
                        Hab mir das mit den Datenbanken nochmal angeschaut und ja, mich hat folgendes verwirrt:
                        im COMPOSE ist überall "hannah":

                        mysql-db:
                           image: mysql:8.0
                           container_name: hannah-db
                           profiles: ["full", "with-db"]
                           environment:
                             MYSQL_ROOT_PASSWORD: secretpassword
                             MYSQL_DATABASE: hannah_db
                             MYSQL_USER: hannah_user
                             MYSQL_PASSWORD: hannah_pass
                        
                        

                        vs. in deinem Beitrag oben ist es "Activity-DB":

                        Mitgestartet wird auch ein MySQL-Server, der für den Activity Log genutzt wird. 
                        

                        Ich dachte kurzzeitig die hannah.db soll auch in mysql oder würde dort automatisch erkannt etc. Nachdem ich nun aber annehme dass hannah.db eine sqlite ist und bleibt (und ja, die rechte fehlten😇, daher hat der core die nicht anlegen können) habe ich im compose alles mit "hannah-db" auf activity umgemünzt, damit da draufsteht was drin ist (also entsprechend der core-config in "activity_db" benannt und user usw. ebenso.)

                        Ich hoffe ich habe jetzt bzgl. der Datenbanken alles richtig verstanden!

                        Die Kerstin-Dateien musste ich noch daneben legen, das meldet ja auch das log. Wäre es eine Idee die standardmässig/als Default mitzuliefern? Ändern kann ja dann jeder selber.

                        Jetzt läuft jedenfalls alles mit dem neuen Compose und alle Container und Logs schauen happy aus! 😊 Jetzt muss ich wohl erstmal in ioBroker meine ganzen Objekte/Geräte kategorisieren... Ich vermute da ist erstmal das virtual device script (von dem ich bisher nur mal gelesen habe) hier die Empfehlung der Wahl?

                        Viele Grüße!

                        L Online
                        L Online
                        Leonie
                        schrieb zuletzt editiert von Leonie
                        #75

                        Hi,
                        Ja, grade die Datenbanken sind etwas unglücklich benannt von mir. Der MySQL-server ist wirklich nur für den Activity Log. Alle anderen Daten liegen in einer sqlite. Zwar kann das Storage-Backend auch MySQL (sonst würde es den Activitiy Log gar nicht geben), das kam aber erst mit dem Log, da waren die anderen Teile schon zu weit. Und eine Migration zu schreiben, hatte ich bisher noch keinen Need. Und umbedingt einen externen MySQL-Server vorzuschreiben, während der Activity Log ja optional ist, kommt mir auch nicht passend vor.

                        @manne01 sagte:

                        Wäre es eine Idee die standardmässig/als Default mitzuliefern?

                        Ob ich die Daten mitliefern darf, weiß ich gar nicht, das müsste ich mit HuggingFace klären. Vermutlich dürfte aber nichts dagegen sprechen einen Downloader einzubauen für die Datei, der die automatisch ins Data-Dir bringt. Muss ich aber auch klären und Lizenzen sind ja immer so ein Thema.

                        @manne01 sagte:

                        Ich vermute da ist erstmal das virtual device script

                        Nein, nicht zwingend. Ich nutze ioBroker schon sehr lange und seit vielen Versionen. So gab es bspw. keine komfortable Möglichkeit für Aliase und ich hatte ioBroker bspw. für Hue-Leuchten genutzt. Wenn ich dann eine Leuchte getauscht habe, war die natürlich in der ObjektDB ein neues Objekt und ich musste alle Scripte, Trigger und Aktionen bearbeiten. Da habe ich dann das virtualDevice-Script hier im Forum gefunden, was im Prinzip Objekte "kopiert", also eigene Objekte, für physisiche Objekte erstellt. So habe ich das Objekt "Wohnzimmerlampe" das auf die Zigbee-Adresse 0x00001245 (willkürlich eingetippt) mappt. Wird "Wohnzimmerlampe" eingeschaltet, wird die Zigbee-Adresse geschaltet.
                        Was das Script mir auch bietet und warum ich es nicht missen will: Ich habe einen Zoo an smarter Hardware. Mensche Sensoren von Bosch, andere von Homatic, manche laufen über Tasmota und wieder andere kommen vom KNX. Was sich so über die Jahre historisch angesammelt hat. Alle verwenden aber unterschiedliche Daten. Fenstersensoren von Bosch melden bspw. "OPEN" und "CLOSED", Homematic liefert "true" und "false". Das Script kann mir das konvertieren, so das meine "virtuellen" Fenstersensoren immer true oder false haben, egal welche Hardware dahinter ist.
                        Das wiederrum gibt mir die Möglichkeit da sich in sämtlichen Scripten nicht darauf achten muss, welche Sensoren oder Aktoren ich benutze, weil ich ja alles auf ein spezifisches Format bringe.

                        Und weil ich eben dieses Script nutze und Hannah am Anfang ihrer Entstehung die States über MQTT empfing, habe ich auch bei ihr mit dem Script im Kopf gearbeitet. So kommt bspw. im initalpost die Vorraussetzung das man das Script nutzt.
                        Tatscählich hat sich Hannah in den Monaten aber stetig weiterentwickelt. So ist auch die MQTT-Anbindung zum ioBroker entfernt und durch den wesentlich mächtigeren Adapter ersetzt worden. Natürlich läuft in meinem Produktionssytem noch immer das virtual Device Script und das werde ich auch nicht abschalten. Getestet habe ich Hannah aber auch gegen einen nativen ioBroker, heißt mit nativen Geräten, ohne Konvertierungsscript.
                        Wichtig für Hannah ist, das die Geräte Räumen und die States Funktionen zugewiesen sind. Das ist mit einer gewissen Arbeit verbunden.
                        Im Adapter kann man dann die Kombination an Räumen und Funktionen wählen, die an Hannah gesendet werden. Der Adapter versucht dann quasi auf best-effort-Basis, die States in ioBroker zu interpretieren. Wird bspw. die Funktion "Fenstersensor" ausgelesen im Raum "Badezimmer", geht der Adapter davon aus, wenn es einen boolean-State gibt, das der offen/geschlossen repräsentiert. Das übersetzt der dann in das "Hannah-Protokoll" und sendet das an den Core. Der Core ist in der Beziehung also eigentlich recht "dumm", er verwendet genau die Daten die der Adapter sendet.
                        Das Verhalten vom Adapter kann man auf mehrere Arten beeinflussen. So kann man States bspw. eigene Eigenschaften hinzufügen, die dem Adapter mitteilen, wie er den State zu nutzen hat.
                        An der Stelle möchte ich anmerken, das ich nicht weiß mit welchen Geräten/welchen States der Adapter funktioniert, er tut es mit den Geräten die ich habe auf jeden Fall.

                        So, ist nun wieder recht viel geworden, aber ich hoffe das beantwortet deine Fragen.

                        Liebe Grüße

                        1 Antwort Letzte Antwort
                        0
                        • M Offline
                          M Offline
                          manne01
                          schrieb zuletzt editiert von manne01
                          #76

                          PS: eins ist mir grad noch aufgefallen - ffmpeg scheint im core-container noch zu fehlen. Aus dem core-log:

                          18:50:10 [INFO] hannah.grpc_server: [grpc] SubmitVoice von telegram:8752210440 (user=2, 85487 bytes)
                          18:50:10 [ERROR] grpc._server: Exception calling application: [Errno 2] No such file or directory: 'ffmpeg'
                          Traceback (most recent call last):
                            File "/usr/local/lib/python3.14/site-packages/grpc/_server.py", line 608, in _call_behavior
                              response_or_iterator = behavior(argument, context)
                            File "/app/hannah/grpc_server.py", line 549, in SubmitVoice
                              transcript, answer, intent_name, audio_ogg = self._handle_voice(
                                                                           ~~~~~~~~~~~~~~~~~~^
                                  request.audio, user_id,
                                  ^^^^^^^^^^^^^^^^^^^^^^^
                                  channel_type=request.source_service or "grpc_voice", channel_id=request.source_user_id,
                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              )
                              ^
                            File "/app/main.py", line 1462, in _handle_voice
                              proc = subprocess.run(
                                  ["ffmpeg", "-y", "-i", ogg_path,
                                   "-f", "s16le", "-ac", "1", "-ar", "16000", "-"],
                                  capture_output=True,
                              )
                            File "/usr/local/lib/python3.14/subprocess.py", line 555, in run
                              with Popen(*popenargs, **kwargs) as process:
                                   ~~~~~^^^^^^^^^^^^^^^^^^^^^^
                            File "/usr/local/lib/python3.14/subprocess.py", line 1039, in __init__
                              self._execute_child(args, executable, preexec_fn, close_fds,
                              ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                                  pass_fds, cwd, env,
                                                  ^^^^^^^^^^^^^^^^^^^
                              ...<5 lines>...
                                                  gid, gids, uid, umask,
                                                  ^^^^^^^^^^^^^^^^^^^^^^
                                                  start_new_session, process_group)
                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                            File "/usr/local/lib/python3.14/subprocess.py", line 1990, in _execute_child
                              raise child_exception_type(errno_num, err_msg, err_filename)
                          FileNotFoundError: [Errno 2] No such file or directory: 'ffmpeg'
                          
                          1 Antwort Letzte Antwort
                          0
                          • L Online
                            L Online
                            Leonie
                            schrieb zuletzt editiert von
                            #77

                            Ist gefixt in Tag-Version 0.75.8 oder re-pull von latest

                            1 Antwort Letzte Antwort
                            0
                            • M Offline
                              M Offline
                              manne01
                              schrieb zuletzt editiert von manne01
                              #78

                              Danke dir! Auch für die Erklärung bzgl. Iobroker Geräte-Konfiguration!

                              Der ffmpeg-Fehler kommt jetzt nicht mehr und meine Spracheingaben werden korrekt angenommen. Allerdings ist mir noch eine Fehlermeldung aufgefallen die wohl doch nicht weg war bei meinem letzten Beitrag. Das erklärt auch warum nur der Text und keine Sprachnachrichten mehr an mich zurück kommen wenn ich welche absende:

                              23:46:17 [ERROR] hannah.tts: TTS-Backend 'piper' Initialisierung fehlgeschlagen: [Errno 2] No such file or directory: '/app/data/de_DE-kerstin-low.onnx.json' 
                              

                              In meinem compose sieht es für core so aus:
                              volumes:
                              - ./core_activity_audio:/app/activity_audio
                              - ./core_audio_dumps:/app/audio_dumps
                              - ./core-config.yaml:/etc/hannah/config.yaml:ro
                              - ./core_data:/app/data

                              Im Unterverzeichnis core_data liegen die beiden "Kerstin-Dateien". Die Rechte passen.

                              In core config sieht es so aus:

                                model: "/app/data/de_DE-kerstin-low.onnx"   # leer = TTS deaktiviert
                              

                              Ich hab jetzt gefühlt alle Kombinationen durchkonfiguriert. Egal was ich konfiguriere, er lädt sie nicht. Komme leider nicht mehr weiter.

                              Viele Grüße!

                              1 Antwort Letzte Antwort
                              0

                              Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

                              Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

                              Mit deinem Input könnte dieser Beitrag noch besser werden 💗

                              Registrieren Anmelden
                              Antworten
                              • In einem neuen Thema antworten
                              Anmelden zum Antworten
                              • Älteste zuerst
                              • Neuste zuerst
                              • Meiste Stimmen


                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              197

                              Online

                              33.0k

                              Benutzende

                              83.7k

                              Themen

                              1.3m

                              Beiträge
                              Community
                              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                              ioBroker Community 2014-2026
                              logo
                              • Anmelden

                              • Du hast noch kein Konto? Registrieren

                              • Anmelden oder registrieren, um zu suchen
                              • Erster Beitrag
                                Letzter Beitrag
                              0
                              • Home
                              • Aktuell
                              • Ungelesen 0
                              • Kategorien
                              • Unreplied
                              • Beliebt
                              • GitHub
                              • Docu
                              • Hilfe