お遊びTech

ITで遊んでみたり、ガジェットで遊んでみたり。その遊びは様々な効果があるかもしれません。

Surface Pro 5にWindows11をインストール

WIndows11をインストールするのに必要な要件は、以下のようになっています。
www.microsoft.com

第7世代のCPUも一部緩和されたのですが、残念ながらSurface Pro 5の第7世代CPUは2021年10月現在非対応になっています。
ですが、タブレット利用としても最適化されているWindows11をインストールしたいということでその実施方法となります。


方法は以下に公式で記載がありまして、レジストリに値を追加してインストーラーを進める形になります。
公式に記載されているとはいえ、自己責任になります。
support.microsoft.com

インストール方法

自己責任となりますのでご注意ください。
レジストリエディタを開き以下の値を追加します。

レジストリキー HKEY_LOCAL_MACHINE\SYSTEM\Setup\MoSetup
名前 AllowUpgradesWithUnsupportedTPMOrCPU
種類 REG_DWORD
値 1

あとは、Windows11のISOからセットアップを実行するだけになります。
途中以下のようなメッセージがでてきますので承諾を押して進めます。
ちゃんとインストール方法もこのようなメニューも用意されているところがMicrosoftさんのありがたいところです。
ただし、記載の通り本当に更新プログラムが受け取れなくなったらきっと戻すと思います。

f:id:kleonids:20211008051644p:plain


インストール自体は1時間くらいかかりました。
すごく良い感じで動いています。

モバイルディスプレイ EVP-301レビュー

Geoyeao EVP-301という15.6インチモバイルディスプレイのレビューです。


モバイルディスプレイを選ぶ際に以下のような機能が求められます。
・適応したサイズ: 13.3、15.6など
・Full HD以上
・スタンドできること
・軽さ、大きさ
・USB-TypeC映像 x1、USB-TypeC給電x1 、HDMI x1 以上
・スピーカー有無、音質
・USB-Type-C , HDMIの切り替えが比較的容易であること
・タッチパネル機能
・ペンなどでスタンドできること
・VESA対応
・グレアかノングレア
・sRGB色域、視野角
・iPhoneダイレクト接続(あまりない)

今回外出先の利用ではなくセカンドディスプレイとして利用するために、
VESA対応を求めて、結局EVP-301にしました。
もちろん外出先でも利用することは想定されるためどちらでも利用できることが必要です。

EVP-301の仕様

Geoyeao EVP-301の仕様は以下の通りです。
中国製モバイルディスプレイにありがちな、時折細かい仕様が急に変わっていたりするので
都度最新情報を入手してください。
・サイズ:15.6インチ フルHD(1920x1080)
・入力:USB Type-Cx1 、miniHDMI
・電源供給: USB Type-Cx1
・その他I/f: microUSB(OTG 用 スマホ等でKeyboad/mouseを接続)
       3.5mmヘッドホンポート
・カバースタンドあり(本体へ専用のねじで止めるタイプ)
・スタンディング用ペン穴あり
・タッチパネルはなし




f:id:kleonids:20210829155220p:plain
中身は以下が入っていました。
・EVP-301本体
・カバー兼スタンド
・取扱説明書、クイック操作ガイド
・USB-TypeC - TYPECケーブル映像出力用 x 1
・USB-TypeC - Type-A給電用 x 1
・HDMI - miniHDMI 映像出力用 x 1
・USB-TypeC - AC 電源アダプタ
・HDMI - MiniDMI変換アダプタ x 1

VESAスタンドへの取付

f:id:kleonids:20210829160121p:plain
取り付けはVESAにて!
としたかったのですが、、私のモニタスタンドとVESA取付穴の場所の関係上
取り付け後に結構低くなってしまい、結果以下のようなVESA対応のディスプレイホルダ(サンワサプライ CR-LATAB20BK)を使うことにしました。
なお、もう2つ付いている外側の穴は付属スタンドのねじになります。付属スタンドはねじ止めで、ケースに少しねじが飛び出ているため
気にする方もいるかもしれません。

