Integracja z ChatGPT

Ostatnio trafiłem na to wideo https://www.youtube.com/watch?v=4D6bIDcVOWc
Bardziej z ciekawości ale mocno się w to wkręciłem. O co chodzi? Wcześniej miałem różne komunikaty wysyłane na głośniki ale były raczej statyczne (nie licząc komunikatu o zmywaniu gdzie podawało czas) więc po jakimś czasie zaczęło robić się nudno. Do momentu kiedy do generowania komunikatów użyłem ChatGPT.
Żeby sprawdzić co jest generowane wysyłałem dodatkowo pushe z treścią komunikatu.

Pierwsza automatyzacja była dla komunikatu o wyniesieniu śmieci kiedy laserowy czujnik wykrywał, że kosz jest pełny. Wcześniej był komunikat:

Kosz na śmieci jest pełny

lub jeśli zapełnienie było między 90-99%

Kosz na śmieci jest prawie pełny

Po zmianach, do ChatGPT jest wysyłany taki prompt:

service: conversation.process
metadata: {}
data:
  agent_id: conversation.openai_conversation
  text: |-
    Wyobraź sobie, że jesteś zaawansowanym inteligentnym domem. Domownik wchodzi
     do kuchni gdzie znajduje się kosz na śmieci. Kosz na śmieci jest już
     zapełniony i trzeba koniecznie wyrzucić śmieci. Powiadom o tym domownika
     jednym zdaniem.Zwracaj się do niego po imieniu. Domownik ma na imię
     Andrzej.  Bądź kreatywny, nie używaj emotek, nie proponuj nic w nagrodę.
     {% if states('counter.ilosc_powiadomien_o_wyrzuceniu_smieci') | int > 0 %}
       Jeśli uznasz, że za dużo razy domownik był powiadomiony o wyrzuceniu śmieci 
       i dalej ich nie wyrzucił, możesz go upomnieć bardziej stanowczo ale bez wulgaryzmów bo
       mogą to słyszeć dzieci. 
       Łącznie powiadomień o wyrzuceniu śmieci było: 
       {{states('counter.ilosc_powiadomien_o_wyrzuceniu_smieci')}}
       Możesz podać tą liczbę.
     {% endif %}  
response_variable: agent

Efekt taki jak poniżej:

Z czasem żeby było zabawniej dodałem sobie helpera gdzie przechowuje ile razy już danego dnia takie powiadomienie było powiedziane i w warunkach dla promptu jest też dodawany opcjonalny fragment, uwzględniający ilość na dany dzień.

Drugi przypadek to komunikat o rozpoczęciu zmywania (z wypowiedzeniem ile minut będzie to trwało):

service: conversation.process
metadata: {}
data:
  agent_id: conversation.openai_conversation
  text: >-
    Wyobraź sobie, że jesteś zaawansowanym inteligentnym domem. Domownik włącza
    zmywarkę,  której zmywanie zakończy się za
    {{((as_timestamp(states('sensor.zmywarka_dishwasher_completion_time')) - 
    as_timestamp(now()) | int ) / 60) | int  }} minut. Powiadom go o tym jednym
    zdaniem,. Bądź kreatywny, nie używaj emotek, nie proponuj nic w nagrodę.
response_variable: agent

na zakończenie zmywania:

service: conversation.process
metadata: {}
data:
  agent_id: conversation.openai_conversation
  text: >-
    Wyobraź sobie, że jesteś zaawansowanym inteligentnym domem. Domownik włączył
    wcześniej zmywarkę  i ona właśnie zakończyła zmywanie. Powiadom go o tym
    jednym zdaniem,. Bądź kreatywny, nie używaj emotek, nie proponuj nic w
    nagrodę.
response_variable: agent

Trzeci przypadek to powiadomienie o osuszaczu w kuchni, którego zbiornik z wodą się zapełnił

service: conversation.process
metadata: {}
data:
  agent_id: conversation.openai_conversation
  text: >-
    Wyobraź sobie, że jesteś zaawansowanym inteligentnym domem. W łazience
    znajduje się osuszacz powietrza, który jest już pełny wody i należy ją
    wylać. Osuszacz przez ten czas nie będzie pracował i w łazience będzie
    wilgotno. Nie ma zagrożenia żeby osuszacz przeciekał. Powiadom go o tym
    jednym zdaniem,. Bądź kreatywny, nie używaj emotek, nie proponuj nic w
    nagrodę.
response_variable: agent

Czwarty przypadek to komunikat o tym, że burza się zbliża - ten akurat jeszcze testuje i nie jest puszczony na głośnikach bo raz zrobiłem statyczny i dzieci się bały.

service: conversation.process
metadata: {}
data:
  agent_id: conversation.openai_conversation
  text: >-
    Wyobraź sobie, że jesteś zaawansowanym inteligentnym domem. Jedna z
    integracji zgłasza, że w pobliżu domu jest burza. Może to być pojedyncze
    wyładowanie i nic się nie stanie ale może też być ulewa i burza. Powiadom o
    tym domowników jednym zdaniem. Bądź kreatywny, nie używaj emotek, nie
    proponuj nic w nagrodę. Domownikami są dorośli i dzieci. Nie strasz dzieci.
response_variable: agent
enabled: true

Do odbierania danych z API trzeba je przekazać do zmiennej. W podanych przykładach wszędzie było response_variable: agent
Można dowolnie to nazwać byle później pamiętać, żeby użyć tej samej nazwy.
Później już jest tylko:

service: tts.cloud_say
data:
  entity_id: media_player.mopidy_http_server_on_mopidy_6680
  cache: false
  language: pl-PL
  message: "{{agent.response.speech.plain.speech}}"
  options:
    gender: male
enabled: true

W message zaczynamy od nazwy zmiennej czyli agent a reszta jak u mnie.

Model użyty w integracji to gpt-3.5-turbo
Doładowałem konto za 5$ i zużycie wygląda następująco:

Miłej zabawy :wink:

4 polubienia

A to nie jest tak, że płaci się stały abonament i do tego jest koszt dostepu do API?

Nie. Wcześniej było tak, że trzeba było podpiąć kartę i na podstawie miesięcznego zużycia samo ściągało odpowiednie środki - było to niebezpieczne bo nie było wiadomo ile finalnie będzie to kosztowało. Teraz doładowujesz sobie wybraną kwotą, robisz limity i tyle. Opcja bezpieczna bo samo nie ściąga środków.

Daj znać po miesiącu jak to wyszło cię kosztowo :wink:

No elegancko !!! Podłącze to pod swoje głośniki na ESP i zobaczymy jak to będzie działać :slight_smile: ale to pozwala już fajnie budować prawdziwy Smart Home.

Ciekawe czy zadziała z LLM → https://youtu.be/pAKqKTkx5X4?si=6LoLPfCBF7cA5ui5 bo tak mam u siebie darmowe chat-gpt rozwiązane :slight_smile:

1 polubienie

Obejrzałem ten materiał i przez Ciebie będę przez weekend to ogarniał żeby mieć działającego asystenta z dostępem do danych o czujnikach bo to ostatnia rzecz jakiej mi brakuje.

2 polubienia

Ogarnięte.

Działa w miarę sprawnie, steruje klimą, światłem.

Hej,
I co robiłeś tak samo jak na filmiku ? Napotkałeś jakieś problemy ?

Zrobiłem bezpośrednio do ChatGPT i na razie tyle wystarczy. Wlasny LLM poki co wymaga dedykowanego mocnego GPU żeby odpowiadał w sensownym czasie a nie po kilkunastu sekundach.