iRemocon Wi-FiをWindowsから操作する簡単なサンプルアプリを作ってみました

前回、iRemocon Wi-FiをWindowsのコマンドプロンプトから操作する方法を書きました。

前回、WindowsからiRemocon Wi-FiのローカルIPを取得する方法を紹介しました。今回は、この取得した...

このように、iRemoconは、ローカルIPさえ分かってしまえば、telnetで簡単なコマンドを書くことで、結構たやすく操作することができます。

ただ、コマンドを覚えたり書いたりするのが面倒なので、もっと手軽にテストができる簡易サンプルプログラムを作ってみたので紹介です。

スポンサーリンク
レクタングル(大)広告

iRemocon Wi-Fi簡易操作アプリ

その、簡易サンプルプログラムがこちら。

iRemocon Wi-Fi簡易操作アプリ

[wpdm_file id=6]

開発者向け情報IRM-03WLAコマンド仕様書(PDF)にある操作コマンドを、ボタンで実行できるようにしてあります。

ボタンを押すことで、手軽にWindowsからiRemocon Wi-Fiのコマンド操作テストを行うことができます。

一応ソースも付いています。ただし作成は、Delphiというかなりマイナーな部類に入る言語で行いました。(それしかまともに使えないので)

しかも、Delphiといっても前時代の遺物Delphi7 IDEで作成しているので、今のIDEでは、そのままソース編集できないかもしれません。

一応、iRemoconオブジェクトを作成し、オブジェクトのiRemocon Wi-Fi操作メソッドで操作をしています。

以下に、Delphiで書いたiRemocon操作オブジェクトを載せておきます。(クリックで開く)

unit iRemocon;

interface

uses
  Windows, Messages, SysUtils, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdTelnet, ExtCtrls, Classes, Forms, DateUtils, dbg;

const
  //リピート時間定数
  RS_NONE   = 0;       //リピートなし
  RS_ONE_HOUR = 3600;  //一時間ごと
  RS_12_HOUR  = RS_ONE_HOUR * 12;
  RS_ONE_DAY   = RS_ONE_HOUR * 24; //一日ごと
  RS_ONE_WEEK  = RS_ONE_DAY * 7;   //一週間ごと

  UTC0900 = 32400;

