• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

esp8266+mongoose-os+js+fs

mormolad

New member
доброго времени суток.
для работы с модулем использую mongoose-os. код пишу на JS. встала острая необходимость в процессе работы модуля что-нибудь записать в энергонизовисимую память. например: есть суточный таймер, который настраивается через mqtt, пока есть интернет и эл-во всё работает хорошо....но если пропадает эл-во то слетают настройки и, при включении эл-ва, пока инет не подтянется таймер не будет работать.
есть ли решение для того, что бы, когда настройки on/off прилетают на модуль, они прописывались на модуль, а потом в любой момент могли бы быть прочитаны
 

=AK=

New member
У модуля есть флэш память, туда можно писать и оттуда читать. Если б вы работали в среде Ардуино, я бы подсказал как это делать. А в mongoose-os, на JS - к сожалению, не имею понятия.
 

mormolad

New member
Про это я знаю.....и даже нашел как сделать на си, но в си я вообще ноль....думал может какой-то кастылик есть.....
 

mormolad

New member
Спасибо капитан очевидность.....но может ты по делу что нибудь скажешь?
 

mormolad

New member
Спасибо капитан очевидность.....но может ты по делу что нибудь скажешь?
 

mormolad

New member
пока реализовал так:
код исполняется на ПК
Код:
'use strict';
let mqtt = require('mqtt'); // подключем модуль для mqtt
let fs = require('fs'); // модуль для работы с файловой системой
let url = 'mqtt://******.cloudmqtt.com:17802'; //ip mqtt-брокера
let temperature11 = null; // переменные для хранения показаний датчиков
let temperature22 = null;
let humidity11 = null;
let humidity22 = null;
let text = null; // переменная для хранения текста на вывод в консоль и запись в лог файл

//время включения и выключения света
let hourSettingOnLight = 21; //час включения
let minuteSettingOnLight = 30; // минуты включения
let hourSettingOffLight = 3; //час отключения
let minuteSettingOffLight = 0; // минуты отключения
let msecsOnLight = hourSettingOnLight*1000*60*60 + minuteSettingOnLight*1000*60;
let msecsOffLight = hourSettingOffLight*1000*60*60 + minuteSettingOffLight*1000*60;

//время включения и выключения вентиляции
let hourSettingOnFan = 21; //час включения
let minuteSettingOnFan = 30; // минуты включения
let hourSettingOffFan = 23; //час отключения
let minuteSettingOffFan = 30; // минуты отключения
let msecsOnFan = hourSettingOnFan*1000*60*60 + minuteSettingOnFan*1000*60;
let msecsOffFan = hourSettingOffFan*1000*60*60 + minuteSettingOffFan*1000*60;


let topicRele = null;
let topicError = 'Error';
let msecsInThisDay = null;
let gMT = 7; // часовой пояс


let client = mqtt.connect(url, {username: '*********', password: '*********'}); //подключение к mqtt брокеру
console.log('== mqtt started ==')
client.on('connect', function () {
console.log('mother connected');
client.subscribe('Temperature11'); // здесь мы подписываемся на нужные нам сообщения от датчиков
client.subscribe('Humidity11');
client.subscribe('Temperature22');
client.subscribe('Humidity22');
});
client.on('close', function () { // надпись если нет подключения к брокеру
console.log('mother DISCONNECT');
});

function onMqttMessage(topic, message) {
if (topic === 'Temperature11') { // топик сравнивается, если температура с первого датчика то записывается
temperature11 = message;
}else if (topic === 'Humidity11') { // топику сравнивается, если влжн с первого датчика то записывается
humidity11 = message;
}else if (topic === 'Temperature22') { // по анологи с первым но для второго
temperature22 = message;
} else if (topic === 'Humidity22') {
humidity22 = message;
}
};

function logLoop() { // сборка текста для вывода на экран и в лог фаил
let text='';
text += new Date() + 'rnn';
text += 'температура 1: ' + temperature11 + 'rn';
text += 'влажность 1: ' + humidity11 + 'rnn';
text += 'температура 2: ' + temperature22 + 'rn';
text += 'влажность 2: ' + humidity22 + 'rnn';
console.log(text); //вывод в консоле
fs.appendFileSync('log1.txt', text + 'n'); //запись в фаил
};



function timeOnOffLight() { //начало суточного реле для света
msecsInThisDay = (Date.now()+1000*60*60*7)%(1000*60*60*24);
topicRele = 'releLight'
if (msecsOnLight < msecsOffLight) {
onMoreOffLight(msecsInThisDay);
}else {
offMoreOnLight(msecsInThisDay);
};
};
function onMoreOffLight() {
if (msecsInThisDay > msecsOnLight && msecsInThisDay < msecsOffLight) {
client.publish(topicRele, 'on');
} else {
client.publish(topicRele, 'off');
}
};
function offMoreOnLight() {
if (msecsInThisDay > msecsOffLight && msecsInThisDay < msecsOnLight) {
client.publish(topicRele, 'off');
} else {
client.publish(topicRele, 'on');
};
}; //конец суточного реле для света



