見出し画像

スマートリモコンと連携し、「AIしげちゃん」で部屋の照明などを制御する

プログラムの動作イメージ

前回に引き続き破損前の「AIしげちゃん」に実装していた、スマートリモコン(Nature Remo)と連携し、部屋の照明や家電製品を制御するスキルを復活中。

前回の環境センサーの値を取得するスキルとほとんど同じだけど、GPTのFunction CallingでNature Remo Cloud APIを叩く関数を呼び出して、赤外線リモコンの信号毎に割り振られたシグナルIDをPOST。

[CeilingLightSkill.cs]

using System.Collections.Generic;
using System.Threading;
using UnityEngine;
using Cysharp.Threading.Tasks;
using Newtonsoft.Json;
using ChatdollKit.Dialog;
using ChatdollKit.Dialog.Processor;

using System;
using System.Net.Http;
using UnityEditor.VersionControl;
using ChatdollKit.Network;
using static UnityEditorInternal.VersionControl.ListControl;
using System.Text;
using Newtonsoft.Json.Linq;

namespace ChatdollKit.Kazz
{
    public class CeilingLightSkill : ChatGPTFunctionSkillBase
    {
        public string FunctionName = @"set_ceilinglight";
        public string FunctionDescription = @"仕事部屋の照明を点けたり消したりします。照明の状態は「on」または「off」で答えてください。";
        public string InstructionPrompt = @"以下は仕事部屋の照明の状態です。あなた自身の言葉でユーザーに伝えてください。";
        private const string TOKEN_REMO
            = @"Nature Remo Cloud APIのアクセストークン";

        public override ChatGPTFunction GetFunctionSpec()
        {
            // Make function spec for ChatGPT Function Calling
            var func = new ChatGPTFunction(FunctionName, FunctionDescription);
            func.AddProperty("light_state", new Dictionary<string, object>() { { "type", "string" } });
            return func;
        }

        protected override async UniTask<FunctionResponse> ExecuteFunction(
            string argumentsJsonString, Request request, State state, User user, CancellationToken token)
        {
            // Parse arguments
            var arguments = JsonConvert.DeserializeObject<Dictionary<string, string>>(argumentsJsonString);
            var lightState = arguments["light_state"];
            string signals = string.Empty;
            string message = string.Empty;

            switch (lightState)
            {
                case "off":
                    signals = @"照明を消す時のSignal ID";
                    message = @"照明を消しました。";
                    break;
                case "on":
                default:
                    signals = @"照明を点ける時のSignal ID";
                    message = @"照明を点けました。";
                    break;
            }

            try
            {
                string url = "https://api.nature.global/1/signals/" + signals + "/send";
                var httpClient = new HttpClient();
                var httpRequest = new HttpRequestMessage(HttpMethod.Post, url);
                httpRequest.Headers.Add("accept", "application/json");
                httpRequest.Headers.Add("Authorization", "Bearer " + TOKEN_REMO);
                var deviceResponse = await httpClient.SendAsync(httpRequest);
            }
            catch
            {
                message = @"照明の制御ができませんでした。";
            }

            return new FunctionResponse(
                InstructionPrompt + $"\n\n{message}");
        }
    }
}

取り合えず、今回は照明だけだけど、これで、Google Nest スマートスピーカーやAlexaと同じように、声で照明のオン・オフができる。


この記事が気に入ったらサポートをしてみませんか?