Skip to content
jphacksPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

家事お知らせアプリ

家事を記録するだけではなく、家事を「いつ・何を・どうやるか考える負担」まで減らす。

周期、家事の負荷、休日、天気、Google Calendarの忙しさを考慮して、家事を行うタイミングを自動で調整する家事Plannerです。

Google Tasksとも連携し、Plannerが決めた予定を普段使うGoogle側で確認・完了できます。完了結果はPlannerへ戻り、実際に家事を行った日から次回予定を自動計算します。

家電については、メーカー名・製品名・型番からメーカー公式情報・公式説明書を確認し、AIでお手入れ方法を構造化します。

通常の家事管理・Scheduler・履歴は端末内のExpo SQLiteで動作し、外部APIが利用できない場合でも基本機能を継続できます。


🎬 デモ動画

▶ YouTubeでデモ動画を見る(約3分22秒)

動画は限定公開です。上記リンクから視聴できます。

デモで確認できること

家事予定を自動生成
        ↓
天気とGoogle Calendarの忙しさを考慮
        ↓
Google Tasksへ同期
        ↓
アプリ / Google側で完了
        ↓
完了履歴へ反映
        ↓
次回予定を自動計算

アプリ画面

ホーム画面 カレンダー画面 家電AI画面

今日のタスク / 家事カレンダー / 公式説明書を利用した家電お手入れ解析

家事を検索して、具体的な手順まで確認

家事検索画面 家事手順画面

家事名を検索し、具体的な手順・注意事項・参照元まで確認できます。


製品概要

背景・解決したい課題

家事には単純な「やる / やらない」以外にも、多くの判断が必要です。

  • 何をやればいいのか分からない
  • どのくらいの頻度で行えばいいのか分からない
  • 今日やるべきか、数日ずらしてもいいのか分からない
  • 休日にまとめて行いたい
  • 重い家事が同じ日に集中すると負担が大きい
  • 洗濯は天気によって予定を変えたい
  • 忙しい日は負荷の高い家事を避けたい
  • 家電のお手入れ方法を説明書から探すのが大変
  • 完了した後、次にいつ行うか再び考える必要がある

一般的なToDoアプリでは、ユーザー自身が

何をする?
↓
いつする?
↓
期限は?
↓
終わった?
↓
次はいつ?

を継続して管理する必要があります。

このアプリでは、家事そのものだけではなく「家事を管理するための判断」も減らすことを目指しています。


このアプリが考えること

何を?
→ 家事カタログ / 家電AI

いつ?
→ Scheduler / 休日 / 負荷 / 天気 / Google Calendar

どうやって?
→ 家事ガイド / メーカー公式説明書AI

終わった?
→ App / Widget / Google Tasks

次は?
→ 実際の完了日からSchedulerが再計算

特長

1. 家事を自動で分散するScheduler

家事ごとに、

  • 実施周期
  • 実施可能期間
  • 家事の負荷
  • 休日優先
  • 前回の実施日
  • 家事同士の依存関係
  • 最大移動日数

を持ち、共通のSchedulerが予定を生成します。

例えば、

  • 重い家事が同じ日に集中しないようにする
  • 休日向きの家事を休日付近へ配置する
  • 前回いつ行ったか分からない家事を初回から分散する
  • 期限を過ぎた家事も消さず、現在の負荷に合わせて再提案する
  • 実際に完了した日を次回周期の基準にする
  • 家事同士の実行順序を維持する

といった処理を自動で行います。

予定日は固定された「締切」ではなく、一定範囲の中で移動できる実施可能期間として扱います。


2. 天気とGoogle Calendarの両方を見て予定を調整

例えば、

「明日は予定が多いので、重い掃除を今日へずらす」

といった判断をPlannerが行います。

Google Calendar連携を有効にすると、Calendarの忙しさを日ごとの時間量へ変換し、Schedulerの候補選択へ反映します。

ただし予定のある日を単純に禁止するわけではありません。

Calendarはsoft penaltyとして扱い、

  • 家事の実施可能期間
  • 最大移動日数
  • 休日
  • 1日の家事負荷
  • 家事同士の依存関係
  • 期限超過