type
  TSendEvent = procedure (Sender: TObject; Command: String) of object;
  TSentEvent = procedure (Sender: TObject; Response: String) of object;
  TCustomErrorEvent = procedure (Sender: TObject;
    ErrorCode, ErrorTitle, ErrorMessage: string) of object;

  //タイマーリスト取得用レコード
  TTimerRec = record
    No: Word;
    RemoconNo: Word;
    DateTime: TDateTime;
    RepeatSec: Cardinal;
  end;
  //タイマーリスト取得用動的配列
  TTimerArray = array of TTimerRec;

  TIRemocon = class(TComponent)
  private
    FHost: string;
    FIdTelnet: TIdTelnet;
    FInterval: Word;
    FIsLastCommandError: Boolean;
    FLastErrorCode: string;
    FLastErrorMessage: string;
    FLastErrorTitle: string;
    FLastReturnCommand: string;
    FLearningTimeout: Cardinal;
    FLogList: TStringList;
    FNecessaryCRLF: Boolean;
    FOnCustomError: TCustomErrorEvent;
    FOnSend: TSendEvent;
    FOnSent: TSentEvent;
    FPort: Integer;
    IsLearning: Boolean;
    IsReturnFinished: Boolean;
    TmpLastReturnCommand: string;
    procedure IdTelnetDataAvailable(Sender: TIdTelnet;
      const Buffer: String);
    procedure SetLearningTimeout(const Value: Cardinal);
    function SendCommand(Command: string): Boolean;
    function IsRemoconNoValid(RemoconNo: Word): Boolean;
    procedure SetErrors(const ReturnCommand: string);
    procedure SetInterval(const Value: Word);
    procedure SetOnSend(const Value: TSendEvent);
    procedure SetOnSent(const Value: TSentEvent);
    procedure SetHost(const Value: string);
    procedure SetOnCustomError(const Value: TCustomErrorEvent);
    procedure SetNecessaryCRLF(const Value: Boolean);
  protected

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    {IRM-01Lコマンド}
    function KeepAlive: Boolean;                         //[au]:接続確認用
    function TransmitInfrared(RemoconNo: Word): Boolean; //[is]:赤外線発光
    function StartLearning(RemoconNo: Word): Boolean;    //[ic]:リモコン学習開始
    function StopLearning: Boolean;                      //[cc]:リモコン学習中止
    function SetTimer(RemoconNo: Word;                  //[tm]:タイマーセット
      ADateTime: TDateTime; RepeatSec: Cardinal): Boolean;
    function GetTimers(var Timers: TTimerArray): Boolean; //[tl]:タイマー一覧取得
    function CancelTimer(TimerNo: Word): Boolean;          //[td]:タイマー解除
    function SetDateTime(ADateTime: TDateTime): Boolean;     //[ts]:現在時刻設定
    function GetDateTime(var ADateTime: TDateTime): Boolean; //[tg]:現在時刻取得
    function GetVersion(var Version:string): Boolean; //[vr]:ファームバージョン番号の取得
    function GetIlluminance(var Illuminance:Single): Boolean; //[li]:照度センサー値の取得
    function GetHumidity(var Humidity:Single): Boolean; //[hu]:湿度センサー値の取得
    function GetTemperature(var Temperature:Single): Boolean; //[te]:温度センサー値の取得
    function GetSensors(var Illuminance, Humidity, Temperature:Single): Boolean; //[se]:すべてのセンサー値の取得

    //iRemocon用接続先ポート番号(51013)
    property Port: Integer read FPort;
    //最新の返信コマンド
    property LastReturnCommand: string read FLastReturnCommand;
    //最新のエラーコード
    property LastErroreCode: string read FLastErrorCode;
    //最新のエラータイトル
    property LastErrorTitle: string read FLastErrorTitle;
    //最新のエラーメッセージ
    property LastErrorMessage: string read FLastErrorMessage;
    //最新の返信コマンドがエラーだったか
    property IsLastCommandError: Boolean read FIsLastCommandError;
    //コマンドログ
    property Log: TStringList read FLogList;
  published

    property Host: string read FHost write SetHost; 
    //連射防止用のインターバル Default 500ms
    property Interval: Word read FInterval write SetInterval default 500;
    //学習タイムアウト時間 Default 15秒(15000ms)
    property LearningTimeout: Cardinal
      read FLearningTimeout write SetLearningTimeout default 15000;
    //返信コマンドに#13#10を含めるか
    property NecessaryCRLF: Boolean
      read FNecessaryCRLF write SetNecessaryCRLF default False;
    //コマンド送信前イベント
    property OnSend: TSendEvent read FOnSend write SetOnSend;
    //コマンド送信後イベント
    property OnSent: TSentEvent read FOnSent write SetOnSent;
    //エラー出力用に作ったイベントの設定
  //書式の変更をするにはSetErrors手続きを変更してください
    property OnCustomError: TCustomErrorEvent
      read FOnCustomError write SetOnCustomError;
  end;

procedure Register;

implementation

uses Math;

procedure Register;
begin
  RegisterComponents('Samples', [TIRemocon]);
end;

{ TIRemocon }

constructor TIRemocon.Create(AOwner: TComponent);
begin
  inherited;
  FPort := 51013;
  FInterval := 500;
  FLearningTimeout := 15000;
  FNecessaryCRLF := False; 

  //Telnetの初期設定
  FIdTelnet := TIdTelnet.Create(AOwner);
  with FIdTelnet do begin
    Port := FPort;
    OnDataAvailable := IdTelnetDataAvailable;
  end;
  FLogList := TStringList.Create;
end;

destructor TIRemocon.Destroy;
begin   
  inherited;
  FIdTelnet.Free;
  FLogList.Free;
end;

procedure TIRemocon.IdTelnetDataAvailable(Sender: TIdTelnet;
  const Buffer: String);

  function IsCRLF2(s: string): Boolean;
  var i, n: Integer;
  begin
    n := 0;
    for i := 1 to Length(s)-1 do begin
      if (s[i] + s[i+1]) = #13#10 then begin
        Inc(n);
      end;
    end;
    Result := n = 2;
  end;

