とある実験のーと

趣味ブログ

web認証しないとネットに繋がらない環境でのwindows 11初期設定

会社等でネットに繋ぐ際、会社独自のウェブ認証の通過が必須になっていることがあると思う。

そのような環境下でWindows初期設定が完了できない事象に直面した。初期設定画面においてはウェブブラウザに(一見)アクセスできないので、認証できずネットに繋げない。 wifiなどで一時的にデザリングなどが使えればいいが、デスクトップPCなどで有線LAN環境しかない場合、詰むことが分かった。

それを回避したので残しておく。

  1. 初期設定画面でコマンドプロントを開く  ネットに繋がっていない場合、ネット接続を促す画面から先に進めなくなっている。  どの画面でも構わないのだが、shift + F10でコマンドプロントが立ち上がる

  2. Edgeをコマンドプロントから起動する 以下のコマンドを入力し、チェンジディレクトリ (cd) でEdgeがあるフォルダに移動する。

cd C:\Program Files (x86)\Microsoft\Edge\Application\

移動後、

msedge.exe

を入力し実行することで、Edgeが起動し、ウェブ認証が可能となる。

認証が通ったらインターネットに接続できる様になり、初期設定が次の段階にすすむはず。

Fusion360個人アカウント(無償)での収益額に関して1000ドル以下OKの回答もらった

BOOTHで自分用に作った物を少し出しているが、その際ちょっと気になっていたのが、今使っているFusion360での個人アカウントの扱い。2020年に規約も改訂されていた覚えがある。

現状ほとんど売れてないが、今後も考えて最悪どこかの時点でCADソフトの変更もしなければならないのかなぁと考えていた。

サイトのアカウントの説明を見ると、個人アカウントの商業利用は全く駄目な印象をうける。 一方で、スタートアップと名乗るには程遠い。 以下のフォーラムの回答が公式見解っぽいが、2020年なので若干情報が古くこれを盲信するには少し怖い。そしてなんか問い合わせ側の日本の記述が不思議・・・。

forums.autodesk.com

X(Twitter)でも意見が色々あるので、モヤモヤを解消するために、向こうの手間も顧みずチャットでAutodeskに問い合わせてみた。(申し訳ありません)

直ぐには回答来ず、内容を精査して後日メールで返信するとのこと。

以下のメールをいただいた。

個人用 Fusion 360 (Fusion 360 for personal use) は、自宅で非商用目的のプロジェクトを行う場合に限り、無償で基本機能にアクセスできる機能制限版です。年間総収益が ¥145 336 未満の個人ユーザーを対象とします。

要は10万円程度だったら趣味の範囲でしょ、それ以上ならサブスクアカウントに格上げしてね。ってことらしい。

10万円なんて程遠いので、この配慮は大変有り難い。 一生ついていきます。Autodeskさん。

公式サイトにはこの記述がないのを見ると、あんまり公には言いたくないのかな・・・。 アカウント問題は最悪訴訟に発展するから明記しておいて欲しいところではあるが。

Arduino MKR WiFi 1010で18650 Li-ion電池を使ってみる (その1)

Arduino MKR シリーズ(WiFI1010, WiFi1000, MAN1310あたり)にはシングルセル 3.7V Li-Poバッテリーの充電管理チップ( BQ24195L)が付いており、Li-Poバッテリーの充放電ができるようになっている。

WiFi越しのArduino IoT Cloudの利用でバッテリーがどのぐらい実用範囲なのか最終的に確かめたく、まずは導入を試みた。

基板にはJST PHのメスコネクタが設置されており BQ24195L の設定をいじるライブラリも公開されている。 docs.arduino.cc

Li-Poバッテリーは費用対容量的に若干高価でハンドリング性も微妙なので、公式チュートリアルに並列で書かれていたLi-ion (18650) 電池で試してみた。

使用したバッテリーはKEEPPOWERの18650電池である。不意に発火したら嫌なので保護回路付、日本の代理店が扱っている信頼できそうなものをチョイスした。


