Ф-я получения данных о состоянии системы

import psutil
import datetime
import platform


def get_system_info():

    result = {}

    # ОС
    os_platform = platform.system()
    # Процессор
    processor = platform.processor()
    result.update({'platform': os_platform, 'processor': processor})
    # диски
    disks = psutil.disk_partitions()
    for i in disks:
        try:
            disk_usage = psutil.disk_usage(i.device)
            total = int(disk_usage .total) / 1048576
            used = int(disk_usage .used) / 1048576
            free = int(disk_usage .free) / 1048576
            percent = float(disk_usage .percent)
            disk_dict = {'total_space': total, 'used_space': used, 'free_space': free, 'free_percent': percent}
            result.update({'disk_space': disk_dict})

        except:
            pass

    # загрузка процессора
    cpu_percent = psutil.cpu_percent()
    result.update({'cpu_percent': cpu_percent})

    # аптайм
    boot_time = psutil.boot_time()
    uptime = datetime.datetime.now().timestamp() - boot_time
    result.update({'uptime': uptime})

    # оперативка:
    mem_status = psutil.virtual_memory()
    m_total = int(mem_status.total) / 1048576
    m_available = int(mem_status.available) / 1048576
    m_used = int(mem_status.used) / 1048576
    m_free = int(mem_status.free) / 1048576
    m_percent = float(mem_status.percent)
    memory_dict = {'total_mem': m_total, 'available_mem': m_available, 'used_mem': m_used,
                   'free_mem': m_free, 'free_percent_mem': m_percent}
    result.update({'memory_space': memory_dict})

    # температура процессора:
    try:
        # ToDo скорее всего надо прописать итератор для перечня  датчиков
        proc_temp = float(psutil.sensors_temperatures().current)
    except:
        proc_temp = None

    result.update({'proc_temp': proc_temp})

    return result


if __name__ == "__main__":
    res = get_system_info()
    for i in res.keys():
        print(i, res[i])

Источники:

Читать далее «Ф-я получения данных о состоянии системы»

Re: Self.Tracker

В догонку к своему посту про самошпиона:

Есть такая система опенсорсная HomeAssistant, которая позволяет соединять воедино разные части умного дома. Система весьма гибкая и интересная и я ее даже одно время плотно использовал, хотя и ниасилил в полном объеме.

Так вот, HomeAssistant имеет мобильное приложение (по крайней мере для Андроида), которое может быть установлено на телефон хозяина (равно как и на телефоны домочадцев) и довольно бодро логирует как факт перемещения (в координатах и ключевых точках, причем определяет тип перемещения — пешком или на машине), факт использования интернета, звонков и пр. и др. Все нашпионенное система складывает в локальную sqlite базу данных на локальном компе. Не густо, но хоть что-то. При этом система открыта к доработкам и в целом можно пробовать накручивать что-то свое.

Из минусов — необходимость иметь статичный IP дома, привязывать его к внешнему домену и, самое главное — открывать порты. Внутренний параноик хмурится. Плюс — yaml для меня как то до конца непонятен.

Мой опыт использования HomeAssistant закончился на том, что система в какой то момент упала, а восстанавливать ее было лениво, особенно с учетом того, что все текущие домашние автоматизации худо-бедно ворочаются силами Яндекс.Устройств и Mi Home (пусть боги покарают ленивых ее создателей и всех кто продает в РФ поделки, привязывающиеся только к китайским серверам).

Но надо будет вернуться.

Соревнования танков с ИИ

Давно зреет идея собрать танк в масштабе 1/16, вооруженный хард-пневматикой и оснащенный блоком самоуправления. То есть не пошлый RC, а вполне самостоятельный танк, сам идентифицирующий цели и нацеленный на уничтожение такого же танка-противника. Камеры, датчики, распознавание образов, прицеливание и вот это вот все.

По-моему, весьма интересная дисциплина кибер-спорта могла бы получиться.

Да, недешево, с учетом того, что дорогостоящая игрушка может быть уничтожена полностью огнем пневматической пушки, но зрелищный потенциал, я не говорю уже о разнообразии прикладных решений , весьма велик.

Цена входа — наверное около 100 т.р. плюс команда из человека с руками и 3d-принтером + средней руки программист.

Но пока жаба душит. И нет под рукой 3d-принтера и человека с руками из плеч. Сам могу претендовать только на роль идеолога-программиста.

Ну и с этичностью подобных разработок есть вопросы, хотя это конечно, детский лепет…

Функция конвертации секунд в более крупные периоды времени (Python)

Функция  превращает количество секунд в удобночитаемые человеком  значения времени.

