SEPIA-Framework / sepia-docs

Documentation and Wiki for SEPIA. Please post your questions and bug-reports here in the issues section! Thank you :-)
https://sepia-framework.github.io/
236 stars 16 forks source link

Teach-UI: KODI and other Smart-Home-Devices #149

Open cap-blackbeard opened 2 years ago

cap-blackbeard commented 2 years ago

Hallo, ich habe SEPIA, KODI und ioBroker laufen. KODI ist durch den kodi-Adapter in ioBroker eingebunden und liefert alle Status. Im SEPIA-Control-Hub habe ich den simple-api-Adapter eingerichtet und das ioBroker-Objekt eingetragen. Nach dem ersten Speichern der Smart-home-Karte wird der Befehl ausgeführt. Danach meldet SEPIA: "Cannot switch device state due to unknown old state: false" Jetzt zu meiner Frage: Was muss ich tun, damit SEPIA den alten Status abfragt?

Grüße Christian

fquirin commented 2 years ago

Hi Christian,

das ist eine ziemlich spezifische Frage. Kannst du ein bisschen was zum KODI Adapter erklären, also was der macht und welche Kontrollbefehle (states) der erwartet? (p.s. interessantes Thema ^^).

Standardmäßig sollte der SEPIA Server den ioBroker Status abrufen via [io-broker-url]/get/[device-id] und dann nach dem key val suchen. Kannst du diesen Request per Hand ausführen um zu sehen was da ausgegeben wird?

cap-blackbeard commented 2 years ago

KODI wird über die JSON-RPC-API Schnittstelle gesteuert. Hier sind die Methoden erklärt: https://kodi.wiki/view/JSON-RPC_API/v12#Methods

Der ioBroker-KODI-Adapter nutzt diese Schnittstelle. Und ich vermute, dass der Adapter wirklich ALLE Daten auflistet: image

