コンテンツへスキップ

やりたいこと

指定した条件を判定し、処理を分岐したい。
指定する条件が複数あり、これらを配列で指定する。
配列内容を確認し、条件にマッチするか判定する。

具体的には、日付と数字の組み合わせで判定を行う。
日付+数字(じゃんけん何戦目か)

これは、2020年3月30日週の第3戦目のめざましじゃんけんが、ポイント2倍になったので、この機能を作りこむことにした。

実装方法

条件を配列に登録する。

  • 日付:条件となる日付を配列で指定
    define('DOUBLE_DATE',['2020-03-30','2020-03-31','2020-04-01','2020-04-02','2020-04-03'])
  • 数字:条件となる数字を配列で指定 define('DOUBLE_TIMES',[3])

配列内に存在する値かを「in_array」関数で判定する。
似た関数で「array_search」関数がありますが、array_searchは指定する値が配列の何番目かを検索します。
in_arrayは、単純に指定する値がある・ないを判定します。

実装サンプルソースコード

//ダブルポイント対象回次と日付
define('DOUBLE_TIMES',[3]);
define('DOUBLE_DATE',['2020-03-30','2020-03-31','2020-04-01','2020-04-02','2020-04-03']);

//$this_date, $this_timeは、判定対象の値。
//今回の場合、じゃんけん実施日、何戦目か(数字)

$date_flg = in_array($this_date,DOUBLE_DATE);
$times_flg = in_array($this_times,DOUBLE_TIMES);

if($date_flg and $times_flg){
  //条件に合致した際の処理
}

 

 

コロナウィルス関連向けTwitterハッシュタグによる話題追跡

何か、出来ないかと考え、このプラットフォームを準備しました。
偶然、バズったり話題となった内容は、メディアや公的機関も対処してくれる時代。

まずは、2つのハッシュタグを準備し、これらハッシュタグのツイートとRT数をウォッチします。
ツイートの一覧ページも公開するので、利用されれば、それなりに情報も整理しやすくなると思います。

ハッシュタグ #必要な情報コロナ新しいウィンドウで開きます  #困ってるコロナ新しいウィンドウで開きます のツイートより話題ツイートを一覧化しています。

  • #必要な情報コロナ 必要としている情報をtweetするときに用います
  • #困ってるコロナ 困っている情報をtweetするときに用います

試行段階なので、利用状況を見て更新して行きます。

話題のツイートを纏めたページはこちら
コロナ関連(必要な情報や困ってる情報)の話題ツイート(tweet)

必要なタグ、プラットフォームを利用したいなどは、お気軽にご連絡下さい。

他の用途でも有用な利用方法があると思います。

絵文字は大変

絵文字関連記事:UTF-8 のEmoji利用について

結論は、DBへの文字列入力時にエラーで失敗します。
文字列としてでなく、DBへ登録(バイナリなど)もできると思いますが、文字列は文字列として登録し、検索なり文字列としての処理ができる形で保存したほうが良いと思います。
やはり、文字列は削除して、DBの文字列登録は行います。

以下が、PHPで文字列を登録しようとした際に出力された、エラーコードです。

2020-02-10 07:58:33 [ERROR] SQL query error Error message: Incorrect string value: '\xF0\x9F\x92\xA1#\xE9...' for column 'who' at row 1

そして、以下が失敗したtweetです。失敗したtweet

めざましじゃんけん結果速報
【0戦目】めざましじゃんけん結果速報:
チョキ✌でした。グー✊が勝ちです。
今回の相手:

本来したかったtweet

【4戦目】めざましじゃんけん結果速報:
チョキ✌でした。グー✊が勝ちです。
今回の相手:生じゃんけん #阿部華也子 キャスター

めざましじゃんけんの対戦相手は、めざましてれび公式のtweet

明日のじゃんけんは?
【1戦目】5時58分 まちかどじゃんけん
【2戦目】6時58分 #森永悠希 さん
【3戦目】7時35分 #MANWITHAMISSION 
【4戦目】7時58分 生じゃんけん💡#阿部華也子 キャスター

PHPを利用した Emoji 絵文字を削除するコード

絵文字を削除するPHPコードとなります。

$str = preg_replace('/[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]/', '', $str);

PHP で PEAR を用いてメール送信

プログラム言語により、お作法も異なり、文字コードなど、
未だに気にすることの多い、メール送信。
今回は、PHPのPEARライブラリを用いてメール送信するコードを紹介します。