などの既存ルールを維持します。

重い家事ほど忙しい日を避けやすくし、軽い家事は多少予定があっても近い日を維持しやすくしています。

さらに洗濯では、

天気条件を満たす日
+
Calendarの忙しさ
+
負荷上限
+
依存関係
+
同じ家事の周期順序

を組み合わせて候補日を決定します。

天気とCalendarを考慮した予定

古い天気結果で新しい予定を上書きしない

天気取得中に、

  • 日付
  • timezone
  • Calendar
  • 家事設定
  • Plannerのsnapshot

が変更された場合、遅れて返ってきた古い結果を保存しません。

同じ予報の短時間での再評価も抑制し、不要なAPI通信・DB更新・Widget更新を増やさないようにしています。


3. Calendarの予定内容を取得しない

Google Calendar連携で必要なのは、

「その日に何分予定が入っているか」

だけです。

そのためGoogle Calendar Events一覧ではなく、FreeBusy APIのみを利用します。

取得しないもの:

  • 予定タイトル
  • 説明
  • 場所
  • 参加者
  • 主催者
  • Event本文

取得したraw busy intervalもそのまま永続保存しません。

保存するのは日ごとの、

日付
busyMinutes
timezone
取得時刻

だけです。

家事の予定調整に不要なCalendar情報を取得しない設計にしています。


4. Google Tasksとの双方向連携

Plannerが生成した家事予定を専用のGoogle Tasksリストへ同期します。

新しいTaskを作る範囲は、当日から14日先までです。Planner内の長期予定は保持し、日が進むと対象範囲へ入った予定を追加します。既に紐付いたTaskは、範囲外でも予定日・名前・完了状態の更新を続けます。

作成・更新は1リクエストあたり最大100件に分割し、成功した項目から紐付けを保存します。途中で失敗した場合は、次の同期で残った差分を処理します。ローカル初期化後も、専用リストの家事名と予定日が一致するTaskを再利用して重複作成を抑えます。

Planner
↓
家事予定を生成
↓
Google Tasksへ同期
↓
Google Calendar上でも確認

Planner側で予定日が変わっても、Google Taskを削除・再作成しません。

同じGoogle Task IDを維持
+
dueだけ更新

します。

Google側で家事を完了した場合は、

Google Taskを完了
↓
Plannerへ取り込む
↓
完了履歴へ保存
↓
家事状態を更新
↓
Scheduler再計算
↓
次回予定生成

までつながります。

同じ完了を何度同期しても、完了履歴を二重生成しません。

家事の完了・完了取り消し後はGoogle Tasksをすぐ同期しますが、Calendarまで毎回再取得せず、Calendarは通常の更新間隔を維持します。

設定画面の「今すぐ同期」を実行した場合だけ、TasksとCalendarの両方を明示的に更新します。


5. 天気に合わせて洗濯予定を調整

ユーザーが設定した市区町村を使ってOpen-Meteoから予報を取得し、今後7日以内の洗濯予定を調整します。

候補日の判定では、

  • 降水確率
  • 降水量
  • 天気コード
  • 元の実施可能期間
  • 1日の家事負荷
  • 家事の依存関係
  • Google Calendarの忙しさ

を利用します。

天気APIが利用できない場合は、通常Schedulerの予定へ戻ります。

端末GPSや位置情報権限は使用せず、ユーザーが入力・選択した市区町村のみを利用します。


6. 家事を検索して「どうやるか」まで確認

予定だけ提示されても、

「で、どう掃除するの?」

が残ってしまいます。

そのため家事には、

  • 手順
  • 必要な道具
  • 注意事項
  • 参照元
  • 過去の実施履歴

を持たせています。

例えば「シンク」で検索すると関連する家事を探すことができ、個別画面では水アカ除去などの具体的な手順を確認できます。

家事検索 家事手順


7. 型番からメーカー公式説明書をAI解析

家電のお手入れでは、一般的なAI知識だけを使って回答させません。

メーカー名・製品名・型番
        ↓
メーカー公式情報から製品を確認
        ↓
対象型番の公式説明書を特定
        ↓
公式PDF / 公式資料をAIで解析
        ↓