バッテリーボックスの設計

保護回路付きの18650電池は少し背が高いらしく、Amazonなどで売ってる18650用の電池ボックスでははまらないらしい・・・。よって電池ボックスから作った。

作ったものはBOOTHに置いているので、もし興味があれば・・・。

azospilab.booth.pm

保護回路付18650 Li-ion電池用電池ホルダー (3Dデータ) - あぞすぴラボ - BOOTH

売ってる線付きコネクタによっては、プラス側に黒線が来てるものがあるようでコネクタの極性を間違わないように要要チェック。。。ボードをUSBコネクタが右側に来るように置いて上から見たとき、JST-PHコネクタの右側が+, 左側が−。 コネクタ付きも一応BOOTHに置いておきました。

設定

公式チュートリアルのコードをコピペして18650電池の充電用にパラメータを少し改変。

float batteryFullVoltage = 4.2;
float batteryEmptyVoltage = 3.0;
float batteryCapacity = 3.5; //Ah
//(中略)
PMIC.setChargeCurrent(0.5); // 500mA

FullVoltageはバッテリーの充電電圧のようなので、専用充電器の仕様に従って4.2Vに設定した。PMIC.setChargeCurrentは、デフォルト値ではbatteryCapacityの1/2で設定されている。しかし、Li-ion電池は高い電流で充電するとバッテリーが劣化するらしいので、専用充電器の設定にもあるように最大(高速充電)で1A, 常用で500 mAが良いのではないかと考え、今回は0.5に設定した。

EmptyVoltageに関しては正直これで良いのかはっきりしない。下記のように後段でのコードでFullVoltageとEmptyVoltageの値を用いてバッテリーの充電レベルを%で表示する計算を行っている。

int new_batt = (voltBat - batteryEmptyVoltage) * (100) / (batteryFullVoltage - batteryEmptyVoltage); //Battery levelの計算

18650電池の仕様では2.8Vぐらいまで低下するらしいが、3.3Vを下回ってもArduino自体が動くのか定かではないので、いまのところ一応、3.0Vとした。

PMIC.enableCharge();

これを

PMIC.disableCharge();

とすると、充電機能が停止して現時点の電池電圧をモニタ出来るらしい。

モニタリング

まずは専用充電器で満充電(4.2V)した電池を付けて、デモコードでモニタリングしてみた。

このままだとマルチメータで4.18Vの電池電圧が3.98Vに表示されるため、シリアル通信に出力される値が明らかにおかしい。ここで回路図からの計算式を見直してみた。

https://docs.arduino.cc/static/15d3e938fbfc2e3cc7a03a4f7d1e2188/29114/voltage-divider-samd21.png

MKR WiFi 1010での回路図 (引用)

MKRシリーズはADCのマックスが3.3Vなので、電池の4.2Vは直接測定できない。よって既知抵抗を挟んで電圧を下げてから測定することになるが、回路上にはR1として330kΩ, R2として1MΩが載っており、R2の部分の電圧をPB09で測定しているらしい。計算式を見てみる。

 max_Source_voltage = (3.3 * (R1 + R2))/R2;
//(中略)
rawADC = analogRead(ADC_BATTERY);
 voltADC = rawADC * (3.3/4095.0);
 voltBat = voltADC * (max_Source_voltage/3.3);
 int new_batt = (voltBat - batteryEmptyVoltage) * (100) / (batteryFullVoltage - batteryEmptyVoltage);

まず、,max_Source_voltageでVBattにかけて測定出来る最大電圧値を求めている。PB09で測れる電圧最大値が3.3Vなので、max_Source_voltage = 4.389 V

つぎにrawADCでPB09の電圧値をアナログ値で読み取り、voltADCでPB09の電圧値に変換している。12bit(4095)で3.3Vを表現するので、ここも間違ってなさそう。 最後にvoltBat(問題の値)を算出するが、ここの式がおかしい?

VoltADCは既にPB09地点の電圧値なので、これに((R1+R2)/R2)を掛ければVsource(所謂電池の電圧値)は求まるはずである。というか、max_Source_voltageの計算式を見ると同じ意味・・・。あれ?