そのディスプレイホルダの取付はVESA用のねじ(’M4x10)でよいのですが、(本当は直取付で)取り外ししやすいように、
手で取り外しできるねじにしました。なお直取付の場合、EVP-301にはM4x10だと長すぎるのようなのでご注意ください。




画面表示

f:id:kleonids:20210829155739p:plain
色は綺麗というほどでもないのですが、通常利用においては問題ないようです。
今回サブディスプレイなので特に気にしません。

設定

f:id:kleonids:20210829163151p:plain
設定メニューはボタンを使って操作します。
左から、「MENU、+、-」ですが若干操作方法が特殊で
「MENU」押してからメニューがでますが、その後は「MENU」は確定ボタンとなり、
戻るには、「-」を少し長押しします


f:id:kleonids:20210829163252p:plain
f:id:kleonids:20210829163329p:plain
いくつかのメニューがあります。


f:id:kleonids:20210829161456p:plain
f:id:kleonids:20210829161510p:plain
一部マニュアルに書いて無さそうなのですが、追加で以下の操作も可能です。
・「MENU」長押し:電源断
・メニュー開いていないときに「-」短押し:入力の切り替え
・メニュー開いていないときに「+」短押し:音量変更 ※記載アリ
・メニュー開いていないときに「-」長押し:Information表示
・メニュー開いていないときに「+」短押し:明るさ変更 ※記載アリ

まとめ

EVP-301は他のモバイルディスプレイと比べても安価でしたが、メニューもクイックメニューがあり(特殊ながら)操作性もよかったです。
普段使いのサブディスプレイもしくはモバイルディスプレイとしては使いやすいのではないかと思います。

Nature RemoのセンサーデータをLineに通知

前回に引き続き、今度はNatureRemoで取得した値の閾値を設けて必要に応じてLineに通知するようにします。


LineAPIトークン取得

こちらからLineのAPIを取得します。
https://notify-bot.line.me/ja/

f:id:kleonids:20210828125310p:plain


curにてテストします。

