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 Likes

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 Like

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 Likes

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.

Bawię teraz do generowania komunikatów głosowych przez tts.cloud_say z użyciem ChatGPT. Ogarnąłem już komunikat gdzie dostaję na głośnik powiadomienie o pogodzie, temperaturze w pomieszczeniu oraz o aktualnych wydarzeniach z moich kalendarzy. Jednak zauważyłem, że przy dłuższej odpowiedzi jest ona w pewnym momencie ucinana. Nie ma pełnej odpowiedzi. Czy jest jakieś ograniczenie w długości przesyłanej odpowiedzi. Ominąłem to ale w sposób niezbyt elegancki. Teraz próbuję zrobić komunikat z ostrzeżeniem o burzach z Burze.dzis.net ale nie bardzo mi to wychodzi. Czy masz już zrobiony komunikat o ostrzeżeniach pogodowych?

Miałem zrobione powiadomienia pogodowe ale wpisałem tekst na sztywno. Mam je teraz wyłączone bo po komunikacie o burzy moje maluchy się bały :smiley:
Sprawdź czy odpowiedź będzie ucięta jak zrobisz to z poziomu czatu w HA zamiast przekierowywać to na głośniki. Tam robi różnicę ilość tokenów.

Do monitorowania burz używam integracji Blitzortung, z której korzysta również burze.dzis.net. Dane pochodzą bezpośrednio z tej integracji, a jedyną zmienną, jaką śledzę, jest odległość burzy od domu. W Node-RED stworzyłem automatyzację, która wysyła powiadomienia. Im bliżej burza, tym częściej otrzymuję alerty.

Mam coś takiego ale powiadomienia wysyłam tylko na zegarek :smiley: Żeby podjąć decyzję czy warto coś z prądu wyłączyć.

Ucinanie odpowiedzi było związane z ustawieniem maksymalnej liczby tokenów w konfiguracji OpenAI. Po zwiększeniu już nic nie ucina, jest pełna odpowiedź. Jednak podaje błędny dzień tygodnia. Data jest dokładna ale podaje różne dni tygodnia. Jak zapytałem dzisiaj we wtorek jaka będzie pogoda w czwartek to otrzymałem odpowiedź “W czwartek, 18 stycznia 2025 roku, prognoza pogody przewiduje słoneczną aurę. Temperatura wyniesie 1°C, a minimalna spadnie do -6°C. Wiatr będzie wiał z prędkością 5 km/h, a wilgotność powietrza wyniesie 80%. Nie przewiduje się opadów.”

Z tym jest faktycznie problem. Jak sie poprosi żeby jeszzcze rsz sprawdził to wtedy sie poprawia.
U mnie byl problem jak dodałem daty urodzin i pytałe. sie o kogoś ile ma lat. Za kazdym razem wyliczał rok mniej niz faktycznie :laughing: Do opisu dodaĺem jeszcze kilka uwag i zaczal prawidlowo wyliczać wiek.