wttr.in adalah situs layanan prakiraan cuaca yang dapat memberikan informasi cuaca dalam berbagai format antara lain:

  • TEKS – untuk digunakan dengan curl, wget, httpie
  • HTML – untuk digunakan dengan Web Browser
  • PNG – untuk digunakan dengan penampil atau pemroses gambar

Berikut ini adalah tampilan dari wttr.in untuk prakiraan cuaca kota tempat saya tinggal, yakni Kota Malang.

Pada eksperimen ini, kita akan mengambil data dari wttr.in dan menampilkan beberapa data seperti suhu dan kelembaban. Dan sesuai judulnya, kita menggunakan bahasa pemrograman C++.

Untuk mengambil data dari wttr.in kita gunakan program utilitas curl. Dengan curl, kita akan mengambil data dalam bentuk teks (console) dan dalam bentuk data JSON.

Untuk pemrosesan data JSON, kita gunakan library ArduinoJson.

Meminta Data Menggunakan curl

Untuk mengambil data prakiraan cuaca dalam bentuk teks (ANSI Sequence), maka perintahnya adalah sebagai berikut:

$ curl id.wttr.in/Malang

Sub-domain id digunakan untuk meminta data dalam bahasa Indonesia.

Malang digunakan untuk meminta data untuk Kota Malang.

Hasilnya adalah sebagai berikut:

Bagaimana? Keren, bukan?

Dan, untuk meminta data dalam format JSON, perintahnya adalah sebagai berikut:

$ curl id.wttr.in/Malang?format=j1

Adapun hasilnya adalah sebagai berikut:

Kode Program

/*
 *  Eksperimen membaca data prakiraan cuaca dari situs wttr.in
 *  C++, curl, ArduinoJson
 *  Chandra MDE - teknikelektrolinks.com
 *  23 September 2021
 *
 *  Penggunaan: $ wttrin Malang
 *  Jika tanpa parameter, maka akan ditampilkan prakiraan cuaca
 *  untuk Kota Malang
 */

#include <iostream>
#include <stdexcept>
#include <stdio.h>
#include <string>
#include "ArduinoJson.h"

using namespace std;
   
// fungsi exec command (sumber: StackOverflow, dimodifikasi)
string exec(const char* cmd)
{
    char *buffer;
    string result = "";
    
    buffer = (char*)calloc(64000, sizeof(char));
    FILE* pipe = popen(cmd, "r");
    if (!pipe) throw runtime_error("popen() failed!");
    try
    {
        while (fgets(buffer, sizeof buffer, pipe) != NULL)
            result += buffer;
    } 
    catch (...) 
    {
        pclose(pipe);
        throw;
    }
    
    pclose(pipe);
    
    free(buffer);
    
    return result;
}


/*** Program Utama ***/
int main(int argc, char *argv[])
{
    char cmd[100];
    char kota[32];
    string curl_output;
    DynamicJsonDocument weather_json(2000);
    JsonArray conditions, nearest_area;
    
    if (argc<2)
        strcpy(kota, "Malang");
    else if (argc>=2)
        strcpy(kota, argv[1]);
    
    sprintf(cmd, "curl -s id.wttr.in/%s", kota);
    cout << "Mengakses " << cmd << endl;
    curl_output = exec(cmd);

    size_t f = curl_output.find("LOKASI TIDAK DIKETAHUI");
    if (f != string::npos)
    {
        cout << "Lokasi tidak ditemukan!" << endl;
        exit(1);
    }

    string weather_icon = curl_output.substr(0, curl_output.find("mm"));
    cout << endl << weather_icon << "mm" << endl;
        
    sprintf(cmd, "curl -s id.wttr.in/%s?format=j1", kota);
    cout << "\nMengakses " << cmd <<  endl;
    deserializeJson(weather_json, exec(cmd));
    conditions = weather_json["current_condition"];
    nearest_area = weather_json["nearest_area"];

    cout << "+---------------------------------------------------" << endl;
    cout << "+ Temperature : " << conditions[0]["temp_C"].as<float>() << "C" << endl;
    cout << "+ Humidity    : " << conditions[0]["humidity"].as<float>() << "%" << endl;
    cout << "+ Cuaca       : " << conditions[0]["lang_id"][0]["value"].as<const char*>() << endl;
    cout << "+ Lokasi      : " << nearest_area[0]["latitude"].as<const char*>() << ", ";
    cout << nearest_area[0]["longitude"].as<const char*>() << endl;
    cout << "+ Propinsi    : " << nearest_area[0]["region"][0]["value"].as<const char*>() << endl;
    cout << "+ Negara      : " << nearest_area[0]["country"][0]["value"].as<const char*>() << endl;
    cout << "+---------------------------------------------------" << endl;

    return EXIT_SUCCESS;
}