原因は、max_Source_voltageをint型にしていたために "4.389" が "4" と丸められてたためだった。なので冒頭で

  float max_Source_voltage;

とすれば解決した。本家のGithubにも修正を提案しておきました。この修正で4.36Vと出たのでマルチメータと0.18Vぐらいのズレだが、モニタリングには問題無いかと思う。

何かと時間がかかってしまったので、一先ず、今日はここまですみません・・・。

バッテリーでの駆動や、充電状況などモニタリングできたらまた報告します。

Arduino MKR WiFi 1010(WiFININAライブラリ)で時間取得

時間取得はNTPCliant.hライブラリを用いてNTPサーバーにアクセスし取得するのが一般的だが、MKR WiFi 1010に積んでるモジュールからシンプルに時間を取得できる。コードがとても簡素化できる。WiFiに接続するときはCurrent Time情報が必要とのことで、WiFiモジュールはその情報を保持していてそれを引っ張ってこれるらしい。

reference.arduino.cc

下にコード全文を載せているが、至ってシンプルで

  • WiFiNINAライブラリのWiFi.getTime()関数を呼び、それに日本の時差(9時間分)を加算するだけ

である。余計なライブラリは必要無し。

//Time
 unsigned long epochTimeWiFi =WiFi.getTime()+3600*9; //時差9時間分をエポック秒にプラス

あとの、エポック秒から日時フォーマットへの変更は以下のブログのコードを拝借しました。

NTPサーバーに繋いで時間も取得してみましたが、全く同じ値だったのでまず問題無いかと思います。

終わり。

101010.fun

#include <SPI.h>
#include <WiFiNINA.h>

#include "arduino_secrets.h" 
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0;                                // your network key index number
int status = WL_IDLE_STATUS;                     // the WiFi radio's status


void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    Serial.println("Please upgrade the firmware");
  }

  // attempt to connect to WiFi network:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WEP network, SSID: ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, keyIndex, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }
  // once you are connected :
  Serial.print("You're connected to the network");
  printCurrentNet();
  printWifiData();

}

void loop() {
  // check the network connection once every 10 seconds:
  delay(5000);

//Time
 unsigned long epochTimeWiFi =WiFi.getTime()+3600*9; //時差9時間分をエポックタイムにプラス
 String formattedDateWiFi=getFormattedDate(epochTimeWiFi);

   Serial.print(epochTimeWiFi);
    Serial.print("  ");
    Serial.println(formattedDateWiFi);

}

void printWifiData() {
  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
  Serial.println(ip);

  // print your MAC address:
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  printMacAddress(mac);
}

void printCurrentNet() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print the MAC address of the router you're attached to:
  byte bssid[6];
  WiFi.BSSID(bssid);
  Serial.print("BSSID: ");
  printMacAddress(bssid);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.println(rssi);

  // print the encryption type:
  byte encryption = WiFi.encryptionType();
  Serial.print("Encryption Type:");
  Serial.println(encryption, HEX);
  Serial.println();
}

void printMacAddress(byte mac[]) {
  for (int i = 5; i >= 0; i--) {
    if (mac[i] < 16) {
      Serial.print("0");
    }
    Serial.print(mac[i], HEX);
    if (i > 0) {
      Serial.print(":");
    }
  }
  Serial.println();
}

/**
 *エポックタイムを元に現在時刻を整形して返す(ex: 2022-10-31T19:00:48Z)
 *
 */
String getFormattedTime(unsigned long secs) {
    unsigned long rawTime = secs;
    unsigned long hours = (rawTime % 86400L) / 3600;
    String hoursStr = hours < 10 ? "0" + String(hours) : String(hours);

    unsigned long minutes = (rawTime % 3600) / 60;
    String minuteStr = minutes < 10 ? "0" + String(minutes) : String(minutes);

    unsigned long seconds = rawTime % 60;
    String secondStr = seconds < 10 ? "0" + String(seconds) : String(seconds);

    return hoursStr + ":" + minuteStr + ":" + secondStr;
}