var crlfPos: Integer;
begin
  TmpLastReturnCommand := TmpLastReturnCommand + Buffer;

  crlfPos := Pos(#13#10, TmpLastReturnCommand);
  if crlfPos > 0 then begin
    //学習を中止した時用の処理
    //返信コマンド→cc;ok#13#10ic;err;002#13#10
    if Pos('cc;ok', TmpLastReturnCommand) > 0 then begin
      //2つめの#13#10が出た時点で取得終了するようにする
      if (Pos(#13#10, Copy(TmpLastReturnCommand,
        crlfPos+1, Length(TmpLastReturnCommand))) > 0) and
        IsCRLF2(TmpLastReturnCommand) then begin
        IsReturnFinished := True;
      end;
    end else begin
      //それ以外は最初の#13#10が出たときに取得終了
      IsReturnFinished := True;
    end;
  end;

end;

function TIRemocon.KeepAlive: Boolean;
begin
  Result := SendCommand('au');
end;

function TIRemocon.TransmitInfrared(RemoconNo: Word): Boolean;
begin
  Result := False;
  if IsRemoconNoValid(RemoconNo) then
    Result := SendCommand('is;' + IntToStr(RemoconNo));
end;

function TIRemocon.StartLearning(RemoconNo: Word): Boolean;
begin
  Result := False;
  if IsRemoconNoValid(RemoconNo) then begin
    Result := SendCommand('ic;' + IntToStr(RemoconNo));
    IsLearning := False;
  end;
end;

function TIRemocon.StopLearning: Boolean;
begin
  if IsLearning then begin
    Result := SendCommand('cc');
  end else begin
    raise Exception.Create('リモコンコード学習モード以外の状態に対して実行しました。');
  end;
end;

function TIRemocon.SetDateTime(ADateTime: TDateTime): Boolean;
begin
  Result := SendCommand('ts;' + IntToStr(DateTimeToUnix(ADateTime) - UTC0900));
end;

function TIRemocon.GetDateTime(var ADateTime: TDateTime): Boolean;
var s: string;
begin
  Result := SendCommand('tg');
  if Result then begin
    s := Trim(StringReplace(FLastReturnCommand, 'tg;ok;', '', []));
    ADateTime := UnixToDateTime(StrToIntDef(s, 0) + UTC0900);
  end else begin
    ADateTime := UnixToDateTime(UTC0900);
  end;
end;

function TIRemocon.SetTimer(RemoconNo: Word; ADateTime: TDateTime;
  RepeatSec: Cardinal): Boolean;
begin
  Result := False;
  if not ((RepeatSec = 0) or ((RepeatSec >= 60) and (RepeatSec <= 31536000))) then begin
    raise Exception.Create('繰り返し秒数は、0もしくは60~31536000にしてください。');
  end;
                   
  if IsRemoconNoValid(RemoconNo) then
    Result := SendCommand('tm;' + IntToStr(RemoconNo) + ';' +
      IntToStr(DateTimeToUnix(ADateTime) - UTC0900) + ';' + IntToStr(RepeatSec));
end;

function TIRemocon.GetTimers(var Timers: TTimerArray): Boolean;
  function NextValue(s: string): string;
  begin
    //;までを削除
    Result := StringReplace(s, Copy(s, 1, Pos(';', s)), '', []);
  end;
var s: string; n, i: Integer;
begin
  Result := SendCommand('tl'); {}
  if Result then begin
    //返信コマンド例 tl;ok;2;1;3;1334692382;0;2;6;1335642637;604800
    s := FLastReturnCommand + ';';
    s := StringReplace(s, 'tl;ok;', '', []); //tl;ok;1;を削除
    n := StrToIntDef(Copy(s, 1, Pos(';', s)-1), 0); //タイマー登録数を取得
    if n = 0 then Exit;
    SetLength(Timers, n);
    s := NextValue(s); //回数を削除
    for i := 0 to n-1 do begin
      Timers[i].No := StrToIntDef(Copy(s, 1, Pos(';', s)-1), -1); //タイマーNoを取得
      if Timers[i].No = -1 then Exit;
      s := NextValue(s); //タイマーNoを削除
      Timers[i].RemoconNo := StrToIntDef(Copy(s, 1, Pos(';', s)-1), -1); //リモコンNoを取得
      if Timers[i].RemoconNo = -1 then Exit;
      s := NextValue(s); //リモコンNoを削除
      Timers[i].DateTime := //予約時間を取得
        UnixToDateTime(StrToIntDef(Copy(s, 1, Pos(';', s)-1), -1) + UTC0900);
      s := NextValue(s); //予約時間を削除
      Timers[i].RepeatSec := StrToIntDef(Copy(s, 1, Pos(';', s)-1), -1); //繰り返し秒数を取得
      s := NextValue(s); //繰り返し秒数を削除
    end;
  end;
