Qingping Air monitor lite homeyscript

Hello!

I was inspired by everything that has been done here, and I created my own improved version of the script.

It dynamically retrieves all sensors (thus also compatible with CGS1) and also gathers some information about the device, such as the MAC address or the report interval setting:

/**
 * Configuration: App Key & App Secret
 * Used for API authentication.
 * Get credentials: https://developer.qingping.co/personal/permissionApply
 */
const APP_KEY = 'XXXXXXXXXXX';
const APP_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const CREDENTIALS = Buffer.from(`${APP_KEY}:${APP_SECRET}`).toString('base64');

/**
 * Perform an authenticated HTTP request.
 * Uses Basic Auth (for token) or Bearer Token (for API calls).
 */
async function fetchWithAuth(url, method = 'GET', token = '', body = null) {
    const headers = token
        ? { 'Authorization': `Bearer ${token}` }
        : { 'Authorization': 'Basic ' + CREDENTIALS };

    const options = { method, headers, ...(body ? { body } : {}) };
    const response = await fetch(url, options);
    if (!response.ok) throw new Error(`Error: ${response.status} - ${response.statusText}`);
    return response.json();
}

/**
 * Retrieve sensor data and store it as Homey tags.
 */
async function main() {
    try {
        console.log("πŸš€ Starting data retrieval...");

        // Step 1: Get Access Token
        console.log("πŸ”‘ Requesting access token...");
        const params = new URLSearchParams({
            grant_type: 'client_credentials',
            scope: 'device_full_access'
        });

        const authResponse = await fetch("https://oauth.cleargrass.com/oauth2/token", {
            method: 'POST',
            headers: {
                'Authorization': 'Basic ' + CREDENTIALS,
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            body: params,
        });

        if (!authResponse.ok) throw new Error(`Auth Error: ${authResponse.status} - ${authResponse.statusText}`);
        const { access_token: accessToken } = await authResponse.json();
        console.log("βœ… Access Token received");

        // Step 2: Fetch Sensor Data
        console.log("πŸ“‘ Fetching device data...");
        const timestamp = Date.now().toString();
        const deviceResponse = await fetchWithAuth(`https://apis.cleargrass.com/v1/apis/devices?timestamp=${timestamp}`, 'GET', accessToken);

        if (!deviceResponse.devices || deviceResponse.devices.length === 0) throw new Error("No device data available");

        // Extract and log device info
        const { info: deviceInfo, data: deviceData } = deviceResponse.devices[0];
        console.log("πŸ“„ Device Info:", deviceInfo);
        console.log("πŸ“Š Device Data:", deviceData);

        console.log("🏷️ Storing informations...");
        // Store device metadata as tags
        await Promise.all([
            tag("qingping_mac", deviceInfo.mac),
            tag("qingping_report_interval", deviceInfo.setting?.report_interval ?? "N/A"),
            tag("qingping_collect_interval", deviceInfo.setting?.collect_interval ?? "N/A")
        ]);

        console.log(`πŸ”Ή Stored: qingping_mac = ${deviceInfo.mac}`);
        console.log(`πŸ”Ή Stored: qingping_report_interval = ${deviceInfo.setting?.report_interval ?? "N/A"}`);
        console.log(`πŸ”Ή Stored: qingping_collect_interval = ${deviceInfo.setting?.collect_interval ?? "N/A"}`);

        // Store sensor readings
        await Promise.all(Object.entries(deviceData).map(async ([key, { value }]) => {
            if (value !== undefined) {
                const tagName = `qingping_${key}`;
                console.log(`πŸ”Ή Stored: ${tagName} = ${value}`);
                return tag(tagName, value);
            }
        }));

        // Store an error tag with "No error" if everything succeeds
        await tag("qingping_error", "No error");
        console.log("βœ… All device data stored successfully!");

    } catch (error) {
        console.error("❌ Error:", error.message);
        await tag("qingping_error", error.message);
    }
}

// Execute the script
await main();
return "Script completed";

Also, I was very frustrated to only get a report every 15 minutes from my sensor.
So, I dug into the API documentation, ran some tests, and with the help of ChatGPT, I finally found the solution.

Here is the code that will allow you to reduce the interval from 900 seconds to the minimum allowed of 60 seconds:

/**
 * Configuration: App Key & App Secret
 * Used for API authentication.
 * Get credentials: https://developer.qingping.co/personal/permissionApply
 */
const APP_KEY = 'XXXXXXXXXXX';
const APP_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const CREDENTIALS = Buffer.from(`${APP_KEY}:${APP_SECRET}`).toString('base64');

/**
 * Function to make authenticated HTTP requests.
 * Handles both Basic Authentication (for token request) and Bearer Authentication (for API calls).
 */
async function fetchWithAuth(url, method = 'GET', token = '', body = null) {
    const headers = token
        ? { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }  // Bearer token for API requests
        : { 'Authorization': 'Basic ' + CREDENTIALS, 'Content-Type': 'application/x-www-form-urlencoded' };  // Basic Auth for token request

    const options = {
        method,
        headers,
        ...(body ? { body: body instanceof URLSearchParams ? body : JSON.stringify(body) } : {})  // Ensure proper encoding
    };

    console.log("πŸ“‘ Sending Request:", url, options);
    
    const response = await fetch(url, options);
    const responseText = await response.text();

    if (!response.ok) {
        throw new Error(`Error: ${response.status} - ${responseText}`);
    }

    return responseText ? JSON.parse(responseText) : {};  // Handle empty responses
}

/**
 * Function to update device settings (set report & collect intervals to minimum)
 */
async function updateDeviceSettings(accessToken, macAddress) {
    try {
        const timestamp = Date.now();
        const requestBody = {
            mac: [macAddress],
            report_interval: 60, // Minimum interval (60 seconds)
            collect_interval: 60, // Minimum interval (60 seconds)
            timestamp: timestamp
        };

        console.log("βš™οΈ Updating Device Settings:", JSON.stringify(requestBody, null, 2));
        
        const response = await fetchWithAuth("https://apis.cleargrass.com/v1/apis/devices/settings", 'PUT', accessToken, requestBody);
        
        if (response && Object.keys(response).length > 0) {
            console.log("βœ… Device settings updated successfully:", response);
        } else {
            console.log("βœ… Device settings updated successfully, but API returned an empty response.");
        }
    } catch (error) {
        console.error("❌ Error updating device settings:", error.message);
    }
}

/**
 * Main function to fetch and display device information before and after settings update.
 */
async function main() {
    try {
        // 1️⃣ Retrieve Access Token
        const params = new URLSearchParams({
            grant_type: 'client_credentials',
            scope: 'device_full_access'
        });

        const authResponse = await fetch("https://oauth.cleargrass.com/oauth2/token", {
            method: 'POST',
            headers: {
                'Authorization': 'Basic ' + CREDENTIALS,
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            body: params,
        });

        if (!authResponse.ok) throw new Error(`Auth Error: ${authResponse.status} - ${authResponse.statusText}`);
        
        const { access_token: accessToken } = await authResponse.json();

        // 2️⃣ Retrieve Device Information (Before Update)
        const timestamp = Date.now().toString();
        const deviceResponseBefore = await fetchWithAuth(`https://apis.cleargrass.com/v1/apis/devices?timestamp=${timestamp}`, 'GET', accessToken);
        
        if (!deviceResponseBefore.devices || deviceResponseBefore.devices.length === 0) throw new Error("No device data available");
        
        // Extract and display device information before update
        const deviceInfo = deviceResponseBefore.devices[0].info;
        console.log("πŸ“‘ Device Info (Before Update):", deviceInfo);
        
        // 3️⃣ Update Device Settings (Set report & collect intervals to minimum)
        await updateDeviceSettings(accessToken, deviceInfo.mac);
        
        // 4️⃣ Retrieve Device Information (After Update)
        const deviceResponseAfter = await fetchWithAuth(`https://apis.cleargrass.com/v1/apis/devices?timestamp=${timestamp}`, 'GET', accessToken);
        
        if (!deviceResponseAfter.devices || deviceResponseAfter.devices.length === 0) throw new Error("No device data available");
        
        // Extract and display device information after update
        console.log("πŸ“‘ Device Info (After Update):", deviceResponseAfter.devices[0].info);

        console.log("βœ… Device settings update process completed!");
        
    } catch (error) {
        console.error("❌ Error:", error.message);
    }
}

// Execute the script
await main();
return "Script completed";

Here is my Device Capabilities TEF file (don’t forget to β€œSave as” the custom icons):

[tef:AVD:"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":/tef]

Here is my flow:

Once everything is set up, here is the result (the MAC address has been blurred):

1 Like