String getFormattedDate(unsigned long secs) {
  #define LEAP_YEAR(Y) ((Y > 0) && !(Y % 4) && ((Y % 100) || !(Y % 400)))
    unsigned long rawTime = secs / 86400L;  // in days
    unsigned long days = 0, year = 1970;
    uint8_t month;
    static const uint8_t monthDays[] = {31, 28, 31, 30, 31, 30,
                                        31, 31, 30, 31, 30, 31};

    while ((days += (LEAP_YEAR(year) ? 366 : 365)) <= rawTime) year++;
    rawTime -=
        days - (LEAP_YEAR(year)
                    ? 366
                    : 365);  // now it is days in this year, starting at 0
    days = 0;
    for (month = 0; month < 12; month++) {
        uint8_t monthLength;
        if (month == 1) {  // february
            monthLength = LEAP_YEAR(year) ? 29 : 28;
        } else {
            monthLength = monthDays[month];
        }
        if (rawTime < monthLength) break;
        rawTime -= monthLength;
    }
    String monthStr =
        ++month < 10 ? "0" + String(month) : String(month);  // jan is month 1
    String dayStr = ++rawTime < 10 ? "0" + String(rawTime)
                                   : String(rawTime);  // day of month
    return String(year) + "-" + monthStr + "-" + dayStr + "T" +
           getFormattedTime(secs) + "Z";
}

Arduino MKR WiFi 1010でGoogleサーバ(GAS)対してSSL通信するのにつまずいたのでメモ

Arduino MKR WiFi 1010はWiFi経由でArduino cloudに簡単に繋がるが、Arduiono cloudは課金しないとデータが1日で消えてしまう。

バックアップとしてデータをGoogle spread sheetにもポストしておきたいと思い、Google Apps Script(GAS)経由でスプレッドシートに入れる方法を採用した。

Google spread sheet側の設定は他の方々の設定どおりなのでそちらを参照していただきたい。

ここに初めてたどり着く人は居ないと思うが、念の為簡単に仕組みを説明すると、Google spread sheetに紐付いたGASのURLにデータを付加してGetすることでスプレッドシートに自動的に書き込まれるというものだ。このURLをArduinoで呼ばないと(Getしないと)いけない。

Googleスプレッドシートをウェブアプリ化してシートにネット経由でデータを書き込めるようにしたので、MQTTでパブリッシュしているデータをシートに蓄積するためのデータ転送プログラムも作った。その1 - 知的好奇心 for IoT

【arduino_IDE】googlesheetに書き込んでみた | ラズベリーパン

ESP32からGoogleスプレッドシートにデータを送信する! | DIY × 農業日記

ESP32のライブラリがMKRシリーズでは利用できない

皆が主に報告しているのはESP32を搭載したボードで、そこではあまり苦労なくURLをGet出来ているようだった。

一方で今回用いるMKR WiFi1010は載っているWiFiモジュール等が異なるためESP32で使われてるライブラリ(WiFiClientSecure)が使えないらしい・・・。

最初、ArduinoHttpCliant.h ライブラリを用いてhttp.get (URL)を行おうと思ったがサーバに接続される気配がなかった。

よくよく調べてみると、GoogleへのアクセスはSSL接続が必須であり、ArduinoからURLにアクセスしてもhttpsにリダイレクト等はされないとのことだった(どこか海外サイトに書いてた)。ArduinoHttpCliantはMKRシリーズに最適化されているらしいがSSL接続はできないのか・・・?私の確認不足かもしれない。

ライブラリを探す放浪の旅、そして結局WiFiNINA.hのサンプルコードで出来た・・・

次に試したのは ArduinoBearSSL.h 。BearSSLをArduinoに最適化したものでArduino MKR ZEROでSSL通信に使えるとの報告があり。ただ、これまた私の技量不足がたたって、サンプルコードでwww.google.comに接続出来ず・・・。

iw-circuitdesign.net