Penjelasan Singkat Kode Program

Program menerima 1 parameter, yakni: nama kota.

Untuk menampilkan prakiraan cuaca Kota Surabaya, maka perintahnya adalah:

$ ./wttrin Surabaya

Jika program dipanggil tanpa parameter, maka akan ditampilkan prakiraan cuaca Kota Malang.

Pertama-tama, program akan meminta data dalam bentuk teks. Selain untuk mendapatkan tampilan prakiraan cuaca yang menarik, juga untuk mengecek apakah nama kota yang dimasukkan dapat ditemukan ataukah tidak.

Selanjutnya, program meminta data dalam bentuk JSON dan menampilkan beberapa data penting seperti Suhu, Kelembaban, Deskripsi Cuaca, dan Lokasi.

Library ArduinoJson sangat memudahkan pemrosesan data dengan format JSON. Data JSON (RAW) yang dikirimkan oleh wttr.in di deserialisasi dengan perintah:

deserializeJson(weather_json, exec(cmd));

Selanjutnya, program tinggal mengakses Key untuk mendapatkan Value dengan cara yang sangat gampang.

 conditions = weather_json["current_condition"];
    nearest_area = weather_json["nearest_area"];

    cout << "+---------------------------------------------------" << endl;
    cout << "+ Temperature : " << conditions[0]["temp_C"].as<float>() << "C" << endl;
    cout << "+ Humidity    : " << conditions[0]["humidity"].as<float>() << "%" << endl;
    cout << "+ Cuaca       : " << conditions[0]["lang_id"][0]["value"].as<const char*>() << endl;
    cout << "+ Lokasi      : " << nearest_area[0]["latitude"].as<const char*>() << ", ";
    cout << nearest_area[0]["longitude"].as<const char*>() << endl;
    cout << "+ Propinsi    : " << nearest_area[0]["region"][0]["value"].as<const char*>() << endl;
    cout << "+ Negara      : " << nearest_area[0]["country"][0]["value"].as<const char*>() << endl;
    cout << "+---------------------------------------------------" << endl;

ArduinoJson memang library pemrosesan data JSON yang ampuh. Dan, saya akan terus melanjutkan eksperimen untuk mencoba fitur-fitur yang disediakan oleh ArduinoJson.

Hasil Eksekusi Program

Nah, demikianlah eksperimen singkat kita dengan curl dan ArduinoJson untuk menampilkan data prakiraan cuaca yang diambil dari situs wttr.in. Semoga bermanfaat.

Selamat belajar. Selamat berkarya.

Kunjungi Situs Kami

Pelatihan/Bimbingan PRIVAT Pemrograman

Kami melayani Pelatihan/Bimbingan PRIVAT baik Online maupun Offline dengan materi sesuai dengan kebutuhan Anda. Kami juga melayani pembuatan sistem kontrol dan otomasi berbasis mikrokontroler (Arduino, 8051, PIC, STM8S), Raspberry Pi dan Zelio Smart-Relay.

Hubungi kami melalui Whatsapp 0882-3560-7047.