別の環境では、ローカルサーバーにSSMTPを導入し、PHPからのメール送信を実現しました。
参考URL:PHPからSSMTP経由でメール送信

PHP PEAR および Mailパッケージの導入

以下のコマンドで、php-pearとMailパッケージの導入が行なえます。

sudo apt-get install php-pear
sudo pear update-channels
sudo pear upgrade-all
sudo pear install Mail

以前にRaspberry Piへ導入時の記事を公開しているので、必要に応じて参考にして下さい。
Raspberry Pi にPHP PEARライブラリー導入

PHPコードのサンプル

以下、PHPコードのサンプルとなります。

function pear_mail($title, $message)
{
  $params = array(
 "host" => "@SMTP_Server@",
 "port" => 25
 );

 $mailObject = Mail::factory("smtp", $params);

 $recipients = "mail@mail.adress";
 $headers = array(
 "To" => "mail@mail.adress",
 "From" => mb_encode_mimeheader("差出人名") . "<from@mail.adress>",
 "Subject" => mb_encode_mimeheader($title)
 );

 $body = mb_convert_encoding($message, "ISO-2022-JP", "auto");

$mailObject->send($recipients, $headers, $body);

 if (PEAR::isError($mailObject)) {
   echo "メールを送信に失敗しました: {$title} " . $mailObject->getMessage();
 } else {
   echo "メールを送信しました: {$title}";
 }
}

 

Twitter 日本語投稿時の文字数・バイト数チェック

何度か、最大文字数を超えて、投稿エラーとなりました。
Twitterの文字数制限は、欧米のアルファベットユーザー対象に140文字から280文字となった経緯があります。
ただし、マルチバイト文字(日本など)向けのユーザーは、140文字の文字数制限のままでした。
実際には、半角文字と全角文字を組み合わせると、140文字以上の文字数が投稿出来たりできておりました。とりあえず、バイト数を数えて、280文字で投稿していたのですが、上手く行かないケースが多々ありました。

以下サイトを見て、最大文字数の確認方法を変更しました。

Twitterの最大文字数と最大バイト数の関係を調べてみた

  • 利用したいハッシュタグを配列登録 (ランダムで選択)
  • 280文字対応 (以前は、280バイト前後で考えていた)
    $max_char = 280 + $url_char - 11.5;
    URLは一律11.5文字でカウント
    投稿文全体で、280としておけば間違いないと思います。
    mb_strwidth($tweet_text) < $max_char
  • ハッシュタグの「ー(ハイフン)」を「_(アンダースコアー)」へ
  • URL1件投稿時の最大文字数対応(必要に応じてハッシュタグ部分を削減で対応)

文字数のカウントは、mb_strwidthを利用します。
mb_strwidth:半角文字は 1 として、 全角文字は 2 として数えます。

strlen  関数は単純にバイト数、mb_strlen  関数は半角・全角関わらず1文字とカウント、Twitterの特殊ルールに合わせるなら、 mb_strwidth  を使うのが確実です。

Twitterへアプリ登録