お手入れ項目
手順
注意事項
周期
出典
を構造化
        ↓
ユーザーが確認
        ↓
保存
        ↓
周期がある項目だけSchedulerへ登録

製品同定と説明書検索ではメーカー公式情報を優先します。

AIに存在しない周期を作らせない

例えばメーカー資料に、

定期的に確認する

とだけ書かれている場合、

30日に1回

のような数値周期をAIに推測させません。

この場合は、

定期予定なし

として保存します。

実際のDyson V12 Detect Slim(SV20)の解析画面でも、メーカーが具体的な周期を指定していない項目は「定期予定なし」として表示します。

Dyson SV20の家電AI解析

公式製品ページ・公式取扱説明書へのリンクも保持し、解析内容の根拠をユーザー自身が確認できます。


メインデモの流れ

このアプリの中心は、各機能を別々に使うことではなく、家事管理の判断を一周して自動化することです。

① 家事を登録
   ↓
② Schedulerが周期・負荷・休日から予定を生成
   ↓
③ 洗濯なら天気を考慮
   ↓
④ Google Calendarの忙しさを考慮
   ↓
⑤ Google Tasksへ同期
   ↓
⑥ Googleまたはアプリ側で完了
   ↓
⑦ Plannerへ完了履歴を保存
   ↓
⑧ 実際の完了日から次回予定を自動計算

家電については、

型番を入力
↓
公式製品を特定
↓
公式説明書を解析
↓
「どう手入れするか」を構造化
↓
周期があるものだけSchedulerへ追加

という別の入口から、同じPlannerへ統合します。


実GoogleアカウントでのE2E検証

Google連携はmockだけでなく、iOS Simulator + 実Googleアカウントでも一連の動作を確認しています。

検証例:

11月24日
Calendar busy = 270分

11月23日
Calendar busy = 90分

↓
heavy家事を比較

11月24日
↓
11月23日へ移動

↓
同じGoogle Task IDを維持
dueだけ更新

↓
Google側でTaskを完了

↓
Plannerへ完了を1件だけ取り込み

↓
次回予定を再計算

↓
アプリを完全終了・再起動

↓
完了履歴・次回予定・Calendar状態を保持

つまり、

Calendar
↓
Scheduler
↓
Google Tasks
↓
Google側で完了
↓
Planner
↓
次回Scheduler

まで一周させています。

実Googleアカウント同期検証

詳細:


家電AIの実API検証

家電AIについても、

「AIがそれっぽい回答をした」

だけでは評価していません。

メーカー公式説明書から人力で正解データを作成し、実際のアプリと同じAPI経路で比較しました。

対象:

Dyson V12 Detect Slim
型番: SV20
公式日本語取扱説明書

GPT-5.5を利用した3回のE2E検証:

指標 結果
E2E成功 3 / 3
製品同定 3 / 3
正しい公式説明書 3 / 3
Task Recall 10 / 10 × 3
Task Precision 10 / 10 × 3
周期判定 10 / 10 × 3
主要手順 38 / 38 × 3
安全情報 33 / 33 × 3
出典 10 / 10 × 3
根拠のない生成 0

数値周期がメーカー資料に存在した項目以外には、根拠のない周期を生成しませんでした。


品質保証

予定・天気・Calendar・完了・Google同期は、少しの不整合でも

  • 同じ家事が二重に表示される
  • 完了履歴が重複する
  • 次回予定がずれる
  • 天気取得中に古い結果で予定が巻き戻る
  • GoogleとPlannerが互いに古い状態を上書きする

といった問題が起きやすい部分です。

そのため状態遷移・UI契約・保存・同期を自動テストしています。

現在の自動検証

検証 結果
自動テスト 671 tests PASS(iOS・Androidの両条件)
lint PASS
TypeScript typecheck PASS
npm run check PASS
Expo Doctor PASS
GitHub Actions CI PASS
保護対象feature contract 43機能
iOS Simulator + 実Google E2E PASS
Android Emulator + 実Google Tasks / Calendar Phase 3 E2E PASS(2026-10-26)

さらに天気・Calendarについては、128種類の予報・busyパターンを使い、

  • 実施可能期間
  • 負荷上限
  • 依存順
  • 周期順序
  • 完了済み予定の固定
  • 元データの不変性