このボードが近年出たものだからか、海外でもあまり報告が見当たらず(出来ないという報告はある・・・)、とりあえず周辺のライブラリのサンプルコードを眺めてた。

WiFiNiNA.hのサンプルコード群に"WiFiSSLClient"の記載があることが分かったので、こちらを適応してみたところSSL通信でGoogleと通信出来たことを確認!

WiFiNiNA.hはMKR WiFi 1010でWiFiを利用するために読み込む最も基本的なライブラリ。

ポイントとしては

  • cliantとして "WiFiCliant"ではなく、"WiFiSSLClient client"を定義する。

  • ポートとして "80"ではなく"443"を指定。

*GET等の書式が他のライブラリと異なる。

以下にサンプルコードを記載する。ベースはサンプルコードのままだが、日本語でコメントしている部分は私のメモ。 通信が上手くいかないと、"disconnectiong from server" を吐く。

/*
  This example creates a client object that connects and transfers
  data using always SSL.
  It is compatible with the methods normally related to plain
  connections, like client.connect(host, port).
  Written by Arturo Guadalupi
  last revision November 2015
*/

#include <SPI.h>
#include <WiFiNINA.h>
#include <NTPClient.h>

char ssid[] = "******"; //  your network SSID (name)自分のWiFi環境
char pass[] = "******";    // your network password (use for WPA, or use as key for WEP)自分のWiFi環境
int keyIndex = 0;            // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)
const char* server = "www.google.com";    // name address for Google (using DNS)

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
WiFiSSLClient client;  //ここがポイント?

//**ここはwifi経由で標準時間を取得した名残、結局今回は特に時刻会わせ関係無くSSL通信が出来たので不要****
  WiFiUDP udp;
  NTPClient ntp(udp, "ntp.nict.jp", 0, 1000);  // udp, ServerName, timeOffset, updateInterval
  unsigned long getCurrentTime() {
  WiFiUDP udp;
  NTPClient ntpClient(udp);
  // Set the NTP server and adjust for your timezone offset if needed
  ntpClient.begin();
  ntpClient.setTimeOffset(0); // Example: Adjust time offset for GMT+0
  // Fetch the current time from the NTP server
  ntpClient.update();
  // Get the current UNIX timestamp
  unsigned long currentTime = ntpClient.getEpochTime();
  // Cleanup
  ntpClient.end();
  udp.stop();
  return currentTime;
  }
//************************ここまで******************************

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // don't continue:
    while (true);
  }

  // attempt to connect to WiFi network:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }
  Serial.println("Connected to wifi");
  printWiFiStatus();
  
//***標準時を所得(今回は結果的に不要)*********
  unsigned long time = getCurrentTime();
    Serial.println(time);
//**********************************************
 

  // if you get a connection, report back via serial:
  //google.comに接続し、検索をポストする。シリアルモニタにhtmlの羅列が出てきたら通信成功。
  if (client.connect(server, 443)) {         //SSL通信の為443を指定
    Serial.println("connected to server");
    // Make a HTTP request:
    client.println("GET  /search?q=arduino HTTP/1.1"); 
    client.println("Host: www.google.com");
    client.println("Connection: close");
    client.println();
  }
}