function timeOnOffFan() { //начало суточного реле для вентиляции
msecsInThisDay = (Date.now() + 1000*60*60*gMT) % (1000*60*60*24);
topicRele = 'releFan'
if (msecsOnFan < msecsOffFan) {
onMoreOffFan();
}else {
offMoreOnFan();
};
};
function onMoreOffFan() {
if (msecsInThisDay > msecsOnFan && msecsInThisDay < msecsOffFan) {
client.publish(topicRele, 'on');
} else {
client.publish(topicRele, 'off');
};
};
function offMoreOnFan() {
if (msecsInThisDay > msecsOffFan && msecsInThisDay < msecsOnFan) {
client.publish(topicRele, 'off');
} else {
client.publish(topicRele, 'on');
};
};// конец суточного реле для вентиляции

//управление температурой курятника для обогрева
function onOffHot() {
if (parseInt(temperature22, 10) < 24) {
client.publish('releHot', 'on');
console.log ('батарея включена');
} else if (parseInt(temperature22, 10) > 24) {
client.publish('releHot', 'off');
console.log ('батарея включена');
} else {
client.publish(topicError, 'херня с температурой');
console.log ('херня с температурой');

};
};
setInterval(onOffHot, 1 * 1000); //проверка температуры
setInterval(timeOnOffLight, 1 * 1000); //включение света
setInterval(timeOnOffFan, 1 * 1000); //выключение вентиляции на ночь
setInterval(logLoop, 1 * 1000); // задаём интервал для записи в лог файла и вывода в консоль
client.on('message', onMqttMessage); // срабатывает при появлении нового сообщения в брокере


module.exports = client;
код залитый в епс
Код:
load('api_config.js');
load('api_rpc.js');
load('api_dht.js');
load('api_timer.js');
load('api_mqtt.js');
load('api_gpio.js');

let pinDht22 = 2;
let pinDht11 = 4;
let dht22 = DHT.create(pinDht22, DHT.DHT22);
let dht11 = DHT.create(pinDht11, DHT.DHT11);
GPIO.set_mode(13, GPIO.MODE_OUTPUT);
GPIO.set_mode(12, GPIO.MODE_OUTPUT);
GPIO.set_mode(14, GPIO.MODE_OUTPUT);
let topicTemp11 = null;
let topicHum11 = null;
let msgTemp11 = null;
let msgHum11 = null;


let topicTemp22 = null;
let topicHum22 = null;
let msgTemp22 = null;
let msgHum22 = null;
let tempBox2 = null;
let hum22 = null;

let topicError = 'error';
let msgError = null;

Timer.set(3*1000, true, function() {
topicTemp22 = 'Temperature22';
tempBox2 = Math.round(dht22.getTemp());
msgTemp22 = JSON.stringify(tempBox2) + ' гр.С';
topicHum22 = 'Humidity22';
hum22 = Math.round(dht22.getHumidity());
msgHum22 = JSON.stringify(hum22) + ' %';
MQTT.pub(topicTemp22, msgTemp22, 0);
MQTT.pub(topicHum22, msgHum22, 0);


topicTemp11 = 'Temperature11';
msgTemp11 = JSON.stringify(dht11.getTemp()) + ' гр.С';
topicHum11 = 'Humidity11';
msgHum11 = JSON.stringify(dht11.getHumidity()) + ' %';
MQTT.pub(topicTemp11, msgTemp11, 0);
MQTT.pub(topicHum11, msgHum11, 0);
}, null);

let msgReleHot = null;
let topicReleHot = null;
let onReleHot = null;

MQTT.sub('releHot', function(conn, topicReleHot, msgReleHot) { //включение обогрева
if (msgReleHot === 'on') {
GPIO.write(13, 0);
} else if (msgReleHot === 'off') {
GPIO.write(13, 1);
} else {
MQTT.pub(topicError, 'Error Hot', 0);
};
}, null);


let msgReleLight = null;
let topicReleLight = null;
let onReleLight = null;

MQTT.sub('releLight', function(conn, topicReleLight, msgReleLight) {
if (msgReleLight === 'on') {
GPIO.write(12, 0);
} else if (msgReleLight === 'off') {
GPIO.write(12, 1);
} else {
MQTT.pub(topicError, 'Error Light', 0);
};
}, null);


let msgReleFan = null;
let topicReleFan = null;
let onReleFan = null;

MQTT.sub('releFan', function(conn, topicReleFan, msgReleFan) {
if (msgReleFan === 'on') {
GPIO.write(14, 0);
} else if (msgReleFan === 'off') {
GPIO.write(14, 1);
} else {
MQTT.pub(topicError, 'Error Fan', 0);
};
}, null);
есть острое желание сделать всю логику на есп, а логирование и интерфейс уже на внешке.....
но при отключении электричества будут сбрасываться все настройки: суточного таймера для света/вентилятора или уставка по температуре.....сейчас они прописаны на пк......
вот и стою на развилке, или всё переносить на пк а на есп оставить только управление пинами и чтение датчиков (не очень подходящий для меня вариант) либо как то прописывать некоторые переменные на епс в FS, но как это сделать разобраться не могу
 

