見出し画像

暑くなってきたので、「AIしげちゃん」が扇風機の電源をON/OFFできるようにした

同じネタをずっと引きずってますが、暑くなってきたので、「AIしげちゃん」から扇風機の電源をON/OFFできるようにしました。

水冷のゲーミングPCを置いて、生成AIやらCGやらでブン回しているのに、僕の仕事部屋にはエアコンがないんです💦

あまりエアコンが好きではないので、自宅では未だエアコンをつけずに過ごしているエコ人間ですが、年々、夏の暑さがひどくなってきて、そろそろ人間もPCもヤバいよなあ...

コードは以下のような感じ。ChatGPT の Function Calling でスマートリモコン(Nature Remo)の Cloud API を呼び出して、扇風機の電源を赤外線でON/OFFしています。

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

using System.Net.Http;
using ChatdollKit.LLM;

namespace ChatdollKit.Kazz
{
    public class ElectricFanSkill : LLMFunctionSkillBase
    {
        public string FunctionName = @"set_electricfan";
        public string FunctionDescription = @"仕事部屋の扇風機の電源を入れたり切ったりします。扇風機の電源の状態は「on」または「off」で答えてください。";
        public string InstructionPrompt = @"以下は仕事部屋の扇風機の電源の状態です。あなた自身の言葉でユーザーに伝えてください。";

        private const string TOKEN_REMO
            = @"*************************************";

        public override ILLMTool GetToolSpec()
        {
            // Make function spec for ChatGPT Function Calling
            var func = new LLMTool(FunctionName, FunctionDescription);
            func.AddProperty("power_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 powerState = arguments["power_state"];
            string signals = string.Empty;
            string message = string.Empty;

            switch (powerState)
            {
                case "off":
                    signals = @"***********************************";
                    message = @"扇風機の電源を切りました。";
                    break;
                case "on":
                default:
                    signals = @"***********************************";
                    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}");
        }
    }
}

「AIしげちゃん」は、今のところ 以下のようなことができます。

  • WeatherSkill
    気象庁の気象情報APIを利用し、指定した地域の天気予報を答える。

  • SensorSkill
    環境センサー(Nature Remo)と連携し、温湿度の値や照度、不快指数を答える。

  • CeilingLightSkill
    スマートリモコン(Nature Remo)と連携し、部屋の照明を点けたり消したりする。

  • TapeLightSkill
    スマートリモコン(Nature Remo)と連携し、テープライトを点けたり消したりする。

  • ElectricFanSkill
    スマートリモコン(Nature Remo)と連携し、扇風機の電源を入れたり切ったりする。

まあ、ほとんどは スマートリモコンを制御して実現しているだけですが、生成AIが現実の世界に影響を及ぼすのが面白いです。


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