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