Skill für MyCroft (API vs. MQTT)

Hallo zusammen.

Ich spiele gerade mit MyCroft (mycroft.ai) als open source Alexa Alternative rum. Ja, ist primär Spieltrieb aber ich will mal schauen ob es für mich „alltagstauglich“ wird.
MyCroft basiert auf Python und bietet Skills wie andere Smart-Assistants auch.

Jetzt eine grundsätzliche Frage an die (Modul) Profis.

Soll ich die Aufrufe von MyCroft (Python) eher per „klassischer“ Symcon API machen oder als Protokoll MQTT aufbauen um mit Symcon zu sprechen?

Danke & Gruß
Thorsten

Kommt drauf an.
Du willst sicherlich keine Daten schicken, wenn nicht danach gefragt wird, oder?

Also wenn du nur Daten mit Befehl abfragst, dann musst du dich nicht mit MQTT rumschlagen, wenn du es noch nicht benutzt hast und dich damit noch nicht auskennst.

Kannst du mal Beispiele posten?

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

Hallo Kai.

Danke für deine schnelle Antwort.
Primär ist die Flussrichtung natürlich immer von MyCroft zu Symcon. Allerdings könnte ich mir auch vorstellen MyCroft als TTS-Engine zu verwenden, so dass Symcon eine Verbindung zu MyCroft initiiert um einen Text als Sprache auszugeben.
Die Grundlagen von MQTT sind mir bekannt, aber ich hatte in der Praxis damit noch nicht viel zu tun.

Hier mal ein Beispiel vom MyCroft Skill für Home Assistant:
https://github.com/MycroftAI/mycroft-homeassistant/blob/20.02/init.py

Und hier vom FHEM Skill
fhem-skill/init.py at master · domcross/fhem-skill · GitHub

Gruß
Thorsten

Ich glaube ich würde es ohne MQTT probieren.

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

Alles klar.
Werde es mal angehen. Gibt es auf Symcon Seite ein „generisches“ Voice Assistant Gegenstück. Sozusagen, dass ich „nur“ die Python Seite in Mycroft implementieren muss oder nutzt jeder Assistent (Google Home oder Alexa) individuellen Code auf Symcon Seite? Die Funktionen müssten doch recht vergleichbar sein.

Ich habe mir das Home Assistant Skill von MyCroft kurz angeschaut, der versucht wohl per „fuzzy“ Logik im HA das Objekt anhand des Namens zu finden. Würde das für Symcon nicht auch Sinn machen, anstatt die Objekte individuell festzulegen die abgefragt/gesteuert werden können - zumindest habe ich es so verstanden?

Ist vielleicht eine blöde Frage, aber ich habe bisher kein Voice Assistant in Symcon eingebunden und bin daher auf „theoretischem Level“ unterwegs?

Gruß
Thorsten

Da die Alexa und Google Home Module ein ähnliches Konfigurationsformular benutzen, würde ich das Prinzip auch für MyCroft übernehmen wollen. Also ein Konfigurationsformular mit Kategorien wie „Licht (Schalter)“, „Licht (Dimmer)“, „Temperatursensor“, … .

Wie kann ich jetzt zum Beispiel abfragen welche Namen, Variablen für „Alexa“ konfiguriert werden, bzw. gerne auch eine Abfrage nach Objekten in einer bestimmten Kategorie - also bspw. Liste von Objekten der Gruppe „Temperatursensor“?

Mir reicht hier vielleicht ein „Buzzword“ in die richtige Richtung. Das ganze dann per Skript oder API abzufragen packe ich hoffentlich.

Danke & Gruß
Thorsten

Also im Alexa und Assistant Modul ist jede Liste eine eigene Eigenschaft, die du auslesen kannst. Dort ist dann der Name und weitere Parameter nach Typ pro Zeile konfiguriert.

Dabei habe ich für jeden Typen eine Unterdatei und einen Autoloader, der alle rein lädt. Anfragen aller Art gehen dann halt immer an alle Typen. Je nachdem was für eine Anfrage es ist (schalte Gerät mit dieser ID oder gib mir deinen Teil des Konfigurationsformular), antwortet dann halt nur einer sinnvoll oder ich füge die Antworten sinnvoll zusammen.

