Подключение управляемого кулера к raspberry



  • Добрый день, нужна помощь: прикупил кулер для корпуса на дин рейку: https://prom.ua/ua/p873312377-ventilyator-kuler-30h30h10.html и силовой модуль: https://diylab.com.ua/p704621321-silovij-modul-mosfet.html. Как написать скрипт чтобы вентилятор включался в заданую температуру и выключался когда raspberry остынет. температура raspberry без корпуса у меня 45 градусов, боюсь что когда засуну в корпус будет существенно выше температура. Операционная система: linux.



  • Лучше приклей радиатор , на алиэспресс их много.



  • @thunder_d:

    Лучше приклей радиатор , на алиэспресс их много.

    эта температура уже с радиатором, просто он будет в корпусе и в щитовой закрытой



  • @amgstone:

    Добрый день, нужна помощь: прикупил кулер для корпуса на дин рейку

    А какой корпус, если не секрет?



  • @gis:

    @amgstone:

    Добрый день, нужна помощь: прикупил кулер для корпуса на дин рейку

    А какой корпус, если не секрет?

    http://hobbytech.com.ua/shop/raspberry/italtronic-din-rail-raspberry-pi-model-b-2-case/



  • В такой корпус, можно ТАКОЙ радиатор засунуть, будет на 2-5 градусов выше температуры помещения, не ставь вентилятор, не долговечно.





  • Я себе сделал по этой статье.

    http://codius.ru/articles/Raspberry_Pi_3_GPIO_часть_3



  • Вопрос к разработке: цель - получить значение температуры процессора как значение датчика IH.

    this.execOS(vcgencmd measure_temp) выполняется из сценария, однако не получилось присвоить полученное в stdout значение переменной или датчику. Если в лоб пытаться, то по логу сценария идет запрос, окончание работы сценария, тадам!!! stdout: temp=___.

    Если идти через readline.question, то сценарий только запускается и останавливается не делая ничего. Как это сделать?



  • @Viktor:

    Вопрос к разработке: цель - получить значение температуры процессора как значение датчика IH.

    this.execOS(vcgencmd measure_temp) выполняется из сценария, однако не получилось присвоить полученное в stdout значение переменной или датчику. Если в лоб пытаться, то по логу сценария идет запрос, окончание работы сценария, тадам!!! stdout: temp=___.

    Если идти через readline.question, то сценарий только запускается и останавливается не делая ничего. Как это сделать?

    Действительно, функции обратного вызова у команды this.execOS не было.

    В ближайшем релизе 4.6.12 она будет добавлена, в качестве аргумента функция получает stdout:

    script({
        start() {
           this.execOS(`vcgencmd measure_temp`, 'process');
        },
        process(stdout) {
          ...
        }
    });
    
    

    В системе кроме сценариев есть плагины, которые тоже пишутся довольно просто и легко добавляются.

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

    Посмотрим, как реализовать эту задачу через плагин на js. Здесь нет никаких ограничений по синтаксису и обратным вызовам, чистейший Javascript.

    const child = require('child_process');  
    const plugin = require('ih-plugin-api')(); //  Объект для связи с сервером (ядром системы) 
    
    pollAndSend(); 
    setInterval(pollAndSend, interval * 5000); // Будем запрашивать раз в 5 секунд
    
    // Функция выполняет нужную команду и передает значение канала на сервер. Имя канала = CPU_TEMP
    function pollAndSend() {
      child.exec('vcgencmd measure_temp', (error, stdout, stderr) => {
        let err = 1;
        let value;
        if (!error) {
          plugin.log(`stdout: ${stdout}`);
          if (stdout && stdout.substr(0, 4) == 'temp') value = parseFloat(stdout.split('=').pop()); // Разбор значения temp=xxxx
          err = value == undefined ? 1 : 0;
        }
        plugin.sendData({ id: 'CPU_TEMP', value, err }); // Отдаем на сервер значение или ошибку
      });
    }
    
    
    

    Назовем наш новый плагин в честь команды vcgencmd.

    Кроме основного файла со скриптом (vcgencmd.js ) плагину еще нужны два файла:

    vcgencmd.ih - ярлык плагина

    {
        "id":"vcgencmd",
        "description":"RPI vcgencmd",
        "cross":true,
        "version":"0.0.1"
    }
    
    

    vcgencmd.json - манифест плагина

    {
      "name": "vcgencmd",
      "description": "RPI vcgencmd",
      "module": "vcgencmd.js",
      "single": 1,
    
      "params": [
        {
          "name": "interval",
          "note": "Интервал получения значений",
          "type": "number",
          "val": 60
        }
      ],
    
      "channels": [{ "id": "CPU_TEMP", "desc": "SensorA" }],
    
      "genrules": {
        "SensorA": {
          "cl": "SensorA"
        }
      }
    }
    
    

    Здесь прописываются параметры, которые будут доступны для интерактивного редактирования

    Например, можно дать пользователю менять интервал опроса.

    Также описан канал "CPU_TEMP", его можно будет привязать к аналоговому датчику.

    Все три файла должны быть в папке с названием плагина - vcgencmd

    Новый вариант файла vcgencmd.js с учетом получения параметров с сервера и дополнительной обработкой ошибок

    /**
     *  vcgencmd.js - плагин для чтения температуры CPU RPI
     */
    const child = require('child_process');
    const plugin = require('ih-plugin-api')(); 
    
    // читаем параметры с сервера - у нас это интервал опроса
    plugin.params.get()
      .then(params => {
        let interval = params.interval > 0 ? params.interval : 5;
        setInterval(pollAndSend, interval * 1000);
      })
      .catch(e => {
        plugin.exit(1, 'ERROR! ' + JSON.stringify(e));
      });
    
    // Функция выполняет нужную команду и передает значение на сервер
    // Имя канала = CPU_TEMP
    function pollAndSend() {
      child.exec('vcgencmd measure_temp', (error, stdout, stderr) => {
        let err = 1;
        let value;
        if (error) {
          plugin.log(`exec error: ${error}`);
        } else if (stderr) {
          plugin.log(`stderr: ${stderr}`);
        } else if (stdout) {
          plugin.log(`stdout: ${stdout}`);
    
          if (stdout && stdout.substr(0, 4) == 'temp') value = parseFloat(stdout.split('=').pop());
          err = value == undefined ? 1 : 0;
        } else {
          plugin.log(`EMPTY stdout!!`);
        }
        plugin.sendData({ id: 'CPU_TEMP', value, err });
      });
    }
    
    
    

    Теперь как подключить плагин к системе? Достаточно скопировать папку vcgencmd в /var/lib/intrahouse-c/plugins и обновить страничку раздела Плагины - новый плагин появится в списке с состоянии stop. Дальше все как обычно - нужно запустить плагин командой Старт, можно пользоваться отладчиком плагина, привязать канал к устройству.

    Во вложении архив в тремя файлами, можно загрузить как обычный плагин из zip файла
    vcgencmd.zip



  • @intrapro:

    @Viktor:

    Вопрос к разработке: цель - получить значение температуры процессора как значение датчика IH.

    this.execOS(vcgencmd measure_temp) выполняется из сценария, однако не получилось присвоить полученное в stdout значение переменной или датчику. Если в лоб пытаться, то по логу сценария идет запрос, окончание работы сценария, тадам!!! stdout: temp=___.

    Если идти через readline.question, то сценарий только запускается и останавливается не делая ничего. Как это сделать?

    Действительно, функции обратного вызова у команды this.execOS не было.

    В ближайшем релизе 4.6.12 она будет добавлена, в качестве аргумента функция получает stdout:

    > script({
    >     start() {
    >        this.execOS(`vcgencmd measure_temp`, 'process');
    >     },
    >     process(stdout) {
    >       ...
    >     }
    > });
    > 
    

    В системе кроме сценариев есть плагины, которые тоже пишутся довольно просто и легко добавляются.

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

    Посмотрим, как реализовать эту задачу через плагин на js. Здесь нет никаких ограничений по синтаксису и обратным вызовам, чистейший Javascript.

    > const child = require('child_process');  
    > const plugin = require('ih-plugin-api')(); //  Объект для связи с сервером (ядром системы) 
    > 
    > pollAndSend(); 
    > setInterval(pollAndSend, 5000); // Будем запрашивать раз в 5 секунд
    > 
    > // Функция выполняет нужную команду и передает значение канала на сервер. Имя канала = CPU_TEMP
    > function pollAndSend() {
    >   child.exec('vcgencmd measure_temp', (error, stdout, stderr) => {
    >     let err = 1;
    >     let value;
    >     if (!error) {
    >       plugin.log(`stdout: ${stdout}`);
    >       if (stdout && stdout.substr(0, 4) == 'temp') value = parseFloat(stdout.split('=').pop()); // Разбор значения temp=xxxx
    >       err = value == undefined ? 1 : 0;
    >     }
    >     plugin.sendData({ id: 'CPU_TEMP', value, err }); // Отдаем на сервер значение или ошибку
    >   });
    > }
    > 
    > 
    

    Назовем наш новый плагин в честь команды vcgencmd.

    Кроме основного файла со скриптом (vcgencmd.js ) плагину еще нужны два файла:

    vcgencmd.ih - ярлык плагина

    > {
    >     "id":"vcgencmd",
    >     "description":"RPI vcgencmd",
    >     "cross":true,
    >     "version":"0.0.1"
    > }
    > 
    

    vcgencmd.json - манифест плагина

    > {
    >   "name": "vcgencmd",
    >   "description": "RPI vcgencmd",
    >   "module": "vcgencmd.js",
    >   "single": 1,
    > 
    >   "params": [
    >     {
    >       "name": "interval",
    >       "note": "Интервал получения значений",
    >       "type": "number",
    >       "val": 60
    >     }
    >   ],
    > 
    >   "channels": [{ "id": "CPU_TEMP", "desc": "SensorA" }],
    > 
    >   "genrules": {
    >     "SensorA": {
    >       "cl": "SensorA"
    >     }
    >   }
    > }
    > 
    

    Здесь прописываются параметры, которые будут доступны для интерактивного редактирования

    Например, можно дать пользователю менять интервал опроса.

    Также описан канал "CPU_TEMP", его можно будет привязать к аналоговому датчику.

    Все три файла должны быть в папке с названием плагина - vcgencmd

    Новый вариант файла vcgencmd.js с учетом получения параметров с сервера и дополнительной обработкой ошибок

    > /**
    >  *  vcgencmd.js - плагин для чтения температуры CPU RPI
    >  */
    > const child = require('child_process');
    > const plugin = require('ih-plugin-api')(); 
    > 
    > // читаем параметры с сервера - у нас это интервал опроса
    > plugin.params.get()
    >   .then(params => {
    >     let interval = params.interval > 0 ? params.interval : 5;
    >     setInterval(pollAndSend, interval * 1000);
    >   })
    >   .catch(e => {
    >     plugin.exit(1, 'ERROR! ' + JSON.stringify(e));
    >   });
    > 
    > // Функция выполняет нужную команду и передает значение на сервер
    > // Имя канала = CPU_TEMP
    > function pollAndSend() {
    >   child.exec('vcgencmd measure_temp', (error, stdout, stderr) => {
    >     let err = 1;
    >     let value;
    >     if (error) {
    >       plugin.log(`exec error: ${error}`);
    >     } else if (stderr) {
    >       plugin.log(`stderr: ${stderr}`);
    >     } else if (stdout) {
    >       plugin.log(`stdout: ${stdout}`);
    > 
    >       if (stdout && stdout.substr(0, 4) == 'temp') value = parseFloat(stdout.split('=').pop());
    >       err = value == undefined ? 1 : 0;
    >     } else {
    >       plugin.log(`EMPTY stdout!!`);
    >     }
    >     plugin.sendData({ id: 'CPU_TEMP', value, err });
    >   });
    > }
    > 
    > 
    

    Теперь как подключить плагин к системе? Достаточно скопировать папку vcgencmd в /var/lib/intrahouse-c/plugins и обновить страничку раздела Плагины - новый плагин появится в списке с состоянии stop. Дальше все как обычно - нужно запустить плагин командой Старт, можно пользоваться отладчиком плагина, привязать канал к устройству.

    Во вложении архив в тремя файлами, можно загрузить как обычный плагин из zip файла

    vcgencmd.zip



  • Почему то плагин из архива не присваивает значение датчику. Лог плагина выдает следующее:

    17.09 22:31:26.634 vcgencmd: stdout: temp=52.1'C
    
    17.09 22:31:26.636 IH: get { id: 'CPU_TEMP', value: 52.1, err: 0 }
    set {}
    
    

    хотя датчик температуры прописан в канале

    Что не так?
    канал.jpg



  • @Viktor:

    Почему то плагин из архива не присваивает значение датчику. Лог плагина выдает следующее:

    хотя датчик температуры прописан в канале

    Что не так?

    Действительно, ошибочка в плагине. Метод sendData должен отправлять массив.

    Последняя команда в файле vcgencmd.js должна выглядеть так:

     plugin.sendData([{ id: 'CPU_TEMP', value, err }]);
    
    

    Вот новый архив
    vcgencmd-0.0.2.zip



  • Спасибо. Теперь заработало


Log in to reply