end;

function TIRemocon.CancelTimer(TimerNo: Word): Boolean;
begin      
  
  if (TimerNo >= 1) and (TimerNo <= 1500) then begin
    Result := SendCommand('td;' + IntToStr(TimerNo));
  end else begin
    raise Exception.Create('タイマー番号が1~500の範囲外です。');
    Result := False;
  end;
end;

function TIRemocon.GetVersion(var Version: string): Boolean;
begin
  Result := SendCommand('vr');
  if Result then
    Version := FLastReturnCommand
  else
    Version := '';
end;

function TIRemocon.SendCommand(Command: string): Boolean;
var i: Integer; s, cmd, sendcmd, lrc: string; startms: Cardinal;
begin
  //開始時間
  startms := GetTickCount;
  //メンバーの初期化
  FLastReturnCommand := '';   
  TmpLastReturnCommand := '';
  FLastErrorCode := '';
  FLastErrorMessage := '';
  FIsLastCommandError := False;
  IsReturnFinished := False;

  cmd := Copy(Command, 1, 2); //コマンド先頭2文字 ex. au, ic, cc
  //学習中はccコマンド以外受け付けない
  if IsLearning and (cmd <> 'cc') then begin
    raise Exception.Create('リモコン学習開始コマンドが終了していません。');
    Exit;
  end;
  //接続
  if not FIdTelnet.Connected then FIdTelnet.Connect;
  

  try
    if FIdTelnet.Connected then begin
      s := '*' + Command + #13#10;

      //コマンドの改行が必要か否か
      sendcmd := s;
      if not FNecessaryCRLF then
        sendcmd := Trim(sendcmd);

      //コマンド送信前イベント
      if Assigned(FOnSend) then
        FOnSend(Self, sendcmd);

      for i := 1 to Length(s) do
        FIdTelnet.SendCh(s[i]);

      FLogList.Add('*' + Command);
      if cmd = 'ic' then
        IsLearning := True;
    end;
  finally
    //コマンド応答が終わるまで待機
    while not IsReturnFinished do begin
      Application.ProcessMessages;
      Sleep(10);
      //学習タイムアウト時間を超えたら学習キャンセル
      if IsLearning and ((GetTickCount-startms) > FLearningTimeout) then begin
        StopLearning;
      end;
      //学習時以外は5秒でループを抜ける
      if not IsLearning and ((GetTickCount-startms) > 5000) then begin
        Break;
      end;
    end;
    lrc := TmpLastReturnCommand;