void loop() {
  // if there are incoming bytes available
  // from the server, read them and print them:
  while (client.available()) {
    char c = client.read();
    Serial.write(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting from server.");
    client.stop();

    // do nothing forevermore:
    while (true);
  }
}

void printWiFiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

GAS用に改変例

以下のスクリプトで、

client.println("GET  /search?q=arduino HTTP/1.1"); 

の部分を、

client.println("GET https://script.google.com/macros/s/AKfycbzRneHkovV9auBKvOjXAeKGjQ*******************/exec?***=***&***=***  HTTP/1.0") ; 
//****は各々

となるように改変することで、GASを動かすURLをポストできた。ここらへんはESP32と同じなので詳しくは書かない。

上手くいったらSerial Monitorにこんな感じに出力される

Nature RemoとGoogle spread sheetで約5年間自宅の温度を記録していたのでグラフにしてみた

ふと自分のGoogle driveを整理していたら、"natureremolog"というスプレッドシートがあったことに気付いた。

そういえば、Google Homeと一緒にNature Remoを購入した時に、温度データ取得APIがあるということで設定していたことを思い出した。

流石にGoogle spread sheetの仕様等も途中で変わっているだろうからどこか途中で記録が止まっているだろうと思ったら、直近まで記録されていることが判明!!

これは面白そうということで、グラフにしてみた。

記録開始日は2018年7月25日なので約5年間データが貯まったということになる。

2019年7月まで10分毎にデータを取得していたが、それ以降は1時間毎に取得しているようだったので、

1時間毎にAPIを叩いているので、24プロット/day,

8760プロット/year × 5 = 43800プロットのデータ量である。

ほぼデータに欠損期間はなく、非常に高い安定性で運用できていたことが見てとれた。

Nature Remoの温度データで惜しいのは、AD変換の解像度が低いのか温度変化が大体0.6°C刻みでしか記録されない。ただ、大まかにデータを眺めるのには問題ない。

このデータに特に意味は無いのだが、夏の温度を見ると、2021年3月に関東から片田舎に引っ越した関係で、それまでの4階建ての4階にあった灼熱部屋からだいぶマシな環境になったことが見て取れる・・・。笑

今後もNature Remoが使える限りログを取っていこうと思う。

↓ 最新のNature Remo mini 2, 温度センサーのみのいわゆる廉価タイプ。温度に合わせてエアコンの自動ON-OFFなどのイベントが設定できる。私が持っているのもこちらのタイプ(の一世代前)。

↓ Nature Remo 3だと温度センサーに加えて照度センサー、湿度センサー、人感センサーも付いているようなので、より意味のある?環境データが取れそう。

IFTTTでGoogle Calendar for Team Eventsの代わりを設定する

Google Calendar for Team Eventsに関して、共通カレンダーに入れた会議等の通知を、Slackの#eventsチャンネルに通知していたが、遂に通知が来なくなってしまった。どうも完全にサービスを終了したらしい・・・。 代わりのサービスを探してもなかなか代替案がない状況。Google Calendarアプリは個人に対して通知はしてくれるが、チャンネルには通知できない。

IFTTTを覗いてみた

最近ご無沙汰なのだが、IFTTTに良い感じのAppletが無いか覗いてみた。 皆考えることは同じということで、良い感じのAppletがあったので備忘録として残しておく。

最低限やりたいことは

  • 誰かがカレンダーに予定を追加したら通知する

  • イベントが始まる○○分前にリマインドする

そこで、以下のApplet 2つを設定した。Appletの共有方法がいまいち分からないので、下記の情報を元に検索してみて。

  1. Automatically post a reminder to a Slack channel 15 minutes before a calendar event starts (by Slack, ID: hbUx2tAC)

  2. Google Calendar -> Slack (by Satys, ID z8bLkyZV)

まず一つ目は、○○分前にリマインドを任意のSlackチャンネル(もしくは個人アカウント)に通知してくれるもの。15 min と書いているが、15分, 30分, 1時間前...と何種類か設定が可能だった。 また、通知のメッセージ等もカスタマイズ可能。 一つ、注意点として、このApplet、そのまま設定しただけでは何故か出力側のエラーが出てチャンネルに投稿できなかった。

一旦、Connectした後に"Setting"を押すと、下図のような画面になる。 そこから一旦、"Then"の部分を削除し、"+"を押して改めてSkackへの投稿を設定することで、エラーが解決された。

二つ目は、任意のGoogle Calendarにイベントが登録された際に通知するAppletである。こちらは特にエラー無く設定しただけで通知がくるようになった。

とりあえず、これでやりたいことはできる様になった。イベントの削除や日時変更等の編集に関しては通知されないので、どうしても通知したい場合は一旦イベントを削除してから作成し直す必要があると思う。

この方法が一番簡単かな・・・。 おしまい。