ChatGPT für meine Benachrichtungen
In der vergangenen Woche habe ich in meinem Blog über das Thema ChatGPT für ioBroker gesprochen. Darin bin ich für mich selbst zum Entschluss gekommen, dass ein Adapter wohl nicht unbedingt die beste Wahl ist, um ein so komplexes System zu integrieren. Doch der Artikel und meine Überlegungen haben mich wahnsinnig inspiriert.
Ich überlege schon eine ganze Weile, wie ich ChatGPT in meinem Smart Home integrieren könnte. Und vor allem für sinnvolle Aufgaben integrieren könnte. Denn gerade das finde ich bei vielen Diskussionen noch sehr schwierig. Zwar ist die künstliche Intelligenz wahnsinnig spannend, doch auch sie sollte man nicht auf Biegen und Brechen irgendwo einbauen.
Zwar machen das aktuell viele Unternehmen, doch ob das so sinnvoll ist, wird sich noch zeigen. Ich habe für mein Smart Home jedenfalls eine Anwendung gefunden, die ich dir heute in diesem Artikel etwas näher beschreiben will. Vielleicht inspiriert dich mein Projekt auch zu etwas, das du dann in den Kommentaren gerne mit mir teilen kannst.
Hintergrundinformationen
Im Jahr 2021 habe ich mich an die Entwicklung einer eigenen kleinen Anwendung gemacht, die mir jeweils einen Zufallsspruch zurück liefert. Dazu übergebe ich an die Anwendung die Information, für welchen Space ich einen passenden Spruch brauche. Zurück kommt dann ein passender Spruch, den ich im Smart Home weiterverarbeiten kann.
Ausgelöst wird die Anfrage an die Anwendung dabei durch Änderungen im Smart Home. Zum Beispiel wenn die Wasch- oder Spülmaschine fertig sind. In einer Datenbank liegen dann viele verschiedene und passende Sprüche, wovon immer per Zufall einer ausgesucht wird. Dieser Spruch wird dann auf dem Amazon Echo und Telegram ausgegeben. So bin ich immer über die Neuigkeiten in meinem Zuhause informiert.
Anfang des Jahres habe ich dann damit begonnen, mit ChatGPT SQL-Dateien zu erstellen, die neue Sprüche beinhalteten. Diese habe ich dann in die Datenbank eingespielt und so wurde die Auswahl an passenden Sprüchen wiederum vergrößert. Das hat auch soweit gut funktioniert.
Jedoch ist auch das ein gewisser Zeitaufwand, den man reduzieren kann. Ich habe mich also in den vergangenen Wochen dazu entschlossen, die GPT-Schnittstelle (worauf ChatGPT basiert) direkt ins Smart Home zu integrieren. Somit kommen die neuen Sprüche jetzt direkt von GPT und nicht mehr aus meiner eigenen Datenbank.
Voraussetzungen
Die Voraussetzungen für dieses Projekt sind in Teilen sehr klar und in anderen eher weniger. Wenn du die gleiche Architektur erstellen willst wie ich, dann empfehle ich dir meine Anwendung für die Sprüche. Aber um GPT anzubinden brauchst du sie natürlich nicht. Keine Sorge.
Was hingegen absolut notwendig ist, sind eine funktionierende Installation von ioBroker sowie Zugang zur GPT-Schnittstelle. Auch wenn du bisher ChatGPT nutzt und womöglich auch monatlich dafür bezahlst, ist die Schnittstelle nochmal etwas völlig anderes.
Das bedeutet im Klartext, dass du für die Pro-Version von ChatGPT im Monat 20 Dollar bezahlen kannst, aber dennoch keinen Zugang zur API hast. Dieser Zugang ist separat davon und wird auch entsprechend getrennt abgerechnet. Du brauchst diesen Zugang jedoch, um deinen individuellen API-Key zu erstellen. Diesen brauchst du wiederum, damit ioBroker auf GPT zugreifen kann.
Nicht zu vergessen ist natürlich auch, dass du einen funktionierenden ioBroker brauchst, wie ich bereits gerade erwähnt habe. Alternativ kannst du natürlich auch ein anderes System dafür verwenden, zum Beispiel Home Assistant oder OpenHAB.
Der Aufbau meines Projekts
Da ich jedoch auch weiß, dass die Internetverbindung mal ausfallen kann, wollte ich an dieser Stelle Abhilfe schaffen. Zwar kann ohne Internetverbindung auch keine Nachricht nach außen gelangen, aber das ist für mich kein Grund nicht an eine solche Optimierung zu denken.
Ich habe also das Ausgangsskript genommen und etwas umgebaut. Genauer gesagt habe ich daraus einen JavaScript-Block erstellt, auf den ich bei Bedarf zurückgreifen kann. An diesen Block übergebe ich einmal den Space für meine eigene Anwendung und zeitgleich auch einen Satz, auf dessen Basis GPT mir ein Ergebnis liefern soll.
Jetzt beginnt der ganze Spaß in einer sequenziellen Abfolge. Zuerst wird GPT nach einem passenden Spruch gefragt. Sollte diese Anfrage nicht erfolgreich sein, so greift der Block automatisch auf meine eigene Spruchdatenbank zurück. Ist auch dieser Aufruf nicht erfolgreich, wird als Ergebnis die Eingabe zurückgegeben, die für GPT gedacht war.
Somit kommt in jedem Fall eine Antwort von meinem Skript zurück und ich muss mir keine Sorgen darum machen, dass etwas grundsätzlich komplett schiefläuft. Da meine Anwendung nun seit zwei Jahren kontinuierlich einen Spruch liefert, ist in meinen Augen GPT eher eine potenzielle Schwachstelle und steht mitunter deshalb direkt an der Spitze.
Mein komplettes Skript hänge ich dir übrigens an das Ende meines Artikels.
Einschränkungen bei GPT
Nun gehört bei meinem Projekt allerdings auch dazu, dass es gewisse Einschränkungen im Umgang mit GPT gibt. Wobei ich jetzt unter Einschränkungen auch Dinge zähle, die den einen oder anderen abschrecken könnten.
Der größte Schreckfaktor dabei ist möglicherweise, dass es Geld kostet. Für die Nutzung der GPT-Schnittstelle muss für sogenannte Tokens bezahlt werden. Ich habe mich dazu entschieden, dass ich auf mein OpenAI-Account 20 Euro auflade und nicht automatisch erneut aufladen lasse. Somit kann es für mich im schlimmsten Fall passieren, dass das Guthaben aufgebraucht ist und die GPT-Schnittstelle mir keine Antwort mehr zur Verfügung stellt.
Eine weitere Einschränkung ist die Zeit, welche für eine Antwort gebraucht wird. Bis die Antwort von GPT kommt, können gut auch mal 10 Sekunden vergehen. Dennoch muss man natürlich diese Zeit abwarten, denn andernfalls wäre die Integration von vornherein völlig unsinnig. Ich würde jedoch behaupten, dass es für viele Anwendungen im Smart Home (z. B. Wasch- oder Spülmaschine) kein Problem darstellt.
Mein Waschmaschinenskript wartet am Ende sowieso 3 Minuten, ob sich nochmal eine Änderung ergibt. Erst wenn sich in diesem Zeitraum keine Änderung mehr ergibt, wird der Zustand der Maschine auf fertig gesetzt. Ob ich da noch 10 weitere Sekunden warten muss, stört mich persönlich nicht. Dennoch sollte man den zeitlichen Faktor nicht ausgrenzen. Es kommt eben ganz stark auf den Bereich an, wo man das einsetzen möchte.
Potenzielle Weiterentwicklung
Natürlich wäre es auch etwas naiv von mir zu glauben, dass das ganze Konstrukt in dieser Form fertig ist. Denn es gibt noch mindestens eine weitere Idee, die man umsetzen könnte.
Bei jeder Abfrage an GPT entsteht (im besten Fall) ein völlig neuer Spruch, den es in dieser Form so in der Datenbank noch nicht gibt. Da dieser schon durch das Smart Home verarbeitet und ausgegeben wird, könnte man ihn auf den Stapel der vorhandenen Sprüche legen.
Das soll im Klartext heißen, dass jeder Spruch nach der Rückgabe durch GPT automatisch in der Datenbank korrekt abgelegt wird. Dadurch würde sich meine eigene Datenbank völlig von allein erweitern, ohne dass ich aktiv etwas dafür tun müsste. Jeder Waschgang (in meinem Fall) würde demnach für neue Vielfalt im Smart Home sorgen. Damit könnte jeder Mensch auf diesem Planeten (sofern er meine Waschmaschine bedienen kann) meine Datenbank durch die einfache Nutzung der Waschmaschine erweitern.
Klingt nun natürlich etwas paradox, aber in diesem Fall wäre das tatsächlich so. Es wäre damit auch gar nicht so falsch zu behaupten, dass das Smart Home mit jeder Nutzung ein Stück besser werden würde. Mein Ansatz an dieser Stelle wäre, die Anwendung zu erweitern, die sich um die Sprüche kümmert. Sie könnte auch direkt abgleichen, ob es diesen Spruch bereits gibt und ihn gegebenenfalls einfach verwerfen. Oder eben verbessern.
Meine bisherigen Kosten
Obwohl ich bislang noch gar nicht so viel Expertise im Bereich der Kosten habe, möchte ich trotzdem noch auf diesen Punkt eingehen an dieser Stelle. Denn ich halte ihn für äußerst wichtig, gerade wenn es sich um ein „Ich probiere das einfach mal aus“-Projekt handelt. So wie bei mir eben.
Insgesamt habe ich bislang an GPT 38 Anfragen gestellt. Im Durchschnitt habe ich dabei pro Request zwischen 60 und 200 Token verbraucht. Was in meinen Augen wesentlich mehr ist, als ich mir vorher gedacht habe. Aber nun gut. Was man eben nicht alles für das Smart Home tut.
Trotz der demnach hohen Anzahl an Token, sind meine Kosten bislang nicht nennenswert. Natürlich habe ich 20 Euro Guthaben aufgeladen und die sind jetzt erstmal weg. Aber verbraucht wurden laut OpenAI bisher etwa nur 0,01 $. Und ja, es sind wirklich Dollar.
Das ist nämlich auch noch ein Aspekt, der berücksichtigt werden muss. Denn auf die Zahlung kommen dann noch die Wechselgebühren oben drauf, die vom jeweiligen Geldinstitut erhoben werden. Alles zusammen lag ich bei etwa 23 – 24 Euro, die ich bisher in das Projekt investiert habe. Also noch sehr überschaubar.
Da OpenAI jedoch auch weiß, dass Geld wichtig ist, gibt es sogenannte Limits. Die kannst du in deinem OpenAI-Account einstellen, so dass du dir keine großen Sorgen um dein Budget machen musst. Ausprobiert habe ich das noch nicht, da ich ja die automatische Aufladung deaktiviert habe.
Der vollständige JS-Code
const axios = require('axios');
async function sendData(state, prompt) {
try {
const config = {
method: 'post',
url: 'https://api.openai.com/v1/chat/completions',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer DEIN_TOKEN'
},
data: {
model: 'gpt-3.5-turbo',
messages: [{
role: 'user',
content: `Liefere einen kurzen lustigen Satz zu: "${prompt}"`
}]
}
};
const response = await axios(config);
if (response && response.data && response.data.choices && response.data.choices.length > 0 && response.data.choices[0].message && response.data.choices[0].message.content) {
return response.data.choices[0].message.content;
} else {
return getData(state, prompt);
}
} catch (error) {
return getData(state, prompt);
}
}
async function getData(state, prompt) {
try {
const config2 = {
method: 'get',
url: 'http://IP_DER_SPRUCHANWENDUNG/api/text?space=' + state,
headers: {
'Content-Type': 'application/json'
}
};
const res = await axios(config2);
if (res && res.data && res.data.text) {
return res.data.text;
} else {
return prompt;
}
} catch (error) {
return prompt;
}
}
return await sendData(state, satz);
0 Kommentare