Insgesamt ist das ganze ein recht komplexes Konstrukt, schaue es dir aber gerne im Repo mal an.

Danke für deine Antwort.
Dann würde ich mich frech und „parasitär“ :smiley: einfach an das Original Alexa Modul hängen und in diesem Konfigurationsformular die Konfiguration vornehmen. Anschließend per Webhook ein Skript aufrufen um „ansprechbare Objekte“ pro DeviceType zu bekommen.

Das JSON was dann zurückkommt und die weitere Entscheidung (was auslesen, bzw. schalten) würde ich dann im MyCroft Skill parsen, bzw. aufarbeiten.

Vom Prinzip her ungefähr so:



// Webhook Skript um Properties abzufragen

/*

Licht (Schalter)    =>  DeviceLightSwitch
Licht (Dimmer)      =>  DeviceLightDimmer
Licht (Farbe)       =>  DeviceColorController
Schloss             =>  DeviceLock
Temperatursensor    =>  DeviceTemperatureSensor
Thermostat          =>  DeviceThermostat
Lautsprecher        =>  DeviceSpeaker
Lautsprecher (St.)  =>  DeviceSpeakerMuteable
Rolladen            =>  DeviceShutter
Gen. Schalter       =>  DeviceGenericSwitch
Gen. Slider         =>  DeviceGenericSlider

$deviceType wird per Webhook übergeben!

*/

$deviceType = $_GET['deviceType'];

$tmp1 = IPS_GetProperty(31659,"Device" . $deviceType);
print_r($tmp1);

?>

Würde dein Modul damit eine existierende Alexa-Instanz erfordern? Das klingt so, als wenn es im Widerspruch zu der Überlegung steht hier eine Alternative zu Alexa zu bieten. Wenn du meinst, dass du dich gerne ein bisschen am Code bedienen möchtest, das ist gar kein Problem. Möchtest du deine Form nicht so „zusammenbasteln“, sondern direkt in einer form.json oder so, dann kannst du ja auch einfach mal IPS_GetConfigurationForm auf eine Alexa-Instanz aufrufen.

Das hast du richtig verstanden :).
Ist ein valider Punkt - die MyCroft Anbindung würde dann ein Alexa Modul erfordern, was eigentlich irgendwie doof ist.

Um das „bekannte“ Konfigurationsformular nicht manuell nachbauen zu müssen, könnte ich tatsächlich IPS_GetConfigurationForm anschauen. Danke für den Tipp :).

Müsste ich bei einem eigenen Modul trotzdem einen Webhook aufbauen um einen externen Endpunkt zu haben, den ich von MyCroft aufrufen kann oder kann ich die DeviceItems aus dem Konfigurationsformular auch per Netzwerk außerhalb von IPS erreicht werden?

Gruß
Thorsten

Man kann natürlich auch per JSON-RPC darauf zugreifen, aber ich denke, dass der WebHook hier die schönere Variante ist. Sonst müsste die andere Seite deine Zugangsdaten kennen um die JSON-RPC zu verwenden. Das ist wahrscheinlich nicht im Sinne des ganzen.

Dann bleibe ich beim Webhook. Kann ich den aus dem Modul heraus anlegen oder muss ich das manuell zusätzlich nach der Modulinstallation machen? Habe in der Doku auf die Schnelle nix entsprechendes gefunden.

Nall-chan hat einen Webhook Helper: SymconModulHelper/WebhookHelper.php at master · Nall-chan/SymconModulHelper · GitHub
Der könnte dir helfen. :slight_smile:

Grüße,
Kai

Hallo Kai,
(und natürlich Michael).

Das hilft mir tatsächlich die Webhooks automatisch anzulegen - Danke :).

Gruß
Thorsten

Das mit dem Webhook funktioniert natürlich, aber ich frage mich, ob man die offizielle API nicht etwas „aufbohren“ könnte :smiley:
Erweiterung IP-Symcon API (JSON-RPC) um Token Authentifizierung möglich?

Gruß
Thorsten