(PHPから実行時に必要となる、API Key、API Secret Key、Access Token、Access Token Secretの取得を行います

PHPからTwitterへの操作は、TwitterOAuthというライブラリを用います。

  1. Twitterへの開発者登録とApp登録
  2. TwitterOAuth導入

Twitterへの開発者登録とApp登録

Twitterの以下のURLへアクセスし、登録をすすめます。

上のURLよりサービスにログインします。

ログイン後の画面です。右上の「Create an app」をクリックします。

「Create an app」を押すと、最初に開発者アカウントへの登録へ誘導されます。

一番の開発理由を聞かれます。「Professional」これは通常ビジネス目的、「Hobbyist」趣味なので、個人利用は通常このカテゴリとおもいます。
今回は、API経由でTweet・Postを行いたいので、Making a botを選択しました。BOTの作成。

アカウント情報の確認をされました。通常問題ないと思います。

1,居住国、2.呼び名を聞かれました。それぞれ、Japanと「(適当に)mikiie」と登録しました。

アプリの説明をフリーフォーマットで記載しました。
WEB翻訳などで準備した内容を貼り付ければOKです。

追加の質問事項に回答します。
Twitter情報を分析Analyzeするか? Tweet,Retweet, Like, Followなどを実施するか?
また、フリーフォーマットで、開発対象の機能内容の記載が必要でした。

これまでに記載や選択した内容のサマリ画面が表示され、間違いがないか確認を行い、「Looks good!」を選択します。

最後に利用規約に同意し、Submit Application(申請を送信)すると、利用申請の結果がメールで届きます。

利用申請後に着信した利用申請結果メールのリンクよりアクセスすると、Welcome画面が表示されます。

開発登録者完了後に、Create an appを実施するとアプリの作成が行えます。
コールバックURLを登録する必要がありまうが、PHPが動作するサーバで問題ないとおもますので、http://127.0.0.1/と登録しておけば問題ないです。

最後に、Keys and TokensでアプリのAPI Keysを取得します。
(API Key、API Secret Key、Access Token、Access Token Secretの取得を行います

PHPからTwitterに投稿 TwitterOAuth導入

TwitterOAuth

GitHub-twitteroauth

V1.1 Source code (tar.gz)

TwitterOAuthをダウンロードし、PHPを利用したいサーバに配置します。

  1. ライブラリのダウンロード
  2. tar.gzの解凍
  3. フォルダ名の変更
$ curl -OL https://github.com/abraham/twitteroauth/archive/1.0.1.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 127 0 127 0 0 285 0 --:--:-- --:--:-- --:--:-- 294
100 714k 0 714k 0 0 475k 0 --:--:-- 0:00:01 --:--:-- 1674k

$ tar -zxvf 1.0.1.tar.gz
$ mv twitteroauth-1.0.1/ twitteroauth/

以下、一番簡単なサンプルPHPです。

<?php
require "twitteroauth/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

$consumerKey = "your consumer key";
$consumerSecret = "your consumer secret";
$accessToken = "your access token";
$accessTokenSecret = "your access token secret";

$twitter = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);

$result = $twitter->post(
        "statuses/update",
        array("status" => "Tweetテスト")
);

if($twitter->getLastHttpCode() == 200) {
    print "tweeted\n";
} else {  &nbsp; 
 &nbsp;  print "tweet failed\n";
}

Jetson Nanoからのメール送信

NVIDIA Jetson Nanoの利用を開始すると、Jetson Nanoの各種モジュールへ通知先のメールアドレスを設定することがあります。
パッケージのアップデートやログのローテーション処理時のエラーなどもメール通知することが可能です。

今回は、SSMTPをJetson Nanoに導入し、PHP経由で以前に構築したSynology SMTPを経由し、e-mailを送信できる環境の構築を行います。
SynologyでSMTP(メールサーバ)構築

ssmtpインストール

root@jetson:~# apt install ssmtp

ssmtp.confを編集。

root@jetson:~# vi /etc/ssmtp/ssmtp.conf
#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=postmaster

# The place where the mail goes. The actual machine name is required no
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=@SynologyIP@

# Where will the mail seem to come from?
rewriteDomain=miki-ie.com

# The full hostname
hostname=jetson.miki-ie.com

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

PHP構成定義ファイル(php.ini)変更

php.iniのファイルパス確認

PHPの利用するコンフィグファイルを確かめます。
コマンドラインで実行する場合は、WEBサーバで利用するコンフィグファイルは、通常異なります。

root@jetson:~# php --ini
Configuration File (php.ini) Path: /etc/php/7.2/cli
Loaded Configuration File:         /etc/php/7.2/cli/php.ini
Scan for additional .ini files in: /etc/php/7.2/cli/conf.d
Additional .ini files parsed:      /etc/php/7.2/cli/conf.d/10-mysqlnd.ini,
/etc/php/7.2/cli/conf.d/10-opcache.ini,
/etc/php/7.2/cli/conf.d/10-pdo.ini,
/etc/php/7.2/cli/conf.d/20-calendar.ini,
/etc/php/7.2/cli/conf.d/20-ctype.ini,
/etc/php/7.2/cli/conf.d/20-curl.ini,
/etc/php/7.2/cli/conf.d/20-exif.ini,
/etc/php/7.3/cli/conf.d/20-curl.ini,
/etc/php/7.3/cli/conf.d/20-dom.ini,
/etc/php/7.3/cli/conf.d/20-exif.ini,
/etc/php/7.3/cli/conf.d/20-fileinfo.ini,
/etc/php/7.3/cli/conf.d/20-ftp.ini,
/etc/php/7.3/cli/conf.d/20-gd.ini,
/etc/php/7.3/cli/conf.d/20-gettext.ini,
/etc/php/7.3/cli/conf.d/20-iconv.ini,
/etc/php/7.3/cli/conf.d/20-imap.ini,
/etc/php/7.3/cli/conf.d/20-json.ini,
/etc/php/7.3/cli/conf.d/20-mbstring.ini,
/etc/php/7.3/cli/conf.d/20-mysqli.ini,
/etc/php/7.3/cli/conf.d/20-pdo_mysql.ini,
/etc/php/7.3/cli/conf.d/20-pdo_pgsql.ini,
/etc/php/7.3/cli/conf.d/20-pgsql.ini,
/etc/php/7.3/cli/conf.d/20-phar.ini,
/etc/php/7.3/cli/conf.d/20-posix.ini,
/etc/php/7.3/cli/conf.d/20-readline.ini,
/etc/php/7.3/cli/conf.d/20-shmop.ini,
/etc/php/7.3/cli/conf.d/20-simplexml.ini,
/etc/php/7.3/cli/conf.d/20-sockets.ini,
/etc/php/7.3/cli/conf.d/20-ssh2.ini,
/etc/php/7.3/cli/conf.d/20-sysvmsg.ini,
/etc/php/7.3/cli/conf.d/20-sysvsem.ini,
/etc/php/7.3/cli/conf.d/20-sysvshm.ini,
/etc/php/7.3/cli/conf.d/20-tokenizer.ini,
/etc/php/7.3/cli/conf.d/20-wddx.ini,
/etc/php/7.3/cli/conf.d/20-xmlreader.ini,
/etc/php/7.3/cli/conf.d/20-xmlwriter.ini,
/etc/php/7.3/cli/conf.d/20-xsl.ini

コマンドライン向けPHP構成ファイルphp.iniのsendmail_pathを変更

root@jetson:~# vi /etc/php/7.2/cli/php.ini

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
sendmail_path = /usr/sbin/ssmtp -t

PHPのメール送信サンプルスクリプト

メールヘッダーにマルチバイト文字を利用する際は、mb_encode_mimeheaderを用いて、エンコーディングを行います。

php-mbstringをインストール

php-mbstringを導入していないと、エラーとなります。

PHP Fatal error: Uncaught Error: Call to undefined function mb_encode_mimeheader()

root@jetson:~# apt install php-mbstring 
<?php

function send_notice($title, $message){
$to = "kenichi.miki@gmail.com";
$headers = "From:". mb_encode_mimeheader("メール通知") ."<notice@192.168.0.108>".PHP_EOL;
if(mb_send_mail($to, $title, $message,$headers)){
echo "メールを送信しました";
} else {
echo "メールの送信に失敗しました";
}
}

send_notice("テストRaspi","メッセージテスト");
created by Rinker
NVIDIA
¥19,000 (2021/08/19 16:46:56時点 Amazon調べ-詳細)

Rapberry PiからPHPでメール送信(SSMTP経由)

PHPの利用するコンフィグファイルを確かめます。
コマンドラインで実行する場合は、WEBサーバで利用するコンフィグファイルは、通常異なります。

root@raspberrypi:~# php --ini
Configuration File (php.ini) Path: /etc/php/7.3/cli
Loaded Configuration File: /etc/php/7.3/cli/php.ini
Scan for additional .ini files in: /etc/php/7.3/cli/conf.d
Additional .ini files parsed: /etc/php/7.3/cli/conf.d/10-mysqlnd.ini,
/etc/php/7.3/cli/conf.d/10-opcache.ini,
/etc/php/7.3/cli/conf.d/10-pdo.ini,
/etc/php/7.3/cli/conf.d/15-xml.ini,
/etc/php/7.3/cli/conf.d/20-calendar.ini,
/etc/php/7.3/cli/conf.d/20-ctype.ini,
/etc/php/7.3/cli/conf.d/20-curl.ini,
/etc/php/7.3/cli/conf.d/20-dom.ini,
/etc/php/7.3/cli/conf.d/20-exif.ini,
/etc/php/7.3/cli/conf.d/20-fileinfo.ini,
/etc/php/7.3/cli/conf.d/20-ftp.ini,
/etc/php/7.3/cli/conf.d/20-gd.ini,
/etc/php/7.3/cli/conf.d/20-gettext.ini,
/etc/php/7.3/cli/conf.d/20-iconv.ini,
/etc/php/7.3/cli/conf.d/20-imap.ini,
/etc/php/7.3/cli/conf.d/20-json.ini,
/etc/php/7.3/cli/conf.d/20-mbstring.ini,
/etc/php/7.3/cli/conf.d/20-mysqli.ini,
/etc/php/7.3/cli/conf.d/20-pdo_mysql.ini,
/etc/php/7.3/cli/conf.d/20-pdo_pgsql.ini,
/etc/php/7.3/cli/conf.d/20-pgsql.ini,
/etc/php/7.3/cli/conf.d/20-phar.ini,
/etc/php/7.3/cli/conf.d/20-posix.ini,
/etc/php/7.3/cli/conf.d/20-readline.ini,
/etc/php/7.3/cli/conf.d/20-shmop.ini,
/etc/php/7.3/cli/conf.d/20-simplexml.ini,
/etc/php/7.3/cli/conf.d/20-sockets.ini,
/etc/php/7.3/cli/conf.d/20-ssh2.ini,
/etc/php/7.3/cli/conf.d/20-sysvmsg.ini,
/etc/php/7.3/cli/conf.d/20-sysvsem.ini,
/etc/php/7.3/cli/conf.d/20-sysvshm.ini,
/etc/php/7.3/cli/conf.d/20-tokenizer.ini,
/etc/php/7.3/cli/conf.d/20-wddx.ini,
/etc/php/7.3/cli/conf.d/20-xmlreader.ini,
/etc/php/7.3/cli/conf.d/20-xmlwriter.ini,
/etc/php/7.3/cli/conf.d/20-xsl.ini

コマンドライン向けPHP構成ファイルphp.iniのsendmail_pathを変更

root@raspberrypi:~# vi /etc/php/7.3/cli/php.ini

; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
;sendmail_path =
sendmail_path = /usr/sbin/ssmtp -t

PHPのメール送信サンプルスクリプト

メールヘッダーにマルチバイト文字を利用する際は、mb_encode_mimeheaderを用いて、エンコーディングを行います。

<?php

function send_notice($title, $message){
$to = "kenichi.miki@gmail.com";
$headers = "From:". mb_encode_mimeheader("メール通知") ."<notice@192.168.0.108>".PHP_EOL;
if(mb_send_mail($to, $title, $message,$headers)){
echo "メールを送信しました";
} else {
echo "メールの送信に失敗しました";
}
}

send_notice("テストRaspi","メッセージテスト");

SSMTP利用時のFromアドレス

SSMTPの設定によって、メールを送付するプログラムで指定したFromアドレスが無効化されます。プログラムで指定したFromアドレスを有効化するために、ssmtp.confの設定を確認します。

@raspberrypi:~/cronScript $ sudo vi /etc/ssmtp/ssmtp.conf

#
# Config file for sSMTP sendmail
#


(省略)

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

テレビの電源オンオフ

他のリモコン操作の家電も同様ですが、現在の状態把握が難しいです。NatureRemoで電源オンとスケジュールしていても、実際は、電源ボタンを押すのみで、電源が消えていれば、電源ボタン操作で電源がオンとなりますが、電源オン状態であれば、電源操作により電源オフ状態と期待通りになりません。

HDMI接続によるCEC(Consumer Electronics Control)

結構盲点でした、物理的にテレビに接続し、制御可能なデバイスが既に導入されていたとは。Raspberry PiのHDMI端子を活用し、テレビのON/OFF(STANDBY)変更操作となります。電源のON/OFF(STANDBY)状況を確認することも可能です。

HDMIのCEC(Consumer Electronics Control)は、機器間を制御するリンク機能となり、SONYだとブラビアリンク、東芝だとレグザリンク、パナソニックだとビエラリンク、SHARPだとAQUOSファミリンクとなります。

cec-utilsインストール

@raspberrypi:~ $ sudo apt-get update
@raspberrypi:~ $ sudo apt-get upgrade -y
@raspberrypi:~ $ sudo apt-get install cec-utils -y

Raspberry Piの電源起動時に、TVの入力が切り替わったり、TVの電源が入らないよいうに、boot/config.txthdmi_ignore_cec_init=1を追記します。

@raspberrypi:~ $ vi /boot/config.txt
@raspberrypi:~ $ sudo vi /boot/config.txt
@raspberrypi:~ $ tail /boot/config.txt
#dtoverlay=vc4-fkms-v3d

# NOOBS Auto-generated Settings:
hdmi_force_hotplug=1
start_x=1
gpu_mem=128

#add
hdmi_ignore_cec_init=1

cec-utilsコマンド実行

状態確認:sudo cec-client -l

HDMIケーブル未接続時

@raspberrypi:~ $ sudo cec-client -l
libCEC version: 4.0.4, compiled on Linux-4.15.0-48-generic ... , features: P8_USB, DRM, P8_detect, randr, RPi, Exynos, AOCEC
Found devices: NONE

HDMIケーブル接続時

@raspberrypi:~ $ sudo cec-client -l
libCEC version: 4.0.4, compiled on Linux-4.15.0-48-generic ... , features: P8_USB, DRM, P8_detect, randr, RPi, Exynos, AOCEC
Found devices: 1

device: 1
com port: RPI
vendor id: 2708
product id: 1001
firmware version: 1
type: Raspberry Pi

TV電源ON:echo 'on 0' | cec-client -s

アクセス権によりコマンド失敗

@raspberrypi:~ $ echo 'standby 0' | cec-client -s
* failed to open vchiq instance

アクセス権を変更変更

@raspberrypi:~ $ ls -al /dev/vchiq
crw-rw---- 1 root video 243, 0 8月 18 09:38 /dev/vchiq
@raspberrypi:~ $ sudo chmod 666 /dev/vchiq
@raspberrypi:~ $ ls -al /dev/vchiq
crw-rw-rw- 1 root video 243, 0 8月 18 09:38 /dev/vchiq

tvserviceが起動していてコマンド失敗

tvservice --offが必要

TV電源OFF:echo 'standby 0' | cec-client -s

PHPから実行

function tv_on_HDMI()
{
    exec("echo 'on 0' | cec-client -s -d", $output, $result);

    if ($result) {
        echo "echo 'on 0' | cec-client -s 成功", PHP_EOL;
    } else {
        echo "echo 'on 0' | cec-client -s 失敗", PHP_EOL;
        echo implode(PHP_EOL, $output);
	}
    return $result;
}

function tv_off_HDMI()
{
    exec("echo 'standby 0' | cec-client -s", $output, $result);

    if ($result) {
        echo "echo 'standby 0' | cec-client -s 成功", PHP_EOL;
    } else {
        echo "echo 'standby 0' | cec-client -s 失敗", PHP_EOL;
        echo implode(PHP_EOL, $output);
	}
    return $result;
}

tv_on_HDMI();
tv_off_HDMI();

参考にさせて頂いたサイト

Raspberry PiとテレビをHDMI接続してテレビのON/OFFを確認する

RaspberryPi コマンドでテレビ電源をオンオフする(cec制御)echo 'on 0' | cec-client -s

SynologyのphpMyAdminセッションタイムアウト変更

phpMyAdminの設定ファイル「config.inc.php」を変更します。
具体的には、「config.inc.php」の最終行に、設定したいタイムアウト値を秒指定で登録します。
$cfg['LoginCookieValidity'] = 86400; //タイムアウト24時間と設定する場合

@Synology:~$ sudo vi /volume1/web/phpMyAdmin/config.inc.php
Password:
@Synology:~$ tail /volume1/web/phpMyAdmin/config.inc.php
* default = 'ask'
*/
//$cfg['SendErrorReports'] = 'always';

/**
* You can find more configuration options in the documentation
* in the doc/ folder or at <https://docs.phpmyadmin.net/>.
*/
$cfg['LoginCookieValidity'] = 86400; //24時間

電源状態確認(PING実行)

システム起動前に各機器の電源状況を確認します。
PING以外も考えられましたが、やはり枯れている定石なやり方が一番でした。
ちなみに、システム稼働後の電源OFF時にも電源状態確認後に、電源OFFを実施しています。

対象機器は、TVとWindowsのメインPCとなります。

PHPによるPING実行

以下ソースコードです。
PHPコマンドオプション「-c」「-n」の繰り返し回数指定がOSにより異なるので、実行環境に合ったコマンドオプションに変更。

define("WINDOWS_MAC","xx:xx:xx:xx:xx:xx");
define('PING_OPTION', [
    'Linux' => '-c',    // linux
    'Darwin' => '-c',   // macOS
    'WINNT' => '-n',    // windows
]);

function ping($host, $count = 1){
    $option = PING_OPTION[PHP_OS];
    exec("ping {$option} {$count} {$host}", $output, $result);

    if ($result) {
        echo 'ping 失敗', PHP_EOL;
        echo implode(PHP_EOL, $output);
    } else {
        echo 'ping 成功', PHP_EOL;
	}
    return $result;
}

function WakeupPC($MAC) {
	logger("Start powerOn","INFO");
	$cmd = 'sudo /usr/sbin/etherwake '.$MAC;
	$output =  shell_exec($cmd);
}

if(ping(WINDOWS_IP)){  //Windows OFF
	//WINDOWS power on
	WakeupPC(WINDOWS_MAC);
	sleep(60);
}else{ //Windows ON
	//電源ON時の処理 
}

参考にさせて頂いたサイト