を確認しています。

詳細:


Android native構成の検証

iOSとAndroidでnative部分の実装は完全には同一ではありません。

そのためGitHub Actionsにnative設定専用のworkflowを用意し、

npm ci
↓
Expo Doctor
↓
expo prebuild --platform android

を実行してAndroid native projectを生成できることも確認しています。

必要に応じてworkflow_dispatchからAndroid debug appのGradle compileも実行できる構成です。

2026年10月26日にはローカルでもAndroid nativeをクリーン再生成・再ビルドし、Android Emulator + 実GoogleアカウントでGoogle Tasks / Calendar Phase 3 E2E PASSを確認しました。FreeBusyによるheavy家事の移動、同じTask IDでのdue更新、Google側の完了取込、終了・再起動後の保持を検証記録にまとめています。

追加のAndroid機能検査と修正では、依存家事の周期の違い、同期中断後の完了操作、アプリ終了中のウィジェット完了、地域検索を確認しました。CIの画面テストはiOS・Androidの両条件で実行します。

Google Calendarの大量・障害・OS差分検査では、5,120ケースの集計照合、21家事・181日分の384配置パターン、15万区間の応答、SQLiteの部分失敗、両OSの認証経路を検査しました。両OSの実アカウントでもセッション復元、Calendar連携OFF/ON、181日分の再取得と同じTask IDの維持を確認しました。

保存・通知・家電APIなどの追加調査では、保存の終了経路、再入による同時書き込み、通知の部分失敗、iOSウィジェットの操作確認、古い履歴、APIの入力・受信上限、天気キャッシュを検査しました。100テストを追加し、既存の36保護項目を保持した上で43項目へ増やしています。Androidの初期設定・ゴミ・通知配信・家電AI登録と、iOSのXCTestによる8シナリオも確認しています。

Android物理端末と、物理端末上のBackgroundTaskは未検証です。


Hack Dayで開発した部分

このRepositoryはJPHACKS公式テンプレートから開始しました。

Hack Day開始前の基準commit:

ecf5ec752e9dfd0b938c219662d7dbf3d6d1b603

Hack Dayでは主に以下を開発しました。

  • 家事Planner UI
  • SQLiteデータモデル
  • 家事Scheduler
  • 実施可能期間
  • 家事負荷分散
  • 休日優先
  • 家事依存関係
  • 期限超過家事の再提案
  • 完了・完了取り消し
  • 月間カレンダー
  • 家事検索
  • 家事ガイド
  • ゴミ収集日
  • 通知
  • iOS / Android Widget
  • Open-Meteo天気連動
  • 家電公式説明書AI
  • Google Tasks同期
  • Google側完了のPlanner取込
  • Google Calendar FreeBusy連携
  • Calendar busyを使ったScheduler調整
  • 天気とCalendarの統合調整
  • mobile UI / typography改善
  • 設定の自動保存
  • 自動テスト / CI
  • Android native configuration CI

現在との差分:

https://github.com/jphacks/tkb_2633/compare/ecf5ec752e9dfd0b938c219662d7dbf3d6d1b603...main


注力したこと・独自技術

1. Schedulerを中心に機能を統合

各外部サービスがそれぞれ別々に予定を作るのではなく、

周期
+
実施可能期間
+
負荷
+
休日
+
依存関係
+
天気
+
Calendar busy

を最終的に一つのSchedulerへ統合しています。

主要コード:


2. 天気とCalendarを競合させない

例えば、

晴れているので洗濯したい

という条件だけで日付を変更すると、

その日はCalendar上では非常に忙しい

という問題が起こります。

逆にCalendarだけを見ると雨の日へ洗濯を移動してしまう可能性があります。

そのため、

天気条件を満たす
↓
実施期間・負荷・依存関係を満たす
↓
Calendar busyも比較する
↓
候補日を決定

という順序で統合しています。

主要コード:


3. Google Calendarは必要最小限だけ取得

Calendarの内容を家事Plannerが読む必要はありません。

そのためFreeBusyだけを使い、

予定の中身

ではなく、

