Подключение управляемого кулера к raspberry
-
Добрый день, нужна помощь: прикупил кулер для корпуса на дин рейку
А какой корпус, если не секрет?
-
@gis:
Добрый день, нужна помощь: прикупил кулер для корпуса на дин рейку
А какой корпус, если не секрет?
http://hobbytech.com.ua/shop/raspberry/italtronic-din-rail-raspberry-pi-model-b-2-case/
-
В такой корпус, можно ТАКОЙ радиатор засунуть, будет на 2-5 градусов выше температуры помещения, не ставь вентилятор, не долговечно.
-
Чуток дешевле-https://ru.aliexpress.com/item/Raspberry-Pi-3-B-ABS/32867639159.html?spm=a2g0s.8937460.0.0.59202e0eIqyaHV
-
Вопрос к разработке: цель - получить значение температуры процессора как значение датчика IH.
this.execOS(
vcgencmd measure_temp
) выполняется из сценария, однако не получилось присвоить полученное в stdout значение переменной или датчику. Если в лоб пытаться, то по логу сценария идет запрос, окончание работы сценария, тадам!!! stdout: temp=___.Если идти через readline.question, то сценарий только запускается и останавливается не делая ничего. Как это сделать?
-
Вопрос к разработке: цель - получить значение температуры процессора как значение датчика 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 файла
-
Вопрос к разработке: цель - получить значение температуры процессора как значение датчика 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 {}
хотя датчик температуры прописан в канале
Что не так?
-
Почему то плагин из архива не присваивает значение датчику. Лог плагина выдает следующее:
хотя датчик температуры прописан в канале
Что не так?
Действительно, ошибочка в плагине. Метод sendData должен отправлять массив.
Последняя команда в файле vcgencmd.js должна выглядеть так:
plugin.sendData([{ id: 'CPU_TEMP', value, err }]);
Вот новый архив
-
Спасибо. Теперь заработало