スマートリモコンと連携し、「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と同じように、声で照明のオン・オフができる。