予定が入っている時間量

だけをSchedulerへ渡します。

主要コード:


4. Google Tasksを作り直さず安定IDで同期

予定日が変わるたびにGoogle Taskを削除・再作成すると、

  • 重複
  • ID変更
  • 完了履歴の対応崩れ

が発生しやすくなります。

そのため同一予定では同じGoogle Taskを維持し、必要な値だけ更新します。

主要コード:


5. メーカー公式資料を基準にした家電AI

家電AIは、

Product Resolver
↓
Manual Resolver
↓
Manual Analyzer

へ処理を分離しています。

主要コード:


アーキテクチャ

通常の家事管理は端末内で完結します。

外部サービスは補助機能として接続し、外部API障害によって基本Schedulerまで停止しない構成です。

flowchart TD
    UI["React Native / Expo UI"]

    Scheduler["Domain Scheduler"]
    SQLite["Expo SQLite"]

    Weather["Open-Meteo"]
    Calendar["Google Calendar FreeBusy"]
    Tasks["Google Tasks"]

    Appliance["Appliance Care API"]
    Official["メーカー公式情報 / 公式説明書"]
    OpenAI["OpenAI Responses API"]

    UI --> Scheduler
    Scheduler <--> SQLite

    Weather --> Scheduler
    Calendar --> Scheduler

    Scheduler --> Tasks
    Tasks --> Scheduler

    UI --> Appliance
    Official --> Appliance
    Appliance --> OpenAI
    Appliance --> UI
Loading

詳細:


Google連携とデータの正本

Planner本体の家事DBは端末内SQLiteが正本です。

Google Tasksをクラウド上のPlanner DBとして利用しているわけではありません。

Google Tasksは、

  • Plannerが決めた予定をGoogle環境で確認する
  • Google側から家事完了を入力する

ための外部インターフェースとして扱います。

そのため、

  • Plannerアカウント
  • 家族間データ共有
  • 複数端末間Planner DB同期

とは別機能です。


プライバシー設計

天気

端末GPSは利用しません。

ユーザーが入力・選択した市区町村を利用します。

Google Calendar

FreeBusyのみを利用し、Event内容を取得しません。

家電AI

メーカー公式情報・公式説明書を基準にし、出典を保持します。

Planner

通常の家事データは端末内SQLiteへ保存します。


実装済み機能

Planner

  • 初回セットアップ
  • 家事頻度モード
  • 家事ごとの周期設定
  • 休日設定
  • 家事ON / OFF
  • 前回実施時期
  • 家事負荷
  • 実施可能期間
  • 最大移動日数
  • 家事依存関係
  • 期限超過再提案
  • 完了 / 未完了履歴
  • 完了取り消し
  • 月間カレンダー
  • 家事検索
  • 家事説明
  • 家事設定の自動保存

外部条件

  • Open-Meteo天気連動
  • Google Calendar FreeBusy連動
  • Google Tasks連携
  • Google Tasks完了取込
  • 天気 + Calendar統合予定調整

補助機能

  • 毎朝の家事通知
  • iOS Widget
  • Android Widget
  • Widgetからの完了
  • ゴミ収集曜日
  • カレンダー上のゴミ種別表示

家電

  • 家電登録
  • メーカー / 製品 / 型番確認
  • 公式製品情報確認
  • 公式説明書検索
  • OpenAI Responses API解析
  • お手入れ項目
  • 手順
  • 注意事項
  • 周期
  • 公式出典
  • AI結果のユーザー確認
  • 再解析
  • 周期あり項目のScheduler登録

現在の制限・未検証

実装済みと実機検証済みを混同しないため、未確認部分も明記します。

Android Google連携

Android native projectの生成はCIで確認しています。

Android Emulator + 実GoogleアカウントのGoogle Tasks / Calendar Phase 3 E2Eは2026年10月26日にPASSしました。Android物理端末は未検証です。

BackgroundTask

物理端末上でOSに長時間任せたBackgroundTask実行は未検証です。

アプリ起動・foreground復帰・手動同期でも状態を再確認します。

ゴミ収集日の例外

通常の曜日・月次ルールには対応しています。

自治体による祝日・臨時変更などの自動取得は未実装です。