Als Beispiel habe ich mal ioBroker-ID "Pause" ausgesucht: ioBroker-Name / SEPIA-Int. Device Id: Controlling playback pause { "type": "state", "common": { "name": "Controlling playback pause", "role": "button.pause", "type": "boolean", "read": false, "write": true, "def": false }, "native": {}, "from": "system.adapter.kodi.0", "user": "system.user.admin", "ts": 1642087130961, "_id": "kodi.0.pause", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" } }

Es gibt auch ne ioBroker-ID "state": ioBROKER-Name / SEPIA-Int. Device Id: Status Play, stop, or pause { "type": "state", "common": { "name": "Status Play, stop, or pause", "role": "media.state", "type": "string", "read": true, "write": false, "def": "stop" }, "native": {}, "from": "system.adapter.kodi.0", "user": "system.user.admin", "ts": 1642087123427, "_id": "kodi.0.state", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" } }

Wie schon geschrieben, wenn ich im SEPIA-Smart-Home die Karte einrichte, dann kann ich die Funktion "Pause" erstmalig über den "Toggle-Button" ausführen. Aber für weitere Ausführungen benötigt SEPIA die Rückmeldung des aktuellen Status.

Request per Hand ausführen? Da habe ich leider keine Ahnung was ich wie, wo machen soll und benötige ne genauere Anweisung. Dann kann ich das bestimmt. http://192.168.0.50:8081/get/kodi.0. ergibt Cannot GET /get/kodi.0. Aber das ist wohl nicht das was Du meinst.

fquirin commented 2 years ago

http://192.168.0.50:8081/get/kodi.0. ergibt Cannot GET /get/kodi.0. Aber das ist wohl nicht das was Du meinst.

Das war grundsätzlich genau was ich meinte, also einfach im Browser eingeben ^^. Falls es irgendeine Firewall oder IP Beschränkung oder Authentifizierung gibt müsste man vielleicht auf dem ioBroker Server mit curl arbeiten. Der SEPIA Server ruft aber so über den simple-api-Adapter den state ab.

Welchen "Type" und "State type" hast du in der Device Karte im SEPIA Control HUB eigentlich gewählt? Abhängig davon wird versucht der "state" zu konvertieren.

fquirin commented 2 years ago

P.S.: Ich hatte vor langer Zeit mal angefangen einen 'KodiControl' custom service zu schreiben, aber nie wirklich umgesetzt weil es ziemlich umfangreich wurde. Damals gab es auch das Smart-Home Interface nicht so wie Heute, aber vielleicht kann man da noch mal ansetzen. Ich vermute KODI benötigt einige non-standard "state" Befehle um ordentlich zu funktionieren :-/.

[EDIT] Eine dritte Alternative könnte vielleicht auch ein Media-Player Widget sein was über den "MusicSearch" Service gesteuert wird.

cap-blackbeard commented 2 years ago

Ich erhalte immer: Cannot GET /get/kodi.0.

Habe getestet Type: Music Player, TV, Device, Other Habe getestet State type: Automatic, Binary, Raw text ohne Unterschiede im Verhalten feststellen zu können.

Media-Player Widget hört sich interessant an.

Habe gerade noch was anderes ausprobiert. Ich habe im Keller an der Heizung eine Zeitschaltuhr um die Wasserpumpe zu steuern. Die Uhr kann per UDP-Befehl gesteuert werden. Habe im ioBroker zwei Scripte. 1x Eingang on; 1x Eingang off Jedes Script für sich kann aus ioBroker die Uhr an- oder ausschalten. Wenn ich die ID im SEPIA Smart Home Hub in eine Karte eintrage, dann klappt das Schalten bei der ersten Einrichtung und anschließend nicht mehr, weil Sepia den alten Status nicht kennt.

Hats Du eine Idee, wie ich die grundsätzliche Kommunikation mit einer Standard-Funktion zwischen SEPIA und ioBroker testen kann?

Könnte es sein, dass der SEPIA Smart Home Hub zum ersten Ausführen einer Karte keinen Status erwartet und dann immer einen Status erwartet? Und das der ioBroker auch ohne den Status zu kennen erneut schalten würde? Könnte man im SEPIA Smart Home Hub die Abfrage eines Status unterbinden?

fquirin commented 2 years ago

Hats Du eine Idee, wie ich die grundsätzliche Kommunikation mit einer Standard-Funktion zwischen SEPIA und ioBroker testen kann?

Ein Blick in ~/SEPIA/sepia-assist-server/log.out könnte eventuell mehr Informationen bringen, vielleicht gibt es da eine Fehlermeldung die mehr aussagt.

Grundsätzlich sollten wir erstmal sicherstellen, dass der simple-api Adapter das richtige tut. Ich habe gerade meine alte ioBroker Instanz hochgefahren und kann z.B. über den Bosch Controller meine Hue Lampe abrufen mit folgender URL: https://192.168.178.6:8087/get/Hue%20white%20lamp%201.MultiLevelSwitch.level?user=admin&pass=iobroker (User + Passwort bitte anpassen).

Das entspricht der Device-ID: Hue white lamp 1.MultiLevelSwitch.level. Passwort und HTTPS könnten testweise im simple-API Adapter deaktiviert werden. Wenn dieser Aufruf nicht funktioniert kann auch SEPIA keinen Status auslesen.

Könnte es sein, dass der SEPIA Smart Home Hub zum ersten Ausführen einer Karte keinen Status erwartet und dann immer einen Status erwartet?

Eigentlich sollte SEPIA der aktuelle Status egal sein, allerdings merke ich gerade, dass "Cannot switch device state due to unknown old state: false" aus dem Control-HUB kommt, den Weg zum Server also gar nicht erst macht, weil "false" nicht zu einem der erwarteten states passt :thinking: . Kannst du mal sowas versuchen:

image

cap-blackbeard commented 2 years ago

http://192.168.0.50:8085/get/kodi.0.state ergibt folgende Antwort: {"val":"play","ack":true,"ts":1642251774595,"q":0,"from":"system.adapter.kodi.0","user":"system.user.admin","lc":1642253413318,"type":"state","common":{"name":"Status Play, stop, or pause","role":"media.state","type":"string","read":true,"write":false,"def":"stop"},"native":{},"_id":"kodi.0.state","acl":{"object":1636,"state":1636,"owner":"system.user.admin","ownerGroup":"system.group.administrator"}} Mit dem richtigen Port klappt das dann doch ;-)

Du meinst so? image

{ "result": "fail", "error": "could NOT set new state. Check server log for more info" }

log.out.txt

fquirin commented 2 years ago

Mit dem richtigen Port klappt das dann doch ;-)

:+1: . Hast du diese URL dann auch verwendet für die ioBroker Interface Konfiguration?

{ "result": "fail", "error": "could NOT set new state. Check server log for more info" } log.out.txt

Komisch ist, dass im Log keine Fehlermeldung steht, das bedeutet vermutlich, dass der Befehl abbricht, bevor er überhaupt im ioBroker Interface landet :thinking: , ... was auch Sinn macht, fällt mir gerade auf, denn das Feld Int. Device Id ist leer! Kannst du dort mal kodi.0 eintragen und dann die "Custom config:" so ändern:

{"number":"<val>", "enable":"play", "disable": "stop"}

cap-blackbeard commented 2 years ago

Die URL hatte ich in der Konfiguration. War mir nicht sicher ob mit http oder https. Ändert aber beides nichts am Resultat.

image

{ "result": "fail", "error": "could NOT set new state. Check server log for more info" }

log.out.txt

Alles unverändert :-/

fquirin commented 2 years ago

Also immerhin gibt es jetzt Fehler vom ioBroker Interface ^^:

ERROR - Smart Home HUB Interface - loadDeviceData - Failed to get device data: io_Broker kodi.0
ERROR - Smart Home HUB Interface - loadDeviceData - Failed to get device data: io_Broker kodi.0.pause
ERROR - IoBrokerConnector interface error in 'setDeviceState': {"code":-1,"error":"java.net.SocketException: Unexpected end of file from server","HTTP_REST_SUCCESS":false}
ERROR - IoBrokerConnector interface error in 'setDeviceState': {"code":-1,"error":"java.net.SocketException: Unexpected end of file from server","HTTP_REST_SUCCESS":false}

HTTPS ist auf jeden Fall falsch, weiter oben sind eine Reihe von SSL Errors. Wenn du später auf HTTPS umschalten willst, müsstest du wahrscheinlich auch das self-signed(?) ioBroker Zertifikat importieren (dafür gibt es ein paar Scripts), aber das ist erstmal eine andere Geschichte.

"java.net.SocketException: Unexpected end of file from server" ist etwas seltsam, das sagt mir gar nichts o_O. Klingt irgendwie als käme eine inkompatible Antwort von ioBroker (non-JSON), ich würde mich aber erstmal auf 'loadDeviceData' konzentrieren. Oben hast du http://192.168.0.50:8085/get/kodi.0.state verwendet, was zumindest einen "val" Eintrag hat. Kannst du das mal als Device-ID verwenden: kodi.0.state. Der Wert scheint nur lesbar zu sein ("write":false), wenn das Auslesen allerdings klappt müsste man als nächstes herausfinden welcher der ganzen Kodi Einträge überhaupt der richtige zum Schreiben ist.

Du könntest testweise auch mal statt dem Interface "iobroker_sapi" das Interface "test" benutzen, dort ein pseudo-Kodi Gerät erstellen und überprüfen ob states da korrekt gesetzt werden.

cap-blackbeard commented 2 years ago

Hmm... ich weiß ja nicht so recht. Mich wundert, dass die log-Einträge von 19:42 Uhr sind und ich gestern ca. zwischen 21:00 und 23:00 Uhr getestet und geschrieben habe.

Interface "test" bringt die selbe Meldung: { "result": "fail", "error": "could NOT set new state. Check server log for more info" } log.out.txt Was mir beim log jetzt auffällt, ist dass die Uhrzeit -1Sdt. gelogged wird. Mein Server zeigt aber die richtige Zeit.

kodi.0.state hatte ich schon probiert. Klappt auch nicht.

image So wie ich das sehe sind alle IDs mit dem Button im Wert "write":true { "type": "state", "common": { "name": "Controlling playback pause", "role": "button.pause", "type": "boolean", "read": false, "write": true, "def": false }, "native": {}, "from": "system.adapter.kodi.0", "user": "system.user.admin", "ts": 1642431375729, "_id": "kodi.0.pause", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" } } Das ist doch dann das, was wir "zum Schreiben" brauchen?

Ahh.. { "type": "state", "common": { "name": "Status Play, stop, or pause", "role": "media.state", "type": "string", "read": true, "write": false, "def": "stop" }, "native": {}, "from": "system.adapter.kodi.0", "user": "system.user.admin", "ts": 1642431375729, "_id": "kodi.0.state", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" } } Und die ID "kodi.0.state" ist "read":true

Also wenn die Kommunikation dann endlich mal laufen sollte, dann sollten folgende Einträge funktionieren: kodi.0.next (schreiben) kodi.0.pause (schreiben) kodi.0.play (schreiben) kodi.0.previous (schreiben) kodi.0.stop (schreiben) kodi.0.system.EjectOpticalDrive (schreiben) kodi.0.system.Hibernate (schreiben) kodi.0.system.Reboot (schreiben) kodi.0.system.Shutdown (schreiben) kodi.0.system.Suspend (schreiben) kodi.0.input.Back (schreiben) kodi.0.input.ContextMenu (schreiben) kodi.0.input.Down (schreiben) kodi.0.input.Home (schreiben) kodi.0.input.Info (schreiben) kodi.0.input.Left (schreiben) kodi.0.input.Right (schreiben) kodi.0.input.Select (schreiben) kodi.0.input.SendText (schreiben) kodi.0.input.ShowCodec (schreiben) kodi.0.input.ShowOSD (schreiben) kodi.0.input.Up (schreiben)

kodi.0.state (lesen)

fquirin commented 2 years ago

Was mir beim log jetzt auffällt, ist dass die Uhrzeit -1Sdt. gelogged wird. Mein Server zeigt aber die richtige Zeit.

Ja der Server läuft auf UTC Zeit aka GMT, das ist meistens -1h im Vergleich zu Deutschland. Alle Zeiten werden relativ dazu berechnet, weshalb Alarms etc. trotzdem die korrekte lokale Zeit haben.

Interface "test" bringt die selbe Meldung: { "result": "fail", "error": "could NOT set new state. Check server log for more info" }

Ach, ich hatte vergessen, dass man natürlich im Test-HUB (statt Internal HUB) erstmal ein Gerät erstellen müsste, dass die richtige ID hat (KODI?). Das ist etwas umständlich zumal der Test-HUB bei jedem Server-Restart zurückgesetzt wird. Naja viel Mehrwert hat das glaube ich eh nicht, weil der Fehler scheinbar beim Zugriff auf das ioBroker Interface kommt.

Dass der KODI Adapter so viele einzelne Objekte hat ist etwas problematisch, da SEPIA jeweils nur eine ID pro Gerät bedienen kann. Im dümmsten Fall hätte man dann "KODI Play", "KODI Stop", "KODI Next" ... jeweils als einzelne Geräte. ioBroker ist da irgendwie speziell :sweat_smile: . Wahrscheinlich könnte man in ioBroker selbst ein virtuelles Gerät erstellen, was die richtigen Befehle in einem einzigen Objekt vereint, damit kenne ich mich aber leider nicht aus ... was mich aber wieder auf die Idee bringt, dass ein Media-Player widget wahrscheinlich die bessere Lösung wäre für diesen Anwendungsfall. KODI ist ja auch nicht unpopulär, vielleicht fange ich damit mal an, nach dem nächsten SEPIA release :-).

So oder so bleibt aber die Frage warum "kodi.0.state" nicht korrekt gelesen wird und z.B. "kodi.0.play" müsste ja eigentlich auch geschrieben werden können. Ich weiß nicht genau welche "values" das "kodi.0.play" Objekt annimmt aber kannst du noch mal diese URLs im Browser testen:

Wenn das klappt dann mal aus dem Terminal direkt da wo der SEPIA Server läuft das gleiche via CURL:

Hat der simple-API Adapter vom ioBroker eigentlich ein Log, wo man sehen kann ob URL requests ankommen? :thinking:

cap-blackbeard commented 2 years ago

image Hab im simple-api Adapter die Authentifizierung abgeschaltet. Wie müsste user und password im SEPIA-Interface eingetragen werden? USER:PASSWORD wie in SEPIA wiki beschrieben hat ja nicht geklappt.

Aber jetzt habe ich n gaaanz anderes Problem! Was muss ich sagen, damit SEPIA den Film stoppt? 😅 "Music Player KODI play" startet den Film. Aber bei: "Music Player KODI pause" antwortet SEPIA: "Tut mir Leid. Aber das ist nicht möglich. Glaube ich." Die "Toggle"-Knöpfe in den Karten funktionieren aber beide.

N Media-Player Widget wäre wohl tatsächlich die beste Lösung. Grundsätzlich könnte man die komplette SEPIA-Radio Funktion durch KODI ersetzen. Habe alle öffentlichen TV- und Radiosender verfügbar. [https://github.com/jnk22/kodinerds-iptv] Man bräuchte die Option, die Medien durchsuchen zu können. Dann wäre es toll wenn man auch mehrere Installationen steuern könnte (kodi.0; kodi.1 ...). Habe zZt. zwei KODI-Player im Betrieb. 1x am TV/ Stereoanlage/ Radio und 1x als "tragbares" Radio für meine Kinder.

cap-blackbeard commented 2 years ago

Also, KODI Start und KODI Stop funktionieren tatsächlich per Sprachsteuerung. Aber KODI Pause klappt nur mit dem "Toggle"-Knopf. Per Sprachsteuerung sagt SEPIA, dass er nicht sicher ist, ob die Funktion ausgeführt wurde. Wo ist zwischen dem "Toggle"-Knopf und dem Sprachbefehl der Unterschied?

fquirin commented 2 years ago

Also, KODI Start und KODI Stop funktionieren tatsächlich per Sprachsteuerung

:+1:

Aber KODI Pause klappt nur mit dem "Toggle"-Knopf. Per Sprachsteuerung sagt SEPIA, dass er nicht sicher ist, ob die Funktion ausgeführt wurde. Wo ist zwischen dem "Toggle"-Knopf und dem Sprachbefehl der Unterschied?

Ok komisch, in der ioBroker Anzeige sieht es eigentlich so aus als wären die Buttons identisch :thinking: . Der Unterschied zwischen dem Toggle Button und dem Befehl "XY umschalten" sollte eigentlich nicht zu groß sein. Ich habe allerdings gerade noch mal den Code verglichen und es könnte sein das der Toggle-Button den State besser verarbeitet wenn der Type non-standard ist. Kurz gesagt wahrscheinlich berechnet der das "Gegenteil" besser anhand des aktuellen Status und allen Device Informationen inklusive custom config. Was passiert denn wenn du "XY an" und "XY aus" benutzt statt den toggle?

cap-blackbeard commented 2 years ago

Irgendwo muss es einen Unterschied zwischen dem Toggle-Button und dem Sprachbefehl geben. Ich habe zum Test 3 Geräte (Karten) angelegt. Alle nach dem selben Schema. Bei allen 3 Geräten funktioniert der Toggle-Button. Typ: Music Player Room: Living Room Int. Device id: [ioBroker ID] State type: Raw text Custom config: {"number":"","enable":"play","disable":"stop"}

  1. KODI Play
  2. KODI Stop
  3. KODI Pause

Ich: "Music Player KODI Play." SEPIA: "Ok. KODI Play im Wohnzimmer." Ich: "Music Player KODI Stop." SEPIA: "Ok. KODI Stop im Wohnzimmer."

Ich: "Music Player Pause." SEPIA: "Das ist nicht möglich glaube ich."

Was passiert denn wenn du "XY an" und "XY aus" benutzt statt den toggle?

Du meinst: "[Device name] an" oder "[Device name] aus" ? Ich: "KODI Stop an." SEPIA: "...das habe ich nicht verstanden." Ich: "KODI Pause an." SEPIA: "Ich bin mir nicht ganz sicher. Kannst Du das noch einmal anders formulieren." Ich: "KODI Pause aus." SEPIA: "Momentan lerne ich noch..." Ich schließe daraus, dass "[Device name] an" oder "[Device name] aus" SEPIA so nicht versteht. Sollte das klappen?

fquirin commented 2 years ago

Ich glaube es gibt 2 Problem hier. Das erste ist der Name der Geräte, der sich mit der "action" aus dem Befehl überschneidet. Z.B. "KODI Stop an" triggert höchstwahrscheinlich "stopp" und nicht "an" ^^. Ich würde als erstes mal die Geräte umbenennen, vielleicht in KODI A, KODI B, etc. oder via "index" in KODI 1, KODI 2. Das zweite Problem ist, dass "KODI" selbst als Befehl nicht reicht weil SEPIA nicht beliebig nach Smart-Home Geräten sucht ohne einen eindeutigen Hinweis darauf, dass es um Smart-Home geht. Das ist leider nötig um den ständigen cross-talk zwischen Services zu vermeiden, denn Gerätenamen sind zu allgemein. Das kann man auf verschiedene Weisen umgehen, z.B. via "music player KODI 1 einschalten".

Ich würde vielleicht mal versuchen via Teach-UI ein paar eindeutige Befehle zu definieren, wo du genau den Gerätenamen und die Aktion angibst. Dann kannst du auch eigene Sätze machen wie "KODI an" und KODI aus" und das jeweils umleiten auf die einzelnen KODI "buttons".

cap-blackbeard commented 2 years ago

Ich würde vielleicht mal versuchen via Teach-UI ein paar eindeutige Befehle zu definieren, wo du genau den Gerätenamen und die Aktion angibst. Dann kannst du auch eigene Sätze machen wie "KODI an" und KODI aus" und das jeweils umleiten auf die einzelnen KODI "buttons".

Ja würde ich tatsächlich gerne versuchen. Aber ich habe scheinbar schon wieder keine Verbindung vom SEPIA-Smart-Home zum ioBorker. Ich kann die URL vom simple-api-Adaper aufrufen. Ich hatte keine Veränderung an der SEPIA SMART-Home-Interface-Konfiguration. Und trotzdem rote Disketten Symbole bei den Smart-Home-Devices und der Toggle-Knopf gibt folgende Meldung: { "result": "fail", "error": "could NOT set new state. Check server log for more info" } Server log: 2022-02-01 20:08:53 ERROR - IoBrokerConnector interface error in 'setDeviceState': {"code":-1,"error":"java.net.NoRouteToHostException: No route to host (Host unreachable)","HTTP_REST_SUCCESS":false}

http://192.168.0.50:8087/get/kodi.0.state geht vom PC. http://192.168.0.50:8087/set/kodi.0.pause?val=1 lässt vom PC den Film pausieren.

curl -X GET 'http://192.168.0.50:8085/get/kodi.0.state' geht aus dem ioBroker Container, aber nicht aus dem SEPIA-Container. Müsste der Aufruf klappen, wenn ich per SSH lokal auf dem Server angemeldet bin? Geht nämlich nicht.

fquirin commented 2 years ago

curl -X GET 'http://192.168.0.50:8085/get/kodi.0.state' geht aus dem ioBroker Container, aber nicht aus dem SEPIA-Container. Müsste der Aufruf klappen, wenn ich per SSH lokal auf dem Server angemeldet bin? Geht nämlich nicht.

Ja, definitiv. Der SEPIA Container hat eigentlich keine extra Beschränkungen. Kannst du denn irgendwelche andern IPs erreichen aus dem Container oder github.io z.B.? ping4 github.io oder allgemein noch mal ping4 192.168.0.50?

http://192.168.0.50:8087/get/kodi.0.state geht vom PC. ... curl -X GET 'http://192.168.0.50:8085/get/kodi.0.state' ...

Mir fällt gerade auf dass das zwei unterschiedliche ports sind 8087 und 8085. Hast du 2 Instanzen vom simple-api Adapter laufen? Eine vielleicht mit SSL?

cap-blackbeard commented 2 years ago

http://192.168.0.50:8087/get/kodi.0.state geht vom PC. ... curl -X GET 'http://192.168.0.50:8085/get/kodi.0.state' ...

Mir fällt gerade auf dass das zwei unterschiedliche ports sind 8087 und 8085. Hast du 2 Instanzen vom simple-api Adapter laufen? Eine vielleicht mit SSL?

Nein. Sind zwei unterschiedliche Versuche. Ich habe in meiner Verzweiflung den simple-api-Adapter deinstalliert und neu installiert. Habe dann den Standardport 8087 gelassen und in dem SEPIA-Smart-Home-Interface auch auf 8087 angepasst.

Kannst du denn irgendwelche andern IPs erreichen aus dem Container oder github.io z.B.? ping4 github.io

Nein. Leider nicht. Der SEPIA-Container ist mit dem docker ingress-Network verbunden. Andere Container, die mit dem selben Network verbunden sind können github.io pingen. Nur der SEPIA-Container nicht.

fquirin commented 2 years ago

Nein. Leider nicht. Der SEPIA-Container ist mit dem docker ingress-Network verbunden. Andere Container, die mit dem selben Network verbunden sind können github.io pingen. Nur der SEPIA-Container nicht.

Hmm :thinking: , also der Container an sich hat wirklich keine Besonderheiten. Muss man vielleicht noch irgendwas in Docker konfigurieren, damit der eingebunden wird ins selbe Netz? Kannst du denn von außen den Container pingen?

cap-blackbeard commented 2 years ago

So. Funktioniert genau so, wie oben geschrieben. Ich kämpfe wohl an zu vielen Baustellen gleichzeitig. Habe dem Container einen anderen Netzwerktreiber zugeordnet.

Das SEPIA-Device heißt jetzt kodi_1 (play), kodi_2 (pause) & kodi_3 (stop) Habe mit der Teach-UI mehrere Befehle definiert für Musik Pause, Hörspiel Pause... Habe noch jeweils eine individuelle Antwort definiert.

Herzlichen Dank für die Geduld!

fquirin commented 2 years ago

Freut mich, dass es jetzt klappt. Ich werde dass mit KODI + media-player widget mal im Hinterkopf behalten ^^.

cap-blackbeard commented 2 years ago

Ich muss mein Thema nochmal öffnen.

Ich versuche auf dem selben Weg wie oben erarbeitet eine IP-Zeitschaltuhr zu schalten. In ioBroker habe ich je ein Script zum Einschalten und zum Ausschalten. Habe zwei Karten im Smart Home Hub eingerichtet, die über den Toggle-Knopf die Zeitschaltuhr schalten. Wenn ich am Client in dem TeachUI meine Befehle ausführen möchte antwortet SEPIA: "... ich habe keine passenden Geräte gefunden."

Ursprünglich hatte ich im Smart Home Hub die Karten "Zeitschltuhr_0" und "Zeitschaltuhr_1" benannt. Habe aber auch schon auf "100" und "200" umbenannt. Ohne Erfolg. Wo kann der Fehler sein?

Zur Info: Die KODI-Steuerung funktioniert auf dem selben Client über den selben Weg sehr gut! Hier hätte ich noch die Frage, wie ich die TeachUI-Befehle auf andere User übertragen kann?

fquirin commented 2 years ago

Wenn ich am Client in dem TeachUI meine Befehle ausführen möchte antwortet SEPIA: "... ich habe keine passenden Geräte gefunden."

Wie genau sieht der Teach-UI Befehl aus? Und welchen Gerätetypen haben deine Zeitschaltuhren? Wenn der Typ "device" ist und der Name "Zeitschltuhr_0" dann müsste der Befehl vermutlich so lauten "Schalte Gerät Zeitschaltuhr_1 auf an". Ich bin nicht sicher ob der Unterstrich hier Probleme macht (sollte glaube ich nicht), ansonsten vielleicht mal "Zeitschaltuhr (1)" und "Zeitschaltuhr (2)" benutzen und dann unten bei Index 1 und 2 eintragen. Dann sollte der Befehl "Gerät Zeitschaltuhr 1 auf an" klappen.

Hier hätte ich noch die Frage, wie ich die TeachUI-Befehle auf andere User übertragen kann?

Leider kann man die Befehle zur Zeit nur alle zusammen exportieren aber nicht für neue User importieren :see_no_evil: . Sollte ich wirklich mal nachholen (gerade auf der To-Do Liste gelandet ^^). Wenn du allerdings Befehle mit dem Assist-User (uid1005) definierst sind diese für alle User verfügbar.

cap-blackbeard commented 2 years ago

Die Geräte im Server sind so konfiguriert: image

Die Teach-UI Befehle sind so konfiguriert: image

"Gerät Zeitschaltuhr 1 auf an"

"... keine passenden Geräte gefunden." :-/

fquirin commented 2 years ago

Ich komme wahrscheinlich erst Heute Abend dazu es zu testen aber bis dahin versuch mal bei "Smart device" type "extracted" und dann <device>;;Zeitschaltuhr 1. Bei "Basement" in der Device Card noch die 1 und 0 weg, die sind der Index für den Raum, ich hatte vergessen dass der Device Index nur über (1) definiert wird im Namen. Vielleicht noch statt (0) und (1) mal (1) und (2) versuchen, ich weiß nicht genau ob 0 ein Problem ist.

cap-blackbeard commented 2 years ago

"Smart device" type "extracted"

hatte ich vorher schon definiert.

<device>;;Zeitschaltuhr 1

so klappt es. 0 ist dem System egal. Soll heißen, dass die 0 im Namen problemlos funktioniert.

fquirin commented 2 years ago

so klappt es. 0 ist dem System egal. Soll heißen, dass die 0 im Namen problemlos funktioniert.

ok cool, heißt es funktioniert jetzt? Oder gibt es noch ein anderes Problem?

Ich bin leider noch nicht zum Testen gekommen, aber ich glaube da ist auch noch ein Bug in der NLU für den Typen "device", denn irgendwie scheint der Satz "Gerät XY auf an" bei mir gerade nicht mehr das erwartete Ergebnis zu erzeugen.

cap-blackbeard commented 2 years ago

ok cool, heißt es funktioniert jetzt? Oder gibt es noch ein anderes Problem?

Ja und ja :-)

Soll heißen, ja, von web-Client funktioniert es. Ja, es gibt aber auch noch ein Problem. Der DIY-Client erzählt mir, dass er keine passenden Geräte gefunden hat. Die Teach-Befehle habe ich über den Assist-User (uid1005) erstellt. Somit sind die Befehle ja auf allen Clients gleich.

KODI kann ich sowohl vom web-Client als auch vom DIY-Client steuern.

Hast Du noch ne Idee? Ich da lokal auf dem DIY-Client etwas anders als in web-Client?

fquirin commented 2 years ago

Sorry, war paar Tage offline ^^.

Hast Du noch ne Idee? Ich da lokal auf dem DIY-Client etwas anders als in web-Client?

Die sind absolut identisch. Das einzige was mir gerade einfällt wäre, dass man darauf achten muss, dass der uid1005 beim speichern die richte Sprache ausgewählt hat, also dass man nicht aus versehen für Englisch speichert obwohl man Deutsch will. Das müsste aber eigentlich auffallen beim Testen.

Wie genau ist jetzt die Konfiguration? Also welche User ID auf welchem Client? Nur so als Hinweis, man sollte niemals Admin (uid1003) oder Assistant User (uid1005) im Alltag nutzen, außer wenn man Einstellungen ändert oder Teach-UI Befehle erstellt.

cap-blackbeard commented 2 years ago

Wie genau ist jetzt die Konfiguration? Also welche User ID auf welchem Client?

Ich habe mittlerweile alle Familienmitglieder als User angelegt und einen User angelegt, der familie@sepia.local heißt. Habe allen Usern die Privilegien: user, smarthomeguest, smarthomeadmin, developer gegeben. Ist tatsächlich egal, mit welchen User ich am web-Client angemeldet bin. Ist auch egal, von welchem Endgerät ich den web-Client benutze (Windows Edge Browser, iPhone 11 Safari). Die Steuerung der Zeitschaltuhr und KODI funktionieren immer. Wie oben schon geschrieben habe ich nur noch die Teach-Befehle im Einsatz, die ich über den User 1005 erstellt habe (sollten also für alle User überall gleich sein). Die Geräte im HUB habe ich alle mit dem User 1003 erstellt.

Nur der DIY-Client (Raspberry), egal mit welchem User, kann nur KODI steuern. Bei der Zeitschaltuhr sagt er, dass er keine passenden Geräte gefunden hat.

fquirin commented 2 years ago

Ok, das ist echt komisch irgendwie. Welcher User war jetzt auf dem DIY? Der "familie" Account? Kann es sein dass der vielleicht noch alte Überreste hat für den selben Text? Falls ja hätte das glaube ich höhere Priorität als der allgemeine uid1005 Befehl.

cap-blackbeard commented 2 years ago

Jap. Hatte die ganze Zeit den User: familie am DIY-Client angemeldet. Aber nö. Ich denke es sind keine Überreste da. Zumindest sehe ich nix in der Teach-UI-Manager-Liste. Wenn ich einen anderen User anmelde, kann ich die Zeitschaltuhr trotzdem nicht schalten.

fquirin commented 2 years ago

Also wenn der gleiche User im web client geht und im DIY nicht, kann es sein dass der Satz dann vielleicht falsch erkannt wird am DIY? Kannst du über die "client connections" Seite im Control-HUB mal prüfen welcher Satz da als Input ankommt? (du solltest die ASR Events sehen können wenn du verbunden bist via CLEXI remote terminal). Ich könnte mir vorstellen dass das Wort "Zeitschaltuhr" ggf. Probleme macht :-/.

cap-blackbeard commented 2 years ago

kann es sein dass der Satz dann vielleicht falsch erkannt wird am DIY?

Hmm... Also ich glaube fast nicht dass es an der Erkennung des Satzes liegt, da ich zum Testen des Teach-UI-Befehls den Button einblende und eben zum Testen nur den Knopf drücke. Zudem benutze ich im Befehl selbst nicht das Wort "Zeitschaltuhr" sondern einfach "Heizung". "Zeitschaltuhr 1" ist nur das Smart device. Das ist der aktuelle Teach-UI-Befehl um die Heizung (Zeitschltuhr) anzuschalten: image

Das wird im Control HUB der Client Connections im Remote Terminal ausgegeben, wenn ich den Ausführ-Button für den Befehl "Bitte schalte die Heizung an." drücke: Broadcaster event: {"broadcast":{"client":"o1_chrome_app_v0.24.2","deviceId":"o1","sepia-state":{"state":"idle"}}} Broadcaster event: {"broadcast":{"client":"o1_chrome_app_v0.24.2","deviceId":"o1","sepia-state":{"state":"speaking"}}} Broadcaster event: {"broadcast":{"client":"o1_chrome_app_v0.24.2","deviceId":"o1","sepia-speech":{"type":"tts_speak","msg":"Sorry Bro, aber ich habe keine passenden Geräte gefunden."}}} Broadcaster event: {"broadcast":{"client":"o1_chrome_app_v0.24.2","deviceId":"o1","sepia-state":{"state":"loading"}}}

fquirin commented 2 years ago

da ich zum Testen des Teach-UI-Befehls den Button einblende und eben zum Testen nur den Knopf drücke

Ja, dann kann man das ausschließen ^^.

Ich glaube im Teach-UI Befehl ist der Raum falsch. Versuch mal <basement>. Ich kann mir allerdings nicht erklären warum das nur beim DIY ein Problem wäre, ... es sei denn ... hast du für den DIY einen Raum in den Settings definiert? Rein spekulativ, aber es könnte sein, dass "Basement" nicht richtig erkannt wird im aktuellen Befehl und deshalb im DIY client der device-location Raum benutzt wird und im Web-Client alle Räume versucht werden (weil da keine device-location definiert ist?).

Im Control-HUB könntest du auch mal auf der "Assistant Testing" Seite prüfen, was eigentlich gesucht wird. Einfach den Satz oben eingeben und dann vielleicht mal den "understand" oder "answer" Button benutzen. Im Ergebnis müsstest du irgendwo die Parameter Werte sehen für Raum und Gerät.

cap-blackbeard commented 2 years ago

Versuch mal <basement>

Großes Lob!!! Funktioniert!!! Fehler gefunden. Tatsächlich habe ich im DIY den Raum definiert.

In der Tat war ich mir beim Erstellen des Smart-Home-Devices unsicher und habe mich dann für die Schreibweise aus dem Control HUB entschieden. image Wieder was gelernt!

By the way: Welche Schreibweise wäre im Teach-UI für das Kinderzimmer richtig? <child´s_room> oder <child´s room> oder <child´sroom>

fquirin commented 2 years ago

Großes Lob!!! Funktioniert!!! Fehler gefunden. Tatsächlich habe ich im DIY den Raum definiert.

:partying_face:

By the way: Welche Schreibweise wäre im Teach-UI für das Kinderzimmer richtig? <child´s_room> oder <child´s room> oder <child´sroom>

In dem Fall sogar <childsroom> :sweat_smile:

Es gibt ein tooltip wenn man mit der Maus über das room Feld hovered:

image

Wenn man im Teach-UI für den room Parameter type "Extracted" auswählt dann kommt da immer noch die Klammer drum "<...>". Das ist nicht bei allen Parametern so, aber die "Examples" geben einem das richtige Format vor.

Wenn man sich nicht sicher ist kann man auch den type "Raw" auswählen, dann ist es so als wenn man es im Chat schreibt also auf deutsch dann "Kinderzimmer". Dabei ist man allerdings darauf angewiesen, dass SEPIA es versteht ^^.

Theoretisch ist die effizienteste Methode Type "Processed". Intern läuft es so ab: raw input -> normalize -> extract -> build und das Ergebnis von "build" ist das was man bei "Processed" eingibt. Da hat man sogar noch die Möglichkeit leichte Anpassungen bei der Sprachausgabe zu machen (falls der Raum denn gesprochen wird in der Antwort).