def seconds_to_str(uptime):
    """
       Функция принимает числовое значение секунд и возвращает строку в формате:
       '3 нед., 1 дн., 18 час., 23 мин., 3 сек.'
       Доли секунды округляются до секунд.
    """

    seconds = ''
    minutes = ''
    hours = ''
    days = ''
    weeks = ''
    uptime = round(uptime, 0)

    if uptime >= 60:
        minutes = uptime // 60
        if minutes >= 60:
            hours = minutes // 60
            if hours >= 24:
                days = hours // 24
                if days >= 7:
                    weeks = days // 7
                    seconds, minutes, hours, days, weeks = str(int(uptime % 60)), str(int(minutes % 60)), str(
                        int(hours % 24)), str(int(days % 7)), str(int(weeks))
                else:
                    seconds, minutes, hours, days = str(int(uptime % 60)), str(int(minutes % 60)), str(
                        int(hours % 24)), str(int(days))
            else:
                seconds, minutes, hours = str(int(uptime % 60)), str(int(minutes % 60)), str(int(hours))
        else:
            seconds, minutes = str(int(uptime % 60)), str(int(minutes))
    else:
        seconds = str(int(uptime // 1))

    if weeks:
        weeks = weeks + ' нед.,'
    if days:
        days = days + ' дн.,'
    if hours:
        hours = hours + ' час.,'
    if minutes:
        minutes = minutes + ' мин.,'
    if seconds:
        seconds = seconds + ' сек.'
    res = weeks + ' ' + days + ' ' + hours + ' ' + minutes + ' ' + seconds
    print(res.strip())
    return res.strip()

 

Функция определения времени суток (Python)

Первый вариант: на основе словаря, более быстрый вариант:

import datetime
import time

def time_of_day_dict(dt=None, ts=None, tod_dict=None):
    '''
    Принимает объект datetime (dt) или timestamp (ts), и словарь tod_dict {час : наименование времени}
    Возвращает строку c временем суток. 
    При отсутствии аргументов - возвращает строку с текущим временем суток.

        Словарь по умолчанию: 
        {0: 'ночь', 1: 'ночь', 2: 'ночь',
         3: 'раннее утро', 4: 'раннее утро', 5: 'раннее утро',
         6: 'утро', 7: 'утро', 8: 'утро',
         9: 'первая половина дня', 10: 'первая половина дня', 11: 'первая половина дня',
         12: 'обед', 13: 'обед', 14: 'обед',
         15: 'после обеда', 16: 'после обеда', 17: 'после обеда',
         18: 'вечер', 19: 'вечер', 20: 'вечер',
         21: 'поздний вечер', 22: 'поздний вечер', 23: 'поздний вечер' }

    Eсли час не отражен в словаре, возвращает None
    Требует import datetime
    N.B. ф-я в 2-3 раза быстрее, чем ф-я time_of_day()
    '''

    # определение словаря
    if tod_dict:
        pass
    else:
        tod_dict = {0: 'ночь', 1: 'ночь', 2: 'ночь',
                    3: 'раннее утро', 4: 'раннее утро', 5: 'раннее утро',
                    6: 'утро', 7: 'утро', 8: 'утро',
                    9: 'первая половина дня', 10: 'первая половина дня', 11: 'первая половина дня',
                    12: 'обед', 13: 'обед', 14: 'обед',
                    15: 'после обеда', 16: 'после обеда', 17: 'после обеда',
                    18: 'вечер', 19: 'вечер', 20: 'вечер',
                    21: 'поздний вечер', 22: 'поздний вечер', 23: 'поздний вечер'}

    # определение оцениваемого времени
    if dt:
        if isinstance(dt, datetime.datetime):
            dt = dt
        else:
            print('некорректный формат dt: %s \n требуется объект datetime.datetime' % (type(dt)))
            return None
    elif ts:
        if isinstance(ts, (int, float)):
            if ts > 0:
                dt = datetime.datetime.fromtimestamp(ts)
                print(dt.ctime())
            else:
                print('отрицательное значение ts недопустимо')
                return None
        else:
            print('некорректный формат ts: %s \n требуется значение int или float' % (type(ts)))
            return None
    else:
        dt = datetime.datetime.now()
    h = dt.hour

    # подбор
    if h in tod_dict:
        tod = tod_dict[h]
        return tod
    else:
        print('Значение времени отсутствует в словаре')
        return None

 

Второй вариант, как пример того, как делать не надо ))

def time_of_day(dt=None, ts=None, tod_dict=None):
    '''
    Принимает объект datetime (dt) или timestamp (ts), и словарь tod_dict 
    {наименование времени : час окончания(включительно)}

    Возвращает строку c временем суток 
    При отсутствии аргументов - возвращает строку с текущим временем суток.

        Словарь по умолчанию: 
        {'ночь' : 3, 'раннее утро' : 6, 'утро' : 9, 'первая половина дня' : 12,
         'обед' : 15, 'после обеда' : 18, 'вечер' : 21, 'поздний вечер' : 24, }

    Если час не отражен в словаре, возвращает None
    Требует import datetime
    '''

    # определение словаря
    if tod_dict:
        pass
    else:
        tod_dict = {'ночь': 3, 'раннее утро': 6, 'утро': 9, 'первая половина дня': 12,
                    'обед': 15, 'после обеда': 18, 'вечер': 21, 'поздний вечер': 24, }
    sorted_tod = sorted(tod_dict.items(), key=lambda x: x[1], reverse=False)
    # print(sorted_tod)

    # определение оцениваемого времени
    if dt:
        if isinstance(dt, datetime.datetime):
            dt = dt
        else:
            print('некорректный формат dt: %s \n требуется объект datetime.datetime' % (type(dt)))
            return None
    elif ts:
        if isinstance(ts, (int, float)):
            if ts > 0:
                dt = datetime.datetime.fromtimestamp(ts)
                print(dt.ctime())
            else:
                print('отрицательное значение ts недопустимо')
                return None

        else:
            print('некорректный формат ts: %s \n требуется значение int или float' % (type(ts)))
            return None
    else:
        dt = datetime.datetime.now()
    h = dt.hour

    # подбор
    for time in sorted_tod:
        if h <= time[1]:
            tod = time[0]
            return tod
    print('Значение времени отсутствует в словаре')
    return None