nikolz

Well-known member
есть два варианта
1) записать в память RTC ESP и поставить батарейку для работы при отключении питания
при этом отправлять ESP спать пока свет не дадут
2) записать во флеш Опять два варианта
поставить файловую систему (найти скетч не проблема)
записывать в пустое место флеш
Команды записи чтения можно взять из документации SDK
 

mormolad

New member
nikolz, первый вариант как раз и будет иметь вид костыля.....
а 2.1 не совсем понятно что ты имеешь ввиду.....монгуз делает файловую систему, но работать с ней на js не пойму как.
2.2 вот именно как???
п.с. интересная манера, отвечая не ответить=)
 

nikolz

Well-known member
nikolz, первый вариант как раз и будет иметь вид костыля.....
а 2.1 не совсем понятно что ты имеешь ввиду.....монгуз делает файловую систему, но работать с ней на js не пойму как.
2.2 вот именно как???
п.с. интересная манера, отвечая не ответить=)
нет первый вариант - это классический пример работы автономного блока.
----------------
УВЫ, как на js делать в ESP не знаю.
Я вообще считаю, что на таких ресурсах как у ESP использовать jS это ...
Поэтому пишу на СИ и делаю все, что придумаю без проблем.
 

mormolad

New member
nikolz,
первый вариант - это классический ....
если выражатся правильно, то это АВР по питанию =)
и в данному случае будет именно кастылём, так как при потере питания не будет сохранение функционала в больном объёме, а использовать АВР для хранения переменных.....ну ты понял=) при чём эта задача решается одним блочком типа этого [URL]https://www.ant-electric.ru/kontaktor-modulnyy-esb-20-11-20a-ac1-400v-ac[/url]
а твоё предложение состоит в том чтобы мне выучить новый язык....спосибо поржал
 

mormolad

New member
если что я вообще не програмист и выбрал именно монгус что бы использовать JS везде где мне нужно=), думал тут нормальный форум=( а тут так поглумиться над новичками.....
УВЫ, как на js делать в ESP не знаю.
Я вообще считаю, что на таких ресурсах как у ESP использовать jS это ...
Поэтому пишу на СИ и делаю все, что придумаю без проблем.
ну так а зечем вообще отвечал в топике??? новерное показать какой ты охрененый саркастье????
 

nikolz

Well-known member
если что я вообще не програмист и выбрал именно монгус что бы использовать JS везде где мне нужно=), думал тут нормальный форум=( а тут так поглумиться над новичками.....

ну так а зечем вообще отвечал в топике??? новерное показать какой ты охрененый саркастье????
На брудершафт мы вроде бы не пили. Не понял почему Вы мне тыкаете?
И не надо хамить и пытаться и хвалиться собственным невежеством,
то что Вы не программист мне не важно, а то что Вы хам, это имеет значение.
Поэтому беседовать с вами не интересно.
 

mormolad

New member
=AK=, с вам я общался нормально. но вижу у вас тут клуб по интересам :p
темболее ответ я нашёл, как сделать на js и без костылей..... хотел даже вечерком накидать скрипт и оставить здесь, не смотря на обиженку Николза...но раз у вас тут принято гнобить новичков и надменное общение, пожалуй я отчаливаю.....на вашем полуживом форуме свет клином не сошёлся:)
 

=AK=

New member
раз у вас тут принято гнобить новичков
У нас принято гнобить хамоватых самовлюбленных козлов. Будь они новички или старожилы, не играет рояли. Козлом по умолчанию автоматически считается любой, "тыкающий" незнакомым ему людям. Ну а самовлюбленность легко определяется по тому, слушает ли чел ответы, или долдонит что-то свое.
 

mormolad

New member
=AK=,
Козлом по умолчанию автоматически считается любой, "тыкающий" незнакомым ему людям.
хм...следуя вашей логике козлом как бы я ещё не являюсь, потому как людям я не тыкал....а позволил ответить хамством на высокомерие лишь в отношении одного человека =)
в отношении меня тыкать начали вы, не буду гадать первыя ли я, вам незнакомый человек, которому вы первый наченаете тыкать......
еслли разбирать ситуацию с Николзом, то для меня человек позволяющий пустое высокомерие являестся не заслуживающим увашения, тем более, в правилах не написано, что здесь принято общение только на вы, и можно было б попросту поправить при первом обращении на ты к кепу, указать на негласное правило, без устраивания истерик =) но нет же, умничать он продолжил и оскарблять....согласен что я нарушил пункт правил 4.10 и готов за это понести наказание, но вместе с выше помянутым кепом....так как считаю его провокатором (п. 4.10)
 
Сверху Снизу