Skip to content

ioBroker скрипты

Вопросы и информация о скриптах для ioBroker
140 Topics 1.3k Posts

NEWS

  • Разделить число

    4
    0 Votes
    4 Posts
    689 Views
    B
    ! Создал объекты в starline.0.lancer., battery1, battery2 и battery3. type указал "Число". ! далее установил драйвер javascript. ! создал скрипт в common, и туда скопировал данный скрипт. сохранил, запустил. Объект в javascript.0.lancer.battery1 создался (для чего он???) ! но значения в battery1…. не меняются... ! что я сделал не так? работает.
  • Использование Категорий в скриптах

    1
    1
    0 Votes
    1 Posts
    510 Views
    No one has replied
  • Ошибка-не ошибка скриптов.не понятно

    5
    0 Votes
    5 Posts
    826 Views
    Y
    Всё получилось.В объектах изменил тип данных и всё заработало. Еще раз всем спасибо.
  • По-битный разбор десятичного числа

    6
    0 Votes
    6 Posts
    1k Views
    C
    Спасибо за скрипт, коллега. Как раз решал такую же задачу. Немного доработал его, возможно, будет полезно последователям. ! ```` var bin16; ! // Состояния входящих регистров в порядке их размещения в памяти ПЛК Beckhoff BC9000 createState('D3KitchenLight1',0); // %QX128.0 createState('D3LibraryLight1',0); // %QX128.1 createState('D3KitchenLight2',0); // %QX128.2 createState('D3LibraryLight2',0); // %QX128.3 createState('D3BedroomLight1',0); // %QX128.4 createState('D3LibraryLight3',0); // %QX128.5 createState('D3BedroomLight2',0); // %QX128.6 createState('D3LibraryLight4',0); // %QX128.7 createState('D3DressingRoomLight',0); // %QX129.0 createState('D3TankLight',0); // %QX129.1 createState('D3LobbyLight',0); // %QX129.2 createState('D3BathroomRadiator',0); // %QX129.3 createState('DLadderLight',0); // %QX129.4 createState('D3TankroomRadiator',0); // %QX129.5 createState('D3BathroomLight',0); // %QX129.6 createState('D3BathroomTowelHeater',0); // %QX129.7 ! // код срабатывает только в случае, когда изменился какой либо из регистров on('modbus.0.inputRegisters.0', function (obj) { ! // получаем из ячейки modbus 2-х байтное слово и переводим в двоичное представление, // слово типа "1010011101" bin16 = getState("modbus.0.inputRegisters.0").val.toString(2); ! // здесь дополняем строку до 16 симоволов лидирующими нулями // и получаем строку типа "0000001010011101" while (bin16.length < 16) { bin16 = '0' + bin16; } ! // Разбираем состояния в соотвествии с порядком битов unsigned 16 bit (little endian) setState("javascript.0.D3KitchenLight1", bin16[7]); setState("javascript.0.D3LibraryLight1", bin16[6]); setState("javascript.0.D3KitchenLight2", bin16[5]); setState("javascript.0.D3LibraryLight2", bin16[4]); setState("javascript.0.D3BedroomLight1", bin16[3]); setState("javascript.0.D3LibraryLight3", bin16[2]); setState("javascript.0.D3BedroomLight2", bin16[1]); setState("javascript.0.D3LibraryLight4", bin16[0]); setState("javascript.0.D3DressingRoomLight", bin16[15]); setState("javascript.0.D3TankLight", bin16[14]); setState("javascript.0.D3LobbyLight", bin16[13]); setState("javascript.0.D3BathroomRadiator", bin16[12]); setState("javascript.0.DLadderLight", bin16[11]); setState("javascript.0.D3TankroomRadiator", bin16[10]); setState("javascript.0.D3BathroomLight", bin16[9]); setState("javascript.0.D3BathroomTowelHeater", bin16[8]); ! });
  • GSM модем + gammu + MYSQL + IOBroker

    30
    0 Votes
    30 Posts
    8k Views
    S
    Можно попробовать создать и в gammu базе, не должна помещать, структура из 2 столбцов, помечать прочитано или нет, я особого смысла не вижу, так как таблица будет вестись не автоматически, а из ващего скрипта, т.е. ее назначение удобная навигация по уже прочитанным СМС. Примерно так создать таблицу, это 1 раз выполнить. sendTo('sql.0', 'query',"CREATE TABLE db_gammu.sms_struckt ( id INT NOT NULL PRIMARY KEY, ids VARCHAR(100)") Заполнять примерно так, sendTo('sql.0', 'query',"SELECT GROUP_CONCAT(id SEPARATOR ",") as ids FROM db_gammu.inbox WHERE UDH LIKE '"+udh+"%' AND ReceivingDateTime LIKE '" + formatDate(date, 'YYYY-MM-DD') + "%'" , function(res) { if (res.error) { console.error(res.error); } sendTo('sql.0', 'query',"INSERT INTO db_gammu.sms_struckt ids VALUE " + res.result[0].ids); Код надо проверять, писал по памяти.
  • Скрипт для Narodmon.ru

    5
    1
    0 Votes
    5 Posts
    5k Views
    B
    Чутка перепилил скрипт. Указываете несколько датчиков и скрипт считает среднее значение температуры. На мой взгляд так получится точнее) `var request = require('request'); var crypto = require('crypto'); var IDs = ['12345','6789']; // ID датчиков. (вместо 12345 и 6789 подставить нужные нам ID датчиков, как массив) var apiKey = '23456789ABCD'; // Вводим вместо 123456789ABCDF наш api_key ключ API для разработчика, получаемый в разделе Мои Приложения после регистрации в проекте. var hash = crypto.createHash('md5').update(apiKey).digest('hex'); createState('narodmon.sensor.mid', { name: 'Sensor from narodmon', type: 'number', role: 'level.temperature', read: true, unit: 'C°', write: false }); // every 5 minutes schedule('*/5 * * * *', function () { request({ url: 'http://narodmon.ru/api', method: 'POST', headers: ({'User-Agent': 'Name_Of_Your_App'}), // Заменить Name_Of_Your_App на название Вашего приложения на латинице json: { cmd: 'sensorsValues', sensors: IDs.join(','), uuid: hash, api_key: apiKey, lang: 'ru' } }, function(error, response, body) { if (error || !body || !body.sensors) { console.error(error || JSON.stringify(body)); } else { //console.log(JSON.stringify(body)); var summval = 0; for (var i = 0; i < body.sensors.length; i++) { var valueSensor = Math.round(body.sensors[i].value * 10) / 10; // round to 0.1 step summval = summval + valueSensor; } var midval = summval / body.sensors.length; setState('javascript.0.narodmon.sensor.mid', Math.round(midval * 10) / 10, true); } }); });` [/i]
  • 0 Votes
    6 Posts
    3k Views
    H
    Отличный скрипт! Сейчас сообразить бы как его себе приспособить. На том дело и встало или есть прогресс?
  • Внести гистерезис в скрипт

    6
    0 Votes
    6 Posts
    1k Views
    V
    Смотрю в книгу вижу фи"у :D Он же изначально (гистерезис) есть в скрипте который я вложил в первом сообщении if (getState('megadd.1.p30_P30_-unknown').val < getState('need_temp1').val - 0.5 && getState('megadd.0.p9_P9-_unknown').val === false) { log('Включаем пол'); Красненьким выделил 0.5 градуса гистерезис (это уже я поставил 0.5) по умолчанию было 2 - это и смутило что не срабатывал клапан. Ставил 19 градусов он выключался смотрю уже 18 ,а не включается, конечно он же должен был включиться снова на 17 :D
  • 0 Votes
    5 Posts
    3k Views
    S
    С помощью оказанной в чате проблема с многократной отсылкой команд была локализована и решена. Оказалось что у меня в системе висит десяток процессов драйвера Javascript - когда подбирал правильный синтаксис и запускал скрипт с ошибкой драйвер падал и перезапускался в нескольких копиях. В результате все эти копии и отправляли по команде каждый, всего получалось очень много :-) Ещё раз спасибо участникам чата, которые помогли разобраться в проблеме. Отправлено с моего Redmi Note 4 через Tapatalk
  • Asterisk. Отправка SMS

    8
    0 Votes
    8 Posts
    3k Views
    I
    @Pooh: Подскажите, как проверять папку на наличие нового файла и получать его содержимое? Это нужно для приема SMS. Принятые SMS складываются в папку в виде текстовых файлов. ` Я думаю примерно так https://nodejs.org/api/fs.html#fs_fs_wa … s_listener
  • Скрипт для датчика CO2 MH-Z14 (MH-Z19)

    16
    0 Votes
    16 Posts
    3k Views
    A
    @andrey99986: @artko: то был первый вариант :) питон принимает строго нужное количество байт, crc совпадает :) CRC вычисляется в именно в строгом количестве байт, смотрите даташит на датчик. В вашем коде на питоне проверки CRC нет. я же написал, то был первый вариант…. import MySQLdb import string import time import serial from datetime import datetime ser = serial.Serial('/dev/ttyUSB0', baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=1.0) result=ser.write("\xff\x01\x86\x00\x00\x00\x00\x00\x79") s=ser.read(9) str = "" for ch in s: str += hex(ord(ch))+ " " print str crc_get = ord(s[8]) crc_calc = (255 - (ord(s[1]) + ord(s[2]) + ord(s[3]) + ord(s[4]) + ord(s[5]) + ord(s[6]) + ord(s[7]))) % 256 + 1 print "crc calc=" + hex(crc_calc) + " crc get=" + hex(crc_calc) if s[0] == "\xff" and s[1] == "\x86" and crc_calc == crc_get: co2 = ord(s[2])*256 + ord(s[3]) print "crc ok" else: co2 = 0 print "crc error" print "co2=", co2 ts = time.time() ts1 = int(ts * 1000) print "ts=", ts1 db = MySQLdb.connect(host="localhost", user="xxxxxxx", passwd="xxxxxxx", db="iobroker", charset="utf8") cursor = db.cursor() sql = """insert iobroker.ts_number(id, ts, val, ack, _from, q) values (12,%(ts)s,%(val)s,0,2,0) """ %{"ts":ts1, "val":co2} print "sql=", sql cursor.execute(sql) db.commit() db.close() вывод исполнения 0xff 0x86 0x1 0xca 0x57 0x40 0x28 0x58 0x98 crc calc=0x98 crc get=0x98 crc ok co2= 458 ts= 1514450008318 sql= insert iobroker.ts_number(id, ts, val, ack, _from, q) values (12,1514450008318,458,0,2,0)
  • 0 Votes
    2 Posts
    2k Views
    H
    Продолжение темы в сторону контроля локаций. Ниже пример для трех человек. Каждому задается имя, индивидуальные зоны контроля на вход/выход, радиусы зон и т.п. вставляем скрипт: ! ``` createState('location.user1'); createState('location.user2'); createState('location.user3'); ! var radius = 0.0014; /* 71,24035723 км = 1 град 1 км = 0,014036987 град 0,1 км = 0,001403699 град 0,05 км = 0,000701849 град */ ! // массив текущих локаций var currentLocations = { "user1" : "", "user2" : "", "user3" : "" }; ! // массив локаций для сравнения с текущими координатами var locations = { "user1" : { name : "Марфуша", // имя человека text : ["вошла в локацию ","вышла из локации "], // действие событие location : [ // локации: имя, координаты центра. Дополнительно можно задать другой радиус и действия/события для определенной локации {name : "Дом", coord : "45.225003,39.215152"}, {name : "Бассейн", coord : "45.235450,39.218855"}, {name : "Школа", coord : "45.22203,39.22134"} ] }, "user2" : { name : "Маша", text : ["вошла в локацию ","вышла из локации "], location : [ {name : "Дом", coord : "45.225003,39.215152"}, {name : "Работа", coord : "45.22203,39.22134"} ] }, "user3" : { name : "Иван", text : ["вошел в локацию ","вышел из локации "], location : [ {name : "Дому", coord : "45.225003,39.215152", radius : 0.014036987*5, text : ["подъезжает к ",""]}, // контроль зоны с радиусом 5 км и только на въезд {name : "Дом", coord : "45.225003,39.215152"}, {name : "Работа", coord : "45.04984,38.97755"} ] } }; ! on({id: /^javascript\.0\.location\./, change: 'any'}, function (gps) { //log (gps.id); var name = gps.id.substr(22); // парсим имя //log(name); var txt = ""; var current; //log("Текущее положение: " + currentLocations[name]); for (var i = 0; i < locations[name].location.length; ++i) { //log( "Локация: " + locations[name].location[i].name + " Координаты: " + locations[name].location[i].coord); var rad = radius; if (locations[name].location[i].radius !== undefined) rad = locations[name].location[i].radius; // присваиваем альтернативный радиус, если есть current = locationRegion(getState("javascript.0.location." + name), locations[name].location[i].coord, rad); var locName = locations[name].location[i].name; var action = locations[name].text[0]; if (typeof (locations[name].location[i].text) !== 'undefined') action = locations[name].location[i].text[0]; // присваиваем альтернативное действие, если есть if (current && (currentLocations[name] !== locName)) { if (action !== "") txt = locations[name].name + " " + action + locName; currentLocations[name] = locName; } action = locations[name].text[1]; if (typeof (locations[name].location[i].text) !== 'undefined') action = locations[name].location[i].text[1]; // присваиваем альтернативное действие, если есть if (!current && (currentLocations[name] === locations[name].location[i].name)) { if (action !== "") txt = locations[name].name + " " + action + locName; currentLocations[name] = ""; } //log ("txt: " + txt); } if (txt !=="") sendTelegram(txt); }); ! //определяем нахожение точки в заданной локации с радиусом function locationRegion(coordinate, location, radius) { var h; var result = false; // точка в локации: true - да, false - нет var coord = coordinate.val.split(','); var loc = location.split(','); h = Math.sqrt(Math.pow((parseFloat(coord[1])-parseFloat(loc[1])),2) + Math.pow((parseFloat(coord[0])-parseFloat(loc[0])),2)); //log("Гипотенуза равна = " + h); if (h > radius) { log("Точка не принадлежит кругу.\n"); result = false; } else { log("Точка принадлежит кругу.\n"); result = true; } return result; } ! результат примерно такой: 1160_1.png [/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
  • 0 Votes
    12 Posts
    3k Views
    A
    @XAPuTOH: Т.е. exec выполняется асинхронно. Соответственно нельзя строить скрипт таким образом как я сперва задумал, а нужно строить на колбэках. Сперва exec. внутри него основной скрипт. а если exec несколько http://www.comparateur-dependance-senior.com. то каждый последующий нужно запускать в колбэке предидущего? ` Довольно сложно это понятие, но для лучшего понимания требуется небольшое упражнение.
  • Nod-red не могу выключить xiaomi WallWiredSwitch

    3
    1
    0 Votes
    3 Posts
    1k Views
    O
    Работающий код позволяющий включать/выключать aqara wall switch с помощью круглой кнопки xiaomi. ![](<ATTACHMENT [image: 3955_screenshot_20171030_141326.png] )~~[attachment=0]~~Screenshot_20171030_141326.png[/attachment]" /> ! [{"id":"cda1b481.d0ef2","type":"ioBroker out","z":"9501b04f.00fc88","name":"","topic":"mihome.0.devices.ctrl_neutral2_158d00014a9ed4.channel_0","ack":"false","autoCreate":"true","x":1150,"y":200,"wires":[]},{"id":"8edd645b.178898","type":"ioBroker in","z":"9501b04f.00fc88","name":"Wall switch 0","topic":"mihome.0.devices.ctrl_neutral2_158d00014a9ed4.channel_0","payloadType":"value","onlyack":true,"func":"all","gap":"","x":190,"y":560,"wires":[["8087d738.e21b18","3b239be0.42043c"]]},{"id":"8087d738.e21b18","type":"debug","z":"9501b04f.00fc88","name":"Wall switch 0","active":false,"console":"false","complete":"payload","x":190,"y":620,"wires":[]},{"id":"de690b48.cf3d5","type":"inject","z":"9501b04f.00fc88","name":"","topic":"","payload":"0","payloadType":"num","repeat":"","crontab":"","once":false,"x":630,"y":140,"wires":[["3ec5f813.d65ef8"]]},{"id":"bd9924.89a60ee","type":"inject","z":"9501b04f.00fc88","name":"","topic":"","payload":"1","payloadType":"num","repeat":"","crontab":"","once":false,"x":630,"y":260,"wires":[["3ec5f813.d65ef8"]]},{"id":"7d039c57.2d28f4","type":"comment","z":"9501b04f.00fc88","name":"aqara mihome wallswitch (1 wired)","info":"","x":1060.5,"y":164,"wires":[]},{"id":"eccdf34e.155168","type":"debug","z":"9501b04f.00fc88","name":"Simple click","active":false,"console":"false","complete":"payload","x":150,"y":280,"wires":[]},{"id":"5e19eae1.ef70ec","type":"ioBroker in","z":"9501b04f.00fc88","name":"Simple click","topic":"mihome.0.devices.switch_158d00019de56c.click","payloadType":"value","onlyack":false,"func":"all","gap":"","x":150,"y":220,"wires":[["eccdf34e.155168","d1f084cb.5000d8"]]},{"id":"aa37571.0324ca8","type":"comment","z":"9501b04f.00fc88","name":"Mihome button ","info":"","x":160,"y":180,"wires":[]},{"id":"3b239be0.42043c","type":"switch","z":"9501b04f.00fc88","name":"Light is on? status Selector","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"true","vt":"str"},{"t":"cont","v":"false","vt":"str"}],"checkall":"false","outputs":2,"x":500,"y":500,"wires":[["29b9f765.dfec6"],["be612e94.95701"]]},{"id":"29b9f765.dfec6","type":"change","z":"9501b04f.00fc88","name":" Light on","rules":[{"t":"set","p":"Light_is_on","pt":"flow","to":"true","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":774.6666870117188,"y":439.2833251953125,"wires":[[]]},{"id":"be612e94.95701","type":"change","z":"9501b04f.00fc88","name":" Light off","rules":[{"t":"set","p":"Light_is_on","pt":"flow","to":"false","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":777.3333129882812,"y":507.79998779296875,"wires":[[]]},{"id":"5fda6053.c56cc","type":"inject","z":"9501b04f.00fc88","name":"","topic":"","payload":"Light_is_on","payloadType":"flow","repeat":"1","crontab":"","once":false,"x":470,"y":600,"wires":[["95a30b3c.d04c48"]]},{"id":"95a30b3c.d04c48","type":"debug","z":"9501b04f.00fc88","name":"Light is on? debag","active":false,"console":"false","complete":"payload","x":730,"y":600,"wires":[]},{"id":"e2001c48.05e47","type":"inject","z":"9501b04f.00fc88","name":"","topic":"","payload":"true","payloadType":"str","repeat":"","crontab":"","once":false,"x":210,"y":440,"wires":[["3b239be0.42043c"]]},{"id":"eec352bc.f9327","type":"inject","z":"9501b04f.00fc88","name":"","topic":"","payload":"false","payloadType":"str","repeat":"","crontab":"","once":false,"x":210,"y":480,"wires":[["3b239be0.42043c"]]},{"id":"f151cca0.9b5b78","type":"switch","z":"9501b04f.00fc88","name":"Light is on?","property":"Light_is_on","propertyType":"flow","rules":[{"t":"eq","v":"true","vt":"str"},{"t":"eq","v":"false","vt":"str"}],"checkall":"true","outputs":2,"x":450,"y":200,"wires":[["46230450.fafb8c"],["bf0139a5.96b5a"]]},{"id":"a37dcaf0.a182c","type":"debug","z":"9501b04f.00fc88","name":"light on debag","active":false,"console":"false","complete":"payload","x":620,"y":300,"wires":[]},{"id":"623ab125.d165c8","type":"debug","z":"9501b04f.00fc88","name":"light off debag","active":false,"console":"false","complete":"payload","x":620,"y":100,"wires":[]},{"id":"46230450.fafb8c","type":"change","z":"9501b04f.00fc88","name":"turn light off","rules":[{"t":"set","p":"payload","pt":"msg","to":"0","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":630,"y":180,"wires":[["623ab125.d165c8","3ec5f813.d65ef8"]]},{"id":"bf0139a5.96b5a","type":"change","z":"9501b04f.00fc88","name":"turn light on","rules":[{"t":"set","p":"payload","pt":"msg","to":"1","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":630,"y":220,"wires":[["a37dcaf0.a182c","3ec5f813.d65ef8"]]},{"id":"ce44b3e5.b80ee","type":"inject","z":"9501b04f.00fc88","name":"","topic":"","payload":"true","payloadType":"str","repeat":"","crontab":"","once":false,"x":170,"y":80,"wires":[["d1f084cb.5000d8"]]},{"id":"dae9b376.b4d8b8","type":"inject","z":"9501b04f.00fc88","name":"","topic":"","payload":"false","payloadType":"str","repeat":"","crontab":"","once":false,"x":170,"y":120,"wires":[["d1f084cb.5000d8"]]},{"id":"df209c66.cb65f8","type":"debug","z":"9501b04f.00fc88","name":"aqara mihome wallswitch (1 wired)","active":true,"console":"false","complete":"payload","x":1060,"y":100,"wires":[]},{"id":"3ec5f813.d65ef8","type":"switch","z":"9501b04f.00fc88","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"num"},{"t":"eq","v":"0","vt":"num"},{"t":"eq","v":"true","vt":"str"},{"t":"eq","v":"false","vt":"str"}],"checkall":"true","outputs":4,"x":810,"y":200,"wires":[["cda1b481.d0ef2","df209c66.cb65f8"],["cda1b481.d0ef2","df209c66.cb65f8"],[],[]]},{"id":"d1f084cb.5000d8","type":"switch","z":"9501b04f.00fc88","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"true","vt":"str"},{"t":"eq","v":"false","vt":"str"}],"checkall":"true","outputs":2,"x":310,"y":200,"wires":[["f151cca0.9b5b78"],[]]}] !
  • Скрипт для Лоран

    2
    0 Votes
    2 Posts
    1k Views
    V
    Подправил скрипт, так работает лучше. Может кому пригодится. Скрипт разделен на две части, одна кладется в Global. В основном это для того, чтобы можно было опрашивать несколько Лоранов, копируя скрипт (у меня 3 штуки, например). ! ```` var IP = "192.168.0.104"; var Period = 5000; var laurentID = "000"; ! //Функция в "global" для создания createMain (); ! var request = require('request'); ! //Определяем переменные снаружи функции (чтобы были видны снаружи функции) var relayString = "0000"; var inlineString = "000000"; var outlineString = "000000000000"; ! //Функция обработки ответа function statusProcessing(error, response, body) { if (!error && response.statusCode == 200) { setState('laurent'+laurentID+'.connectIndicator', true, true); //Температура = Конвертируем строку в число (запрошенную по тегу temp в ответе Лорана).округляем (до 1 знака после запятой) var temperature = parseFloat(XMLElement ("temp", body)).toFixed(1); setState('laurent'+laurentID+'.temperature', parseFloat(temperature), true); //Время Лорана setState('laurent'+laurentID+'.systemtime', parseInt(XMLElement ("systime", body)), true); ! //Строка состояния реле relayString = XMLElement ("rele", body); setState('laurent'+laurentID+'.relayString', relayString); //Строка состояния входов inlineString = XMLElement ("in", body); setState('laurent'+laurentID+'.inlineString', inlineString); //Строка состояния выходов outlineString = XMLElement ("out", body); setState('laurent'+laurentID+'.outlineString', outlineString); } else { setState('laurent'+laurentID+'.connectIndicator', false, true); } } ! //Главная периодическая функция function mainPoll () { request ('http://'+IP+'/state.xml', statusProcessing); } ! //Подписываемся на состояние вспомогательно объекта (строки состояния) реле on('javascript.0.laurent'+laurentID+'.relayString', updateRelaysStates); ! //Подписываемся на состояние вспомогательно объекта (строки состояния) входных линий on('javascript.0.laurent'+laurentID+'.inlineString', updateInlinesStates); ! //Подписываемся на состояние вспомогательно объекта (строки состояния) выходных линий on('javascript.0.laurent'+laurentID+'.outlineString', updateOutlinesStates); ! //Подписываемся на состояние реле/выключателя (для управления из визуализации) on('javascript.0.laurent'+laurentID+'.relay1', relaySwitch); on('javascript.0.laurent'+laurentID+'.relay2', relaySwitch); on('javascript.0.laurent'+laurentID+'.relay3', relaySwitch); on('javascript.0.laurent'+laurentID+'.relay4', relaySwitch); ! //Подписываемся на состояние выходной линии/выключателя (для управления из визуализации) on('javascript.0.laurent'+laurentID+'.outline1', outlineSwitch); on('javascript.0.laurent'+laurentID+'.outline2', outlineSwitch); on('javascript.0.laurent'+laurentID+'.outline3', outlineSwitch); on('javascript.0.laurent'+laurentID+'.outline4', outlineSwitch); on('javascript.0.laurent'+laurentID+'.outline5', outlineSwitch); on('javascript.0.laurent'+laurentID+'.outline6', outlineSwitch); on('javascript.0.laurent'+laurentID+'.outline7', outlineSwitch); on('javascript.0.laurent'+laurentID+'.outline8', outlineSwitch); on('javascript.0.laurent'+laurentID+'.outline9', outlineSwitch); on('javascript.0.laurent'+laurentID+'.outline10', outlineSwitch); on('javascript.0.laurent'+laurentID+'.outline11', outlineSwitch); on('javascript.0.laurent'+laurentID+'.outline12', outlineSwitch); ! //Callback-функции находятся в "global" ! //Задаем выполнение функции через определенный интервал var timerID = setInterval(mainPoll, Period); И вот это в Global: >! ```` function updateInlinesStates () { var inlineTable = inlineString.split(""); setState('laurent'+laurentID+'.inline1', Boolean(parseFloat(inlineTable[0])), true); setState('laurent'+laurentID+'.inline2', Boolean(parseFloat(inlineTable[1])), true); setState('laurent'+laurentID+'.inline3', Boolean(parseFloat(inlineTable[2])), true); setState('laurent'+laurentID+'.inline4', Boolean(parseFloat(inlineTable[3])), true); setState('laurent'+laurentID+'.inline5', Boolean(parseFloat(inlineTable[4])), true); setState('laurent'+laurentID+'.inline6', Boolean(parseFloat(inlineTable[5])), true); } >! function updateOutlinesStates () { var outlineTable = outlineString.split(""); setState('laurent'+laurentID+'.outline1', Boolean(parseFloat(outlineTable[0])), true); setState('laurent'+laurentID+'.outline2', Boolean(parseFloat(outlineTable[1])), true); setState('laurent'+laurentID+'.outline3', Boolean(parseFloat(outlineTable[2])), true); setState('laurent'+laurentID+'.outline4', Boolean(parseFloat(outlineTable[3])), true); setState('laurent'+laurentID+'.outline5', Boolean(parseFloat(outlineTable[4])), true); setState('laurent'+laurentID+'.outline6', Boolean(parseFloat(outlineTable[5])), true); setState('laurent'+laurentID+'.outline7', Boolean(parseFloat(outlineTable[6])), true); setState('laurent'+laurentID+'.outline8', Boolean(parseFloat(outlineTable[7])), true); setState('laurent'+laurentID+'.outline9', Boolean(parseFloat(outlineTable[8])), true); setState('laurent'+laurentID+'.outline10', Boolean(parseFloat(outlineTable[9])), true); setState('laurent'+laurentID+'.outline11', Boolean(parseFloat(outlineTable[10])), true); setState('laurent'+laurentID+'.outline12', Boolean(parseFloat(outlineTable[11])), true); >! } >! //Функция для переключения реле - отослать команду function relaySwitch (obj) { var reg = "relay([1-9])"; if (obj.state.ack === false && obj.state.val === true) { request ('http://'+IP+'/cmd.cgi?cmd=REL,'+obj.id.match(reg)[1]+',1'); } else if (obj.state.ack === false && obj.state.val === false) { request ('http://'+IP+'/cmd.cgi?cmd=REL,'+obj.id.match(reg)[1]+',0'); } } >! //Функция для переключения выходной линии - отослать команду function outlineSwitch (obj) { var reg = "outline([1-9]*)"; if (obj.state.ack === false && obj.state.val === true) { request ('http://'+IP+'/cmd.cgi?cmd=OUT,'+obj.id.match(reg)[1]+',1'); } else if (obj.state.ack === false && obj.state.val === false) { request ('http://'+IP+'/cmd.cgi?cmd=OUT,'+obj.id.match(reg)[1]+',0'); } }
  • Handsfree ip-телефон

    1
    0 Votes
    1 Posts
    984 Views
    No one has replied
  • 0 Votes
    6 Posts
    4k Views
    A
    Значение сейчас true : var obj1=JSON.stringify(getObject('megad.0.p0').common.custom["sql.0"].enabled); Как его поменять на false?
  • Backup скриптов

    6
    0 Votes
    6 Posts
    2k Views
    sigmaS
    @aurodionov: Ручками в админке на вкладке скрипты жмакни кнопочку и всё, сохранятся все скрипты ` Супер. Вполне пригодный zip. Но было бы неплохо написать драйвер для связи с git… А насчет паролей и прочего. Ну, во-первых, git это не только github, но и вполне себе локальное хранилище. Но, даже, если это облако, то пароли я всегда складываю в отдельный файлик и его включаю/считываю. Восстановить такой файлик из десятка строк несложно. А вот скрипт из сотни строк уже сложнее
  • Скрипт для счётчика

    70
    0 Votes
    70 Posts
    14k Views
    S
    Вопрос не в тему, но не знаю куда закинуть. Есть более важные задачи - наполнение септика.. Для контроля использую следующий скетч: ! ```` #define Trig 9 #define Echo 8 #define ledPin 13 ! void setup() { pinMode(Trig, OUTPUT); //инициируем как выход pinMode(Echo, INPUT); //инициируем как вход pinMode(ledPin, OUTPUT); Serial.begin(9600); /* задаем скорость общения. В нашем случае с компьютером / } unsigned int impulseTime=0; unsigned int distance_sm=0; ! void loop() { digitalWrite(Trig, HIGH); / Подаем импульс на вход trig дальномера */ delayMicroseconds(10); // равный 10 микросекундам digitalWrite(Trig, LOW); // Отключаем impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса distance_sm=impulseTime/58; // Пересчитываем в сантиметры Serial.println(distance_sm); // Выводим на порт if (distance_sm<50) // Если расстояние менее 30 сантиметром { digitalWrite(ledPin, HIGH); // Светодиод горит } else { digitalWrite(ledPin, LOW); // иначе не горит } delay(10000); } Подскажите как загнать его в Брокер, хочется через MQTT Для температуры использую вот это: >! ``` `#include <spi.h> // Ethernet shield #include <ethernet.h> // Ethernet shield #include <pubsubclient.h> // MQTT #include <servo.h> #include <dht.h> #include <onewire.h> #include <dallastemperature.h> Servo servo; >! byte mac[] = { 0xC1, 0x7C, 0x38, 0x41, 0x89, 0x35 }; byte server[] = { 192, 168, 0, 11 }; //IP Брокера byte ip[] = { 192, 168, 0, 89 }; //IP Клиента (Arduino) >! //////////////////////////////////////////////////////////////////////////// void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; // Serial.print(topic); // Serial.print("="); String strTopic = String(topic); String strPayload = String((char*)payload); // Serial.println(strPayload); callback_iobroker(strTopic, strPayload); } >! EthernetClient ethClient; PubSubClient client(server, 1883, callback, ethClient); #define id_connect "myhome-temp" #define id_connect "myhome-status" #define Prefix_subscribe "myhome/Temp/" #define Prefix_subscribe "myhome/Status/" >! ///////////////Объявляем порты ввода-вывода #define ServoPin 3 //Порт к которому подключен сервопривод >! const int start_DI_pin []= {2, 4, 5}; // Порты Ввода int n_DI_pin = sizeof(start_DI_pin) / sizeof(start_DI_pin[0])-1; //Вычисляем длинну массива >! const int start_DO_pin []= {6, 7}; //Порты Вывода int n_DO_pin = sizeof(start_DO_pin) / sizeof(start_DO_pin[0])-1; //Вычисляем длинну массива >! int DI[] = {0, 0, 0}; int old_DI[] = {0, 0, 0}; >! ///////////////////////////Переменные для работы с освещением////////////////////////////////////// int ServoAngle = 100; //Угол сервопривода при включении int flag = 0; int flag2 = 0; int pause = 0; >! //------------------------------------------- Sensors -------------------------------------------// const int MQ7_Pin = A0; // Куда подключили MQ7 //int MQ7Value = 0; int MQ7Value = analogRead(MQ7_Pin); const int foto_Pin = A1; // устанавливаем входную ногу для Фоторезистора //unsigned int fotoValue = 0; // цифровое значение фоторезистора unsigned int fotoValue = analogRead(foto_Pin); >! #define ONE_WIRE_BUS 8 //#define TEMPERATURE_PRECISION 9 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DS_sensors(&oneWire); // 28 80 E9 3A 04 00 00 10 //T0:28 88 AD D7 02 00 00 42 //T1:28 14 A5 D7 02 00 00 B0 //T2:28 72 26 7B 04 00 00 2E //T3:28 CA 1A 3B 04 00 00 CD //T4:28 E6 D5 D7 02 00 00 C1 //T5:28 16 B4 7A 04 00 00 8A //T6:28 2B 86 D7 02 00 00 CF //T7:28 AB 9D D7 02 00 00 29 DeviceAddress addr_T1 = { 0x28, 0x80, 0xE9, 0x3A, 0x4, 0x0, 0x0, 0x10 };//кладовка DeviceAddress addr_T2 = { 0x28, 0x88, 0xAD, 0xD7, 0x2, 0x0, 0x0, 0x42 };//кухня DeviceAddress addr_T3 = { 0x28, 0x14, 0xA5, 0xD7, 0x2, 0x0, 0x0, 0xB0 };//детская DeviceAddress addr_T4 = { 0x28, 0x72, 0x26, 0x7B, 0x4, 0x0, 0x0, 0x2E };//гараж DeviceAddress addr_T5 = { 0x28, 0xCA, 0x1A, 0x3B, 0x4, 0x0, 0x0, 0xCD };//ванная DeviceAddress addr_T6 = { 0x28, 0xE6, 0xD5, 0xD7, 0x2, 0x0, 0x0, 0xC1 };//улица DeviceAddress addr_T7 = { 0x28, 0x16, 0xB4, 0x7A, 0x4, 0x0, 0x0, 0x8A };//спальня2 DeviceAddress addr_T8 = { 0x28, 0x2B, 0x86, 0xD7, 0x2, 0x0, 0x0, 0xCF };//зал DeviceAddress addr_T9 = { 0x28, 0xAB, 0x9D, 0xD7, 0x2, 0x0, 0x0, 0x29 };//мансарда >! float T1=0; float T2=0; float T3=0; float T4=0; float T5=0; float T6=0; float T7=0; float T8=0; float T9=0; >! //dht DHT; //#define DHT22_PIN 9 //float Hout = 0; //float Tout = 0; >! //////////////////////////////////////////////////////////////////////////// //void callback(char* topic, byte* payload, unsigned int length) { // payload[length] = '\0'; // Serial.print(topic); // Serial.print("="); // String strTopic = String(topic); // String strPayload = String((char*)payload); // Serial.println(strPayload); // callback_iobroker(strTopic, strPayload); //} //////////////////////////////////////////////////////////////////////////// void setup() { Serial.begin(57600); Serial.println("start"); Serial.print("Locating devices..."); DS_sensors.begin(); Serial.print("Found "); Serial.print(DS_sensors.getDeviceCount(), DEC); Serial.println(" devices."); >! // report parasite power requirements Serial.print("Parasite power is: "); if (DS_sensors.isParasitePowerMode()) Serial.println("ON"); else Serial.println("OFF"); //Объявляем порты Digital inputs/outputs for(int i=0 ;i<=n_DI_pin; i++) { pinMode (start_DI_pin [i], INPUT); } digitalWrite(5, HIGH); //Насос скважины digitalWrite(4, HIGH); //Электрика for(int i=0 ;i<=n_DO_pin; i++) { pinMode (start_DO_pin [i], OUTPUT); } >! Ethernet.begin(mac, ip); if (client.connect(id_connect)) { getSensors(); control(); //client.publish("myhome/Kitchen/Change_Counter", "0"); //client.publish("myhome/Kitchen/Temp_room", "0"); //client.publish("myhome/Kitchen/Humidity_room", "0"); client.publish("myhome/Temp/Kladovka", "0"); client.publish("myhome/Temp/Kitchen", "0"); client.publish("myhome/Temp/Detskaya", "0"); client.publish("myhome/Temp/Garage", "0"); client.publish("myhome/Temp/Street", "0"); client.publish("myhome/Temp/Spalnya2", "0"); client.publish("myhome/Temp/Zal", "0"); client.publish("myhome/Temp/Mansarda", "0"); client.publish("myhome/Temp/Vannaya", "0"); //client.publish("myhome/Kitchen/Lux", "0"); //client.publish("myhome/Kitchen/Servo", "0"); client.publish("myhome/Temp/MQ7", "0"); client.publish("myhome/Status/Power", "0"); client.publish("myhome/Status/Pompe", "0"); client.subscribe("myhome/Temp/#"); client.subscribe("myhome/Status/#"); } } ///////////////////////////////////////////////////////////////////////// void loop() { client.loop(); control(); getSensors(); if (!client.connected()) { if (client.connect(id_connect)) { control(); getSensors(); client.subscribe("myhome/Temp/#"); } } }</dallastemperature.h></onewire.h></dht.h></servo.h></pubsubclient.h></ethernet.h></spi.h>` И это Function >! >! ~~[spoiler]~~`~~[code]~~//--------------------------------- Functions ---------------------------------// /////////////////////////////////От Брокера////////////////////////////////////////////// void callback_iobroker(String strTopic, String strPayload){ if (strTopic == "myhome/Kitchen/Servo"){ ServoAngle=strPayload.toInt(); if (ServoAngle >= 0 && ServoAngle <= 255){ servo.attach(ServoPin); //delay(200); //ждем 2 секунды servo.write(ServoAngle); //ставим вал под 0 delay(1000); //ждем 2 секунды //client.publish("myhome/Kitchen/Servo", b); servo.detach(); } } } >! ////////////////////////////////////Брокеру///////////////////////////////////// void control(){ if(digitalRead(5)==HIGH && flag==0) { //если насос включен client.publish("myhome/Status/Pompe", "1"); flag=1; } if(digitalRead(5)==LOW && flag==1){//если насос выключен client.publish("myhome/Status/Pompe", "0"); flag=0;//обнуляем переменную flag } if(digitalRead(4)==HIGH && flag2==0) { // Если электрика есть client.publish("myhome/Status/Power", "1"); flag2=1; } if(digitalRead(4)==LOW && flag2==1){// Если эректрики нет client.publish("myhome/Status/Power", "0"); flag2=0;//обнуляем переменную flag } } ///////////////////////////////Данные сенсоров//////////////////////////////////// >! void getSensors () { >! MQ7Value = analogRead(MQ7_Pin); fotoValue = analogRead(foto_Pin); // считываем значение с фоторезистора // ServoAngle = analogRead(2); >! //Обработка данных датчика DHT22\. Подключение к порту цифровому P9 Arduino //Глобальные переменные Hout и Tout типа флоат - влажность (%) и температура (град. С) // if (DHT.read22(DHT22_PIN)== DHTLIB_OK) { // Hout = DHT.humidity; // Tout = DHT.temperature; // } // if (Hout == 0 || Tout == 0){ // delay (1000); // if (DHT.read22(DHT22_PIN)== DHTLIB_OK) { // Hout = DHT.humidity; // Tout = DHT.temperature; // } // } //Обработка данных цифровых датчиков температуры типа DS18B20. //Шина 1-Wire на цифровой пин P8 Arduino. //Подключено 2 датчика температуры, адреса задаются в секции глобальных констант "Sensors" //Три значение температуры T1, T2, типа float (град. С). DS_sensors.setResolution(addr_T1, 9); DS_sensors.setResolution(addr_T2, 9); DS_sensors.setResolution(addr_T3, 9); DS_sensors.setResolution(addr_T4, 9); DS_sensors.setResolution(addr_T5, 9); DS_sensors.setResolution(addr_T6, 9); DS_sensors.setResolution(addr_T7, 9); DS_sensors.setResolution(addr_T8, 9); DS_sensors.setResolution(addr_T9, 9); float T1 = DS_sensors.getTempC(addr_T1); float T2 = DS_sensors.getTempC(addr_T2); float T3 = DS_sensors.getTempC(addr_T3); float T4 = DS_sensors.getTempC(addr_T4); float T5 = DS_sensors.getTempC(addr_T5); float T6 = DS_sensors.getTempC(addr_T6); float T7 = DS_sensors.getTempC(addr_T7); float T8 = DS_sensors.getTempC(addr_T8); float T9 = DS_sensors.getTempC(addr_T9); DS_sensors.requestTemperatures(); //Serial.print(DS_sensors.getResolution(addr_T1), DEC); Serial.println(); Serial.print("Temp T1 C: "); Serial.print(T1); Serial.println(); >! Serial.println(); Serial.print("Temp T2 C: "); Serial.print(T2); Serial.println(); // Serial.println(); Serial.print("Temp T3 C: "); Serial.print(T3); Serial.println(); // Serial.println(); Serial.print("Temp T4 C: "); Serial.print(T4); Serial.println(); // Serial.println(); Serial.print("Temp T5 C: "); Serial.print(T5); Serial.println(); // Serial.println(); Serial.print("Temp T6 C: "); Serial.print(T6); Serial.println(); // Serial.println(); Serial.print("Temp T7 C: "); Serial.print(T7); Serial.println(); // Serial.println(); Serial.print("Temp T8 C: "); Serial.print(T8); Serial.println(); // Serial.println(); Serial.print("Temp T9 C: "); Serial.print(T9); Serial.println(); // ///////////////////////Паблик данных сенсоров//////////////////////// if (pause == 50 || pause == 0){ char b[5]; // String char_Hout = String(Hout); // char_Hout.toCharArray(b,5); // client.publish("myhome/Kitchen/Humidity_room", b); // String char_Tout = String(Tout); // char_Tout.toCharArray(b,5); // client.publish("myhome/Kitchen/Temp_room", b); String char_T1 = String(T1); char_T1.toCharArray(b,5); client.publish("myhome/Temp/Kladovka", b); String char_T2 = String(T2); char_T2.toCharArray(b,5); client.publish("myhome/Temp/Kitchen", b); String char_T3 = String(T3); char_T3.toCharArray(b,5); client.publish("myhome/Temp/Detskaya", b); String char_T4 = String(T4); char_T4.toCharArray(b,5); client.publish("myhome/Temp/Garage", b); String char_T5 = String(T5); char_T5.toCharArray(b,5); client.publish("myhome/Temp/Vannaya", b); String char_T6 = String(T6); char_T6.toCharArray(b,5); client.publish("myhome/Temp/Street", b); String char_T7 = String(T7); char_T7.toCharArray(b,5); client.publish("myhome/Temp/Spalnya2", b); String char_T8 = String(T8); char_T8.toCharArray(b,5); client.publish("myhome/Temp/Zal", b); String char_T9 = String(T9); char_T9.toCharArray(b,5); client.publish("myhome/Temp/Mansarda", b); //Serial.println(T1); String char_fotoValue = String(fotoValue); char_fotoValue.toCharArray(b,4); client.publish("myhome/Kitchen/Lux", b); String char_ServoAngle = String(ServoAngle); char_ServoAngle.toCharArray(b,4); client.publish("myhome/Kitchen/Servo", b); String char_MQ7Value = String(MQ7Value); char_MQ7Value.toCharArray(b,4); client.publish("myhome/Temp/MQ7", b); pause = 1; } else pause++; } >! [/code]`[/spoiler] >! Показания от септика получаю в значениях см, типа 160 см, 100 см.....[/i][/i] ```
  • Скрипт счетчика

    13
    0 Votes
    13 Posts
    3k Views
    P
    @radon: ..он будет замкнут и постоянно включён!.. ` ну и что, я-то подписываюсь на изменение значения счетчика, на не состояние порта..

395

Online

32.5k

Users

81.6k

Topics

1.3m

Posts