private string getPowerProducersStatus <T>(CBlocksBase <T> group) where T : class, IMyTerminalBlock
    {
        if (!group.isAssignable <IMyPowerProducer>())
        {
            return("");
        }
        string result        = "";
        float  currentOutput = 0f;
        float  maxOutput     = 0f;

        foreach (IMyPowerProducer block in group.blocks())
        {
            CBlockPowerInfo pInfo = new CBlockPowerInfo(block);
            currentOutput += pInfo.currentProduce();
            maxOutput     += pInfo.maxProduce();
        }
        result += $"Ген. энергии (now:max): {toHumanReadable(currentOutput, EHRUnit.Power)}:{toHumanReadable(maxOutput, EHRUnit.Power)} ";
        return(result);
    }
    private string getFunctionaBlocksStatus <T>(CBlocksBase <T> group) where T : class, IMyTerminalBlock
    {
        if (!group.isAssignable <IMyFunctionalBlock>())
        {
            return("");
        }
        string result           = "";
        int    pOn              = 0;
        int    fOn              = 0;
        int    wOn              = 0;
        float  powerConsumed    = 0f;
        float  powerMaxConsumed = 0f;

        foreach (IMyFunctionalBlock block in group.blocks())
        {
            if (block.Enabled)
            {
                pOn++;
                CBlockPowerInfo pInfo = new CBlockPowerInfo(block);
                powerConsumed    += pInfo.currentConsume();
                powerMaxConsumed += pInfo.maxConsume();
            }
            if (block.IsFunctional)
            {
                fOn++;
            }
            if (block.IsWorking)
            {
                wOn++;
            }
        }
        result += $"PFW: {pOn}:{fOn}:{wOn} ";
        if (powerMaxConsumed > 0)
        {
            result += $"Consuming (now,max): {toHumanReadable(powerConsumed, EHRUnit.Power)}:{toHumanReadable(powerMaxConsumed, EHRUnit.Power)} ";
        }
        return(result);
    }