//    DOut(lrc);

    Result := not (Pos(cmd + ';err;', lrc) > 0); //コマンド成功か
    if Result then begin
      //文字列先頭から改行まで
      FLastReturnCommand := Copy(lrc, 1, Pos(#13#10, lrc)+1);
//      lrc := StringReplace(lrc, 'cc;ok'#13#10, '', []);
//      DOut(TmpLastReturnCommand);
//      DOut('1' + FLastReturnCommand);

      //コマンドの改行が必要か否か
      if not  FNecessaryCRLF then
        FLastReturnCommand := Trim(FLastReturnCommand);
      //コマンド送信後イベント
      if Assigned(FOnSent) then
        FOnSent(Self, FLastReturnCommand);
    end else begin
//      //文字列の送信コマンド先頭から文末まで
//      if Pos('cc;ok', lrc) > 0 then begin
//        lrc := StringReplace(lrc, 'cc;ok'#13#10, '', []);
//      end;
      FLastReturnCommand := Copy(lrc, Pos(cmd, lrc), Length(lrc));
      FIsLastCommandError := True;
      SetErrors(lrc);

//      DOut('2' + FLastReturnCommand);
    
      //コマンドの改行が必要か否か
      if not  FNecessaryCRLF then
        FLastReturnCommand := Trim(FLastReturnCommand);
        
      //コマンド送信後イベント
      if Assigned(FOnSent) then
        FOnSent(Self, FLastReturnCommand);
      
      if Assigned(FOnCustomError) then
        FOnCustomError(Self, FLastErrorCode, FLastErrorTitle, FLastErrorMessage);
    end;
    //コマンド送信後イベント
//    if Assigned(FOnSent) then begin
//      FOnSent(Self, FLastReturnCommand);
//    end;
                                              //オンタイマー、音声切り替え
    FLogList.Add(FLastReturnCommand);
    Sleep(FInterval); //連射防止のインターバル

    //切断
    if FIdTelnet.Connected then
      FIdTelnet.Disconnect;
  end;
end;

procedure TIRemocon.SetErrors(const ReturnCommand: string);
var s, errCode: string;
begin
  s := ReturnCommand;
  errCode := Copy(s, Pos(#13#10, s)-3, 3);

  if errCode = '010' then begin
    FLastErrorTitle := 'フォーマットエラー';
    FLastErrorMessage := 'コマンドの書式が不正です。';
    FLastErrorCode := 'XX' + errCode;
  end else if errCode = '020' then begin
    FLastErrorTitle := 'タイムアウトエラー';
    FLastErrorMessage := 'コマンド入力が5秒以上途切れました。';
    FLastErrorCode := 'XX' + errCode;   
  end else if errCode = '051' then begin
    FLastErrorTitle := '内部システムタイムアウトエラー';
    FLastErrorMessage := '内部のシステムタイムアウトエラー 。';
    FLastErrorCode := 'XX' + errCode;
  end else if errCode = '052' then begin
    FLastErrorTitle := '内部システム応答データなしエラー';
    FLastErrorMessage := '内部システムに応答するデータがありません。';
    FLastErrorCode := 'XX' + errCode;
  end else if errCode = '053' then begin
    FLastErrorTitle := '内部システム応答データ不正エラー';
    FLastErrorMessage := '内部システムの応答データが不正です。';
    FLastErrorCode := 'XX' + errCode;
  end else begin
    if Pos('is;', s) > 0 then begin
        FLastErrorTitle := '';
        FLastErrorMessage := '';
      FLastErrorCode := 'IS' + errCode;
      if errCode = '001' then begin
        FLastErrorTitle := 'リモコン番号範囲外';
        FLastErrorMessage := 'リモコン番号が1~1500の範囲外です。';
      end else if errCode = '002' then begin 
        FLastErrorTitle := 'リモコンデータ未登録エラー';
        FLastErrorMessage := 'リモコンデータが記録されていない番号が指定されました。';
      end else if errCode = '003' then begin
        FLastErrorTitle := '送信エラー ';
        FLastErrorMessage := '不正なデータを送信しようとしました。';
      end;
    end else if Pos('ic;', s) > 0 then begin
      FLastErrorCode := 'IC' + errCode;
      if errCode = '001' then begin
        FLastErrorTitle := 'リモコン番号範囲外';
        FLastErrorMessage := 'リモコン番号が1~1500の範囲外です。';
      end else if errCode = '002' then begin
        FLastErrorTitle := '学習キャンセル';
        FLastErrorMessage := 'リモコン学習はコマンドによってキャンセルされました。';
      end else if errCode = '003' then begin
        FLastErrorTitle := '受信エラー';
        FLastErrorMessage := '不正なリモコンデータを受信しました。';  
      end else if errCode = '004' then begin
        FLastErrorTitle := 'リモコンデータ件数エラー';
        FLastErrorMessage := '登録可能なリモコンデータの最大件数を超えて登録しようとしています。';
      end else if errCode = '005' then begin
        FLastErrorTitle := '二重操作エラー';
        FLastErrorMessage := '既にic/ibで受信待ちの状態です。';
      end;
    end else if Pos('cc;', s) > 0 then begin
      FLastErrorCode := 'CC' + errCode;
      if errCode = '001' then begin
        FLastErrorTitle := '実行エラー';
        FLastErrorMessage := 'リモコンコード学習モード以外の状態に対して実行しました。';
      end;
    end else if Pos('tm;', s) > 0 then begin
      FLastErrorCode := 'TM' + errCode;
      if errCode = '001' then begin
        FLastErrorTitle := 'リモコン番号範囲外';
        FLastErrorMessage := 'リモコン番号が1~1500の範囲外です。';
      end else if errCode = '002' then begin
        FLastErrorTitle := '実行時間範囲外エラー';
        FLastErrorMessage := '現在時刻+1~4102444800の範囲外です。';
      end else if errCode = '003' then begin
        FLastErrorTitle := '繰り返し時間範囲外エラー';
        FLastErrorMessage := '0~31536000以外の範囲が指定されました。';  
      end else if errCode = '004' then begin
        FLastErrorTitle := '2重登録エラー(同一時間あり)';
        FLastErrorMessage := '既に同一の時間にタイマー登録されています。';
      end else if errCode = '005' then begin
        FLastErrorTitle := '登録数オーバーエラー';
        FLastErrorMessage := '登録数オーバー(最大500件)です。';
      end else if errCode = '006' then begin
        FLastErrorTitle := 'リモコンデータエラー';
        FLastErrorMessage := 'リモコンデータが登録されていない番号が指定されました。';  
      end else if errCode = '007' then begin
        FLastErrorTitle := '曜日指定エラー';
        FLastErrorMessage := '曜日指定のフォーマットが不正です。';
      end;
    end else if Pos('tl;', s) > 0 then begin
      FLastErrorCode := 'TL' + errCode;
      if errCode = '001' then begin
        FLastErrorTitle := 'タイマー登録なし';
        FLastErrorMessage := 'タイマーが1件も登録されていません。';  
      end;
    end else if Pos('td;', s) > 0 then begin
      FLastErrorCode := 'TD' + errCode;
      if errCode = '001' then begin
        FLastErrorTitle := 'タイマー番号範囲外エラー';
        FLastErrorMessage := '1~500の範囲外です。';   
      end else if errCode = '002' then begin
        FLastErrorTitle := 'タイマー登録なし';
        FLastErrorMessage := '指定したタイマー番号のタイマーが存在しません。'; 
      end;
    end else if Pos('ts;', s) > 0 then begin
      FLastErrorCode := 'TS' + errCode;
      if errCode = '001' then begin
        FLastErrorTitle := '設定時間範囲外';
        FLastErrorMessage := '1293775200~4102444800の範囲外です。';
      end;
    end else if Pos('li;', s) > 0 then begin
      FLastErrorCode := 'LI' + errCode;
      if errCode = '001' then begin
        FLastErrorTitle := 'センサーの値が不正';
        FLastErrorMessage := 'センサーの値が不正です。';
      end;            
    end else if Pos('hu;', s) > 0 then begin
      FLastErrorCode := 'HU' + errCode;
      if errCode = '001' then begin
        FLastErrorTitle := 'センサーの値が不正';
        FLastErrorMessage := 'センサーの値が不正です。';
      end;
    end else if Pos('te;', s) > 0 then begin
      FLastErrorCode := 'TE' + errCode;
      if errCode = '001' then begin
        FLastErrorTitle := 'センサーの値が不正';
        FLastErrorMessage := 'センサーの値が不正です。';
      end;        
    end else if Pos('se;', s) > 0 then begin
      FLastErrorCode := 'SE' + errCode;
      if errCode = '001' then begin
        FLastErrorTitle := 'センサーの値が不正';
        FLastErrorMessage := 'センサーの値が不正です。';
      end;
    end;
  end;
end;

function TIRemocon.IsRemoconNoValid(RemoconNo: Word): Boolean;
begin
  if (RemoconNo >= 1) and (RemoconNo <= 1500) then
    Result := True
  else begin
    raise Exception.Create('リモコン番号が1 - 1500の範囲外です。');
    Result := False;
  end;
end;

procedure TIRemocon.SetLearningTimeout(const Value: Cardinal);
begin
  FLearningTimeout := Value;
  if Value < 3000 then begin
    FLearningTimeout := 3000;
    raise Exception.Create('3000ms(3秒)以上に設定してください。');
  end else if Value > (1000*60) then begin
    raise Exception.Create('60000ms(1分)以下に設定してください。');
    FLearningTimeout := 1000*60;
  end;
end;

procedure TIRemocon.SetInterval(const Value: Word);
begin
  FInterval := Value;
  if Value < 100 then begin
    FInterval := 100;
    raise Exception.Create('100ms(0.1秒)以上に設定してください。');
  end else if Value > 2000 then begin
    FInterval := 2000;
    raise Exception.Create('2000ms(2秒)以下に設定してください。');
  end;
end;

procedure TIRemocon.SetOnSend(const Value: TSendEvent);
begin
  FOnSend := Value;
end;

procedure TIRemocon.SetOnSent(const Value: TSentEvent);
begin
  FOnSent := Value;
end;

procedure TIRemocon.SetHost(const Value: string);
begin
  FHost := Value;
  FIdTelnet.Host := Value;
end;

procedure TIRemocon.SetOnCustomError(const Value: TCustomErrorEvent);
begin
  FOnCustomError := Value;
end;

procedure TIRemocon.SetNecessaryCRLF(const Value: Boolean);
begin
  FNecessaryCRLF := Value;
end;

function TIRemocon.GetIlluminance(var Illuminance:Single): Boolean;
begin
  Result := SendCommand('li');
  if Result then
    Illuminance := StrToFloatDef(StringReplace(FLastReturnCommand, 'li;ok;', '', []), -1)
  else
    Illuminance := -1;
end;

function TIRemocon.GetHumidity(var Humidity: Single): Boolean;
begin
  Result := SendCommand('hu');
  if Result then
    Humidity := StrToFloatDef(StringReplace(FLastReturnCommand, 'hu;ok;', '', []), -1)
  else
    Humidity := -1;
end;

function TIRemocon.GetTemperature(var Temperature: Single): Boolean;
begin
  Result := SendCommand('te');
  if Result then
    Temperature := StrToFloatDef(StringReplace(FLastReturnCommand, 'te;ok;', '', []), -1000)
  else
    Temperature := -1000;
end;

function TIRemocon.GetSensors(var Illuminance, Humidity,
  Temperature: Single): Boolean;
var s:String;
  sl:TStringList;
begin
  Result := SendCommand('se');
  if Result then begin
    sl := TStringList.Create;
    try
      s := StringReplace(FLastReturnCommand, 'se;ok;', '', []);  
      s := StringReplace(s, ';', ',', [rfReplaceAll]);
      sl.CommaText := s;
      Illuminance := StrToFloatDef(sl[0], -1);   
      Humidity    := StrToFloatDef(sl[1], -1);
      Temperature := StrToFloatDef(sl[2], -1000);
    finally
      sl.Free;
    end;
  end else begin
    Illuminance := -1;
    Humidity := -1;
    Temperature := -1000;
  end;

end;

end.

あと、当然ながらこのアプリを利用するには、iRemocon Wi-Fiが必要です。

アプリの使い方

Windowsから、アプリを利用するには、実行ファイルを起動して、以下の部分にiRemocon Wi-FiのローからIPアドレスを入力します。

IPを記入

WindowsでのIP取得方法は、以下を参照してください。

先日、iRemocon Wi-Fiを購入しました。 ただ基本的に、iRemocon Wi-Fiは、Android、iOS用のデバイ...

IPを入力したら、あとは、以下のコマンドボタンで操作をします。

コマンドボタン

個々のコマンドについては、以下に書いてあるコマンドの使い方を参照してください。

前回、WindowsからiRemocon Wi-FiのローカルIPを取得する方法を紹介しました。今回は、この取得した...

すると、こんな感じで、簡易的ではありますが、GUIからiRemocon Wi-Fiを操作出来るようになります。

iRemocon Wi-Fi操作サンプル

こんな感じで、コマンドと実行結果が表示されます。

これを応用すれば、iRemocon Wi-Fiを利用して、自分好みのリモコンアプリなどを作ることができます。

とりあえず、こういったものの機能を強化したものが以下の、Windows用、iRemoconリモコンアプリになります。

Kotoshiro

ルームリモコン Kotoshiro

こちらは、iRemocon Wi-Fiのセンサー機能はまだ取り込んでないですが、ローカルIPさえ取得できれば、iRemocon Wi-Fiを操作することができます。

まとめ

このように、iRemocon Wi-Fiはアプリからでも操作できます。

僕は、Windowsのデスクトップアプリ用の言語は、Delphiしかまともに書けないので、マイナーな言語で申しわけないのですが、何かの参考になれば幸いです。

そして、他人まかせで申し訳ないですけど、誰かがもっと良いアプリを作ってくれて、より快適な生活が送れれば最高です。

最近、PHPや、Rubyのような、軽量プログラミング言語に慣れてしまったら、手間がかかるし面倒くさいデスクトップアプリで、新たに何か作る気が起きない…。