Wirenboard
Получить данные геолокации
cat /dev/ttyMOD2
Функция whenChanged для массива топиков
whenChanged: ["VInputs/DI1_CommonFault", "VInputs/DI2_VoltageStatus"] ,cat /dev/ttyMOD2
Работа с виртуальной сетвеой картовй GSM
wb-gsm restart_if_broken
ifup usb0
ifconfig
Принципы написания правил JS
https://github.com/wirenboard/wb-rules
Скетч рабочий 20230601 17:53
trackMqtt("/devices/flapController/controls/itemStrtDgu", function(message){
if(message.value=="1")
{
dev['flapController/itemStrtDguStr'] = 'true';
}
else if(message.value=="0")
{
dev['flapController/itemStrtDguStr'] = 'false';
}
});
trackMqtt("/devices/flapController/controls/itemManStrtLght", function(message){
if(message.value=="1")
{
dev['flapController/itemManStrtLghtStr'] = 'true';
}
else if(message.value=="0")
{
dev['flapController/itemManStrtLghtStr'] = 'false';
}
});
trackMqtt("/devices/flapController/controls/itemAutoStrtLght", function(message){
if(message.value=="1")
{
dev['flapController/itemAutoStrtLghtStr'] = 'true';
}
else if(message.value=="0")
{
dev['flapController/itemAutoStrtLghtStr'] = 'false';
}
});
var idFlapTimer = null; //идентификатор таймера заслонки для управления им
var FLAP_TIMEOUT_S = 3; //допустимое время открытия заслонки, с
defineVirtualDevice('flapController', {
title: 'Flap controller',
cells: {
itemStrtDgu: {
type: 'switch',
value: false,
readonly: false
},
itemStrtDguStr: {
type: 'text',
value: 'false',
readonly: true
},
itemAutoStrtLght: {
type: 'switch',
value: false,
readonly: false
},
itemAutoStrtLghtStr: {
type: 'text',
value: 'false',
readonly: true
},
itemManStrtLght: {
type: 'switch',
value: false,
readonly: false
},
itemManStrtLghtStr: {
type: 'text',
value: 'false',
readonly: true
},
itemState: {
type: 'text',
value: 'close',
readonly: true
},
}
});
function startFlapTimer() {
return setTimeout(function () {
dev['flapController/itemState'] = 'fault';
dev[AI_TST] = 18;
}, FLAP_TIMEOUT_S * 1000);
}
defineRule({
whenChanged: 'flapController/itemStrtDguStr',
then: function (neValue) {
if (dev['flapController/itemStrtDguStr'] == 'true') {
dev['flapController/itemState'] = 'true';
}
if (dev['flapController/itemStrtDguStr'] == 'false') {
dev['flapController/itemState'] = 'false';
idFlapTimer = startFlapTimer();
}
}
}
);
defineRule({
whenChanged: 'flapController/itemManStrtLghtStr',
then: function (neValue) {
if (dev['flapController/itemManStrtLghtStr'] == 'true') {
dev['wb-gpio/EXT2_R3A1'] = true;
}
if (dev['flapController/itemManStrtLghtStr'] == 'false') {
dev['wb-gpio/EXT2_R3A1'] = false;
}
}
}
);
Скетч рабочий 20230602 14:38
var itemAlrmLvl = 'wb-gpio/EXT1_IN1'
var itemAutoModeDgu = 'wb-gpio/EXT1_IN6'
var itemStrtLamp = 'wb-gpio/EXT2_R3A1'
var itemTempOut = 'wb-mai6_191/IN 3 P Temperature'
var idInitTimer = null; //идентификатор таймера
var idStrtTimer = null; //идентификатор таймера
var idPwrTimer = null; //идентификатор таймера
var INIT_TIMEOUT_S = 2; //время инициализации, с
var STRT_TIMEOUT_S = 2; //время запуска стартера, с
var PWR_TIMEOUT_S = 2; //время ожидания готовности, с
trackMqtt("/devices/flapController/controls/itemStrtDgu", function(message){
if(message.value=="1")
{
dev['flapController/itemStrtDguStr'] = true;
}
else if(message.value=="0")
{
dev['flapController/itemStrtDguStr'] = false;
}
});
trackMqtt("/devices/flapController/controls/itemManStrtLght", function(message){
if(message.value=="1")
{
dev['flapController/itemManStrtLghtStr'] = true;
}
else if(message.value=="0")
{
dev['flapController/itemManStrtLghtStr'] = false;
}
});
trackMqtt("/devices/flapController/controls/itemAutoStrtLght", function(message){
if(message.value=="1")
{
dev['flapController/itemAutoStrtLghtStr'] = true;
}
else if(message.value=="0")
{
dev['flapController/itemAutoStrtLghtStr'] = false;
}
});
defineVirtualDevice('flapController', {
title: 'Flap controller',
cells: {
itemStrtDgu: {
type: 'switch',
value: false,
readonly: false
},
itemStrtDguStr: {
type: 'switch',
value: false,
readonly: false
},
itemAutoStrtLght: {
type: 'switch',
value: false,
readonly: false
},
itemAutoStrtLghtStr: {
type: 'switch',
value: false,
readonly: false
},
itemManStrtLght: {
type: 'switch',
value: false,
readonly: false
},
itemManStrtLghtStr: {
type: 'switch',
value: false,
readonly: false
},
itemState: {
type: 'text',
value: 'Отключен',
readonly: true
},
itemSeason: {
type: 'text',
value: 'Зима',
readonly: true
},
}
});
function startInitTimer() {
return setTimeout(function () {
dev['flapController/itemState'] = 'Запуск стартера';
idStrtTimer = startStrtTimer();
}, INIT_TIMEOUT_S * 1000);
}
function startStrtTimer() {
return setTimeout(function () {
dev['flapController/itemState'] = 'Ожидание разрешения на пуск нагрузки';
idPwrTimer = startPwrTimer();
}, STRT_TIMEOUT_S * 1000);
}
function startPwrTimer() {
return setTimeout(function () {
dev['flapController/itemState'] = 'Готовность';
}, PWR_TIMEOUT_S * 1000);
}
defineRule({
whenChanged: ['flapController/itemStrtDguStr', itemAlrmLvl, itemAutoModeDgu],
then: function() {
if (dev[itemAutoModeDgu] == true) { //! инвертировать
dev['flapController/itemState'] = 'Нет авто';
clearTimeout(idInitTimer);
clearTimeout(idStrtTimer);
clearTimeout(idPwrTimer);
}
else if (dev[itemAlrmLvl] == true) {
dev['flapController/itemState'] = 'Авария';
clearTimeout(idInitTimer);
clearTimeout(idStrtTimer);
clearTimeout(idPwrTimer);
}
else{
if (dev['flapController/itemStrtDguStr'] == true) {
dev['flapController/itemState'] = 'Инициализация';
idInitTimer = startInitTimer();
}
if (dev['flapController/itemStrtDguStr'] == false) {
dev['flapController/itemState'] = 'Отключен';
clearTimeout(idInitTimer);
clearTimeout(idStrtTimer);
clearTimeout(idPwrTimer);
}
}
}
}
);
defineRule({
whenChanged: ['flapController/itemManStrtLghtStr', 'flapController/itemAutoStrtLghtStr', 'flapController/itemState'],
then: function() {
if (dev['flapController/itemState'] == 'Готовность'){
if (dev['flapController/itemAutoStrtLghtStr'] == true){
if (dev['flapController/itemManStrtLghtStr'] == true) {
dev[itemStrtLamp] = true;
}
if (dev['flapController/itemManStrtLghtStr'] == false) {
dev[itemStrtLamp] = false;
}
}
if (dev['flapController/itemAutoStrtLghtStr'] == false){
dev[itemStrtLamp] = false;
}
}
else{
dev[itemStrtLamp] = false;
}
}
}
);
defineRule({
whenChanged: itemTempOut,
then: function() {
if (dev[itemTempOut] > 29) {
dev['flapController/itemSeason'] = 'Лето';
}
if (dev[itemTempOut] < 27) {
dev['flapController/itemSeason'] = 'Зима';
}
}
}
);
Скет 20230605 10:14
var itemAlrmLvl = 'wb-gpio/EXT1_IN1'
var itemRunGen = 'wb-gpio/EXT1_IN2'
var itemRunPwr = 'wb-gpio/EXT1_IN3'
var itemHeatSha = 'wb-gpio/EXT1_IN4'
var itemHeatDgu = 'wb-gpio/EXT1_IN5'
var itemAutoModeDgu = 'wb-gpio/EXT1_IN6'
var itemStrtDgu = 'wb-gpio/EXT2_R3A1'
var itemLnchDgu = 'wb-gpio/EXT2_R3A2'
var itemStrtLamp = 'wb-gpio/EXT2_R3A3'
var itemHeatDgu = 'wb-gpio/EXT2_R3A4'
var itemLvlGas = 'wb-mai6_191/IN 1 P Resistance'
var itemBrht = 'wb-mai6_191/IN 2 P Resistance'
var itemTempOut = 'wb-mai6_191/IN 3 P Temperature'
var idInitTimer = null; //идентификатор таймера
var idStrtTimer = null; //идентификатор таймера
var idPwrTimer = null; //идентификатор таймера
var idPreheatTimer = null; //идентификатор таймера
var INIT_TIMEOUT_S = 2; //время инициализации, с
var STRT_TIMEOUT_S = 6; //время запуска стартера, с
var PWR_TIMEOUT_S = 2; //время ожидания готовности, с
var PREHEAT_TIMEOUT_S = 4; //время ожидания готовности, с
trackMqtt("/devices/flapController/controls/itemStrtDgu", function(message){
if(message.value=="1")
{
dev['flapController/itemStrtDguStr'] = true;
}
else if(message.value=="0")
{
dev['flapController/itemStrtDguStr'] = false;
}
});
trackMqtt("/devices/flapController/controls/itemManStrtLght", function(message){
if(message.value=="1")
{
dev['flapController/itemManStrtLghtStr'] = true;
}
else if(message.value=="0")
{
dev['flapController/itemManStrtLghtStr'] = false;
}
});
trackMqtt("/devices/flapController/controls/itemAutoStrtLght", function(message){
if(message.value=="1")
{
dev['flapController/itemAutoStrtLghtStr'] = true;
}
else if(message.value=="0")
{
dev['flapController/itemAutoStrtLghtStr'] = false;
}
});
defineVirtualDevice('flapController', {
title: 'Flap controller',
cells: {
itemStrtDgu: {
type: 'switch',
value: false,
readonly: false
},
itemStrtDguStr: {
type: 'switch',
value: false,
readonly: false
},
itemAutoStrtLght: {
type: 'switch',
value: false,
readonly: false
},
itemAutoStrtLghtStr: {
type: 'switch',
value: false,
readonly: false
},
itemManStrtLght: {
type: 'switch',
value: false,
readonly: false
},
itemManStrtLghtStr: {
type: 'switch',
value: false,
readonly: false
},
itemState: {
type: 'text',
value: 'Отключен',
readonly: true
},
itemSeason: {
type: 'text',
value: 'Зима',
readonly: true
},
}
});
function startInitTimer() {
return setTimeout(function () {
if (dev['flapController/itemSeason'] == 'Зима') {
dev['flapController/itemState'] = 'Прогрев картера';
idPreheatTimer = startPreheatTimer();
}
if (dev['flapController/itemSeason'] == 'Лето') {
dev['flapController/itemState'] = 'Запуск стартера';
idStrtTimer = startStrtTimer();
}
}, INIT_TIMEOUT_S * 1000);
}
function startStrtTimer() {
return setTimeout(function () {
dev['flapController/itemState'] = 'Авария';
}, STRT_TIMEOUT_S * 1000);
}
function startPwrTimer() {
return setTimeout(function () {
dev['flapController/itemState'] = 'Готовность';
}, PWR_TIMEOUT_S * 1000);
}
function startPreheatTimer() {
return setTimeout(function () {
dev['flapController/itemState'] = 'Запуск стартера';
idStrtTimer = startStrtTimer();
}, PREHEAT_TIMEOUT_S * 1000);
}
defineRule({
whenChanged: ['flapController/itemStrtDguStr', itemAlrmLvl, itemAutoModeDgu],
then: function() {
if (dev[itemAutoModeDgu] == true) { //! инвертировать
dev['flapController/itemState'] = 'Нет авто';
clearTimeout(idInitTimer);
clearTimeout(idStrtTimer);
clearTimeout(idPwrTimer);
}
else if (dev[itemAlrmLvl] == true) {
dev['flapController/itemState'] = 'Авария';
clearTimeout(idInitTimer);
clearTimeout(idStrtTimer);
clearTimeout(idPwrTimer);
}
else{
if ((dev['flapController/itemStrtDguStr'] == true) && !(dev['flapController/itemState'] == 'Авария')) {
dev['flapController/itemState'] = 'Инициализация';
idInitTimer = startInitTimer();
}
if (dev['flapController/itemStrtDguStr'] == false) {
dev['flapController/itemState'] = 'Отключен';
clearTimeout(idInitTimer);
clearTimeout(idStrtTimer);
clearTimeout(idPwrTimer);
}
}
}
}
);
defineRule({
whenChanged: ['flapController/itemManStrtLghtStr', 'flapController/itemAutoStrtLghtStr', 'flapController/itemState'],
then: function() {
if (dev['flapController/itemState'] == 'Готовность'){
if (dev['flapController/itemAutoStrtLghtStr'] == true){
if (dev['flapController/itemManStrtLghtStr'] == true) {
dev[itemStrtLamp] = true;
}
if (dev['flapController/itemManStrtLghtStr'] == false) {
dev[itemStrtLamp] = false;
}
}
if (dev['flapController/itemAutoStrtLghtStr'] == false){
dev[itemStrtLamp] = false;
}
}
else{
dev[itemStrtLamp] = false;
}
}
}
);
defineRule({
whenChanged: itemTempOut,
then: function() {
if (dev[itemTempOut] > 29) {
dev['flapController/itemSeason'] = 'Лето';
}
if (dev[itemTempOut] < 27) {
dev['flapController/itemSeason'] = 'Зима';
}
}
}
);
defineRule({
whenChanged: itemRunGen,
then: function() {
if ((dev[itemRunGen] == true) && (dev['flapController/itemState'] == 'Запуск стартера') && (dev[itemAutoModeDgu] == false)) { //инвертировать
clearTimeout(idStrtTimer);
dev['flapController/itemState'] = 'Ожидание разрешения на пуск нагрузки';
idPwrTimer = startPwrTimer();
}
if ((dev[itemRunGen] == false) && ((dev['flapController/itemState'] == 'Готовность') || (dev['flapController/itemState'] == 'Ожидание разрешения на пуск нагрузки'))) {
dev['flapController/itemState'] = 'Авария';
clearTimeout(idInitTimer);
clearTimeout(idStrtTimer);
clearTimeout(idPwrTimer);
}
}
}
);
Скетч рабочего модального окна
Не удалось изменить размер всплывающего окна
- component: oh-button
config:
text: "Подрбонее"
bgColor: blue
style:
margin: 15px
left: 0%
top: 0%
border-radius: 12px
font-size: 16px
color: white
action: sheet
actionModal: widget:dgu_full_widget
actionModalConfig:
itemPower: =props.itemPower
itemCurrent: =props.itemCurrent
itemEnergy: =props.itemEnergy
itemVoltage: =props.itemVoltage
itemLvlGas: =props.itemLvlGas
Скетч 20230607 16:04
var itemAlrmLvl = 'wb-gpio/EXT1_IN1'
var itemRunGen = 'wb-gpio/EXT1_IN2'
var itemRunPwr = 'wb-gpio/EXT1_IN3'
var itemHeatSha = 'wb-gpio/EXT1_IN4'
var itemHeatDgu = 'wb-gpio/EXT1_IN5'
var itemAutoModeDgu = 'wb-gpio/EXT1_IN6'
var itemStrtDgu = 'wb-gpio/EXT2_R3A1'
var itemLnchDgu = 'wb-gpio/EXT2_R3A2'
var itemStrtLamp = 'wb-gpio/EXT2_R3A3'
var itemHeatDgu = 'wb-gpio/EXT2_R3A4'
var itemLvlGas = 'wb-mai6_191/IN 1 P Resistance'
var itemBrht = 'wb-mai6_191/IN 2 P Resistance'
var itemTempOut = 'wb-mai6_191/IN 3 P Temperature'
var idInitTimer = null; //идентификатор таймера
var idStrtTimer = null; //идентификатор таймера
var idPwrTimer = null; //идентификатор таймера
var idPreheatTimer = null; //идентификатор таймера
var INIT_TIMEOUT_S = 2; //время инициализации, с
var STRT_TIMEOUT_S = 6; //время запуска стартера, с
var PWR_TIMEOUT_S = 2; //время ожидания готовности, с
var PREHEAT_TIMEOUT_S = 4; //время ожидания готовности, с
var locVolGasTank = 50; //объем топливного бака, л
trackMqtt("/devices/flapController/controls/itemStrtDgu", function(message){
if(message.value=="1")
{
dev['flapController/itemStrtDguStr'] = true;
}
else if(message.value=="0")
{
dev['flapController/itemStrtDguStr'] = false;
}
});
trackMqtt("/devices/flapController/controls/itemManStrtLght", function(message){
if(message.value=="1")
{
dev['flapController/itemManStrtLghtStr'] = true;
}
else if(message.value=="0")
{
dev['flapController/itemManStrtLghtStr'] = false;
}
});
trackMqtt("/devices/flapController/controls/itemAutoStrtLght", function(message){
if(message.value=="1")
{
dev['flapController/itemAutoStrtLghtStr'] = true;
}
else if(message.value=="0")
{
dev['flapController/itemAutoStrtLghtStr'] = false;
}
});
defineVirtualDevice('flapController', {
title: 'Flap controller',
cells: {
itemStrtDgu: {
type: 'switch',
value: false,
readonly: false
},
itemStrtDguStr: {
type: 'switch',
value: false,
readonly: false
},
```
itemAutoStrtLght: {
type: 'switch',
value: false,
readonly: false
},
itemAutoStrtLghtStr: {
type: 'switch',
value: false,
readonly: false
},
itemManStrtLght: {
type: 'switch',
value: false,
readonly: false
},
itemManStrtLghtStr: {
type: 'switch',
value: false,
readonly: false
},
itemState: {
type: 'text',
value: 'Отключен',
readonly: true
},
itemSeason: {
type: 'text',
value: 'Зима',
readonly: true
},
itemVolLitr: {
type: 'text',
value: '0.0',
readonly: true
},
itemVolPerc: {
type: 'text',
value: '0.0',
readonly: true
},
```
}
});
function startInitTimer() {
return setTimeout(function () {
if (dev['flapController/itemSeason'] == 'Зима') {
dev['flapController/itemState'] = 'Прогрев картера';
idPreheatTimer = startPreheatTimer();
}
if (dev['flapController/itemSeason'] == 'Лето') {
dev['flapController/itemState'] = 'Запуск стартера';
idStrtTimer = startStrtTimer();
}
}, INIT_TIMEOUT_S * 1000);
}
function startStrtTimer() {
return setTimeout(function () {
dev['flapController/itemState'] = 'Авария';
}, STRT_TIMEOUT_S * 1000);
}
function startPwrTimer() {
return setTimeout(function () {
dev['flapController/itemState'] = 'Готовность';
}, PWR_TIMEOUT_S * 1000);
}
function startPreheatTimer() {
return setTimeout(function () {
dev['flapController/itemState'] = 'Запуск стартера';
idStrtTimer = startStrtTimer();
}, PREHEAT_TIMEOUT_S * 1000);
}
defineRule({
whenChanged: ['flapController/itemStrtDguStr', itemAlrmLvl, itemAutoModeDgu],
then: function() {
if (dev[itemAutoModeDgu] == true) { //! инвертировать
dev['flapController/itemState'] = 'Нет авто';
}
else if (dev[itemAlrmLvl] == true) {
dev['flapController/itemState'] = 'Авария';
}
else{
if ((dev['flapController/itemStrtDguStr'] == true) && !(dev['flapController/itemState'] == 'Авария')) {
dev['flapController/itemState'] = 'Инициализация';
idInitTimer = startInitTimer();
}
if (dev['flapController/itemStrtDguStr'] == false) {
dev['flapController/itemState'] = 'Отключен';
}
}
}
}
);
defineRule({
whenChanged: ['flapController/itemManStrtLghtStr', 'flapController/itemAutoStrtLghtStr', 'flapController/itemState'],
then: function() {
if (dev['flapController/itemState'] == 'Готовность'){
if (dev['flapController/itemAutoStrtLghtStr'] == true){
if (dev['flapController/itemManStrtLghtStr'] == true) {
dev[itemStrtLamp] = true;
}
if (dev['flapController/itemManStrtLghtStr'] == false) {
dev[itemStrtLamp] = false;
}
}
}
else{
dev[itemStrtLamp] = false;
}
}
}
);
defineRule({
whenChanged: itemTempOut,
then: function() {
if (dev[itemTempOut] > 29) {
dev['flapController/itemSeason'] = 'Лето';
}
if (dev[itemTempOut] < 27) {
dev['flapController/itemSeason'] = 'Зима';
}
}
}
);
defineRule({
whenChanged: itemRunGen,
then: function() {
if ((dev[itemRunGen] == true) && (dev['flapController/itemState'] == 'Запуск стартера') && (dev[itemAutoModeDgu] == false)) { //инвертировать
clearTimeout(idStrtTimer);
dev['flapController/itemState'] = 'Ожидание разрешения на пуск нагрузки';
idPwrTimer = startPwrTimer();
}
if ((dev[itemRunGen] == false) && ((dev['flapController/itemState'] == 'Готовность') || (dev['flapController/itemState'] == 'Ожидание разрешения на пуск нагрузки'))) {
dev['flapController/itemState'] = 'Авария';
}
}
}
);
defineRule({
whenChanged: 'flapController/itemState',
then: function() {
if ((dev['flapController/itemState'] == 'Отключен') || (dev['flapController/itemState'] == 'Нет авто') || (dev['flapController/itemState'] == 'Авария')) {
dev[itemStrtDgu] = false;
dev[itemLnchDgu] = false;
dev[itemStrtLamp] = false;
dev[itemHeatDgu] = false;
clearTimeout(idInitTimer);
clearTimeout(idStrtTimer);
clearTimeout(idPwrTimer);
clearTimeout(idPreheatTimer);
}
else if (dev['flapController/itemState'] == 'Инициализация') {
dev[itemStrtDgu] = true;
dev[itemLnchDgu] = false;
dev[itemStrtLamp] = false;
dev[itemHeatDgu] = false;
}
else if (dev['flapController/itemState'] == 'Прогрев картера') {
dev[itemStrtDgu] = true;
dev[itemLnchDgu] = false;
dev[itemStrtLamp] = false;
dev[itemHeatDgu] = true;
}
else if (dev['flapController/itemState'] == 'Запуск стартера') {
dev[itemStrtDgu] = true;
dev[itemLnchDgu] = true;
dev[itemStrtLamp] = false;
dev[itemHeatDgu] = false;
}
else if (dev['flapController/itemState'] == 'Ожидание разрешения на пуск нагрузки') {
dev[itemStrtDgu] = true;
dev[itemLnchDgu] = false;
dev[itemStrtLamp] = false;
dev[itemHeatDgu] = false;
}
else if (dev['flapController/itemState'] == 'Готовность') {
dev[itemStrtDgu] = true;
dev[itemLnchDgu] = false;
dev[itemHeatDgu] = false;
}
}
}
);
defineRule({
whenChanged: [itemBrht, 'flapController/itemAutoStrtLghtStr'],
then: function() {
if ((dev['flapController/itemAutoStrtLghtStr'] == false) && (dev['flapController/itemState'] == 'Готовность')) {
if (dev[itemBrht] > 5000) {
dev[itemStrtLamp] = true;
}
if (dev[itemBrht] < 2000) {
dev[itemStrtLamp] = false;
}
}
}
}
);
defineRule({
whenChanged: itemLvlGas,
then: function() {
dev['flapController/itemVolLitr'] = String(Math.round((dev[itemLvlGas] / (350 - 0)) * locVolGasTank * 10) / 10);
dev['flapController/itemVolPerc'] = String(Math.round((100 / (350 - 0)) * dev[itemLvlGas]));
}
}
);