Plannerクラウド同期

MVPでは、

  • Plannerアカウント
  • 家族間同期
  • 複数端末同期
  • Planner DBのクラウド保存

は対象外です。


開発技術

Mobile

  • TypeScript
  • React 19
  • React Native 0.88
  • Expo SDK 58
  • Expo Router
  • Expo SQLite
  • Expo Notifications
  • Expo Background Task
  • Expo Widgets

Google

  • Google Sign-In native SDK
  • Google Tasks API
  • Google Calendar FreeBusy API
  • react-native-nitro-google-signin

Weather

  • Open-Meteo Forecast API
  • Open-Meteo Geocoding API

AI

  • OpenAI Responses API
  • Structured Outputs
  • PDF input
  • メーカー公式Web / 公式説明書解析

Quality

  • Node Test Runner
  • ESLint
  • TypeScript
  • Expo Doctor
  • GitHub Actions
  • Feature contract tests
  • Android native configuration check

起動方法

このアプリはnative機能を利用するため、完全な動作確認にはExpo development buildを使用します。

依存関係

npm ci

iOS

npm run ios

Android

npm run android

development server

development buildを作成済みの場合:

npm start

家電AI API

環境変数の例:

APIサーバー:

npm run api:dev

OpenAI API keyをクライアントアプリへ直接埋め込まない構成です。


Google Tasks / Calendar

Google Cloud側のOAuth設定とdevelopment buildが必要です。

詳細:

Calendar連携ではGoogle Tasksとは別に、ユーザーがCalendar連携を有効にした場合だけFreeBusy用の追加権限を要求します。


テスト

全テスト:

npm test

Android条件で画面の処理も含めて実行:

HOUSEWORK_TEST_PLATFORM=android npm test

lint:

npm run lint

typecheck:

npm run typecheck

まとめて確認:

npm run check

Expo Doctor:

npm run doctor

Repository構成

src/
├── app/                 # Expo Router / 各画面
├── components/          # UI部品
├── domain/
│   ├── chores/          # 家事定義
│   └── scheduling/      # Scheduler
├── features/
│   ├── appliance-care/  # 家電AI
│   ├── google-sync/     # Google Tasks / Calendar
│   ├── notifications/   # 通知
│   ├── planner/         # Planner更新制御
│   ├── settings/        # 設定・自動保存
│   ├── weather/         # 天気
│   ├── waste/           # ゴミ収集日
│   └── widgets/         # Widget
└── platform/
    ├── google-tasks/     # Google API adapter
    ├── notifications/
    ├── storage/          # SQLite
    └── widgets/

server/
└── appliance-care-api/
    └── src/
        ├── product-resolver.mjs
        ├── manual-resolver.mjs
        ├── manual-analyzer.mjs
        └── analysis-runner.mjs

tests/
└── *.test.mjs

docs/
├── architecture.md
├── google-sync-phase1-report.md
├── google-sync-phase2-report.md
├── google-sync-phase3-report.md
├── google-sync-setup.md
└── input-weather-calendar-audit-2026-10-26.md

今後の展望

  • 実利用者による継続利用テスト
  • Schedulerの長期利用データによる調整
  • 家事・家電データの拡充
  • Android物理端末での実GoogleアカウントE2E
  • Android / iOS物理端末でのBackgroundTask検証
  • Plannerの複数端末同期
  • 家族単位での共有
  • ゴミ収集日の自治体別例外対応
  • 家電AI解析結果の再利用・共有cache

家電AIについては、同じ製品・同じ公式説明書を毎回AI解析するのではなく、

製品型番
↓
公式説明書
↓
検証済み解析結果

を再利用することで、解析コストを抑えながら対応製品を増やす構成へ拡張できます。


このアプリが目指すもの

家事を実行すること自体は自動化できなくても、

何をやる?
いつやる?
どうやる?
前回いつやった?
今日やるべき?
忙しいからずらす?
天気は大丈夫?
次はいつ?

を毎回人間が考える必要はありません。

家事をする人ではなく、「家事を管理する人」の負担を減らす。

それがこのアプリの目標です。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

Generated from jphacks/JP_sample