curl -X POST -H "Authorization: Bearer 取得したToken" -F "message=ABC" https://notify-api.line.me/api/notify
{"status":200,"message":"ok"
スクリプトに反映

前回作成したスクリプトに追記して通知できるようにします。

import requests
import json

def main():
  remoheaders = {
    'Accept' : 'application/json',
    'Authorization' : 'Bearer [トークン]'
  }
  try:
    res= requests.get('https://api.nature.global/1/devices', headers=remoheaders)
    res.raise_for_status()
    remodata = json.loads(res.text)
    #print(remodata[0])
    hu = remodata[0]['newest_events']['hu']['val']
    il = remodata[0]['newest_events']['il']['val']
    mo = remodata[0]['newest_events']['mo']['val']
    te = remodata[0]['newest_events']['te']['val']
    print('humidity:' + str(hu) + ' illminance:' + str(il) + ' motion:' + str(mo) + ' temperature:' + str(te))
  except requests.exceptions.RequestException as e:
    print("APIエラー: ",e)
    hu='nodata'
    il='nodata'
    mo='nodata'
    te='nodata'

#ここから追加
  lineheaders = {
    'Content-Type' : 'application/x-www-form-urlencoded;charset=UTF-8',
    'Authorization' : 'Bearer [トークン]'
  }

  if type(te) is str or type(hu) is str:
     msg = '\nNatureRemoのデータが取得できませんでした'
     payload = {'message': msg}
     lineres = requests.post('https://notify-api.line.me/api/notify',headers=lineheaders,
       data=payload)
     #print(lineres.text)
  else:
    if te > 29 or hu < 40:
      # 文頭に[bot]が入るため改行
      msg = '\nリビングアラート(29.0度以上40%以下)\n温度:' + str(te) + ' 湿度: ' + str(hu)
      payload = {'message': msg}
      #print(msg)
      lineres = requests.post('https://notify-api.line.me/api/notify',headers=lineheaders,
         data=payload)
      #print(lineres.text)


if __name__ == "__main__":
  main()
Lineで結果を確認

スクリプトの値を一時的に修正して確認します。

    if te > 20 or hu < 40:

スクリプトを実行しLineに通知が届けば成功です。
スクリプトの実行はCactiが実行してくれるため特に何も行いません。

Nature RemoのセンサーデータをCactiでグラフ化

Nature Remoで取得できるセンサー情報をCactiでグラフ化します。

Nature Remoで取得可能なセンサー情報

Nature RemoではCloud API及び、Local APIが用意されており、Cloud APIにて以下のようなNature Remo本体のセンサー情報を取得することができます。

・hu : 湿度(%)
・il: 照度:独自の値(以下トリガーで定義されている値より)
 暗い:1-50
 薄暗い: 51-127
 薄明るい:128-205
 明るい:206-255
・mo: 人感(常に1。反応した際にcreated_atの日時が更新される)
・te: 温度(度)

 

このうち、hu, il, teをCactiにてグラフ化します。取得用のスクリプトはpythonにて実施します。

その他、NatureRemoAPIの認証や制限などこちらをご参照ください。
https://developer.nature.global/

 

Nature Remo APIの取得

アクセストークンを取得します。
https://home.nature.global/
f:id:kleonids:20210828103610p:plain


アクセストークンは再度表示されないのでメモしておきます。
第三者に家電など操作されてしまうため、外部に漏れないように注意してください。

curlにてテストしてみます。上記温度などのデータが取得できているはずです。

curl -X GET "https://api.nature.global/1/devices" -H "accept: application/json" -H "Authorization: Bearer 取得したアクセストークン"

 

Cactiでスクリプトを実行
/usr/share/cacti/scriptsなどcactiのスクリプトを置くディレクトリに以下のpythonコードを置きます。 

import requests
import json

def main():
  remoheaders = {
    'Accept' : 'application/json',
    'Authorization' : 'Bearer [トークン]'
  }
  try:
    res= requests.get('https://api.nature.global/1/devices', headers=remoheaders)
    res.raise_for_status()
    remodata = json.loads(res.text)
    #print(remodata[0])
    hu = remodata[0]['newest_events']['hu']['val']
    il = remodata[0]['newest_events']['il']['val']
    mo = remodata[0]['newest_events']['mo']['val']
    te = remodata[0]['newest_events']['te']['val']
    print('humidity:' + str(hu) + ' illminance:' + str(il) + ' motion:' + str(mo) + ' temperature:' + str(te))
  except requests.exceptions.RequestException as e:
    print("APIエラー: ",e)
    hu='nodata'
    il='nodata'
    mo='nodata'
    te='nodata'


if __name__ == "__main__":
  main()


スクリプトを配置します。

# cd /usr/share/cacti/scripts
# vi nature-remo-api.py
# chown cacti実行アカウント.  nature-remo-api.py
# chmod 755 nature-remo.api.py


テストしてみます。

# python3 nature-remo-api.py
humidity:59 illminance:245 motion:1 temperature:24.3

 

Cactiの設定

スクリプトを実行するデータ入力を作成します。
f:id:kleonids:20210828115015p:plain


データソースを作成します。アイテムは3つ作ります。
f:id:kleonids:20210828115207p:plain

f:id:kleonids:20210828115241p:plain

f:id:kleonids:20210828115256p:plain


NatureRemoのデバイスを作成します。
f:id:kleonids:20210828115344p:plain

f:id:kleonids:20210828115403p:plain


ツリーに配置します。
f:id:kleonids:20210828115513p:plain

グラフの表示

 一定時間待つと、無事グラフが作成されました。
f:id:kleonids:20210828115556p:plain


なお、NatureRemoとNatureRemo miniというものがありますが、Miniは温度のみしか取得できないため
ご注意ください。