0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Waybarに天気予報をシンプルに表示する(wttr.inを使ったカスタマイズ)

0
Posted at

概要

HyprlandでWaybarを使用しています。デスクトップ環境が整ってくると、PCの内部情報だけでなく、日常的に使う外部のデータも表示したくなってきますよね。今回は、デスクトップに天気予報を表示させてみます。天気予報を表示するHyprland向けのアドオンや専用スクリプトはいくつか存在しますが、「既成のツールを増やすより、シンプルな単機能ツールを組み合わせて実現したい」と思い、curlとWaybarの基本機能だけで完結する仕組みを作りました。

実現方法

  1. ターミナルから1行で天気を取得できるAPI wttr.in を利用する
  2. Waybarの custom モジュール(exec)を使って定期的に(1時間に1回)curl を叩く
  3. 取得したテキストデータをそのままステータスバーへ流し込む

wttr.inとは?

wttr.in は、curl コマンドだけでリッチな天気予報を表示できる非常に便利なWebサービス(API)です。chubin/wttr.in: ⛅ The right way to check the weather 試しに、ターミナルで以下のコマンドを実行してみてください。

curl wttr.in

端末のIPアドレスから現在地を自動判定し、以下のような美しいアスキーアートの天気予報が返ってきます。

Weather report: 35.690000,139.690000


     \  /       Partly cloudy
   _ /"".-.     +27(29) °C
     \_(   ).   ↘ 11 km/h
     /(___(__)  10 km
                0.0 mm
                                                       ┌─────────────┐
┌──────────────────────────────┬───────────────────────┤  Fri 29 May ├───────────────────────┬──────────────────────────────┐
│            Morning           │             Noon      └──────┬──────┘     Evening           │             Night            │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│  _`/"".-.     Patchy rain ne…│    \  /       Partly Cloudy  │  _`/"".-.     Patchy rain ne…│  _`/"".-.     Patchy rain ne…│
│   ,\_(   ).   +27(28) °C     │  _ /"".-.     +29(28) °C     │   ,\_(   ).   +23(25) °C     │   ,\_(   ).   +22(25) °C     │
│    /(___(__)  ↘ 23-29 km/h   │    \_(   ).   ↘ 24-32 km/h   │    /(___(__)  ← 16-21 km/h   │    /(___(__)  ← 9-12 km/h    │
│      ‘ ‘ ‘ ‘  10 km          │    /(___(__)  10 km          │      ‘ ‘ ‘ ‘  10 km          │      ‘ ‘ ‘ ‘  10 km          │
│     ‘ ‘ ‘ ‘   0.0 mm | 81%   │               0.0 mm | 0%    │     ‘ ‘ ‘ ‘   0.0 mm | 85%   │     ‘ ‘ ‘ ‘   0.0 mm | 85%   │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
                                                       ┌─────────────┐
┌──────────────────────────────┬───────────────────────┤  Sat 30 May ├───────────────────────┬──────────────────────────────┐
│            Morning           │             Noon      └──────┬──────┘     Evening           │             Night            │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│     \   /     Sunny          │     \   /     Sunny          │     \   /     Sunny          │     \   /     Clear          │
│      .-.      +24(25) °C     │      .-.      27 °C          │      .-.      +25(26) °C     │      .-.      +23(25) °C     │
│   ― (   ) ―   ↑ 11-13 km/h   │   ― (   ) ―   ↑ 18-20 km/h   │   ― (   ) ―   ↑ 24-31 km/h   │   ― (   ) ―   ↑ 21-30 km/h   │
│      `-’      10 km          │      `-’      10 km          │      `-’      10 km          │      `-’      10 km          │
│     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
                                                       ┌─────────────┐
┌──────────────────────────────┬───────────────────────┤  Sun 31 May ├───────────────────────┬──────────────────────────────┐
│            Morning           │             Noon      └──────┬──────┘     Evening           │             Night            │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│     \   /     Sunny          │     \   /     Sunny          │     \   /     Sunny          │     \   /     Clear          │
│      .-.      +25(26) °C     │      .-.      +29(27) °C     │      .-.      27 °C          │      .-.      +25(26) °C     │
│   ― (   ) ―   ↙ 7-9 km/h     │   ― (   ) ―   ↖ 9-11 km/h    │   ― (   ) ―   ↑ 23-30 km/h   │   ― (   ) ―   ↑ 14-21 km/h   │
│      `-’      10 km          │      `-’      10 km          │      `-’      10 km          │      `-’      10 km          │
│     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
Location: 水の広場, 西新宿二丁目, 新宿区, 東京都 160-0023, 日本 [35.6901916,139.6900375]

Follow @igor_chubin for wttr.in updates

欲しい情報だけをフォーマット指定して抜き出す

Waybarのような1行のステータスバーに表示するため、wttr.in には出力をカスタムできるフォーマットオプションが用意されています。

curl -s 'https://wttr.in/tokyo?format=%c_%C_%x_%h_%t_%f_%w_%l_%m_%M_%p_%P_%e_%u'
# 出力例: ☀️ _Sunny_o_84%_+22°C_+25°C_→45km/h_tokyo_🌔_13_0.0mm_997hPa_%e_2

Waybarで使うために、利用可能なフォーマットと設定時の補足説明を一覧にまとめました。

Format Description Sample 補足説明
c Weather condition 🌦 天気アイコン(絵文字)
C Weather condition textual name Light rain 天気名のテキスト
x Weather condition, plain-text symbol / 天気予報記号(アスキーアート用)
h Humidity 70% 湿度
t Temperature (Actual) +11°C 実際の気温(+- が必ず付く)
f Temperature (Feels Like) +11°C 体感温度
w Wind ↗4km/h 風向・風速( は南西の風)
l Location tokyo 地域名
m Moon phase 🌓 月の満ち欠け(絵文字)
M Moon day 7 月齢(0〜約29.5、0:新月, 約15:満月)
p Precipitation (mm/3 hours) 0.2mm 過去3時間の降水量
P Pressure (hPa) 1020hPa 気圧
e Dew point %e 露点(一部地域では機能しない場合があり未確認)
u UV index (1-12) 1 UV指数(紫外線強度)

また、日の入りや夜明けなどの時間を詳細に取得したい場合は、以下のフォーマットを使使います。

curl -s 'https://wttr.in/tokyo?format=%D_%S_%z_%s_%d_%T_%Z'
# 出力例: 04:03:06_04:33:31_11:40:22_18:47:09_19:17:16_23:13:43+0900_Asia/Tokyo
Format Description 出力例 意味
D Dawn 05:13:04 夜明け(薄明の開始)
S Sunrise 05:40:06 日の出(太陽が地平線に現れる瞬間)
z Zenith 11:48:36 南中(太陽が最も高くなる時間)
s Sunset 17:57:30 日の入り(太陽が地平線に沈む瞬間)
d Dusk 18:24:35 日暮れ(黄昏時の終わり)
T Current time 12:08:07+0900 現地時間
Z Local timezone Asia/Tokyo タイムゾーン

💡 各時間帯(薄明など)の厳密な定義については、The Different Types of Twilight, Dawn and Dusk が参考になる。

地域(Location)の指定方法

何も指定しない場合は接続元のIPアドレスから自動判定されますが、明示的に指定したい場合は、URLの末尾に都市名、エリアコード、あるいは緯度経度を渡すことで固定できます。詳細は wttr.in のヘルプ で確認できます。


Waybarへの組み込み

今回は1時間に1回、以下のフォーマットで東京(Tokyo)の天気を取得し、Waybarに表示させます。

curl -s 'https://wttr.in/tokyo?format=%c%t+%h+%p%w+%P%m'
# 出力例: ☀️ +22°C 84% 0.0mm→45km/h 997hPa🌔

config.jsonc の設定

Waybarの設定ファイル(通常は ~/.config/waybar/config.jsonc)に、カスタムモジュールを追加します。

// -*- mode: jsonc -*-
{
    // ... 他の設定 ...

    "modules-right": [
        // ... 他のモジュール ...
        "custom/weather"
    ],

    "custom/weather": {
        "format": "{}",
        "tooltip": true,
        "interval": 3600, // 1時間に1回更新(秒単位指定)
        "exec": "curl -s 'https://wttr.in/tokyo?format=%c%t+%h+%p%w+%P%m'",
        "return-type": "" // 単純なプレーンテキストを表示する場合は空文字でOK
    }
}

💡 custom/* モジュールで使えるさらに詳細なオプション(JSONフォーマットでのツールチップ拡張など)については、Waybar Wiki - Module: Custom をご参照ください。

設定の再読み込み

書き換えが終わったら、以下のコマンドでWaybarを再起動して設定を反映します。

pkill waybar && waybar & disown

バーの上に現在の天気アイコンと気温、湿度などが綺麗に表示されれば成功です!

おわりに

重いデスクトップウィジェットを入れずとも、既存の Waybarcurl だけで完結するミニマルな環境が作れました。ミニマルが故、エラー周りは一切考慮していないですが…(例えば、PCがネットにつながっていなかったり、wttr.inが落ちていたりするとcurlのエラーがそのまま表示される)。「足りない機能があれば、Web上の小さなAPIとシェルを繋いでサクッと自作する」。これこそがLinuxデスクトップを運用するエンジニア最大の醍醐味だと感じています。

皆さんもぜひ、自分好みのフォーマットにカスタマイズしてみてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?