Openrgb web сервер

Разное 8 окт. 2024 г.

Пример простого http сервера для управления подсветкой устройств с помощью sdk openrgb.  

Управление можно выполнять с помощью homebridge-better-http-rgb

либо любого другого web клиента/напрямую - Принимаются GET запросы:

Не забудьте указать хост и порт вашего клиента где установлен openrgb:
host: "IP"
port: 0000

Команда URL Описание
On http://localhost:8080/on Включает подсветку с последним использованным цветом.
Off http://localhost:8080/off Выключает подсветку.
Status http://localhost:8080/status Возвращает 0 если свет выключен (черный) либо 1 если установлен любой цвет и включена подсветка (обратите внимание, ответ в теле HTML).
Set Colour http://localhost:8080/set?val=[HEX-COLOUR] Задать цвет подсветки [HEX-COLOUR]
Get Colour http://localhost:8080/set Возвращает цвет в HEX формате (например #662774).
const { OpenRGBClient } = require('openrgb');
const http = require('http');
const url = require('url');
const colourFade = require('fade-steps');
var useColourFading = false;

var hex = '#000000';
var lastHex = '#ffffff';
var turnedOff = false;

http.createServer(function (req,res){
    
    res.writeHead(200, {'Content-Type': 'text/html'});
    
    var query = url.parse(req.url, true).query;
    var path = url.parse(req.url, true).pathname;
    var val = query.val;
    
    if(path == "/status"){
        if(hex == "#000000"){
            res.write("0");
        }else{
            res.write("1");
        }
    }else if(path == "/set"){
        if(val == null){
            res.write(hex);
        }else{
            lastHex = hex;
            hex = val;
        }
    }else if(path == "/on"){
        hex = lastHex;
        lastHex = "#000000";
        turnedOff = false;
    }else if(path == "/off"){
        lastHex = hex;
        hex = "#000000";
        turnedOff = true;
    }
        
    var interval = 100;
    
    var colArray = 
colourFade(lastHex.replace("#",""),hex.replace("#",""),10);
    
    if(useColourFading){
        for(i=0;i<colArray.length;i++){
            setTimeout(function(i){
                changeColours(colArray[i]);
            }, interval * i, i);
        }
    }else{
        if(turnedOff){
            changeColours("#000000");
        }else{
            changeColours(hex);
        }
        
    }
    
    console.log("Starting at: "+lastHex.replace("#",""));
    console.log("Ending at: "+hex.replace("#",""));
        
    res.end();
    
}).listen(8080);

async function changeColours (hexcol){
    
    var rgb = hexToRgb(hexcol);
    
    console.log(rgb);
    
    const client = new OpenRGBClient({
        host: "IP",
        port: 0000,
        name: "Open RGB Server"
    });

    await client.connect();
    const controllerCount = await client.getControllerCount();

    for (let deviceId = 0; deviceId < controllerCount; deviceId++) {
        var device = await client.getDeviceController(deviceId);
        
        var colors = Array(device.colors.length).fill({
            red: rgb.r,
            green: rgb.g,
            blue: rgb.b
        });
        
        await client.updateLeds(deviceId, colors);
    }

    
    return true;
}

function hexToRgb(hex) {
  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  return result ? {
    r: parseInt(result[1], 16),
    g: parseInt(result[2], 16),
    b: parseInt(result[3], 16)
  } : null;
}