<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title><![CDATA[ 2023年の投稿(時系列順)［3件］ - でんげき☆ Network Service ]]></title>
	<link>https://room.dengeki.jp/tegalog.cgi</link>
	<description><![CDATA[ Raspberry Pi 4 で運用実験中 ]]></description>
	<language>ja</language>
	<copyright>Copyright 2025</copyright>
	<lastBuildDate>Thu, 05 Jun 2025 14:05:45 +0900</lastBuildDate>
	<generator><![CDATA[ <!-- てがろぐ Version: -->Powered by <a href="https://www.nishishi.com/cgi/tegalog/" rel="noreferrer" target="_top">てがろぐ</a> Ver 4.4.5 ]]></generator>
	<!-- BEGIN ENTRIES -->
	<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ IPv6 での接続について ]]></title>
	<description><![CDATA[ IPv6 での接続について<br /><img class="embeddedimage " width="500" height="500" src="https://room.dengeki.jp/images/2023032509192510-admin.png" alt="2023032509192510-admin.png"><br />　<br />2023年2月18日(土)に行った屋内電源及びネットワーク回線の工事の際に Firewall の設定を間違えてて WAN 側から IPv6 でのアクセスができない状態になってました<br />LAN 内では問題なくアクセスできたので設定ミスに気付くまで時間がかかってしまいました(汗　まぁ環境にもよるんだろうけど…意外と WAN 側からの諸々のテストは疎かになりがちなんで自戒メモ<br /><br /><img class="embeddedimage " width="1080" height="1440" src="https://room.dengeki.jp/images/20230325091925-admin.png" alt="20230325091925-admin.png"> <img class="embeddedimage " width="1080" height="1440" src="https://room.dengeki.jp/images/202303250919251-admin.png" alt="202303250919251-admin.png"><br />そんな IPv6 での接続をざっくり判定して表示しています　まぁ時既に世の多くが IPv6 での接続をサポートしてるっぽいんであ んまり意味ないかもだけど(滝汗<br /><br />　　：<br /><br />ちなみにスマホちゃんの SIM でのデータ通信だと IPv4 と IPv6 を選択できるようです<br /><br />---- Android の場合の設定例 ----<br /><img class="embeddedimage " width="1080" height="1440" src="https://room.dengeki.jp/images/202303250919259-admin.png" alt="202303250919259-admin.png"><br />「設定」画面から「ネットワークとインターネット」を選ぶ<br /><br /><img class="embeddedimage " width="1080" height="1440" src="https://room.dengeki.jp/images/202303250919258-admin.png" alt="202303250919258-admin.png"><br />「ネットワークとインターネット」画面から「SIM」を選ぶ<br /><br /><img class="embeddedimage " width="1080" height="1440" src="https://room.dengeki.jp/images/202303250919257-admin.png" alt="202303250919257-admin.png"><br />「SIM」画面から「対象のSIM」を選ぶ　※ここでは NTT DOCOMO を選択<br /><br /><img class="embeddedimage " width="1080" height="1920" src="https://room.dengeki.jp/images/202303250919256-admin.png" alt="202303250919256-admin.png"><br />先ほど選択した「NTT DOCOMO」画面から「アクセスポイント名」を選ぶ<br /><br /><img class="embeddedimage " width="1080" height="1440" src="https://room.dengeki.jp/images/202303250919255-admin.png" alt="202303250919255-admin.png"><br />「APN」画面から「現在使用中のAPN」を選ぶ　※ここでは DMM mobile を選択<br /><br /><img class="embeddedimage " width="1080" height="1440" src="https://room.dengeki.jp/images/202303250919254-admin.png" alt="202303250919254-admin.png"><br />「アクセスポイントの編集」画面で「APNプロトコル」を選ぶ<br /><br /><img class="embeddedimage " width="1080" height="1440" src="https://room.dengeki.jp/images/202303250919253-admin.png" alt="202303250919253-admin.png"><br />「APNプロトコル」ダイアログが出るので IPv4 か IPv6 を選択する<br /><br /><img class="embeddedimage " width="1080" height="1080" src="https://room.dengeki.jp/images/202303250919252-admin.png" alt="202303250919252-admin.png"><br />右上の「︙」メニュー内の「保存」を選ぶ<br /><br />--------<br /><br />ご使用の OS のバージョンや SIM によって設定できたりできなかったりするらしいので…設定できたらラッキー☆って感じですかね　つーかそもそも IPv6 の判定のやりかた自体が間違ってる可能性もアレですが(-_-；) <a href="https://room.dengeki.jp/tegalog.cgi?tag=%41%6e%64%72%6f%69%64" class="taglink" title="Android">#Android</a> -- Posted by 猫山ぽるか 〔784文字〕 No.36 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=36</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=36</guid>
	<category>memo</category>
	<pubDate>Sat, 25 Mar 2023 08:14:13 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ (M5) ATOM Lite でまぁまぁスマートなリモコンを… ]]></title>
	<description><![CDATA[ (M5) ATOM Lite でまぁまぁスマートなリモコンを作ろう<br /><img class="embeddedimage nolisted" width="400" height="400" src="https://room.dengeki.jp/images/202307171653523-admin.png" alt="202307171653523-admin.png"><br />　<br />今年の初めに…かれこれ 18 年くらい住んでたボロアパートをぶっ壊すってんで追い出されて今度は高級マンションの最上階に引っ越してきました！(&gt;_&lt;)ｗ　そんな高級マンションには…ご入居前リフォームで 2022 年製のエアコンに交換されていたのはいいんだけどちょっと使いづらいんですよね<br />何が使いづらいかっていうと…リモコンでのタイマーセットが不便なんですよ　以前のボロアパートで使ってたエアコンはリモコンに RTC(時計) が実装されていたのでタイマーセットも絶対時間で行うことができていたんですよ　それがご新居のエアコンのリモコンには RTC(時計) が付いてないもんだでタイマーセットしようとすると「7時間後」って感じの相対時間での設定になるんですよ　不便ですよね(-_-；)<br />そんな訳なんでもちっとタイマーセットしやすいリモコンをどうにかするっていうか…せっかくなんでスマホちゃん等と連動させて絶対時間でエアコンの On/Off を制御できるリモコンを作ってみることにしました<br /><br />昨年に「安いじゃん！」って思って買っておいた (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/6262" rel="noopener noreferrer" target="_blank">ATOM Lite</a> が手元にあるんでそれを使うことにしました　今買うなら (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/8778" rel="noopener noreferrer" target="_blank">ATOMS3 Lite</a> &nbsp;のほうがいいのかも知れないけど未確認です汗<br />それと CGI っていうか Perl が使える Web サーバが必要です　今回は Raspberry Pi OS にセットアップした Apache を使ってるけど…プロバイダなどで供されている CGI の使える Web サーバでも大丈夫だと思います<br /><br />そうそう今回使う (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/6262" rel="noopener noreferrer" target="_blank">ATOM Lite</a> には RTC が載っていません　それ即ち時計が使えないって事なんでその辺をどうにかしなければなりません<br />そこで一定時間(今回は約30秒)ごとに Web サーバにアクセスして…アクセスされた Web サーバが現在時刻(とエアコン設定内容)を返しそれにより時刻の判定を行うようにしました<br /><br />　　：<br /><br />それでは最初に (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/6262" rel="noopener noreferrer" target="_blank">ATOM Lite</a> の方から初めていきましょう　開発環境は Linux っていうか Snap 版の Arduino IDE を使いました　まぁ Arduino IDE であれば Windows 版とかでも同じく使えるとは思いますが未確認です汗　そんな Arduino IDE の設定は <a class="url labeledlink" href="https://room.dengeki.jp/tegalog.cgi?postid=24" rel="noopener noreferrer" target="_blank">M5StickC Plus の開発環境を構築する</a> が参考になると思います　ボードを追加した後に「M5Stack-ATOM」を設定すれば ok です<br /><br />お次は (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/6262" rel="noopener noreferrer" target="_blank">ATOM Lite</a> 向けのライブラリのインストールですかね　これは「<span class="decorationC" style="color:red;">ツール</span>」メニューから「<span class="decorationC" style="color:red;">ライブラリを管理…</span>」を選んで検索窓に必要なキーワードを入れて出てきたものをインストールってする感じですかね<br /><br /><img class="embeddedimage nolisted" width="1000" height="562" src="https://room.dengeki.jp/images/20230717165352-admin.png" alt="20230717165352-admin.png"><br />「<span class="decorationC" style="color:red;">m5atom</span>」と入れて出てきた「M5Atom」をインストールする<br /><br /><img class="embeddedimage nolisted" width="1000" height="562" src="https://room.dengeki.jp/images/202307171653522-admin.png" alt="202307171653522-admin.png"><br />「<span class="decorationC" style="color:red;">irremoteesp8266</span>」と入れて出てきた「IRremoteEsp8266」をインストールする<br /><br /><img class="embeddedimage nolisted" width="1000" height="562" src="https://room.dengeki.jp/images/202307171653521-admin.png" alt="202307171653521-admin.png"><br />「<span class="decorationC" style="color:red;">heatpumpir</span>」と入れて出てきた「HeatpumpIR」をインストールする<br /><br />これでライブラリ類の準備も完了ですかね　それではコードを見ていきましょう…っていうか手探りの「どうにか動く」テスト的なものだったのが意外と問題なく動いてしまって「あーなんか書き直すのもめんどくさいなー」って気分が昂ぶってきたんでそんなテスト的なものをそのまま載せています　動作未保証なのはもちろんとして…諸々をきちっと書き直して使ってください　それだけが私の望みです汗<br /><br />　　：<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">remcon.ino</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />&#35;include &lt;M5Atom.h&gt; // Atom のヘッダファイルを準備<br />&#35;include &lt;WiFiMulti.h&gt;<br />&#35;include &lt;HTTPClient.h&gt;<br />&#35;include &lt;MitsubishiHeatpumpIR.h&gt;<br /><br />const char* url = &quot;http://user:pass@hoge.orz/remocon/read.cgi&quot;; // 現在時刻＆設定内容の場所<br />const char* ssid = &quot;WiFi_ssid&quot;; &nbsp;// SSID<br />const char* password = &quot;WiFi_pass&quot;; &nbsp;// パスワード<br /><br />const uint16_t kIrLed = 12; // 赤外線 LED 送信用のポート番号<br />IRSenderBitBang irSender(kIrLed); // 赤外線LEDが接続されているピン番号<br />HeatpumpIR *airCon = new MitsubishiFDHeatpumpIR(); &nbsp;// 三菱エアコンのインスタンス<br /><br />// FastLED ライブラリの設定(CRGB構造体)<br />CRGB dispColor(uint8_t r, uint8_t g, uint8_t b) {<br />&nbsp; return (CRGB)((r &lt;&lt; 16) | (g &lt;&lt; 8) | b);<br />}<br /><br />WiFiMulti WiFiMulti; &nbsp;// Wi-Fi を使いたい<br /><br />void setup() {<br />&nbsp; Serial.begin(115200);<br />&nbsp; Serial.println(&quot;&quot;);<br /><br />&nbsp; M5.begin(true, false, true); &nbsp;// 本体初期化(UART有効, I2C無効, LED有効)<br />&nbsp; M5.dis.drawpix(0, dispColor(0, 0, 0)); &nbsp;// LED全消灯(赤, 緑, 青)<br /><br />&nbsp; WiFiMulti.addAP(ssid, password); // 「SSID」と「パスワード」を設定しておく<br />&nbsp; Serial.print(&quot;Fi-Fi Connecting.&quot;);<br />}<br /><br />void loop() {<br />&nbsp; while (WiFiMulti.run() != WL_CONNECTED) {<br />&nbsp;&nbsp; &nbsp;Serial.print(&quot;.&quot;);<br />&nbsp;&nbsp; &nbsp;M5.dis.drawpix(0, dispColor(255, 0, 0)); &nbsp;//LED(赤)<br />&nbsp;&nbsp; &nbsp;delay(500);<br />&nbsp; }<br />&nbsp; Serial.print(&quot;ADDR: &quot;);<br />&nbsp; Serial.println(WiFi.localIP());<br /><br />&nbsp; M5.dis.drawpix(0, dispColor(20, 20, 20)); // LED(白)<br /><br />&nbsp; HTTPClient http;<br />&nbsp; http.begin(url);<br />&nbsp; Serial.print(&quot;GET: &quot;);<br />&nbsp; int httpCode = http.GET(); &nbsp;// GET メソッドでファイルを取得<br />&nbsp; Serial.println(httpCode);<br />// &nbsp;Serial.println(http.errorToString(httpCode));<br /><br />&nbsp; if (httpCode &gt; 0) {<br />&nbsp;&nbsp; &nbsp;String htdoc = http.getString(); &nbsp;// 取得したファイルの内容<br />&nbsp;&nbsp; &nbsp;Serial.println(htdoc);<br /><br />// &nbsp;YYYY/MM/DD HH:YY:MM(WDAY)\ts?,HH:MM e?,HH:MM m?<br />// &nbsp;現在年/月/日 時:分:秒(曜日)\t開始フラグ,時:分 終了フラグ,時:分 モード<br />&nbsp;&nbsp; &nbsp;String now_hour = htdoc.substring(11, 13); &nbsp;// 現在時を取得<br />&nbsp;&nbsp; &nbsp;String now_min = htdoc.substring(14, 16);&nbsp; &nbsp;// 現在分を取得<br /><br />&nbsp;&nbsp; &nbsp;String st = htdoc.substring(25, 27);&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;// 開始フラグを取得<br />&nbsp;&nbsp; &nbsp;String ed = htdoc.substring(34, 36);&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;// 終了フラグを取得<br /><br />&nbsp;&nbsp; &nbsp;String st_hour = htdoc.substring(28, 30);&nbsp; &nbsp;// 開始時<br />&nbsp;&nbsp; &nbsp;String st_min = htdoc.substring(31, 33);&nbsp; &nbsp; // 開始分<br /><br />&nbsp;&nbsp; &nbsp;String ed_hour = htdoc.substring(37, 39);&nbsp; &nbsp;// 終了時<br />&nbsp;&nbsp; &nbsp;String ed_min = htdoc.substring(40, 42);&nbsp; &nbsp; // 終了分<br /><br />&nbsp;&nbsp; &nbsp;String md = htdoc.substring(43, 45);&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;// モードを取得<br /><br />&nbsp;&nbsp; &nbsp;if (st == &quot;s1&quot; && now_hour == st_hour && now_min == st_min) {<br />&nbsp;&nbsp; &nbsp; &nbsp;if (md == &quot;m1&quot;) {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Serial.println(&quot;Cool&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; M5.dis.drawpix(0, dispColor(0, 0, 255)); &nbsp;//LED(青)<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; airCon-&gt;send(irSender, POWER_ON, MODE_COOL, FAN_1, 28, VDIR_DOWN, HDIR_AUTO); // 冷房<br />&nbsp;&nbsp; &nbsp; &nbsp;} else if (md == &quot;m2&quot;) {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Serial.println(&quot;Hot&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; M5.dis.drawpix(0, dispColor(255, 255, 0)); &nbsp;//LED(黄)<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; airCon-&gt;send(irSender, POWER_ON, MODE_HEAT, FAN_1, 16, VDIR_DOWN, HDIR_AUTO); // 暖房<br />&nbsp;&nbsp; &nbsp; &nbsp;} else {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Serial.println(&quot;Dry&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; M5.dis.drawpix(0, dispColor(0, 255, 0)); &nbsp;//LED(緑)<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; airCon-&gt;send(irSender, POWER_ON, MODE_DRY, FAN_1, 28, VDIR_DOWN, HDIR_AUTO); // 除湿<br />&nbsp;&nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;if (ed == &quot;e1&quot; && now_hour == ed_hour && now_min == ed_min) {<br />&nbsp;&nbsp; &nbsp; &nbsp;Serial.println(&quot;--- Stop ---&quot;);<br />&nbsp;&nbsp; &nbsp; &nbsp;M5.dis.drawpix(0, dispColor(255, 0, 255)); &nbsp;//LED(紫)<br />&nbsp;&nbsp; &nbsp; &nbsp;airCon-&gt;send(irSender, POWER_OFF, MODE_COOL, FAN_1, 28, VDIR_DOWN, HDIR_AUTO); // 電源 Off<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp; } else { &nbsp;// ファイルの取得に失敗している<br />&nbsp;&nbsp; &nbsp;Serial.println(&quot;Error&quot;);<br />&nbsp; }<br /><br />&nbsp; delay(30000);<br />}<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">remcon.ino</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />※デバッグ用のシリアル通信のアレが残っているんで実稼働時には消したほうがいいかも知れないです<br /><br />冒頭の <span class="decorationC" style="color:green;">&#35;include &lt;MitsubishiHeatpumpIR.h&gt;</span> は…まぁ見ての通り三菱社製のエアコン制御をする時に使うものです　これが他社製であれば<br /><span class="decorationC" style="color:green;">&#35;include &lt;DaikinHeatpumpIR.h&gt;</span> &nbsp;// ダイキン社製<br /><span class="decorationC" style="color:green;">&#35;include &lt;FujitsuHeatpumpIR.h&gt;</span> &nbsp;// 富士通社製<br /><span class="decorationC" style="color:green;">&#35;include &lt;HitachiHeatpumpIR.h&gt;</span> &nbsp;// 日立社製<br /><span class="decorationC" style="color:green;">&#35;include &lt;PanasonicHeatpumpIR.h&gt;</span> &nbsp;// パナソニック社製<br /><span class="decorationC" style="color:green;">&#35;include &lt;ToshibaHeatpumpIR.h&gt;</span> &nbsp;// 東芝社製<br />こんな感じになるんじゃないかと思います(未確認)　詳しくは Aruduino IDE の関連フォルダ Arduino/libraries/HeatpumpIR/ を眺めてみるといいかと思います<br /><br />　　：<br /><br />データ(と時間)を取ってくる Web サーバの設定と… Wi-Fi 接続に関する設定を行います<br /><span class="decorationC" style="color:green;">const char* url = &quot;http://user:pass@hoge.orz/remcon/read.cgi&quot;; // 現在時刻＆設定内容の場所<br />const char* ssid = &quot;WiFi-ssid&quot;; &nbsp;// SSID<br />const char* password = &quot;WiFi-pass&quot;; &nbsp;// パスワード</span><br />保安上っていうか恐らくベーシック認証なりをかけて運用すると思うのですが…その際に ID とパスワードの入力を自動化しておかねばなりません　そんなときは <span class="decorationC" style="color:red;">http://user:pass@hoge.orz/remcon/read.cgi</span> って感じで URL の前に「<span class="decorationC" style="color:red;">user:pass@</span>」を付ければ自動で認証してくれます　この書き方は一般的なブラウザでも(警告が出るかもだけど)使えます<br />その次に Wi-Fi の SSID とパスワードの設定を行います　上記のベーシック認証と併せて平文のパスワードを記すことになるので取り扱いには十分注意してください<br /><br />　　：<br /><br /><span class="decorationC" style="color:green;">HTTPClient http;<br />http.begin(url);<br />int httpCode = http.GET(); &nbsp;// GET メソッドでファイルを取得</span><br />Wi-Fi 接続が確立したら目的のサーバからデータを取ってきます　後でも説明しますが…ここで得られるデータは次のようになっています<br /><br /><span class="decorationC" style="color:red;">YYYY/MM/DD HH:YY:MM(WDAY)&#91;タブ(\t)&#93;s?,HH:MM e?,HH:MM m?</span><br />&#91;タブ(\t)&#93; の前半がアクセスした時点での日時<br />&#91;タブ(\t)&#93; の後半がエアコンの開始/終了の時刻とモードを指しています<br />例えば <span class="decorationC" style="color:blue;">12 時 34 分</span>に作動させたい場合は <span class="decorationC" style="color:red;">s1,12:34</span> となります　その次が <span class="decorationC" style="color:red;">e1,23:45</span> だったら <span class="decorationC" style="color:blue;">23 時 45 分</span>に電源を切る動作となります　これが <span class="decorationC" style="color:red;">s0</span> もしくは <span class="decorationC" style="color:red;">e0</span> だった場合は何も動作しないようにしています<br />行末の <span class="decorationC" style="color:blue;">m?</span> は動作モードを指しています　<span class="decorationC" style="color:red;">m1</span> が冷房　<span class="decorationC" style="color:red;">m2</span> が暖房　<span class="decorationC" style="color:red;">m3</span> が除湿です　<br />http.GET(); した際のバッファサイズが不明だったんで…できるだけ切り詰めて必要最小限の内容にしました　バッファに余裕があればもっと見やすい内容にするのもアリかもしれませんね<br /><br />　　：<br /><br />そして実際に赤外線で信号を送信する部分です<br /><span class="decorationC" style="color:green;">airCon-&gt;send(irSender, POWER_ON, MODE_COOL, FAN_1, 28, VDIR_DOWN, HDIR_AUTO); // 冷房</span><br /><br />各パラメータの意味は以下のようになっています<br />// airCon-&gt;send( irSender, POWER_**, MODE_**, FAN1, 温度設定, VDIR_** , HDIR_** ); // 設定項目 ※温度設定は「整数値」で<br />// &nbsp;Arduino/libraries/HeatpumpIR/HeatpumpIR.h<br />//<br />// ・POWER (電源)<br />//&nbsp; &nbsp; POWER_ON (on)<br />//&nbsp; &nbsp; POWER_OFF (off)<br />// ・MODE (モード)<br />//&nbsp; &nbsp; MODE_AUTO (自動)<br />//&nbsp; &nbsp; MODE_COOL (冷房)<br />//&nbsp; &nbsp; MODE_HEAT (暖房)<br />//&nbsp; &nbsp; MODE_DRY (除湿)<br />//&nbsp; &nbsp; MODE_ON (不明)<br />//&nbsp; &nbsp; MODE_OFF (不明)<br />// ・FAN (風量)<br />//&nbsp; &nbsp; FAN_AUTO<br />//&nbsp; &nbsp; FAN_1 （弱）<br />//&nbsp; &nbsp; FAN_2<br />//&nbsp; &nbsp; FAN_3<br />//&nbsp; &nbsp; FAN_4<br />//&nbsp; &nbsp; FAN_5 （強）<br />// ・VDIR (風向高さ)<br />//&nbsp; &nbsp; VDIR_AUTO<br />//&nbsp; &nbsp; VDIR_UP<br />//&nbsp; &nbsp; VDIR_MUP<br />//&nbsp; &nbsp; VDIR_MIDDLE<br />//&nbsp; &nbsp; VDIR_MDOWN<br />//&nbsp; &nbsp; VDIR_DOWN<br />// ・HDIR (風向左右)<br />//&nbsp; &nbsp; HDIR_AUTO<br />//&nbsp; &nbsp; HDIR_LEFT<br />//&nbsp; &nbsp; HDIR_MLEFT<br />//&nbsp; &nbsp; HDIR_MIDDLE<br />//&nbsp; &nbsp; HDIR_MRIGHT<br />//&nbsp; &nbsp; HDIR_RIGHT<br /><br />エアコンの設定温度は整数値で指定する必要があるようです　最近は 0.5℃ 間隔で設定できるエアコンが増えてる感じですが…そこまで細かい制御には対応できないっぽいです　また今回のプログラムでは設定温度を即値の決め打ちしています　使い勝手を高めるのであればこの辺も外部から変更できるようにすべきですね<br /><br />だいたいこんな感じですかね　これを <span class="decorationC" style="color:green;">delay(30000);</span> して約 30 秒間隔のループで回しています　なにかの都合…例えば <span class="decorationC" style="color:green;">http.GET();</span> した際にサーバの返答が遅れたりするとループ間隔が長くなり指定された時間を通り越してしまうかも？って思ってこのくらいの間隔にしました　まぁこの辺は各環境によりけりで程よい設定にしてもらえればなぁって思います<br /><br />　　：<br /><br />さて…お次は UI っていうか Web サーバ側の云々ですかね　用意するのは 4 つのファイル(<span class="decorationC" style="color:green;">index.html</span>, <span class="decorationC" style="color:green;">index.css</span>, <span class="decorationC" style="color:green;">index.cgi</span>, <span class="decorationC" style="color:green;">read.cgi</span>)とスクリプトが生成する 1 つのファイル(<span class="decorationC" style="color:green;">data.txt</span>)です<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">index.html</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />&#60;!DOCTYPE html&#62;<br />&#60;html lang=&quot;ja&quot;&#62;<br />&#60;head&#62;<br />&nbsp; &nbsp;&#60;meta charset=&quot;UTF-8&quot;&#62;<br />&nbsp; &nbsp;&#60;!-- ビューポートの設定 --&#62;<br />&nbsp; &nbsp;&#60;meta name=&quot;viewport&quot; content=&quot;width=device-width,initial-scale=1&quot;&#62;<br />&nbsp; &nbsp;&#60;!-- スタイルシートの読み込み --&#62;<br />&nbsp; &nbsp;&#60;link href=&quot;./index.css&quot; rel=&quot;stylesheet&quot;&#62;<br />&nbsp; &nbsp;&#60;title&#62;M5 Atom Lite タイマー予約&#60;/title&#62;<br />&#60;/head&#62;<br />&#60;body&#62;<br /><br />&#60;center&#62;&#60;div class=&quot;red&quot;&#62;&#60;/div&#62;&#60;/center&#62;<br />&#60;center&#62;&#60;form action=&quot;./index.cgi&quot; method=&quot;get&quot;&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;label for=&quot;name&quot;&#62;&#60;a href=&quot;./index.cgi&quot;&#62;M5 Atom Lite タイマー予約&#60;/a&#62;&#60;/label&#62;<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;&#60;hr class=&quot;double&quot; width=80% noshade&#62;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;label&#62;&#60;input class=&quot;st&quot; type=&quot;checkbox&quot; name=&quot;st&quot; value=&quot;1&quot;&#62;「入り」を使う&#60;/label&#62;<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;select name=&quot;st_hour&quot;&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;00&quot;&#62;00&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;01&quot;&#62;01&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;02&quot;&#62;02&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;03&quot;&#62;03&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;04&quot;&#62;04&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;05&quot;&#62;05&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;06&quot;&#62;06&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;07&quot;&#62;07&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;08&quot;&#62;08&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;09&quot;&#62;09&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;10&quot;&#62;10&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;11&quot;&#62;11&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;12&quot;&#62;12&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;13&quot;&#62;13&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;14&quot;&#62;14&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;15&quot;&#62;15&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;16&quot;&#62;16&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;17&quot;&#62;17&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;18&quot;&#62;18&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;19&quot;&#62;19&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;20&quot;&#62;20&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;21&quot;&#62;21&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;22&quot;&#62;22&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;23&quot;&#62;23&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;/select&#62;時<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;select name=&quot;st_min&quot;&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;00&quot;&#62;00&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;10&quot;&#62;10&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;20&quot;&#62;20&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;30&quot;&#62;30&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;40&quot;&#62;40&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;50&quot;&#62;50&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;/select&#62; 分<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;&#60;hr class=&quot;double&quot; width=80% noshade&#62;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;label&#62;&#60;input class=&quot;ed&quot; type=&quot;checkbox&quot; name=&quot;ed&quot; value=&quot;1&quot;&#62;「切り」を使う&#60;/label&#62;<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;select name=&quot;ed_hour&quot;&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;00&quot;&#62;00&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;01&quot;&#62;01&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;02&quot;&#62;02&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;03&quot;&#62;03&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;04&quot;&#62;04&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;05&quot;&#62;05&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;06&quot;&#62;06&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;07&quot;&#62;07&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;08&quot;&#62;08&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;09&quot;&#62;09&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;10&quot;&#62;10&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;11&quot;&#62;11&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;12&quot;&#62;12&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;13&quot;&#62;13&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;14&quot;&#62;14&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;15&quot;&#62;15&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;16&quot;&#62;16&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;17&quot;&#62;17&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;18&quot;&#62;18&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;19&quot;&#62;19&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;20&quot;&#62;20&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;21&quot;&#62;21&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;22&quot;&#62;22&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;23&quot;&#62;23&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;/select&#62;時<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;select name=&quot;ed_min&quot;&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;00&quot;&#62;00&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;10&quot;&#62;10&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;20&quot;&#62;20&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;30&quot;&#62;30&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;40&quot;&#62;40&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;50&quot;&#62;50&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;/select&#62;分<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;&#60;hr class=&quot;double&quot; width=80% noshade&#62;&#60;/div&#62;<br />&nbsp; &nbsp; &#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;input class=&quot;md&quot; type=&quot;radio&quot; name=&quot;md&quot; value=&quot;1&quot;&#62;冷房<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;input class=&quot;md&quot; type=&quot;radio&quot; name=&quot;md&quot; value=&quot;2&quot;&#62;暖房<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;input class=&quot;md&quot; type=&quot;radio&quot; name=&quot;md&quot; value=&quot;3&quot;&#62;除湿<br />&nbsp; &nbsp;&#60;/div&#62;<br /><br />&nbsp; &nbsp;&#60;div&#62;&#60;hr class=&quot;hrline&quot; width=80% noshade&#62;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;input class=&quot;submit&quot; type=&quot;submit&quot; value=&quot;予約&quot;&#62;<br />&nbsp; &nbsp;&#60;/div&#62;<br />&#60;/form&#62;&#60;/center&#62;<br /><br />&#60;/body&#62;<br />&#60;/html&#62;<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">index.html</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />index.html ってファイル名なんで…デフォルトで表示されるファイルっぽいですが実際にはそのような用途には使っていません　デザインしやすいようにファイルを分割してあるだけで実際に表示は index.cgi が行います<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">index.css</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />/* ボディ */<br />body {&nbsp; &nbsp;/* 一般的な表示部 */<br />&nbsp; &nbsp;margin: 0 ;<br />&nbsp; &nbsp;padding: 0 ;<br />&nbsp; &nbsp;font-size: 20px ;<br />&nbsp; &nbsp;line-height: 3 ;<br />}<br /><br />input {&nbsp; &nbsp;/* チェックボックス */<br />&nbsp; &nbsp;width:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;25px;<br />&nbsp; &nbsp;height:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;25px;<br />&nbsp; &nbsp;-moz-transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;-webkit-transform:&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />}<br /><br />select {&nbsp; &nbsp;/* プルダウンメニュー */<br />&nbsp; &nbsp;font-size: 30px ;<br />}<br /><br />.hrline {&nbsp; &nbsp;/* 罫線(？) */<br />&nbsp; &nbsp;border: none;<br />&nbsp; &nbsp;background-color: &#35;fff;<br />&nbsp; &nbsp;border-width: 1px 0 0 0;<br />&nbsp; &nbsp;border-top: double;<br />&nbsp; &nbsp;border-color: black;<br />}<br /><br />.submit {&nbsp; &nbsp;/* 送信ボタン */<br />&nbsp; &nbsp;width:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;100px;<br />&nbsp; &nbsp;height:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;40px;<br />&nbsp; &nbsp;-moz-transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;-webkit-transform:&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />}<br /><br />.red {&nbsp; &nbsp;/* 設定変更した */<br />&nbsp; &nbsp;font-size: 40px ;<br />&nbsp; &nbsp;color: &#35;ff0000;<br />}<br /><br />/* スマホだけに適用するCSS */<br />@media screen and ( max-width:479px ) {<br />&nbsp; &nbsp;body {&nbsp; &nbsp;/* 一般的な表示部 */<br />&nbsp; &nbsp;&nbsp; &nbsp;font-size: 20px ;<br />&nbsp; &nbsp;}<br /><br />&nbsp; &nbsp;input {&nbsp; &nbsp;/* チェックボックス */<br />&nbsp; &nbsp;&nbsp; &nbsp;width:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;25px;<br />&nbsp; &nbsp;&nbsp; &nbsp;height:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;25px;<br />&nbsp; &nbsp;&nbsp; &nbsp;-moz-transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;&nbsp; &nbsp;-webkit-transform:&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;&nbsp; &nbsp;transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;}<br /><br />&nbsp; &nbsp;select {&nbsp; &nbsp;/* プルダウンメニュー */<br />&nbsp; &nbsp;&nbsp; &nbsp;font-size: 25px ;<br />&nbsp; &nbsp;}<br /><br />&nbsp; &nbsp;.hrline {&nbsp; &nbsp;/* 罫線(？) */<br />&nbsp; &nbsp;&nbsp; &nbsp;border: none;<br />&nbsp; &nbsp;&nbsp; &nbsp;background-color: &#35;fff;<br />&nbsp; &nbsp;&nbsp; &nbsp;border-width: 1px 0 0 0;<br />&nbsp; &nbsp;&nbsp; &nbsp;border-top: double;<br />&nbsp; &nbsp;&nbsp; &nbsp;border-color: black;<br />&nbsp; &nbsp;}<br />&nbsp; &nbsp;.submit {&nbsp; &nbsp;/* 送信ボタン */<br />&nbsp; &nbsp;&nbsp; &nbsp;width:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;100px;<br />&nbsp; &nbsp;&nbsp; &nbsp;height:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;40px;<br />&nbsp; &nbsp;&nbsp; &nbsp;-moz-transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;&nbsp; &nbsp;-webkit-transform:&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;&nbsp; &nbsp;transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;}<br /><br />&nbsp; &nbsp;.red {&nbsp; &nbsp;/* 設定変更した */<br />&nbsp; &nbsp;&nbsp; &nbsp;font-size: 40px ;<br />&nbsp; &nbsp;&nbsp; &nbsp;color: &#35;ff0000;<br />&nbsp; &nbsp;}<br />}<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">index.css</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />でっか文字な表示にしたくて見様見真似で用意しました　見様見真似の即興ってことで CSS について何一つ理解していません汗　おかしな所しかないと思うけど…まぁその辺は生温かい目で見守って頂けると幸いに思います（瀧汗<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">index.cgi</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />&#35;!/usr/bin/perl<br /><br />$datafile = &quot;./data.txt&quot;;&nbsp; &nbsp;&#35; ATOM Lite が読みにくるファイル<br />$htmlfile = &quot;./index.html&quot;;&nbsp; &nbsp;&#35; ベースとなる HTML ファイル<br /><br />if ($ENV{&apos;REQUEST_METHOD&apos;} eq &apos;POST&apos;) {&nbsp; &nbsp;&#35; POST メソッドで送られてきた場合<br />&nbsp; &nbsp;read(STDIN, $query, $ENV{&apos;CONTENT_LENGTH&apos;});<br />} else {&nbsp; &nbsp;&#35; GET メソッドで送られてきた場合<br />&nbsp; &nbsp;$query = $ENV{&apos;QUERY_STRING&apos;};<br />}<br /><br />&#35;&#35;&#35;&#35; ATOM Lite が読みにくるデータファイルを作成する &#35;&#35;&#35;&#35;<br />open (DATA, $datafile);<br />$data = &#60;DATA&#62;;&nbsp; &nbsp;&#35; 既存のデータファイルを読み内容を取り出しておく<br />if ($data =~ /s(\d),(\d\d):(\d\d) e(\d),(\d\d):(\d\d) m(\d)/) {<br />&nbsp; &nbsp;$in{&apos;st&apos;} = $1;<br />&nbsp; &nbsp;$in{&apos;st_hour&apos;} = $2;<br />&nbsp; &nbsp;$in{&apos;st_min&apos;} = $3;<br />&nbsp; &nbsp;$in{&apos;ed&apos;} = $4;<br />&nbsp; &nbsp;$in{&apos;ed_hour&apos;} = $5;<br />&nbsp; &nbsp;$in{&apos;ed_min&apos;} = $6;<br />&nbsp; &nbsp;$in{&apos;md&apos;} = $7;<br />}<br />close (DATA);<br /><br />if ($query) {&nbsp; &nbsp;&#35; データを受信していた場合の処理<br />&nbsp; &nbsp;open (DATA, &quot;&#62;&quot;, $datafile);&nbsp; &nbsp;<br />&nbsp; &nbsp;foreach $data (split(/&/, $query)) {&nbsp; &nbsp;&#35; 「&」で分割して全て処理する<br />&nbsp; &nbsp;&nbsp; &nbsp;($key, $value) = split(/=/, $data);&nbsp; &nbsp;&#35; 「name=value」のそれぞれに分割して連想配列を作っていく<br />&nbsp; &nbsp;&nbsp; &nbsp;$value =~ s/\+/ /g;&nbsp; &nbsp;&#35; 以下ざっくりとした URL デコードする<br />&nbsp; &nbsp;&nbsp; &nbsp;$value =~ s/%(&#91;a-fA-F0-9&#93;&#91;a-fA-F0-9&#93;)/pack(&apos;C&apos;, hex($1))/eg;<br />&nbsp; &nbsp;&nbsp; &nbsp;$value =~ s/\t//g;<br />&nbsp; &nbsp;&nbsp; &nbsp;$in{&quot;$key&quot;} = $value;&nbsp; &nbsp;&#35; value = $in{&quot;$name&quot;} の連想配列が出来上がる<br />&nbsp; &nbsp;}<br />&nbsp; &nbsp;&#35; 送られてきた内容を適用してデータファイルを更新<br />&nbsp; &nbsp;if (!($query =~ /st=/)) { $in{&apos;st&apos;} = &apos;0&apos;; }&nbsp; &nbsp;&#35; チェックボックスの挙動がアレなんで個別対応（汗<br />&nbsp; &nbsp;if (!($query =~ /ed=/)) { $in{&apos;ed&apos;} = &apos;0&apos;; }&nbsp; &nbsp;&#35; チェックボックスの挙動がアレなんで個別対応（汗<br />&nbsp; &nbsp;if ($in{&apos;st&apos;}) { print DATA &quot;s1,&quot;; } else { print DATA &quot;s0,&quot;; }<br />&nbsp; &nbsp;if ($in{&apos;st_hour&apos;}) { printf DATA &quot;%02d:&quot;, $in{&apos;st_hour&apos;}; } else { print DATA &quot;00:&quot;; }<br />&nbsp; &nbsp;if ($in{&apos;st_min&apos;}) { printf DATA &quot;%02d &quot;, $in{&apos;st_min&apos;}; } else { print DATA &quot;00 &quot;; }<br />&nbsp; &nbsp;if ($in{&apos;ed&apos;}) { print DATA &quot;e1,&quot;; } else { print DATA &quot;e0,&quot;; }<br />&nbsp; &nbsp;if ($in{&apos;ed_hour&apos;}) { printf DATA &quot;%02d:&quot;, $in{&apos;ed_hour&apos;}; } else { print DATA &quot;00:&quot;; }<br />&nbsp; &nbsp;if ($in{&apos;ed_min&apos;}) { printf DATA &quot;%02d &quot;, $in{&apos;ed_min&apos;}; } else { print DATA &quot;00 &quot;; }<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; if ($in{&apos;md&apos;} eq &quot;1&quot;) { print DATA &quot;m1\n&quot;; } elsif ($in{&apos;md&apos;} eq &quot;2&quot;) { print DATA &quot;m2\n&quot;; } else { print DATA &quot;m3\n&quot;; }<br />&nbsp; &nbsp;close (DATA);<br />}<br /><br />open (IN, $htmlfile);&nbsp; &nbsp;&#35; 以下ベースとなる HTML ファイルを読み込み設定時間などを反映させる<br /><br />print &quot;Content-type: text/html; charset=UTF-8\n\n&quot;;<br />@lines = &#60;IN&#62;;<br />foreach (@lines) {<br />&nbsp; &nbsp;if ($query) { s/(&#60;div class=&quot;red&quot;&#62;)(&#60;\/div&#62;)/$1設定しました$2/; }<br /><br />&nbsp; &nbsp;if ($in{&apos;st&apos;} eq &quot;1&quot;) { s/(class=&quot;st&quot;)/$1 checked/; }<br />&nbsp; &nbsp;if ($in{&apos;st_hour&apos;}) { s/(class=&quot;st_hour&quot; value=&quot;)($in{&apos;st_hour&apos;}&quot;)/$1$2 selected/; }<br />&nbsp; &nbsp;if ($in{&apos;st_min&apos;}) { s/(class=&quot;st_min&quot; value=&quot;)($in{&apos;st_min&apos;}&quot;)/$1$2 selected/; }<br />&nbsp; &nbsp;if ($in{&apos;ed&apos;} eq &quot;1&quot;) { s/(class=&quot;ed&quot;)/$1 checked/; }<br />&nbsp; &nbsp;if ($in{&apos;ed_hour&apos;}) { s/(class=&quot;ed_hour&quot; value=&quot;)($in{&apos;ed_hour&apos;}&quot;)/$1$2 selected/; }<br />&nbsp; &nbsp;if ($in{&apos;ed_min&apos;}) { s/(class=&quot;ed_min&quot; value=&quot;)($in{&apos;ed_min&apos;}&quot;)/$1$2 selected/; }<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; if ($in{&apos;md&apos;}) { s/(name=&quot;md&quot; value=&quot;)($in{&apos;md&apos;}&quot;)/$1$2 checked=&quot;checked&quot;/; }<br /><br />&nbsp; &nbsp;print $_;<br />}<br />close (IN);<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">index.cgi</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />実際に表示を受け持つ index.cgi です　表示を受け持ちつつ…フォームで入力された値を解釈して data.txt を生成します　そしてそのフォームで入力された値 index.html の内容を書き換えて表示するようになっています　こうしておけば以前の設定内容を次回の設定に引き継げるようになるので便利かなーって思いまして<br />そんな訳なんで .htaccess で Web サーバの設定変更が可能な場合は <span class="decorationC" style="color:red;">DirectoryIndex index.cgi</span> としてデフォルトで読み出されるファイルに設定しておくといいでしょう<br /><br />あとこの index.cgi は GET メソッドでデータを受けれられるので…極端な話パラメータ付きの URL を直打ちすることでも設定が可能です　例えば <span class="decorationC" style="color:blue;">08 時 20 分</span> に <span class="decorationC" style="color:blue;">冷房</span> で作動させ <span class="decorationC" style="color:blue;">19 時 30 分</span> に電源を切る場合だと<br /><span class="decorationC" style="color:green;">http://user:pass@hoge.orz/remocon/index.cgi?st=1&st_hour=08&st_min=20&ed=1&ed_hour=19&ed_min=30&md=1</span><br />こんな感じの URL になります　それ即ち wget や curl などのコマンドでアクセスすることが可能となり…さらに cron などを使えば毎日の動作や毎週の動作といった感じで自動化することも可能になります　いや実際に試してはないですけどたぶん大丈夫だと思います汗<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">read.cgi</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />#!/usr/bin/perl<br /><br />print &quot;Content-type: text/plain; charset=UTF-8\n\n&quot;;<br /><br /># 現在日時の表示<br />@wdays = ( &quot;Sun&quot;, &quot;Mon&quot;, &quot;Tue&quot;, &quot;Wed&quot;, &quot;Thu&quot;, &quot;Fri&quot;, &quot;Sat&quot;);<br />($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time());<br />printf &quot;%04d/%02d/%02d %02d:%02d:%02d(%s)\t&quot;, $year + 1900, $mon + 1, $mday, $hour, $min, $sec, $wdays&#91;$wday&#93;;<br /><br />$datafile = &quot;./data.txt&quot;;&nbsp; &nbsp;# ブラウザで設定した内容のファイル<br />open (DATA, $datafile);<br />print &#60;DATA&#62;;&nbsp; &nbsp;# ファイルの 1 行目を読み取り表示する<br />close (DATA);<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">read.cgi</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />(M5) ATOM Lite がアクセスしてくるファイル(CGI)です　現在日時を整形して表示して…あとは index.cgi が生成した data.txt の内容をくっつけて送信してくれます<br /><br />　　：<br /><br />ごちゃごちゃ長くなったんで以下にまとめときます　「名前を付けてリンク先を保存」とかすれば手間がなくていいと思いますたぶん<br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/remocon.ino" rel="noopener noreferrer" target="_blank">remcon.ino</a>&nbsp; &nbsp;(M5) ATOM Lite 用 Arduino Sketch ファイル <br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/index.html" rel="noopener noreferrer" target="_blank">index.html</a>&nbsp; &nbsp;表示のベースとなる HTML ファイル<br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/index.css" rel="noopener noreferrer" target="_blank">index.css</a>&nbsp; &nbsp;でっか文字にするためのアレ<br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/index.cgi" rel="noopener noreferrer" target="_blank">index.cgi</a>&nbsp; &nbsp;ページ表示しつつデータファイルを作成する<br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/read.cgi" rel="noopener noreferrer" target="_blank">read.cgi</a>&nbsp; &nbsp;(M5) ATOM Lite が読みに来る先のやつ<br />data.txt &nbsp;index.cgi が作成するデータファイル<br /><br /><img class="embeddedimage nolisted" width="4032" height="2268" src="https://room.dengeki.jp/images/20230717165352-admin.jpg" alt="20230717165352-admin.jpg"><br />そして後はいい感じに設置して完了ですかね　(M5) ATOM Lite の赤外線はかなり飛距離が短いんで…エアコンにへばりつけるような設置になっちゃうのかな<br /><br />あーあと余談っていうか注意事項ですが (M5) ATOM Lite が読みに来る read.cgi は数十秒に 1 回のペースで 24 時間 365 日延々とアクセスがあります　そのままの Web サーバだと…そのアクセス毎にログファイルが蓄積されることになります　もし可能なら Web サーバの設定を変更して…このアクセスに対してのみログの書き込みを抑制するなどしたほうがいいと思います　ざっくり <a class="url labeledlink" href="https://www.google.com/search?q=SetEnvIf+nolog" rel="noopener noreferrer" target="_blank">SetEnvIf nolog</a> &nbsp;なんて感じのキーワードでぐぐれば必要な情報に辿り着けるとイイナ！<br /><br />　　：<br /><br />そんな感じで最後までご覧いただきありがとございました汗　ざっくりテスト用に作ったのをイジくりまわした代物なのでいろいろおかしな部分はありますが…手っ取り早く動作を体感してみたい！って時には役立つかもです　それにしても 1,000円 ちょっとで買える (M5) ATOM Lite はホントすごいですよね　きちんと筐体に収められていつつ… Wi-fi で接続を確立して HTTP でデータを取ってくることができる　赤外線 LED でリモコンのような動作もさせられる　欲を云えば RTC(時計) が欲しかったかなって感じではあるけど…それもどっかのサーバに接続して時刻を取得すればそれほど問題にはならないんでまぁいいかな♪　なんかそんなかんじで <a href="https://room.dengeki.jp/tegalog.cgi?tag=%41%72%64%75%69%6e%6f" class="taglink" title="Arduino">#Arduino</a> <a href="https://room.dengeki.jp/tegalog.cgi?tag=%4d%35%53%74%69%63%6b%43" class="taglink" title="M5StickC">#M5StickC</a> -- Posted by 猫山ぽるか 〔19935文字〕 No.37 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=37</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=37</guid>
	<category>info</category>
	<pubDate>Mon, 17 Jul 2023 08:43:28 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ SNS 避難場所 ]]></title>
	<description><![CDATA[ SNS 避難場所<br /><img class="embeddedimage nolisted" width="500" height="500" src="https://room.dengeki.jp/images/202308260401053-admin.png" alt="202308260401053-admin.png"><br />　<br />Twitter(X) の動向が不安定な感じになり…不意に不遇の凍結とかの憂き目に遭った時に備えていくつかの SNS にアカウントを用意したっていうかまぁそんな際の緊急連絡先メモみたいな？<br /><br />　　：<br /><br /><a class="url labeledlink" href="https://twitter.com/nekonyanma" rel="noopener noreferrer" target="_blank"><img class="embeddedimage nolisted" width="600" height="500" src="https://room.dengeki.jp/images/20230826040105-admin.png" alt="20230826040105-admin.png"></a> <br /><span class="decorationC" style="color:red;"><b class="decorationB">Twitter</b></span>(<span class="decorationC" style="color:red;"><b class="decorationB">X</b></span>): <a class="url labeledlink" href="https://twitter.com/nekonyanma" rel="noopener noreferrer" target="_blank">@nekonyanma</a> <br /><br />　：<br /><br /><a class="url labeledlink" href="https://pawoo.net/@nekonyanma" rel="noopener noreferrer" target="_blank"><img class="embeddedimage nolisted" width="600" height="374" src="https://room.dengeki.jp/images/202308260401051-admin.png" alt="202308260401051-admin.png"></a> <br /><span class="decorationC" style="color:red;"><b class="decorationB">Pawoo</b></span>: <a class="url labeledlink" href="https://pawoo.net/@nekonyanma" rel="noopener noreferrer" target="_blank">@nekonyanma@pawoo.net</a> <br /><br />　：<br /><br /><a class="url labeledlink" href="https://misskey.io/@nekonyanma" rel="noopener noreferrer" target="_blank"><img class="embeddedimage nolisted" width="600" height="345" src="https://room.dengeki.jp/images/202308260401052-admin.png" alt="202308260401052-admin.png"></a> <br /><span class="decorationC" style="color:red;"><b class="decorationB">Misskey.io</b></span>: <a class="url labeledlink" href="https://misskey.io/@nekonyanma" rel="noopener noreferrer" target="_blank">@nekonyanma@misskey.io</a> <br />※ ドライブの容量(？)の都合で画像を超絶圧縮してアップロードしてるんで超低画質です(-_-；)<br /><br />　：<br /><br /><a class="url labeledlink" href="https://bsky.app/profile/nekonyanma.bsky.social" rel="noopener noreferrer" target="_blank"><img class="embeddedimage" width="800" height="550" src="https://room.dengeki.jp/images/202308260401054-admin.png" alt="(キャプション自動取得対象外)"></a> <br /><span class="decorationC" style="color:red;"><b class="decorationB">Bluesky</b></span>: <a class="url labeledlink" href="https://bsky.app/profile/nekonyanma.bsky.social" rel="noopener noreferrer" target="_blank">nekonyanma.bsky.social</a> <br /><br />　　：<br /><br />他に<span class="decorationC" style="color:red;"><b class="decorationB">タイッツー</b></span>: <a class="url labeledlink" href="https://taittsuu.com/users/nekonyanma" rel="noopener noreferrer" target="_blank">@nekonyanma</a> もあるけど…ちょっと様子見なかんじかな汗<br /><br />　　：<br /><br />長く使ってきた <a class="url labeledlink" href="https://twitter.com/nekonyanma" rel="noopener noreferrer" target="_blank">Twitter</a> が手に馴染んでて一番使いやすいかなって思いつつ…不安定すぎるシステムがどうにも耐え難い感じですかね　よくもまぁあんなので金取ろうと思ったなってのが最近の使用感ですかね(-_-；)<br /><br /><a class="url labeledlink" href="https://pawoo.net/@nekonyanma" rel="noopener noreferrer" target="_blank">Pawoo</a> は Mastodon が騒がれ始めた頃に ID を取ったまま最近まで放置してました　Mastodon 系にも bot 投稿できるようになったんで…その頃から投稿頻度が高まってきたかな？って感じです　実写系画像テロする輩がちょくちょく発生するのがちょっと困った感じですかね<br /><br /><a class="url labeledlink" href="https://misskey.io/@nekonyanma" rel="noopener noreferrer" target="_blank">Misskey.io</a> は Twitter の退避先として話題になってたんで ID を取ってみました　イイネ！系のリアクションが頻繁に来る賑やかしさがあるけど…アニメ画像に埋め尽くされる雰囲気はちょっと落ち着かなくて閲覧頻度は低めです　ドライブの容量(？)なんてのがあるらしく…普段どおりの画質でアップロードし続けてたら 2 年以内に容量いっぱいになりそうな感じだったんで Misskey.io のみ画像をありえないレベルの超低画質でアップロードするようにしています　予めご了笑ください<br /><br /><a class="url labeledlink" href="https://bsky.app/profile/nekonyanma.bsky.social" rel="noopener noreferrer" target="_blank">Bluesky</a> は…これまた Twitter の退避先として急速に話題になってたんで ID を取ってみました　リンクの張り方とかハッシュタグの作法が他の SNS と少し違う感じなんでちょっと扱いづらい感じですかね　あと客層が心もち意識が高い系っぽいイメージなんで少し落ち着かないですね汗　まぁそれ故に新たな発見を得られやすくて刺激になっていいのかなって思ったりしますが<br /><br />　　：<br /><br />安住の地は何処にあるのだろう…なんかそんなかんじで -- Posted by 猫山ぽるか 〔1072文字〕 No.38 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=38</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=38</guid>
	<category>memo</category>
	<pubDate>Sat, 26 Aug 2023 02:44:42 +0900</pubDate>
</item>

	<!-- END ENTRIES -->
</channel>
</rss>

